git worktree と peco
はじめに
その昔、git-worktree を使いやすくするためのスクリプトを紹介しましたが、peco に対応するために少し修正してみたのでご紹介します。
前の記事: git worktree list を少しだけ使いやすく - Smile Engineering Blog
※前回と同じく、zsh 用です
例えば peco 導入前、起動中のプロセスから目的のプロセスを探す場合は ps
の実行結果を grep
等にパイプしていました。
これを grep
ではなく、peco に渡すことにより、実行結果からの検索をインタラクティブに行うことができます。
前回紹介したスクリプトでは、番号の入力によって移動先の 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+]:
キーワード指定からの Ctrl+]:
おわりに
今回のネタは ghq + peco の技を git-worktree に適用したもので、以下のサイトを参考にさせていただきました。
開発用 PC の肥大化したプロジェクトディレクトリをどうにかしようと今更ながら ghq + peco を導入したのですが、操作感、見た目を統一しようと思い、git-worktree にも適用しました。現状はリポジトリの移動と worktree の移動は別々のキーにアサインしてますが、今後は同じキーでどちらへも移動できるような仕組みにしたいと思っています。