Closed4
miseのbash補完ができない:_comp_initialize: コマンドが見つかりません

miseをTABで補完しようとすると下記のエラーになる
mise _comp_initialize: コマンドが見つかりません
私の環境は下記のとおり
- Lubuntu24.04
- bash 5.2.37 (brewでインストール)
- bash-completion1.3 (brewでインストール)
- mise 2025.1.15 (brewでインストール)

miseの補完で使用されるスクリプトが下記です。
/home/linuxbrew/.linuxbrew/etc/bash_completion.d/mise
mise
_mise() {
if ! command -v usage &> /dev/null; then
echo >&2
echo "Error: usage CLI not found. This is required for completions to work in mise." >&2
echo "See https://usage.jdx.dev for more information." >&2
return 1
fi
if [[ -z ${_usage_spec_mise_2025_1_15:-} ]]; then
_usage_spec_mise_2025_1_15="$(mise usage)"
fi
local cur prev words cword was_split comp_args
_comp_initialize -n : -- "$@" || return
# shellcheck disable=SC2207
_comp_compgen -- -W "$(usage complete-word --shell bash -s "${_usage_spec_mise_2025_1_15}" --cword="$cword" -- "${words[@]}")"
_comp_ltrim_colon_completions "$cur"
# shellcheck disable=SC2181
if [[ $? -ne 0 ]]; then
unset COMPREPLY
fi
return 0
}
if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
shopt -u hostcomplete && complete -o nospace -o bashdefault -o nosort -F _mise mise
else
shopt -u hostcomplete && complete -o nospace -o bashdefault -F _mise mise
fi
# vim: noet ci pi sts=0 sw=4 ts=4 ft=sh
他の補完は問題ないので、miseのスクリプトに問題あるのかもしれない。と思い、chatgptに_comp_initializeを使用しないように修正したもらったコードに差し替えたら補完できるようになりました。
とりあえず、これで、しばらく様子見しようと思います。
修正コードの内容は下記のとおりです。
修正コード
mise
_mise() {
if ! command -v usage &> /dev/null; then
echo >&2
echo "Error: usage CLI not found. This is required for completions to work in mise." >&2
echo "See https://usage.jdx.dev for more information." >&2
return 1
fi
if [[ -z ${_usage_spec_mise_2025_1_15:-} ]]; then
_usage_spec_mise_2025_1_15="$(mise usage)"
fi
# Bash completion variables
local cur prev words cword
_get_comp_words_by_ref -n : cur prev words cword
# Generate completions using the `usage` command
local completions
completions="$(usage complete-word --shell bash -s "${_usage_spec_mise_2025_1_15}" --cword="$cword" -- "${words[@]}")"
# Populate COMPREPLY with the completions
COMPREPLY=( $(compgen -W "$completions" -- "$cur") )
return 0
}
if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
shopt -u hostcomplete && complete -o nospace -o bashdefault -o nosort -F _mise mise
else
shopt -u hostcomplete && complete -o nospace -o bashdefault -F _mise mise
fi
# vim: noet ci pi sts=0 sw=4 ts=4 ft=sh
■主な修正点
- _comp_initialize の削除
_comp_initialize を削除し、Bash組み込みの _get_comp_words_by_ref を使用して現在の単語や入力の状態を取得するようにしました。 - _comp_compgen の代替
compgen -W を直接使用して補完候補を生成するように変更しました。 - _comp_ltrim_colon_completions の削除
必要ない場合はこの処理を削除し、簡潔なコードにしました。

■この対応の問題点
コードの "2025_1_15"の部分は、バージョンなので、miseをバージョンアップするたびに、コードを修正しないといけない。

~/.bashrc
を下記のように修正したら解決した。
eval "$(mise activate bash)"
eval "$(mise completion bash --include-bash-completion-lib)"
このスクラップは2025/02/01にクローズされました