zaw-cdrで helm.el(anything.el)っぽくにディレクトリ移動をする

この記事は zsh advent calendar 2012の 19日目の記事です。

zaw-cdrとは

zshの 4.3.15に導入された cdrという最近いたディレクトリに移動する
コマンドの zawインタフェースです。これで最近いたディレクトリに超絶楽に
移動することができます。私はこれを導入して、pushdとか autopushdの類を
利用するのをやめました。人にもよるかと思いますが、ディレクトリ移動の
多くは過去に移動した場所への移動になると思うので、多くの人にとって
役立つのではないかと思います。


使うのにはいくらか慣れが必要ですが、普段から helm(anything),
unite(Vimは使えないので詳しくわからないですが、たぶん似ていると思います)を
使っている人であれば難なく導入することができると思います。

メリット

目的のもの絞り込みが簡単

ディレクトリパスの途中だけでもわかっていれば絞り込むことができるので
楽に目的のものを探すことができます。とりあえず文字を打ってから詳細を
思い出すという流れで絞り込めるので、余計なことに頭を使う頻度が減ります。

普段の作業がもっさりすることがない

私は職業柄大体 Linux, *BSDカーネルの巨大なソースツリーの中を移動して
いるんですが、常時補完のための情報を収集するような類似のプラグインの場合、
利用時が常に重くなってしまって利用を諦めていました。zawはその手のものと
異なり、使いたいときに絞り込むことで目的を達成するものなので、普段の
作業が重くなってしまうこともありません。

インストール

githubから cloneしてください

  % mkdir -p ~/.zsh
  % cd ~/.zsh
  % git clone git://github.com/zsh-users/zaw.git

設定

.zshrc等の設定ファイルに以下を追加します。

source ~/.zsh/zaw/zaw.zsh
bindkey '^[@' zaw-cdr # 私は M-@にバインドしています

イメージ

zaw-cdrを起動すると以下のような絞り込みモードになります。


あとは検索ワードをスペース区切りで入力することで候補を絞り込めます。

おまけ

zawではプラグインを書くことができます。zawの sourcesディレクトリに
プラグインを追加することで利用することができます。


以下に拙作の gitリポジトリ内のディレクトリに移動するための sourceを
示します。自分で作っといてあれですが、なかなか便利です。

#
# zaw-src-gitdir
#
# zaw source for git command
#

function zaw-src-gitdir () {
    _dir=$(git rev-parse --show-cdup 2>/dev/null)
    if [ $? -eq 0 ]
    then
        candidates=( $(git ls-files ${_dir} | perl -MFile::Basename -nle \
                       '$a{dirname $_}++; END{delete $a{"."}; print for sort keys %a}') )
    fi

    actions=("zaw-src-gitdir-cd")
    act_descriptions=("change directory in git repos")
}

function zaw-src-gitdir-cd () {
    BUFFER="cd $1"
    zle accept-line
}

zaw-register-src -n gitdir zaw-src-gitdir
設定
bindkey '^[#' zaw-gitdir # M-#にバインド
イメージ

おわりに

zaw-cdrについて紹介しました。
明日は @さんの担当です。お楽しみに。