`zstyle` 有什么作用?

`zstyle` 有什么作用?

zstyle看起来它只是存储和检索数据的中心位置,就像export-ing shell 参数的替代方案一样。这是真的吗,还是还有更多的内容?

答案1

zstyle处理完成系统的明显样式控制,但它似乎涵盖的不仅仅是这些。例如,该vcs_info模块依赖它在提示中显示 git 状态。您可以首先查看man zshmoduleszstyle节中的几个解释性段落。

您只需调用它即可查看哪些设置有效。这可能具有启发性。

书本对 也有很好的章节处理zstyle,详细解释了它的各个领域。

您可以在.../Completion/系统上的目录中查找 grep 来查看其中一些文件如何使用zstyle.一个常见的地点是附近/usr/share/zsh/functions/Completion/*。我看到它在我的系统上的 100 多个文件中使用。用户也经常zstyle在他们的周围撒上一些东西~/.zshrc。以下是一些不错的内容,可以为您的完成添加一些颜色和描述:

# Do menu-driven completion.
zstyle ':completion:*' menu select

# Color completion for some things.
# http://linuxshellaccount.blogspot.com/2008/12/color-completion-using-zsh-modules-on.html
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

# formatting and messages
# http://www.masterzen.fr/2009/04/19/in-love-with-zsh-part-one/
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format "$fg[yellow]%B--- %d%b"
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format "$fg[red]No matches for:$reset_color %d"
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Completers for my own scripts
zstyle ':completion:*:*:sstrans*:*' file-patterns '*.(lst|clst)'
zstyle ':completion:*:*:ssnorm*:*' file-patterns '*.tsv'
# ...

如果您使用完成系统,大部分字段都会变得清晰。尝试输入zstyle :«tab»,您会看到一些选项。按制表符完成下一个冒号,您将看到下一组选项等。

答案2

要正确理解其zstyle工作原理,您首先需要了解 zsh 是一个模块化程序。从man zshmodules

zsh 的一些可选部分位于模块中,与 shell 的核心分开。这些模块中的每一个都可以在构建时链接到 shell,或者如果安装支持此功能,则可以在 shell 运行时动态链接。 [...]

在这方面,zsh 更像是一个类似 PHP 的解释器,其中主要的内置命令定义在“core”模块中,但其他内置命令包含在“modules”中。
好吧,那么“zstyle”是什么?
zsh 与其他 shell 一样具有内置命令,例如sourcecddeclare-zstyle只是这些“内置命令”中的另一个。

内置函数和 shell 选项的范围

内置函数和 shell 选项通常是“全局”的,因为它们通常(但并非总是)在整个 shell 进程的任何时间或上下文中适用/可用,或者换句话说,它们通常适用于 zsh 和所有子系统(模块)。请注意,无论 shell 是作为交互式解释器还是非交互式解释器调用,这都适用。
因此,例如,您可以使用内置的source或shell 选项“globstar”无论是在命令提示符下还是在非交互式脚本中的语句中或在同一脚本中的函数中cd都有效。 与上面的另一个答案相反,它不是特定于“compsys”(完成系统)模块的内置函数,而是一个“全局”内置函数。 case
zstylezstyle

zstyle由模块定义zsh/util,这仅仅意味着定义如何解析的代码,并且“do”zstyle是在zsh/zutil模块中定义的。
您也可以忘记这个事实,即 bash 不需要您知道eval内置函数的代码包含在文件中eval.c,但要获得有关 的帮助zstyle,知道这zstyle是在模块中定义的内置函数会有所帮助zsh/zutil,并且zsh/zutil可以通过运行来访问该模块的文档man zshmodules

设置特定于模块或 shell 函数的选项

因此传统上 shell 选项通常是“全局”的,但根据 的描述man zshmoduleszsh 的一些可选部分位于模块中,而且很多zsh功能都是用 shell 函数编写的。 (类似于 vim 的许多核心和可选功能都是用 vimscript 编写的)。
那么,如果您希望能够指定仅适用于这些模块或函数的选项,您会怎么做呢?
嗯,这就是它的zstyle作用,使您能够比传统的“全局”shell 选项更精细地“定位”选项。
zstyle通过论证实现这一点"pattern"

配置特定于“compsys”的一些可选行为的示例命令:

zstyle ':completion::complete:lsof:*' menu yes select

并配置一些特定于“vcs_info”的可选行为:

zstyle ':vcs_info:*' actionformats \
      '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '

但它并不止于此,zstyles定位上下文的能力非常强大,例如,假设您想为该vcs_info功能定义一些行为/选项,当您是.git存储库而不是svn存储库时,那么您可以修改上下文模式

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

带有存储库的特定项目的可选行为怎么样svn?然后

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>

答案3

唯一的隐约有意义我发现的愚蠢命名且记录不实的“(z)style”的描述 - 来自词汇表从 Bash 到 Z Shell

style

在 中zsh,样式机制是配置使用功能的 shell 插件的灵活方式,例如完成系统和编辑器小部件。与变量不同,它们在不同的上下文中可以不同,并且与 shell 选项不同,它们可以取值。该机制基于命令风格。

另外,在“处理样式”部分中,作者进一步阐述...

对于更复杂的完成函数,您可能希望允许使用 来配置函数行为的各个方面style

...许多辅助函数会为您查找样式,因此您的函数将对多种样式做出反应,而无需您的函数执行任何特定操作。要了解在特定情况下查找的样式,请使用数字参数调用 _complete_help 函数。通常,您可以通过按 然后Esc2按 来完成此操作Ctrl-x h。这在配置完成时主要有用,因为它允许您查看查找的样式以及关联的上下文。

答案4

关于 ZSH 最令人沮丧的事情之一是弄清楚在手册页中哪里可以找到它的各种命令。在本例中,文档为风格man zshmodules可以在或中找到在线这里

此内置命令用于定义和查找样式。样式是名称和值对,其中值由任意数量的字符串组成。它们与模式存储在一起,并且通过提供一个称为“上下文”的字符串来完成查找,该字符串与模式进行比较。将返回为第一个匹配模式存储的定义。

相关内容