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\)
答案 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进行此操作–令人惊讶的是,一天结束时如此简单。