在我的 中.zshrc
,我已menu select
全局禁用,除了mpv/mplayer
:
zstyle ':completion:*' menu select=0
zstyle ':completion::complete:mpv:*' menu yes select
这按预期工作,但我想修改规则,以便在调用菜单时mpv
仅显示媒体文件,即“mp3|mp4|mpg|avi|...”
我尝试更改*
为来*.mp3
测试它,但这不起作用。
我该如何修改我的规则?
答案1
zstyle
补全设置影响补全的显示方式,并且可以调整补全的生成方式,但不能确定生成补全的代码。该代码是使用compdef
、compctl
或等效方法设置的。
如果您只想指定媒体文件作为 的补全mpv
,请调用compctl
您的.zshrc
:
compctl -/ -g '*.(#i)(mp3|mp4|mpg|avi)' mpv
该-/
选项表示除了其他完成之外还要完成目录(否则您将无法访问子目录中的文件)。该-g
选项指定一个全局模式来选择要完成的文件。(#i)
导致不区分大小写的匹配。
compdef
对于更复杂的完成选择,请编写一个函数(超出了本答案的范围)并使用或通过自动加载魔法将其与命令关联起来。如果该函数想要调整生成补全的方式,则可以查询 zstyle 样式。
答案2
我们可以指定ignored-patterns
zstyle
加上这样的额外行:
# append below line
zstyle ':completion::complete:mpv:*:*files' ignored-patterns '^*.(#i)(mp3|mp4|mpg|avi)'
PS:^
是一个“全局运算符”,可以^x
匹配除模式之外的任何内容x
,因此上面的zstyle
粗略意思是请教 zsh 忽略命令的非媒体文件mpv
。
ignored-patterns
模式列表;任何与其中一种模式匹配的试验完成都将被排除在考虑范围之外。完成者
_ignored
可以出现在完成者列表中以恢复被忽略的匹配。这是 shell 参数的更可配置的版本$fignore
。请注意,
EXTENDED_GLOB
选项是在完成函数执行期间设置的,因此字符 '#
'、'~
' 和 '^
' 在模式中具有特殊含义。
答案3
你需要做两件事。 (注:这不是猜测。我已经测试过了,它有效。)
首先,您需要file-patterns
在mpv
您的中定义.zshrc
:
zstyle ':completion:*:mpv:*' file-patterns \
'%p.(mp3|mp4|mpg|avi)(#q^-/):globbed-files:"media file"' '*(-/):directories:directory' '*(#q^-/):all-files:file'
这告诉 Zsh 的完成系统,在第一次尝试时,仅完成以指定扩展名结尾的文件(如果已启用,则带有标题“媒体文件” group-name
)。仅当失败时,它才会提供目录。只有当这也失败时,才提供任何其他类型的文件。 ((#q^-/)
仅匹配非目录,而(-/)
仅匹配目录。)
但这还不够,因为提供的补全mpv
(您确实安装了这些,对吧?),还尝试提供 URL 作为补全。为了避免在有可用媒体文件时看到这些内容,请添加以下内容:
zstyle ':completion:*:mpv:*' tag-order 'files'
这表示对于该命令mpv
,它应该首先尝试提供文件(包括上面的所有内容file-patterns
),只有当失败时,才提供其他内容。