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

Comments

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

percol

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

導入方法

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

1
2
3
$ git clone git://github.com/mooz/percol.git
$ cd percol
# python setup.py install

簡単な使い方

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

1
$ percol /var/log/syslog

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

1
$ ps aux | percol

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

オススメ利用法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 だったんですね!学びがある(かなり)

1
2
3
4
5
6
$ man zshbuiltins

...snip...

    history
        Same as fc -l.

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

[ここまで追記]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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を参考に,以下のようにすれば導入できます.

1
2
3
$ git clone git://github.com/joelthelion/autojump.git
$ cd autojump
# ./install.py

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

1
$ brew install autojump

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

1
2
3
4
[[ -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>でそのディレクトリに移動します.

1
$ j foo

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

まとめ

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

このエントリーをはてなブックマークに追加

Comments

unite-autojumpをつくった 今回のISUCON3本戦で我々は,いや,今回も...くっ...なんの成果も!!得られませんでした!! #isucon