[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#50443: Fwd: Flyspell error traversal additions
From: |
Roni Kallio |
Subject: |
bug#50443: Fwd: Flyspell error traversal additions |
Date: |
Thu, 09 Sep 2021 23:58:19 +0300 |
User-agent: |
mu4e 1.6.0; emacs 28.0.50 |
>> 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