내 스크립트는 foo
주어진 경로의 디렉터리를 /foo/path
인수로 사용하며 선택적 인수도 있습니다 -l
.
다음 완료 파일이 있습니다.
#compdef foo
_arguments : \
'-l' \
'*: :->directory'
case $state in
directory)
_directories -W /foo/path
;;
esac
완료하는 동안 다음과 같은 문제가 발생합니다.
예를 들어 잘못된(존재하지 않는) 선택적 매개변수를 사용한 다음 -c
Tab 키를 누르면
foo -c <TAB>
-l
그런 다음 존재하지 않는 옵션에 대해 디렉토리 완성 기능이 제거된 것처럼 존재하는 옵션에 대해 자동 완성됩니다 -c
.
적어도 디렉토리와 -l
.
그러나 어쨌든 잘못된/존재하지 않는 옵션이 제공되는 경우 잘못된 옵션으로 계속할 수 없다는 점을 명확히 하기 위해 완료를 완전히 중지하려면 어떻게 해야 합니까?
답변1
이 코드를 사용하면 설명하는 동작을 재현할 수 없습니다. 이후 을 foo -c
누르면 Tab완성된 목차가 나옵니다.
와 함께 상태를 사용할 때는 _arguments
함수에서 지역 변수로 사용하는 변수를 선언해야 합니다. 이 간단한 경우에는 동일한 이름을 가진 전역 변수가 없어도 문제가 되지 않는다고 생각합니다.
로 시작하는 모든 매개변수에 대한 동작을 지정하는 방법은 없다고 생각합니다 -
. 인식할 수 없는 옵션이 있을 때 완료를 비활성화하려면 매개변수(즉,words
1(명령어 이름, 제외)과 $CURRENT
(완성어, 제외) 사이입니다.
local context state state_descr line
typeset -A opt_args
_arguments : \
'-l' \
'*: :->directory'
local i
for ((i = 2; i < CURRENT; i++)); do
if [[ $words[$i] = -* && $words[$i] != -l ]]; then
state=nothing
break
fi
done
case $state in
directory)
_directories -W /usr
;;
esac