Mac zsh-comletion やhomebrewによって管理される補完スクリプトディレクトリ整理

javascript code

zsh-completionの役割や,homebrewでインストールしたアプリケーションの補完スクリプトの管理方法,補完スクリプトの保存先ディレクトリの使い分けについて解説します.

目次

zsh-comletionの役割

zshのプラグインで,zsh-completionがあります.しかし,zsh自体に補完機能があります.
では,zsh-completionは何をするためのものでしょうか.

This projects aims at gathering/developing new completion scripts that are not available in Zsh yet.

zsh-users/zsh-completions: Additional completion definitions for Zsh.

zsh-completionsの説明によると,zshで利用可能でない新しい補完スクリプトの収集・開発を目的とする,とあります.

サードパーティ製コマンドラインツールの補完スクリプトの詰め合わせパックのようなイメージです.

補完スクリプトが読み込まれる場所は$fpathです.echo $fpathによって出力されるフォルダを確認してみます.

% echo $fpath
/Users/[username]/.zsh/zsh-completions/src /usr/local/share/zsh/site-functions /usr/share/zsh/site-functions /usr/share/zsh/5.8.1/functions


/Users/[username]/.zsh/zsh-completions/src → zsh-completions用
/usr/local/share/zsh/site-functions → 存在しない
/usr/share/zsh/site-functions → 空
/usr/share/zsh/5.8.1/functions → たくさん入っている

試しにzsh-completionsの中身を見てみると,以下のように約140のファイルがあります.

total 3088
drwxr-xr-x  138 [username]  staff   4.3K 12 31 14:04 ./
drwxr-xr-x   12 [username]  staff   384B 12 31 14:04 ../
-rw-r--r--    1 [username]  staff   3.3K 12 31 14:04 _afew
-rw-r--r--    1 [username]  staff    12K 12 31 14:04 _android
-rw-r--r--    1 [username]  staff   3.1K 12 31 14:04 _archlinux-java
-rw-r--r--    1 [username]  staff   2.5K 12 31 14:04 _artisan
-rw-r--r--    1 [username]  staff   2.7K 12 31 14:04 _atach
-rw-r--r--    1 [username]  staff   6.6K 12 31 14:04 _bitcoin-cli
-rw-r--r--    1 [username]  staff   6.4K 12 31 14:04 _bower
-rw-r--r--    1 [username]  staff    17K 12 31 14:04 _bundle
-rw-r--r--    1 [username]  staff   5.0K 12 31 14:04 _cap
-rw-r--r--    1 [username]  staff   3.7K 12 31 14:04 _cask
-rw-r--r--    1 [username]  staff    12K 12 31 14:04 _ccache
略
-rw-r--r--    1 [username]  staff   889B 12 31 14:04 _wg-quick
-rw-r--r--    1 [username]  staff   3.6K 12 31 14:04 _xsel
-rw-r--r--    1 [username]  staff    13K 12 31 14:04 _yaourt
-rw-r--r--    1 [username]  staff    17K 12 31 14:04 _yarn
-rw-r--r--    1 [username]  staff   5.6K 12 31 14:04 _zcash-cli

ここで,ファイル名の先頭が_で始まっていますが,これは補完スクリプトの命名規約でファイル名を_コマンド名とする約束になっているからです.

このようにzsh-completionをインストールした上で,.zshrcの中以下のように読み込むことで,補完スクリプトの読み込み先にzsh-completion/srcを追加することになるのです.

[ -d $HOME/.zsh/zsh-completions/src ] && fpath=($HOME/.zsh/zsh-completions/src $fpath)

# 補完ファイルを読み込む
autoload -Uz compinit
compinit

Homebrewで追加したツールの補完スクリプトはどうなっているのか?

Homebrewのページによると

  • Homebrewによってアプリケーションを追加した場合の補完スクリプトは,HOMEBREW_PREFIX配下に置かれる.
  • このパスの場所をシステムに教える ($fpathに追加する)のは自身でやらなければだめ

You must manually configure your shell to enable its completion support. This is because the Homebrew-managed completions are stored under HOMEBREW_PREFIX which your system shell may not be aware of, and since it is difficult to automatically configure bash and zsh completions in a robust manner, the Homebrew installer does not do it for you.
Shell completions for external Homebrew commands are not automatically installed. To opt-in to using completions for external commands (if provided), they need to be linked to HOMEBREW_PREFIX by running brew completions link.

brew Shell Completion — Homebrew Documentation

brewで追加したアプリケーションの補完スクリプトは,$(brew --prefix)/share/zsh/site-functions:${FPATH}配下に配置されます.

自身で.zshrcに以下を追記することで,brew用の補完スクリプトが読み込まれるようになります.

以下のコマンドは必ずeval "$(/opt/homebrew/bin/brew shellenv)"の後に配置してください

if type brew &>/dev/null
then
  FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"

  autoload -Uz compinit
  compinit
fi

$(brew --prefix)のパスを展開すると,以下のようになっています.

echo $(brew --prefix)

/opt/homebrew

中身を確認してみます.

ls -alh /opt/homebrew/share/zsh/site-functions

lrwxr-xr-x  1 [username]  admin    30B  6 15  2022 _brew@ -> ../../../completions/zsh/_brew
lrwxr-xr-x  1 [username]  admin    79B  6 21  2022 _brew_services@ -> ../../../Library/Taps/homebrew/homebrew-services/completions/zsh/_brew_services
lrwxr-xr-x  1 [username]  admin    64B 12 24 23:57 _docker@ -> ../../../Cellar/docker/20.10.22/share/zsh/site-functions/_docker
lrwxr-xr-x  1 [username]  admin    54B 12 31 12:53 _gh@ -> ../../../Cellar/gh/2.21.1/share/zsh/site-functions/_gh

ここにある_docker_ghはberwでインストールした際に自動的に補完スクリプトを登録してくれたようです.

補完ファイル保存先の役割

補完スクリプトの保存先のパスが色々出てきました.どのように使い分けるべきでしょうか.整理すると以下のような使い分けが正しいようです.

~/.zsh/zsh-completions/src → zsh-completions用の補完スクリプト
/usr/local/share/zsh/site-functions → 自身で追加する際に使用する
/usr/share/zsh/site-functions → パッケージ管理システム等でソフトウェアをインストールする際に使用される
/opt/homebrew/share/zsh/site-functions → homebrewによって管理されるアプリケーションの補完スクリプトの追加場所
/usr/share/zsh/5.8.1/functions → zshが提供する補完スクリプト

ちなみに*nixシステムのディレクトリ構造は以下のようになっています.

  • /usr/share
    • アーキテクチャに依存しないデータの保存先
  • /usr/local
    • システム管理者が自分でアプリケーションをインストールする場所として利用します。ここは、システム関連のソフトウェアをアップデートしても変更されないようになっています。各サブディレクトリの用途は、/usrや/にある同名のディレクトリに準じます。

参考

よかったらシェアしてね!
目次