TL;DR
- fzf等のインタラクティブフィルターで絞り込み対象とstdoutへ渡す絞り込み結果を分けたいときがある
- 絞り込み対象の表示を加工するオプションは調べたけどないっぽい
- とりあえずやってみたけどスマートじゃない感が半端ないので知ってる人教えてください
なにがしたいか
CLIにこもって生活を送る私にとって
fzfやpecoといったインタラクティブフィルターは私の生活に欠かせないものになっています。
しかし最近になって、この手のツールの絞り込みの表示と最終的なstdoutは必ずしも同じでなくて良いのではないか
と思うようになりました。
なぜやりたいか
最近、OSSに貢献したいなーと思って、他の人が作成したGitHubリポジトリに対してプルリクを送ることが何回かあったのですが、
その際の手順として
- 対象リポジトリをフォーク
- フォークしたリポジトリをクローン(ghq使用)
-
ghq list -p
をfzf
でフィルタした結果でcd
ということをするんですが、その際にフィルタリングがめんどいなと思うことがありました。
私の場合、手順3
の実行時に下記の通り ghq list -p
の結果が表示されているわけなんですが、
このとき自分がフォークしたリポジトリに移動したいから
fzfのファジー検索を活かして lighttiger2505
を雑にタイプして、そっからまた go-gitlab
と打ちます。
> go-gitlab
1/2
> /home/lighttiger2505/dev/src/github.com/xanzy/go-gitlab
/home/lighttiger2505/dev/src/github.com/lighttiger2505/go-gitlab
ところがここで先頭にある /home/lighttiger2505/dev/src/
が邪魔してくるんですよ。
上記2つの候補にどちらも自分のユーザ名があるせいでどっちも対象になってしまう。
というわけで、fzf上では以下のように表示させておいて、
> go-gitlab
2/69
> github.com/xanzy/go-gitlab
github.com/lighttiger2505/go-gitlab
最終的にstdoutに渡してくれるのは、フルパスの
/home/lighttiger2505/dev/src/github.com/lighttiger2505/go-gitlab
になったら素敵だなーと思ったわけです。
どうしたか
あるオプションを指定したら、そのスクリプトを実行して加工した結果をディスプレイ出力して、
最終的にstdoutに渡してくる結果は、加工前の情報というのが理想だったのですが、
私がヘルプとにらめっこした感じなさそうでした。
なので結果として表示時の加工と処理実行前の復元を自前でやることで解決しました。
あっても良さそうな気がするけど、これをやるとシンプルさがなくなる気もするし、難しい。
というわけで最後に作ったスクリプトおいておきます。
function fzf-ghq=repository() {
local GHQ_ROOT=`ghq root`
local REPO=`ghq list -p | sed -e 's;'${GHQ_ROOT}/';;g' |fzf +m`
if [ -n "${REPO}" ]; then
BUFFER="cd ${GHQ_ROOT}/${REPO}"
fi
zle accept-line
}
zle -N fzf-ghq=repository