Package: emacs;
Reported by: Stefan Kangas <stefan <at> marxist.se>
Date: Tue, 7 Sep 2021 00:23:02 UTC
Severity: wishlist
Fixed in version 29.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Roni Kallio <roni <at> kallio.app> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 50443 <at> debbugs.gnu.org, Stefan Kangas <stefan <at> marxist.se> Subject: bug#50443: Fwd: Flyspell error traversal additions Date: Thu, 09 Sep 2021 23:58:19 +0300
>> IMO the best course of action would be to modify >> `flyspell-goto-next-error' to accept a prefix argument. The prefix >> would control the direction and number of jumps performed; negative >> arguments would jump backwards -ARG errors (by calling >> flyspell-goto-previous-error), while positive arguments would jump >> forwards ARG errors. This would be similar to how commands like >> `forward-word' handle prefix arguments. This would allow us to leave >> the mode-map unchanged, but still distribute the improvement to all >> users. > > Yes, I agree. Can you change the patch to work this way? I've been using this updated patch for a while now, hope it comes through ok. diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el index 975f540936..b80626bb12 100644 --- a/lisp/textmodes/flyspell.el +++ b/lisp/textmodes/flyspell.el @@ -1708,39 +1708,77 @@ flyspell-old-pos-error ;;*---------------------------------------------------------------------*/ ;;* flyspell-goto-next-error ... */ ;;*---------------------------------------------------------------------*/ -(defun flyspell-goto-next-error () - "Go to the next previously detected error. -In general FLYSPELL-GOTO-NEXT-ERROR must be used after -FLYSPELL-BUFFER." - (interactive) - (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 - (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)) - (if (flyspell-overlay-p (car ovs)) - (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)) - (goto-char pos) - (if (= pos max) - (message "No more miss-spelled word!")))) +(defun flyspell-goto-next-error (&optional arg) + "Go to the detected error that is ARG errors forward. +In general `flyspell-goto-next-error' must be used after +`flyspell-buffer'." + (interactive "p") + (cond + ((= arg 0) nil) + ((< arg 0) (flyspell-goto-previous-error (abs arg))) + (t + (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 + (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)) + (if (flyspell-overlay-p (car ovs)) + (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)) + (goto-char pos) + (if (= pos max) + (message "No more miss-spelled word!"))) + (flyspell-goto-next-error (1- arg))))) + +(defun flyspell-goto-previous-error (&optional arg) + "Go to the detected error ARG errors backward. +In general `flyspell-goto-previous-error' must be used after +`flyspell-buffer'." + (interactive "p") + (cond + ((= arg 0) nil) + ((< arg 0) (flyspell-goto-next-error (abs arg))) + (t + (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-goto-previous-error (1- arg))))) ;;*---------------------------------------------------------------------*/ ;;* flyspell-overlay-p ... */ > Also, the patch is long enough to require a copyright assignment from > you. Would you be willing to start your legal paperwork at this time, > so we could accept your contribution when it is complete? Sure, can you direct me to what I need to do to sign? -- Roni Kallio
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.