如何使 zsh 自动完成建议包装器内部可执行文件的标志?

如何使 zsh 自动完成建议包装器内部可执行文件的标志?

我正在使用 Arch Linux 和 zsh。我在用着吞食作为其他命令的包装器,像devour cmd args....我希望 zsh 自动完成cmd在我输入后建议的标志/参数cmd,使 的devour自动完成类似于sudo但没有标志 for devour。例如,键入devour id <TAB>应该建议 的标志id

我已经检查过/usr/share/zsh/functions/Completion/Unix/_sudo,但我对自动完成的 zsh 脚本了解不多,所以我不知道应该从中提取什么以获得所需的行为。

如何为这样的包装器创建自动完成脚本?

答案1

如果devour只是其他命令的前缀并且本身不带任何选项,请使用_precommand完成功能。这就是 zsh 用于evaltimenoglobnohup等的用途。

compdef _precommand devour

如果前缀命令有选项,那么指定如何完成这些选项的通常方法是_arguments功能。至少传递-S -A "-*"to_arguments表示在命令名称之后不必完成前缀选项,并且--可以出现在命令名称之前(这允许命令名称以破折号开头)。要指定只有外部命令(而不是别名、函数或内置命令)可以作为命令名称,请指定第一个参数 ( 1) 的完成形式为_command_names -e。为*分派到的其他非选项参数 ( )提供完成_normal -p $service。请注意,它_arguments会进行一些非常复杂的解析,并且标点符号和空格在您可能意想不到的地方很重要。 (出错的影响范围从根本没有完成到非常小的问题,例如菜单完成不显示预期的提示或在某些特定的嵌套上下文中完成错误的事情。)如果有疑问,请从下面的代码片段或从zsh 附带的补全函数。

#compdef my_prefix
_arguments -S -A '-*' : \
  '1:command: _command_names -e' '*:: : _normal -p $service'

_fakeroot_setsid有一些很好、简单的例子。一些更详细的例子包括_sudo_xargs

自定义命令的动态 zsh 自动完成有关如何以及在何处放置完成函数的一般建议。

请注意,此答案假设您正在使用“新式”(20 世纪 90 年代中期添加)完成系统,并且compinit在您的.zshrc.

相关内容