O que significa este zsh para sintaxe?

4

Eu estou trabalhando na fonte controlando meus dotfiles e uma boa parte do que estou fazendo é baseada em dotfiles de Zach Holman . Eu quero fonte todos os arquivos zsh como ele faz em seus arquivos, mas antes de eu simplesmente jogar o código lá eu quero realmente entender o que o código está fazendo. O trecho que estou confundido é

# all of our zsh files
typeset -U config_files
config_files=($ZSH/**/*.zsh)

# load the path files
for file in ${(M)config_files:#*/path.zsh}
do
  source $file
done

# load everything but the path and completion files
for file in ${${config_files:#*/path.zsh}:#*/completion.zsh}
do
  source $file
done

# initialize autocomplete here, otherwise functions won't be loaded
autoload -U compinit
compinit

# load every completion after autocomplete loads
for file in ${(M)config_files:#*/completion.zsh}
do
  source $file
done

unset config_files

Principalmente, estou confuso sobre o que está acontecendo aqui

${(M)config_files:#*/path.zsh}

e aqui

${${config_files:#*/path.zsh}:#*/completion.zsh}

Então, o que isso tudo significa?

    
por Rumel 02.09.2014 / 19:42

1 resposta

4

A seção PARAMETER EXPANSION da página zshexpn man é um bom ponto de partida.

Primeiro, vamos observar que $config_files é uma matriz incluindo todos os arquivos .zsh sob o diretório $ZSH , como você pode ver na segunda linha: config_files=($ZSH/**/*.zsh) .

Esta sintaxe usada na linha ${(M)config_files:#*/path.zsh} (observe que M dentro dos parênteses é chamado de sinalizador de expansão ) é a seguinte:

${name:#pattern}
          If  the  pattern matches the value of name, then substitute the  
          empty string; otherwise, just substitute the value of name.  
          If name  is an array the matching array elements are removed 
          (use the '(M)' flag to remove the non-matched elements).

Em outras palavras, o loop for itera em todos os arquivos path.zsh em $ ZSH. Você também pode usar for file in $ZSH/**/path.zsh , mas a operação na matriz de arquivos $config_files é mais rápida do que procurar recursivamente o sistema de arquivos novamente e novamente. (Há mais para loop, não há?)

Com esse conhecimento, deve ser fácil descobrir o que o ${${config_files:#*/path.zsh}:#*/completion.zsh} fará. (O resultado é indicado no comentário de qualquer maneira).

Eu costumo usar alguns exemplos triviais para me entender melhor:

$ array=(foo bar baz)
$ print ${array}
foo bar baz
$ print ${array:#ba*}
foo
$ print ${(M)array:#ba*}
bar baz

É mais fácil do que parece, certo ?! ;)

    
por 02.09.2014 / 20:44