Flyspell-region is really, really slow on the Mac. You can literally watch it check a word, pause, check a word, pause…
Well, sometimes.
There are a few interesting things about this:
So, what’s going on?
Two things:
First, if the region is under a certain number of characters (see flyspell-large-region in flyspell.el, set to 1000 in the base version), Emacs will run flyspell-small-region instead of flyspell-large-region.
Second, flyspell-small-region is slow — much slower than flyspell-large-region. Look at the code for flyspell-small-region:
(defun flyspell-small-region (beg end)
"Flyspell text between BEG and END."
(save-excursion
(if (> beg end)
(let ((old beg))
(setq beg end)
(setq end old)))
(goto-char beg)
(let ((count 0))
(while (< (point) end)
(if (and flyspell-issue-message-flag (= count 100))
(progn
(message "Spell Checking...%d%%"
(* 100 (/ (float (- (point) beg)) (- end beg))))
(setq count 0))
(setq count (+ 1 count)))
(flyspell-word)
(sit-for 0)
(let ((cur (point)))
(forward-word 1)
(if (and (< (point) end) (> (point) (+ cur 1)))
(backward-char 1)))))
(backward-char 1)
(if flyspell-issue-message-flag (message "Spell Checking completed."))
(flyspell-word)))
The slow thing here is actually not the spell checking, it’s the sit-for call right after it. sit-for checks for input, but a side effect is that it forces a display refresh – which is fast in the terminal version of Emacs but slow in the GUI.
So, there are a couple ways of fixing this:
To remove it completely with advice, use something like this:
(defadvice flyspell-region (around fast-flyspell-region)
(flet ( (sit-for (x) t) )
ad-do-it))
(ad-activate 'flyspell-region)
Suddenly, flyspell-region is not so slow anymore.
Comments are moderated whenever I remember that I have a blog.
There are no comments on this article.