I have an ever-growing document where I keep track of all the small (and sometimes major) changes I want to make to Emacs. Today I picked a random item and had a go at it.
I’m a lousy speller and often misspell words in my comments and git commit messages. I do have fly-spell enabled to catch my mistakes but I would prefer not to make them in the first place. For functions, variable names etc. I have dabbrev-expand and my own home-grown solution based on ctags but nothing similar for words in the English dictionary, so I spent 15 minutes implementing a simple solution.
The picture above shows the command in action trying to complete the word
"dino"
. I invoked ido-complete-word-ispell
and typed in "sa"
; the list
shows the three remaining completions. I use
ido-vertical-mode to get the vertical representation of
the completions.
The code for command is shown below. It depends on ido-mode.
(defun ido-complete-word-ispell ()
"Completes the symbol at point based on entries in the
dictionary"
(interactive)
(let* ((word (thing-at-point 'symbol t))
(boundaries (bounds-of-thing-at-point 'symbol))
(start (car boundaries))
(end (cdr boundaries))
(words (ispell-lookup-words word)))
(let ((selection (ido-completing-read "Words: " words)))
(if selection
(progn
(delete-region start end)
(insert selection))))))
To add a key-binding for any of the following:
;; To enable it in a specific mode
(define-key markdown-mode-map "\M-?" 'ido-complete-word-ispell)
;; To enable it in all modes
(global-set-key (kbd "M-?") 'ido-complete-word-ispell)
Simple as that. Now I just need to figure out how to bind the command to a specific key whenever the cursor is inside of a comment or a doc-string.