pecoを使おう 
2014/11/30 
三宅 英明(mollifier)
自己紹介 
名前: 三宅 英明 
Twitter: @mollifier 
はてなID: mollifier 
神戸のプログラマ
好きなもの 
zsh 
vim 
vimperator
ブログとか 
はてなブログ 
http://mollifier.hatenablog.com/ 
Twitter 
http://twitter.com/mollifier 
Qiita 
http://qiita.com/mollifier
pecoを使おう 
pecoとは 
pecoのインストール 
pecoの基本 
pecoで使う関数を作る
pecoを使おう 
pecoとは 
pecoのインストール 
pecoの基本 
pecoで使う関数を作る
pecoとは 
インクリメンタルに絞り込んで、候補 
から選んでなんかするやつ
pecoとは 
言葉では説明しにくい
pecoとは 
典型的には、コマンドライン履歴か 
ら選んで、それを実行する
pecoとは 
今年はやった
pecoとは 
Anything風インタフェースとか呼ば 
れることもある
pecoとは 
Anything風インタフェースというの 
は、もともとEmacsのやつ 
pecoもそれに似てる
pecoとは 
似てるけど、たぶん元のEmacsのや 
つとはちょっと違う 
なので、「pecoはAnythingですー」 
とか適当に言うと、たぶんEmacs原 
理主義の人に怒られる 
気をつけたほうがいい
pecoとは 
使ってみないとよく分からない 
使ってみましょう
pecoを使おう 
pecoとは 
pecoのインストール 
pecoの基本 
pecoで使う関数を作る
pecoのインストール 
https://github.com/peco/ 
peco/releasesにバイナリがあるの 
で、ダウンロードして好きな場所に 
置く 
実行パーミッションを付ける
pecoのインストール 
安定したバージョンをインストール 
できる 
たぶん一番安心して使える方法 
バージョンアップのときに手動でダ 
ウンロードしないといけないのが欠 
点
pecoのインストール 
Macを使っている場合はHomebrew 
でもインストールできる 
% brew tap peco/peco 
% brew install peco
pecoのインストール 
最新版とは限らない。若干バージョ 
ンが古いこともある 
更新はbrew update pecoででき 
る。楽 
Macでしかできない 
Macの人にはわりとおすすめ
pecoのインストール 
pecoはGoで実装されている 
Goのパッケージシステムを使っても 
インストールできる 
% go getとかする
pecoのインストール 
ソースからコンパイルする 
Goの開発環境をインストールしな 
いといけない 
たぶん、タグが付けられた安定版と 
は限らない 
単に使いたいだけの人にとっては、 
ちょっとやりすぎ
pecoのインストール 
Macの人はbrew 
それ以外の人はバイナリを手動で 
ダウンロード
pecoを使おう 
pecoとは 
pecoのインストール 
pecoの基本 
pecoで使う関数を作る
pecoの基本 
とりあえずpecoを使ってみる
pecoの基本 
% cat /etc/passwd | peco
pecoの基本 
要するに絞り込んで出力してるだけ 
絞り込むときにインクリメンタルに絞 
り込める 
grepを手動でやってる感じ
pecoの基本 
動作自体は非常に単純 
peco単体では役に立たない
pecoの基本 
たぶん意図的に単純にしてる 
単純であるがゆえに、他のコマンド 
と組み合わせやすい 
cutとかsedとかawkとか 
複数の候補から選ばせるときに、 
「選ばせる」という操作だけをpeco 
に任せる感じ
pecoを使おう 
pecoとは 
pecoのインストール 
pecoの基本 
pecoで使う関数を作る
pecoで使う関数を作る 
入力をpecoを絞り込んで出力する 
だけのツール 
他と組み合わせて使う 
「他」の部分を作ってみましょう
pecoで使う関数を作る 
入力をpecoを絞り込んで出力する 
だけのツール 
まず「入力」が必要 
pecoの出力を「どうするか」という 
処理も必要
pecoで使う関数を作る 
典型的な例 
「入力」 = コマンドライン履歴 
「どうするか」 = コマンドとみなして 
そのまま実行する
pecoで使う関数を作る 
雰囲気でいうとこんな感じ 
# コマンドライン履歴をpecoで絞り込む 
# その結果を一旦変数に入れる 
cmd=$(history | peco) 
# それをそのまま実行する 
eval "$cmd"
pecoで使う関数を作る 
一応これでもできる 
function peco-execute-history() { 
local item 
item=$(builtin history -n -r 1 | peco) 
if [[ -z "$item" ]]; then 
return 1 
fi 
eval "$item" 
} 
alias eh=peco-execute-history
pecoで使う関数を作る 
% ehとか打たないとだめで、なん 
かおしゃれじゃない 
特に、いちいちEnterを押さないとい 
けないところがめんどう 
こいつをCtrl+rみたいなキーバイン 
ドで実行したい
pecoで使う関数を作る 
Ctrl+x Ctrl+rで実行する例 
何かのキーバインドで関数を呼び出す 
ときはこう書く 
function peco-execute-history() { 
# この中に処理を書く 
} 
zle -N peco-execute-history 
bindkey '^x^r' peco-execute-history
pecoで使う関数を作る 
Ctrl+x Ctrl+rで実行する例 
function peco-execute-history() { 
local item 
item=$(builtin history -n -r 1 | peco) 
if [[ -z "$item" ]]; then 
return 1 
fi 
BUFFER="$item" 
zle accept-line 
} 
zle -N peco-execute-history 
bindkey '^x^r' peco-execute-history
pecoで使う関数を作る 
BUFFER=”$item”で、今のコマン 
ドラインの内容を置き換える 
zle accept-lineでコマンドラインを 
実行する。つまりEnterを押したのと 
同じ
pecoで使う関数を作る 
注意としては、BUFFER=”$item”とい 
うのはこの形の書き方のときしか使え 
ない 
function peco-execute-history() { 
# この中に処理を書く 
} 
zle -N peco-execute-history 
bindkey '^x^r' peco-execute-history
pecoで使う関数を作る 
zle -Nとかいうのは、コマンドライン 
を操作する処理を自分で作っている 
イメージ 
「コマンドラインを操作する処理」と 
いうのは、Ctrl+fで右に動く、とかそ 
ういうの 
zshではそういうのを自分で作れる
pecoで使う関数を作る 
さらにその中では現在のコマンドラ 
インとかを変更できる 
BUFFERは現在のコマンドラインの 
内容を表す変数で、読み書き両方 
可能 
こいつに代入して、実行してる
pecoで使う関数を作る 
「手でコマンドラインを入力して」 
「Enterを押す」という操作をzshの 
シェルスクリプトから操作できる 
peco自体は他のシェルでも使える 
けど、zshはこのへんが柔軟なので 
pecoと組み合わせて使いやすい
pecoで使う関数を作る 
さっきと同じだけど、コマンドラインに 
代入するだけの例 
function peco-put-history() { 
local item 
item=$(builtin history -n -r 1 | peco) 
if [[ -z "$item" ]]; then 
return 1 
fi 
BUFFER="$item" 
CURSOR=$#BUFFER 
} 
zle -N peco-put-history 
bindkey '^x^p' peco-put-history
pecoで使う関数を作る 
さっきのzle accept-line(Enterを 
押す)をなくしただけ 
これも便利
ちょっと余談 
「履歴から選んで実行する」はCtrl 
+x Ctrl+r 
「履歴から選んでコマンドラインに 
挿入する」はCtrl+x Ctrl+p 
別のキーバインドに割り当ててる
ちょっと余談 
本当は表示される候補を見ながら 
「すぐ実行するのか」「コマンドライ 
ンに挿入するのか」を選びたい
ちょっと余談 
Ctrl+x Ctrl+rで起動 
すぐに実行したいときはEnterで決 
定 
コマンドラインに挿入したいときは 
Ctrl+oで決定 
とか
ちょっと余談 
すぐに実行すればよいのか、コマン 
ドラインに挿入したいのか(つまり、 
ちょっと変更したいのか)は、候補を 
見ないとよく分からない
ちょっと余談 
pecoの場合は 
「1. 候補一覧を作る」 
「2. 候補を選ぶ」 
「3. 選んだ候補に対して動作を行 
う」 
の3つが完全に分かれてる
ちょっと余談 
選んだ結果を文字列として出力して 
るだけ 
「それに対してどういう動作を行う 
か」という情報はpecoからは送れ 
ない
ちょっと余談 
(確か)EmacsのAnythingはこのへ 
んがちゃんとしてる 
さっき言った3つが分かれていない 
から 
「何を選んだのか」と「どういう動作 
を行いたいか」の両方が次に伝わっ 
ている
ちょっと余談 
でもpecoでは分かれているから、他 
と組み合わせるのが簡単 
peco以外の部分は一般的なシェ 
ルスクリプトで書ける
ちょっと余談 
どっちが良いかは一概に言えない 
でも、pecoの方がシンプルでよさそ 
う
ちょっと余談 
余談終わり
pecoで使う関数を作る 
ここまででできたこと 
「履歴から選んで実行する」 
「履歴から選んでコマンドラインに 
挿入する」
pecoで使う関数を作る 
他には? 
もちろん工夫次第でいろいろできる
pecoで使う関数を作る 
工夫次第? 
工夫次第 = シェルスクリプトでがん 
ばれば 
がんばりたくない
pecoで使う関数を作る 
シェルスクリプトが苦手な人はどう 
したらええの? 
そういう人向けのやつがあります
pecoで使う関数を作る 
続きは次の発表で
pecoを使おう 
ありがとうございました

pecoを使おう