如何使两个程序在bash中只使用一个自动完成功能?

如何使两个程序在bash中只使用一个自动完成功能?,bash,autocomplete,refactoring,Bash,Autocomplete,Refactoring,我按照这个步骤设置了figlet/厕所的自动完成功能 # 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=$(

我按照这个步骤设置了
figlet
/
厕所的自动完成功能

# 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
\u figlet
\u toilet
几乎相同,除了
find
/
sed
命令中的模式外。
如何提取一个名为
\u figlet\u toilet
的函数,该函数将模式作为参数?

来自:

生成这些匹配项后,将调用使用-F和-C选项指定的任何shell函数或命令。当调用命令或函数时,COMP_行、COMP_点、COMP_键和COMP_类型变量将按上述方式赋值(请参见Bash变量)。如果调用shell函数,还将设置COMP_字和COMP_CWORD变量。调用函数或命令时,第一个参数是其参数正在完成的命令的名称,第二个参数是正在完成的单词,第三个参数是当前命令行上正在完成的单词前面的单词。不针对正在完成的单词对生成的完成项进行过滤;函数或命令在生成匹配项时具有完全的自由度


#figlet/厕所的bash完成
{
有厕所
} &&
_figlet_厕所()
{
本地当前选择pat
_通过参考当前版本获取合成词
opts=“-f”
压缩=()
案例$prev in
-(f)
中的大小写“${1}”
菲格莱特)
帕特='flf'
;;
厕所)
帕特=“[tf]lf”
;;
以撒
本地运行=$(find/usr/share/figlet-name“*.${pat}”-printf“%P\n”sed“s/\.${pat}\$/”)
COMPREPLY=($(compgen-W“${running}”-${cur}))
返回0
;;
*)
;;
以撒
#如果已经给定'-f',则生成随机字符串
对于((i=0;i<${COMP_WORDS[@]}-1;i++)do
如果[${COMP_WORDS[i]}==-f]];那么
#综合=(“$(财富-sn42)”)
返回0
fi
完成
COMPREPLY=($(compgen-W“$opts”--“$cur”))
返回0
} &&
完整-F_figlet_厕所figlet厕所
# 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