Zeugs unterhalb der Eingabeaufforderung an einer Shell-Eingabeaufforderung anzeigen?

21

Nehmen wir an, meine Eingabeaufforderung sieht folgendermaßen aus (das _ steht für meinen Cursor)

~ % _

Kann ich das auf irgendeine Weise so aussehen lassen?

~ % _
[some status]

Die Frage betraf ursprünglich zsh, hat jetzt aber andere Antworten.

Xenoterracid
quelle
Wie wäre es screen + buobu ?: launchpad.net/byobu , und vielleicht kmandla.wordpress.com/2010/01/03/... für Screenshots
Janus

Antworten:

17

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, bevor der Befehl ausgeführt wird. Wenn Sie es behalten möchten, wechseln Sie zu 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]; }

%Fluchten sind im zsh-Handbuch ( man zshmisc) dokumentiert .

Terminfo ist eine Terminalzugriffs-API. Zsh verfügt über ein terminfoModul, das den Zugriff auf die Terminalbeschreibungsdatenbank ermöglicht. Hierbei $terminfo[$cap]handelt es sich um die Zeichenfolge , die gesendet werden muss , um die Funktionalität des Terminals auszuüben $cap, dh um dessen $capBefehl auszuführen . man 5 terminfoWeitere Informationen finden Sie unter (unter Linux kann die Abschnittsnummer bei anderen Geräten variieren).

Die Reihenfolge der Aktionen ist: Bewegen Sie den Cursor eine Zeile nach unten ( cud1) und dann nach oben ( cuu1). speichere die Cursorposition ( sc); Bewegen Sie den Cursor eine Zeile nach unten. drucken [some status]; Stellen Sie die Cursorposition wieder her. Das Ab-und-Auf-Bit 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, ist die Anzeige möglicherweise verstümmelt. Verwenden Sie Ctrl+ Lzur Reparatur.

Gilles 'SO - hör auf böse zu sein'
quelle
5

Hier ist ein bashÄquivalent der zsh-Lösung von Gilles. Bash hat kein natives terminfo-Modul, aber der tputBefehl (gebündelt mit terminfo) macht so ziemlich das Gleiche.

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 eine hackige Methode, um die preexecFunktion von zsh zu emulieren . Weitere Informationen finden Sie unter /superuser/175799/ .

BEARBEITEN : Verbessertes Skript basierend auf Gilles 'Kommentaren.

Jander
quelle
@ Gilles: Danke für den Input! Ich denke, ich habe es jetzt besser funktioniert. Versuchte bash 4.1.5 in gnome-terminal und xterm und bash 3.2.48 in OSX Terminal.
Jander