zstyle是做什么的?


23

zstyle似乎它只是存储和检索数据的中心,就像export-ing shell参数的替代方法一样。那是真的,还是更多?


6
赞成q有两个原因;a)Google还是将我发送到这里;b)zstyle似乎有很多用处,似乎与“ style”或自动完成无关。这里的答案之一甚至是对该功能的命名方式的评论。
zaTricky

Answers:


19

zstyle为完成系统处理明显的样式控制,但似乎不仅限于此。例如,vcs_info模块依赖它在提示中显示git status。您可以先查看man zshmoduleszstyle节中的一些解释性段落。

您可以简单地调用它以查看有效的设置。这可能是有益的。

岩组本书有一个很好的治疗一章zstyle,也详细解释了各个领域。

您可以在.../Completion/系统目录中四处查找,以查看其中一些文件如何利用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
感谢您链接到Zsh的书,以及有关Completion目录的技巧。Zsh手册注重功能,很少涉及用例和示例
Shadowtalker

“ ...功能繁重,用例和示例很少”-不幸的是,大多数程序员编写的材料都是这种情况。
aaaaaa

9

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

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

在这方面,zsh更像PHP的解释器,其中主要的内置命令在“核心”模块中定义,而其他内置命令在“模块”中包含。
好的,那么“ zstyle”是什么?
zsh的,像其它壳已经内置命令,例如sourcecddeclare-zstyle是这些“内建”的只是另一个。

内建程序和shell选项的范围

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

zstylezsh/util模块定义,这仅表示定义如何解析的代码,并且zstylezsh/zutil模块中定义了“ do” 。
您可能会忘记这一事实,即bash不需要您知道eval内建代码包含在文件中eval.c,但是要获得的帮助zstyle,它有助于知道这zstylezsh/zutil模块中定义的内建函数,并且zsh/zutil可以通过运行来访问该模块的文档man zshmodules

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

因此,传统上,shell选项通常是“全局”的,但根据的描述man zshmoduleszsh的某些可选部分位于模块中,而且,许多zsh功能已用shell函数编写。(类似于在vimscript中编写了许多vim核心和可选功能)。
因此,如果您希望能够指定仅适用于这些模块或功能的选项,您将如何做?
嗯,这就是zstyle事实,它使您能够在比传统的“全局”外壳选项更好的水平上“定位”选项。
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>

8

我发现的关于愚蠢的命名和错误记录的“(z)样式” 的唯一含糊的有意义的描述-来自《从Bash到Z Shell》的词汇表

style

zsh,样式机制是配置使用功能(如完成系统和编辑器小部件)的Shell附件的灵活方法。与变量不同,它们可以在不同的上下文中有所不同,与外壳选项不同,它们可以采用值。该机制基于命令样式。

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

使用更复杂的完成功能,您可能希望允许使用以下命令配置功能行为的各个方面 style

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


2

关于ZSH的最令人沮丧的事情之一是在手册页中找出在哪里可以找到其各种命令。在这种情况下,可以在网上此处找到有关zstyle的文档man zshmodules

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


这是最佳答案,因为它链接到文档。我需要它来学习如何阅读zstyle。其他答案仅解决地址设置样式。
cbarrick

1

zsh空间中缺少很好的示例,并且该文档比较晦涩。我花了一些时间研究Prezto如何使用zstyle,以及阅读文档和尝试一些事情。zstyle似乎主要用于补全中,但实际上对于以比普通环境变量更复杂的方式存储数据非常有用。

该要点说明了如何使用zstyle来存储和检索信息:

# reference: http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module

# list all zstyle settings
zstyle -L

# set a string value
zstyle :example:favorites fruit apple

# set an explicit string value
zstyle -s ':example:favorites' 'computer' 'apple'

# assign new $fav variable with -g
zstyle -g fav ':example:favorites' fruit && echo $fav

# be explicit about the assignment data type:
# -a: array, -b: boolean, -s: string
zstyle -b ':example:favorites:vegtable' 'broccoli' no

# test with -t
if zstyle -t ':example:favorites' 'fruit' 'apple'; then
  echo "an apple a day keeps the dr. away"
fi
if ! zstyle -t ':example:favorites:vegtable' 'broccoli' 'no'; then
  echo "Broccoli is the deadliest plant on Earth - why, it tries to warn you itself with its terrible taste"
fi

# delete a value with -d
zstyle -d ':example:favorites' 'computer'

# list only zstyle settings for a certain pattern
zstyle -L ':example:favorites*'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.