인수가 단일 단어인 경우에만 작동하는 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
}