;; Author: Oleh Krehel <ohwoeowho@gmail.com>
;; URL: https://github.com/abo-abo/swiper
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "24.1") (ivy "0.1.0"))
+;; Version: 0.3.0
+;; Package-Requires: ((emacs "24.1"))
;; Keywords: matching
;; This file is part of GNU Emacs.
(defvar swiper-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "M-q") 'swiper-query-replace)
+ (define-key map (kbd "C-l") 'swiper-recenter-top-bottom)
map)
"Keymap for swiper.")
(interactive)
(if (null (window-minibuffer-p))
(user-error "Should only be called in the minibuffer through `swiper-map'")
- (let* ((from (ivy--regex ivy-text))
+ (let* ((enable-recursive-minibuffers t)
+ (from (ivy--regex ivy-text))
(to (query-replace-read-to from "Query replace" t)))
(delete-minibuffer-contents)
(setq ivy--action
(defvar swiper--window nil
"Store the current window.")
+(defun swiper-recenter-top-bottom (&optional arg)
+ "Call (`recenter-top-bottom' ARG) in `swiper--window'."
+ (interactive "P")
+ (with-selected-window swiper--window
+ (recenter-top-bottom arg)))
+
(defun swiper-font-lock-ensure ()
"Ensure the entired buffer is highlighted."
(unless (or (derived-mode-p 'magit-mode)
gnus-summary-mode
gnus-article-mode
gnus-group-mode
- emms-playlist-mode erc-mode)))
- (if (fboundp 'font-lock-ensure)
- (font-lock-ensure)
- (font-lock-fontify-buffer))))
+ emms-playlist-mode erc-mode
+ org-agenda-mode
+ dired-mode)))
+ (unless (> (buffer-size) 100000)
+ (if (fboundp 'font-lock-ensure)
+ (font-lock-ensure)
+ (with-no-warnings (font-lock-fontify-buffer))))))
(defvar swiper--format-spec ""
"Store the current candidates format spec.")
(line-beginning-position)
(line-end-position)))
candidates)
- (zerop (forward-line 1)))
+ (forward-line 1))
(nreverse candidates))))))
(defvar swiper--opoint 1
(interactive)
(swiper--ivy initial-input))
+(defvar swiper--anchor nil
+ "A line number to which the search should be anchored.")
+
+(defvar swiper--len 0
+ "The last length of input for which an anchoring was made.")
+
(defun swiper--init ()
"Perform initialization common to both completion methods."
(deactivate-mark)
"`isearch' with an overview using `ivy'.
When non-nil, INITIAL-INPUT is the initial search pattern."
(interactive)
- (ido-mode -1)
(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))
- (ido-mode 1)
(swiper--cleanup)
(if (null ivy-exit)
(goto-char swiper--opoint)
(setq expose (overlay-get ov 'isearch-open-invisible)))
(funcall expose ov)))))
+(defvar swiper--overlays nil
+ "Store overlays.")
+
(defun swiper--cleanup ()
"Clean up the overlays."
(while swiper--overlays
(goto-char (point-min))
(isearch-clean-overlays)))
-(defvar swiper--overlays nil
- "Store overlays.")
-
-(defvar swiper--anchor nil
- "A line number to which the search should be anchored.")
-
-(defvar swiper--len 0
- "The last length of input for which an anchoring was made.")
-
(defun swiper--update-input-ivy ()
"Called when `ivy' input is updated."
(swiper--cleanup)
(forward-line (1- num))
(isearch-range-invisible (line-beginning-position)
(line-end-position))
- (unless (and (> (point) (window-start))
- (< (point) (window-end swiper--window t)))
+ (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))
- (swiper--add-overlays
- re
- (window-start swiper--window)
- (window-end swiper--window t)))))
-
-(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)
+ "Add overlays for RE regexp in visible part of the current buffer."
+ (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 (save-excursion
+ (forward-line (- wh))
+ (point)))
+ (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)
+ (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))))))))
(defun swiper--action (x input)
"Goto line X and search for INPUT."