I use enchant in wcheck-mode, which lists "the" as the first suggested correction (though with wcheck you don't have to scroll through corrections to select the one you want, you just type the number or letter of the correction you want).
For example, if I type the following:
To be or not to be, that is hte question.
and then M-x wcheck-actions
with point on "hte", I get the following suggestions:
1) [Add to dictionary] 2) the 3) ht 4) he 5) hate 6) hie
7) ate 8) rte 9) hoe 0) hue a) Ste b) Rte c) Ute d) ht e
--- Choose -----------------------------------------------------
Number or letter (1-9,0,a-d):
Below is my wcheck config (including a hydra and a general.el keybinding which are not strictly necessary, but may be useful, so I'm including them here).
;;------------------------------------------------------------------------
;;
;; * wcheck
;;
;; A very configurable and powerful spellchecker
;;
;; https://github.com/tlikonen/wcheck-mode
;; http://www.emacswiki.org/emacs/WcheckMode
;;
;; See the wcheck README for a detailed explanation of these settings.
;;
(autoload 'wcheck-mode "wcheck-mode"
"Toggle wcheck-mode." t)
(autoload 'wcheck-change-language "wcheck-mode"
"Switch wcheck-mode languages." t)
(autoload 'wcheck-actions "wcheck-mode"
"Open actions menu." t)
(autoload 'wcheck-jump-forward "wcheck-mode"
"Move point forward to next marked text area." t)
(autoload 'wcheck-jump-backward "wcheck-mode"
"Move point backward to previous marked text area." t)
;;
;; ** Automatically turn on wcheck in text-mode buffers
;;
(dolist (hook '(text-mode-hook))
(add-hook hook (lambda () (wcheck-mode 1))))
;;
;; ** Automatically turn off wcheck in org-mode buffers
;; (which for some reason run text-mode hooks, so wcheck needs
;; to be explicitly disabled in org-mode, or it'll screw up the coloring)
;;
(dolist (hook '(org-mode-hook))
(add-hook hook (lambda () (wcheck-mode 0))))
;;
;; Hydra for wcheck-mode
;;
(defhydra hydra-wcheck-menu (:hint nil :foreign-keys warn)
"
Wcheck
--------------
_w_:wcheck mode _f_:forward to next error
_l_:change language _b_:backward to prev error _q_:quit
_a_:actions
"
("w" wcheck-mode :exit t)
("l" wcheck-change-language :exit t)
("a" wcheck-actions :exit t)
("f" wcheck-jump-forward :exit t)
("b" wcheck-jump-backward :exit t)
("q" nil nil nil :exit t))
;;
;; Bind some keys under the \mk leader:
;;
(general-define-key :states 'normal
:keymaps 'global
"\\mk" 'hydra-wcheck-menu/body)
;;
(setq wcheck-language-data
'(("American English"
(program . "/usr/bin/enchant")
(args "-l" "-d" "en_US")
(action-program . "/usr/bin/enchant")
(action-args "-a" "-d" "en_US")
(action-parser . enchant-suggestions-menu))))
;;
(setq wcheck-language "American English")
;;
(defun enchant-suggestions-menu (marked-text)
(cons (cons "[Add to dictionary]" 'enchant-add-to-dictionary)
(wcheck-parser-ispell-suggestions)))
;;
(defvar enchant-dictionaries-dir "~/.config/enchant")
;;
(defun enchant-add-to-dictionary (marked-text)
(let* ((word (aref marked-text 0))
(language (aref marked-text 4))
(file (let ((code (nth 1 (member "-d" (wcheck-query-language-data
language 'action-args)))))
(when (stringp code)
(concat (file-name-as-directory enchant-dictionaries-dir)
code ".dic")))))
(when (and file (file-writable-p file))
(with-temp-buffer
(insert word) (newline)
(append-to-file (point-min) (point-max) file)
(message "Added word \"%s\" to the %s dictionary"
word language)))))
;;
;;------------------------------------------------------------------------