Cosa fa `zstyle`?


23

zstylesembra che sia solo un posto centrale per archiviare e recuperare dati, come un'alternativa ai exportparametri della shell -ing. È vero o c'è dell'altro?


6
Ha annullato la q per due motivi; a) Google mi manda comunque qui; b) zstyle sembra avere molto da fare per questo che sembra non avere nulla a che fare con "stile" o completamento automatico. Una delle risposte qui anche commenti su come la funzione è terribilmente chiamata.
zaTricky,

Risposte:


19

zstylegestisce l'ovvio controllo dello stile per il sistema di completamento, ma sembra coprire più di questo. Ad esempio, il vcs_infomodulo si basa su di esso per la visualizzazione dello stato git nel prompt. Puoi iniziare guardando i pochi paragrafi esplicativi man zshmodulesnella zstylesezione.

Puoi semplicemente invocarlo per vedere quali impostazioni sono attive. Questo può essere istruttivo.

Il libro Zsh ha anche un bel capitolo trattatozstyle , che spiega in dettaglio i suoi vari campi.

Puoi cercare nella .../Completion/directory del tuo sistema per vedere come vengono utilizzati alcuni di questi file zstyle. Un luogo comune è vicino /usr/share/zsh/functions/Completion/*. Lo vedo usato in oltre 100 file sul mio sistema lì. Gli utenti hanno spesso zstylespruzzato anche loro ~/.zshrc. Eccone alcuni carini per aggiungere un po 'di colore e descrizioni al tuo completamento:

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

Il sistema di completamento rende la maggior parte dei campi chiari se ci giochi. Prova a digitare zstyle :«tab»e vedrai alcune opzioni. Tab-complete per i due punti successivi e vedrai il prossimo set di opzioni, ecc.


2
Grazie per il link al libro Zsh e per il suggerimento sulla directory di completamento. Il manuale di Zsh è ricco di funzionalità e molto leggero su casi d'uso ed esempi
shadowtalker

"... è pesante in termini di funzionalità e molto leggero in casi d'uso ed esempi" - sfortunatamente è il caso della maggior parte dei materiali scritti dai programmatori.
aaaaaa,

9

Per capire correttamente come zstylefunziona, devi prima capire che zsh è un programma modulare. A partire dalman zshmodules

Alcune parti opzionali di zsh sono in moduli, separati dal nucleo della shell. Ognuno di questi moduli può essere collegato alla shell in fase di compilazione o può essere collegato dinamicamente mentre la shell è in esecuzione se l'installazione supporta questa funzionalità. [...]

A questo proposito zsh è più simile a un interprete come PHP in cui i principali comandi integrati sono definiti nel modulo "core", ma altri comandi integrati sono contenuti in "moduli".
Ok fantastico, quindi cos'è "zstyle"?
zsh, come altre shell ha comandi integrati, come source, cdo declare- zstyleè solo un altro di questi "builtin".

Ambito di opzioni predefinite e shell

i builtin e le opzioni di shell sono generalmente "globali", nel senso che sono generalmente (ma non sempre) applicabili / utilizzabili in qualsiasi momento o contesto durante il processo di shell, o in altre parole, si applicano generalmente a zsh e a tutti i sottosistemi (moduli). Nota questo vale se una shell viene invocata come interprete interattivo o non interattivo.
Quindi, ad esempio, è possibile utilizzare l' opzione incorporata sourceo cdo shell "globstar" sarà valida sia al prompt dei comandi o in caseun'istruzione in uno script non interattivo o in una funzione nello stesso script.
Contrariamente a un'altra risposta sopra, zstylenon è un builtin specifico del modulo "compsys" (sistema di completamenti), zstyleè un builtin "globale".

zstyleè definito dal zsh/utilmodulo, ciò significa semplicemente che il codice che definisce come analizzare e "fare" zstyleè definito nel zsh/zutilmodulo.
Potresti anche dimenticare questo fatto, cioè bash non richiede di sapere che il codice per il evalbuiltin è contenuto nel file eval.c, ma per ottenere aiuto zstyle, aiuta a sapere che zstyleè un builtin definito nel zsh/zutilmodulo, e la documentazione per il zsh/zutilmodulo è accessibile eseguendo man zshmodules.

Impostazione delle opzioni specifiche di un modulo o di una funzione shell

Quindi, tradizionalmente, le opzioni della shell sono state generalmente "globali", ma come da descrizione man zshmodules, Alcune parti opzionali di zsh sono nei moduli e molte zshfunzionalità sono state scritte nelle funzioni della shell. (simile a quanto molte funzionalità core e opzionali di vim sono state scritte in vimscript).
Quindi, se vuoi essere in grado di specificare le opzioni che si applicano solo a questi moduli o funzioni, come lo faresti?
Bene, ecco cosa zstyleti dà, la possibilità di "targetizzare" le opzioni a un livello molto più raffinato rispetto alle tradizionali opzioni di shell "globali".
zstyleraggiunge questo attraverso l'argomento"pattern"

Un comando di esempio che configura alcuni comportamenti opzionali specifici di "compsys":

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

e configurando alcuni comportamenti opzionali specifici di "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 '

Ma non si ferma qui, la zstylescapacità di indirizzare i contesti è incredibilmente potente, ad esempio, dire che volevi definire alcuni comportamenti / opzioni per la vcs_infofunzione, quando eri un .gitrepository, al contrario di un svnrepository, quindi puoi modificare il modello di contesto

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

Che dire del comportamento facoltativo per un progetto specifico, con un svnrepository? poi

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

8

L'unica descrizione vagamente significativa dello stile "(z)" stupidamente nominato e mal documentato che ho trovato - proviene dal glossario di From Bash To The Z Shell

style

In zsh, il meccanismo di stile è un modo flessibile di configurare i componenti aggiuntivi della shell che utilizzano funzioni, come il sistema di completamento e i widget dell'editor. A differenza delle variabili, possono essere diversi in contesti diversi e, a differenza delle opzioni della shell, possono assumere valori. Il meccanismo si basa sullo stile di comando.

inoltre, nella sezione "Handling Styles", l'autore elabora ulteriormente ...

Con funzioni di completamento più sofisticate, potresti voler consentire la configurazione di aspetti del comportamento della funzione style.

... molte funzioni di aiuto cercano stili per te, quindi la tua funzione reagirà a molti stili senza che la tua funzione debba fare qualcosa in particolare. Per avere un'idea degli stili cercati in una situazione particolare, invoca la funzione _complete_help con un argomento numerico. Normalmente, puoi farlo premendo Esc2seguito da Ctrl-x h. Ciò è utile soprattutto quando si configura il completamento perché consente di vedere quali stili vengono cercati e il contesto associato.


2

Una delle cose più frustranti di ZSH è capire dove trovare i suoi vari comandi nelle pagine man. In questo caso la documentazione per zstyle può essere trovata in man zshmoduleso qui online .

Questo comando integrato viene utilizzato per definire e cercare gli stili. Gli stili sono coppie di nomi e valori, in cui i valori sono costituiti da un numero qualsiasi di stringhe. Sono memorizzati insieme a motivi e la ricerca viene eseguita dando una stringa, chiamata "contesto", che viene confrontata con i motivi. Verrà restituita la definizione memorizzata per il primo modello corrispondente.


Questa è la risposta migliore perché si collega ai documenti. Ne avevo bisogno per imparare a leggere da zstyle. Le altre risposte riguardano solo gli stili di impostazione.
cbarrick,

1

C'è un'enorme mancanza di buoni esempi nello spazio zsh e la documentazione è ottusa. Ho trascorso un po 'di tempo a guardare come Prezto usa zstyle, oltre a leggere i documenti e provare alcune cose. zstyle sembra essere utilizzato principalmente nei completamenti, ma in realtà è davvero buono per l'archiviazione dei dati in un modo che è più sofisticato delle variabili del semplice ambiente vecchio.

Questa sintesi mostra come utilizzare zstyle per archiviare e recuperare informazioni:

# 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*'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.