読者です 読者をやめる 読者になる 読者になる

Slip Ahead Logging

It's not your fault at all.

percol で z / autojump のようにディレクトリ高速ジャンプ

zsh の z / autojmp が話題になっているようです.これら二つのプラグインは実のところ試したことがないのですが「一度でも cd したことのあるディレクトリに効率よく cd する」という目的で作られたツールであると,理解しています.

さて,私も先の二つではありませんが,拙作の percol を使って「一度でも cd したことのあるディレクトリに効率よく cd する」ということをしていたので,ここぞとばかりに設定を共有しておこうと思います.

percol

percol はコマンドラインで手軽に anything.el / helm.el 的な汎用インタフェースを使いたい,という要求により開発をはじめたツールです.id:kbkbkbkb1 さんによる次の紹介文がわかりやすいでしょう.

percol は入力の1行を1候補として,部分一致かつ AND 検索で絞り込みし,選択した候補を出力するコマンドです.端的に言えば Emacsanything.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 はさらに便利であったりするのかもしれません.機会を見てこれらも試してみようと考えています.