Help us understand the problem. What is going on with this article?

pecoの基礎の基礎

More than 5 years have passed since last update.

「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や他のシェルでコマンドを作ることも当然ながら容易にできます。

xtetsuji
北海道出身で東京都在住の30代男性。主にPerlプログラマー、ときどき数学屋さん。Perl入学式やPerlBeginnersなど、コミュニティ活動も多数。古典派周辺のクラシック音楽やお洒落カフェを好んでいます。あと、路線バスも好き。
http://post.tetsuji.jp/
gaiax
人と人をつなげる Empowering the people to connect.
http://www.gaiax.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした