「履歴を絞りこみながら正規表現で検索する。」を使ってみた

deruiの日記

id:deruiによるzshの履歴をインクリメンタルに正規表現検索するzshスクリプト。インクリメンタル検索だの絞り込み検索だのと聞いてすぐに飛び付くのがanything脳のサガというもの。
ナイスアイデア!!キーをおすたびに勝手に絞り込まれていくのがanything.elっぽい。
しかし、キーを押すたびに反応してしまうため重すぎるのが唯一の問題である。重さを解消する方法としては以下が考えられる。

  • キーを押して0.3秒間応答がなければ検索処理を開始する(anything方式)
  • 前回の検索処理の結果から絞り込む(QuickSilver方式)
  • .zsh_historyを高速に履歴検索する専用プログラムを作成し、パイプとかで通信する(コマンド起動がオーバーヘッドの場合)
$ wc ~/.zsh_history 
  85970  342643 3865720 /m/home/rubikitch/.zsh_history

anything脳としては「検索クエリに『foo bar』を入れた場合、fooとbarを含む行を出力する」機能が是非とも欲しい。anything-match-plugin方式の絞り込みだ。これは正規表現をいぢるなりさらにgrepを呼ぶなりすれば可能な気がする。

任意の位置でA〜Pを押すと(わざと大文字のみにしています)、その位置の履歴が入力される、という寸法です。

これは名案!本家anythingに取り込んでもいいと思った。候補選択をCtrl+番号で行えるようにする機能*1は昔からあったのだが、押しづらいため使っていなかった。しかし、ホームポジションにある文字を大文字で打つのは楽なのでいいと思う。

anything.elではこんな感じ

Emacs界ではanything-complete-shell-historyコマンドが該当する挙動である。依存するEmacs Lispが多いが、これで試すことができる。

M-x install-elisp-from-emacswiki shell-history.el
M-x install-elisp-from-emacswiki anything.el
M-x install-elisp-from-emacswiki anything-config.el
M-x install-elisp-from-emacswiki anything-match-plugin.el
M-x install-elisp-from-emacswiki anything-complete.el

で、.emacsに加える設定はこの1行。

(require 'anything-complete)

zshがanythingになってくれたらいいなーとだいぶ前から妄想していたのだが、件のスクリプトが光明を与えてくれたと思う。
当面、履歴絞り込み検索が必要になったら edit-command-line でemacs(gnuclient or emacsclient)を呼んで anything-complete-shell-history を呼ぶことにする。

autoload -U edit-command-line
zle -N edit-command-line
bindkey "^O" edit-command-line

とにかく、入力に関しては一旦Emacsに入ってしまえば無敵だ!!

*1:anything-enable-digit-shortcutsをtにすればいい。