자동완성에서 참조되는 매개변수

자동완성에서 참조되는 매개변수

인수가 단일 단어인 경우에만 작동하는 bash 자동 완성 기능이 있습니다. 인용된 문을 자동 완성한 다음 이를 케이스 문에서 사용하여 파일에 태그를 지정할 수 있습니다(메타데이터 태그를 생각해 보세요. 때로는 여러 단어가 필요할 수도 있습니다.)

자동 완성 기능을 사용하여 특정 옵션 뒤에 목차를 표시하는 방법이 있습니까? 스크립트는 다음과 같습니다.

_script()
{
        local cur prev opts iter
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-t"
        if [[ ${cur} == -* ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                return 0
        fi
        case "$prev" in
                -t)
                        option="single \"double\ word\""
                        option="${option//\\ /___}"
                        for iter in $option; do
                                if [[ $iter =~ ^$cur ]]; then
                                        COMPREPLY+=( "${iter//___/ }" )
                                fi
                        done
                        return 0
                        ;;
                "single"|"double word")
                        compopt -o default
                        COMPREPLY=()
                        return 0
                        ;;
        esac
}
complete -F _script script

내가 이것을 다음과 같이 사용할 때 :

script -t <tab>: 올바른 옵션이 표시되지만 single "double word"디렉토리는 표시되지 않습니다(예! 그게 바로 제가 원하는 것입니다!)

내가 사용하는 경우:

script -t single <tab>: 사용 가능한 디렉토리를 보여줍니다(예! 그게 바로 제가 원하는 것입니다!)

내가 사용하는 경우:

script -t "double word" <tab>:탭에는 아무것도 출력되지 않습니다. 이것이 제가 해결하고 싶은 문제입니다.

답변1

귀하의 처리가 double word잘못되었습니다(비록 쉘보다 더 의미가 있지만 적어도 bash에서는) case.

함수 코드의 상단(또는 관심 있는 줄 앞)에 넣으면 set -x어떻게 되는지 확인할 수 있습니다 .

올바른 문자열을 반환합니다. "double word"여기서 "being은 프로그래밍 가능한 완성으로 표시되는 단어의 일부입니다. 따옴표가 인식되어 "double word"단지 단어일 뿐이지만 제거되지 않아 함수에서 _script볼 수 있기 때문에 이것은 약간 이상합니다 . 따라서 완성은 사용할 수 있지만 실행과 동일한 쉘이더라도 "double word"사용할 수는 없습니다 . double\ word따라서 이는 리터럴과 구문 분석된 명령줄 문자열의 반직관적인 조합입니다.

해결책

코드를 다음으로 바꾸면 작동합니다.

"single"|"double word"

그리고

"single"|"\"double word\""

아니면 더 나은

"single"|"\"double word\""|"double\ word"|"'double word'"

제안

그러나 나는 몇 가지 더 많은 변화를 제안하고 싶습니다:

_script()
{ 
        local cur prev opts iter
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-t"
        if [[ ${cur} == -* ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                return 0
        fi
        case "$prev" in
                -t)
                        options=(single "double\ word")
                        for iter in "${options[@]}"; do
                                if [[ $iter =~ ^$cur ]]; then
                                        COMPREPLY+=( "$iter" )
                                fi
                        done
                        return 0
                        ;;
                "single"|"double\ word")
                        compopt -o default
                        COMPREPLY=()
                        return 0
                        ;;
        esac
}

관련 정보