2012-05-10 11 views
20

Sanırım biraz özelliğini elde etmek için /etc/bash_completion.d/Diğer tamamlama komut dosyalarını etkilemeden COMP_WORDBREAKS nasıl sıfırlanır?

içinde koyacağım bir bash otomatik tamamlama işlevi uygulamak zaman bir şey beni karıştırmayın yok, ben kelime mola kaldırmak istiyor $COMP_WORDBREAKS değişkeninden iki nokta üst üste (:) ve $COMP_WORDBREAKS başlayarak bir eğik çizgi (/) ekleyin. değer diğer tamamlama komut paylaşılıyor olduğundan

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

    # my implement here 

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

Ancak, doğrudan COMP_WORDBREAKS sıfırlamak mümkün değil. Tamamlama işlevi çağrıldığında, COMP_WORDS dizisi zaten çoktan doldurulmuştur, bu nedenle yerel olarak COMP_WORDBREAKS değişiklikleri hiçbir etkisi yoktur.

Tek bir tamamlama komut dosyasında COMP_WORDBREAKS'u değiştirmek için herhangi bir çözüm var mı? (- örneğin ssh için küresel bir değişkendir ve diğer tamamlama komut davranışını etkileyen getirebileceğinden) tamamlama komut değiştirme

$ echo $BASH_VERSION 
4.2.10(1)-release 

cevap

20

$COMP_WORDBREAKS tavsiye edilen bir yol değildir.

Ancak, bash tamamlanması, hedefinize ulaşmak için kullanabileceğiniz bazı yardımcı yöntemler sunar.

olmayan kelime kıran tamamlama deyişle karakterleri işlemek için önerilen yolu iki yardımcı yöntemleri kullanmaktır: -n EXCLUDE seçenek

  • ile

    • _get_comp_words_by_ref olmadan kelime-to-komple alır kelime olarak EXCLUDE karakterleri dikkate
  • __ltrim_colon_completions
      kırar
    • COMPREPLY öğeleri
      öneki içeren iki nokta üst üste kaldırır -

Yani, burada iki nokta üst üste işlemek bir nasıl temel bir örnektir (http://tiswww.case.edu/php/chet/bash/FAQ için bir çözüm E13) (:) tamamlama deyişle:

_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 

Son olarak, yardımcı yöntemler /etc/bash_completion'da bulunur. Her yöntemin ayrıntılı bir açıklamasını okumak ve daha fazla yardımcı yöntem bulmak için içeriye bir göz atın.

+0

Çok teşekkür ederim, bu Ruby on Rails'deki komisyon görevlerim için gerçekten yararlı oldu! Ayrıca, dokümanlardaki E13 bölümünü işaretlediğiniz için teşekkür ederiz. – ndbroadbent

+0

bu sadece düzgün bir şekilde çalıştı, bu satırı koyduğumda "cur =" $ {COMP_WORDS [COMP_CWORD]} "' önce '_get_comp_words_by_ref -n: cur' da bilmenizde fayda var, eğer prev de kullanırsanız, '_get_comp_words_by_ref -n: cur prev' – jmk

+0

Belirsiz tamamlama ve iki kez sekme vurduğumda, bu çözümü kullandığımda yazdıklarıma göre yanlış öneriler alırım. Http: // stackoverflow dosyasına bakın.com/questions/28479216/how-to-give-correct-suggestions-to-tab-tamamlama-my-words-includes-colons – toftis

İlgili konular