Make a prefix go to the previous error

* lisp/textmodes/flyspell.el (flyspell-goto-next-error): Make a
prefix find the previous error (bug#50443).
This commit is contained in:
Lars Ingebrigtsen 2022-08-25 16:20:07 +02:00
parent 52f9ce5528
commit 7464640d2a

View file

@ -1714,25 +1714,32 @@ of a misspelled word removed when you've corrected it."
;;*---------------------------------------------------------------------*/
;;* flyspell-goto-next-error ... */
;;*---------------------------------------------------------------------*/
(defun flyspell-goto-next-error ()
"Go to the next previously detected error.
(defun flyspell-goto-next-error (&optional previous)
"Go to the next error.
If PREVIOUS (interactively, the prefix), go to the previous error
instead.
In general FLYSPELL-GOTO-NEXT-ERROR must be used after
FLYSPELL-BUFFER."
(interactive)
(interactive "P")
(let ((pos (point))
(max (point-max)))
(if (and (eq (current-buffer) flyspell-old-buffer-error)
(eq pos flyspell-old-pos-error))
(progn
(if (= flyspell-old-pos-error max)
;; goto beginning of buffer
(max (if previous (point-min) (point-max))))
(when (and (eq (current-buffer) flyspell-old-buffer-error)
(eq pos flyspell-old-pos-error))
(if previous
(if (= flyspell-old-pos-error max)
(progn
(message "Restarting from beginning of buffer")
(goto-char (point-min)))
(forward-word 1))
(setq pos (point))))
;; seek the next error
(while (and (< pos max)
(message "Restarting from end of the buffer")
(goto-char (point-max)))
(forward-word -1))
(if (= flyspell-old-pos-error max)
(progn
(message "Restarting from beginning of buffer")
(goto-char (point-min)))
(forward-word 1)))
(setq pos (point)))
;; Seek the next error.
(while (and (/= pos max)
(let ((ovs (overlays-at pos))
(r '()))
(while (and (not r) (consp ovs))
@ -1740,13 +1747,15 @@ FLYSPELL-BUFFER."
(setq r t)
(setq ovs (cdr ovs))))
(not r)))
(setq pos (1+ pos)))
;; save the current location for next invocation
(setq flyspell-old-pos-error pos)
(setq flyspell-old-buffer-error (current-buffer))
(setq pos (if previous (1- pos) (1+ pos))))
(goto-char pos)
(if (= pos max)
(message "No more miss-spelled word!"))))
(when previous
(forward-word -1))
;; Save the current location for next invocation.
(setq flyspell-old-pos-error (point))
(setq flyspell-old-buffer-error (current-buffer))
(when (= (point) max)
(message "No more miss-spelled words"))))
;;*---------------------------------------------------------------------*/
;;* flyspell-overlay-p ... */