如何让我的 shell 函数利用 zsh 中现有的自动完成功能?

如何让我的 shell 函数利用 zsh 中现有的自动完成功能?

我在 my 中定义了几个 shell 函数.zshrc,它们可以节省打字时间并允许与屏幕集成。例如:

function s()
{
     screen -t "$1" ssh "$@"
}

但是,当我使用这些 shell 函数时,我无法利用 zsh 内置的命令完成功能。 (对于 SSH,根据known_hosts 和 ssh_config 自动完成主机名)。对于我为其创建包装器的命令,挂钩现有完成机制的首选方法是什么?

编辑:

感谢吉尔斯在下面的回答。使用 compdef 似乎是执行此操作的方法,但有趣的是,它的工作方式似乎并不统一。在这种情况下,我有以下设置:

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

我的包装函数“m”的完成按预期工作,但是我的函数“s”的完成却没有;当我点击“选项卡”时,它似乎会通过向我提供文件列表来回退到默认自动完成,而不是尝试完成主机名。 SSH 完成的处理方式是否有一些奇怪的地方,这意味着我需要做进一步的事情?

答案1

要请求像完成系统已知的另一个命令一样完成命令,可以使用以下compdef my_command=known_command形式compdef

compdef s=ssh
compdef {cxterm,uxterm,xterm-color}=xterm

在幕后,这基本上相当于_comps[s]=$_comps[ssh].

一些完成命令适用于一系列函数并读取命令行的第一个字以确定要完成哪个特定命令。例如命令sshscpsftp等一些命令都是由函数 完成的_ssh。在这种情况下,您需要告诉完成函数您的函数是什么样的“服务”(默认情况下,服务是可执行文件名称,这里是您的函数名称)。

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s

相关内容