2012-05-10 14 views
20

C'è qualcosa che mi confondere quando implementare una funzione di auto-completamento bash che mi metterò in /etc/bash_completion.d/Come resettare COMP_WORDBREAKS senza influenzare altri script di completamento?

Al fine di raggiungere qualche caratteristica, voglio rimuovere l'interruzione di parola caratteri due punti (:) dalla variabile $COMP_WORDBREAKS e aggiungere una barra (/) all'inizio di $COMP_WORDBREAKS.

COMP_WORDBREAKS=" /'><=;|&(" 
_mytool() 
{ 
    local cur=${COMP_WORDS[COMP_CWORD]} 
    compopt -o nospace 

    # my implement here 

    COMPREPLY=($(compgen ..........my_implement......... -- $cur)) 
} 
complete -F _mytool mytool 

Tuttavia, non riesco a ripristinare COMP_WORDBREAKS direttamente perché il valore è condiviso con altri script di completamento. Quando viene chiamata la funzione di completamento, l'array variabile COMP_WORDS è già stato compilato, quindi le modifiche locali COMP_WORDBREAKS non hanno alcun effetto.

Esiste una soluzione per la modifica di COMP_WORDBREAKS in uno script di completamento e nessun effetto per altri script?

$ echo $BASH_VERSION 
4.2.10(1)-release 

risposta

20

Modifica $COMP_WORDBREAKS nello script di completamento non è il metodo consigliato (in quanto è una variabile globale e potrebbe influenzare il comportamento degli altri script di completamento - per esempio ssh).

Tuttavia, il completamento di bash offre alcuni metodi di supporto che è possibile utilizzare per raggiungere il proprio obiettivo.

Il modo consigliato per gestire non-parola-breaking caratteri nelle parole di completamento è quello di utilizzare i due metodi di supporto:

  • _get_comp_words_by_ref con l'-n EXCLUDE opzione
    • ottiene la parola-per-completo senza considerando i personaggi in ESCLUDERE come parola rompe
  • __ltrim_colon_completions

Quindi, ecco un esempio di base di come un gestire due punti (:) in termini di completamento:

_mytool() 
{ 
    local cur 
    _get_comp_words_by_ref -n : cur 

    # my implementation here 

    COMPREPLY=($(compgen ..........my_implement......... -- $cur)) 

    __ltrim_colon_completions "$cur" 
} 
complete -F _mytool mytool 

Come suggerimento finale, i metodi di supporto si trovano in /etc/bash_completion. Dai uno sguardo all'interno per leggere una descrizione dettagliata di ciascun metodo e scoprire altri metodi di supporto.

+0

Grazie mille, questo è stato davvero utile per i miei completamenti di attività rake in Ruby on Rails! Inoltre, grazie per aver segnalato la sezione E13 nei documenti. – ndbroadbent

+0

ha funzionato correttamente, quando ho messo questa riga 'cur =" $ {COMP_WORDS [COMP_CWORD]} "' prima di '_get_comp_words_by_ref -n: cur' anche a sapersi, se usi anche prev, puoi aggiungerlo al fine '_get_comp_words_by_ref -n: cur prev' – jmk

+0

Quando ho completamenti ambigui e ho premuto due volte la scheda ricevo suggerimenti errati basati su ciò che ho digitato quando uso questa soluzione. Vedi http: // StackOverflow.it/questions/28479216/how-to-give-correct-suggestions-to-tab-complete-when-my-words-contains-colons – toftis