
Imagine que eu tenho um comando 'command' que recebe argumentos foo:bar foo:foo bar:bar ou bar:foo. Posso escrever um script de conclusão de linha de comando que posso fornecer em meu ambiente para me fornecer uma conclusão semelhante a esta:
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'
No entanto, se eu digitar, command f[tab][tab]
recebo foo:bar e foo:foo listados, mas nenhum deles é concluído na minha linha de comando (porque eles ainda não são distintos. O que eu gostaria de realizar é que isso produza command foo:
e deixe meu cursor no final de a palavra atual (em vez de adicionar um espaço) para permitir que eu digite b
ou f
e tab novamente para finalizar o comando O problema do exemplo é apenas para mostrar o que quero dizer ... no caso real, as combinações de prefixo: sufixo são bastante longas. , portanto, a conclusão parcial seria realmente benéfica, por exemplo, 25 comandos diferentes que começam com o prefixo translationupdateprocess: e translationupdateprocess é um dos 25 prefixos diferentes igualmente longos com tantas opções.
Alguém sabe uma maneira de completar o bash para operar dessa maneira?
Responder1
Você pode usar o seguinte código (substituí suas opções para foo:baz foo:qux bar:eat bar:egg
esclarecer):
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'
Ao digitar, command
tabvocê pode obter a lista do primeiro nível foo: bar:
e, ao digitar, f
tabtabobtém a lista de conclusão do segundo nível baz qux
. Em seguida, você pode digitar q
tabpara obter a linha de comando completa command foo:qux
.
Espero que ajude.