;; Author: Oleh Krehel <ohwoeowho@gmail.com>
;; URL: https://github.com/abo-abo/swiper
-;; Version: 0.3.0
+;; Version: 0.4.0
;; Package-Requires: ((emacs "24.1"))
;; Keywords: matching
;; candidates. The search regex can be split into groups with a
;; space. Each group is highlighted with a different face.
;;
-;; The overview back end is `ivy'.
-;;
;; It can double as a quick `regex-builder', although only single
;; lines will be matched.
+;;
+;; It also provides `ivy-mode': a global minor mode that uses the
+;; matching back end of `swiper' for all matching on your system,
+;; including file matching. You can use it in place of `ido-mode'
+;; (can't have both on at once).
;;; Code:
(require 'ivy)
(defface swiper-match-face-1
'((t (:inherit isearch-lazy-highlight-face)))
- "Face for `swiper' matches.")
+ "The background face for `swiper' matches.")
(defface swiper-match-face-2
'((t (:inherit isearch)))
- "Face for `swiper' matches.")
+ "Face for `swiper' matches modulo 1.")
(defface swiper-match-face-3
'((t (:inherit match)))
- "Face for `swiper' matches.")
+ "Face for `swiper' matches modulo 2.")
(defface swiper-match-face-4
- '((t (:inherit isearch)))
- "Face for `swiper' matches.")
+ '((t (:inherit isearch-fail)))
+ "Face for `swiper' matches modulo 3.")
(defface swiper-line-face
'((t (:inherit highlight)))
(from (ivy--regex ivy-text))
(to (query-replace-read-to from "Query replace" t)))
(delete-minibuffer-contents)
- (setq ivy--action
- (lambda ()
- (perform-replace from to
- t t t)))
+ (ivy-set-action (lambda ()
+ (with-selected-window swiper--window
+ (perform-replace from to
+ t t nil))))
(swiper--cleanup)
(exit-minibuffer))))
gnus-group-mode
emms-playlist-mode erc-mode
org-agenda-mode
- dired-mode)))
+ dired-mode
+ jabber-chat-mode
+ elfeed-search-mode)))
(unless (> (buffer-size) 100000)
(if (fboundp 'font-lock-ensure)
(font-lock-ensure)
"`isearch' with an overview using `ivy'.
When non-nil, INITIAL-INPUT is the initial search pattern."
(interactive)
+ (unless (eq (length (help-function-arglist 'ivy-read)) 4)
+ (warn "You seem to be using the outdated stand-alone \"ivy\" package.
+Please remove it and update the \"swiper\" package."))
(swiper--init)
(let ((candidates (swiper--candidates))
(preselect (format
(replace-regexp-in-string
"%s" "pattern: " swiper--format-spec)
candidates
- nil
- initial-input
- swiper-map
- preselect
- #'swiper--update-input-ivy))
- (swiper--cleanup)
+ :initial-input initial-input
+ :keymap swiper-map
+ :preselect preselect
+ :require-match t
+ :update-fn #'swiper--update-input-ivy
+ :unwind #'swiper--cleanup))
(if (null ivy-exit)
(goto-char swiper--opoint)
(swiper--action res ivy-text)))))
(unless (and (>= (point) (window-start))
(<= (point) (window-end swiper--window t)))
(recenter)))
- (let ((ov (make-overlay
- (line-beginning-position)
- (1+ (line-end-position)))))
- (overlay-put ov 'face 'swiper-line-face)
- (overlay-put ov 'window swiper--window)
- (push ov swiper--overlays))
- (let ((wh (window-height)))
- (swiper--add-overlays
- re
- (save-excursion
- (forward-line (- wh))
- (point))
- (save-excursion
- (forward-line wh)
- (point)))))))
-
-(defun swiper--add-overlays (re beg end)
- "Add overlays for RE regexp in current buffer between BEG and END."
- (when (>= (length re) swiper-min-highlight)
- (save-excursion
- (goto-char beg)
- ;; RE can become an invalid regexp
- (while (and (ignore-errors (re-search-forward re end t))
- (> (- (match-end 0) (match-beginning 0)) 0))
- (let ((i 0))
- (while (<= i ivy--subexps)
- (when (match-beginning i)
- (let ((overlay (make-overlay (match-beginning i)
- (match-end i)))
- (face
- (cond ((zerop ivy--subexps)
- (cl-caddr swiper-faces))
- ((zerop i)
- (car swiper-faces))
- (t
- (nth (1+ (mod (1- i) (1- (length swiper-faces))))
- swiper-faces)))))
- (push overlay swiper--overlays)
- (overlay-put overlay 'face face)
- (overlay-put overlay 'window swiper--window)
- (overlay-put overlay 'priority i)))
- (cl-incf i)))))))
+ (swiper--add-overlays re))))
+
+(defun swiper--add-overlays (re &optional beg end)
+ "Add overlays for RE regexp in visible part of the current buffer.
+BEG and END, when specified, are the point bounds."
+ (let ((ov (make-overlay
+ (line-beginning-position)
+ (1+ (line-end-position)))))
+ (overlay-put ov 'face 'swiper-line-face)
+ (overlay-put ov 'window swiper--window)
+ (push ov swiper--overlays))
+ (let* ((wh (window-height))
+ (beg (or beg (save-excursion
+ (forward-line (- wh))
+ (point))))
+ (end (or end (save-excursion
+ (forward-line wh)
+ (point)))))
+ (when (>= (length re) swiper-min-highlight)
+ (save-excursion
+ (goto-char beg)
+ ;; RE can become an invalid regexp
+ (while (and (ignore-errors (re-search-forward re end t))
+ (> (- (match-end 0) (match-beginning 0)) 0))
+ (let ((i 0))
+ (while (<= i ivy--subexps)
+ (when (match-beginning i)
+ (let ((overlay (make-overlay (match-beginning i)
+ (match-end i)))
+ (face
+ (cond ((zerop ivy--subexps)
+ (cadr swiper-faces))
+ ((zerop i)
+ (car swiper-faces))
+ (t
+ (nth (1+ (mod (+ i 2) (1- (length swiper-faces))))
+ swiper-faces)))))
+ (push overlay swiper--overlays)
+ (overlay-put overlay 'face face)
+ (overlay-put overlay 'window swiper--window)
+ (overlay-put overlay 'priority i)))
+ (cl-incf i))))))))
(defun swiper--action (x input)
"Goto line X and search for INPUT."