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