自动完成有时会删除单词中的最后一个字符

自动完成有时会删除单词中的最后一个字符

我有一个自定义命令define,可以从字典中获取单词定义。我想制作一个自动完成脚本来使用 中找到的单词列表来完成我想要定义的单词/usr/share/dict/words。这是我到目前为止所拥有的:

自动完成脚本:/etc/bash_completion.d/define

_define()
{
    dict='/usr/share/dict/words'
    cur=${COMP_WORDS[COMP_CWORD]}
    regex="^$cur*"
    words=$(grep $regex $dict)

    if [[ $cur != -* ]]
    then
        COMPREPLY=( $( compgen -W "$(echo $words)" $cur) )
    else
        COMPREPLY=()
    fi
    return 0
}

complete -F _define define

当我点击时,[tab][tab]有时我会得到一个以键入的单词开头的单词列表,有时它只是删除最后一个字符。例如,当我这样做时,define wall [tab][tab]我会得到define wal,但如果我这样做,define wal [tab][tab]我会得到一个单词列表。

为什么会发生这种情况?

答案1

事实证明,问题与补全单词列表中的单引号字符有关',我通过将grep命令的正则表达式从 更改为 来^$cur*修复它^$cur[^']*$

_define()
{
    local dict='/usr/share/dict/words'
    local cur=${COMP_WORDS[COMP_CWORD]}
    local regex="^$cur[^']*$"

    if [[ $cur == -* ]]
    then
        COMPREPLY=()
    else
        local WORDS="$( grep "$regex" $dict )"
        COMPREPLY=( $(compgen -W "${WORDS}" -- $cur) )
    fi
}

complete -F _define define

相关内容