zsh 完成:使用错误选项时停止完成

zsh 完成:使用错误选项时停止完成

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

相关内容