Mehrzeiliger RPROMPT in zsh

Mehrzeiliger RPROMPT in zsh

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 precmdFunktion 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

  • $LEFTund $RIGHThalten Sie die Zeichenfolgen für die linke bzw. rechte Seite. Sie können die Ausgabe des Befehls mit der $(...)Syntax verwenden.
  • $RIGHTWIDTHist die Differenz der aktuellen Klemmenbreite (gespeichert durchzshim $COLUMNSParameter) und die Breite der linken Zeichenfolge. $((...))ist für mathematische Ausdrücke
  • Der Zauber kommt mit ${(l:$RIGHTWIDTH::.:)RIGHT}, wo der Parameter $RIGHTlinks ( 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.
  • PS1und RPS1sind kürzer für PROMPTund RPROMPT.

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 PROMPToben links und rechts sowie unten links eine Zeile belegt wird und RPROMPT unten rechts belegt wird. RPROMPT selbst wird jedoch eine einzelne Zeile haben.

verwandte Informationen