Masteries

技術的なことや仕事に関することを書いていきます.

peco芸: ファイルを検索して開いたりする

gfx.hatenablog.com

pecoめっちゃ便利ですよね. 僕も愛用しています. こちらの記事で紹介されているように, ghq + peco も便利ですが, 僕は ag + peco の組み合わせにハマっていて(?), その紹介をします.

ag

ag (The Silver Searcher)は, 一言で言えば「めっちゃ早いgrep」みたいなものです. 最近は, これよりも更に早いhw (Highway)とかも登場しているようですが, 手癖でずっと ag コマンドを使っています.

MacでHomebrewを使っていれば, こういう感じでインストールできます:

$ brew install the_silver_searcher

さて, ag コマンドは grep のように使えますが, -l オプションを使うと, カレントディレクトリ以下に存在するファイル(ag が検索対象とするファイル?)の一覧を出してくれます(例は, skajiさんのApp::cpmのGitリポジトリのルートで実行してみた様子です):

$ ag -l
author/copyrights-and-licenses.json
author/cpanfile.snapshot
author/fatpack.pl
Changes
Build.PL
cpanfile
lib/App/cpm/CircularDependency.pm
dist.ini
lib/App/cpm/Distribution.pm
lib/App/cpm/Job.pm
lib/App/cpm/Logger/File.pm
lib/App/cpm/Logger.pm

    ...

これを, peco と組み合わせてみましょう.

ag + peco

色々やり方はあると思いますが, 自分は .zshrc に次のように書いています.

function peco-file() {
    local filepath=$(ag -l | peco --prompt 'PATH >')
    if [ -n "$filepath" ]; then
        if [ -n "$BUFFER" ]; then
            BUFFER="$BUFFER $(echo $filepath | tr '\n' ' ')"
            CURSOR=$#BUFFER
        else
            if [ -f "$filepath" ]; then
                BUFFER="$EDITOR $filepath"
                zle accept-line
            fi
        fi
    fi
}
zle -N peco-file
bindkey '^f' peco-file

peco-file という関数を用意して, これを Ctrl + f で呼び出すようにしています. 更に, バッファ($BUFFER)の有無によって挙動が変わるようになっていて,

  • バッファ($BUFFER)が空の時は, ag -l によって得られたファイルの一覧を peco で検索/選択して, それをそのまま vim で開く, という挙動をします:

f:id:papix:20170726111735g:plain

  • バッファ($BUFFER)に空ではない時, 例えば carton exec -- prove のような文字列が入力済みのときは, peco で検索/選択したファイルを入力済みの文字列の末尾にくっつける, という挙動をします:

f:id:papix:20170726112006g:plain

このように, 「vim でファイルを開く」と「コマンドの引数としてファイルを指定する」が, 全て Ctrl + f で実現できて, これがなかなか非常に便利です.

まとめ

このツイートを見て, 確かに! と思ったので, シュッと書きました. 皆さんもこの機会にオリジナルの peco ハック(?)について記事を書いてみると良いと思います!!!