2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

インタラクティブフィルターの表示と最終的なstdoutを別にしてみた

Posted at

TL;DR

  • fzf等のインタラクティブフィルターで絞り込み対象とstdoutへ渡す絞り込み結果を分けたいときがある
  • 絞り込み対象の表示を加工するオプションは調べたけどないっぽい
  • とりあえずやってみたけどスマートじゃない感が半端ないので知ってる人教えてください

なにがしたいか

CLIにこもって生活を送る私にとって
fzfやpecoといったインタラクティブフィルターは私の生活に欠かせないものになっています。
しかし最近になって、この手のツールの絞り込みの表示と最終的なstdoutは必ずしも同じでなくて良いのではないか
と思うようになりました。

なぜやりたいか

最近、OSSに貢献したいなーと思って、他の人が作成したGitHubリポジトリに対してプルリクを送ることが何回かあったのですが、
その際の手順として

  1. 対象リポジトリをフォーク
  2. フォークしたリポジトリをクローン(ghq使用)
  3. ghq list -pfzf でフィルタした結果で 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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?