Estoy trabajando en el control de código fuente de mis archivos dot y gran parte de lo que estoy haciendo se basa enArchivos de puntos de Zach Holman. Quiero obtener todos los archivos zsh como lo hace él en sus archivos, pero antes de agregar el código, quiero entender realmente qué está haciendo el código. El fragmento con el que estoy confundido es
# 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 estoy confundido en cuanto a lo que está sucediendo aquí.
${(M)config_files:#*/path.zsh}
y aquí
${${config_files:#*/path.zsh}:#*/completion.zsh}
Entonces, ¿qué significa todo esto?
Respuesta1
La PARAMETER EXPANSION
sección de la zshexpn
página de manual es un buen punto de partida.
Primero, observemos que $config_files
es una matriz que incluye todos .zsh
los archivos del $ZSH
directorio, como puede ver en la segunda línea: config_files=($ZSH/**/*.zsh)
.
Esta sintaxis utilizada en la línea ${(M)config_files:#*/path.zsh}
(tenga en cuenta que M
dentro del paréntesis se llamabandera de expansión) es el siguiente:
${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).
En otras palabras, el bucle for en cuestión itera sobre todos path.zsh
los archivos en $ZSH. for file in $ZSH/**/path.zsh
También podría usarlo , pero la operación en la $config_files
matriz de archivos es más rápida que buscar recursivamente en el sistema de archivos una y otra vez. (Hay más bucles for, ¿no?)
Con ese conocimiento, debería ser fácil descubrir qué ${${config_files:#*/path.zsh}:#*/completion.zsh}
funcionará. (El resultado se indica en el comentario de todos modos).
Normalmente uso algunos ejemplos triviales para entenderme mejor:
$ array=(foo bar baz)
$ print ${array}
foo bar baz
$ print ${array:#ba*}
foo
$ print ${(M)array:#ba*}
bar baz
Es más fácil de lo que parece, ¿verdad?;)