Ich habe gerade beschlossen, zsh (über oh-my-zsh) auszuprobieren, und spiele jetzt mit precmd
, um eine zweizeilige Eingabeaufforderung zu emulieren, die in mehr als nur der letzten Zeile die richtigen Eingabeaufforderungen enthält.
Also klone ich das Standardthema und inspiriere mich an diesem Beitrag (mit dem ich auch viel lerne). Ich mache so etwas (ich werde später Farben hinzufügen):
function precmd {
local cwd="${(%):-[%~]}"
local who_where="${(%):-%n@%m}"
local git_info=${(%)$(git_prompt_info)}
local right_prompt=" $git_info [$who_where]"
local left_prompt="${(r:(($COLUMNS - ${#${right_prompt}})):: :)cwd}"
echo "$left_prompt$right_prompt"
}
Und es funktioniert. Aber ich frage mich: Definiert zsh jedes Mal, wenn precmd aufgerufen wird, all diese Variablen?
Ich habe nach Abschlüssen, Umfang und Namespace in Bezug auf zsh gegoogelt und versucht, die lokalen Variablen als Daten an precmd anzuhängen, damit die Variablen nicht jedes Mal neu definiert werden müssen, aber ich habe nichts gefunden. Gibt es eine Möglichkeit, das zu tun, was ich versuche, oder sollte ich es einfach fallen lassen?
Als Randnotiz und nur wenn es verwandt ist, was bedeutet "eine Funktion laden lassen"?
myfunc $functions[otherfunction]
dasmyfunc
kann beispielsweise als aufgerufen werden() {eval $1} args
(nicht, dass ich dies empfehlen würde).private
Variablen (imzsh/param/private
Modul) einen statischen Bereich haben .Nein, Verschlüsse sind für zsh zu raffiniert. Zsh wurde entwickelt, um kleine Skripte zu interpretieren, die nicht weit von der direkten Interaktion entfernt sind. Es gibt keine ausgefallenen Sprachfunktionen, die für die Programmierung im großen Stil sehr nützlich sind, aber weniger für die Art kleiner Aufgaben, für die Shells normalerweise verwendet werden.
Beachten Sie, dass bei einer Form des Abschlusses, bei der der Wert der Variablen ein für alle Mal vorberechnet und dann gespeichert werden konnte, die Werte nicht aktualisiert werden, wenn sich etwas ändert, das dazu führt, dass die Informationen ungültig werden.
$git_info
und die abgeleiteten Variablen können sich jederzeit aufgrund einer Änderung an einer in git oder im git-Repository eingecheckten Datei ändern. Sie müssen also sowieso jedes Mal neu berechnet werden.Sie können die Werte von
cwd
undwho_where
in einer globalen Variablen zwischenspeichern, da sie sich im normalen Betrieb nicht ändern.cwd
ändert sich, wenn sich das aktuelle Verzeichnis ändert, sodass es aktualisiert werden musschpwd
. Diese Variablen lassen sich jedoch sehr schnell berechnen, sodass es keinen Sinn macht, sich darum zu kümmern. Die teure Berechnung läuft hiergit_prompt_info
und das kann sich jederzeit ändern.Wenn Sie Informationen zwischen den einzelnen Befehlen anzeigen, ist es möglicherweise besser, sie als Teil der Eingabeaufforderung (
PS1
oder despsvar
Arrays) einzufügen. Zsh weiß, dass die Eingabeaufforderung unter verschiedenen Umständen erneut angezeigt werden muss, während es nichts darüber weiß, von was Sie druckenprecmd
.quelle
Ja, diese Variablen werden bei jedem Aufruf der Funktion (neu) definiert.
Wenn Sie sie nur einmal initialisieren möchten, können Sie sie einfach aus der Funktion auf die oberste Ebene verschieben.
quelle