Autocompletado en BASH
El autocompletado es una de las características imprescindibles a la hora de trabajar comodamente desde una terminal. En este artículo veremos muy por encima como funciona usando un ejemplo práctico para que vlc autocomplete nuestra lista de películas.
Básicamente el autocompletado es un mecanismo muy sencillo. Al pulsa el tabulador bash pregunta a una serie de scripts si saben como continuar con el comando que se está introduciendo. Estos scripts leen la pantalla y en función de unas reglas sintácticas más o menos básicas devuelven un contenido válido con el que continuar. Estas reglas pueden alimentarse a través de una lista de palabras, un fichero con todas las posibles o incluso la salida de un comando.
Bien, asi pues si queremos que el comando vlc nos muestre las posibles películas a reproducir lo que tendremos es que añadir un script al mecanismo de autocompletado que devuelva las que coincidan con el texto que vamos introduciendo.
Pero hagamos las cosas pensando en su facilidad de uso... Linux tiene un simple sistema de alias para comandos que nos van a ayudar a que todo quede más bonito.
Primero definiremos el comando pelis como alias de vlc. Para ello añadiremos a nuestro fichero .bashrc la línea:
alias pelis=vlc
Y añadiremos el autocompletado, para ello crearemos el fichero pelis_completion con nuestro editor favorito e introduciremos el código necesario:
vi pelis_completion
#!/bin/bash
######
#Esta función nos listará los videos disponibles
#Gasta una serie de variables especiales
#$COMP_WORDS -> Lo que hemos escrito (toda la línea)
#$COMP_CWORD -> La cantidad de palabras escritas
#$COMPREPLY -> La "respuesta" para el autocompletado
######
#### Variables globales
#La ruta a nuestro directorio con pelis. En este caso he puesto el temporal
DIRECTORIO_CON_VIDEOS="/tmp"
#O podemos hacerlo universal si está configurado un directorio para videos descomentando esta línea
#[ "$(xdg-user-dir VIDEO)1" != "$HOME"1 ] && DIRECTORIO_CON_VIDEOS=$(xdg-user-dir VIDEO)
####
#Función que procesa lo que hemos escrito
#Devuelve una cadena con los valores válidos del autocompletado
####
videos_disponibles(){
#ACTUAL almacena el texto que estamos introduciento
ACTUAL="${COMP_WORDS[COMP_CWORD]}"
#ANTERIOR almacena el texto anterior que hemos introducido. No la usamos pero es por mostrar un ejemplo
ANTERIOR="${COMP_WORDS[COMP_CWORD-1]}"
#Al resultado del comando find le decimos que nos muestre solo el nombre y no la ruta mediante -exec basename
#Va a quedar muy chulo, hazme caso :)
FICHEROS=$(find $DIRECTORIO_CON_VIDEOS -name "${ACTUAL}*" -exec basename "{}" \;)
#Filtramos los resultados para mostrar las posibles opciones
RESULTADOS=($(compgen -W "$FICHEROS" -- ${ACTUAL}))
COMPREPLY=("${RESULTADOS[@]}")
#Si solo hay un valor posible entonces ponemos la ruta completa al fichero, asi el alias "pelis" podrá ejecutar vlc correctamente
[ ${#COMPREPLY[@]} -eq 1 ] && COMPREPLY=("${DIRECTORIO_CON_VIDEOS}/${RESULTADOS[0]}")
}
#### Programa principal ####
#Le decimos que queremos que complete mediante la función "videos_disponibles" los parametros de la orden *peli*
complete -F videos_disponibles pelis
Posteriormente bastará con copiar el fichero al directorio /etc/bash_completion.d y reiniciar la terminal (vamos, cerrar kosole, xterm, la que sea..). A partir de ese momento podremos usar el autocompletado cada vez que usemos el alias pelis