Pushdown-Terminal-Ausgang

15

Gibt es eine Standardmethode, um die Ausgabereihenfolge eines Terminalausgangs umzukehren:

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

würde angezeigt werden als:

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

Ich bin der Meinung, dass es kontraintuitiv ist, Ihre Eingabeaufforderung immer ganz unten zu haben. Eine effektivere Möglichkeit, die Ausgabe zu präsentieren, besteht darin, die Ausgabereihenfolge umzukehren. Wie kann ich das umsetzen? Speziell wo Ausgabeabschnitt des OSX-Terminalprogramms definiert?

rudolph9
quelle
Das würde mich verwirren, aber ich begrüße Ihre Bemühungen. Eine der wichtigsten Lektionen unter Linux / Unix / Open Source ist, dass One Size Don't Fit All ist.
Bruce Ediger
Ich denke, das ist überhaupt nicht möglich, es sei denn, Sie ändern den Quellcode der Shell (zB bash).
Renan
5
Sie müssten mehr als nur die Shell hacken. Terminals rollen auf diese Weise, seit sie elektromechanisch sind. Zumindest würde ich sagen, dass Sie einen Terminalemulator hacken müssen, vielleicht auch eine Shell.
Alexios
Dies ist eigentlich kontraintuitiv. Haben Sie den Pfeil der EINGABETASTE bemerkt? Es zeigt auf die Linie darunter und nicht darüber.
dresende
Gibt es eine Möglichkeit, die von einem Terminal ausgegebenen Elemente zu erfassen, besteht mein Gedanke darin, eine Art Wrapper zu erstellen, der jedes dieser Ausgabeelemente erfasst und jedes davon ähnlich wie Tweets behandelt, bei denen das neueste immer oben und oben angezeigt wird Halten Sie die Eingabeaufforderung oben auf der Wrapper-Benutzeroberfläche.
Rudolph9

Antworten:

6

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

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

Diese Funktion fügt die vorherigen Befehle unten ein, aber Sie müssen jeden einzelnen Befehl einzeln weiterleiten. exec > >(f)Kann leider 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 Leerzeilen mit der Länge + 1 und setzt die Ausgabe wieder ein. Sie können am Ende eine Zeile markieren, die eine falsche Eingabeaufforderung oder eine horizontale Linie anzeigt, wenn Sie möchten. Z.B

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

Als eine beschissene, aber automatische Alternative zu dieser ganzen Funktionssache können wir dem 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äre Aufrufe zu vermeiden.


Ich habe die $PROMPT_COMMANDvon https://github.com/swirepe/alwaysontop .

Tommy Jollyboat
quelle
6

Leider wird dies ziemlich schwierig sein. Das Protokoll zwischen den Anwendungen und dem OS-X-Terminal ist eine Variante des VT100 / ANSI- Terminalsteuerprotokolls, insbesondere des XTerm- Protokolls.

Dies schließt eine Reihe von Annahmen über die Bildschirmposition usw. ein, die eine Neuzuordnung auf eine Welt erfordern würden, in der die Anzeige umgekehrt war.

Schlimmer noch, alles, was Ihr Terminal-Emulator bekommt, ist eine Zeichenfolge mit Befehlen vom Typ "Setze dieses Zeichen an diese Position". Es wird kein Unterschied zwischen der Eingabeaufforderung und der Ausgabe eines von ihr ausgeführten Befehls gemacht, sodass Sie nicht für beide Teile eines tun können - zumindest nicht ohne die Mitarbeit der Shell darunter.

Die Shell und die Programme gehen davon aus, dass der Bildschirm nach oben zeigt - neue Daten unten und für immer nach unten.

Sie können Ihren Terminal-Emulator zumindest theoretisch so modifizieren lassen, dass er die Zeilen in umgekehrter Reihenfolge anzeigt - die "untere" Zeile zuerst und so weiter bis zur "oberen" Zeile am unteren Bildschirmrand.

Dies würde jedoch die Reihenfolge der Zeilen in der Befehlsausgabe umkehren, sodass der Rest des Inhalts auch rückwärts herausspringt. Wenn Sie wollten, dass die Befehle (z. B. ls, cat) "down" werden, aber die Aufforderung, "up" zu bewegen, ist das Leben schwieriger.

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

Daniel Pittman
quelle
Ich mache. (-:
JdeBP
5

Dadurch wird die Ausgabe zwar nicht genau umgekehrt, die Eingabeaufforderung bleibt jedoch oben:

https://github.com/swirepe/alwaysontop

So verwenden Sie es:

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

Wenn es Ihnen gefällt, geben Sie es einfach in Ihrem .bash_profile mit so etwas wie:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
ryanpcmcquen
quelle
1
Dies ist ein bisschen fehlerhaft (z. B. mit Tab-Autocomplete und History), aber es ist eine sehr gute Demo, wie sich diese Benutzeroberfläche anfühlt, wenn sie richtig implementiert wurde. Ich denke, es ist wertvoll dafür - den Leuten zu helfen, zu wissen, ob sie es wollen oder nicht!
Scipilot