percol を使って zsh のディレクトリスタックにお手軽にアクセスする

zsh には cd -[tab] などでディレクトリスタックにアクセスする機能があり、setopt auto_pushd と併用すると幸せになれるのは有名かと思います。


しかし、ディレクトリスタックの数が多くなってくると、スタックの番号を指定するのが億劫になってきます。そこで percol*1 を併用し、ディレクトリスタックへのアクセスをお手軽にする方法を考えてみます。
少し調べてみたところ、ディレクトリスタックを標準出力に表示するには、シェルの組み込みコマンド dirs を使えばよいことが分かりました。-p オプションでディレクトリスタックを行区切りに、 -l オプションでフルパス表示にしてくれます。これを踏まえて、以下のようなシェルスクリプトを .zshrc に書き足しましょう。キーバインドはお好みで変更してください。

function percol_select_dirstack_entry() {
    BUFFER=$(dirs -pl | percol --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle -R -c
}
zle -N percol_select_dirstack_entry
bindkey '^K' percol_select_dirstack_entry

これで percol による絞り込み機能の恩恵を受けられるようになります。zsh の場合、$ cd [path] としなくてもパス名だけで cd してくれますので、percol で対象を決定した後は Enter キーを連打するだけで良いです。

もう一歩前へ

さらに、ディレクトリスタックを history ファイルなどに吐き出すようにしておけば、不意に C-d を押しすぎてターミナルを閉じてしまっても安心ですね。これを実現するには http://sanrinsha.lolipop.jp/blog/2012/02/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%92%E7%AB%AF%E6%9C%AB%E9%96%93%E3%81%A7%E5%85%B1%E6%9C%89%E3%81%97%E3%81%9F%E3%82%8A%E3%80%81%E4%BF%9D.html などを参照すると良いでしょう。

*1:percol についてご存知ない方は anything 的な絞りこみコマンド percol の紹介 - 備忘録 などをお読み下さい。