Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

git worktree と peco

はじめに

その昔、git-worktree を使いやすくするためのスクリプトを紹介しましたが、peco に対応するために少し修正してみたのでご紹介します。

前の記事: git worktree list を少しだけ使いやすく - Smile Engineering Blog

※前回と同じく、zsh 用です

peco とはインタラクティブなフィルタリングツールです。

例えば peco 導入前、起動中のプロセスから目的のプロセスを探す場合は ps の実行結果を grep 等にパイプしていました。 これを grep ではなく、peco に渡すことにより、実行結果からの検索をインタラクティブに行うことができます。

peco's Demo:

前回紹介したスクリプトでは、番号の入力によって移動先の worktree(ディレクトリ)を決定していましたが、peco を使用することにより、git wirktree list からの検索&移動が可能となります。

こんなの

peco 対応版のスクリプトです。

peco-git-worktree () {
    local tree=$(git worktree list | peco --query "$LBUFFER")
    if [ -n "$tree" ]; then
        BUFFER="cd `echo $tree | awk '{ print $1 }'`"
        zle accept-line
    fi
}
zle -N peco-git-worktree
bindkey '^]' peco-git-worktree

解説

2 行目:

local tree=$(git worktree list | peco --query "$LBUFFER")

git worktree list の実行結果を peco に渡して、その結果を変数 tree に格納しています。

--query オプションと LBUFFER を用いることによって、予め検索キーワードが決まっている場合にデフォルト値として渡すことができるようにしています(LBUFFER にはコマンドラインの現在のカーソル位置よりも左側の文字が格納されている)。

3 行目:

if [ -n "$tree" ]; then

変数 tree の文字列の長さが 1 以上であれば true です。peco でキャンセルされたときの判断をしています。

4-5 行目:

BUFFER="cd `echo $tree | awk '{ print $1 }'`"
zle accept-line

awk を用いて、選択された行の、1 列目を抽出し、ディレクトリを移動(cd)しています。git worktree list の実行結果の 1 列目は、worktree(ディレクトリ)のフルパスです。

コマンドラインBUFFER)を編集し、編集したコマンドを zle accept-line で実行することによってディレクトリ移動(cd)を実現しています。

8-9 行目:

zle -N peco-git-worktree
bindkey '^]' peco-git-worktree

ZLE ウィジェットに peco-git-worktree を登録し、Ctrl+] を割り当てています。

※ZLE(Zsh Line Editor)は zsh の機能です。ここでの説明は省略します。

実演

何も指定せずに Ctrl+]:

f:id:jspnet:20220214133003g:plain

キーワード指定からの Ctrl+]:

f:id:jspnet:20220214133037g:plain

おわりに

今回のネタは ghq + peco の技を git-worktree に適用したもので、以下のサイトを参考にさせていただきました。

Songmu/ghq-handbook

開発用 PC の肥大化したプロジェクトディレクトリをどうにかしようと今更ながら ghq + peco を導入したのですが、操作感、見た目を統一しようと思い、git-worktree にも適用しました。現状はリポジトリの移動と worktree の移動は別々のキーにアサインしてますが、今後は同じキーでどちらへも移動できるような仕組みにしたいと思っています。