##概要
以前るびきちさんがツイートしていた,
https://twitter.com/rubikitch/status/412473497529503744
というのを自分で書いてみた,ということ.
差分としては一文字入力後にいくらかのディレイを挟んでace-jump-mode
(or avy)が発動するようにしていることと、anything-occur
ではなくhelm-swoop
を発動させるようにしていることである。
詳細はREADMEを見ていただくとよい。
参考記事
以下のブログ記事は参考になるだろう。
インストールについても参考にされたい。
-
[ace-isearch.el : 超isearch=isearch+ace-jump-mode+helm-swoop カーソル移動と検索を統合!] (http://rubikitch.com/tag/ace-isearch/)
##機能実現のカギ
以下はace-isearch-mode
の定義部分である。
(define-minor-mode ace-isearch-mode
"Minor-mode which combines isearch, ace-jump-mode, avy, and helm-swoop seamlessly."
:group 'ace-isearch
:init-value nil
:global nil
:lighter ace-isearch-lighter
(if ace-isearch-mode
(progn
(add-hook 'isearch-update-post-hook 'ace-isearch--jumper-function nil t)
(ace-isearch--make-ace-jump-or-avy))
(remove-hook 'isearch-update-post-hook 'ace-isearch--jumper-function t)))
重要なのはisearch-update-post-hook
がisearch実行中のクエリ(isearch-string
)が更新されるタイミングで実行されるということである。これさえ分かってしまえば、あとはace-isearch--jumper-function
をクエリの長さに応じて振る舞いを変えるように作るだけなので、実装はそれほど難しくはないのである。
##補足情報
ace-isearch-jump-during-isearch
isearchで移動中、そのクエリを用いてさらにjumpするための関数として用意した。isearchによってバッファを移動するときに、クエリによっては候補がヒットしすぎるため、C-s
やC-r
を連打することがしばしばあるだろう。その移動時の連打の負担を減らす効果が期待できる。
典型的な使用例としては、C-s
を2,3回叩いて目的地に行かなかったらその時点でisearchを抜けて、サクッとジャンプする感じである。設定例は以下である。
(define-key isearch-mode-map (kbd "C-'") 'ace-isearch-jump-during-isearch)
上記設定ではisearch中にC-'
を押下すると現在のクエリを対象にjumpできる。
ace-isearch-fallback-function
(デフォルト値:helm-swoop-from-isearch
)
こちらの機能も完全におまけである。isearch が失敗し、かつace-isearch-use-fallback-function
がnon-nilのとき、ace-isearch-fallback-function
がfallback関数として呼び出されるという機能である。
例えば(画面外の)文字やクエリをC-s(isearch-forward
)で検索するというときに、実は当該クエリはC-rで後ろ向きに探さないと見つからないという状況で(その場合isearchは失敗する)fallback関数が発動されることにより、素早くアクセス可能といった具合であろうか。
###追記
ace-isearch-use-jump
に新しいオプション項目を追加した。詳細は以下を参考に。
ace-isearch に新オプション項目が追加された話
###追記その2
最近の更新により、avy
もサポートするようにした。
(setq ace-isearch-function 'avy-goto-char)
とすればavy-goto-char
をジャンプの関数として利用できる。
もはや'ace'ではない気もするが。