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".
Idealne ... dzięki. Widzę teraz compopt na stronach basha. Prawdopodobnie powinno to być wspomniane w sekcji Programowalne uzupełnianie! –
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
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