[英]How to make two programs to use only one auto-completion function in bash?
我按照本教程設置了figlet
/ toilet
自動完成功能。
# bash completion for figlet/toilet
have figlet &&
_figlet()
{
local prev cur opts
_get_comp_words_by_ref cur prev
opts="-f"
COMPREPLY=()
case $prev in
-f)
local running=$(find /usr/share/figlet -name '*.flf' -printf '%P\n' | sed 's/\.flf$//')
COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
return 0
;;
*)
;;
esac
COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )
return 0
} &&
complete -F _figlet figlet
###################################################################################################
have toilet &&
_toilet()
{
local prev cur opts
_get_comp_words_by_ref cur prev
opts="-f"
COMPREPLY=()
case $prev in
-f)
local running=$(find /usr/share/figlet -name '*.[tf]lf' -printf '%P\n' | sed 's/\.[tf]lf$//')
COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
return 0
;;
*)
;;
esac
COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )
return 0
} &&
complete -F _toilet toilet
_figlet
和_toilet
幾乎相同,除了find
/ sed
命令中的模式。
如何提取以模式為參數的_figlet_toilet
函數?
來自: http : //www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
生成這些匹配項后,將調用由-F和-C選項指定的任何shell函數或命令。 調用命令或函數時,將如上所述為COMP_LINE,COMP_POINT,COMP_KEY和COMP_TYPE變量分配值(請參見Bash變量)。 如果正在調用Shell函數,則還將設置COMP_WORDS和COMP_CWORD變量。 調用該函數或命令時, 第一個參數是其參數正在完成的命令的名稱 ,第二個參數是在當前命令行上要完成的單詞,第三個參數是在該命令行上要完成的單詞之前的單詞。 不針對完成的單詞對生成的完成進行過濾; 函數或命令在生成匹配項方面具有完全的自由度。
# bash completion for figlet/toilet
{
have figlet || have toilet
} &&
_figlet_toilet()
{
local prev cur opts pat
_get_comp_words_by_ref cur prev
opts="-f"
COMPREPLY=()
case $prev in
-f)
case "${1}" in
figlet)
pat='flf'
;;
toilet)
pat='[tf]lf'
;;
esac
local running=$(find /usr/share/figlet -name "*.${pat}" -printf '%P\n' | sed "s/\.${pat}\$//")
COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
return 0
;;
*)
;;
esac
# if '-f' is already given, then generate random string
for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
if [[ ${COMP_WORDS[i]} == -f ]]; then
# COMPREPLY=("'$(fortune -sn42)'")
return 0
fi
done
COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )
return 0
} &&
complete -F _figlet_toilet figlet toilet
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.