如何为zsh自动补全系统提供数据?

3

有没有提供程序开关列表的标准方式,以便zsh能够确定可能的补全?还是必须直接提供给zsh开发人员,只有他们才能向zsh添加补全?

4个回答

2

如果程序(比如foobar)遵循GNU的选项规范,您可以使用以下命令:

compdef _gnu_generic foobar

否则,您可以编写自己的函数。在我看来,最容易使用的是_describe
  1. 创建一个名为_foobar的文件,并将其内容设置为:
#compdef foobar

cmds=(
'--one:option one'
'--four:option four'
'no-slashes:options do not need to start with a slash'
)

_describe 'foobar' cmds
  1. 将文件放置在您的$fpath目录下。
  2. 添加compdef _foobar foobar

2

Z-Shell不会自动知道哪些二进制文件可以使用哪些开关。据我所知,还没有标准的方法可以让shell确定这一点。

ZSH通过使用特定程序的完成函数来工作。例如,zsh附带了用于ssh、cvs、git、ls等的完成函数。

如果你想查看这些完成函数,可以这样做。如果你在zsh shell中,输入echo $fpath以查看zsh用于加载完成函数的函数路径。有一个名为/usr/local/share/zsh/4.3.17/function(位置可能因发行版或zsh版本而异)的目录,其中有一堆以_开头的文件——_ssh_cvs等等。那些就是完成函数。

这些不是自动生成的一个巨大的线索来自于附带于4.3.17版本的_ssh完成函数中的注释(在你的特定版本中可能有,也可能没有):


# Completions currently based on OpenSSH 5.9 (released on 2011-09-06).
#
# TODO: update ssh-keygen (not based on 5.9)
# TODO: sshd, ssh-keyscan, ssh-keysign

为Z-Shell提供补全功能:使用fpath

您可以编写自己的补全函数,开发人员可以为其程序编写函数并提交给zsh开发人员以进行包含。Z-Shell补全函数需要放置在fpath的某个位置。


2

你应该先查看 man zshcompsys

然后你可以查看例如 /usr/share/zsh/functions/Completion/Unix/_vim 这样的示例。


0
如果您正在使用带有optparse包的Ruby,那么有一个隐藏的标记--*-completion-zsh=NAME,它将输出完成所需的所有内容,以供Ruby程序使用。将其存储在名为_NAME的文件中,放置在您的$fpath某处,然后它就会起作用。NAME应该准确地与您的程序/脚本的名称相匹配。
我在我的$HOME目录下创建了一个文件夹,并将路径添加到$fpath中,但这需要在我的.zshrc文件中添加额外的一行代码。
autoload -U ~/.completion/*(:t)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接