如何为包装器命令编写 zsh 补全函数

如何为包装器命令编写 zsh 补全函数

我正在尝试为名为 myssh 的 SSH 自定义包装器编写一个完成函数。 myssh 采用以下任一形式的命令行参数:

myssh [myssh options] [ssh args]

或者

myssh [myssh options] -- [ssh options] [ssh args]

如何为 myssh 特定选项提供补全,同时重用 ssh 的现有补全?

编辑:我也想使用该_gnu_generic功能这里提到用于完成 myssh 选项。

答案1

在更一般的情况下,@Franklin\ Yu 的评论不足以满足您的需要,您可以制定相应的完成命令。以命令为例flux。这个命令以及许多类似的命令相当挑剔,并且期望完成命令的第一个参数是原始命令的名称,因此会失败:

$ compdef myflux=flux
$ myflux<tab>
l2advertisement.yaml  pool.yaml # <--- not expected

myflux引入一个辅助命令来替换变量中的第一个命令$words可以解决此问题:

_myflux() {
  words="flux ${words[@]:1}"     # replace myflux with flux, in `words` array
  _flux                           # call original completion command which expects a words array beginning with `flux`
}

$ compdef _myflux myflux

$ myflux<tab> 
bootstrap   -- Deploy Flux on a cluster the GitOps way.
build       -- Build a flux resource
check ...
...
# the above *is* expected.

有时您会用子命令包装原始命令,例如flux get source

数组发生突变的行将$words变为:

  words="flux get source ${words[@]:1}"

相关内容