10

私が使用するコマンドにプログラム可能な補完を提供する関数を作成しています(http://www.debian-administration.org/articles/317の助けを借りて)。シェルスクリプトの使用法は次のとおりです。

script.sh command [command options]

ここで、コマンドは「foo」または「bar」のいずれかであり、「foo」のコマンドオプションは「a_foo=value」および「b_foo=value」であり、「bar」のコマンドオプションは「a_bar=value」および「b_bar=value」です。 。

私が使用している構成は次のとおりです。

_script() {
  local cur command all_commands                                                                    
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  command="${COMP_WORDS[1]}"
  all_commands="foo bar"
  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
    *) ;;
  esac
  COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
  return 0
}

complete -F _script script.sh

これは主に私が望むように機能します:

% script.sh f[TAB]

完了:

% script.sh foo 

(必要に応じて末尾のスペースがあります)

ただし、これは次のとおりです。

% script.sh foo a[TAB]

完了:

% script.sh foo a_foo 

(末尾のスペースもあります)

末尾のスペースを「=」に置き換えたいのですが。または、compgenに渡される値を "--a_foo = --b_foo ="に変更することもできます。その場合は、末尾のスペースを削除するだけで済みます。

残念ながら、コマンドは私の制御下にないため、コマンドラインオプションを「--a_foo=value」ではなく「--a_foovalue」の形式に変更することはできません。

4

1 に答える 1

14

まず、COMPREPLYに=を追加する必要があります。

COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) )

次に、=withの後にスペースを追加しないように完了を指示する必要があります

compopt -o nospace

したがって、スクリプト行は次のようになります。

foo)
  COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) ); compopt -o nospace; return 0;;
bar)
  COMPREPLY=( $(compgen -W "--a_bar= --b_bar=" -- ${cur}) ); compopt -o nospace; return 0;;
于 2012-04-12T18:55:24.587 に答える