Deno 按 Tab 报 invalid argument,修正 zsh 短选项规格缺失的横线
Deno 生成的 zsh 短选项规格曾漏掉横线,普通单行描述也会报 invalid argument。2.9.7 包含处理,更新后须重新生成脚本并测试实际补全。
在 zsh 中输入 deno 后按 Tab,补全报下面的错误,可以检查生成的短选项规格是否漏了横线:
_arguments:comparguments:327: invalid argument: (-h --help)h[]
Deno 2.9.6 有这个明确案例。普通单行描述甚至空描述也能触发,问题不需要帮助文本含换行才能出现。
zsh 的 _arguments 接收的是选项规格,不是简单的名称列表。旧生成器的短、长选项 brace 形式类似:
'(-h --help)'{h,--help}'[]'
括号里列出了 -h,但真正展开的短选项却是 h。一条非法规格就会使本次补全失败,所以看起来像所有子命令和文件补全都失效。手动在终端把命令改成长选项,不会修复已经加载的补全函数。
Deno 2.9.7 的生成器包含短选项横线保护,使对应形式保留 -h。更新可执行文件后,应重新生成并加载补全脚本,而不是只检查 deno --version:
deno completions zsh > ./deno-completion.zsh
zsh -n ./deno-completion.zsh
先审阅这个独立文件,再在测试 zsh 会话中加载它。保留原来的 completion 初始化方式;更新长期自动加载目录时,应确认函数名和目录设置与原安装匹配,避免新旧两个同名补全同时存在。
source ./deno-completion.zsh
zsh -n 只检查脚本语法,不能证明 _arguments 的每条选项规格合法。实际验收仍需按 Tab:分别测试裸 deno、一个短选项前缀、长选项前缀,以及项目依赖的子命令和文件参数。确认不再出现上述 h[] 错误,结果与选项定义一致。
若新生成文件已正确但旧错误仍在,查看当前会话是否继续使用旧函数,必要时用新会话对照。不要对 shell 全局关闭错误输出,否则补全只是静默失败。
这条路径只讨论短选项名称缺少横线。帮助文本换行、描述中的特殊字符或其他 shell 的字段协议,会产生不同的规格或消费问题;没有这些内容的最小例子仍失败,才是这里最有用的判断边界。


