我致力於原始碼控制我的點文件,我正在做的很多事情都是基於扎克·霍爾曼的點文件。我想像他在他的文件中那樣獲取所有 zsh 文件的源代碼,但在我將代碼放入其中之前,我想真正了解代碼在做什麼。我感到困惑的片段是
# 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
主要是我對這裡發生的事情感到困惑
${(M)config_files:#*/path.zsh}
和這裡
${${config_files:#*/path.zsh}:#*/completion.zsh}
那麼,這意味著什麼?
答案1
PARAMETER EXPANSION
手冊頁的這一部分zshexpn
是一個很好的起點。
首先,請注意這是一個包含目錄下$config_files
所有檔案的數組,如第二行所示:。.zsh
$ZSH
config_files=($ZSH/**/*.zsh)
該行中使用的語法${(M)config_files:#*/path.zsh}
(請注意,M
括號內稱為擴展標誌)如下:
${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).
換句話說,相關的 for 迴圈會迭代path.zsh
$ZSH 中的所有檔案。您for file in $ZSH/**/path.zsh
也可以使用,但是對文件數組的操作$config_files
比一次又一次遞歸地搜索文件系統要快。 (還有更多的 for 循環,不是嗎?)
有了這些知識,應該很容易弄清楚${${config_files:#*/path.zsh}:#*/completion.zsh}
要做什麼。 (無論如何,結果已在評論中說明)。
我通常會使用一些簡單的例子來更好地了解自己:
$ array=(foo bar baz)
$ print ${array}
foo bar baz
$ print ${array:#ba*}
foo
$ print ${(M)array:#ba*}
bar baz
這比看起來更容易,對吧?;)