Cuando uso un programa como svn
y escribo en Gnome Terminal:
svn upd
y presione Tabque se complete automáticamente para:
svn update
¿Es posible hacer algo así en mi script bash personalizado?
Respuesta1
Tendrás que crear un nuevo archivo:
/etc/bash_completion.d/foo
Para un autocompletado estático ( --help
/ --verbose
por ejemplo), agregue esto:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
es una matriz que contiene todas las palabras individuales en la línea de comando actual.COMP_CWORD
es un índice de la palabra que contiene la posición actual del cursor.COMPREPLY
es una variable de matriz de la cual Bash lee las posibles terminaciones.
Y el compgen
comando devuelve la matriz de elementos de --help
y --verbose
que --version
coinciden con la palabra actual "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Respuesta2
Aquí tienes un tutorial completo.
Tengamos un ejemplo de secuencia de comandos llamada admin.sh
en la que le gustaría que funcione el autocompletado.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Tenga en cuenta la opción shortlist
. Al llamar al script con esta opción se imprimirán todas las opciones posibles para este script.
Y aquí tenéis el script de autocompletar:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Tenga en cuenta que el último argumento a completar es el nombre del script al que desea agregar el autocompletado. Todo lo que necesitas hacer es agregar tu script de autocompletar a bashrc como:
source /path/to/your/autocomplete.sh
o copiarlo a:
/etc/bash_completion.d
Respuesta3
Puedes usar elFinalización programable. Eche un vistazo a /etc/bash_completion
y /etc/bash_completion.d/*
para ver algunos ejemplos.
Respuesta4
Si todo lo que desea es un autocompletado simple basado en palabras (por lo que no se debe completar un subcomando ni nada parecido), el complete
comando tiene una -W
opción que simplemente hace lo correcto.
Por ejemplo, tengo las siguientes líneas en mi .bashrc
para autocompletar un programa llamadojupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Ahora jupyter <TAB> <TAB>
se completa automáticamente para mí.
Eldocumentosen gnu.org son útiles.
Parece depender de que la IFS
variable esté configurada correctamente, pero eso no me ha causado ningún problema.
Para agregar la finalización del nombre de archivo y la finalización BASH predeterminada, use la -o
opción:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Para usar esto en zsh, agregue el siguiente código antes de ejecutar el complete
comando en su ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi