
Ich weiß, dass Sie in zsh mehrzeilige Eingabeaufforderungen definieren können:
PROMPT='
test
→ '
Aber ich habe mich gefragt, warum man keine mehrzeiligen Rechtsaufforderungen definieren kann. Ich habe es versucht:
RPROMPT='
test
still test '
aber es wird nichts angezeigt. Ist das möglich?
Antwort1
Sie können den gewünschten (wenn ich richtig vermute) Effekt erzielen, indem Sie die precmd
Funktion verwenden, die jedes Mal vor der Anzeige der Eingabeaufforderung ausgeführt wird, um zusätzliche Zeilen über der Eingabeaufforderung zu drucken.
Verwenden Sie beispielsweise diesen Code
precmd() {
LEFT="The time is"
RIGHT="$(date) "
RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
Erläuterung
$LEFT
und$RIGHT
halten Sie die Zeichenfolgen für die linke bzw. rechte Seite. Sie können die Ausgabe des Befehls mit der$(...)
Syntax verwenden.$RIGHTWIDTH
ist die Differenz der aktuellen Klemmenbreite (gespeichert durchzshim$COLUMNS
Parameter) und die Breite der linken Zeichenfolge.$((...))
ist für mathematische Ausdrücke- Der Zauber kommt mit
${(l:$RIGHTWIDTH::.:)RIGHT}
, wo der Parameter$RIGHT
links (l
) mit Punkten aufgefüllt wird (lassen Sie den letzten weg,:.:
wenn Sie Leerzeichen wünschen), bis die Länge von erreicht ist$RIGHTWIDTH
. - Drucken Sie die zusätzliche Zeile. Wiederholen Sie die Befehle, wenn Sie weitere Zeilen wünschen.
PS1
undRPS1
sind kürzer fürPROMPT
undRPROMPT
.
Demo
The time is............................................Fri, Sep 18, 2015 8:20:22 PM
foo > _ bar
Antwort2
Es ist anscheinend nicht unmöglich, eine mehrzeilige rechte Eingabeaufforderung festzulegen:Dieses hierschafft das. Ich würde allerdings sagen, dass es das so macht:
local top_left='%F{blue}%~%f'
local top_right="%F{green}${git_branch}%f"
local bottom_left='%B%F{%(?.green.red)}%#%f%b '
local bottom_right='%F{yellow}%T%f'
local REPLY
fill-line "$top_left" "$top_right"
PROMPT=$REPLY$'\n'$bottom_left
RPROMPT=$bottom_right
Indem PROMPT
oben links und rechts sowie unten links eine Zeile belegt wird und RPROMPT unten rechts belegt wird. RPROMPT selbst wird jedoch eine einzelne Zeile haben.