Bashでもpeco使いたい


はじめに

最近ちまたではpecoなるものが流行っているようですね。
percolとか類似してるものもあるようですが、ナウでヤングでエンジニアになるために導入してみることにしました。
しかし、pecoの導入は何やらめんどくさそうな感じ...。
goも入れてなけりゃシェルもzshじゃないです。

でもどうせならbashでもpecoを導入してみたいのでやってみました。

pecoの導入

goをインストールしなくてもならないと思っていましたが、入れなくてもpecoは導入出来るようです。
以下の記事を参考にさせて頂きました。ありがとうございます。

例えば、pecoをビルドしない
http://qiita.com/lestrrat/items/de8565fe32864f76ac19

記事にも書いてありましたが、pecoを使うだけならgoはインストールする必要ないんですね。めんどくさそうだったので良かったです。

ってかpecoって何できるの?

実はpeco入れるとかいっておきながらどういう動作が出来るかちょっとよくわかってなかった部分もありました。なので導入後ちょっとお遊び。
参考記事にも載ってましたがこんなかんじに使います。

端末
$ ls -l | peco

こんな風にパイプで渡してみます。するとこんな感じ。

端末
QUERY>                                        IgnoreCase [1/1]                                                                             
total 32                                                                                                                                                      
drwxr-xr-x    2 user  staff     68  5 16  2013 Applications/
drwx------+   8 user  staff    272 10 11 16:40 Desktop/
drwx------+  29 user  staff    986 10  8 16:10 Documents/
drwx------+ 640 user  staff  21760 10 11 15:54 Downloads/
drwx------@  24 user  staff    816 10  8 23:49 Dropbox/
drwx------@  67 user  staff   2278  9 21 01:16 Library/
drwx------+  12 user  staff    408  9 30 17:06 Movies/
drwx------+   6 user  staff    204  6  3 16:13 Music/
drwx------+  65 user  staff   2210  8  7 23:41 Pictures/
drwxr-xr-x+   5 user  staff    170  5 16  2013 Public/
drwxr-xr-x    6 user  staff    204  2 10  2014 VirtualBox VMs/
-rw-rw-rw-    1 user  staff   8192  5 16  2013 digi_app.db
drwxr-xr-x   11 user  staff    374 10 11 23:04 dotfiles/
drwxr-xr-x    7 user  staff    238  8  6  2013 git_box/

ls -lの結果に対してインクリメントサーチをかけることが出来ます。
サーチはQUERY>に検索キーワードを入力するとできます。

端末
QUERY> tmux                                                   IgnoreCase [1/1]
-rw-r--r--    1 user  staff     60 10  6 19:15 tmux-client-28489.log                                                                                 
-rw-r--r--    1 user  staff     60 10  6 19:15 tmux-client-28547.log

サーチはこんな感じに。選択すると標準出力に出力されます。

端末
$ ls -l | peco
-rw-r--r--    1 user  staff     60 10  6 19:15 tmux-client-28489.log

これを上手く応用すると便利になります。

peco-historyの実装

とりあえずpecoを使ってhistoryを便利に使えるようにしたいと思います。
いろいろ記事を見て.bashrcをいじっていましたが、自分好みに動いてくれず...。
最終的にはこのようになりました。

.bashrc
#pecoの設定
export HISTCONTROL="ignoredups"
peco-history() {
    local NUM=$(history | wc -l)
    local FIRST=$((-1*(NUM-1)))

    if [ $FIRST -eq 0 ] ; then
        history -d $((HISTCMD-1))
        echo "No history" >&2
        return
    fi  

    local CMD=$(fc -l $FIRST | sort -k 2 -k 1nr | uniq -f 1 | sort -nr | sed -E 's/^[0-9]+[[:blank:]]+//' | peco | head -n 1)

    if [ -n "$CMD" ] ; then
        history -s $CMD

        if type osascript > /dev/null 2>&1 ; then
            (osascript -e 'tell application "System Events" to keystroke (ASCII character 30)' &)
        fi  
    else
        history -d $((HISTCMD-1))
    fi  
}
bind -x '"\C-r":peco-history'

コードはこちらの記事を参考にさせて頂きました。ありがとうございます。

Mac で bash でも peco-history を使いたい
http://qiita.com/yungsang/items/09890a06d204bf398eea

こちらの記事のコードでは、

.bashrc
bind '"\C-x\C-r":"peco-history\n"'

というキーバインドを設定していましたが、自分は

.bashrc
bind -x '"\C-r":peco-history'

こういうふうに変更しました。
また、その他の記事も参考にさせて頂いたのですが、最終的にコマンドラインに候補を出力するのみにしました。
理想とは若干違いますがこれでhistoryを便利に活用出来るようになりました。

おわりに

私はbashを使っていますがzsh使いが周りに多くなってきました。
もうちょっとbash使って不便になったらzshにしようかなーと思ってます。
みなさんはどうでしょうか?
bash使いの方よければ参考にしてみてください。