bash コマンドライン補完で部分的な引数を補完し、さらにヒントを提供するにはどうすればよいですか

bash コマンドライン補完で部分的な引数を補完し、さらにヒントを提供するにはどうすればよいですか

引数 foo:bar、foo:foo、bar:bar、または bar:foo を取るコマンド 'command' があるとします。コマンドライン補完スクリプトを記述して環境に組み込むと、次のような補完が得られます。

function _command_opt()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="foo:bar foo:foo bar:bar bar:foo"
    if [[ ${prev: -7} == 'command' ]]
    then
        COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) );
        return 0;
    fi
}
complete -F _command_opt -o bashdefault -o default 'command'

ただし、入力するとcommand f[tab][tab]、foo:bar と foo:foo が表示されますが、どちらもコマンド ラインに補完されません (まだ区別されていないため)。私が実現したいのは、カーソルをcommand foo:現在の単語の末尾に生成してそのままにし (スペースを追加するのではなく)、次に または と入力してbもう一度fTab キーを押してコマンドを終了できるようにすることです。この例の問題は、私が言っていることを示すためだけのものです...実際のケースでは、プレフィックス:サフィックスの組み合わせは非常に長いため、部分補完が非常に役立ちます。たとえば、25 種類のコマンドがすべてプレフィックス translationupdateprocess: で始まり、translationupdateprocess は、それだけのオプションを持つ 25 種類の同じ長さのプレフィックスの 1 つです。

bash complete をこのように動作させる方法を誰か知っていますか?

答え1

foo:baz foo:qux bar:eat bar:egg次のコードを使用できます (わかりやすくするためにオプションを置き換えました):

function _command_opt()
{
  local cur cursec command opts
  COMPREPLY=()

  cur="${COMP_WORDS[COMP_CWORD]}"
  cursec=`echo ${cur} | awk -F ':' '{print $1}'`;

  command="${COMP_WORDS[1]}"
  opts="foo bar"

  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "baz qux" -- ${cursec}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "eat egg" -- ${cursec}) ); return 0;;
    *) ;;
  esac

  COMPREPLY=( $(compgen -W "${opts}" -S ":" -- ${cur}) ); compopt -o nospace;
}

complete -F _command_opt -o bashdefault -o default 'command'

と入力するとcommandtab第 1 レベルのリストが表示されfoo: bar:、 と入力するとftabtab第 2 レベルの補完リストが表示されますbaz qux。次に、 と入力するqtabと完全なコマンド ラインが表示されますcommand foo:qux

それが役に立てば幸い。

関連情報