2010-09-11 5 views
32

In bash, les exécutables tels que mplayer et "convert" de imagemagick disposent d'une fonction d'auto-complétion sur leurs arguments de ligne de commande. Par exemple, si je tapeArguments de ligne de commande à saisie semi-automatique

mplayer <tab><tab> 

dans un de mes dossiers vidéo, puis mplayer listera tous les fichiers multimédia situés dans ce dossier, et seuls les fichiers multimédias.

De même, si je tape

convert -<tab><tab> 

alors je vais voir toutes les options possibles du script de conversion, ce qui est génial.

Ma question est comment obtenir une fonctionnalité similaire, en utilisant des scripts bash, ruby ​​ou python?

Répondre

30

Ceci est un exemple de l'achèvement intelligent de BASH. Une description de base est here, un guide pour écrire vos propres extensions est here et un autre guide (basé sur Debian) est here. Et voici une fuller featured introduction à la commande complete (la commande qui facilite ce comportement).

EDIT: liens morts fixe

3

Cette fonctionnalité bash est fourni par bash-completion et des fonctionnalités similaires sont inclus dans zsh. Si vous souhaitez ajouter un support pour un programme non supporté par l'un de ces outils, vous devez écrire vos propres extensions.

1

Le lien vers l'écriture de votre propre extension dans la réponse acceptée est mort. Ici de citer http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/

Bash vous offre un moyen de spécifier vos mots-clés, et les utiliser pour arguments de ligne de commande complète auto pour votre application. J'utilise vim comme wiki, gestionnaire de tâches et contacts. Le système vim helptags permet moi indexer le contenu au lieu de chercher à travers elle, et la vitesse le montre. Une fonctionnalité que je voulais ajouter à cela était d'accéder à ces balises de l'extérieur de vim.

Cela peut se faire de manière simple:

$ vim -t tagname 

Cela me conduit directement à un contenu spécifique marqué en utilisant cette balise. Cependant, cela sera plus productif si je peux fournir une auto-complétion pour les balises .

J'ai d'abord défini une fonction Bash pour la ligne de commande vim. J'ai ajouté le code suivant à mon .bashrc:

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

Bash achèvement programmable se fait par l'approvisionnement /etc/script bash-completion. Le script nous permet d'ajouter le répertoire /etc/bash-completion.d/ du script et de l'exécuter chaque fois qu'il est appelé. J'ai donc ajouté un fichier de script appelé get avec le code suivant dans ce répertoire.

_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. 

Avec mon wiki, je l'utilise pour tout le travail de documentation et à fois le code aussi. J'utilise aussi le fichier de tags créé à partir de mon code. Le système d'indexation me permet de me souvenir du contexte au lieu des noms de fichiers et des répertoires.

Vous pouvez modifier ce système pour l'un des outils que vous utilisez. Tout ce dont vous avez besoin est d'obtenir une liste des mots-clés pour votre commande et donnez-le à le système de complétion programmable Bash.

+0

Merci! Je viens de corriger les liens dans la réponse acceptée. –

Questions connexes