0

我按照本教程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以模式作为参数的函数?

4

1 回答 1

0

来自: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
于 2012-05-07T05:58:53.850 回答