Pushdown-Terminal-Ausgang

Pushdown-Terminal-Ausgang

Gibt es eine Standardmethode, um die Ausgabereihenfolge einer Terminalausgabe umzukehren, also:

~/Developer $ command0 
-bash: comman0: command not found 
~/Developer $ command2 
-bash: command2: command not found 
~/Developer $ command3 
-bash: command3: command not found 
~/Developer $ 

würde wie folgt angezeigt:

~/Developer $ 
-bash: command3: command not found 
~/Developer $ command3 
-bash: command2: command not found 
~/Developer $ command2 
-bash: comman0: command not found 
~/Developer $ comman0

Ich finde, dass es kontraintuitiv ist, die Eingabeaufforderung immer ganz unten zu haben. Eine effektivere Möglichkeit, die Ausgabe zu präsentieren, wäre, die Ausgabereihenfolge umzukehren. Wie kann ich das umsetzen? Insbesondere wo ist der Ausgabeteil des OSX-Terminalprogramms definiert?

Antwort1

In Bash wird dadurch oben die aktuelle Eingabeaufforderung/der aktuelle Befehl und darunter die Ausgabe angezeigt, jedoch ohne Bildlauf oder vorherige Befehle:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'

Diese Funktion fügt vorherige Befehle unten ein, aber Sie müssen jeden einzelnen Befehl einzeln an sie weiterleiten. Leider exec > >(f)kann ich dabei nicht helfen, da es die gesamte Bash umleitet, nicht einzelne Befehle. Hier ist die Funktion:

f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }

Führen Sie dann jeden Befehl wie folgt aus:

command args |f

Es speichert die Ausgabe, erstellt eine Anzahl von leeren Zeilen, die der Länge + 1 entspricht, und fügt die Ausgabe dann wieder ein. Sie können am Ende eine Zeile anhängen, die eine falsche Eingabeaufforderung oder eine horizontale Linie anzeigt, wenn Sie möchten. Beispiel:

printf '%*s' $COLUMNS | tr ' ' _;

Als einfache, aber automatische Alternative zu dieser ganzen Funktionssache können wir am Ende unseres früheren $PROMPT_COMMAND einen Befehl hinzufügen, der etwas willkürliche 11 Zeilen löscht:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'

Sie können auch verwenden tput -S, um mehrere Binäraufrufe zu vermeiden.


Ich habe das $PROMPT_COMMANDvonhttps://github.com/swirepe/alwaysontop.

Antwort2

Leider wird dies ziemlich schwierig sein. Das Protokoll zwischen den Anwendungen und dem OS-X-Terminal ist eine Variante desVT100 / ANSITerminal-Steuerungsprotokoll, insbesondere dasXTermProtokoll.

Dazu gehören eine Reihe von Annahmen zur Bildschirmposition usw., die in einer Welt mit umgekehrter Anzeige nur schwer zu übertragen wären.

Schlimmer noch: Ihr Terminalemulator erhält lediglich eine Zeichenfolge mit Befehlen wie „Setzen Sie dieses Zeichen an diese Position ein“. Es wird kein Unterschied zwischen der Eingabeaufforderung und der Ausgabe eines von ihr ausgeführten Befehls gemacht, sodass Sie nicht für beide Teile dasselbe tun können – zumindest nicht ohne die Zusammenarbeit mit der darunterliegenden Shell.

Die Shell und die Programme gehen davon aus, dass der Bildschirm nach oben fortschreitet – neue Daten unten – und dann endlos nach unten weitergeht.

Zumindest theoretisch könnten Sie Ihren Terminalemulator so ändern, dass er die Zeilen in umgekehrter Reihenfolge anzeigt – also zuerst die „unterste“ Zeile und so weiter bis zur „obersten“ Zeile am unteren Bildschirmrand.

Das würde allerdings die Zeilenreihenfolge in der Befehlsausgabe umkehren, sodass auch der restliche Inhalt rückwärts ausgegeben würde. Wenn Sie möchten, dass die Befehle (z. B. ls, cat) „nach unten“ ausgeführt werden, aber aufgefordert werden, „nach oben“ zu gehen, ist das Leben schwieriger.

Ich kenne keine Software, die dies implementiert. (... aber siehe JdeBDs Kommentar dazu für einen Link zu einer.) :)

Antwort3

Dadurch wird die Ausgabe zwar nicht vollständig umgekehrt, Ihre Eingabeaufforderung bleibt jedoch oben:

https://github.com/swirepe/alwaysontop

Um es zu verwenden, führen Sie Folgendes aus:

git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh

Wenn Sie entscheiden, dass es Ihnen gefällt, fügen Sie es in Ihrem .bash_profile einfach mit etwas wie: als Quelle hinzu.

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile

verwandte Informationen