
Die Frage wird hier gestellt:
- https://serverfault.com/questions/152310/reverse-bash-console-text-flow
- https://superuser.com/questions/719317/kann-ich-die-stream-richtung-meines-terminals-umkehren
- https://askubuntu.com/questions/431873/terminal-with-output-scrolling-down
Wenn ich diese Änderung tatsächlich implementieren möchte, welche Bibliothek/welches Programm muss ich untersuchen? Welcher Teil des „Terminalstapels“ ist für das Verhalten beim Anhängen neuer Zeilen an den Terminalpuffer verantwortlich?
Ich dachte immer, es würde sich im Quellcode eines Terminals befinden und dann in der Shell, aber jetzt sieht es so aus, als wäre es möglicherweise VTE?
Irgendwelche Hinweise?
Antwort1
Terminalemulatoren sind nicht identisch implementiert. Was Sie ändern müssen, hängt ganz konkret davon ab, welchen Terminalemulator Sie modifizieren möchten.
Im Allgemeinen kann dies an zwei Stellen implementiert werden: im Emulationsteil, der Druck- und Steuersequenzen als Änderungen an einer Art speicherinterner Darstellung des Anzeigezustands des Terminals interpretiert und ausführt, oder im Realisierungsteil, der diesen Anzeigezustand auf einer Art Ausgabegerät wiedergibt.
Ersteres wäre eine hochkomplexe Aufgabe. Anwendungssoftware, sowohl solche, die Vollbild-Textbenutzeroberflächen bieten, als auch solche, die lediglich Dinge wie eine editierbare einzelne Zeile bereitstellen, machen Annahmen über dieRichtung des Fortschritts. Sie nehmen alle möglichen Dinge an, wie die Richtungen von ␊
, ␈
, ␌
, ␋
, RI
, IND
, CUD
, CUU
, und so weiter. (Theoretisch sind in einem ECMA-48:1991-konformen Gerät die Richtungen des Linienverlaufs und der impliziten Bewegung umschaltbar. Mir ist kein Unix- oder Linux-Terminalemulator bekannt, der dies tatsächlich implementiert. Die Welt ist größtenteils von der Annahme ausgegangen, dass dies nicht der Fall ist.) Ich vermute, dass man am Ende alle möglichen Konsequenzen und Folgewirkungen durchleben würde, um dann festzustellen, dass man die letztere Methode auf die harte Tour implementiert hat.
Weil Letzteres eine vergleichsweise einfache Aufgabe ist. Aus Spaß habe ich es einfach in meinem Terminalemulator implementiert. Es war ein Befehlszeilenschalter für ein Boolean-Flag in zwei der Realisierer und einige bedingte Ausdrücke, um an mehreren Stellen Koordinatentransformationen durchzuführen. Zugegebenermaßen ist das sichtbare realisierte Fenster in diesen Realisierern immer ein ganzzahliges Vielfaches der Zeichenzellengröße, was einige zusätzliche Komplexitäten vermieden hat.
Das heißt: nachdem ich es benutzt und gegen die Gewohnheit des jahrelangen Lesens von oben bis unten angekämpft habe, und dann genau das erlebt habe,anfänglichProbleme mit Anwendungen, die kleine Dinge erwarten (wie ein Caretzeichen als Arme-Leute-ZeichenhochPfeil und Tilde sind eine Unterstreichung für Arme), dann habe ich einen Warnhinweis in die Manualpage eingefügt. Ich überlege, den Mechanismus für die nächste Version beizubehalten, damit die Leute von nun an tatsächlich ein Terminal mit falscher Seite ausprobieren und zu dem Schluss kommen können, dass sienichtwollen das, egal, was sie behauptet haben. ☺
Weiterführende Literatur
- Jonathan de Boyne Pollard.
console-termio-realizer
. Handbuchseiten zum Nosh-Toolset. Software. - Jonathan de Boyne Pollard.
console-fb-realizer
. Handbuchseiten zum Nosh-Toolset. Software. - https://unix.stackexchange.com/a/289871/5132
Antwort2
Was ist dergenauVerhalten, das Sie erreichen möchten?
Zunächst gehe ich davon aus, dass Siealledie Zeilen in umgekehrter Reihenfolgedie ganze Zeit.
Beachten Sie, dass dies meiner Meinung nach in den meisten Fällen zu einem äußerst ungewöhnlichen und kontraintuitiven (wenn nicht sogar völlig fehlerhaften) Verhalten führen würde, möglicherweise zu etwas, dessen Verwendung Sie schon bald nicht mehr verwenden würden.
cat
Beim Lesen einer Textdatei würden die Zeilen von unten nach oben angezeigt, nicht in der Richtung, in der Sie normalerweise Text lesen. In Ihrem bevorzugten Texteditor und -viewer wären die Zeilen außerdem umgekehrt. In Anwendungen wäre die obere Leiste unten und die untere Leiste oben. In Alsamixer würden die Lautstärkeregler von oben herunterhängen. Box-Zeichen (z. B. in Alsamixer, Midnight Commander usw.) würden an den Ecken auseinanderfallen. Die Auf- und Ab-Tasten würden den Cursor in vielen Apps in die entgegengesetzte Richtung bewegen.
Dies kann erreicht werden, indem Sie die Quelle Ihres bevorzugten Terminalemulators ändern (oder VTE, falls Sie einen VTE-basierten Emulator wie GNOME Terminal verwenden).
Im Grunde verfolgt der Terminalemulator den logischen Inhalt (welche Zeichenzelle welchen Buchstaben mit welchen grafischen Attributen enthält) und konvertiert ihn in für den Benutzer sichtbare Pixel (schön gerenderte Glyphen). Dies müsste auf den Kopf gestellt werden. Ich würde nach den Stellen suchen, an denen eine Konvertierung zwischen den zeichenbasierten und den pixelbasierten Koordinaten stattfindet, also allen Stellen, an denen eine Multiplikation oder Division durch die Höhe der Zelle erfolgt. Diese Formeln müssten angepasst werden. Wenn Sie beispielsweise ein sehen, y_pixel = top_padding + row * cell_height
würde es vielleicht zu einem werden y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height
oder so etwas in der Art.
In VTE verursachen das superweiche Scrollen (Scrollen pro Pixel mit dem Touchpad) und die Art und Weise, wie die zusätzliche untere Polsterung (bei nicht am Raster ausgerichteten, z. B. maximierten Fenstern) beim sanften Scrollen mit Inhalt gefüllt wird, zusätzliche Kopfschmerzen.
Sobald Sie das grundlegende Rendering abgeschlossen haben, müssen Sie auch sicherstellen, dass die an die Apps gesendeten Mausereignisse sowie die Mausereignisse, die die Auswahl verfolgen, richtig umgedreht werden. Die Bildlaufleiste sollte ebenfalls umgedreht werden.
Als zweiten Schritt möchten Sie möglicherweise entweder einen Menüeintrag hinzufügen oder eine neue benutzerdefinierte Escape-Sequenz (wahrscheinlich eine neue private DEC-Nummer) einführen, mit der Sie zwischen dem Standardverhalten und diesem umgekehrten Verhalten umschalten können. Beachten Sie, dass beim Ändern des Modus sofort alles (alle Bildschirminhalte und der Verlauf) auf den Kopf gestellt oder zurückgestellt wird. Es ist praktisch, das ursprüngliche Verhalten wiederherstellen zu können, insbesondere wenn dies automatisch in einem Wrapper-Skript vor beispielsweise Ihrem bevorzugten Editor erfolgen kann. Im Fall von VTE und einem VTE-basierten Emulator würde ein grafischer Menüeintrag eine neue API zwischen den beiden Komponenten erfordern. Dies ist also ein weiterer Grund, sich stattdessen für eine Escape-Sequenz zu entscheiden.
Wenn Sie etwas Feineres als dies haben möchten, z. B. dass die Ausgabe jedes Befehls in „normaler“ Reihenfolge angezeigt wird, während die Befehlsfolge „auf dem Kopf“ steht, wird dies um ein Vielfaches komplexer, was im Emulator nicht allein erledigt werden kann. Er müsste Hilfe (über neu entwickelte Escape-Sequenzen) erhalten, um zu wissen, welche logischen Teile umgedreht werden müssen. Meine persönliche Empfehlung ist, es zu vergessen, ich finde es nicht vernünftig machbar.