「pecoってツールらしきものが流行っている」と思いつつ、導入とか難しそうと思って後回しにしていたんですが、気がついたら自分の手元のbash設定ファイルにpecoを使う関数が定義されていたので、改めて初歩からやってみました。
説明に使用しているシェルはお馴染みのbashです。
#pecoとは
とてもシンプルなツールで 「標準入力から受けた行データをインクリメンタルサーチして、選択した行を標準出力に返す」 コマンドです。
シンプルゆえに様々な組み合わせで効果を発揮します。あらゆる場面での選択肢を標準入力に渡して、選択された結果を標準出力から受け取って加工してコマンド実行をする、というのが基本的な流れ。
説明じゃ伝わらないので実例を体験したほうが早いかも。
#peco のインストール
pecoで検索すると「pecoはGoでできている」とか出てきて「Goってなんぞや」とかなるのですが、 pecoが何で作られているかとか使用者には関係ない わけで、以下のページを見てインストールしましょう。
Macのhomebrew環境を使っている人は brew tap peco/peco
して brew install peco
するだけなのとても楽だったのが、2015年2月にはhomebrewの公式に入ったので、tapの必要は無くなりました。
#pecoの初歩
peco
コマンドが使えるようになったら、あとは使ってみましょう。
検索して出てきたサイトのコマンドを ~/.bashrc
などに書いて使うよりもまず、自分で実例を体験してみたほうが応用がきいて良いです。
ホームディレクトリかどこかのディレクトリで以下のコマンドをうちます.
$ ls -l
よく知られたファイル一覧のコマンドです。ファイル一覧がたくさん出てきた方が後で面白いです。
これの出力をパイプで peco
に渡すと…
$ ls -l | peco
なんとカーソル上下で行選択ができるようになります。そしてキーボードを打つとインクリメンタルサーチ (打っている途中で検索が進んで絞り込まれる) も可能です。しかも高速に。
どこかの行で Enter を打ってみましょう。コマンド待ち状態に戻ったうえで、peco
によって Enter を打った行が標準出力に表示されました。
コマンドの標準出力を取り出して変数や別のコマンド入力に渡すことができれば便利そうですよね。そう思えたら次の一歩です。
#pecoワンライナー
bash ではコマンドの結果を標準出力から別の場所に取り出したりするには $(command)
といった記法を使います。
$ expr 1 + 2
3
この出力を変数に格納して出力するには以下のようにします。
$ answer=$( expr 1 + 2 )
$ echo "いちたすには $answer です"
この要領で peco が使えます。
現在のディレクトリにあるサブディレクトリ一覧を表示 (ls -1d */
) して、それをpecoで選択して移動するには、以下の一行になります。
$ cd "$( ls -1d */ | peco )"
$(...)
自体をダブルクォートでくくっているのは、空白が入ったディレクトリ対策です。ls -1d */ | peco
でpecoに入って、選択されたディレクトリをcd
コマンドに渡しています。
ね、簡単でしょう?
#pecoを使ったコマンドをbashの関数にする
いちいちコレを打つのも面倒なので、~/.bashrc
などに関数として書いておきましょう。
# ~/.bashrc などで
function peco-lscd {
cd "$( ls -1d */ | peco )"
}
もし即時反映したい場合は source ~/.bashrc
などで。
これで peco-lscd
と打つと、先ほどのコマンドが実行されます。
実はこれ、peco で入力をキャンセルしたとき (Escを押したときとか) に結果がカラになって cd
コマンドに何も渡らず、結果的に意図せずホームディレクトリに戻ってしまいます。これの対処も入れましょう。
# ~/.bashrc などで
function peco-lscd {
local dir="$( ls -1d */ | peco )"
if [ ! -z "$dir" ] ; then
cd "$dir"
fi
}
local
でローカル変数宣言をしたり、if
文や test
コマンド ([ ... ]
) などを使って少し拡張性に気を使っています。
このあたりまで来ると、bashのシェルスクリプトがわかるかといった話になってくるので、もし知らない方で興味のある方は調べてみるとよいでしょう。
このコマンドだと「末尾にスラッシュが2つつく」とか「ドットから始まるディレクトリがリストアップされない」といった気になる点もあります。知っているコマンドを使って解決していくと良いでしょう。
function peco-lscd {
local dir="$( find . -maxdepth 1 -type d | sed -e 's;\./;;' | peco )"
if [ ! -z "$dir" ] ; then
cd "$dir"
fi
}
関数定義を消したい場合は、そのbashを終了させて立ち上げ直すか、unset -f peco-lscd
と打てばよいです。
#みんなの応用例を探して拝借する
あとはシェルスクリプト力を発揮して自分でpeco活用コマンドを作るなり、他の応用例を拝借するなりしてpecoを活用していくだけです。
Qiitaにはpecoタグもあって、結構な人による応用例があります。また、新しい(2014年)ツールですので検索しても古い情報にはあたらない(2014年の今のところは)という点もあるので、Googleなどで検索しても使える情報がいっぱい出てくるのが特徴です。
検索してみるとzshとの応用例が多く見つかりますが、単純なコマンドなのでbashや他のシェルでコマンドを作ることも当然ながら容易にできます。