Bu Yığın Taşması yanıtından ve bu Ubuntu Forumları tartışma dizisinden uyarlanan aşağıdaki kod, tanımlanmış tüm takma adlarınız için tamamlamalar ekleyecektir:
# Automatically add completion for all aliases to commands having completion functions
function alias_completion {
local namespace="alias_completion"
# parse function based completion definitions, where capture group 2 => function and 3 => trigger
local compl_regex='complete( +[^ ]+)* -F ([^ ]+) ("[^"]+"|[^ ]+)'
# parse alias definitions, where capture group 1 => trigger, 2 => command, 3 => command arguments
local alias_regex="alias ([^=]+)='(\"[^\"]+\"|[^ ]+)(( +[^ ]+)*)'"
# create array of function completion triggers, keeping multi-word triggers together
eval "local completions=($(complete -p | sed -Ene "/$compl_regex/s//'\3'/p"))"
(( ${#completions[@]} == 0 )) && return 0
# create temporary file for wrapper functions and completions
rm -f "/tmp/${namespace}-*.tmp" # preliminary cleanup
local tmp_file; tmp_file="$(mktemp "/tmp/${namespace}-${RANDOM}XXX.tmp")" || return 1
local completion_loader; completion_loader="$(complete -p -D 2>/dev/null | sed -Ene 's/.* -F ([^ ]*).*/\1/p')"
# read in "<alias> '<aliased command>' '<command args>'" lines from defined aliases
local line; while read line; do
eval "local alias_tokens; alias_tokens=($line)" 2>/dev/null || continue # some alias arg patterns cause an eval parse error
local alias_name="${alias_tokens[0]}" alias_cmd="${alias_tokens[1]}" alias_args="${alias_tokens[2]# }"
# skip aliases to pipes, boolean control structures and other command lists
# (leveraging that eval errs out if $alias_args contains unquoted shell metacharacters)
eval "local alias_arg_words; alias_arg_words=($alias_args)" 2>/dev/null || continue
# avoid expanding wildcards
read -a alias_arg_words <<< "$alias_args"
# skip alias if there is no completion function triggered by the aliased command
if [[ ! " ${completions[*]} " =~ " $alias_cmd " ]]; then
if [[ -n "$completion_loader" ]]; then
# force loading of completions for the aliased command
eval "$completion_loader $alias_cmd"
# 124 means completion loader was successful
[[ $? -eq 124 ]] || continue
completions+=($alias_cmd)
else
continue
fi
fi
local new_completion="$(complete -p "$alias_cmd")"
# create a wrapper inserting the alias arguments if any
if [[ -n $alias_args ]]; then
local compl_func="${new_completion/#* -F /}"; compl_func="${compl_func%% *}"
# avoid recursive call loops by ignoring our own functions
if [[ "${compl_func#_$namespace::}" == $compl_func ]]; then
local compl_wrapper="_${namespace}::${alias_name}"
echo "function $compl_wrapper {
(( COMP_CWORD += ${#alias_arg_words[@]} ))
COMP_WORDS=($alias_cmd $alias_args \${COMP_WORDS[@]:1})
(( COMP_POINT -= \${#COMP_LINE} ))
COMP_LINE=\${COMP_LINE/$alias_name/$alias_cmd $alias_args}
(( COMP_POINT += \${#COMP_LINE} ))
$compl_func
}" >> "$tmp_file"
new_completion="${new_completion/ -F $compl_func / -F $compl_wrapper }"
fi
fi
# replace completion trigger by alias
new_completion="${new_completion% *} $alias_name"
echo "$new_completion" >> "$tmp_file"
done < <(alias -p | sed -Ene "s/$alias_regex/\1 '\2' '\3'/p")
source "$tmp_file" && rm -f "$tmp_file"
}; alias_completion
Basit (yalnızca komut, argüman yok) takma adları için orijinal tamamlama işlevini takma adaya atayacaktır; argümanlara sahip diğer isimler için, ekstra argümanları orijinal tamamlama fonksiyonuna ekleyen bir sarmalayıcı fonksiyonu yaratır.
O fonksiyon saygı takma komut için tırnak hem de bağımsız değişkenleri, evrimleştiği (ama eski tamamlama komutuyla uydurulması gereken ve iç içe olamaz), ve güvenilir için takma adlar filtre gerektiğini gelmiştir komut aksine komuta listeleri ve Borular (bunlara atlandı, çünkü tam kabuk komut satırı ayrıştırma mantığını yeniden oluşturmadan içlerinde ne yapılması gerektiğini bulmak mümkün değil).
kullanım
Kodu bir kabuk komut dosyası dosyası olarak kaydedin ve kaynak olarak kaydedin ya da işlevi toptan içine .bashrc
(veya ilgili nokta dosyanızla ) kopyalayın . Önemli olan, bash tamamlandıktan ve diğer ad tanımları ayarlandıktan sonra işlevi çağırmaktır (yukarıdaki kod, tanımı tanımlandıktan hemen sonra “kaynak ve unut” ruhu ile çağırır, ancak çağrıyı aşağı akışta herhangi bir yere taşıyabilirsiniz. sana daha çok yakışıyor). İşleviniz çıktıktan sonra ortamınızda istemiyorsanız, unset -f alias_completion
çağırdıktan sonra ekleyebilirsiniz .
notlar
bash
4.1 veya daha üstü kullanıyorsanız ve dinamik olarak yüklenmiş tamamlamaları kullanıyorsanız, komut dosyası diğer tüm komutlarınız için tamamlamaları yüklemeye çalışacak, böylece takma adlarınız için sarmalayıcı işlevleri oluşturabilecektir.
bash --version
bunu almak için (-v
farklı çıktı kullanmayın ).