>From 4c69d32c61bf94804e4e7efad25dce279dcb8369 Mon Sep 17 00:00:00 2001 From: Roni Kallio Date: Thu, 28 Jan 2021 13:22:08 +0200 Subject: [PATCH] Add flyspell-goto-previous-error Now possible to go backwards detected flyspell errors. Usage: M-x flyspell-goto-previous-error RET. In the future this will allow us to implement jumping backward and forward, and jumping over multiple errors using prefix-argument in both flyspell-goto-next-error and flyspell-goto-previous-error. --- lisp/textmodes/flyspell.el | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el index d850316884..12f9b7a203 100644 --- a/lisp/textmodes/flyspell.el +++ b/lisp/textmodes/flyspell.el @@ -1757,6 +1757,34 @@ flyspell-goto-next-error (if (= pos max) (message "No more miss-spelled word!")))) +(defun flyspell-goto-previous-error () + "Go to the previous detected error. +In general `flyspell-goto-previous-error' must be used after +`flyspell-buffer'." + (interactive) + (let ((min (point-min))) + (when (and (eq (current-buffer) flyspell-old-buffer-error) + (eq (point) flyspell-old-pos-error)) + (when (= (point) min) + (message "Restarting from end of buffer") + (goto-char (point-max))) + (backward-word 1)) + (while (and (> (point) min) + (let ((ovs (overlays-at (point))) + (r nil)) + ;; look for a flyspell overlay + (while (and (not r) (consp ovs)) + (if (flyspell-overlay-p (car ovs)) + (setq r t) + (setq ovs (cdr ovs)))) + (not r))) + ;; go to previous word if no overlay was found + (backward-word 1)) + (setq flyspell-old-pos-error (point)) + (setq flyspell-old-buffer-error (current-buffer)) + (when (= (point) min) + (message "No more miss-spelled word!")))) + ;;*---------------------------------------------------------------------*/ ;;* flyspell-overlay-p ... */ ;;*---------------------------------------------------------------------*/ -- 2.29.2