Quiero crear un script de finalización de bash que reconozca los argumentos del formulario --arg
y --some-arg=file
.
Después de leer este tutorial y algunos ejemplos /usr/share/bash_completion/completions/
, escribí el siguiente script (para ahorrar tiempo al escribir algunas banderas con 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
Lo guardé ~/bash_completions/chromium
y creé un enlace simbólico usando sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Luego lo cargué usando . /usr/share/bash_completions/completions/chromium
.
Ahora, estoy experimentando dos problemas:
chromium --u<TAB>
se expande achromium --user-data-dir=<SPACE>
(no quiero el espacio).- Las rutas (directorios y archivos) ya no se completan.
¿Cómo puedo resolver estos problemas?
bash
autocomplete
chrome
Rob W
fuente
fuente
Respuestas:
¡He encontrado la solución a ambos problemas!
Para no agregar un espacio, use la
nospace
opción Esto se puede hacer de dos formas:complete
:complete -o nospace -F _chromium chromium
compopt
incorporado:compopt -o nospace
(para habilitar la opción)compopt +o nospace
(para deshabilitar la opción)Lo encontré en la documentación de Bash en gnu.org, 8.7 Builtins de finalización programable .
-f
bandera concompgen
. Seguí ese consejo y lo implementé comoCOMPREPLY=( $(compgen -f "$cur") )
. Esto funcionó bien, hasta que intenté completar una ruta que contenía espacios.En Stack Overflow, encontré esta respuesta que recomienda la creación manual de la lista de finalización (sin usar
compgen
). Este enfoque funcionó bien.filenames
opción para decirle a Readline que compspec genera nombres de archivo, por lo que puede:colored-stats
habilitado)Con la ayuda de la manipulación de cadenas de Bash (para expandir
~
y tratar con espacios), construí un script de finalización de bash que cumple con todos los criterios establecidos en la pregunta.fuente
-f
interruptor para completar la ruta del archivo, pero no completa el/
carácter si es un directorio ... aunque es algo pequeño.Para completar los nombres de archivo, intente pasar
-f
acompgen
.Me temo que no podrá deshacerse de los espacios después de las opciones, ya que así es como funciona la finalización: una vez que encuentra una coincidencia única, la completa por completo.
fuente
-f
. Lo probé, pero no trata correctamente con espacios: la ruta/tmp/foo bar
da como resultado dos entradas de finalización/tmp/foo
ybar
. Acerca de lo no deseado--arg=<SPACE>
: he encontrado la solución a eso, y lo publiqué en la respuesta a continuación .