zstyle
sembra che sia solo un posto centrale per archiviare e recuperare dati, come un'alternativa ai export
parametri della shell -ing. È vero o c'è dell'altro?
zstyle
sembra che sia solo un posto centrale per archiviare e recuperare dati, come un'alternativa ai export
parametri della shell -ing. È vero o c'è dell'altro?
Risposte:
zstyle
gestisce l'ovvio controllo dello stile per il sistema di completamento, ma sembra coprire più di questo. Ad esempio, il vcs_info
modulo si basa su di esso per la visualizzazione dello stato git nel prompt. Puoi iniziare guardando i pochi paragrafi esplicativi man zshmodules
nella zstyle
sezione.
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 zstyle
spruzzato 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.
Per capire correttamente come zstyle
funziona, 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
, cd
o declare
- zstyle
è solo un altro di questi "builtin".
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 source
o cd
o shell "globstar" sarà valida sia al prompt dei comandi o in case
un'istruzione in uno script non interattivo o in una funzione nello stesso script.
Contrariamente a un'altra risposta sopra, zstyle
non è un builtin specifico del modulo "compsys" (sistema di completamenti), zstyle
è un builtin "globale".
zstyle
è definito dal zsh/util
modulo, ciò significa semplicemente che il codice che definisce come analizzare e "fare" zstyle
è definito nel zsh/zutil
modulo.
Potresti anche dimenticare questo fatto, cioè bash non richiede di sapere che il codice per il eval
builtin è contenuto nel file eval.c
, ma per ottenere aiuto zstyle
, aiuta a sapere che zstyle
è un builtin definito nel zsh/zutil
modulo, e la documentazione per il zsh/zutil
modulo è accessibile eseguendo man zshmodules
.
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 zsh
funzionalità 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 zstyle
ti dà, la possibilità di "targetizzare" le opzioni a un livello molto più raffinato rispetto alle tradizionali opzioni di shell "globali".
zstyle
raggiunge 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 zstyles
capacità di indirizzare i contesti è incredibilmente potente, ad esempio, dire che volevi definire alcuni comportamenti / opzioni per la vcs_info
funzione, quando eri un .git
repository, al contrario di un svn
repository, 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 svn
repository? poi
:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
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.
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 zshmodules
o 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.
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*'