Encontrei a solução para os dois problemas!
-
Para não acrescentar um espaço, use a opção
nospace
. Isso pode ser feito de duas maneiras:- Passe para o
complete
:%complete -o nospace -F _chromium chromium
- Use o
compopt
integrado:compopt -o nospace
(para ativar a opção)compopt +o nospace
(para desativar a opção)
Eu encontrei na documentação do Bash em gnu.org, 8.7 Complementação Programável Builtins .
- Passe para o
- Conclusão de arquivos.
-
peterph sugeriu para usar o sinalizador
-f
comcompgen
. Eu segui esse conselho e o implementei comoCOMPREPLY=( $(compgen -f "$cur") )
. Isso funcionou bem, até que eu tentei completar um caminho contendo espaços.
No estouro de pilha, encontrei esta resposta que recomenda a criação manual da lista de conclusão (sem usarcompgen
). Essa abordagem funcionou bem. - Use a opção
filenames
para informar ao Readline que o compspec gera nomes de arquivos, para que ele possa:- executa qualquer processamento específico de nome de arquivo (como adicionar uma barra a nomes de diretório, citar caracteres especiais ou suprimir espaços à direita)
- usa cores diferentes para indicar o tipo de arquivo (com
colored-stats
ativado)
-
peterph sugeriu para usar o sinalizador
Com ajuda da manipulação de string do Bash (para expandir ~
e lidar com espaços) Eu construí um bash scripts de conclusão que atende a todos os critérios estabelecidos na questão.
_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=
if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
compopt -o filenames
COMPREPLY=(*)
return 0
fi
# Handle --xxxxx=path
if [[ ${prev} == '=' ]] ; then
# Unescape space
cur=${cur//\ / }
# Expand tilder to $HOME
[[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
# Show completion if path exist (and escape spaces)
compopt -o filenames
local files=("${cur}"*)
[[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
return 0
fi
# Handle other options
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
# If there's only one option, without =, then allow a space
compopt +o nospace
fi
return 0
}
complete -o nospace -F _chromium chromium