zstyle
Parece que é apenas um local central para armazenar e recuperar dados, como uma alternativa aos export
parâmetros do shell. Isso é verdade ou há mais?
zstyle
Parece que é apenas um local central para armazenar e recuperar dados, como uma alternativa aos export
parâmetros do shell. Isso é verdade ou há mais?
Respostas:
zstyle
lida com o controle óbvio de estilo do sistema de conclusão, mas parece abranger mais do que isso. Por exemplo, o vcs_info
módulo conta com ele para exibir o status do git em seu prompt. Você pode começar observando os poucos parágrafos explicativos man zshmodules
na zstyle
seçã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 zstyle
borrifar 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.
Para entender corretamente como zstyle
funciona, 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
, cd
ou declare
- zstyle
é apenas mais um desses "embutidos".
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 source
ou cd
ou a opção shell "globstar" será válida se em um prompt de comando ou em uma case
declaração em um script não-interativo ou em uma função no mesmo script.
Ao contrário de outra resposta acima, zstyle
não é um componente específico do módulo "compsys" (sistema de conclusões), zstyle
é um componente "global".
zstyle
é definido pelo zsh/util
módulo, isso significa simplesmente que o código que define como analisar e "do" zstyle
é definido no zsh/zutil
módulo.
Você também pode esquecer esse fato, ou seja, o bash não exige que você saiba que o código do eval
built-in está contido no arquivo eval.c
, mas, para obter ajuda zstyle
, é importante saber que zstyle
é um built-in definido no zsh/zutil
módulo e a documentação para o zsh/zutil
módulo pode ser acessada executando man zshmodules
.
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 zsh
funcionalidade 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 zstyle
permite, a capacidade de "direcionar" opções em um nível muito mais preciso do que as opções tradicionais "globais" do shell.
zstyle
consegue 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 zstyles
capacidade de direcionar contextos é incrivelmente poderosa, por exemplo, digamos que você queira definir alguns comportamentos / opções para o vcs_info
recurso, quando você é um .git
repositó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 svn
repo? então
:vcs_info:<svn_or_whatever_SCM_system>:*:repo-root-name <style>
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.
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 zshmodules
ou 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.
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*'