Bashでもpeco使いたい


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

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

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

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

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

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

```bash:端末
$ ls -l | peco
```

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

```bash:端末
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>`に検索キーワードを入力するとできます。

```bash:端末
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
```

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

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

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

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

```bash:.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

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

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

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

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

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

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