자동 완성으로 인해 단어의 마지막 문자가 제거되는 경우가 있습니다.

자동 완성으로 인해 단어의 마지막 문자가 제거되는 경우가 있습니다.

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

관련 정보