use ivy to replace isearch

之前习惯使用 isearch 来搜索了,最近看别人使用 ivy 看着心痒痒的,就想试试看。其实 ivy 的效果和 swoop 很像,不过区别是 ivy 是在 minibuffer 来显示可选信息的,swoop 是在一个 buffer 显示的。有洁癖的可能稍微计较一下。

;; ivy swiper
(defun wd-swiper-at-point ()
  "Pull next word from buffer into search string."
  (interactive)
  (let (query)
    (with-ivy-window
      (let ((tmp (symbol-at-point)))
        (setq query tmp)))
    (when query
      (insert (format "%s" query))
      )))

(use-package ivy
  :config
  (ivy-mode 1)
  (setq ivy-use-virtual-buffers t)
  (set-variable 'ivy-on-del-error-function '(lambda()))
  )

(use-package swiper
  :config
  (global-set-key "\C-s" 'swiper)
  (define-key swiper-map (kbd "C-w") 'wd-swiper-at-point)
  (define-key swiper-map (kbd "C-f") 'swiper-avy)
  )

我大致做了上面几个设定,\C-s 绑定了 swiper,启动 swiper 之后用 \C-w 可以快速把光标位置的 symbol 放到 minibuffer 来搜索。然后 swiper 和 isearch 有个区别是,默认情况下,swiper 如果 minibuffer 没有内容,按 backspace 会退出,这个和 isearch 的习惯不一样,把 ivy-on-del-error-function 重新绑定一下就可以了。

ivy 默认会绑定一个快捷键是在你 minibuffer 输入一些内容之后,会出来很多匹配结果,这个时候可以按 C-' 调用 swiper-avy 方便你快速定位,也挺好用的。不过我这里不好用,不知道怎么回事,只好重新绑定了一下。

还可以在 swiper 查询阶段按 M-q 进入替换模式。