Що робить `zstyle`?


23

zstyleздається, що це просто центральне місце для зберігання та отримання даних, як альтернатива exportпараметрам -ing оболонки. Це правда, чи є в ній більше?


6
Захищено q з двох причин; а) Google все одно надсилає мене сюди; б) здається, що в стилі zstyle дуже багато, що, здається, не має нічого спільного зі "стилем" або автоматичним доповненням. Одна з відповідей тут навіть коментує те, як ця функція жахливо названа.
zaTricky

Відповіді:


19

zstyleобробляє очевидний стиль управління системою завершення, але, здається, охоплює більше, ніж просто це. Наприклад, vcs_infoмодуль покладається на нього для відображення статусу git у вашому запиті. Ви можете почати дивитися на кілька пояснювальних пунктів в man zshmodulesв zstyleрозділі.

Ви можете просто викликати його, щоб побачити, які налаштування діють. Це може бути повчальним.

Zsh Книга має хорошу обробку главу про 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 та підказку про каталог завершення. Посібник Zsh важкий по функціональності і дуже легкий у випадках використання та прикладів
shadowtalker

"... важка функціональність і дуже легка у випадках використання та прикладів", - на жаль, це стосується більшості матеріалів, написаних програмістами.
aaaaaa

9

Щоб правильно зрозуміти, як zstyleпрацює, спершу потрібно зрозуміти, що zsh - це модульна програма. Зman zshmodules

Деякі необов'язкові частини zsh знаходяться в модулях, окремо від серцевини оболонки. Кожен з цих модулів може бути підключений до оболонки під час збирання або може бути динамічно пов'язаний під час роботи оболонки, якщо установка підтримує цю функцію. [...]

У цьому плані zsh більше схожий на інтерпретатора на зразок PHP, де основні вбудовані команди визначені в модулі "core", а інші вбудовані команди містяться в "модулях".
Гаразд чудово, так що тоді "zstyle"?
zsh, як і інші оболонки, має вбудовані команди, такі як source, cdабо declare- zstyleпросто черговий із цих "вбудованих".

Об'єм вбудованих і оболонок варіантів

Параметри вбудованих і оболонок, як правило, "глобальні" в тому сенсі, що вони, як правило, (але не завжди) застосовні / застосовні в будь-який час або контекст протягом оболонки, або іншими словами, вони зазвичай застосовуються до zsh та всіх підсистем (модулі). Зауважте, це стосується того, чи оболонка викликається як інтерактивний чи неінтерактивний перекладач.
Так, наприклад , ви можете використовувати вбудований - й sourceабо cdабо варіант оболонки «globstar» буде чи дійсні в командному рядку або в caseзаяві в неінтерактивному скрипті або в функції в тому ж скрипті.
Всупереч іншій відповіді, наведеній вище, zstyleне вбудований, який є специфічним для модуля "compsys" (система доповнень), 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>

8

Єдиний розпливчасто змістовний опис дурно названого та погано задокументованого стилю (z) "Я знайшов - походить із словника" Bash To The Z Shell "

style

У zshмеханізмі стилю являє собою гнучкий спосіб настройки оболонки add- доповнення , які використовуйте функції, такі як система закінчення і редактор віджети. На відміну від змінних, вони можуть бути різними в різних контекстах і на відміну від параметрів оболонки вони можуть приймати значення. Механізм заснований на стилі команд.

також у розділі "Поводження зі стилями" автор далі детально розглядає ...

Завдяки більш досконалим функціям завершення ви можете дозволити налаштування аспектів поведінки функції за допомогою style.

... багато допоміжних функцій шукають стилі для вас, щоб ваша функція реагувала на багато стилів, без вашої функції не потрібно нічого робити зокрема. Щоб отримати уявлення про стилі, які шукаються в конкретній ситуації, виклик функції _complete_help з числовим аргументом. Як правило, ви можете це зробити, натиснувши і Esc2слідуючи Ctrl-x h. Це в першу чергу корисно при налаштуванні завершення, оскільки дозволяє побачити, які стилі шукаються та пов'язаний контекст.


2

Однією з найприємніших речей про ZSH є з'ясування, де знайти різні команди на сторінках man. У цьому випадку документацію щодо 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.