ライフチェンジングなpercolとautojumpの紹介

Posted on | 1290 words | ~3mins
tool

ご存知な方も多いかと思いますが,percol と autojump はライフチェンジングなシロモノですよという話です.

percol

percolは,標準入力で与えたものを行単位でインタラクティブに絞り込むことができるコマンドです. 簡単に言うと emacs の anything.el や vim の unite.vim のコマンドライン版といった感じ.

README.mdの通りですが,以下のようにすれば導入できます.

$ git clone git://github.com/mooz/percol.git
$ cd percol

# python setup.py install

ファイルを指定してやるとそのファイルを行単位でインタラクティブに絞り込めます.

\$ percol /var/log/syslog

パイプを使うと他のコマンドの実行結果も絞り込めます.

\$ ps aux | percol

アイデアしだいで色々な使い方ができますね!

zsh のコマンド履歴を percol で絞り込むの超オススメです(というか僕は現状これにしか使っていない). 以下のように.zshrcに追記します.

function exists { which \$1 &> /dev/null }

if exists percol; then
function percol_select_history() {
local tac
exists gtac && tac="gtac" || { exists tac && tac="tac" || { tac="tail -r" } }
BUFFER=$(history -n 1 | eval $tac | percol --query "$LBUFFER")
        CURSOR=$#BUFFER # move cursor
zle -R -c # refresh
}

    zle -N percol_select_history
    bindkey '^R' percol_select_history

fi

するとCtrl+Rでのコマンド履歴検索が percol のインターフェースで行えます. たまーに使うコマンドとかさっと叩けます. 便利!!✌(‘ω’✌ )三 ✌(‘ω’)✌ 三( ✌’ω’)✌

[追記 (2014-05-13)]

oh-my-zsh を使っていると勝手に alias history='fc -l 1' されてしまってこのコードが動かないようです。 その場合は L7 を BUFFER=$(fc -l -n 1 | eval $tac | percol --query "$LBUFFER") とすると正常に動作します。 というか history って fc -l の 単なる alias だったんですね!学びがある(かなり)

\$ man zshbuiltins

...snip...

    history
        Same as fc -l.

Akihiro HARAI さんコメントしていただきありがとうございました!

[ここまで追記]

ちなみに以下のように$HOME/.percol.d/rc.pyに書いておくと Emacs ライクなショートカットが使えてより便利です.

# Emacs like

percol.import_keymap({
"C-h" : lambda percol: percol.command.delete_backward_char(),
"C-d" : lambda percol: percol.command.delete_forward_char(),
"C-k" : lambda percol: percol.command.kill_end_of_line(),
"C-y" : lambda percol: percol.command.yank(),
"C-a" : lambda percol: percol.command.beginning_of_line(),
"C-e" : lambda percol: percol.command.end_of_line(),
"C-b" : lambda percol: percol.command.backward_char(),
"C-f" : lambda percol: percol.command.forward_char(),
"C-n" : lambda percol: percol.command.select_next(),
"C-p" : lambda percol: percol.command.select_previous(),
"C-v" : lambda percol: percol.command.select_next_page(),
"M-v" : lambda percol: percol.command.select_previous_page(),
"M-<" : lambda percol: percol.command.select_top(),
"M->" : lambda percol: percol.command.select_bottom(),
"C-m" : lambda percol: percol.finish(),
"C-j" : lambda percol: percol.finish(),
"C-g" : lambda percol: percol.cancel(),
})

autojump

autojumpは,cdで移動したディレクトリを記録して,カレントディレクトリに関係なく過去に移動したディレクトリに移動できるコマンドです.

README.mdを参考に,以下のようにすれば導入できます.

$ git clone git://github.com/joelthelion/autojump.git
$ cd autojump

# ./install.py

Mac なら Homebrew でもインストール可能です.

\$ brew install autojump

.zshrcに以下のように書いておけば<TAB>で補完が効くようになります.

[[ -s /usr/share/autojump/autojump.zsh ]] && . /usr/share/autojump/autojump.zsh

# for homebrew

[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh

使い方

インストールすると,cdで移動したディレクトリが記録されていきます. 導入後に移動したディレクトリであれば,jコマンドで素早く移動できます. 例えば Terminal 上で以下のように入力して<TAB>を押すと,foo が含まれる移動したことがあるディレクトリ一覧が表示され,<ENTER>でそのディレクトリに移動します.

\$ j foo

カレントディレクトリに関係なく移動できるのが最高です. 便利!!✌(‘ω’✌ )三 ✌(‘ω’)✌ 三( ✌’ω’)✌

まとめ

一年以上使ってますが percol も autojump もチョー便利ですね.オススメです.