Cómo agregar autocompletado con TAB a tus comandos personalizados en Linux

🚀 Cómo agregar autocompletado con TAB a tus comandos personalizados en Linux

Cuando comenzamos a crear nuestros propios comandos en Linux, normalmente nos conformamos con que funcionen:

buscar -s linux

o

miip

Pero existe una característica que hace que una herramienta casera se sienta mucho más profesional:

👉 el autocompletado con la tecla TAB.

Es exactamente lo que hacen herramientas como:

git
apt
docker
systemctl

Por ejemplo:

git ch<TAB>

se convierte automáticamente en:

git checkout

o:

systemctl re<TAB>

puede completarse como:

systemctl restart

Lo mejor es que cualquier comando que crees puede tener esta misma funcionalidad.


¿Cómo funciona el autocompletado?

Cuando presionas TAB, Bash busca si existe una regla de autocompletado asociada al comando que acabas de escribir.

Por ejemplo:

buscar -<TAB>

Bash puede recibir una lista de opciones válidas:

-s
-h
-u
--search
--help
--update

y mostrarlas automáticamente.

Todo esto se controla mediante scripts especiales de Bash.


Comprobando si Bash Completion está instalado

La mayoría de distribuciones modernas ya lo incluyen.

Puedes verificarlo con:

dpkg -l | grep bash-completion

Si no aparece instalado:

sudo apt install bash-completion

Nuestro comando de ejemplo

Supongamos que tenemos un comando llamado:

buscar

que acepta:

buscar -s linux
buscar --search linux
buscar -u
buscar --update

Queremos que TAB complete esas opciones.


Crear el script de autocompletado

Creamos un archivo:

buscar-completion

Contenido:

_buscar_completion()
{
    local opciones

    opciones="-s --search -u --update -h --help"

    COMPREPLY=(
        $(compgen -W "${opciones}" -- "${COMP_WORDS[COMP_CWORD]}")
    )
}

complete -F _buscar_completion buscar

¿Qué significa cada parte?

Función de completado

_buscar_completion()

Es la función que Bash ejecutará al presionar TAB.


Lista de opciones

opciones="-s --search -u --update -h --help"

Aquí definimos las opciones válidas.


compgen

compgen -W

Genera sugerencias automáticamente.

Por ejemplo:

Si escribimos:

buscar --s<TAB>

Bash revisará:

-s
--search
-u
--update
-h
--help

y encontrará:

--search

complete

complete -F _buscar_completion buscar

Asocia la función al comando.


Probarlo sin reiniciar

Podemos cargarlo manualmente:

source buscar-completion

Ahora probamos:

buscar --<TAB>

y veremos las opciones disponibles.


Instalar el autocompletado permanentemente

La ubicación recomendada es:

/etc/bash_completion.d/

Copiamos:

sudo cp buscar-completion /etc/bash_completion.d/buscar

Abrimos una terminal nueva.

Ahora funcionará siempre.


Autocompletar nombres de archivo

Esto es extremadamente útil.

Supongamos que creamos una herramienta llamada:

hashfile

que calcula hashes.

Uso:

hashfile archivo.iso

Podemos hacer que TAB complete archivos automáticamente.

Archivo:

hashfile-completion

Contenido:

_hashfile_completion()
{
    COMPREPLY=(
        $(compgen -f -- "${COMP_WORDS[COMP_CWORD]}")
    )
}

complete -F _hashfile_completion hashfile

Resultado

Si escribimos:

hashfile ubu<TAB>

Bash puede completar:

hashfile ubuntu.iso

Autocompletar directorios

Para herramientas que trabajan con carpetas:

_backup_completion()
{
    COMPREPLY=(
        $(compgen -d -- "${COMP_WORDS[COMP_CWORD]}")
    )
}

complete -F _backup_completion backup

Ejemplo práctico: comando backup

Supongamos este comando:

backup /home/usuario/Documentos

Con TAB:

backup /ho<TAB>

Bash completa:

backup /home/

Autocompletado inteligente según la posición

Aquí es donde empiezan a trabajar las herramientas profesionales.

Queremos que:

buscar -s linux

muestre opciones cuando estamos escribiendo el primer argumento.

Creamos:

_buscar_completion()
{
    local actual

    actual="${COMP_WORDS[COMP_CWORD]}"

    if [[ ${COMP_CWORD} -eq 1 ]]; then
        COMPREPLY=(
            $(compgen -W "-s --search -u --update -h --help" -- "$actual")
        )
    fi
}

¿Qué es COMP_CWORD?

Bash numera cada palabra.

Ejemplo:

buscar -s linux

Internamente:

COMP_WORDS[0] = buscar
COMP_WORDS[1] = -s
COMP_WORDS[2] = linux

Y:

COMP_CWORD

indica en cuál estamos escribiendo.


Crear sugerencias dinámicas

Ahora viene una técnica muy interesante.

Imaginemos que nuestro comando descarga categorías:

buscar redes
buscar linux
buscar bash
buscar python

Podemos generar sugerencias automáticamente.

_buscar_completion()
{
    local actual

    actual="${COMP_WORDS[COMP_CWORD]}"

    COMPREPLY=(
        $(compgen -W "linux bash python redes seguridad tor" -- "$actual")
    )
}

Resultado

Escribimos:

buscar li<TAB>

Y Bash completa:

buscar linux

Consultar datos desde un archivo

También podemos leer opciones desde un archivo.

categorias=$(cat ~/.comandos-busqueda/categorias.txt)

COMPREPLY=(
    $(compgen -W "$categorias" -- "$actual")
)

Así las sugerencias cambian automáticamente cuando cambia el archivo.


Cómo saber si un comando tiene autocompletado

Puedes usar:

complete -p

Para listar todos los comandos registrados.


El truco que usan muchas aplicaciones

Una técnica muy común es que el propio programa genere las opciones.

Por ejemplo:

buscar --list-options

devuelve:

linux
bash
python
redes
tor

Y el script de Bash simplemente ejecuta:

opciones=$(buscar --list-options)

De esta forma el autocompletado siempre está sincronizado con el programa.


Estructura recomendada

Si tienes una herramienta propia:

/usr/local/bin/buscar
/etc/bash_completion.d/buscar
/opt/buscar/

Tendrás:

  • comando global
  • autocompletado
  • archivos organizados

Exactamente igual que muchas aplicaciones profesionales.


Agregar autocompletado con TAB es una de las mejoras más simples y más impresionantes que puedes hacer a tus herramientas personalizadas.

No necesitas modificar Bash ni programar nada complejo. Basta con crear una pequeña función que indique a Bash qué opciones debe sugerir.

Una vez que empiezas a usar autocompletado en tus propios comandos, es difícil volver atrás. Tus herramientas se sienten más rápidas, más cómodas y mucho más profesionales, acercándose al comportamiento de aplicaciones como Git, Docker o Systemctl.

Deja un comentario