npm completion
や kubectl completion
が重いので、 bash
や zsh
の起動時に毎回実行したくない、と思って最初の実行時まで遅延させるようにしています。
npm
最初の補完実行時に読み込むようにしています。
最初の補完は遅延読み込みのみ実行する関係で、補完できません。
zsh
の場合は fpath に _npm
がすでに存在するので、それより優先させるためには compinit
より後にする必要があります。
if type npm >/dev/null 2>&1; then
# overwrite after compinit
_npm () {
unfunction _npm
eval "$(npm completion)"
}
fi
この記事を書くにあたって、現状の /usr/share/zsh/5.3/functions/_npm
を確認してみたところ、以下のようになっていたので、今だと zsh
だけなら不要そうで、初回も _npm_completion
が呼ばれているので、ちゃんと補完できて良さそうです。
以前は _npm
ファイルに補完処理の内容が書いてあって、実際に使われる npm
よりも補完内容が古くて不便だった覚えがあります。
#compdef npm
# Node Package Manager completion, letting npm do all the completion work
if type npm > /dev/null; then
eval "$(npm completion)"
_npm_completion "$@"
fi
kubectl
こちらは補完関数の方ではなく、 kubectl
の実行時に補完設定をするようにしています。
そのため、シェル起動後の初回実行時は補完がきかないので、引数なしで実行してヘルプ表示だけするとか、履歴から実行するなどして、補完設定することを想定しています。
if type kubectl >/dev/null 2>&1; then
kubectl () {
unset -f kubectl
# lazy load
source <(kubectl completion ${SHELL##*/})
kubectl "$@"
}
fi