miseのシェル補完を有効にしたい

miseはサブコマンドやツール名の補完スクリプトをmise completionで生成できる。生成したスクリプトを配置すれば、mise usまで打ってTabキーを押すとmise useが補完されるようになる。

mise completionの基本

mise completionに対応するシェル名を渡すと、標準出力に補完スクリプトを出力する。

$ mise completion bash > ~/.local/share/bash-completion/completions/mise
$ mise completion zsh  > /usr/local/share/zsh/site-functions/_mise
$ mise completion fish > ~/.config/fish/completions/mise.fish
$ mise completion powershell >> $PROFILE

対応しているシェルはbashfishpowershell(pwshも同じ扱い)、zshの4種類である。

シェル名の指定は省略できない

mise completion --helpではシェル名の引数が[SHELL]と角括弧で表示されており、省略できるように見える。しかし実際に省略すると、$SHELL環境変数からの自動判定はされずエラーになる。

$ mise completion
error: the following required arguments were not provided:
  [SHELL]

Usage: mise completion [FLAGS] [SHELL]

For more information, try '--help'.

補完スクリプトを生成する際は、必ずシェル名を明示的に指定する必要がある。

–installで配置先に直接書き込む

> ファイルでリダイレクトする代わりに、--installを付けると各シェルが補完スクリプトを探す標準的な場所に直接書き込める。

$ mise completion zsh --install
installing to /home/user/.local/share/zsh/site-functions/_mise

add this to ${ZDOTDIR:-$HOME}/.zshrc, once:

fpath+=('/home/user/.local/share/zsh/site-functions')
autoload -Uz compinit && compinit

zshの場合、補完スクリプトを配置するだけでは読み込まれず、上記のように.zshrcfpathの追加とcompinitの呼び出しを1回だけ追記する必要がある。この追加分の行は--install実行時にコンソールへ案内が表示されるだけで、.zshrcが自動編集されるわけではない。

一方、bashの場合はこのような追記の案内は表示されない。

$ mise completion bash --install
installing to /home/user/.local/share/bash-completion/completions/mise
note: bash loads this on demand through bash-completion, which has to be installed and sourced by your shell for it to be read at all.

bash-completionパッケージがインストール済みでシェルから読み込まれていれば、配置するだけで自動的に読み込まれる。

–forceで既存ファイルを上書きする

--installは、配置先に既にファイルが存在し、それがmise completion --installで書き込んだものでない場合はエラーで停止する。

$ mise completion zsh --install
mise ERROR /home/user/.local/share/zsh/site-functions/_mise was not written by usage, so it was left alone

Pass --force to replace it, or redirect the script yourself.

意図的に上書きしたい場合は--forceを付ける。

$ mise completion zsh --install --force
installing to /home/user/.local/share/zsh/site-functions/_mise
...

completeやcompletionsでも実行できる

mise completionにはcompletecompletionsというエイリアスが用意されている。どちらを使っても同じ結果になる。

$ mise complete zsh
$ mise completions zsh