如何为zsh完成系统提供数据

时间:2010-05-10 12:47:40

标签: zsh

是否有提供程序开关列表的标准方法,因此zsh可以确定可能的完成情况?或者它必须直接提供给zsh开发人员,只有他们可以为zsh添加完成?

4 个答案:

答案 0 :(得分:2)

您的第一站应为man zshcompsys

然后你可以查看一个例子,例如/usr/share/zsh/functions/Completion/Unix/_vim

答案 1 :(得分:2)

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

ZSH使用完成函数,它是为特定程序编写的。例如,zsh附带sshcvsgitls等的完成功能。

如果你想在这些完成功能中,你可以。如果您位于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

为Z-Shell提供完成:使用fpath

您可以编写自己的完成函数,开发人员可以为其程序编写函数并提交给zsh开发人员以供包含。 Z-Shell完成函数位于fpath的某个位置。

答案 2 :(得分:2)

如果程序(例如foobar)遵循选项的GNU约定,则可以使用:

compdef _gnu_generic foobar

否则你可以编写自己的函数。最容易使用的IMO是_describe

  1. 使用内容
  2. 创建文件_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. 中的某个位置
    3. 添加compdef _foobar foobar

答案 3 :(得分:0)

如果您正在使用带有optparse包的ruby,则会有一个隐藏标志--*-completion-zsh=NAME,它将输出完成该ruby程序所需的全部内容。将它存储在$fpath中某个名为_NAME的文件中,它会起作用。 NAME应该与您的程序/脚本完全相同。

我在$HOME中使用了一个文件夹,并添加了$fpath的路径,但我需要在.zshrc中添加一行:

autoload -U ~/.completion/*(:t)