Edited at

Bashでもpeco使いたい

More than 5 years have passed since last update.


はじめに

最近ちまたでは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使いの方よければ参考にしてみてください。