zstyle
Es scheint nur ein zentraler Ort zum Speichern und Abrufen von Daten zu sein, eine Alternative zu export
Shell-Parametern. Ist das wahr oder steckt noch mehr dahinter?
zstyle
Es scheint nur ein zentraler Ort zum Speichern und Abrufen von Daten zu sein, eine Alternative zu export
Shell-Parametern. Ist das wahr oder steckt noch mehr dahinter?
Antworten:
zstyle
behandelt die offensichtliche Stilkontrolle für das Vervollständigungssystem, aber es scheint mehr als nur das zu umfassen. Das vcs_info
Modul verwendet es beispielsweise zur Anzeige des Git-Status in Ihrer Eingabeaufforderung. Sie können durch einen Blick auf den wenigen erläuternden Absätzen beginnen man zshmodules
im zstyle
Abschnitt.
Sie können es einfach aufrufen, um zu sehen, welche Einstellungen wirksam sind. Dies kann aufschlussreich sein.
Das Zsh-Buch enthält ein zstyle
ausführliches Kapitel , in dem auch die verschiedenen Bereiche ausführlich erläutert werden.
Sie können im .../Completion/
Verzeichnis auf Ihrem System nachsehen, wie einige dieser Dateien verwendet werden zstyle
. Ein gemeinsamer Ort ist in der Nähe /usr/share/zsh/functions/Completion/*
. Ich sehe, dass es in mehr als 100 Dateien auf meinem System verwendet wird. Auch Benutzer haben sich oft in ihrer zstyle
Nähe ~/.zshrc
herumgetrieben. Hier sind einige nette Beispiele, mit denen Sie Ihrem Abschluss Farbe und Beschreibungen hinzufügen können:
# 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'
# ...
Das Vervollständigungssystem macht die meisten Felder deutlich, wenn Sie damit herumspielen. Versuchen Sie es mit der Eingabe, zstyle :«tab»
und Sie sehen einige Optionen. Wenn Sie die Tabulatortaste bis zum nächsten Doppelpunkt ausfüllen, werden die nächsten Optionen usw. angezeigt.
Um richtig zu verstehen, wie es zstyle
funktioniert, müssen Sie zunächst verstehen, dass zsh ein modulares Programm ist. Vonman zshmodules
Einige optionale Teile von zsh befinden sich in Modulen, die vom Kern der Shell getrennt sind. Jedes dieser Module kann zur Erstellungszeit in die Shell eingebunden oder während der Ausführung der Shell dynamisch eingebunden werden, wenn die Installation diese Funktion unterstützt. [...]
In dieser Hinsicht ähnelt zsh eher einem Interpreter wie PHP, in dem die wichtigsten eingebauten Befehle im "Kern" -Modul definiert sind, während andere eingebaute Befehle in "Modulen" enthalten sind.
Ok, großartig, was ist dann "zstyle"?
zsh hat wie andere Shells eingebaute Befehle, wie zum Beispiel source
, cd
oder declare
- zstyle
ist nur ein weiterer dieser "eingebauten" Befehle.
Builtins und Shell-Optionen sind in der Regel "global" in dem Sinne, dass sie während des gesamten Shell-Prozesses im Allgemeinen (aber nicht immer) anwendbar / verwendbar sind. Mit anderen Worten, sie gelten im Allgemeinen für zsh und alle Subsysteme (Module). Beachten Sie, dass dies unabhängig davon gilt, ob eine Shell als interaktiver oder nicht interaktiver Interpreter aufgerufen wird.
So zum Beispiel können Sie die builtin der Verwendung source
oder cd
oder die Shell - Option „globstar“ gültig sein wird , ob an einer Eingabeaufforderung oder in einer case
Anweisung in einer nicht-interaktiven Skript oder in einer Funktion im selber Skript.
Im Gegensatz zu einer anderen Antwort oben zstyle
ist kein Builtin, das für das "compsys" (completions system) -Modul spezifisch zstyle
ist, ein "globales" Builtin.
zstyle
Wird vom zsh/util
Modul definiert , bedeutet dies einfach, dass der Code, der das Parsen definiert, und "do" zstyle
im zsh/zutil
Modul definiert werden.
Sie könnten diese Tatsache genauso gut vergessen, dh Bash erfordert nicht, dass Sie wissen, dass der Code für das eval
eingebaute Element in der Datei enthalten ist eval.c
, aber um Hilfe zu erhalten zstyle
, ist es hilfreich zu wissen, dass zstyle
es sich um ein im zsh/zutil
Modul definiertes integriertes Element handelt , und Auf die Dokumentation für das zsh/zutil
Modul kann durch Ausführen von zugegriffen werden man zshmodules
.
Traditionell waren Shell-Optionen also im Allgemeinen "global", aber wie in der Beschreibung von beschrieben man zshmodules
, sind einige optionale Teile von zsh in Modulen enthalten , und außerdem wurde ein Großteil der zsh
Funktionalität in Shell-Funktionen geschrieben. (Ähnlich wie viele Kern- und optionale Funktionen von vim in vimscript geschrieben wurden).
Wenn Sie also Optionen angeben möchten, die nur für diese Module oder Funktionen gelten, wie würden Sie dies tun?
Nun, das ist zstyle
es, was Ihnen die Möglichkeit gibt, Optionen auf einer viel feineren Ebene als herkömmliche "globale" Shell-Optionen zu "zielen".
zstyle
erreicht dies durch die Auseinandersetzung"pattern"
Ein Beispielbefehl, der ein optionales Verhalten für "compsys" konfiguriert:
zstyle ':completion::complete:lsof:*' menu yes select
und Konfigurieren eines optionalen Verhaltens für "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 '
Aber es hört nicht damit auf, die zstyles
Fähigkeit, auf Kontexte abzuzielen, ist unglaublich leistungsfähig. Angenommen, Sie möchten ein Verhalten / Optionen für das vcs_info
Feature definieren, wenn Sie ein .git
Repository sind, im Gegensatz zu einem svn
Repo, dann könnten Sie das ändern Kontextmuster
:vcs_info:<svn_or_whatever_SCM_system>:* <style>
Was ist mit optionalem Verhalten für ein bestimmtes Projekt mit einem svn
Repo? dann
:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
Die einzige vage aussagekräftige Beschreibung des dumm benannten und schlecht dokumentierten "(z) -Stils", den ich gefunden habe, stammt aus dem Glossar von From Bash To The Z Shell
style
Der
zsh
Stilmechanismus ist eine flexible Methode zum Konfigurieren von Shell-Add-Ons, die Funktionen wie das Vervollständigungssystem und Editor-Widgets verwenden. Im Gegensatz zu Variablen können sie in verschiedenen Kontexten unterschiedlich sein und im Gegensatz zu Shell-Optionen können sie Werte annehmen. Der Mechanismus basiert auf dem Befehlsstil.
Außerdem geht der Autor im Abschnitt "Umgang mit Stilen" näher auf ...
Bei komplexeren Vervollständigungsfunktionen möchten Sie möglicherweise zulassen, dass Aspekte des Funktionsverhaltens mithilfe von konfiguriert werden können
style
.... viele Hilfsfunktionen suchen Stile für Sie, damit Ihre Funktion auf viele Stile reagiert, ohne dass Ihre Funktion etwas Besonderes tun muss. Rufen Sie die _complete_help-Funktion mit einem numerischen Argument auf, um sich einen Überblick über die in einer bestimmten Situation nachgeschlagenen Stile zu verschaffen. Normalerweise können Sie dies tun, indem Sie Esc2gefolgt von drücken Ctrl
-
x h. Dies ist vor allem beim Konfigurieren des Abschlusses hilfreich, da Sie sehen können, welche Stile nachgeschlagen werden und in welchem Kontext sie angezeigt werden.
Eines der frustrierendsten Dinge an ZSH ist, herauszufinden, wo die verschiedenen Befehle in den Manpages zu finden sind. In diesem Fall finden Sie die Dokumentation für zstyle in man zshmodules
oder hier online .
Dieser eingebaute Befehl wird zum Definieren und Nachschlagen von Stilen verwendet. Stile sind Paare von Namen und Werten, wobei die Werte aus einer beliebigen Anzahl von Zeichenfolgen bestehen. Sie werden zusammen mit Mustern gespeichert, und die Suche erfolgt durch Angabe einer Zeichenfolge, die als "Kontext" bezeichnet wird und mit den Mustern verglichen wird. Die für das erste übereinstimmende Muster gespeicherte Definition wird zurückgegeben.
Es gibt einen großen Mangel an guten Beispielen im zsh-Bereich und die Dokumentation ist stumpf. Ich verbrachte einige Zeit damit, mir anzusehen, wie Prezto zstyle benutzt, die Dokumente zu lesen und einige Dinge auszuprobieren . zstyle wird anscheinend hauptsächlich in Vervollständigungen verwendet, eignet sich jedoch sehr gut zum Speichern von Daten auf eine Weise, die komplexer ist als einfache alte Umgebungsvariablen.
Diese Übersicht zeigt, wie Sie mit zstyle Informationen speichern und abrufen können:
# 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*'