9

zsh很棒,但它的完成系统非常多样化。而且文档缺乏很好的例子。是否有用于完成特定应用程序的模板。完成将从文件中获取其匹配数据,用换行符分隔?

我尝试修改我的一个旧示例,该示例采用“实时”匹配数据:

~ % cat .zsh/completers/_jazzup 
#compdef jazz_up
_arguments "2: :(`mpc lsplaylists|sed -e 's# #\\\\ #g'`)"

我可以cat my_file在那里提供而不是mpc调用等等,但是会有更优雅的方式来完成这个简单的任务吗?并且该完成是特定于放置的:您能否提供一个示例,在该示例中 zsh 将在程序名称被识别后的任何时候尝试完成?

匹配数据将有空格等,完成应该转义 WS。例子:

Foo bar
Barbaric
Get it (42)

现在,如果要为命令配置完成Say,我们应该得到这种行为zsh

$ Say Fo<TAB>
$ Say Foo\ bar
$ Say Ge<TAB>
$ Say Get\ it\ \(42\)
4

2 回答 2

20

简单的完成需求可以更好地解决_describe,它将一个包含完成选项的数组和它们的描述配对(您可以使用多个数组/描述对,查看手册)。

_arguments很棒,但太复杂了。)

[...]

首先创建一个文件

echo "foo\nbar\nbaz\nwith spac e s\noh:noes\noh\:yes" >! ~/simple-complete

_simple然后在你的某处创建一个文件$fpath

#compdef simple

# you may wish to modify the expansion options here
# PS: 'f' is the flag making one entry per line
cmds=( ${(uf)"$(< ~/simple-complete)"} ) 

# main advantage here is that it is easy to understand, see alternative below
_describe 'a description of the completion options' cmds

# this is the equivalent _arguments command... too complex for what it does
## _arguments '*:foo:(${cmds})'

然后

function simple() { echo $* }
autoload _simple # do not forget BEFORE the next cmd! 
compdef _simple simple # binds the completion function to a command

simple [TAB]

有用。只需确保完成文件_simple放置在您的fpath.

请注意,:在选项列表中应该用于将选项与其(个人)描述(oh:noes)分开。_describe所以除非你引用它(oh\:yes),否则它不会起作用。注释掉的_arguments示例不会使用 the:作为分隔符。

于 2013-06-26T12:42:09.467 回答
1

在没有进一步更改.zshrc(我已经拥有autoload -Uz compinit compinit)的情况下,我添加了以下内容/usr/local/share/zsh/site-functions/_drush

#compdef drush
_arguments "1: :($(/usr/local/bin/aliases-drush.php))"

其中/usr/local/bin/aliases-drush.php仅打印字符串列表,每个字符串都是命令 drush 的潜在第一个参数。您可以使用($(< filename))来完成 from filename

我基于https://unix.stackexchange.com/a/458850/9452 - 令人惊讶的是这在一天结束时多么简单。

于 2018-07-27T03:15:20.123 回答