O que o 'zstyle' faz?

16

zstyle parece ser apenas um local central para armazenar e recuperar dados, como uma alternativa para export . Isso é verdade ou há mais para isso?

    
por shadowtalker 08.07.2015 / 20:00

3 respostas

15

zstyle manipula o controle de estilo óbvio para o sistema de conclusão, mas parece cobrir mais do que isso. Por exemplo, o módulo vcs_info depende dele para exibir o status git no seu prompt. Você pode começar observando os poucos parágrafos explicativos em man zshmodules na seção zstyle .

Você pode simplesmente invocá-lo para ver quais configurações estão em vigor. Isso pode ser instrutivo.

O Zsh Book tem um belo tratamento de capítulo sobre zstyle , também, explicando detalhadamente seus vários campos.

Você pode encontrar o diretório .../Completion/ em seu sistema para ver como alguns desses arquivos usam zstyle . Um local comum está próximo de /usr/share/zsh/functions/Completion/* . Eu vejo isso usado em mais de 100 arquivos no meu sistema. Os usuários geralmente têm zstyle espalhados pelo ~/.zshrc deles também. Aqui estão alguns bons para adicionar algumas cores e descrições à sua conclusão:

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

O sistema de conclusão torna a maioria dos campos claros se você brincar com ele. Tente digitar zstyle :«tab» e você verá algumas opções. Tab-complete para os próximos dois pontos e você verá o próximo conjunto de opções, etc.

    
por 08.07.2015 / 22:23
8

A única descrição vagamente significativa do estilo "(z) estupidamente nomeado e mal documentado" que encontrei - vem do glossário de Do Bash ao Z Shell

style

In zsh, the style mechanism is a flexible way of configuring shell add- ons that use functions, such as the completion system and editor widgets. Unlike variables they can be different in different contexts and unlike shell options they can take values. The mechanism is based on the command style.

também, na seção "Manipulação de estilos", o autor elabora mais detalhes. ..

With more sophisticated completion functions, you may want to allow aspects of the function’s behavior to be configurable using style.

... many helper functions look up styles for you so your function will react to many styles without your function having to do anything in particular. To get an idea of the styles looked up in a particular situation, invoke the _complete_help function with a numeric argument. Normally, you can do this by pressing Esc2 followed by Ctrl-x h. This is primarily useful when configuring completion because it allows you to see what styles are looked up and the associated context.

    
por 31.10.2015 / 16:57
8

Para entender corretamente como o zstyle funciona, primeiro você precisa entender que o zsh é um programa modular. De man zshmodules

Some optional parts of zsh are in modules, separate from the core of the shell. Each of these modules may be linked in to the shell at build time, or can be dynamically linked while the shell is running if the installation supports this feature. [...]

A este respeito, o zsh é mais parecido com um interpretador como o PHP, onde os principais comandos internos são definidos no módulo "core", mas outros comandos internos estão contidos em "módulos". Ok, ótimo, então o que é "zstyle"?
zsh, como outros shells tem comandos incorporados, como source , cd ou declare - zstyle é apenas mais um desses "builtins".

Escopo das opções de builtins e shell

As opções builtins e shell são geralmente "globais" no sentido de que são geralmente (mas nem sempre) aplicáveis / utilizáveis a qualquer momento ou contexto em todo o processo shell ou, em outras palavras, elas geralmente se aplicam a zsh e todas as sub-sistemas (módulos). Observe que isso se aplica se um shell é chamado como um interpretador interativo ou não interativo.
Portanto, por exemplo, você pode usar o source ou cd do arquivo incorporado ou a opção "globstar" do shell será válida em um prompt de comando ou em uma instrução case em um script não interativo ou em uma função nesse mesmo roteiro.
Ao contrário de outra resposta acima, zstyle não é um construído que é específico para o módulo "compsys" (sistema de conclusões), zstyle é uma construção "global".

zstyle é definido pelo módulo zsh/util , isso significa simplesmente que o código que define como analisar e "fazer" zstyle é definido no módulo zsh/zutil .
Você pode esquecer esse fato, ou seja, o bash não exige que você saiba que o código para o eval embutido está contido no arquivo eval.c , mas para obter ajuda sobre zstyle , ajuda saber que zstyle é um arquivo interno definido no módulo zsh/zutil , e a documentação do módulo zsh/zutil pode ser acessada executando man zshmodules .

Definindo opções específicas para um módulo ou uma função de shell

Portanto, tradicionalmente as opções de shell geralmente eram "globais", mas de acordo com a descrição de man zshmodules , algumas partes opcionais do zsh estão em módulos e também muito do zsh funcionalidade foi escrita em funções de shell. (semelhante a como muitas funcionalidades principais e opcionais do vim foram escritas em vimscript). Então, se você quer ser capaz de especificar opções que se aplicam apenas a esses módulos ou funções, como você faria isso?
Bem, isso é o que o zstyle faz, você tem a capacidade de "direcionar" as opções em um nível muito mais fino do que as opções de shell "globais" tradicionais.
zstyle obtém isso através do argumento "pattern"

Um exemplo de comando que configura algum comportamento opcional específico para "compsys":

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

e configurando algum comportamento 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 '

Mas não para por aí, zstyles capacidade de segmentar contextos é incrivelmente poderosa, por exemplo, digamos que você queria definir algum comportamento / opções para o recurso vcs_info , quando você estava em um repositório .git , ao contrário de um svn repo, então você poderia modificar o padrão de contexto

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

E o comportamento opcional de um projeto específico, com svn repo? então

:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
    
por 16.08.2016 / 07:26

Tags