Zshのcdrとpercolで最近移動したディレクトリにAnythingライクに移動する

Zsh cdr with percol

zawというAnythingライクに色々できるZsh widgetがあり、既にcdr用のスクリプトも用意されているのですが、残念ながらエラーが出て動きません。Zsh 4.3で紹介されているサイトが多いので、Zsh 5.0から動かなくなったのかもしれません。

とりあえずZsh 5.0でも、問題の行##<-> ##のスペースをエスケープすれば動くようになるのですが、ディレクトリパスにスペースを含んでいると、分割されて別のディレクトリ扱いになってしまう問題が残ります。

それならばpercolでやってしまおう、ということでwidgetを作ってみました。

前準備

percolのインストールと設定は「percol 入れて zsh と組み合わせたら超便利 - GitHub」を参照してください。

cdrの準備ができていない場合は「zshのchpwdrecentdirsでよく行くディレクトリに移動する - Qiita [キータ]」を参照してください。

Zshへwidget追加

準備ができたら以下を.zshrc等からロードするように定義してください。

### search a destination from cdr list
function percol-get-destination-from-cdr() {
    cdr -l | \
        sed -e 's/^[[:digit:]]*[[:blank:]]*//' | \
        percol --match-method migemo --query "$LBUFFER"
}

### search a destination from cdr list and cd the destination
function percol-cdr() {
    local destination="$(percol-get-destination-from-cdr)"
    if [ -n "$destination" ]; then
        BUFFER="cd $destination"
        zle accept-line
    else
        zle reset-prompt
    fi
}
zle -N percol-cdr
bindkey '^xb' percol-cdr

bindkeyは適宜好きなキーバインドに変更してください。上記の場合はC-x bで発動します。

zaw版と違ってmigemoにも対応しているので、日本語のディレクトリ名もIMEオフのまま検索できたりします。(あまり日本語のディレクトリ名自体使わないかもしれないけど)

これでzコマンドがいらなくなるかな。