🔍

fzfとghqで「user/repo」だけを絞り込み対象にする

に公開

課題

ghqとfzfを組み合わせてリポジトリを選択する際、デフォルトではパス全体が検索対象になります。

github.com/kenchan/dotfiles
github.com/other-user/dotfiles
gitlab.com/kenchan/dotfiles

このため、ドメイン部分(github.comgitlab.com)に含まれる一般的な文字列(gitcom等)で検索すると、意図しないマッチが大量に発生します。

ユーザー名やリポジトリ名で絞り込みたいのに、ドメインの文字列が邪魔をしている状態です。

解決方法

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を使う場面でも応用できるので、覚えておくと便利です。

GitHubで編集を提案
GMOペパボ株式会社

Discussion