首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让两个程序在bash中只使用一个自动补全功能?

如何让两个程序在bash中只使用一个自动补全功能?
EN

Stack Overflow用户
提问于 2012-05-07 12:50:23
回答 1查看 163关注 0票数 0

我按照这个tutorialfiglet/toilet设置了自动补全功能。

代码语言:javascript
复制
# 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

除了find/sed命令中的模式之外,_figlet_toilet几乎相同。

如何提取一个名为_figlet_toilet的函数,该函数以模式为参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 13:58:54

来自:http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html

生成这些匹配后,将调用使用-F和-C选项指定的任何

函数或命令。调用命令或函数时,将如上所述为COMP_LINE、COMP_POINT、COMP_KEY和COMP_TYPE变量赋值(请参阅Bash变量)。如果正在调用外壳函数,则还会设置COMP_WORDS和COMP_CWORD变量。调用函数或命令时,第一个参数是其参数正在完成的命令的名称,第二个参数是正在完成的单词,第三个参数是当前命令行上正在完成的单词之前的单词。不会针对正在完成的单词执行对生成的补全的过滤;该函数或命令在生成匹配时具有完全的自由度。

代码语言:javascript
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10476815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档