]> git.eshelyaron.com Git - emacs.git/commitdiff
Make a prefix go to the previous error
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 25 Aug 2022 14:20:07 +0000 (16:20 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 25 Aug 2022 14:20:07 +0000 (16:20 +0200)
* lisp/textmodes/flyspell.el (flyspell-goto-next-error): Make a
prefix find the previous error (bug#50443).

lisp/textmodes/flyspell.el

index 1094ef3e93432fcd71fe67a5b03fea33d14f1c52..a893bc7b9cebaccc1d1f4eddb5b29b86e12217ad 100644 (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 ...                                           */