Eu quero criar um script de conclusão do bash que reconheça argumentos do formulário --arg
e --some-arg=file
.
Depois de ler este tutorial e alguns exemplos /usr/share/bash_completion/completions/
, escrevi o seguinte script (para economizar tempo ao digitar alguns sinalizadores com o Chromium):
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=file
if [[ ${cur} == "--"*"=" ]] ; then
# Removed failures (is my logic OK?)
return 0
fi
# Handle other options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _chromium chromium
Salvei ~/bash_completions/chromium
e criei um link simbólico usando sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Então eu carreguei usando . /usr/share/bash_completions/completions/chromium
.
Agora, estou com dois problemas:
chromium --u<TAB>
expande parachromium --user-data-dir=<SPACE>
(eu não quero o espaço).- Caminhos (diretórios e arquivos) não são mais concluídos.
Como posso resolver esses problemas?
bash
autocomplete
chrome
Rob W
fonte
fonte
Respostas:
Eu encontrei a solução para ambos os problemas!
Para não acrescentar um espaço, use a
nospace
opção Isso pode ser feito de duas maneiras:complete
:complete -o nospace -F _chromium chromium
compopt
built-in:compopt -o nospace
(para ativar a opção)compopt +o nospace
(para desativar a opção)Encontrei-o na documentação do Bash em gnu.org, 8.7 Construções programáveis de conclusão .
-f
bandeira comcompgen
. Eu segui esse conselho e o implementei comoCOMPREPLY=( $(compgen -f "$cur") )
. Isso funcionou bem, até que eu tentei concluir um caminho contendo espaços.No Stack Overflow, encontrei esta resposta que recomenda a criação manual da lista de conclusão (sem usar
compgen
). Essa abordagem funcionou bem.filenames
opção para informar ao Readline que o compspec gera nomes de arquivos, para que ele possa:colored-stats
ativado)Com a ajuda da manipulação de cadeias de caracteres de Bash (para expandir
~
e lidar com espaços), construí scripts de conclusão do bash que atendem a todos os critérios estabelecidos na pergunta.fonte
-f
switch para concluir o caminho do arquivo, mas ele não conclui o/
char se for um diretório ... mas é uma coisa pequena.Para completar os nomes de arquivos, tente passar
-f
paracompgen
.Receio que você não consiga se livrar dos espaços após as opções, pois é assim que a conclusão funciona - uma vez que encontra uma correspondência única, ela a completa completamente.
fonte
-f
. Eu tentei, mas ele não lida corretamente com espaços: O caminho/tmp/foo bar
resulta em duas entradas de conclusão/tmp/foo
ebar
. Sobre os indesejados--arg=<SPACE>
: Encontrei a solução para isso e postei na resposta abaixo .