fzfとghqで「user/repo」だけを絞り込み対象にする
課題
ghqとfzfを組み合わせてリポジトリを選択する際、デフォルトではパス全体が検索対象になります。
github.com/kenchan/dotfiles
github.com/other-user/dotfiles
gitlab.com/kenchan/dotfiles
このため、ドメイン部分(github.com、gitlab.com)に含まれる一般的な文字列(gitやcom等)で検索すると、意図しないマッチが大量に発生します。
ユーザー名やリポジトリ名で絞り込みたいのに、ドメインの文字列が邪魔をしている状態です。
解決方法
fzfの--delimiterと--nthオプションを使うことで、表示されている文字列の中から検索対象を限定できます。
ghq list -p | fzf --delimiter=/ --nth=-2,-1
オプションの説明
-
--delimiter=/: パスをスラッシュで分割 -
--nth=-2,-1: 後ろから2番目と1番目のフィールド(organization/repository)だけを検索対象に
これにより、kenchan/dotfilesの部分だけが検索対象になります。
注意事項
この設定は、ghqのroot配下がhost/org/repoの3階層構造を前提としています。2階層構造(host/repo)の場合は--nth=-1を使用してください。
実装例
エイリアスで設定
シェルのエイリアスや関数として設定する方法です。
Bash/Zsh:
alias repo='cd $(ghq list -p | fzf --delimiter=/ --nth=-2,-1)'
Fish:
alias repo='cd (ghq list -p | fzf --delimiter=/ --nth=-2,-1)'
fish-ghqプラグインで設定
decors/fish-ghqを使っている場合、環境変数で設定できます。
config.fish:
set -g GHQ_SELECTOR_OPTS "--delimiter=/" "--nth=-2,-1"
これでCtrl+Gを押した際のリポジトリ選択時に自動的に適用されます。fish-ghqは内部でghq list -pを実行しているため、フルパスに対してこの設定が適用されます。
注意: 複数のオプションを設定する場合、各オプションを個別の文字列として指定します。"--delimiter=/ --nth=-2,-1"のように1つの文字列にすると、単一のオプションとして扱われ正しく動作しません。
まとめ
fzfの--delimiterと--nthオプションを使うことで、ghqのリポジトリ選択をより効率的に行えます。シンプルな設定ですが、日々の開発体験が大きく向上します。
このテクニックは他のfzfを使う場面でも応用できるので、覚えておくと便利です。
Discussion