Answers:
zstyle
为完成系统处理明显的样式控制,但似乎不仅限于此。例如,vcs_info
模块依赖它在提示中显示git status。您可以先查看man zshmodules
本zstyle
节中的一些解释性段落。
您可以简单地调用它以查看有效的设置。这可能是有益的。
该岩组本书有一个很好的治疗一章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»
,您会看到一些选项。制表符完整到下一个冒号,您将看到下一组选项,等等。
为了正确理解其zstyle
工作原理,您首先需要了解zsh是一个模块化程序。从man zshmodules
zsh的某些可选部分位于模块中,与外壳的核心分开。这些模块中的每个模块都可以在构建时链接到Shell中,或者可以在Shell运行时动态链接(如果安装支持此功能)。[...]
在这方面,zsh更像PHP的解释器,其中主要的内置命令在“核心”模块中定义,而其他内置命令在“模块”中包含。
好的,那么“ zstyle”是什么?
zsh的,像其它壳已经内置命令,例如source
,cd
或declare
-zstyle
是这些“内建”的只是另一个。
内建程序和外壳程序选项通常是“全局”的,因为它们通常(但并非总是)在整个外壳程序过程中的任何时间或上下文中都可以(但并非始终)适用/可用,换句话说,它们通常适用于zsh和所有子系统(模块)。请注意,无论将外壳作为交互解释器还是非交互解释器调用,这都适用。
因此,例如,您可以使用内置的source
或cd
shell选项“ globstar”在命令提示符下,在case
非交互式脚本中的语句或在同一脚本中的函数中有效。
与上面的另一个答案相反,zstyle
它不是特定于“ compsys”(完成系统)模块的zstyle
内置程序,而是“全局”内置程序。
zstyle
由zsh/util
模块定义,这仅表示定义如何解析的代码,并且zstyle
在zsh/zutil
模块中定义了“ do” 。
您可能会忘记这一事实,即bash不需要您知道eval
内建代码包含在文件中eval.c
,但是要获得的帮助zstyle
,它有助于知道这zstyle
是zsh/zutil
模块中定义的内建函数,并且zsh/zutil
可以通过运行来访问该模块的文档man zshmodules
。
因此,传统上,shell选项通常是“全局”的,但根据的描述man zshmodules
,zsh的某些可选部分位于模块中,而且,许多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>
我发现的关于愚蠢的命名和错误记录的“(z)样式” 的唯一含糊的有意义的描述-来自《从Bash到Z Shell》的词汇表
style
在
zsh
,样式机制是配置使用功能(如完成系统和编辑器小部件)的Shell附件的灵活方法。与变量不同,它们可以在不同的上下文中有所不同,与外壳选项不同,它们可以采用值。该机制基于命令样式。
另外,在“处理样式”部分中,作者进一步阐述了...
使用更复杂的完成功能,您可能希望允许使用以下命令配置功能行为的各个方面
style
。...许多辅助函数会为您查找样式,因此您的函数将对多种样式做出反应,而无需执行任何特殊操作。要了解在特定情况下查找的样式,请使用数字参数调用_complete_help函数。通常,您可以按,Esc2然后按Ctrl
-
x h。这在配置完成时非常有用,因为它使您可以查看要查找的样式以及关联的上下文。
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*'