簡體   English   中英

如何使兩個程序在bash中僅使用一個自動完成功能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM