Syu fu's blog

zsh補完ファイルの管理

dotfileszsh

.zshhistoryはコマンドの再実行に有効ですが新しいコマンドを実行する場合にはzshの補完機能が有効です。
普段利用するコマンドのサブコマンドやオプションを全ては覚えていられないので補完を用いることで説明を読みつつ選択できるうえ、typoも減らすことができます。
私の場合はfzf-tabを用いることでこれをインタラクティブに行っています。

とても便利な機能なのでzsh-completionsをインストールすることはもちろん、インストールしてきたCLIツールにも補完を設定したいです。
しかし、brewなどではコマンドのインストール時に補完スクリプトの設定も同時に行ってくれることがあるようですが、私が利用しているAquaにはそのような機能はありません。1そのため利用者自身で補完の設定する必要があります。

保管ファイルのパターンについて

設定方法がツールごとにばらばらなため4つのパターンに分けて私の管理方法を紹介します。 まずはどのようにパターン分けしているかを表に示します。

補完ファイルの場所

  • コマンドで生成
  • リポジトリに置いてある

補完スクリプトの読み込み方法

  • sourceを利用
  • FPATHを利用
    • FPATHに設定したディレクトリのファイルを補完ファイルとして読み込む機能。詳しい説明については20 Completion System -zshを参照。

上記2要素の組み合わせで4パターンとなっています。
それぞれのパターンの詳細な解説に移ります。

パターンごとの読み込み方法の詳細

コマンドで生成かつsourceを利用して読み込む場合

Aquahugoが当てはまります。
恐らくですがurfave/cliを使っている場合にこのパターンが多いのではないでしょうか。
このパターンは.zshrc(この先同様の表記をした場合に.zshrcから読み込むファイルも含みます)に以下のように記載します。(各コマンドごとに生成用コマンドは異なるためhelp等を確認してください)

.zshrc
if command -v aqua &> /dev/null; then source <(aqua completion zsh); fi

コマンドで生成かつFPATHを利用して読み込む場合

ghyqなどが当てはまります。 補完ファイルを保存しておくためのフォルダを作成し、そこをFPATHに追加します。私の場合はzshの設定を$XDG_CONFIG_HOME/zshにまとめていますのでそこにcompletionフォルダを作成しています。
FPATHの慣習に基づいてファイル名はアンダースコア+コマンド名にします。

.zshrc
if command -v gh &> /dev/null; then (gh completion --shell zsh)> $ZDOTDIR/completions/_gh; fi

リポジトリに置いてあるかつsourceを利用して読み込む場合

sheldonfzfなどが当てはまります。
リポジトリにあるものをダウンロードしそれをsourceすれば良いです。私の場合はzshのプラグインマネージャーとしてsheldonを利用しているので以下の様に設定できます。

sheldon.toml
[plugins.fzf-completion]
remote = "https://raw.githubusercontent.com/junegunn/fzf/master/shell/completion.zsh"

リポジトリに置いてあるかつFPATHを利用して読み込む場合

ghqripgrepなどが当てはまります。
sheldonにはインストールしたプラグインのディレクトリをFPATHに設定する機能があるためそちらを利用します。詳しくはドキュメントを参照してください。 注意点としてはsheldonの読み込みを行ったあとにcompinitをするようにしてください。

sheldon.toml
[plugins.ghq-completion]
remote = "https://raw.githubusercontent.com/x-motemen/ghq/master/misc/zsh/_ghq"
apply = ["fpath"]

私のzshの設定はこのリポジトリに置いてあります。
補完ファイルはzsh-deferなどを用いて遅延ロードできます。そのため補完ファイルを読み込むことで起動時間が増えるようなことはないので普段使うコマンドの補完ができない方はぜひ設定してみてください。

Footnotes

  1. デフォルト設定でなんでもいい感じにやってくれるものよりも自分で設定できるもののほうが好みです。