
引数 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
もう一度f
Tab キーを押してコマンドを終了できるようにすることです。この例の問題は、私が言っていることを示すためだけのものです...実際のケースでは、プレフィックス:サフィックスの組み合わせは非常に長いため、部分補完が非常に役立ちます。たとえば、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'
と入力するとcommand
tab第 1 レベルのリストが表示されfoo: bar:
、 と入力するとf
tabtab第 2 レベルの補完リストが表示されますbaz qux
。次に、 と入力するq
tabと完全なコマンド ラインが表示されますcommand foo:qux
。
それが役に立てば幸い。