X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/ebd3e29a39c3d491e9e3dbb9730afb52633997d3..e7f41bbc2713b940a91b313cfcd2143ed2f7f452:/swiper.el diff --git a/swiper.el b/swiper.el index 841bfe7ce..90e25b5f3 100644 --- a/swiper.el +++ b/swiper.el @@ -61,18 +61,6 @@ '((t (:inherit isearch-fail))) "Face for `swiper' matches modulo 3.") -(define-obsolete-face-alias 'swiper-minibuffer-match-face-1 - 'ivy-minibuffer-match-face-1 "0.6.0") - -(define-obsolete-face-alias 'swiper-minibuffer-match-face-2 - 'ivy-minibuffer-match-face-2 "0.6.0") - -(define-obsolete-face-alias 'swiper-minibuffer-match-face-3 - 'ivy-minibuffer-match-face-3 "0.6.0") - -(define-obsolete-face-alias 'swiper-minibuffer-match-face-4 - 'ivy-minibuffer-match-face-4 "0.6.0") - (defface swiper-line-face '((t (:inherit highlight))) "Face for current `swiper' line.") @@ -81,7 +69,9 @@ swiper-match-face-2 swiper-match-face-3 swiper-match-face-4) - "List of `swiper' faces for group matches.") + "List of `swiper' faces for group matches." + :group 'ivy-faces + :type 'list) (defcustom swiper-min-highlight 2 "Only highlight matches for regexps at least this long." @@ -104,7 +94,13 @@ (user-error "Should only be called in the minibuffer through `swiper-map'") (let* ((enable-recursive-minibuffers t) (from (ivy--regex ivy-text)) - (to (query-replace-read-to from "Query replace" t))) + (to (minibuffer-with-setup-hook + (lambda () + (setq minibuffer-default + (if (string-match "\\`\\\\_<\\(.*\\)\\\\_>\\'" ivy-text) + (match-string 1 ivy-text) + ivy-text))) + (read-from-minibuffer (format "Query replace %s with: " from))))) (swiper--cleanup) (ivy-exit-with-action (lambda (_) @@ -177,9 +173,7 @@ (declare-function mc/create-fake-cursor-at-point "ext:multiple-cursors-core") (declare-function multiple-cursors-mode "ext:multiple-cursors-core") -;;;###autoload (defun swiper-mc () - (interactive) (unless (require 'multiple-cursors nil t) (error "multiple-cursors isn't installed")) (let ((cands (nreverse ivy--old-cands))) @@ -241,7 +235,7 @@ (defun swiper-font-lock-ensure () "Ensure the entired buffer is highlighted." (unless (swiper-font-lock-ensure-p) - (unless (> (buffer-size) 100000) + (unless (or (> (buffer-size) 100000) (null font-lock-mode)) (if (fboundp 'font-lock-ensure) (font-lock-ensure) (with-no-warnings (font-lock-fontify-buffer)))))) @@ -250,7 +244,7 @@ "Store the current candidates format spec.") (defvar swiper--width nil - "Store the amount of digits needed for the longest line nubmer.") + "Store the number of digits needed for the longest line nubmer.") (defvar swiper-use-visual-line nil "When non-nil, use `line-move' instead of `forward-line'.") @@ -260,9 +254,8 @@ (defun swiper--candidates (&optional numbers-width) "Return a list of this buffer lines. -NUMBERS-WIDTH, when specified, is used for line numbers width -spec, instead of calculating it as the log of the buffer line -count." +NUMBERS-WIDTH, when specified, is used for width spec of line +numbers; replaces calculating the width from buffer line count." (if (and visual-line-mode ;; super-slow otherwise (< (buffer-size) 20000)) @@ -305,8 +298,7 @@ count." (buffer-substring (point) (line-end-position))))))) - (when (eq major-mode 'twittering-mode) - (remove-text-properties 0 (length str) '(field) str)) + (remove-text-properties 0 (length str) '(field) str) (put-text-property 0 1 'display (format swiper--format-spec (cl-incf line-number)) @@ -323,16 +315,20 @@ count." "`isearch' with an overview. When non-nil, INITIAL-INPUT is the initial search pattern." (interactive) - (swiper--ivy initial-input)) + (swiper--ivy (swiper--candidates) initial-input)) -(defun swiper-occur () - "Generate a custom occur buffer for `swiper'." - (ivy-occur-grep-mode) - (font-lock-mode -1) - (let* ((fname (propertize +(declare-function string-trim-right "subr-x") + +(defun swiper-occur (&optional revert) + "Generate a custom occur buffer for `swiper'. +When REVERT is non-nil, regenerate the current *ivy-occur* buffer." + (let* ((buffer (ivy-state-buffer ivy-last)) + (fname (propertize (with-ivy-window - (file-name-nondirectory - (buffer-file-name))) + (if (buffer-file-name buffer) + (file-name-nondirectory + (buffer-file-name buffer)) + (buffer-name buffer))) 'face 'compilation-info)) (cands (mapcar @@ -344,14 +340,27 @@ When non-nil, INITIAL-INPUT is the initial search pattern." (get-text-property 0 'display s)) 'face 'compilation-line-number) (substring s 1))) - ivy--old-cands))) + (if (null revert) + ivy--old-cands + (setq ivy--old-re nil) + (let ((ivy--regex-function 'swiper--re-builder)) + (ivy--filter + (progn (string-match "\"\\(.*\\)\"" (buffer-name)) + (match-string 1 (buffer-name))) + (with-current-buffer buffer + (swiper--candidates)))))))) + (unless (eq major-mode 'ivy-occur-grep-mode) + (ivy-occur-grep-mode) + (font-lock-mode -1)) (insert (format "-*- mode:grep; default-directory: %S -*-\n\n\n" default-directory)) (insert (format "%d candidates:\n" (length cands))) (ivy--occur-insert-lines (mapcar (lambda (cand) (concat "./" cand)) - cands)))) + cands)) + (goto-char (point-min)) + (forward-line 4))) (ivy-set-occur 'swiper 'swiper-occur) @@ -370,23 +379,25 @@ When non-nil, INITIAL-INPUT is the initial search pattern." (defun swiper--re-builder (str) "Transform STR into a swiper regex. -This is the regex used in the minibuffer, since the candidates -there have line numbers. In the buffer, `ivy--regex' should be used." - (cond - ((equal str "") - "") - ((equal str "^") - (setq ivy--subexps 0) - ".") - ((string-match "^\\^" str) - (setq ivy--old-re "") - (let ((re (ivy--regex-plus (substring str 1)))) - (if (zerop ivy--subexps) - (prog1 (format "^ ?\\(%s\\)" re) - (setq ivy--subexps 1)) - (format "^ %s" re)))) - (t - (ivy--regex-plus str)))) +This is the regex used in the minibuffer where candidates have +line numbers. For the buffer, use `ivy--regex' instead." + (replace-regexp-in-string + "\t" " " + (cond + ((equal str "") + "") + ((equal str "^") + (setq ivy--subexps 0) + ".") + ((string-match "^\\^" str) + (setq ivy--old-re "") + (let ((re (ivy--regex-plus (substring str 1)))) + (if (zerop ivy--subexps) + (prog1 (format "^ ?\\(%s\\)" re) + (setq ivy--subexps 1)) + (format "^ %s" re)))) + (t + (ivy--regex-plus str))))) (defvar swiper-history nil "History for `swiper'.") @@ -394,15 +405,14 @@ there have line numbers. In the buffer, `ivy--regex' should be used." (defvar swiper-invocation-face nil "The face at the point of invocation of `swiper'.") -(defun swiper--ivy (&optional initial-input) - "`isearch' with an overview using `ivy'. +(defun swiper--ivy (candidates &optional initial-input) + "Select one of CANDIDATES and move there. When non-nil, INITIAL-INPUT is the initial search pattern." (interactive) (swiper--init) (setq swiper-invocation-face (plist-get (text-properties-at (point)) 'face)) - (let ((candidates (swiper--candidates)) - (preselect + (let ((preselect (if swiper-use-visual-line (count-screen-lines (point-min) @@ -459,7 +469,7 @@ Matched candidates should have `swiper-invocation-face'." (defun swiper--ensure-visible () "Remove overlays hiding point." - (let ((overlays (overlays-at (point))) + (let ((overlays (overlays-at (1- (point)))) ov expose) (while (setq ov (pop overlays)) (if (and (invisible-p (overlay-get ov 'invisible)) @@ -482,7 +492,9 @@ Matched candidates should have `swiper-invocation-face'." (with-ivy-window (swiper--cleanup) (when (> (length ivy--current) 0) - (let* ((re (funcall ivy--regex-function ivy-text)) + (let* ((re (replace-regexp-in-string + " " "\t" + (funcall ivy--regex-function ivy-text))) (re (if (stringp re) re (caar re))) (str (get-text-property 0 'display ivy--current)) (num (if (string-match "^[0-9]+" str) @@ -567,10 +579,9 @@ WND, when specified is the window." (defun swiper--action (x) "Goto line X." - (let ((ln (1- (read (if (memq this-command '(ivy-occur-press)) - (when (string-match ":\\([0-9]+\\):.*\\'" x) - (match-string-no-properties 1 x)) - (get-text-property 0 'display x))))) + (let ((ln (1- (read (or (get-text-property 0 'display x) + (and (string-match ":\\([0-9]+\\):.*\\'" x) + (match-string-no-properties 1 x)))))) (re (ivy--regex ivy-text))) (if (null x) (user-error "No candidates") @@ -637,6 +648,8 @@ Run `swiper' for those buffers." (buffer-list))) :action 'swiper-multi-action-2 :unwind #'swiper--cleanup + :update-fn (lambda () + (swiper-multi-action-2 ivy--current)) :caller 'swiper-multi)) (defun swiper--multi-candidates (buffers)