Commit 972bab09 authored by Gregory Heytings's avatar Gregory Heytings Committed by Juri Linkov
Browse files

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.
parent b4eb84d4
......@@ -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
......
......@@ -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
+++
......
......@@ -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)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment