2010-08-19 13 views
22

Sto provando a scrivere una piccola applicazione di avvio comandi e vorrei utilizzare i completamenti di schede di bash nel mio sistema di completamento. Sono stato in grado di ottenere un elenco di completamenti per i comandi generali utilizzando compgen -abck.
Tuttavia, vorrei anche ottenere i completamenti per comandi specifici: ad esempio, l'input git p dovrebbe visualizzare il completamento per i comandi di git.Accesso ai comandi di bash per comandi specifici a livello di programmazione

Esiste un modo per utilizzare lo standard compgen? In caso contrario, ci sono altri modi per ottenere un elenco di completamenti a livello di codice?

[MODIFICA: per chiarire, non sto provando a fornire il completamento a bash - la mia app è un comando di avvio della GUI. Mi piacerebbe semplicemente utilizzare i completamenti esistenti di bash nella mia app.]

risposta

12

io non so davvero come funziona, ma il awesome window manager utilizza il seguente codice Lua per ottenere l'accesso al risultato di completamento bash:

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. Via complete -p troviamo complete -o bashdefault -o default -o nospace -F _git git. Ricordiamo "_git" per dopo.
  2. La lunghezza di "git l" è 5, quindi abbiamo impostato COMP_COUNT = 6. Stiamo completando il primo argomento su "git", quindi COMP_CWORD = 1.

Tutti insieme abbiamo utilizzare il seguente script:

__print_completions() { 
    printf '%s\n' "${COMPREPLY[@]}" 
} 

# load bash-completion functions 
source /etc/bash_completion 

# load git's completion function 
_completion_loader git 

COMP_WORDS=(git l) 
COMP_LINE='git l' 
COMP_POINT=6 
COMP_CWORD=1 
_git 
__print_completions 

in uscita: "log"

+0

Il codice sembra fare esattamente quello che voglio fare con la mia app. Avrò bisogno di portarlo su Bash regolare, ma è comunque molto utile. Molte grazie! –

+0

Ho fatto alcuni test e questo è ciò che viene eseguito per completare "git l":/usr/bin/env bash -c 'source/etc/bash_completion; __print_completions() {for ((i = 0; i <$ {# COMPREPLY [*]}; i ++)); do echo $ {COMPREPLY [i]}; fatto }; COMP_WORDS = (git l); COMP_LINE = "git l"; COMP_COUNT = 6; COMP_CWORD = 1; _idiota; __print_completions ' –

+0

"_git" si trova tramite "complete -p" che stampa "complete -o bashdefault -o default -o nospace -F _git git". Quindi se la prima parola è "git", chiama "_git". COMP_COUNT è la lunghezza della stringa finora più una. COMP_CWORD è la parola da completare (la prima è l'indice 0). –

2

Controllare nella directory /etc/bash_completion.d/. È qui che restano i diversi script di completamento del comando.

+0

ho avuto un poke in giro in/etc/bash_completion.d/', ma non hanno ancora elaborato un modo semplice per ottenere i completamenti contenuti all'interno ancora molto facilmente. (Sto usando Python per accedere ai completamenti, rendendo le cose leggermente più complicate.) Speravo che ci potesse essere un modo più semplice per accedere ai completamenti specifici del comando. –

4

Dai un'occhiata all'amministrazione Debian An introduction to bash completion - è abbastanza facile da capire - a proposito, ha anche un part two.

+1

Questa sembra una guida decente per scrivere funzioni che forniscono * set di completamento per i comandi.Tuttavia, l'OP sta cercando un modo per * richiamare * tale funzionalità a livello di programmazione, nello stesso modo in cui lo fa bash quando l'utente preme la chiave 'TAB'. – intuited

+2

PS: ordinariamente non vorrei downvotare qualcosa di simile, perché fornisce informazioni utili, ma al momento era a 4 punti e la risposta effettiva alla domanda era a 1. Speriamo in questo modo che le persone abbiano meno probabilità di spendere tempo di leggere attraverso la pagina collegata alla ricerca di una risposta che non è lì. – intuited

0

Ecco un semplice ma lavorando esempio in bash:

function foo_completion() 
{ 
    local currentWord=${COMP_WORDS[COMP_CWORD]} 
    local completionList="" 

    case "${COMP_CWORD}" in 
     "1") 
      completionList="command1 command2 command3"; 
      ;; 
     "2") 
      completionList="param1 param2 param3"; 
      ;; 
    esac 

    COMPREPLY=($(compgen -W "${completionList}" -- ${currentWord})) 
} 

complete -F foo_completion foo 

Con questo tipo di codice, si otterrà commandn completato quando si digita "foo c" + scheda e paramN completata quando si digita "foo command1 p "+ scheda

È possibile calcolare l'elenco di completamento dall'help dei comandi.

MY2C

0

ho inciso su questo script un po 'indietro che vi dà abbastanza preciso Man-page Bash Completion So che altre persone hanno fatto cose simili con l'analisi --help uscita opzione.

+0

Grande sceneggiatura, ma non proprio quello che sto cercando di ottenere. Grazie comunque per il collegamento ad esso però. –

Problemi correlati