¿Qué hace `zstyle`?

23

zstyleParece que es solo un lugar central para almacenar y recuperar datos, como una alternativa a exportlos parámetros de shell. ¿Es eso cierto o hay más?

Shadowtalker
fuente
66
Votó la q por dos razones; a) Google me envía aquí de todos modos; b) zstyle parece tener mucho en juego que parece no tener nada que ver con "estilo" o autocompletar. Una de las respuestas aquí incluso comenta cómo la característica tiene un nombre terrible.
zaTricky

Respuestas:

19

zstylemaneja el control de estilo obvio para el sistema de finalización, pero parece abarcar más que eso. Por ejemplo, el vcs_infomódulo se basa en él para mostrar el estado de git en su solicitud. Puede comenzar mirando los pocos párrafos explicativos man zshmodulesen la zstylesección.

Simplemente puede invocarlo para ver qué configuraciones están vigentes. Esto puede ser instructivo.

El Libro Zsh tiene un buen tratamiento de capítulos sobre zstyle, también, explicando en detalle sus diversos campos.

Puede buscar en el .../Completion/directorio de su sistema para ver cómo hacen uso algunos de esos archivos zstyle. Un lugar común está cerca /usr/share/zsh/functions/Completion/*. Veo que se usa en más de 100 archivos en mi sistema allí. Los usuarios a menudo también se han zstylerociado alrededor de ellos ~/.zshrc. Aquí hay algunos buenos para agregar un poco de color y descripciones para completar:

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

El sistema de finalización aclara la mayoría de los campos si juegas con él. Intenta escribir zstyle :«tab»y verás algunas opciones. Pestaña completa al siguiente punto y verás el siguiente conjunto de opciones, etc.

Micah Elliott
fuente
2
Gracias por el enlace al libro de Zsh y el consejo sobre el directorio de Finalización. El manual de Zsh es pesado en funcionalidad y muy ligero en casos de uso y ejemplos
shadowtalker
"... tiene una gran funcionalidad y muy pocos casos de uso y ejemplos", desafortunadamente es el caso de la mayoría de los materiales escritos por programadores.
aaaaaa
9

Para comprender correctamente cómo zstylefunciona, primero debe comprender que zsh es un programa modular. Desdeman zshmodules

Algunas partes opcionales de zsh están en módulos, separados del núcleo del shell. Cada uno de estos módulos puede vincularse al shell en el momento de la compilación, o puede vincularse dinámicamente mientras el shell se está ejecutando si la instalación admite esta característica. [...]

En este sentido, zsh se parece más a un intérprete como PHP, donde los comandos integrados principales se definen en el módulo "núcleo", pero otros comandos incorporados están contenidos en "módulos".
Ok genial, entonces ¿qué es "zstyle"?
zsh, al igual que otros shells, tiene comandos incorporados, como source, cdo declare- zstylees solo uno más de estos "builtins".

Alcance de las opciones incorporadas y de concha

Las opciones integradas y de shell suelen ser "globales" en el sentido de que generalmente son aplicables (pero no siempre) aplicables / utilizables en cualquier momento o contexto a lo largo del proceso de shell, o en otras palabras, generalmente se aplican a zsh y a todos los subsistemas (módulos). Tenga en cuenta que esto se aplica si se invoca un shell como intérprete interactivo o no interactivo.
Así, por ejemplo, puede usar de la orden interna sourceo cdo la opción del shell "Globstar" serán válidas ya sea en un símbolo del sistema o en una casedeclaración en un script no interactivo o en una función en ese mismo guión.
Contrariamente a otra respuesta anterior, zstyleno es un componente específico del módulo "compsys" (sistema de terminaciones), zstylees un elemento integrado "global".

zstyleestá definido por el zsh/utilmódulo, esto simplemente significa que el código que define cómo analizar y "hacer" zstyleestá definido en el zsh/zutilmódulo.
También podrías olvidar este hecho, es decir, bash no requiere que sepas que el código para la evalconstrucción está contenido en el archivo eval.c, pero para obtener ayuda zstyle, es útil saber que zstylees una construcción definida en el zsh/zutilmódulo, y zsh/zutilSe puede acceder a la documentación del módulo ejecutando man zshmodules.

Establecer opciones específicas para un módulo o una función de shell

Así que, tradicionalmente, las opciones de shell generalmente han sido "globales", pero según la descripción de man zshmodules, algunas partes opcionales de zsh están en módulos , y también, mucha de la zshfuncionalidad se ha escrito en funciones de shell. (similar a cómo se ha escrito una gran cantidad de funciones básicas y opcionales de vim en vimscript).
Entonces, si desea poder especificar las opciones que se aplican solo a estos módulos o funciones, ¿cómo lo haría?
Bueno, eso es lo zstyleque te da, la capacidad de "apuntar" a las opciones a un nivel mucho más fino que las opciones de shell "globales" tradicionales.
zstylelogra esto a través del argumento"pattern"

Un comando de ejemplo que configura un comportamiento opcional específico para "compsys":

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

y configurando un comportamiento opcional específico para "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 '

Pero no se detiene allí, la zstylescapacidad de enfocar contextos es increíblemente poderosa, por ejemplo, digamos que desea definir algunas opciones de comportamiento para la vcs_infocaracterística, cuando era un .gitrepositorio, en lugar de un svnrepositorio, entonces podría modificar el patrón de contexto

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

¿Qué pasa con el comportamiento opcional para un proyecto específico, con un svnrepositorio? luego

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
the_velour_fog
fuente
8

La única descripción vagamente significativa del estilo "(z)" estúpidamente nombrado y mal documentado que he encontrado proviene del glosario de From Bash To The Z Shell

style

En zsh, el mecanismo de estilo es una forma flexible de configurar complementos de shell que utilizan funciones, como el sistema de finalización y los widgets del editor. A diferencia de las variables, pueden ser diferentes en diferentes contextos y, a diferencia de las opciones de shell, pueden tomar valores. El mecanismo se basa en el estilo del comando.

Además, en la sección "Estilos de manejo", el autor elabora más ...

Con funciones de finalización más sofisticadas, es posible que desee permitir que se puedan configurar aspectos del comportamiento de la función mediante el uso style.

... muchas funciones auxiliares buscan estilos para usted, por lo que su función reaccionará a muchos estilos sin que su función tenga que hacer nada en particular. Para tener una idea de los estilos buscados en una situación particular, invoque la función _complete_help con un argumento numérico. Normalmente, puede hacer esto presionando Esc2seguido de Ctrl-x h. Esto es principalmente útil al configurar la finalización porque le permite ver qué estilos se buscan y el contexto asociado.

alex grey
fuente
2

Una de las cosas más frustrantes de ZSH es averiguar dónde encontrar sus diversos comandos en las páginas de manual. En este caso, la documentación para zstyle se puede encontrar aquíman zshmodules o en línea .

Este comando incorporado se utiliza para definir y buscar estilos. Los estilos son pares de nombres y valores, donde los valores consisten en cualquier número de cadenas. Se almacenan junto con los patrones y la búsqueda se realiza dando una cadena, llamada 'contexto', que se compara con los patrones. Se devolverá la definición almacenada para el primer patrón coincidente.

Caleb
fuente
Esta es la mejor respuesta porque se vincula a los documentos. Necesitaba eso para aprender a leer de zstyle. El otro solo responde a los estilos de configuración de dirección.
cbarrick
1

Hay una gran falta de buenos ejemplos en el espacio zsh, y la documentación es obtusa. Pasé algún tiempo mirando cómo Prezto usa zstyle, así como leyendo los documentos y probando algunas cosas. zstyle parece usarse principalmente en terminaciones, pero en realidad es realmente bueno para almacenar datos de una manera que es más sofisticada que las variables de entorno simples.

Este resumen muestra cómo puede usar zstyle para almacenar y recuperar información:

# 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
fuente