私が使用するコマンドにプログラム可能な補完を提供する関数を作成しています(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」の形式に変更することはできません。