swiper-helmを少し便利に


swiper-helm

swiper-helm というパッケージをバッファ内検索によく利用しています。ただ普通に呼び出しても空の検索窓が立ちあがってしまってあまり便利ではないです。

ここでは、起動時に、選択範囲あるいはカーソル下のシンボルを検索窓に入れるようにします。また、普通のisearch内からは同じキーで検索中の単語を引き継ぐ swiper-helm-from-isearch を呼ぶようにします。

設定

;;;
;;; swiper.el / swiper-helm.el
;; https://github.com/abo-abo/swiper
;; https://github.com/abo-abo/swiper-helm
;; http://pragmaticemacs.com/emacs/dont-search-swipe/
;; http://pragmaticemacs.com/emacs/search-or-swipe-for-the-current-word/
(use-package swiper-helm
  :commands (swiper
             swiper-helm
             swiper-helm-at-point
             swiper-helm-from-isearch)
  :bind (("s-s" . swiper-helm-at-point)
         ("C-s-s" . swiper-helm))
  :bind (:map isearch-mode-map
              ("s-s" . swiper-helm-from-isearch))
  ;; Configuration
  :config
  ;; Newly defined
  (defun swiper-helm-at-point ()
    "Custom function to pick up a thing at a point for swiper-helm

If there is a symbol at the current point, its textual representation is
searched for by swiper-helm. If there is no symbol, empty search box is
started."
    (interactive)
    (swiper-helm (cond
                  ;; If there is selection use it
                  ((and transient-mark-mode mark-active (not (eq (mark) (point))))
                   (buffer-substring-no-properties (mark) (point)))
                  ;; Otherwise, use symbol at point or empty
                  (t (format "%s"
                             (or (thing-at-point 'symbol)
                                 "")))))))

swiper-helm-at-point が新しく定義した関数です。 s-s つまり Super-s を割り当てています。 Super は右のCommand Keyを設定しています。これで選択範囲があればそれを検索対象に、なければカーソル下のシンボルを検索対象にします。また、isearch内のときは適切な関数が呼ばれるように同じキーを再設定しています。

備考

調べてもよくわかりませんでしたが、ひょっとすると同様の機能がもとからあるかも?