¿Cómo crear un script con autocompletar?

¿Cómo crear un script con autocompletar?

Cuando uso un programa como svny 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/ --verbosepor 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_WORDSes una matriz que contiene todas las palabras individuales en la línea de comando actual.
  • COMP_CWORDes 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 compgencomando devuelve la matriz de elementos de --helpy --verboseque --versioncoinciden con la palabra actual "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Fuente

Respuesta2

Aquí tienes un tutorial completo.

Tengamos un ejemplo de secuencia de comandos llamada admin.shen 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_completiony /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 completecomando tiene una -Wopción que simplemente hace lo correcto.

Por ejemplo, tengo las siguientes líneas en mi .bashrcpara 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 IFSvariable 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 -oopción:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Para usar esto en zsh, agregue el siguiente código antes de ejecutar el completecomando en su ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

información relacionada