オートコンプリートで参照されるパラメータ

オートコンプリートで参照されるパラメータ

引数が単一の単語の場合にのみ機能するbashオートコンプリート機能があります。引用符付きステートメントを自動補完し、それをケースステートメントで使用してファイルにタグを付けることができます(メタデータタグを考えてください。時には複数の単語が必要になる場合があります)。

オートコンプリート機能を使用して特定のオプションの後に目次を表示する方法はありますか?スクリプトは次のとおりです。

_script()
{
        local cur prev opts iter
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-t"
        if [[ ${cur} == -* ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                return 0
        fi
        case "$prev" in
                -t)
                        option="single \"double\ word\""
                        option="${option//\\ /___}"
                        for iter in $option; do
                                if [[ $iter =~ ^$cur ]]; then
                                        COMPREPLY+=( "${iter//___/ }" )
                                fi
                        done
                        return 0
                        ;;
                "single"|"double word")
                        compopt -o default
                        COMPREPLY=()
                        return 0
                        ;;
        esac
}
complete -F _script script

私がこれを次のように使用したとき:

script -t <tab>:正しいオプションが表示されますが、single "double word"ディレクトリは表示されません(はい!それは私が望むものです!)

私が使用している場合:

script -t single <tab>:利用可能なディレクトリを表示します(はい!それが私が欲しいものです!)

私が使用している場合:

script -t "double word" <tab>:タブには何も出力されません。これが私が解決したい問題です。

ベストアンサー1

あなたの処理はdouble word間違っています(シェルよりも意味がありますが、少なくともbashでは)case

関数コードの上部(または関心のある行の前)に配置すると、何が起こるかをset -x確認できます。

正しい文字列を返します。"double word"ここで、"being はプログラム可能な完成として表される単語の一部です。引用符が認識されているの"double word"は単なる単語ですが、削除されていないため、関数で見ることができるので、_scriptこれは少し奇妙です。したがって、完成は使用できますが、実行と同じシェルであっても"double word"使用できません。double\ wordしたがって、これはリテラルと解析されたコマンドライン文字列の半直観的な組み合わせです。

解決策

コードを次に置き換えると機能します。

"single"|"double word"

そして

"single"|"\"double word\""

またはより良い

"single"|"\"double word\""|"double\ word"|"'double word'"

提案

しかし、私はいくつかの変更を提案したいと思います:

_script()
{ 
        local cur prev opts iter
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-t"
        if [[ ${cur} == -* ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                return 0
        fi
        case "$prev" in
                -t)
                        options=(single "double\ word")
                        for iter in "${options[@]}"; do
                                if [[ $iter =~ ^$cur ]]; then
                                        COMPREPLY+=( "$iter" )
                                fi
                        done
                        return 0
                        ;;
                "single"|"double\ word")
                        compopt -o default
                        COMPREPLY=()
                        return 0
                        ;;
        esac
}

おすすめ記事