【Go】OSX / Linux / Windowsに peco を導入

pecoは標準入力をインクリメンタルサーチ可能にして選択した結果を標準出力に返すコマンドです。
OSX10.10.1, CentOS6.6, Ubuntu14.04, Windows8にpecoを入れてみました。

OSX 10.10.1

brewでインストールできます。

$ brew tap peco/peco
$ brew install peco
$ which peco
/usr/local/bin/peco

使ってみます。

$ ls -l | peco
$ ps aux | peco

CentOS 6.6

$ cat /etc/system-release
CentOS release 6.6 (Final)

goの環境がなくて go get できなくても binary を配置すれば良い。
CPUアーキテクチャや最新のversionはここで確認します。

$ wget https://github.com/peco/peco/releases/download/v0.2.11/peco_linux_386.tar.gz
$ tar xvzf peco_linux_386.tar.gz 
$ cd peco_linux_386
$ ln -s peco /usr/local/bin/

Ubuntu 14.04

基本的にcentosと同じですが, binaryではなくてgo getでインストールしてみます。

$ cat /etc/debian_version 
jessie/sid
$ which go
/usr/bin/go

$GOPATH以下にインストールされます。

$ go get github.com/peco/peco/cmd/peco
$ which peco
$GOPATH/bin/peco

Windows8

コマンドプロンプトで使う場合はbinaryを持ってくるのが一番早いです。C:\Windows\System32 にexeを配置します。
pecoを使ったBATファイルの例は探すといくつか見つかります。

cygwin環境にpecoを入れます。
pathが通っていてバージョンも確認できますが,pipeで繋ぐところのI/Oで上手くいっていないのか入力待ち状態になってしまいます。文字コードの違いが原因の可能性もあります。

$ which peco
/usr/bin/peco
$ peco --version
peco: v0.2.11
$ ls -l | peco

.bashrc

いろんな情報を参考にして.bashrcはOSX, Linuxで以下のようにしています。
OSXだけ標準出力に上手くできなかったので結果を ${READLINE_LINE} で即時実行してしまっているので, 実行したいコマンドが見つからない場合は, escしないといけない微妙な感じ。

peco-select-history() {
    declare l=$(HISTTIMEFORMAT= history | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
    # for OSX
    if [ `uname` = "Darwin" ]; then
        ${READLINE_LINE}
    fi
}
bind -x '"\C-r": peco-select-history'

# peco + cd
function pcd {
    local dir="$( find . -maxdepth 1 -type d | sed -e 's;\./;;' | peco )"
    if [ ! -z "$dir" ] ; then
        cd "$dir"
    fi
}

pecoでCtrl + r によるコマンド履歴の検索が快適になりました。