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