2012-04-12 13 views
5

Tworzę funkcję zapewniającą programowalne zakończenie dla polecenia, którego używam (z dużą pomocą od http://www.debian-administration.org/articles/317). Wykorzystanie skrypt jest w następujący sposób:Warunkowe spacje końcowe z programowalnym zakończeniem bash

script.sh command [command options] 

gdzie komenda może być albo „foo” lub „bar” oraz opcje polecenia dla „foo” mają „a_foo = wartość” i „b_foo = wartość” i opcje polecenia dla "bar" to "a_bar = wartość" i "b_bar = wartość".

Oto konfiguracja Używam:

_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 

to głównie pracuje jako Chciałbym:

% script.sh f[TAB] 

kończy się:

% script.sh foo 

(ze spacją zgodnie z potrzebami)

Jednak to:

% script.sh foo a[TAB] 

kończy się:

% script.sh foo a_foo 

(również ze spacją)

Chciałbym wymienić spacją ze związkiem '='. Alternatywnie, byłbym skłonny zmienić wartości przekazane do compgen na "- a_foo = --b_foo =", w którym to przypadku mógłbym po prostu usunąć końcowe pole.

Niestety, polecenie nie jest pod moją kontrolą, więc nie mogę zmienić opcji wiersza poleceń na format "--a_foo value" zamiast "--a_foo = value".

Odpowiedz

8

Najpierw trzeba dodać = na COMPREPLY:

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

następny trzeba powiedzieć na zakończenie, aby nie dodawać spacji po = z

compopt -o nospace 

tak, to linie skrypt powinien być:

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

Idealne ... dzięki. Widzę teraz compopt na stronach basha. Prawdopodobnie powinno to być wspomniane w sekcji Programowalne uzupełnianie! –

+2

Zawsze patrzę na http://bash-completion.alioth.debian.org/ jeśli I; m utknął z uzupełnieniami. Domyślam się, że nie istnieje żadna funkcja, która nie jest używana w tym projekcie ;-) – Cougar

+1

Czy jest jakiś sposób zrobienia tego w bashu 3.X? compopt wydaje się istnieć tylko w bash4 i mac nie jest jeszcze domyślnie dołączony. – bjorns

Powiązane problemy