Closed4

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

mirabulemirabule

miseをTABで補完しようとすると下記のエラーになる

mise _comp_initialize: コマンドが見つかりません

私の環境は下記のとおり

  • Lubuntu24.04
  • bash 5.2.37 (brewでインストール)
  • bash-completion1.3 (brewでインストール)
  • mise 2025.1.15 (brewでインストール)
mirabulemirabule

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 の削除
    必要ない場合はこの処理を削除し、簡潔なコードにしました。
mirabulemirabule

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

mirabulemirabule

~/.bashrcを下記のように修正したら解決した。

eval "$(mise activate bash)"
eval "$(mise completion bash --include-bash-completion-lib)"
このスクラップは2025/02/01にクローズされました