媒体播放器的 zsh 补全

媒体播放器的 zsh 补全

在我的 中.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补全设置影响补全的显示方式,并且可以调整补全的生成方式,但不能确定生成补全的代码。该代码是使用compdefcompctl或等效方法设置的。

如果您只想指定媒体文件作为 的补全mpv,请调用compctl您的.zshrc

compctl -/ -g '*.(#i)(mp3|mp4|mpg|avi)' mpv

-/选项表示除了其他完成之外还要完成目录(否则您将无法访问子目录中的文件)。该-g选项指定一个全局模式来选择要完成的文件。(#i)导致不区分大小写的匹配。

compdef对于更复杂的完成选择,请编写一个函数(超出了本答案的范围)并使用或通过自动加载魔法将其与命令关联起来。如果该函数想要调整生成补全的方式,则可以查询 zstyle 样式。

答案2

我们可以指定ignored-patternszstyle加上这样的额外行:

# 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选项是在完成函数执行期间设置的,因此字符 ' #'、' ~' 和 ' ^' 在模式中具有特殊含义。

---zshcompsys(1),zsh补全系统,标准样式

答案3

你需要做两件事。 (注:这不是猜测。我已经测试过了,它有效。)

首先,您需要file-patternsmpv您的中定义.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),只有当失败时,才提供其他内容。

相关内容