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.
Kusursuz ... teşekkürler. Şimdi bash adam sayfalarında compopt görüyorum. Programlanabilir Tamamlama bölümünde muhtemelen bir tane olmalı! –
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
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