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
brew Shell Completion — Homebrew DocumentationHOMEBREW_PREFIX
which your system shell may not be aware of, and since it is difficult to automatically configurebash
andzsh
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 toHOMEBREW_PREFIX
by runningbrew completions link
.
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や/にある同名のディレクトリに準じます。