Term.everything – Alle GUI-Apps im Terminal ausführen
(github.com/mmulet)- Ein CLI-Programm für Linux, mit dem sich GUI-Anwendungen direkt im Terminal ausführen lassen
- Verwendet einen selbst entwickelten Wayland-Compositor, der die GUI-Ausgabe statt an einen Monitor an das Terminal weiterleitet
- Funktioniert auch in SSH-Umgebungen; Webbrowser, Dateimanager und sogar das Spiel Doom lassen sich im Terminal ausführen
- Die Ausgabequalität hängt von der Terminalauflösung (Anzahl der Zeilen und Spalten) ab; in bildunterstützenden Terminals wie iTerm2 und kitty wird auch Rendering in voller Auflösung unterstützt
- Entwickelt auf Basis von Typescript und bun, mit etwas C++-Code; derzeit werden nur einige Apps unterstützt, aber das Projekt wird mit dem Ziel „Term everything❗“ weiter ausgebaut
Bedeutung des Projekts und Vergleichsvorteile
- Im Unterschied zu bestehenden Terminal-Dateibetrachtern oder einfachen Bildausgabetools kann Term.everything „alle“ GUI-Anwendungen im Terminal ausführen
- Da sich die GUI auch in Netzwerkumgebungen einschließlich SSH nutzen lässt, ist es besonders stark bei Serververwaltung und Remote-Entwicklung
- Nutzt die Bildfunktionen moderner Terminals wie kitty und iTerm2 maximal aus und bietet Optionen zur Verbesserung von Auflösung und Framerate
Überblick
- Term.everything ist ein Linux-CLI-Programm, dessen Besonderheit darin besteht, GUI-Fenster direkt im Terminal auszuführen
- Das Herzstück ist ein selbst entwickelter Wayland-basierter Compositor, der die GUI nicht auf einem normalen Monitor, sondern im Terminal rendert
- Unterstützt sowohl x11- als auch Wayland-basierte Anwendungen und kann auch remote über SSH verwendet werden
- Die begrenzte Zahl an Terminalzeilen und -spalten beeinflusst die Fensterqualität; mit höherer Terminalauflösung lässt sich die Qualität verbessern, allerdings möglicherweise auf Kosten der Performance
Wichtige Einsatzbeispiele
- Spiele ausführen: Im Terminal lassen sich Spiele wie Fontemon oder Doom (Shareware-Episode) starten
- Video abspielen: Der Film Wing It! kann wiedergegeben werden; über die Auflösung lässt sich ein Gleichgewicht zwischen Framerate und Bildqualität einstellen
- Browser starten: In einer iTerm2- + SSH-Umgebung kann man sich mit Ubuntu verbinden und Firefox starten
- Alternative zu Dateibetrachtern: Statt eigens einen terminalspezifischen Dateibetrachter zu bauen, kann man bestehende GUI-Dateimanager direkt im Terminal verwenden
- Rekursive Ausführung: Ein weiteres Terminal innerhalb des Terminals ausführen, also ein "terminal in a terminal"
Funktionsweise und Entwicklungsinformationen
-
Grundkonzept
- Früher konnten Programme, wenn sie etwas auf dem Bildschirm darstellen wollten, direkt in einen bestimmten Bereich des RAM schreiben
- In modernen Systemen verwaltet ein Display Server die Ein- und Ausgabe und koordiniert Eingaben wie Maus und Tastatur sowie Grafik- und Bildausgabe
- Unter Linux werden hauptsächlich das Wayland-Protokoll oder X11 verwendet; Term.everything basiert auf Wayland
-
Das Wayland-Protokoll
- Wayland ist nicht der Display Server selbst, sondern ein Protokoll, das die Kommunikation zwischen Server und Programmen definiert
- Programme übergeben ihre selbst gerenderten Ergebnisse an den Display Server, der sie auf dem Bildschirm ausgibt
- Wichtig ist, dass kein bestimmtes Rendering-Modell erzwungen wird → Programme können auf die von ihnen gewünschte Weise zeichnen
- Dadurch kann das Ausgabeergebnis statt auf den Bildschirm auch an einen anderen Ort gesendet werden, z. B. an ein Terminal
-
Ausgabeverarbeitung in Term.everything
- Nimmt die von Wayland-Clients (den gestarteten GUI-Apps) gezeichneten Bilder entgegen und wandelt sie in Terminal-Zeichenausgabe um
- Umwandlungsprozess:
- 1. Empfang der vom Client übermittelten Bilddaten
- 2. Umwandlung in UTF-8-Zeichen + ANSI-Escape-Codes
- 3. Für die Umwandlung wird die chafa-Bibliothek verwendet, die Pixel auf Terminalzeichen abbildet
- Eingaben werden über stdin übergebene Tastatur- und Mausereignisse an die Wayland-Clients weitergereicht
-
Tatsächliche Implementierung
- Die Kernidee ist einfach, aber für die tatsächliche Implementierung sind etwa zehntausend Zeilen Code nötig
- Geschrieben in Typescript (auf bun-Basis) und teilweise in C++; es übernimmt die Rolle eines benutzerdefinierten Wayland-Display-Servers
- Der Quellcode ist im Verzeichnis src/ einsehbar
-
Erweiterbarkeit
- Term.everything will mehr sein, als nur GUI im Terminal auszuführen
- Mit einem benutzerdefinierten, Wayland-basierten Display Server lassen sich möglicherweise auch andere experimentelle Ideen umsetzen
- Zum Beispiel könnte das Ausgabegerät statt eines Terminals an ein völlig anderes Medium angebunden werden, etwa einen Drucker oder physische Kunstwerke
9 Kommentare
Doppelt gemoppelt
So etwas ist wirklich richtig geekig, haha.
Warum wird bei mir nur das Logo angezeigt und sonst funktioniert nichts??
Ich habe meinen privaten Mac über den Firmen-Mac gesteuert und dafür Synergy verwendet. Da ich meinen privaten Mac inzwischen abgegeben habe und nur noch Linux nutze, ist mein Workflow umständlicher geworden.
Heißt das, dass ich mit diesem Tool vom Terminal des Firmen-Macs auf meinen privaten Linux-Desktop zugreifen und dort nach Belieben dies und das erledigen kann?
Ich schätze, dem Sicherheitsteam würde das wohl nicht gefallen.
Vielleicht liegt es daran, dass ich schon ein alter Hase bin, aber braucht man das wirklich?
Das scheint nützlich zu sein, wenn man auf einem Server webbezogene Experimente über
localhostdurchführt.Sie meinen wohl, wenn man etwas lokal lösen und vor dem Deployment testen möchte, oder?
Arbeiten an einem entfernten Ort, wenn der Zugang zum internen Netzwerk schwierig war und die Umgebung eingeschränkt war...
Wenn man in iTerm mit term.everything iTerm öffnet ... geht das dann?
Hacker-News-Kommentare
keydown-Events, aber keinekeyup-Events. Deshalb muss man raten, wann der Benutzer die Taste losgelassen hat. Normalerweise kann mankeyupsofort senden, aber bei Doom musste ich wegen des Key-Debounce-Verhaltens etwa 50–100 ms warten. Um sich im Spiel nach vorne zu bewegen, hält man normalerweise die Pfeiltaste nach oben gedrückt, aber bei der jetzigen Methode muss man sie wiederholt drücken, was etwas unpraktisch ist; trotzdem läuft es und ist spielbar.bash_completionsollte wirklich so gestaltet sein, dass es extrem einfach zu benutzen ist. In der Praxis ist es schwieriger zu schreiben, als man denkt; selbst einfaches Copy-and-Paste ist umständlich. Clevere Entwickler bauen Apps von Anfang an so, dass sie gut mitbash_completionharmonieren. Wenn zum Beispiel das erste zentrale Argument bash-freundlich ist, kann man mit einer Struktur wiemycli myfunc ...per Tab sofort alle Funktionen entdecken. Neue Funktionen müssen dann nicht extra beworben werden. Und wenn man etwas nur aus der Completion entfernt, lassen sich Funktionen auf natürliche Weise auslaufen, ohne bestehende Skripte kaputtzumachen. Am Ende landet dann alles in der CLI, einfach weil es schon jemand vorbereitet hat.