Was bedeutet dieses zsh für die Syntax?

539
Rumel

Ich arbeite an der Quelle, die meine Punktdateien kontrolliert, und ein Großteil dessen, was ich tue, basiert auf Zach Holmans Punktdateien . Ich möchte alle zsh-Dateien wie seine Quelldateien in den Quellcode aufnehmen, aber bevor ich den Code dort reinwerfe, möchte ich eigentlich verstehen, was der Code tut. Der Ausschnitt, mit dem ich verwirrt bin, ist

# 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 ${$:#*/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 

Meistens bin ich verwirrt, was hier passiert

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

und hier

${$:#*/completion.zsh}

Was bedeutet das alles?

4

1 Antwort auf die Frage

4
mpy

Der PARAMETER EXPANSIONAbschnitt der zshexpnManpage ist ein guter Ausgangspunkt.

Zuerst lässt beachten Sie, dass $config_filesein Array mit allen ist .zshDateien unter dem $ZSHVerzeichnis, 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 Min 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.zshdurchlä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_filesFile-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 ?! ;)