Autocompletado en bash personalizado (para tus programas!)
Bash incorpora una característica que permite el autocompletado en una terminal de los parámetros que acepta un programa. Para esto utiliza un script con diversas funciones, y permite que incorporando un archivo y ciertos comandos, podamos definir como se autcompletarán los programas que querramos.
Por ejemplo, tenemos hecho un programa con Milton y Daiana, que acepta varios parámetros. Hay algunos que no los usamos hace tiempo, y para no estar consultando la ayuda, pensamos que estaría bueno que se autocompletara.
El programa está hecho en mono, y se ejecuta haciendo
$ ./programa.exe |
o bien
$ mono programa.exe |
Aquí el archivo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Author: Nacho # /etc/bash_completion.d/programa # copy it there and enjoy magic, compadre! # _programa() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="-h -? --help -r --reemp -e -f --extrae-flex -c -g -d --vft" if [[ "${cur}" == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) else _filedir '@(xml|sql)' fi } complete -F _programa $filenames programa.exe complete -F _command $filenames mono |
La línea 12 indica las opciones que acepta el programa.
La línea 17 indica que se listen (si no es que estoy intentando poner alguna opción) los directorios y archivos pero los XML y SQL únicamente.
La línea 20 indica bajo que nombre de ejecutable se completará y qué función es la encargada de tal tarea.
La línea 21 es la que indica que «mono» es un «command» al igual que otros definidos (sudo, fakeroot, nohup) que requieren autocompletado luego para el programa que le sigue.
En vez de listar la línea 12, se podría haber hecho que el programa en cuestión devuelva por defecto la lista de los parámetros que acepta. La forma de hacer esto sería reemplazar esa línea por:
12 | opts=`mono programa.exe -p` |
Python tiene un módulo para realizar esto en forma más sencilla: optcomplete.
Espero les sea de utilidad!