COMPREPLY를 한 줄 대신 수직 단어 목록으로 출력할 수 있습니까?

COMPREPLY를 한 줄 대신 수직 단어 목록으로 출력할 수 있습니까?

COMPREPLY는 기본적으로 공백으로 구분된 단어 목록을 반환하지만 한 줄에 한 단어를 반환하고 싶습니다. 단어 끝에 줄 바꿈을 추가하려고 시도하고 compgen 및 Complete에 대한 문서를 살펴보았지만 아무것도 찾을 수 없습니다.

가능합니까?

편집하다:

죄송해요 제가 설명을 정말 형편없게 했네요. Complete -F를 통해 자동 완성 기능에 바인딩하는 스크립트가 있습니다. 사용자가 스크립트를 실행할 때 Tab 키를 두 번 누르면 compgen을 통해 가능한 옵션 목록이 표시됩니다. 이제 함수에는 다음과 같은 코드 줄이 있습니다.

COMPREPLY=( $(compgen -W '$( ls ~/work/dev/jobs/ | cat )' -- $curword ) )

사용자가 탭을 클릭하면 이러한 디렉터리가 다음과 같이 나타납니다.

directory0 directory1 directory2 directory3

그러나 나는 그들이 다음과 같이 나타나기를 원합니다.

directory0
directory1
directory2
directory3

/r/bash에 비슷한 게시물을 올렸는데 누군가가 이 작업을 제안했습니다.

bind 'set completion-display-width 0'

이 작업이 완료되면 취소할 수 있습니다.

bind 'set completion-display-width -1'

이제 문제는 전체 함수가 반환되기 전에 설정을 해제하면 아무런 효과가 없으므로 사용자가 Enter 키를 누른 후 스크립트에서 설정을 해제한다는 것입니다. 이것은 잘 작동하지만 사용자가 자동 ​​완성을 사용하기 시작한 다음 마음을 바꾸고 입력한 내용을 삭제하고 셸로 돌아오면 완성 표시 너비가 여전히 0으로 설정됩니다.

이 문제를 해결할 다른 방법이 있나요?

답변1

completion-display-width나는 readline 변수 변경을 제안한 사람이었습니다./r/배시, 그러나 이 하나의 완성 함수에서만 작동하도록 지정하지 않았습니다.

TAB어쨌든, 완료 함수에서 (COMP_TYPE == 9) 또는 (COMP_TYPE == 63) 에 의해 트리거되는지 여부를 감지할 수 TABTAB있으며, 후자인 경우 전체 너비를 채울 수 있도록 결과를 공백으로 채울 수 있습니다. 단말기. 이것은 내가 생각할 수 있는 가장 덜 해키적인 일이다. 다음과 같습니다.

_foo_complete() {
    local i file files
    files=( ~/work/dev/jobs/"$2"* )
    [[ -e ${files[0]} || -L ${files[0]} ]] || return 0
    if (( COMP_TYPE == 63 )); then
        for file in "${files[@]}"; do
            printf -v 'COMPREPLY[i++]' '%*s' "-$COLUMNS" "${file##*/}"
        done
    else
        COMPREPLY=( "${files[@]##*/}" )
    fi
}
complete -F _foo_complete foo

그런데 당신은진짜해서는 안 된다ls 출력 구문 분석.

답변2

특정 완성 함수에 대해서만 readline 변수를 수정하려면 함수 실행 중에 readline 변수를 설정한 다음 $PROMPT_COMMAND다시 변경할 수 있습니다.

_foo_complete() {
    # retrieve the original value
    local width=$(bind -v | sed -n 's/^set completion-display-width //p')

    if [[ $width -ne 0 ]]; then
        # change the readline variable
        bind "set completion-display-width 0"

        # set up PROMPT_COMMAND to reset itself to its current value
        PROMPT_COMMAND="PROMPT_COMMAND=$(printf %q "$PROMPT_COMMAND")"

        # set up PROMPT_COMMAND to reset the readline variable
        PROMPT_COMMAND+="; bind 'set completion-display-width $width'"
    fi

    # whatever the function normally does follows
    COMPREPLY=(aa bb)
}
complete -F _foo_complete foo

관련 정보