2012-04-12 10 views
5

Kullandığım bir komut için programlanabilir tamamlama sağlamak üzere bir işlev oluşturuyorum (http://www.debian-administration.org/articles/317'dan itibaren). kabuk komut kullanımı aşağıdaki gibidir:Başlangıcı programlanabilir tamamlama ile koşullu sonlandırma alanı

script.sh command [command options] 

komutu 'foo' ya da 'bar' ve komut seçeneklerini 'foo' içindir 'a_foo = değer' ve 'b_foo = değer ve komut seçenekleri için de olabilir burada 'bar', 'a_bar = value' ve 'b_bar = value'.

_script() { 
    local cur command all_commands                  
    COMPREPLY=() 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    command="${COMP_WORDS[1]}" 
    all_commands="foo bar" 
    case "${command}" in 
    foo) 
     COMPREPLY=($(compgen -W "--a_foo --b_foo" -- ${cur})); return 0;; 
    bar) 
     COMPREPLY=($(compgen -W "--a_bar --b_bar" -- ${cur})); return 0;; 
    *) ;; 
    esac 
    COMPREPLY=($(compgen -W "${all_commands}" -- ${cur})) 
    return 0 
} 

complete -F _script script.sh 

İsterdim gibi bu çoğunlukla çalışır:

% script.sh f[TAB] 

için tamamlar:

% script.sh foo 

(bir boşluk bırakılarak yazılır ile Burada

kullanıyorum yapılandırma var arzu edildiği haliyle)

Bununla birlikte, bu:

% script.sh foo a[TAB] 

tamamlar: (aynı zamanda bir arka boşluk)

% script.sh foo a_foo 

bir '=' ile firar boşluk yerine istiyorum. Alternatif olarak, "--a_foo = --b_foo =" olmak için compgen'e iletilen değerleri değiştirmeye istekli olurdum. Bu durumda, sondaki alanı silebilirdim.

Maalesef, komut benim kontrolüm altında değil, bu yüzden "--a_foo = value" yerine "--a_foo value" biçiminde komut satırı seçeneklerini değiştiremiyorum.

cevap

8

Önce COMPREPLY için = eklemeniz gerekir:

COMPREPLY=($(compgen -W "--a_foo= --b_foo=" -- ${cur})) 

yanındaki Yani

compopt -o nospace 

ile = sonrasında boşluk eklemek için değil tamamlanmasını anlatmak gerekiyorsa, komut satırı yeterlidir:

foo) 
    COMPREPLY=($(compgen -W "--a_foo= --b_foo=" -- ${cur})); compopt -o nospace; return 0;; 
bar) 
    COMPREPLY=($(compgen -W "--a_bar= --b_bar=" -- ${cur})); compopt -o nospace; return 0;; 
+0

Kusursuz ... teşekkürler. Şimdi bash adam sayfalarında compopt görüyorum. Programlanabilir Tamamlama bölümünde muhtemelen bir tane olmalı! –

+2

Her zaman, http://bash-completion.alioth.debian.org/ adresine bakıyorum, eğer tamamlamamaya başlamışsam. Bu projede kullanılmayan bir özellik yok sanırım ;-) – Cougar

+1

Bunu bash 3.X'te yapmanın bir yolu var mı? compopt sadece bash4'te var gibi görünüyor ve mac varsayılan olarak onunla birlikte gelmiyor. – bjorns

İlgili konular