オートコンプリートによって単語の最後の文字が削除されることがあります。

オートコンプリートによって単語の最後の文字が削除されることがあります。

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

関連情報