pecoでコマンドラインからファイルやディレクトリを開いたりしてみる
すこし乗り遅れた感じですが、最近話題のpecoをさわってみました。 pecoがなんなのかは以下のページなどを参照してください。
このツールはGoで書かれていて、しかも各種プラットフォーム向けにバイナリファイルを配布しているので、パスの通ったディレクトリにそのバイナリファイルをおくだけで動作するという手軽さがいいです。導入が楽なのは個人的にすごく重要なので。
機能をざっくりいうと、コマンド標準出力の行に対して選択機能のインターフェースを差し込めるというモノです。 文字にすると簡素なものですが、使ってみるとものすごく応用性の高いツールです。これホントすげー。でもこのすごさが言葉で説明できん。ツール自体のシンプルさとそれ故の応用性の高さが見事で、なんというか美しいのです。たぶんあれだ、確かUnixの哲学に「パイプやリダイレクトでつなげられるように、プログラムは最小の単位で設計すべし」みたいなものがあったハズで、それをドンピシャで体現しているんじゃないかと。pecoはpercolという同様のツールをもとに作られているとのことですが、この仕組みを考えた人は相当頭いいなーと、思わせてくれる逸品です。
さて、調べてみたらみんな自分の目的にあわせて、いろいろラッパーの関数やエイリアスを書いたりしてるみたいなので、私もちょこっと書いてみました。なおMacの環境用です。
function peco-cd() { local var local dir if [ ! -t 0 ]; then var=$(cat -) dir=$(echo -n $var | peco) else return 1 fi if [ -d "$dir" ]; then cd "$dir" else echo "'$dir' was not directory." >&2 return 1 fi }
これはcd
で移動したいディレクトリをfind
コマンドなどで検索して、検索結果からpecoで選択、移動する、というのをやります。以下のように使っています。
find . | peco-cd
同様にfind
コマンドで探したファイルを開くような関数も書きました。
function peco-open() { local var local file local command="open" if [ ! -t 0 ]; then var=$(cat -) file=$(echo -n $var | peco) else return 1 fi if [ -n "$1" ]; then command="$1" fi if [ -e "$file" ]; then eval "$command $file" else echo "Could not open '$file'." >&2 return 1 fi }
これは
find . | peco-open
のように使います。またpeco-open
の第二引数にコマンドを指定すれば、そのコマンドで選択したファイルを開きます。
たとえば、テキストファイルをコマンドラインで検索して、SublimeTextで開くには以下のようにやります。
find . | peco-open subl
これでもはや、Finderでちまちまディレクトリをおりていく必要はなくなったのでした。(^O^)