Ghostel.el – Emacs-Terminalemulator auf Basis von libghostty
(dakra.github.io)- Ghostel ist ein Emacs-Terminalemulator, der dieselbe
libghostty-vt-Engine wie Ghostty nutzt: Ein natives Zig-Modul übernimmt Terminalzustand, Rendering sowie lokale PTY-Ein-/Ausgabe, während Elisp Keymaps, Buffer, Befehle und Remote-Prozesse verwaltet - Unterstützt werden das Kitty-Tastatur- und Grafikprotokoll, OSC-8-Hyperlinks, OSC-4/10/11-Farbabfragen, synchronisierte Ausgabe nach DEC 2026 sowie fünf Eingabemodi; für lokale bash, zsh, fish und nushell wird die Shell-Integration automatisch angewendet
- Unterstützt werden Emacs 28.1 oder neuer sowie macOS, Linux, FreeBSD und natives Windows; beim ersten Einsatz können plattformspezifische vorgebaute Module automatisch heruntergeladen werden, sodass für eine typische Installation keine Zig-Toolchain nötig ist
- Ein Benchmark auf Apple M4 Max und Emacs 32.0.50, der 1 MB Ausgabe verarbeitete, ergab für normales ASCII 75 MB/s mit Ghostel, 18 MB/s mit vterm und 6,2 MB/s mit eat; das native PTY absorbiert eine 10-MB-
cat-Operation in etwa 110 ms - Geboten werden außerdem TRAMP-Remote-Terminals, Schutz bei Passworteingaben, Kitty-Inline-Bilder sowie Integration mit Compilation, Eshell, Comint, Evil und Eingabemethoden; bei Remote-Zielen und Bildverarbeitung gibt es jedoch plattform- und protokollbedingte Einschränkungen
Aufbau und Installation
- Ghostel ist vom zweischichtigen Design von emacs-libvterm inspiriert, nutzt statt libvterm jedoch Ghosttys moderne VT-Engine
- Das Zig-Modul verarbeitet Terminalzustand, Rendering, Tastencodierung, lokale PTYs und Hintergrund-Lesevorgänge
- Elisp ist für Keymaps, Buffer, Befehle, Projektintegration und TRAMP-Remote-Prozesse zuständig
- Voraussetzung sind Emacs 28.1 oder neuer mit Unterstützung für dynamische Module sowie macOS, Linux, FreeBSD oder natives Windows
- Vorgebaute Binärdateien werden für
aarch64-macos,x86_64-macos,x86_64-linux,aarch64-linux,x86_64-freebsd,x86_64-windowsundaarch64-windowsbereitgestellt - Für andere Plattformen oder Builds aus dem Quellcode ist Zig 0.15.2 erforderlich
- Vorgebaute Binärdateien werden für
- Die Installation ist über MELPA,
use-package :vcab Emacs 30,:load-pathoder ein manuellesrequiremöglich; das Terminal wird mitM-x ghostelgeöffnet - Wenn kein natives Modul vorhanden ist, wird je nach Einstellung von
ghostel-module-auto-installein Download oder eine Kompilierung aus dem Quellcode vorgeschlagenM-x ghostel-download-modulelädt die minimal unterstützte Binärdatei herunter; mit Präfixargument kann ein Release-Tag ausgewählt werdenM-x ghostel-module-compilebaut das Modul mitzig build- Falls das Paketverzeichnis neu installiert werden kann, lässt sich mit
ghostel-module-directoryein separater Speicherort festlegen
- Der Quell-Build enthält die generierte Datei
vendor/emacs-module.h, sodass in der Regel keine lokalen Emacs-Header nötig sind; der Header-Pfad kann überEMACS_INCLUDE_DIRoderEMACS_BIN_DIRgeändert werden- Die kompilierte
xterm-ghostty-terminfo ist unteretc/terminfo/enthalten und liegt in einem zwischen BSD und ncurses portablen Format vor
- Die kompilierte
Windows-Unterstützung
- Unter nativem Windows-Emacs werden lokale Terminals über ConPTY ausgeführt; die Architektur der Modul-DLL muss nicht zu Windows, sondern zur Emacs-Architektur passen
- Zusammen mit dem vorgebauten Modul werden die Hilfsdateien
conpty.dllundOpenConsole.exeheruntergeladen; fehlen diese Dateien, wird auf die in Windows integrierte ConPTY-API zurückgegriffen - Spezielle benutzerdefinierte Emacs-Builds, etwa mit statischer CRT, werden nur nach Best-Effort-Prinzip unterstützt
- TRAMP-Terminals unter Windows unterstützen nur POSIX-Remote-Ziele, das PTY befindet sich auf dem Remote-Host; dynamische Änderungen der Fenstergröße werden derzeit nicht unterstützt
Fünf Eingabemodi
- Der standardmäßige semi-char-Modus sendet die meisten Tasten ans Terminal, belässt aber Ausnahmen wie
C-c,C-x,C-u,C-h,M-x,M-:,C-\bei Emacs- Er stellt Tasten für Interrupt, Suspend, EOF-Übertragung, bracketed paste, das Löschen des Scrollbacks sowie die Navigation zu Prompts und Hyperlinks bereit
- Der char-Modus sendet alle Tasten ans Terminal und eignet sich damit für TUIs, die selbst
C-x,M-xoderC-hverwenden; nurM-RETbleibt als Escape-Taste erhalten - Der Emacs-Modus empfängt weiterhin Terminalausgabe, setzt den Buffer aber auf schreibgeschützt und erlaubt Standard-Emacs-Navigation wie
isearch,occur, Markieren und Kopieren- Normale Eingaben werden nicht an die Shell weitergegeben; nur absichtliches Einfügen mit
C-ywird per bracketed paste gesendet
- Normale Eingaben werden nicht an die Shell weitergegeben; nur absichtliches Einfügen mit
- Der copy-Modus hält Terminalaktualisierungen an, damit stabil ausgewählt, navigiert und kopiert werden kann
- In kopiertem Text werden Zeilenumbrüche entfernt, die durch Soft Wrapping entstanden sind
- Beim Standardwert
ghostel-readonly-fast-exit=tkehrt Ghostel nach Zeicheneingabe oder Kopieren automatisch zur normalen Terminalsession zurück
- Der line-Modus sendet Tasten nicht sofort an die Shell, sondern lässt eine Zeile im Emacs-Buffer bearbeiten und überträgt sie erst bei
RETgesammelt- Auch wenn asynchrone Ausgabe oder ein neuer Prompt eintrifft, wird die gerade verfasste Eingabe als Snapshot bewahrt und anschließend wieder eingefügt
- Ist OSC 133 vorhanden, werden Prompt-Grenzen verwendet; andernfalls werden sie mit
ghostel-prompt-regexpgesucht - Beim Start einer Vollbild-TUI wird in den semi-char-Modus gewechselt und nach Beenden der TUI in den line-Modus zurückgekehrt
TABnutzt comint-Completion und optional bash programmable completion
- Beim Verlassen der Live-Eingabeposition durch Mausziehen, Mehrfachklicks, Aktivierung der Markierung,
isearchoderconsult-linewird standardmäßig in den copy-Modus gewechselt, um Auswahl und Position zu schützen- Hat eine TUI DEC-Maus-Tracking aktiviert, werden Mausevents im Eingabemodus an dieses Programm weitergereicht
- Mit
ghostel-mouse-drag-input-mode,ghostel-mark-activation-input-modeundghostel-point-leave-input-modelässt sich das Umschaltverhalten ändern
Terminalfunktionen und Rendering
- Über libghostty-vt werden vollständige VT-Emulation, 256 Farben und 24-Bit-Farbe, Alternate Screen, mehrere Unterstreichungsstile und -farben, fett, kursiv, gedimmt, durchgestrichen, invertiert sowie vier Cursorformen und Blinken unterstützt
- Das standardmäßige
TERM=xterm-ghosttyund die gebündelte terminfo melden Anwendungen Funktionen wie synchronisierte Ausgabe nach DEC 2026, Kitty-Tastatur, True Color, farbige Unterstreichungen und Fokusberichte- Über OSC-4/10/11-Abfragen können TUIs aus Emacs-Face-Farben Palette sowie Vorder- und Hintergrundfarbe beziehen
- Die OSC-52-Zwischenablage wird unterstützt, ist standardmäßig aber deaktiviert, daher bewirbt die gebündelte terminfo die
Ms-Funktion nicht
- Der Standard-Scrollback beträgt 5 MB, etwa 5.000 Zeilen, und wird als Emacs-Buffer materialisiert, sodass er mit
isearchundconsult-linedurchsucht werden kann - Zusätzlich zu OSC-8-Hyperlinks werden normale HTTP-/HTTPS-URLs und Dateipfade der Form
/path/file.el:42erkannt und als klickbare Links bereitgestellt - Unterstützt werden Ghosttys Tastencodierer und das Kitty-Tastaturprotokoll, SGR-Mausevents, DEC-1004-Fokusereignisse sowie Drag-and-drop von Dateipfaden und Text
- Der Renderer überspringt unveränderte Zeilen, bündelt Updates per Timer und passt die Framerate adaptiv an
- PTY-Echos, die direkt nach einer Tasteneingabe eintreffen, umgehen den standardmäßigen 33-ms-Timer und werden sofort gerendert
ghostel-sync-themesynchronisiert die Palette erneut passend zum Emacs-Theme
- Die 16 ANSI-Farben sind Emacs-Faces, die
term-color-*erben; mitghostel-defaultlassen sich terminalspezifische Schriftart, Schriftgröße, Vorder- und Hintergrundfarbe einstellen
Shell-Integration und Emacs-Aufruf
- Für bash, zsh, fish und nushell werden OSC-7-Verzeichnis-Tracking, OSC-133-Prompt-Navigation, OSC-2-Titel-Tracking und
ghostel_cmdautomatisch konfiguriert- Die Shell-Integration von nushell selbst stellt OSC 7, 133 und 2 bereit;
ghostel.nuergänztghostel_cmdund einen outbound-SSH-terminfo-Wrapper - Das in macOS enthaltene bash 3.2 ignoriert das für die automatische Injektion verwendete
ENV; daher muss man ein aktuelles bash verwenden oderghostel.bashmanuell laden
- Die Shell-Integration von nushell selbst stellt OSC 7, 133 und 2 bereit;
ghostel_cmdzum Aufrufen von Elisp aus der Shell verwendet eine dedizierte OSC-52;e-Erweiterung und führt nur Funktionen aus, die in der Allowlistghostel-eval-cmdsstehen- Standardmäßig erlaubt sind
find-file,find-file-other-window,dired,dired-other-windowundmessage
- Standardmäßig erlaubt sind
- Emacs-Lesezeichen speichern das Arbeitsverzeichnis des Terminals und den Buffernamen
- Ist ein bestehender Buffer vorhanden, wird er wiederverwendet; andernfalls wird im gespeicherten Verzeichnis eine neue Shell gestartet
- Scrollback und Sitzungsinhalte werden nicht gespeichert
Passwörter, Zwischenablage und Benachrichtigungen
- Wenn Passwort-Prompts etwa von
sudo,ssh,gpgoderpasswderkannt werden, wirdread-passwdgeöffnet und die Antwort direkt an das PTY gesendet, sodass die Eingabe nicht inview-lossage, dem Recent-Keys-Ring oder Tastaturmakros verbleibt- Lokal wird mit
tcgetattrgeprüft, ob der kanonische Modus und Echo deaktiviert sind - Nur bei Remote-Shells wird eine Regex-basierte Ersatzerkennung verwendet, um False Positives bei lokalen Raw-Mode-TUIs zu reduzieren
- Nach dem Senden wird der Passwort-String sofort mit
clear-stringbereinigt - Über
ghostel-password-prompt-functionslassen sich Quellen wie auth-source, KeePass oder pass hinzufügen
- Lokal wird mit
- Wenn OSC 52 explizit aktiviert ist, können Remote-Programme den Emacs kill ring und die Systemzwischenablage setzen; Einfügen wird als bracketed paste übertragen
- OSC-9- und OSC-777-Benachrichtigungen werden an
ghostel-notification-functionweitergeleitet- Der Standard-Handler verwendet alert, falls installiert, und fällt andernfalls auf
messageim Echo-Bereich zurück
- Der Standard-Handler verwendet alert, falls installiert, und fällt andernfalls auf
- OSC-9;4-Fortschritt übermittelt die Zustände
remove,set,error,indeterminateundpausesowie Werte von 0 bis 100- Es werden ein einfacher Textindikator und ein animierter Indikator auf Basis von spinner.el bereitgestellt
Kitty-Inline-Bilder
- Unterstützt werden direkte Platzierung und Platzierung über U+10EEEE-Unicode-Platzhalter im Kitty graphics protocol, sodass Bilder aus
timg,kitty +kitten icat,yaziund anderen Tools gerendert werden - PNGs werden mit dem eingebetteten stb-Decoder verarbeitet, und RGB-, RGBA-, Gray- sowie GrayAlpha-Daten werden im nativen Modul nach PPM konvertiert, sodass ImageMagick nicht erforderlich ist
- CSI-14-, -16- und -18-
t-Größenabfragen werden beantwortet; mitghostel-cell-pixel-scalelässt sich das Verhältnis physischer Pixel festlegen - Für die Bildverarbeitung gelten folgende Einschränkungen
- Alphakanäle werden nicht zusammengesetzt, sondern entfernt; daher ist dies für halbtransparente Kanten ungeeignet
- Kitty-source-rect-Zuschnitt wird nicht unterstützt und gibt einen expliziten Fehler zurück
- Mehrere virtuelle Platzierungen im selben Buffer teilen sich ein Rendering; die zuletzt übertragene hat Vorrang
- Standardmäßig ist nur inline base64 erlaubt; Datei-, temporäre Datei- und Shared-Memory-Medien müssen aus Sicherheitsgründen explizit aktiviert werden
- Das standardmäßige Grafik-Speicherlimit pro Terminal beträgt 320 MiB
TRAMP und Remote-terminfo
- Wenn
default-directoryein TRAMP-Pfad ist, wird die Shell auf dem entsprechenden POSIX-Host ausgeführt; SSH-artige TRAMP-Methoden und Shells wiedockerkönnen überghostel-tramp-shellsfestgelegt werdenlogin-shellerkennt die Login-Shell des Remote-Benutzers übergetent passwd- Das OSC-7-Verzeichnis-Tracking bewahrt Methode, Benutzer und Multi-Hop-Präfixe des bestehenden TRAMP-Pfads
- Windows-Remote-Ziele werden auf diesem POSIX-Shell-/tty-Pfad nicht unterstützt
- Die Remote-Shell-Integration wird standardmäßig nicht injiziert; es gibt zwei Varianten
- Mit
ghostel-tramp-shell-integration=twird ein temporäres Skript übertragen und beim Beenden bereinigt - Auf persistenten Hosts können die Skripte aus
etc/shell/und optional terminfo direkt installiert werden
- Mit
- Fehlt auf dem Remote-System die terminfo
xterm-ghostty, kann das Öffnen des Terminals fehlschlagen;ghostel-ssh-install-terminfoübernimmt die Installation- Bei TRAMP-Ausführung wird terminfo über die bestehende Verbindung in ein temporäres Verzeichnis übertragen und beim Beenden gelöscht
- Ein aus dem lokalen Ghostel gestartetes
sshnormalisiert das Ziel mitssh -G, prüft den Cache und führt bei Bedarf über eine einzelne zusätzliche Verbindungtic -x -aus - Der lokale terminfo-Hash ist im Cache-Key enthalten, sodass er bei Updates von libghostty automatisch ungültig wird; separat auf dem Remote-System geänderte terminfo wird jedoch nicht erkannt
- Bei
ssh HOST cmd, Optionsaufrufen ohne Host oder wenn lokal keininfocmpvorhanden ist, wird die Installation übersprungen
- Wer den Remote-Host nicht verändern möchte, kann die automatische Installation deaktivieren und terminfo manuell installieren; wenn
ghostel-termaufxterm-256colorgeändert wird, sind die zugehörigen Einstellungen nicht nötig, allerdings entfällt dann auch der Ghostty-spezifische High-Speed-Pfad für synchronisierte Ausgabe
Emacs-Erweiterungen
- evil-ghostel synchronisiert Evils Insert- und Normal-State mit dem Terminal-Cursor
- Unterstützt werden Bewegungen, Einfügen, Löschen, Ändern, Ersetzen, bracketed paste, readline undo und zustandsabhängige Cursorformen
- Auf vim, less und htop im alternate screen wirkt es sich nicht aus
ghostel-compileführt Befehle in einem echten PTY aus und bietet zugleich Header, Footer, Fehlerhervorhebung undnext-error-Navigation im Stil voncompilation-mode- Standardmäßig ist dies eine schreibgeschützte Navigation; mit Präfixargument werden interaktive Eingaben weitergeleitet
- Auch während der Ausführung kann mit
C-c C-jundC-c C-eoderC-c C-tzwischen interaktiver Eingabe und Compile-Navigation umgeschaltet werden ghostel-compile-global-modeleitet Aufrufe voncompile,recompile,project-compileundcompilation-startan Ghostel weitergrep-modebehält standardmäßig die bestehende Implementierung bei
ghostel-eshell-visual-command-modeführt Visual Commands von Eshell wie vim, htop oder less statt interm-modein einem dedizierten Ghostel-Buffer ausghostel-comint-modeverarbeitet comint-Ausgabeströme mitlibghostty-vtund bietet true color, verschiedene Unterstreichungen, OSC-8-Links und OSC-7-Verzeichnisaktualisierungen- Da es kein vollständiges Terminal ist, entfallen Cursorpositionierung, alternate screen und vollständiges Neuzeichnen des Bildschirms; für
htopoderlessist es nicht geeignet
- Da es kein vollständiges Terminal ist, entfallen Cursorpositionierung, alternate screen und vollständiges Neuzeichnen des Bildschirms; für
ghostel-ime-modelöscht die Ergebnisse von Elisp-Eingabemethoden, die Zeichen wie Hangul direkt in den Buffer einfügen, und leitet sie anschließend als UTF-8 an das PTY weiter- Während einer Quail-Komposition wird das Rendering verzögert, damit der Buffer den Kompositionsstring nicht überschreibt
Performance
- Gemessen auf einem Apple M4 Max mit Emacs 32.0.50, indem 1 MB über eine echte Prozess-Pipe gesendet und etwa 1.000 Zeilen Scrollback beibehalten wurden; die Ergebnisse waren wie folgt:
- Einfaches ASCII: Ghostel 75 MB/s, Ghostel mit deaktivierter Link-Erkennung 76 MB/s, vterm 18 MB/s, eat 6,2 MB/s, eingebautes term 7,2 MB/s
- Ausgabe mit vielen URLs: Ghostel 36 MB/s, Ghostel mit deaktivierter Link-Erkennung 78 MB/s, vterm 15 MB/s, eat 4,5 MB/s, term 5,9 MB/s
- Die Erkennung von URLs und Dateipfaden läuft in einem zusammengefassten Timer außerhalb des Redraw-Pfads und verursacht bei normaler Ausgabe kaum Kosten; bei linklastiger Ausgabe sinkt der Durchsatz jedoch auf etwa die Hälfte
- Für einen fairen Vergleich nutzen die obigen Werte den Emacs-Prozesspfad; die standardmäßige lokale native PTY ist bei kontinuierlichen großen Dumps etwa doppelt so schnell, da ein Zig-Background-Thread die Ausgabe liest
- Der Median aus fünf Durchläufen mit
catauf einer 10-MB-Datei beträgt etwa 110 ms für natives Ghostel, etwa 220 ms für Emacs-PTY-Ghostel, etwa 550 ms für vterm und etwa 1,8 Sekunden für eat- vterm und eat belegen während der Übertragung synchron den Emacs-Main-Thread, während Ghostels native PTY im Hintergrund parst, sodass die UI weiter reagiert
M-x ghostel-debug-typing-latencymisst Minimum, Median, p99 und Maximum der PTY-, Rendering- und Gesamtlatenz pro Taste
Unterschiede zu vterm und eat
- vterm nutzt ein C-basiertes natives libvterm-Modul, während eat in reinem Elisp geschrieben ist und daher ohne Build portabel ist, dafür aber einen geringeren Durchsatz hat
- Nur Ghostel unterstützt Kitty-Keyboard und -Grafik, fünf Arten von Unterstreichungen, OSC 8, OSC 4/10/11, OSC-9- und OSC-777-Benachrichtigungen, OSC-9;4-Fortschritt sowie DEC 2026 vollständig
- eat unterstützt Sixel-Bilder, aber keine Kitty-Bilder; vterm unterstützt keines der beiden Bildprotokolle
- Ghostel und eat leiten SGR-Mausereignisse an TUIs weiter, während vterm Klicks zur Bewegung des Emacs-Punkts verwendet
- Ghostel und eat bieten einen Line-Modus, vterm dagegen nicht
- Ghostel bietet sowohl einen Copy-Modus, in dem die Ausgabe anhält, als auch einen Emacs-Modus, in dem die Ausgabe weiterläuft
- vterm bietet einen statischen Copy-Modus, und der read-only Emacs-Modus von eat wird weiter aktualisiert
- Ghostel injiziert Shell-Integration automatisch, während vterm und eat Skripte manuell laden müssen
- Passwort-Prompts erkennt Ghostel automatisch; eat bietet nur einen manuellen Sendebefehl, und vterm fängt Eingaben nicht separat ab
Interne Architektur
- Bei lokalen Buffern öffnet standardmäßig Zig die PTY, erzeugt den Kindprozess und leitet die Ausgabe in einem Background-Thread an
libghostty-vtweiter- Wenn OSC-Callbacks oder Redraws nötig sind, werden Lisp-Events über eine Emacs-Pipe gesendet und von
ghostel--events-filterverarbeitet - Große Ausgaben durchlaufen den Emacs-Prozessfilter nicht byteweise
- Wenn OSC-Callbacks oder Redraws nötig sind, werden Lisp-Events über eine Emacs-Pipe gesendet und von
- TRAMP-Buffer empfangen die Ausgabe über einen Emacs-Prozess und leiten sie synchron an dasselbe Terminalmodell weiter, um Remote-Erzeugung und File-Handler beizubehalten
- Tastatureingaben werden über den libghostty-Encoder sofort in die PTY geschrieben; Ausgaben durchlaufen den VT-Parser und die Invalidierungsphase und werden bei interaktivem Echo sofort aktualisiert, andernfalls aktualisiert
Renderer.zigdie geänderten Zeilen in einem zusammengefassten Timer - Da das Terminal-Rendering den Emacs-Buffer durch Zeilenersetzung, vollständiges Neuzeichnen, Größenänderung mit Reflow sowie Hinzufügen und Löschen von Scrollback verändert, ist der Renderer dafür verantwortlich, Punkt, Marke und Fensterposition zu erhalten
- Elisp entscheidet über Richtlinien und Nutzerabsicht, etwa ob nach einer Eingabe zum Live-Viewport gewechselt wird oder ob der Navigationszustand in den jeweiligen Modi erhalten bleibt
- Es sollte vermieden werden, Renderer-Änderungen mit Elisp-Heuristiken vor und nach dem Redraw zu korrigieren, da es schwer ist, zwischen User-Scrolling, Redisplay-Korrektur, Größenänderung und Content-Rewrite als Ursache zu unterscheiden
Tests und Lizenz
- Die Tests basieren auf ERT; Elisp-Tests können ohne Zig-Modul ausgeführt werden, während Tests mit dem Tag
nativeein gebautes Modul benötigen- Es gibt Makefile-Targets für Zig-Unit-Tests, vollständige Tests, Evil-Erweiterungstests und schnelle Benchmarks
- Bugs, Feature-Requests und Pull Requests werden im GitHub-Repository entgegengenommen; bei Rendering-Problemen werden Reproduktionsbefehl, Escape Sequence, Emacs-Version und Plattforminformationen benötigt
- Mit
M-x ghostel-debug-infokönnen Diagnose-Events gesammelt werden - Ghostel ist freie Software und wird unter der GNU GPL v3 oder neuer veröffentlicht
3 Kommentare
Die koreanische Eingabe scheint nicht zu funktionieren.
Auch mit
Ctrl-\scheint der Eingabemodus zwar auf Koreanisch umzuschalten, aber tatsächlich scheint nur englische Eingabe möglich zu sein.Das ist etwas schade.
Kommentare auf Lobste.rs
ghostel-projectein Ghostel, das mit dem jeweiligen Projekt verbunden ist.Wenn es bereits eine Instanz für das Projekt gibt, wird direkt zu dieser gewechselt, sodass der Wechsel zwischen Terminals sehr schnell ist.
vtermgibt es Dinge, die mich stören, aber dass man auch im Terminal die Editor-Befehle unverändert verwenden kann, ist wirklich großartig.Wenn es in Emacs um Terminal-Emulatoren geht, kommt oft die Antwort, man könne doch statt
cd/mv/ls/cp/rm/mkdr/...diredverwenden und statt Build-Befehlencompile– wozu brauche man das also? Aber selbst wenn man keine komplexen Aufgaben erledigt, fühlt sich ein Terminal vertrauter und flexibler an.Besonders wenn es eine Anleitung gäbe, wie man gerade in Doom Emacs die Abhängigkeit vom Terminal reduziert, würde ich sie gern ausprobieren. Zu sehen, wie man sich mit fortgeschrittener Konfiguration schnell durch Projekte bewegt, ist immer beeindruckend.
vtermkaputt; wegen Problemen bei der Berechnung der Zeilengröße gerät die Anzeige vonjjgelegentlich völlig durcheinander, was frustrierend ist.Am Ende habe ich daneben Ghostty geöffnet, hoffe aber, dass eines Tages alle Tools innerhalb von Emacs korrekt funktionieren.
eshellsehr viel.Mit
eat-eshellfunktionieren Programme, die Terminal-Emulation brauchen, wie Build-Tools und die Podman-CLI, sowie TUI-Anwendungen direkt imeshell-Buffer; für Leute, dieeshellhäufig nutzen, ist das ein echter Game Changer.eshellseparat verwendet, wenn man das doch auch im Terminal machen kann. Da icheshellnicht viel nutze, habe ich oft das Gefühl, den Zweck davon zu übersehen.Meinungen auf Hacker News
Ich bin der Maintainer von Ghostel. baokaola und ich wollten nächste Woche einen Show HN posten, aber jemand hat den Link vorher eingereicht.
Für einen schnellen Überblick ist das GitHub-Repository praktischer: https://github.com/dakra/ghostel
Ghostel ist ein Emacs-Terminalemulator auf Basis von libghostty-vt; einen Funktionsvergleich mit vterm und eat gibt es unter https://dakra.github.io/ghostel/#ghostel-vs-vterm. Es gibt auch Material, das Performance und Genauigkeit anhand von Bildern vergleicht: https://gist.github.com/dakra/4a0b76ebcf5d52338e134864378465...
Persönlich habe ich damit nicht nur vterm/eat ersetzt, sondern auch externe Terminals wie kitty und Ghostty. Wenn man Terminaltext wie einen normalen Emacs-Buffer behandelt, eröffnet das viele Erweiterungsmöglichkeiten, die es in anderen Terminals nicht gibt. Selbst einfache Dinge wie den Scrollback durchsuchen, dann nur mit der Tastatur navigieren, einen Absatz auswählen und kopieren, sind für Emacs-Nutzer viel natürlicher und schneller.
Falls ihr Ghostel ausprobiert und trotzdem ein externes Terminal beibehaltet, würde mich interessieren, ob es an fehlenden Funktionen liegt oder daran, dass ihr manche Prozesse außerhalb von Emacs ausführen wollt. Wir reagieren auch auf GitHub aktiv; wenn es Probleme gibt, öffnet bitte ein Issue.
f1dem Umschalten zwischen Semi-Char-Mode und Copy-Mode zugewiesen und überlege vor dem Ausführen eines Befehls: „Ist es okay, wenn Emacs abstürzt oder hart beendet wird?“ Wenn nicht, führe ich ihn in einem normalen Terminal aus.Ghostel ist nicht auf demselben Niveau integriert, und Erweiterungen wie evil-ghostel-mode haben ebenfalls Grenzen. Mich würde interessieren, ob es Pläne gibt, das zu verbessern, oder ob das strukturelle Einschränkungen sind, die man hinnehmen muss. Eine Entsprechung zu eat-eshell-mode wäre großartig.
Im Titel sollte Emacs stehen. Ein allgemeiner Terminalemulator und ein Terminalemulator für Emacs sind nicht dasselbe.
.elist die Dateiendung für Emacs-Lisp-Dateien.Ich bin kürzlich von vterm zu Ghostel gewechselt, und insgesamt ist es deutlich besser. Es ist spürbar schneller, schnell genug, dass auch aufwendige TUI-Apps, die in jedem Frame das ganze Terminal aktualisieren, sauber laufen; die Eingabeverarbeitung ist stabiler und die ELisp-API ist ebenfalls gut.
Allerdings kam es vor, dass das Terminal nicht richtig gelöscht wurde und oberhalb des aktuellen Prompts Reste zurückblieben, oder dass es komplett hängen blieb und ich den Buffer schließen und neu starten musste. Für die tägliche Nutzung ist es ausreichend und die Aussichten sind gut, aber bis zu einem ausgereiften Produkt braucht es noch mehr Bugfixes und Feinschliff.
Das Phänomen mit Resten im oberen Bildschirmbereich könnte https://github.com/dakra/ghostel/issues/495 sein; das ist in der aktuellen Version behoben, es könnte aber auch ein anderer Bug sein. Der schwierige Teil besteht darin, die internen Daten von libghostty-vt in einen Emacs-Buffer zu spiegeln und dabei nur die nötigen Teile zu ersetzen. Dafür gibt es breit angelegte property-based Tests, aber gelegentlich rutscht dennoch etwas durch.
In der aktuellen neuesten Version wurde das Lifecycle-Handling verbessert, wodurch einige Probleme mitbehoben worden sein könnten. Da das Projekt noch in einer frühen Phase ist, wollen wir es nach und nach verfeinern.
Es wäre gut, praktische Beispiele für den effizienten Einsatz der verschiedenen Eingabemodi zu haben. Ein Terminal will alle Tastatureingaben haben, während auch der Editor seine eigenen Befehle über Tasten auslösen möchte; ein im Editor eingebettetes Terminal braucht daher zwingend Modi, die den Besitz der Tastatur umschalten.
Neovims
:termhat nur zwei Modi; wenn man nicht versteht, warum Ghostel gleich fünf hat, hält man es leicht für überdesignt. Tatsächlich ist es komplexer, weil es mehr Probleme löst, und die zusätzlichen Modi sind optionale Werkzeuge für Aufgaben, die nvim nicht abdeckt. Allerdings ist noch nicht ausreichend klar, wie man diesen Vorteil in der Praxis effizient nutzt.Nachdem ich mit vterm Schwierigkeiten hatte, habe ich Ghostel ausprobiert; es ist großartig und könnte mein Hauptterminal werden.
Ich nutze es seit über einem Monat, und besonders gut gefällt mir die in der Codex-Zusammenfassung erwähnte Funktion, Code-Referenzen anzuklicken und direkt in einem Emacs-Buffer zu öffnen.
ghostel-previous-hyperlinkoderghostel-next-hyperlinkauch schnell zwischen kürzlich angezeigten Hyperlinks springen.Da auch eine repeat-mode-Map installiert wird, kann man, wenn in der Ausgabe drei URLs oder Dateilinks stehen, mit
C-c C-p p p RETden ersten Link öffnen; das nutze ich häufig.Durch die Integration von Ghostel und Claude Code nutze ich Emacs deutlich mehr; Emacs ist nun der zentrale Hub meiner Arbeit.
Wenn ich in ein paar Fenstern rund 10 Terminals offen hatte, stürzte Ghostty fast jede Nacht ab. Deshalb konnte ich Ghostty nicht wirklich nutzen und möchte es auch nicht in ein Tool einbetten, das ich täglich verwende.
Ich habe auf Dateisystemen mit Millionen Dateien in so vielen Shells wie möglich auch
ls -lRausgeführt, aber es gab keine Probleme oder Abstürze. Über Monate hinweg habe ich es täglich den ganzen Tag intensiv genutzt und weder Abstürze noch verdächtiges Verhalten gesehen.Es wirkt eher nach einem Bug in einer bestimmten Ghostty-Version oder nach einer ungewöhnlichen Wechselwirkung mit anderer Software, etwa dem GPU-Treiber. Hier verwende ich eine NVIDIA-GPU.
Es heißt: „Die nativen Module sind vorgefertigte Binärdateien und werden bei der ersten Verwendung automatisch heruntergeladen“; mich würde interessieren, warum man sie nicht ins Distributionspaket aufnimmt.
Das beliebte Emacs-Paket jinx, das ebenfalls native Emacs-Module nutzt, bietet wie vterm eine Variante, bei der beim ersten Einsatz kompiliert wird. Um in Emacs-Paketen eine nutzerfreundliche Installation zu unterstützen, bleibt daher realistisch nur, beim ersten Start herunterzuladen oder zu kompilieren.