読者です 読者をやめる 読者になる 読者になる

オープンソースこねこね

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

pecoでカレントディレクトリごとによく使うコマンドを呼び出せるようにする

peco

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

の続き。ちょいちょいスクリプトをカスタマイズしていたので。

ところで最近の開発はコードを書いているときだいたい開発中アプリケーションのトップディレクトリにいて、そこでいつもいくつか決まったコマンドを実行する、ということがよくあります。gruntとかcomposer installとかphp vendor/bin/phpunitとか。

私はPHPをよく書くのでcomposer installなどは手に馴染んでいて入力するのに困ったりしないのですが、たまにRubyのプロジェクトをいじるときBundlerの使い方を忘れていてbundle install --path=vendor/bundle --binstubs=vendor/binとかを毎回、Gistにメモっておいたスニペットから引っ張ってきて入力してたりしました。

アプリケーションごとのスニペットファイル

そこでpecoをランチャーのようにして使うで書いたスクリプトをちょっと拡張して、カレントディレクトリに.snippetsファイルをおいておくと、そこからもスニペットを取得するようにしました。

# snippets
function peco-snippets() {

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

    # Get snippets in the current directory if it exists.
    cwd=`pwd`
    if [ -e "$cwd/.snippets" ]; then
      local_snippet="$cwd/.snippets"
    else
      local_snippet=""
    fi

    line=$(cat $local_snippet ~/.snippets | grep -v "^\s*#" | grep -v '^\s*$' | 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

忘れやすいコマンドなどは.snippetsファイルを以下のように記述しておけば、

EArray (https://github.com/kohkimakimoto/EArray)
 * [phpunit test] php vendor/bin/phpunit
 * [fix code] php vendor/bin/php-cs-fixer fix src
 * [composer] composer update

cmd-x+cmd-xのショートカットでpecoの選択インターフェースが起動して、アプリごとに必要なコマンドが選択肢に表示されるので、あとはそこから選べばよくなりました。

f:id:kohkimakimoto:20140727114321g:plain