LoginSignup
8
1

More than 3 years have passed since last update.

npmやkubectlの補完関数の遅延読み込み

Last updated at Posted at 2019-12-18

npm completionkubectl completion が重いので、 bashzsh の起動時に毎回実行したくない、と思って最初の実行時まで遅延させるようにしています。

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
8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1