branch: master
commit 2a036b8a42633a8f7de7bb3b3db13a5f06867b32
Author: Brian Leung <[email protected]>
Commit: Brian Leung <[email protected]>
swiper.el (swiper--isearch-function): Change.
Having point before the last "o" in "dodo", as in "dod|o", should hop
to the beginning of the string upon entering "do" as the regexp. This
is because when searching backward, the (match-end) of the match to
which we hop should not cross the starting point of the search. When
changing the search string from "do" to "do?", we hop back to the
second occurrence of "do", since "do?" can match the second "d" taken
in isolation.
---
ivy-test.el | 32 ++++++++++++++++----------------
swiper.el | 33 +++++++++++++--------------------
2 files changed, 29 insertions(+), 36 deletions(-)
diff --git a/ivy-test.el b/ivy-test.el
index 386fe9c..0d53b07 100644
--- a/ivy-test.el
+++ b/ivy-test.el
@@ -1129,24 +1129,12 @@ a buffer visiting a file."
(global-set-key (kbd "C-r") #'isearch-backward-regexp)
("C-r" "defun\\|defvar" "RET"))
"(defun foo)\nasdf\n(|defvar bar)"))
- ;; NOTE: The following two behaviors do not match
- ;; `isearch-backward-regexp', but they match that of
- ;; `swiper-isearch-forward', as `swiper-isearch' does not reset the
- ;; point when the regexp becomes invalid, meaning the point is left
- ;; at the initial match of the first part of the regexp.
(should
(string=
(ivy-with-text
"(defun foo)\nasdf\n(defvar bar)|"
(global-set-key (kbd "C-r") #'swiper-isearch-backward)
("C-r" "defun\\|defvar" "RET"))
- "(|defun foo)\nasdf\n(defvar bar)"))
- (should
- (string=
- (ivy-with-text
- "(defun foo)\nasdf\n(defvar bar)|"
- (global-set-key (kbd "C-r") #'swiper-isearch-backward)
- ("C-r" "defun\\|defvar" "C-n RET"))
"(defun foo)\nasdf\n(|defvar bar)"))
(should
(string=
@@ -1161,7 +1149,21 @@ a buffer visiting a file."
"(defun foo)\nasdf\n(|defun bar)"
(global-set-key (kbd "C-r") #'swiper-isearch-backward)
("C-r" "defun" "RET"))
- "(|defun foo)\nasdf\n(defun bar)")))
+ "(|defun foo)\nasdf\n(defun bar)"))
+ (should
+ (string=
+ (ivy-with-text
+ "(defun foo)\nasdf\n(de|fun bar)"
+ (global-set-key (kbd "C-r") #'swiper-isearch-backward)
+ ("C-r" "def" "RET"))
+ "(|defun foo)\nasdf\n(defun bar)"))
+ (should
+ (string=
+ (ivy-with-text
+ "(defun foo)\nasdf\n(de|fun bar)"
+ (global-set-key (kbd "C-r") #'swiper-isearch-backward)
+ ("C-r" "def?" "RET"))
+ "(defun foo)\nasdf\n(|defun bar)")))
(ert-deftest swiper-isearch-backward-backspace ()
(should
@@ -1205,9 +1207,7 @@ a buffer visiting a file."
"Foo\nfoo|\nFOO\n")))
(ert-deftest swiper--isearch-format ()
- (setq swiper--isearch-point-history
- (list
- (cons "" 1)))
+ (setq swiper--isearch-start-point 0)
(with-temp-buffer
(insert
"line0\nline1\nline line\nline line\nline5")
diff --git a/swiper.el b/swiper.el
index 500ac18..7eeefcf 100644
--- a/swiper.el
+++ b/swiper.el
@@ -1285,14 +1285,6 @@ See `ivy-format-functions-alist' for further
information."
res))
;;* `swiper-isearch'
-(defvar swiper--isearch-point-history nil
- "Store the current input and point history for a single search.
-Each element is a cons cell of an input and a point position that
-corresponds to it.
-
-This ensures that if the user enters \"ab\", the point will
-come back to the same place as when \"a\" was initially entered.")
-
(defun swiper-isearch-function (str)
"Collect STR matches in the current buffer for `swiper-isearch'."
(with-ivy-window
@@ -1306,6 +1298,7 @@ come back to the same place as when \"a\" was initially
entered.")
(overlays-at (point))))))
(defvar swiper--isearch-backward nil)
+(defvar swiper--isearch-start-point nil)
(defun swiper--isearch-function (str)
(let* ((case-fold-search (ivy--case-fold-p str))
@@ -1315,7 +1308,6 @@ come back to the same place as when \"a\" was initially
entered.")
(let ((re (if (string-match "\\`\\(.*\\)[\\]|\\'" re)
(match-string 1 re)
re))
- (pt-hist (cdr (assoc str swiper--isearch-point-history)))
cands
idx-found
(idx 0))
@@ -1324,12 +1316,17 @@ come back to the same place as when \"a\" was initially
entered.")
(while (funcall (if swiper--isearch-backward #'re-search-backward
#'re-search-forward) re nil t)
(when (swiper-match-usable-p)
(unless idx-found
- (when (or
- (eq (match-beginning 0) pt-hist)
- (if swiper--isearch-backward
- (<= (match-beginning 0) (cdar
swiper--isearch-point-history))
- (>= (match-beginning 0) (cdar
swiper--isearch-point-history))))
- (push (cons str (match-beginning 0))
swiper--isearch-point-history)
+ (when (if swiper--isearch-backward
+ (or (<= (match-end 0) swiper--isearch-start-point)
+ (and (< (match-beginning 0)
swiper--isearch-start-point)
+ (let ((mb-match
+ (string-match-p
+ re
+ (buffer-substring-no-properties
+ (match-beginning 0)
+ swiper--isearch-start-point))))
+ (eq mb-match 0))))
+ (>= (match-beginning 0) swiper--isearch-start-point))
(setq idx-found idx)))
(cl-incf idx)
(let ((pos (if (or swiper--isearch-backward
swiper-goto-start-of-match)
@@ -1399,8 +1396,6 @@ When not running `swiper-isearch' already, start it."
(deactivate-mark))
(bounds-of-thing-at-point 'symbol)))
(setq str (buffer-substring-no-properties (car bnd) (cdr bnd))))
- (setq swiper--isearch-point-history
- (list (cons "" (car bnd))))
(insert str)
(unless regionp
(ivy--insert-symbol-boundaries)))
@@ -1519,12 +1514,10 @@ When not running `swiper-isearch' already, start it."
(interactive)
(swiper--init)
(swiper-font-lock-ensure)
- (setq swiper--isearch-point-history
- (list
- (cons "" (- (point) (if swiper--isearch-backward 1 0)))))
(let ((ivy-fixed-height-minibuffer t)
(cursor-in-non-selected-windows nil)
(swiper-min-highlight 1)
+ (swiper--isearch-start-point (point))
res)
(unwind-protect
(and