2010-09-11 22 views
32

En bash, los ejecutables como mplayer y imagemagick's "convert" tienen una función de autocompletar genial en sus argumentos de línea de comando. Por ejemplo, si escriboArgumentos de línea de comando de autocompletado

mplayer <tab><tab> 

en una de mis carpetas de vídeo, a continuación, se probarán una lista de todos los archivos multimedia ubicados en esa carpeta, y sólo los archivos multimedia.

Del mismo modo, si escribo

convert -<tab><tab> 

entonces voy a ver todas las opciones posibles de la secuencia de comandos de conversión, que es grande.

Mi pregunta es cómo lograr una funcionalidad similar, usando scripts bash, ruby ​​o python?

Respuesta

30

Este es un ejemplo de la terminación inteligente de BASH. Una descripción básica es here, una guía para escribir sus propias extensiones es here y otra guía (basada en Debian) es here. Y aquí hay un fuller featured introduction al comando complete (el comando que facilita este comportamiento).

EDIT: fija los enlaces muertos

3

Esta funcionalidad en bash es proporcionado por bash-completion y funcionalidad similar está incluido en zsh. Si desea agregar soporte para algún programa que actualmente no es compatible con una de estas herramientas, debe escribir sus propias extensiones para ellos.

1

El enlace para escribir su propia extensión en la respuesta aceptada se ha extinguido. Citando aquí desde http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/

Bash le proporciona una manera de especificar las palabras clave, y utilizarlos para autocompletar argumentos de línea de comandos para su aplicación. Yo uso vim como wiki, administrador de tareas y contactos. El sistema vim helptags permite indexar el contenido en lugar de buscar a través de él, y la velocidad lo muestra. Una característica que quería agregar a esto era acceder a estas etiquetas desde fuera de vim.

Esto se puede hacer de una manera directa:

$ vim -t tagname 

Esto me lleva directamente al contenido específico marcado utilizando esta etiqueta. Sin embargo, esto será más productivo si puedo proporcionar autocompletado para las etiquetas.

Primero definí una función Bash para la línea de comandos de vim. He añadido el siguiente código al archivo .bashrc:

function get { 
    vim -t $1 
} Now I can use get tagname command to get to the content. 

Bash finalización programable se realiza mediante la compra de componentes del guión /etc/bash-finalización. El script nos permite agregar nuestro script de autocompletado /etc/bash-completion.d/ y ejecuta cuando se lo llama. Así que agregué un archivo de script llamado get con el siguiente código en ese directorio.

_get() 
{ 
    local cur 
    COMPREPLY=() 
    #Variable to hold the current word 
    cur="${COMP_WORDS[COMP_CWORD]}" 

    #Build a list of our keywords for auto-completion using 
    #the tags file 
    local tags=$(for t in `cat /home/anadgouda/wiki/tags | \ 
         awk '{print $1}'`; do echo ${t}; done) 

    #Generate possible matches and store them in the 
    #array variable COMPREPLY 
    COMPREPLY=($(compgen -W "${tags}" $cur)) 
} 

#Assign the auto-completion function _get for our command get. 
complete -F _get get Once the /etc/bash-completion is sourced, you will get auto-completion for the tags when you use the get command. 

Junto con mi wiki lo uso para todo el trabajo de documentación y en veces el código también. También uso el archivo de etiquetas creado a partir de mi código. El sistema de indexación me permite recordar el contexto en lugar de los nombres de archivo y directorios.

Puede ajustar este sistema para cualquiera de las herramientas que utiliza. Todo lo que necesita para hacer es obtener una lista de las palabras clave para su comando y darle al el sistema de finalización programable de Bash.

+0

Gracias! Acabo de arreglar los enlaces en la respuesta aceptada. –

Cuestiones relacionadas