Der PARAMETER EXPANSION
Abschnitt der zshexpn
Manpage ist ein guter Ausgangspunkt.
Zuerst lässt beachten Sie, dass $config_files
ein Array mit allen ist .zsh
Dateien unter dem $ZSH
Verzeichnis, wie Sie in der zweiten Zeile sehen: config_files=($ZSH/**/*.zsh)
.
Diese in der Zeile verwendete Syntax ${(M)config_files:#*/path.zsh}
(bitte beachten Sie, dass M
in den Klammern ein Erweiterungsflag genannt wird ) lautet wie folgt:
$ 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).
Mit anderen Worten path.zsh
durchläuft die fragliche for-Schleife alle Dateien in $ ZSH. Sie könnten auch verwenden for file in $ZSH/**/path.zsh
, aber die Operation auf dem $config_files
File-Array ist schneller als das Dateisystem immer wieder rekursiv zu durchsuchen. (Es gibt mehr for-Schleife, oder?)
Mit diesem Wissen sollte es leicht sein, herauszufinden, was zu ${$:#*/completion.zsh}
tun ist. (Das Ergebnis wird ohnehin im Kommentar angegeben).
Ich benutze normalerweise einige triviale Beispiele, um mich selbst besser zu verstehen:
$ array=(foo bar baz) $ print $ foo bar baz $ print $ foo $ print ${(M)array:#ba*} bar baz
Es ist einfacher als es aussieht, oder ?! ;)