从文件中创建zsh完整参数

时间:2013-06-26 11:35:09

标签: zsh zsh-completion

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\)

2 个答案:

答案 0 :(得分:18)

使用_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示例不会将:用作分隔符。

答案 1 :(得分:0)

.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))filename完成。

我基于https://unix.stackexchange.com/a/458850/9452进行此操作–令人惊讶的是,一天结束时如此简单。