Что делает zstyle?


23

zstyleПохоже, что это просто центральное место для хранения и извлечения данных, как альтернатива export-ing параметрам оболочки. Это правда или есть что-то еще?


6
Upvoted q по двум причинам; а) Google все равно отправляет меня сюда; б) у zstyle, кажется, есть много чего, что, кажется, не имеет ничего общего со «стилем» или автозаполнением. Один из ответов здесь даже комментирует, как эта функция ужасно названа.
zaTricky

Ответы:


19

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»и вы увидите несколько вариантов. Заполните вкладку до следующего двоеточия, и вы увидите следующий набор параметров и т. Д.


2
Спасибо за ссылку на книгу Zsh и подсказку о каталоге Completion. Руководство по Zsh имеет много функциональных возможностей и очень мало для случаев использования и примеров
shadowtalker

«... тяжелый по функциональности и очень легкий по сценариям использования и примерам» - к сожалению, это относится к большинству материалов, написанных программистами
аааааа

9

Чтобы правильно понять, как 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>

8

Единственное смутно значимое описание глупо названного и плохо документированного "(z) стиля", которое я нашел - взято из глоссария From Bash To The Z Shell

style

В zshмеханизме стилей это гибкий способ настройки надстроек оболочки, которые используют функции, такие как система завершения и виджеты редактора. В отличие от переменных они могут быть разными в разных контекстах и ​​в отличие от параметров оболочки они могут принимать значения. Механизм основан на командном стиле.

Кроме того, в разделе «Обработка стилей» автор дополнительно уточняет ...

С более сложными функциями завершения вы можете захотеть, чтобы аспекты поведения функции конфигурировались с помощью 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*'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.