2010-09-11 803 views
32

In bash, gli eseguibili come mplayer e "convert" di imagemagick dispongono di una funzionalità di completamento automatico avanzata sui relativi argomenti della riga di comando. Per esempio, se si digitaCompletamento automatico argomenti della riga di comando

mplayer <tab><tab> 

in una delle mie cartelle video, quindi MPlayer elencherà tutti i file multimediali situati in quella cartella, e solo i file multimediali.

Allo stesso modo, se digito

convert -<tab><tab> 

poi vedrò tutte le possibili opzioni dello script convertito, che è grande.

La mia domanda è come ottenere una funzionalità simile, usando script bash, ruby ​​o python?

risposta

30

Questo è un esempio del completamento intelligente di BASH. Una descrizione di base è here, una guida alla scrittura delle proprie estensioni è here e un'altra guida (basata su Debian) è here. Ed ecco un fuller featured introduction al comando complete (il comando che facilita questo comportamento).

EDIT: fisso link morti

3

Questa funzionalità in bash è fornita da bash-completion e funzionalità simile è incluso nel zsh. Se si desidera aggiungere il supporto per alcuni programmi non attualmente supportati da uno di questi strumenti, è necessario scrivere le proprie estensioni per loro.

1

Il collegamento per scrivere la propria estensione nella risposta accettata è morto. Citando qui dal http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/

Bash fornisce un modo di specificare le parole chiave, e li utilizzano per completamento automatico argomenti della riga di comando per l'applicazione. Io uso vim come wiki, task manager e contatti. Il sistema vt helptags consente a di indicizzare il contenuto invece di cercarlo e la velocità lo mostra. Una caratteristica che volevo aggiungere a questo era accedere a questi tag dall'esterno.

questo può essere fatto in un modo dritto in avanti:

$ vim -t tagname 

Questo mi porta direttamente a specifici contenuti contrassegnati con questo tag. Tuttavia, questo sarà più produttivo se posso fornire il completamento automatico per i tag.

Ho prima definito una funzione di Bash per la riga di comando vim. Ho aggiunto il seguente codice al mio file .bashrc:

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

Bash completamento programmabile è fatto da sourcing dello script /etc/bash-completion. Lo script ci consente di aggiungere il nostro script di completamento automatico /etc/bash-completion.d/ ed esegue ogni volta che viene chiamato. Così ho aggiunto un file di script chiamato get con il codice seguente in quella directory.

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

Insieme con la mia wiki Io lo uso per tutto il lavoro di documentazione e al volte il codice troppo. Uso anche il file dei tag creato dal mio codice. Il sistema di indicizzazione mi consente di ricordare il contesto anziché i nomi di file e le directory.

È possibile modificare questo sistema per qualsiasi strumento che si utilizza. Tutto ciò di cui hai bisogno è da fare è ottenere un elenco delle parole chiave per il tuo comando e darlo a il sistema di completamento programmabile Bash.

+0

Grazie! Ho appena corretto i collegamenti nella risposta accettata. –

Problemi correlati