是否有提供程序开关列表的标准方法,因此zsh可以确定可能的完成情况?或者它必须直接提供给zsh开发人员,只有他们可以为zsh添加完成?
答案 0 :(得分:2)
您的第一站应为man zshcompsys
。
然后你可以查看一个例子,例如/usr/share/zsh/functions/Completion/Unix/_vim
。
答案 1 :(得分:2)
Z-Shell不会自动知道哪些开关适用于哪些二进制文件。据我所知,shell没有标准的方法来确定这一点。
ZSH使用完成函数,它是为特定程序编写的。例如,zsh
附带ssh
,cvs
,git
,ls
等的完成功能。
如果你想在这些完成功能中看,你可以。如果您位于zsh
shell echo $fpath
,则可以看到function path
用于加载完成功能的zsh
。有一个名为/usr/local/share/zsh/4.3.17/function
的目录(位置可能因发行版/ zsh版本而异),其中有一堆以_
开头的文件 - _ssh
,_cvs
等等。完成功能。
这些未自动生成的一个重要线索来自_ssh
完成函数中随4.3.17
附带的评论(可能是也可能不是您的特定版本):
# 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
fpath
您可以编写自己的完成函数,开发人员可以为其程序编写函数并提交给zsh
开发人员以供包含。 Z-Shell完成函数位于fpath
的某个位置。
答案 2 :(得分:2)
如果程序(例如foobar
)遵循选项的GNU约定,则可以使用:
compdef _gnu_generic foobar
否则你可以编写自己的函数。最容易使用的IMO是_describe
。
_foobar
醇>
#compdef foobar
cmds=(
'--one:option one'
'--four:option four'
'no-slashes:options do not need to start with a slash'
)
_describe 'foobar' cmds
$fpath
compdef _foobar foobar
答案 3 :(得分:0)
如果您正在使用带有optparse包的ruby,则会有一个隐藏标志--*-completion-zsh=NAME
,它将输出完成该ruby程序所需的全部内容。将它存储在$fpath
中某个名为_NAME的文件中,它会起作用。 NAME应该与您的程序/脚本完全相同。
我在$HOME
中使用了一个文件夹,并添加了$fpath
的路径,但我需要在.zshrc
中添加一行:
autoload -U ~/.completion/*(:t)