Чтобы правильно понять, как работает zstyle
, сначала нужно понять, что zsh - модульная программа. Из man zshmodules
Некоторые дополнительные части zsh находятся в модулях, отдельно от ядра оболочки. Каждый из этих модулей может быть подключен к оболочке при или могут быть динамически подключены во время работы оболочки, если установка поддерживает эту возможность. [...]
В этом отношении zsh больше похож на интерпретатор типа PHP, где основные встроенные команды определены в модуле "ядро", а другие встроенные команды содержатся в "модулях".
Отлично, тогда что такое "zstyle"?
zsh, как и другие оболочки, имеет встроенные команды, такие как source
, cd
или declare
- zstyle
является еще одним из таких "встроенных модулей".
встроенные модули и опции оболочки обычно являются "глобальными" в том смысле, что они обычно (но не всегда) применимы/используются в любое время или в любом контексте в процессе работы оболочки, или, другими словами, они обычно применяются к zsh и всем подсистемам (модулям). Обратите внимание, что это применимо независимо от того, вызывается ли оболочка как интерактивный или неинтерактивный интерпретатор.
Так, например, вы можете использовать встроенные source
или cd
или опция оболочки "globstar" будет действительна как в командной строке, так и в case
операторе в неинтерактивном сценарии или в функции в этом же сценарии.
Вопреки другому ответу выше, zstyle
не является встроенным модулем, специфичным для модуля "compsys" (completions system), zstyle
является "глобальным" встроенным модулем.
zstyle
определен модулем zsh/util
, это просто означает, что код, определяющий, как разобрать и "сделать" zstyle
, определен в модуле zsh/zutil
.
С таким же успехом можно забыть об этом факте, т.е. bash не требует, чтобы вы знали, что код встроенного модуля eval
содержится в файле eval. c
, но чтобы получить помощь по zstyle
, нужно знать, что zstyle
- это встроенный модуль, определенный в модуле zsh/zutil
, а документацию по модулю zsh/zutil
можно получить, выполнив команду man zshmodules
.
Традиционно опции оболочки обычно были "глобальными", но согласно описанию из man zshmodules
, некоторые необязательные части zsh находятся в модулях, а также, большая часть функциональности zsh
была написана в функциях оболочки. (подобно тому, как большая часть основной и дополнительной функциональности vim была написана в vimscript).
Итак, если вы хотите иметь возможность указать опции, которые применяются только к этим модулям или функциям, как вы это сделаете?
Вот что делает 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>