web-dev-qa-db-fra.com

Arguments de ligne de commande de saisie semi-automatique

En bash, les exécutables tels que mplayer et "convert" imagemagick ont ​​une fonctionnalité d'auto-complétion sympa sur leurs arguments de ligne de commande. Par exemple, si je tape

mplayer <tab><tab>

dans l'un de mes dossiers vidéo, alors mplayer répertorie tous les fichiers multimédias situés dans ce dossier, et uniquement les fichiers multimédias.

De même, si je tape

convert -<tab><tab>

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

Ma question est de savoir comment obtenir une fonctionnalité similaire, en utilisant bash, Ruby ou python?

40
Régis B.

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

EDIT: liens morts fixes

38
Andy

Le lien pour écrire votre propre extension dans la réponse acceptée est mort. Citant ici de 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 de les utiliser pour compléter automatiquement les arguments de ligne de commande pour votre application. J'utilise vim comme wiki, gestionnaire de tâches et contacts. Le système d'aide-mémoire de Vim me permet d'indexer le contenu au lieu de le parcourir, et la vitesse le montre. Une fonctionnalité que je voulais ajouter à cela était d'accéder à ces balises depuis l'extérieur de vim.

Cela peut être fait de manière simple:

$ vim -t tagname

Cela m'amène directement au contenu spécifique marqué à l'aide de 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 fichier .bashrc:

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

La complétion programmable de Bash est effectuée en recherchant le script/etc/bash-complètement. Le script nous permet d'ajouter notre répertoire de script d'auto-complétion /etc/bash-completion.d/ et l'exécute 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 parfois aussi pour le code. J'utilise également le fichier de balises 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 que vous avez à faire est d'obtenir une liste des mots-clés pour votre commande et de la donner au système d'achèvement programmable Bash.

5
hojusaram

Cette fonctionnalité dans bash est fournie par bash-compléte et une fonctionnalité similaire est incluse dans zsh. Si vous souhaitez ajouter la prise en charge d'un programme qui n'est actuellement pas pris en charge par l'un de ces outils, vous devez écrire vos propres extensions pour eux.

4
wRAR