Inhalte unterhalb der Eingabeaufforderung in einer Shell-Eingabeaufforderung anzeigen?

Inhalte unterhalb der Eingabeaufforderung in einer Shell-Eingabeaufforderung anzeigen?

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 preexecFunktion 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 terminfoModul, 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 terminfoWeitere 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 tputBefehl (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 trapZeile ist ein Hack, um preexecdie Funktion von zsh zu emulieren. Siehehttps://superuser.com/questions/175799/Für mehr Information.

BEARBEITEN: Verbessertes Skript basierend auf Gilles‘ Kommentaren.

verwandte Informationen