User option to move to another match when changing direction in isearch.

* lisp/isearch.el (isearch-direction-change-changes-match):
New user option (bug#47599).
(isearch-repeat): Use the new option.
(isearch-repeat-forward, isearch-repeat-backward): Adapt to the
new option.

* etc/NEWS: Mention the new user option.

* doc/emacs/search.texi: Document the new user option.
This commit is contained in:
Gregory Heytings 2021-04-07 17:51:30 +00:00 committed by Juri Linkov
parent b4eb84d4af
commit 972bab0981
3 changed files with 34 additions and 4 deletions

View file

@ -201,6 +201,14 @@ something before the starting point, type @kbd{C-r} to switch to a
backward search, leaving the search string unchanged. Similarly,
@kbd{C-s} in a backward search switches to a forward search.
@cindex search, changing direction
@vindex isearch-repeat-on-direction-change
When you change the direction of a search, the first command you
type will, by default, remain on the same match, and the cursor will
move to the other end of the match. To move to another match
immediately, customize the variable
@code{isearch-repeat-on-direction-change} to @code{t}.
@cindex search, wrapping around
@cindex search, overwrapped
@cindex wrapped search

View file

@ -367,6 +367,12 @@ trying to be non-destructive.
This command opens a new buffer called "*Memory Report*" and gives a
summary of where Emacs is using memory currently.
+++
** New user option 'isearch-repeat-on-direction-change'.
When this option is set, direction changes in Isearch move to another
search match, if there is one, instead of moving point to the other
end of the current match.
** Outline
+++

View file

@ -185,6 +185,16 @@ When `nil', never wrap, just stop at the last match."
(const :tag "Disable wrapping" nil))
:version "28.1")
(defcustom isearch-repeat-on-direction-change nil
"Whether a direction change should move to another match.
When `nil', the default, a direction change moves point to the other
end of the current search match.
When `t', a direction change moves to another search match, if there
is one."
:type '(choice (const :tag "Remain on the same match" nil)
(const :tag "Move to another match" t))
:version "28.1")
(defvar isearch-mode-hook nil
"Function(s) to call after starting up an incremental search.")
@ -1847,6 +1857,8 @@ Use `isearch-exit' to quit without signaling."
(funcall isearch-wrap-function)
(goto-char (if isearch-forward (point-min) (point-max))))))
;; C-s in reverse or C-r in forward, change direction.
(if (and isearch-other-end isearch-repeat-on-direction-change)
(goto-char isearch-other-end))
(setq isearch-forward (not isearch-forward)
isearch-success t))
@ -1910,10 +1922,12 @@ of the buffer, type \\[isearch-beginning-of-buffer] with a numeric argument."
(cond ((< count 0)
(isearch-repeat-backward (abs count))
;; Reverse the direction back
(isearch-repeat 'forward))
(let ((isearch-repeat-on-direction-change nil))
(isearch-repeat 'forward)))
(t
;; Take into account one iteration to reverse direction
(when (not isearch-forward) (setq count (1+ count)))
(unless isearch-repeat-on-direction-change
(when (not isearch-forward) (setq count (1+ count))))
(isearch-repeat 'forward count))))
(isearch-repeat 'forward)))
@ -1931,10 +1945,12 @@ of the buffer, type \\[isearch-end-of-buffer] with a numeric argument."
(cond ((< count 0)
(isearch-repeat-forward (abs count))
;; Reverse the direction back
(isearch-repeat 'backward))
(let ((isearch-repeat-on-direction-change nil))
(isearch-repeat 'backward)))
(t
;; Take into account one iteration to reverse direction
(when isearch-forward (setq count (1+ count)))
(unless isearch-repeat-on-direction-change
(when isearch-forward (setq count (1+ count))))
(isearch-repeat 'backward count))))
(isearch-repeat 'backward)))