Markdown has multiple types of lists, and in my mind checking items from those list means different things depending on the type.
- [ ] this item is open
- [x] this item is close
- this item is also open
- ~~this item is also close~~
For checklists I want the box to be checked when I toggle the item for, others I want the item to be crossed out via strike-through. All of those actions already exist in Emacs Markdown-Mode, but they are different depending on the list, I want Emacs to do what I mean no matter the list so I added this
(defun coder--markdown-toogle-list-item-dwim ()
"Toogle the current list item depending on the type do the right thing.
1. When it is not a markdown list, ignore
2. When the list is a checklist indicated by [ ] check the checkbox
3. When the list is a normal list, strike-through the current item
4. When the item already has strike-through applied, un-strike it"
(interactive)
(save-match-data
(save-excursion
(when-let ((bounds (markdown-cur-list-item-bounds)))
;; move to the beginning of the item after the list marker
(goto-char (cl-first bounds))
(forward-char (cl-fourth bounds))
(cond ((looking-at "\\[[\s-xX]\\]") (markdown-toggle-gfm-checkbox))
((thing-at-point-looking-at markdown-regex-strike-through) (markdown-insert-strike-through))
(t (progn
(set-mark (point))
(end-of-line)
(activate-mark)
;; remove trailing whitespace from line first, this
;; otherwise breaks strikethrough rendering
(delete-trailing-whitespace)
(markdown-insert-strike-through))))))))
Happy markdown editing!