如何获取我的Shell函数以利用zsh中的现有自动完成功能?


10

我定义了几个shell函数,.zshrc这些函数可以节省键入并允许与屏幕集成。例如:

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

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

编辑:

感谢Gilles在下面的回答。使用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完成的处理方式是否有些奇怪,这意味着我需要做进一步的事情?

Answers:


9

我使用以下函数表示s要像现有命令(例如ssh)一样完成一个函数或别名或包装脚本(例如):

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

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

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

谢谢-我以为compdef是我要使用的。出于兴趣,您是否有任何理由创建局部变量并进行移位,而不是在调用compdef时引用$ 1和$ 2?
Murali Suriar

@Murali:那样我就可以写类似compdefas xterm cxterm uxterm xterm-color
吉尔(Gilles)“所以,别再邪恶了”,

1
有趣-我定义了两个包装,一个用于“ man”,一个用于“ ssh”。使用compdef,我的“ man”包装程序的完成工作正常,但是我的“ ssh”包装程序的完成工作不成功。您以前是否遇到过类似问题?为了使_ssh与我的别名/包装一起使用,我还需要戳些什么吗?
Murali Suriar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.