it-swarm-ja.com

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

引数をとるコマンド 'command'があると想像してください。foo:bar foo:foo bar:barまたはbar:foo環境にソースできるコマンドライン補完スクリプトを記述して、次のような補完を与えることができます。

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:が生成され、カーソルが(スペースを追加するのではなく)現在のWordの終わりで、bまたはfと入力し、もう一度Tabキーを押してコマンドを終了します。問題の例は、意味を表示することだけです。 ...実際の場合、prefix:suffixの組み合わせは非常に長いため、部分的な完了は非常に有益です。たとえば、すべてがprefix translationupdateprocess:で始まる25の異なるコマンドであり、translationupdateprocessは、その数のオプションを持つ25の異なる同じ長さのプレフィックスの1つです。

このように操作するためにbashを完成させる方法を知っている人はいますか?

3
Robert

次のコードを使用できます(明確にするために、オプションを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'

commandと入力するとtab 最初のレベルのリストfoo: bar:を取得でき、fと入力するとtabtab 第2レベルbaz quxの完了リストを取得します。次に、qと入力できますtab 完全なコマンドラインを取得するにはcommand foo:qux

それが役に立てば幸い。

0
Andrés Morales