オープンソースこねこね

Webプログラミングなどについてあれこれ。

pecoをランチャーのようにして使う

前回に引き続き、pecoが大変気に入ったので、その後もいろいろネットで情報さがしたりしてました。それで

peco/percolでCUIなスニペットツールを作ってみる

の記事を見て同じこと導入してみました。いやはや便利。元記事に感謝。ついでに多少カスタマイズして、スニペットの先頭にラベルをつけてみました。

手順

zshの場合は以下のような関数を.zshrcなどに記述しておく

function peco-snippets() {

    local line
    local snippet

    if [ ! -e ~/.snippets ]; then
        echo "~/.snippets is not found." >&2
        return 1
    fi

    line=$(grep -v "^#" ~/.snippets | peco --query "$LBUFFER")
    if [ -z "$line" ]; then
        return 1
    fi
    
    snippet=$(echo "$line" | sed "s/^\[[^]]*\] *//g")
    if [ -z "$snippet" ]; then
        return 1
    fi

    BUFFER=$snippet
    zle clear-screen
}

zle -N peco-snippets
bindkey '^x^x' peco-snippets

bashの場合は以下のような関数を.bashrcなどに記述

function peco-snippets() {

    local line
    local snippet

    if [ ! -e ~/.snippets ]; then
        echo "~/.snippets is not found." >&2
        return 1
    fi

    line=$(grep -v "^#" ~/.snippets | peco --query "$READLINE_LINE")
    if [ -z "$line" ]; then
        return 1
    fi
    
    snippet=$(echo "$line" | sed "s/^\[[^]]*\] *//g")
    if [ -z "$snippet" ]; then
        return 1
    fi
    READLINE_LINE="$snippet"
    READLINE_POINT=${#READLINE_LINE}
    clear
}

bind -x '"\C-x\C-x":peco-snippets'

あとはスニペットファイル.snippet[***]の形式でラベルをつけたコマンドを記述しておく。

# SSH
[ローカル仮想環境へSSH接続:local-server01:connect] ssh kohkimakimoto@192.168.56.21 -p 22

# Vagrant
[ローカル仮想環境Vagrant状態確認:status] cd /Users/kohkimakimoto/Documents/vagrant/hk && vagrant status && cd -
[ローカル仮想環境Vagrant起動:up] cd /Users/kohkimakimoto/Documents/vagrant/hk && vagrant up && cd -
[ローカル仮想環境Vagrant停止:halt] cd /Users/kohkimakimoto/Documents/vagrant/hk && vagrant halt && cd -

# etc
[Snippetsファイルを開く:open] subl ~/.snippets
[Shell拡張設定ファイルを開く:open] subl ~/.shell_extention

2014/06/30編集

.snippetsを読みに行く前にファイルの存在チェックをいれました。

2014/07/01編集

コマンド内に[]があるとラベル削除がうまくいかないところを直しました。

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^)