私のpeco活用事例

pecoというインタラクティブに入力をフィルタして出力するコマンドがあって、使い始めてからシェルの操作方法が大幅にかわり、だいぶライフチェンジングだった。
最近このへんが流行ってるのでやたら記事あるけど、せっかくなので僕も使い道を紹介しようと思う。

pecoをzshで使う

1. peco ghq

ghq peco

ghqを使ったローカルリポジトリの統一的・効率的な管理についてのこと。
僕も$GOPATH$HOMEにしていて、今のところ別に困ることはない。
go getしたりghq getしたりして美しくディレクトリ切った上で、pecoに割り当てておいたC-sですぐ目的のディレクトリ開けるようにしてあるので、めちゃくちゃソース管理が楽になった。

function peco-src() {
    local selected_dir=$(ghq list | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${GOPATH}/src/${selected_dir}"
        zle accept-line
    fi
    zle redisplay
}
zle -N peco-src
stty -ixon
bindkey '^s' peco-src

ちなみにC-sにbindkeyするのちょっとハマって、stty -ixonしないと動かなかった。

2. peco git branch

peco git branch

alias -g B='`git branch | peco | sed -e "s/^\*[ ]*//g"`'

Bというグローバルエイリアスを割り当てていて、git checkout Bとかgit branch -D Bとかやる。
なんかその一連の流れを1つのエイリアスにまとめてる人がいるけど、個人的にはブランチ名が来るべきところにエイリアス打つのが一番しっくり来る。

ちょっと前までzshのcompletionもまともに使ってなくて、ブランチ長いのうつのめんどくさいなーと思ってたけど、効率よく作業できるようになった。
補完使うよりも最初から候補が綺麗に画面に出てカーソル移動して選択できるほうが便利。

3. peco select history

peco select history

C-rをpecoで選べるようにするやつ。
pecoとかpercol使ってる人みんなやってると思う。すごい便利。

function peco-select-history() {
    BUFFER=$(fc -l -r -n 1 | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle redisplay
}
zle -N peco-select-history
bindkey '^r' peco-select-history

4. peco find file

peco find file

補完が大変な深いファイルパスを入力するのにfindとpecoを使うやつ。 カレントディレクトリがgitリポジトリの場合はgit ls-filesを使ってゴミファイルを無視している。

以下はキーバインドをC-qに割り当てた例で、上の動画のように複数選択に対応するために少し長めのコードになっている。

function peco-find-file() {
    if git rev-parse 2> /dev/null; then
        source_files=$(git ls-files)
    else
        source_files=$(find . -type f)
    fi
    selected_files=$(echo $source_files | peco --prompt "[find file]")

    BUFFER="${BUFFER}${echo $selected_files | tr '\n' ' '}"
    CURSOR=$#BUFFER
    zle redisplay
}
zle -N peco-find-file
bindkey '^q' peco-find-file

pecoを導入してみて思ったこと

ツールの使い方覚えるの正直大変だけど、省ける手間はできるだけ省きたい。