branch: master commit 2a036b8a42633a8f7de7bb3b3db13a5f06867b32 Author: Brian Leung <bkleun...@gmail.com> Commit: Brian Leung <bkleun...@gmail.com>
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