
Nehmen wir an, meine Eingabeaufforderung sieht so aus (das _ stellt meinen Cursor dar)
~ % _
Gibt es eine Möglichkeit, es so aussehen zu lassen?
~ % _
[some status]
Die Frage bezog sich ursprünglich auf zsh, hat jetzt aber andere Antworten.
Antwort1
Die folgenden Einstellungen scheinen zu funktionieren. Der Text in der zweiten Zeile verschwindet, wenn die Befehlszeile die erste Zeile überschreitet. Die preexec
Funktion löscht die zweite Zeile vor der Ausführung des Befehls. Wenn Sie sie behalten möchten, ändern Sie sie in preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
Escapes sind im zsh-Handbuch ( man zshmisc
) dokumentiert.
Terminfo ist eine API für den Terminalzugriff. Zsh verfügt über ein terminfo
Modul, das Zugriff auf die Datenbank mit Terminalbeschreibungen bietet: $terminfo[$cap]
ist die Zeichenfolge, die gesendet werden muss, um die Funktion des Terminals zu testen $cap
, d. h. seinen Befehl auszuführen $cap
. man 5 terminfo
Weitere Informationen finden Sie unter (unter Linux, die Abschnittsnummer kann bei anderen Unix-Versionen abweichen).
Die Aktionsfolge ist: Bewegen Sie den Cursor eine Zeile nach unten ( cud1
), dann zurück nach oben ( cuu1
); speichern Sie die Cursorposition ( sc
); bewegen Sie den Cursor eine Zeile nach unten; drucken Sie [some status]
; stellen Sie die Cursorposition wieder her. Das Abwärts- und Aufwärtsbit am Anfang ist nur erforderlich, wenn sich die Eingabeaufforderung in der untersten Zeile des Bildschirms befindet. Die Preexec-Zeile löscht die zweite Zeile ( el
), damit sie nicht mit der Ausgabe des Befehls verwechselt wird.
Wenn der Text in der zweiten Zeile breiter als das Terminal ist, kann die Anzeige verstümmelt sein. Verwenden Sie zur Behebung im Notfall Ctrl+ .L
Antwort2
Hier ist ein bash
Äquivalent zu Gilles' zsh-Lösung. Bash hat kein natives Terminfo-Modul, aber der tput
Befehl (im Lieferumfang enthalten terminfo
) macht praktisch dasselbe.
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
Wenn das Terminal eine der Funktionen nicht unterstützt, wird auf eine einzeilige Eingabeaufforderung zurückgegriffen.
Die trap
Zeile ist ein Hack, um preexec
die Funktion von zsh zu emulieren. Siehehttps://superuser.com/questions/175799/Für mehr Information.
BEARBEITEN: Verbessertes Skript basierend auf Gilles‘ Kommentaren.