percol で z / autojump のようにディレクトリ高速ジャンプ
zsh の z / autojmp が話題になっているようです.これら二つのプラグインは実のところ試したことがないのですが「一度でも cd したことのあるディレクトリに効率よく cd する」という目的で作られたツールであると,理解しています.
さて,私も先の二つではありませんが,拙作の percol を使って「一度でも cd したことのあるディレクトリに効率よく cd する」ということをしていたので,ここぞとばかりに設定を共有しておこうと思います.
percol
percol はコマンドラインで手軽に anything.el / helm.el 的な汎用インタフェースを使いたい,という要求により開発をはじめたツールです.id:kbkbkbkb1 さんによる次の紹介文がわかりやすいでしょう.
percol は入力の1行を1候補として,部分一致かつ AND 検索で絞り込みし,選択した候補を出力するコマンドです.端的に言えば Emacs の anything.el のコマンド版です.
http://d.hatena.ne.jp/kbkbkbkb1/20120429/1335835500
さまざまな方々が紹介記事を書いてくださっているので,そちらを読んで頂くのが良いでしょう.
設定
さて,今回のテーマである「percol で一度でも cd したことのあるディレクトリに効率よく cd する」設定を以下に掲載します.
# {{{ # cd 履歴を記録 typeset -U chpwd_functions CD_HISTORY_FILE=${HOME}/.cd_history_file # cd 履歴の記録先ファイル function chpwd_record_history() { echo $PWD >> ${CD_HISTORY_FILE} } chpwd_functions=($chpwd_functions chpwd_record_history) # percol を使って cd 履歴の中からディレクトリを選択 # 過去の訪問回数が多いほど選択候補の上に来る function percol_get_destination_from_history() { sort ${CD_HISTORY_FILE} | uniq -c | sort -r | \ sed -e 's/^[ ]*[0-9]*[ ]*//' | \ sed -e s"/^${HOME//\//\\/}/~/" | \ percol | xargs echo } # percol を使って cd 履歴の中からディレクトリを選択し cd するウィジェット function percol_cd_history() { local destination=$(percol_get_destination_from_history) [ -n $destination ] && cd ${destination/#\~/${HOME}} zle reset-prompt } zle -N percol_cd_history # percol を使って cd 履歴の中からディレクトリを選択し,現在のカーソル位置に挿入するウィジェット function percol_insert_history() { local destination=$(percol_get_destination_from_history) if [ $? -eq 0 ]; then local new_left="${LBUFFER} ${destination} " BUFFER=${new_left}${RBUFFER} CURSOR=${#new_left} fi zle reset-prompt } zle -N percol_insert_history # }}} # C-x ; でディレクトリに cd # C-x i でディレクトリを挿入 bindkey '^x;' percol_cd_history bindkey '^xi' percol_insert_history # auto-fu.zsh を使っているのなら以下も bindkey -M afu '^x;' percol_cd_history bindkey -M afu '^xi' percol_insert_history
この設定により,
- percol_cd_history
- percol_insert_history
という二つのコマンド (zle ウィジェット, つまりキーバインド割り当てが可能) が追加されます.上の設定では,一番下の部分でそれぞれのコマンドを C-x ; と C-x i に割り当てています.必要に応じて変更してください.
この設定の特長は以下のようなところでしょうか.
- percol のマッチング機能が使える
- cd 回数も記録するので,よく訪問するディレクトリにジャンプしやすい
- ジャンプだけでなく挿入もできる
- コマンドの引数入力時などに役立つ
${HOME}/.cd_history_file
に独自に cd 履歴を記録するので,設定を .zshrc に張り付けた当初はほとんど役に立ちません.cd を繰り返すことで便利になってきます.よく cd するディレクトリをあらかじめこのファイルに追加してしまう,というのも一つの手でしょう.1行1パスの単純なファイルなので,インポートも容易かと思います.
個人的には満足してしまっているのですが,z / autojump はさらに便利であったりするのかもしれません.機会を見てこれらも試してみようと考えています.