Was macht `zstyle`?

23

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?

Shadowtalker
quelle
6
Hat das q aus zwei Gründen hochgestuft; a) Google schickt mich trotzdem hierher; b) zstyle scheint eine Menge zu haben, die nichts mit "Stil" oder Auto-Vervollständigung zu tun zu haben scheint. Eine der Antworten hier kommentiert sogar, wie das Feature schrecklich benannt ist.
ZaTricky

Antworten:

19

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.

Micah Elliott
quelle
2
Vielen Dank für den Link zum Zsh-Buch und den Tipp zum Completion-Verzeichnis. Das Zsh-Handbuch ist sehr funktional und enthält nur sehr
wenige
"... ist schwer in der Funktionalität und sehr leicht in Anwendungsfällen und Beispielen" - leider der Fall für die meisten von Programmierern geschriebenen Materialien.
aaaaaa
9

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.

Umfang der eingebauten und Shell-Optionen

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.

Festlegen von Optionen, die für ein Modul oder eine Shell-Funktion spezifisch sind

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>
the_velour_fog
quelle
8

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 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.

alex grau
quelle
2

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.

Caleb
quelle
Dies ist die beste Antwort, da sie auf die Dokumente verweist. Ich brauchte das, um von zstyle lesen zu lernen. Die anderen Antworten geben nur Adresseinstellungsstile an.
Cbarrick
1

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*'
mattmc3
quelle