zstyleEs scheint nur ein zentraler Ort zum Speichern und Abrufen von Daten zu sein, eine Alternative zu exportShell-Parametern. Ist das wahr oder steckt noch mehr dahinter?
zstyleEs scheint nur ein zentraler Ort zum Speichern und Abrufen von Daten zu sein, eine Alternative zu exportShell-Parametern. Ist das wahr oder steckt noch mehr dahinter?
Antworten:
zstylebehandelt die offensichtliche Stilkontrolle für das Vervollständigungssystem, aber es scheint mehr als nur das zu umfassen. Das vcs_infoModul 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 zshmodulesim zstyleAbschnitt.
Sie können es einfach aufrufen, um zu sehen, welche Einstellungen wirksam sind. Dies kann aufschlussreich sein.
Das Zsh-Buch enthält ein zstyleausfü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 zstyleNähe ~/.zshrcherumgetrieben. 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 zstylefunktioniert, 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, cdoder declare- zstyleist 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 sourceoder cdoder die Shell - Option „globstar“ gültig sein wird , ob an einer Eingabeaufforderung oder in einer caseAnweisung in einer nicht-interaktiven Skript oder in einer Funktion im selber Skript.
Im Gegensatz zu einer anderen Antwort oben zstyleist kein Builtin, das für das "compsys" (completions system) -Modul spezifisch zstyleist, ein "globales" Builtin.
zstyleWird vom zsh/utilModul definiert , bedeutet dies einfach, dass der Code, der das Parsen definiert, und "do" zstyleim zsh/zutilModul definiert werden.
Sie könnten diese Tatsache genauso gut vergessen, dh Bash erfordert nicht, dass Sie wissen, dass der Code für das evaleingebaute Element in der Datei enthalten ist eval.c, aber um Hilfe zu erhalten zstyle, ist es hilfreich zu wissen, dass zstylees sich um ein im zsh/zutilModul definiertes integriertes Element handelt , und Auf die Dokumentation für das zsh/zutilModul 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 zshFunktionalitä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 zstylees, was Ihnen die Möglichkeit gibt, Optionen auf einer viel feineren Ebene als herkömmliche "globale" Shell-Optionen zu "zielen".
zstyleerreicht 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 zstylesFähigkeit, auf Kontexte abzuzielen, ist unglaublich leistungsfähig. Angenommen, Sie möchten ein Verhalten / Optionen für das vcs_infoFeature definieren, wenn Sie ein .gitRepository sind, im Gegensatz zu einem svnRepo, 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 svnRepo? 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
styleDer
zshStilmechanismus 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 zshmodulesoder 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*'