我的脚本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