O que faz o `zstyle`?


23

zstyleParece que é apenas um local central para armazenar e recuperar dados, como uma alternativa aos exportparâmetros do shell. Isso é verdade ou há mais?


6
Voto positivo em q por duas razões; a) O Google me envia aqui de qualquer maneira; b) O zstyle parece ter muito a oferecer , que parece não ter nada a ver com "estilo" ou autocompletar. Uma das respostas aqui até comenta como o recurso tem um nome terrível.
zaTricky 27/02

Respostas:


19

zstylelida com o controle óbvio de estilo do sistema de conclusão, mas parece abranger mais do que isso. Por exemplo, o vcs_infomódulo conta com ele para exibir o status do git em seu prompt. Você pode começar observando os poucos parágrafos explicativos man zshmodulesna zstyleseção.

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

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

Você pode procurar no .../Completion/diretório do seu sistema para ver como alguns desses arquivos são utilizados zstyle. Um local comum está próximo /usr/share/zsh/functions/Completion/*. Eu o vejo usado em mais de 100 arquivos no meu sistema lá. Os usuários também costumam zstyleborrifar o conteúdo deles ~/.zshrc. Aqui estão alguns exemplos interessantes 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 preenchimento torna a maioria dos campos claros se você brincar com ele. Tente digitar zstyle :«tab»e você verá algumas opções. Preencha a tabulação até os próximos dois pontos e você verá o próximo conjunto de opções etc.


2
Obrigado pelo link para o livro Zsh e a dica sobre o diretório Conclusão. O manual Zsh é pesado sobre a funcionalidade e muito leve em casos de uso e exemplos
shadowtalker

"... é pesado em funcionalidade e muito leve em casos de uso e exemplos" - infelizmente é o caso da maioria dos materiais escritos por programadores.
aaaaaa

9

Para entender corretamente como zstylefunciona, primeiro você precisa entender que o zsh é um programa modular. A partir deman zshmodules

Algumas partes opcionais do zsh estão em módulos, separados do núcleo do shell. Cada um desses módulos pode estar vinculado ao shell no momento da construção ou dinamicamente enquanto o shell estiver em execução, se a instalação suportar esse recurso. [...]

A esse respeito, o zsh é mais como um intérprete como o PHP, onde os principais comandos internos são definidos no módulo "core", mas outros comandos internos estão contidos em "modules".
Ok, ótimo, então o que é "zstyle"?
O zsh, como outros shells, possui comandos embutidos, como source, cdou declare- zstyleé apenas mais um desses "embutidos".

Escopo de opções internas e de shell

As opções builtins e shell são geralmente "globais" no sentido de serem geralmente (mas nem sempre) aplicáveis ​​/ utilizáveis ​​a qualquer momento ou contexto durante o processo do shell, ou seja, geralmente se aplicam ao zsh e a todos os subsistemas (módulos). Observe que isso se aplica se um shell for chamado como intérprete interativo ou não interativo.
Assim, por exemplo, você pode usar o builtin sourceou cdou a opção shell "globstar" será válida se em um prompt de comando ou em uma casedeclaração em um script não-interativo ou em uma função no mesmo script.
Ao contrário de outra resposta acima, zstylenão é um componente específico do módulo "compsys" (sistema de conclusões), zstyleé um componente "global".

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

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

Então, tradicionalmente, as opções de shell geralmente são "globais", mas conforme a descrição de man zshmodules, algumas partes opcionais do zsh estão em módulos e também grande parte da zshfuncionalidade foi escrita em funções de shell. (semelhante à forma como muitas funcionalidades principais e opcionais do vim foram escritas no vimscript).
Então, se você deseja especificar opções que se aplicam apenas a esses módulos ou funções, como você faria isso?
Bem, é isso que zstylepermite, a capacidade de "direcionar" opções em um nível muito mais preciso do que as opções tradicionais "globais" do shell.
zstyleconsegue isso através do argumento"pattern"

Um comando de exemplo 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 isso não para por aí, a zstylescapacidade de direcionar contextos é incrivelmente poderosa, por exemplo, digamos que você queira definir alguns comportamentos / opções para o vcs_inforecurso, quando você é um .gitrepositório, em vez de um repositório svn, então você pode modificar o padrão de contexto

:vcs_info:<svn_or_whatever_SCM_system>:* <style>

E o comportamento opcional para um projeto específico, com um svnrepo? então

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

8

A única descrição vagamente significativa do estilo "(z)" estupidamente nomeado e mal documentado que eu encontrei - vem do glossário De From Bash To The Z Shell

style

Além disso zsh, o mecanismo de estilo é uma maneira flexível de configurar complementos de shell que usam funções, como o sistema de conclusão e os widgets do editor. Diferentemente das variáveis, elas podem ser diferentes em contextos diferentes e, ao contrário das opções de shell, podem receber valores. O mecanismo é baseado no estilo de comando.

Além disso, na seção "Estilos de manipulação", o autor elabora ainda mais ...

Com funções de conclusão mais sofisticadas, convém permitir que aspectos do comportamento da função sejam configuráveis ​​usando style.

... muitas funções auxiliares procuram estilos para você, para que sua função reaja a muitos estilos sem que sua função precise fazer algo em particular. Para ter uma idéia dos estilos pesquisados ​​em uma situação específica, chame a função _complete_help com um argumento numérico. Normalmente, você pode fazer isso pressionando Esc2seguido de Ctrl-x h. Isso é útil principalmente ao configurar a conclusão, pois permite ver quais estilos são procurados e o contexto associado.


2

Uma das coisas mais frustrantes sobre o ZSH é descobrir onde encontrar seus vários comandos nas páginas de manual. Nesse caso, a documentação do zstyle pode ser encontrada em man zshmodulesou aqui online .

Este comando interno é usado para definir e procurar estilos. Estilos são pares de nomes e valores, em que os valores consistem em qualquer número de cadeias. Eles são armazenados junto com os padrões e a pesquisa é feita fornecendo uma string, chamada de 'contexto', que é comparada aos padrões. A definição armazenada para o primeiro padrão correspondente será retornada.


Essa é a melhor resposta, pois está vinculada aos documentos. Eu precisava disso para aprender a ler do zstyle. As outras respostas abordam apenas os estilos de configuração.
cbarrick

1

Há uma enorme falta de bons exemplos no espaço zsh, e a documentação é obtusa. Passei algum tempo vendo como o Prezto usa o zstyle, além de ler os documentos e tentar algumas coisas. O zstyle parece ser usado principalmente em conclusões, mas é realmente muito bom para armazenar dados de uma maneira mais sofisticada do que as variáveis ​​de ambiente simples.

Esta lista mostra como você pode usar o zstyle para armazenar e recuperar informações:

# 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*'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.