Que fait `zstyle`?


23

zstylesemble être juste un endroit central pour stocker et récupérer des données, comme une alternative aux exportparamètres du shell -ing. Est-ce vrai ou y a-t-il plus?


6
A voté le q pour deux raisons; a) Google m'envoie de toute façon ici; b) zstyle semble avoir beaucoup de choses qui semblent n'avoir rien à voir avec le "style" ou l'auto-complétion. L'une des réponses ici fait même des commentaires sur la façon dont la fonctionnalité est terriblement nommée.
zaTricky

Réponses:


19

zstylegère le contrôle de style évident pour le système d'achèvement, mais il semble couvrir plus que cela. Par exemple, le vcs_infomodule s'appuie sur lui pour afficher l'état git dans votre invite. Vous pouvez commencer par regarder les quelques paragraphes explicatifs man zshmodulesde la zstylesection.

Vous pouvez simplement l'invoquer pour voir quels paramètres sont en vigueur. Cela peut être instructif.

Le livre Zsh propose également un chapitre intéressant zstyle, expliquant en détail ses différents domaines.

Vous pouvez chercher dans le .../Completion/répertoire de votre système pour voir comment certains de ces fichiers utilisent zstyle. Un emplacement commun est proche /usr/share/zsh/functions/Completion/*. Je le vois utilisé dans plus de 100 fichiers sur mon système là-bas. Les utilisateurs ont souvent aussi zstylesaupoudré autour d'eux ~/.zshrc. Voici quelques jolies pour ajouter de la couleur et des descriptions à votre réalisation:

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

Le système d'achèvement rend la plupart des champs clairs si vous jouez avec. Essayez de taper zstyle :«tab»et vous voyez quelques options. Complétez par tabulation jusqu'au deux-points suivant et vous verrez l'ensemble d'options suivant, etc.


2
Merci pour le lien vers le livre Zsh et l'astuce sur le répertoire d'achèvement. Le manuel Zsh est lourd de fonctionnalités et très léger sur les cas d'utilisation et les exemples
shadowtalker

"... est lourd de fonctionnalités et très léger sur les cas d'utilisation et les exemples" - malheureusement le cas pour la plupart des documents écrits par les programmeurs.
aaaaaa

9

Pour bien comprendre le zstylefonctionnement, vous devez d'abord comprendre que zsh est un programme modulaire. Deman zshmodules

Certaines parties optionnelles de zsh sont dans des modules, séparés du cœur du shell. Chacun de ces modules peut être lié au shell au moment de la construction, ou peut être lié dynamiquement pendant que le shell est en cours d'exécution si l'installation prend en charge cette fonctionnalité. [...]

À cet égard, zsh ressemble plus à un interpréteur comme PHP où les principales commandes intégrées sont définies dans le module "core", mais d'autres commandes intégrées sont contenues dans "modules".
D'accord, alors qu'est-ce que "zstyle"?
zsh, comme d'autres shells, a des commandes intégrées, telles que source, cdou declare- zstyleest juste une autre de ces "commandes intégrées".

Étendue des options intégrées et shell

les options intégrées et shell sont généralement "globales" dans le sens où elles sont généralement (mais pas toujours) applicables / utilisables à tout moment ou dans tout contexte tout au long du processus shell, ou en d'autres termes, elles s'appliquent généralement à zsh et à tous les sous-systèmes (modules). Notez que cela s'applique si un shell est appelé en tant qu'interpréteur interactif ou non interactif.
Ainsi, par exemple, vous pouvez utiliser l'option intégrée sourceou cdou le shell "globstar" sera valide que ce soit à l'invite de commandes ou dans une caseinstruction dans un script non interactif ou dans une fonction de ce même script.
Contrairement à une autre réponse ci-dessus, ce zstylen'est pas un module intégré spécifique au module "compsys" (système de complétion), zstylec'est un module intégré "global".

zstyleest défini par le zsh/utilmodule, cela signifie simplement que le code qui définit comment analyser, et "faire" zstyleest défini dans le zsh/zutilmodule.
Vous pourriez tout aussi bien oublier ce fait, c'est-à-dire que bash ne vous oblige pas à savoir que le code de la commande evalintégrée est contenu dans le fichier eval.c, mais pour obtenir de l'aide zstyle, il est utile de savoir qu'il zstyles'agit d'une commande intégrée définie dans le zsh/zutilmodule, et la documentation du zsh/zutilmodule est accessible en exécutant man zshmodules.

Définition d'options spécifiques à un module ou à une fonction shell

Donc, traditionnellement, les options shell sont généralement «globales», mais selon la description de man zshmodules, Certaines parties optionnelles de zsh sont dans des modules , et aussi, une grande partie de la zshfonctionnalité a été écrite dans des fonctions shell. (similaire à la façon dont beaucoup de fonctionnalités de base et facultatives de vim ont été écrites dans vimscript).
Alors, si vous voulez pouvoir spécifier des options qui s'appliquent uniquement à ces modules ou fonctions, comment feriez-vous?
Eh bien, c'est ce zstylequi vous donne la possibilité de "cibler" les options à un niveau beaucoup plus fin que les options de shell "globales" traditionnelles.
zstyley parvient grâce à l'argument"pattern"

Un exemple de commande qui configure certains comportements optionnels spécifiques à "compsys":

zstyle ':completion::complete:lsof:*' menu yes select

et configurer un comportement facultatif spécifique à "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 '

Mais cela ne s'arrête pas là, la zstylescapacité de cibler des contextes est incroyablement puissante, par exemple, disons que vous vouliez définir un comportement / des options pour la vcs_infofonctionnalité, lorsque vous étiez un .gitréférentiel, par opposition à un référentiel svn, alors vous pourriez modifier le modèle de contexte

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

Qu'en est-il du comportement optionnel pour un projet spécifique, avec un svnrepo? ensuite

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>

8

La seule description vaguement significative du style "(z)" stupidement nommé et mal documenté "que j'ai trouvé - vient du glossaire de From Bash To The Z Shell

style

Dans zsh, le mécanisme de style est un moyen flexible de configurer des modules complémentaires de shell qui utilisent des fonctions, telles que le système de complétion et les widgets de l'éditeur. Contrairement aux variables, elles peuvent être différentes dans différents contextes et contrairement aux options du shell, elles peuvent prendre des valeurs. Le mécanisme est basé sur le style de commande.

aussi, dans la section "Styles de manipulation", l'auteur développe plus loin ...

Avec des fonctions d'achèvement plus sophistiquées, vous souhaiterez peut-être autoriser la configuration de certains aspects du comportement de la fonction à l'aide de style.

... de nombreuses fonctions d'assistance recherchent des styles pour vous, de sorte que votre fonction réagira à de nombreux styles sans que votre fonction doive faire quoi que ce soit en particulier. Pour avoir une idée des styles recherchés dans une situation particulière, appelez la fonction _complete_help avec un argument numérique. Normalement, vous pouvez le faire en appuyant sur Esc2puis sur Ctrl-x h. Ceci est principalement utile lors de la configuration de l'achèvement car il vous permet de voir quels styles sont recherchés et le contexte associé.


2

L'une des choses les plus frustrantes à propos de ZSH est de savoir où trouver ses différentes commandes dans les pages de manuel. Dans ce cas, la documentation de zstyle peut être trouvée dans man zshmodulesou ici en ligne .

Cette commande intégrée est utilisée pour définir et rechercher des styles. Les styles sont des paires de noms et de valeurs, où les valeurs se composent d'un nombre quelconque de chaînes. Ils sont stockés avec des modèles et la recherche se fait en donnant une chaîne, appelée «contexte», qui est comparée aux modèles. La définition stockée pour le premier modèle correspondant sera retournée.


C'est la meilleure réponse car elle renvoie aux documents. J'en avais besoin pour apprendre à lire à partir de zstyle. Les autres réponses concernent uniquement les styles de configuration.
cbarrick

1

Il y a un énorme manque de bons exemples dans l'espace zsh, et la documentation est obtuse. J'ai passé un peu de temps à regarder comment Prezto utilise zstyle, ainsi qu'à lire les documents et à essayer certaines choses. zstyle semble être principalement utilisé dans les complétions, mais est en fait très bon pour stocker des données d'une manière plus sophistiquée que les variables de l'environnement classique.

Cet aperçu montre comment vous pouvez utiliser zstyle pour stocker et récupérer des informations:

# 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*'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.