zstyle
Похоже, что это просто центральное место для хранения и извлечения данных, как альтернатива export
-ing параметрам оболочки. Это правда или есть что-то еще?
zstyle
Похоже, что это просто центральное место для хранения и извлечения данных, как альтернатива export
-ing параметрам оболочки. Это правда или есть что-то еще?
Ответы:
zstyle
обрабатывает очевидный контроль стиля для системы завершения, но, кажется, охватывает не только это. Например, vcs_info
модуль использует его для отображения статуса git в вашем приглашении. Вы можете начать смотреть на несколько пояснительных пунктов в man zshmodules
в zstyle
разделе.
Вы можете просто вызвать его, чтобы увидеть, какие настройки действуют. Это может быть поучительно.
В Zsh Book также есть хорошая глава 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 находятся в модулях, отдельно от ядра оболочки. Каждый из этих модулей может быть связан с оболочкой во время сборки или может быть динамически связан во время работы оболочки, если установка поддерживает эту функцию. [...]
В этом отношении zsh больше похож на интерпретатор, такой как PHP, где основные встроенные команды определены в модуле «ядро», а другие встроенные команды содержатся в «модулях».
Хорошо, отлично, тогда что такое "zstyle"?
Zsh, как и другие оболочки, имеет встроенные команды, такие как source
, cd
или declare
- zstyle
просто еще одна из этих «встроенных функций».
Встроенные функции и параметры оболочки, как правило, являются «глобальными» в том смысле, что они обычно (но не всегда) применимы / применимы в любое время или в контексте всего процесса оболочки, или, другими словами, они обычно применяются к zsh и всем подсистемам. (модули). Обратите внимание, что это применимо независимо от того, вызывается ли оболочка как интерактивный или неинтерактивный интерпретатор.
Так, например, вы можете использовать встроенный параметр source
или, cd
или параметр оболочки «globstar» будет действителен либо в командной строке, либо в case
операторе в неинтерактивном сценарии, либо в функции в этом же сценарии.
Вопреки другому ответу выше, zstyle
это не встроенная функция, специфичная для модуля compsys (система дополнений), zstyle
а встроенная глобальная.
zstyle
определяется zsh/util
модулем, это просто означает, что код, который определяет, как анализировать, и «do» 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>
Единственное смутно значимое описание глупо названного и плохо документированного "(z) стиля", которое я нашел - взято из глоссария From Bash To The Z Shell
style
В
zsh
механизме стилей это гибкий способ настройки надстроек оболочки, которые используют функции, такие как система завершения и виджеты редактора. В отличие от переменных они могут быть разными в разных контекстах и в отличие от параметров оболочки они могут принимать значения. Механизм основан на командном стиле.
Кроме того, в разделе «Обработка стилей» автор дополнительно уточняет ...
С более сложными функциями завершения вы можете захотеть, чтобы аспекты поведения функции конфигурировались с помощью
style
.... многие вспомогательные функции ищут стили для вас, поэтому ваша функция будет реагировать на многие стили без необходимости делать что-то конкретное. Чтобы получить представление о стилях, которые ищутся в конкретной ситуации, вызовите функцию _complete_help с числовым аргументом. Как правило, вы можете сделать это, нажав, Esc2а затем Ctrl
-
x h. Это в первую очередь полезно при настройке завершения, поскольку позволяет увидеть, какие стили ищутся и соответствующий контекст.
Одна из самых неприятных вещей в ZSH - выяснить, где найти различные команды на страницах руководства. В этом случае документацию для zstyle можно найти здесьman zshmodules
или здесь, онлайн .
Эта встроенная команда используется для определения и поиска стилей. Стили - это пары имен и значений, где значения состоят из любого числа строк. Они хранятся вместе с шаблонами, и поиск выполняется путем предоставления строки, называемой «контекст», которая сравнивается с шаблонами. Определение, сохраненное для первого соответствующего шаблона, будет возвращено.
В 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*'