Ghostel.el - émulateur de terminal Emacs basé sur libghostty
(dakra.github.io)- Ghostel est un émulateur de terminal pour Emacs qui utilise le même moteur
libghostty-vtque Ghostty ; un module natif Zig gère l’état du terminal, le rendu et les entrées/sorties PTY locales, tandis qu’Elisp s’occupe des raccourcis clavier, des buffers, des commandes et des processus distants - Il prend en charge les protocoles clavier et graphique de Kitty, les hyperliens OSC 8, les requêtes de couleur OSC 4/10/11, la sortie synchronisée DEC 2026 et cinq modes de saisie, et applique automatiquement l’intégration shell à bash, zsh, fish et nushell en local
- Il prend en charge Emacs 28.1 ou version ultérieure ainsi que macOS, Linux, FreeBSD et Windows natif, et peut télécharger automatiquement des modules précompilés selon la plateforme lors de la première utilisation ; une toolchain Zig n’est donc pas nécessaire pour une installation classique
- Dans un benchmark sur Apple M4 Max et Emacs 32.0.50 traitant une sortie de 1 Mo, Ghostel atteint 75 Mo/s en ASCII standard, contre 18 Mo/s pour vterm et 6,2 Mo/s pour eat ; le PTY natif absorbe une tâche
catde 10 Mo en environ 110 ms - Il propose aussi un terminal distant via TRAMP, la protection de la saisie des mots de passe, les images inline Kitty, ainsi que l’intégration avec compilation, Eshell, Comint, Evil et les méthodes de saisie, mais les cibles distantes et le traitement des images restent soumis à des contraintes de plateforme et de protocole
Architecture et installation
- Ghostel s’inspire de l’architecture en deux couches de emacs-libvterm, mais utilise le moteur VT moderne de Ghostty à la place de libvterm
- Le module Zig gère l’état du terminal, le rendu, l’encodage des touches, le PTY local et la lecture en arrière-plan
- Elisp prend en charge les raccourcis clavier, les buffers, les commandes, l’intégration aux projets et les processus distants TRAMP
- Les prérequis sont Emacs 28.1 ou supérieur avec prise en charge des modules dynamiques, ainsi que macOS, Linux, FreeBSD ou Windows natif
- Des binaires précompilés sont fournis pour
aarch64-macos,x86_64-macos,x86_64-linux,aarch64-linux,x86_64-freebsd,x86_64-windowsetaarch64-windows - Pour les autres plateformes ou une compilation depuis les sources, Zig 0.15.2 est requis
- Des binaires précompilés sont fournis pour
- L’installation peut se faire via MELPA,
use-package :vcd’Emacs 30 ou version ultérieure,:load-path, ou unrequiremanuel, puis le terminal s’ouvre avecM-x ghostel - Si le module natif est absent, Ghostel propose soit un téléchargement soit une compilation depuis les sources selon le réglage
ghostel-module-auto-installM-x ghostel-download-modulerécupère le binaire minimal pris en charge, et avec un argument préfixe permet de choisir un tag de releaseM-x ghostel-module-compilecompile le module aveczig build- Si le répertoire du package risque d’être réinstallé,
ghostel-module-directorypeut pointer vers un emplacement séparé
- La compilation depuis les sources inclut le fichier généré
vendor/emacs-module.h, ce qui évite en général d’avoir besoin des en-têtes Emacs locaux, etEMACS_INCLUDE_DIRouEMACS_BIN_DIRpermettent de changer l’emplacement des en-têtes- Le terminfo compilé
xterm-ghosttyest inclus dansetc/terminfo/dans un format portable entre BSD et ncurses
- Le terminfo compilé
Prise en charge de Windows
- Sous Emacs natif pour Windows, les terminaux locaux s’exécutent via ConPTY, et l’architecture de la DLL du module doit correspondre à celle d’Emacs, pas à celle de Windows
- Avec les modules précompilés, les fichiers de support
conpty.dlletOpenConsole.exesont également téléchargés ; s’ils sont absents, l’API ConPTY intégrée à Windows est utilisée à la place - Les builds Emacs personnalisés particuliers, comme ceux avec CRT statique, ne sont pris en charge qu’au mieux
- Le terminal TRAMP sous Windows ne prend en charge que des cibles distantes POSIX, le PTY se trouvant sur l’hôte distant, et le redimensionnement dynamique de la fenêtre n’est pas encore pris en charge
Cinq modes de saisie
- Le mode semi-char par défaut envoie la plupart des touches au terminal, mais laisse à Emacs certaines exceptions comme
C-c,C-x,C-u,C-h,M-x,M-:etC-\- Il fournit des touches pour envoyer interruption, suspension et EOF, pour le bracketed paste, l’effacement du scrollback, ainsi que le déplacement entre invites et hyperliens
- Le mode char envoie toutes les touches au terminal ; il convient donc aux TUI qui utilisent elles-mêmes
C-x,M-xetC-h, avec seulementM-RETconservé comme touche d’échappement - Le mode Emacs continue de recevoir la sortie du terminal tout en passant le buffer en lecture seule, afin de permettre la navigation standard d’Emacs comme
isearch,occur, les marques et la copie- La saisie normale n’est pas transmise au shell, et seul un collage volontaire via
C-yest envoyé sous forme de bracketed paste
- La saisie normale n’est pas transmise au shell, et seul un collage volontaire via
- Le mode copy suspend l’actualisation du terminal pour permettre une sélection, une navigation et une copie stables
- Dans le texte copié, les retours à la ligne dus au soft wrap sont supprimés
- Avec le réglage par défaut
ghostel-readonly-fast-exit=t, une saisie de caractère ou une copie ramène automatiquement à la session de terminal normale
- Le mode line n’envoie pas immédiatement les touches au shell : on édite une ligne dans un buffer Emacs, puis elle est transmise d’un bloc à
RET- Même si une sortie asynchrone ou une nouvelle invite arrive, la saisie en cours est conservée sous forme d’instantané puis réinsérée
- Si OSC 133 est disponible, les limites d’invite sont utilisées ; sinon, elles sont repérées avec
ghostel-prompt-regexp - Lorsqu’un TUI plein écran démarre, Ghostel bascule en mode semi-char puis revient en mode line à la fermeture du TUI
TAButilise la complétion comint et, en option, la programmable completion de bash
- Par défaut, un glisser de souris, plusieurs clics, l’activation de la marque, ou le fait que
isearchouconsult-linefasse sortir de la position de saisie active déclenche le passage en mode copy afin de préserver la sélection et la position- Si un TUI a activé le suivi de souris DEC, les événements souris sont transmis au programme concerné en mode saisie
ghostel-mouse-drag-input-mode,ghostel-mark-activation-input-modeetghostel-point-leave-input-modepermettent de modifier ce comportement
Fonctions du terminal et rendu
- Via libghostty-vt, Ghostel prend en charge une émulation VT complète, les couleurs 256 et 24 bits, l’alternate screen, plusieurs styles et couleurs de soulignement, le gras, l’italique, le faible contraste, le barré et l’inversion, ainsi que quatre formes de curseur et leur clignotement
- Le
TERM=xterm-ghosttypar défaut et le terminfo fourni annoncent aux applications des fonctions comme la sortie synchronisée DEC 2026, le clavier Kitty, les true colors, le soulignement coloré et le signalement du focus- Grâce aux requêtes OSC 4/10/11, les TUI peuvent obtenir la palette ainsi que les couleurs de premier plan et d’arrière-plan à partir des faces Emacs
- Le presse-papiers OSC 52 est pris en charge, mais désactivé par défaut ; le terminfo fourni n’annonce donc pas la capacité
Ms
- Le scrollback par défaut est de 5 Mo, soit environ 5 000 lignes, et comme il est matérialisé dans un buffer Emacs, il peut être recherché avec
isearchetconsult-line - En plus des hyperliens OSC 8, Ghostel détecte les URL HTTP et HTTPS ordinaires ainsi que les chemins de fichier au format
/path/file.el:42pour en faire des liens cliquables - Il prend en charge l’encodeur de touches Ghostty, le protocole clavier de Kitty, les événements souris SGR, les événements de focus DEC 1004, ainsi que le glisser-déposer de chemins de fichiers et de texte
- Le moteur de rendu ignore les lignes inchangées, regroupe les mises à jour via un timer et ajuste le framerate de manière adaptative
- Les échos PTY arrivant juste après une frappe contournent le timer par défaut de 33 ms pour être rendus immédiatement
ghostel-sync-themeresynchronise la palette avec le thème Emacs
- Les 16 couleurs ANSI sont des faces Emacs héritant de
term-color-*, etghostel-defaultpermet de définir une police, une taille, une couleur de premier plan et une couleur d’arrière-plan propres au terminal
Intégration shell et appel d’Emacs
- Pour bash, zsh, fish et nushell, le suivi de répertoire OSC 7, le déplacement d’invite OSC 133, le suivi du titre OSC 2 et
ghostel_cmdsont configurés automatiquement- L’intégration shell propre à nushell fournit OSC 7, 133 et 2, et
ghostel.nuajouteghostel_cmdainsi qu’un wrapper terminfo SSH sortant - Le bash 3.2 intégré à macOS ignore
ENV, utilisé pour l’injection automatique ; il faut donc utiliser un bash récent ou chargerghostel.bashmanuellement
- L’intégration shell propre à nushell fournit OSC 7, 133 et 2, et
ghostel_cmd, qui appelle Elisp depuis le shell, utilise une extension OSC 52;e dédiée et n’exécute que les fonctions présentes dans la liste d’autorisationghostel-eval-cmds- Les fonctions autorisées par défaut sont
find-file,find-file-other-window,dired,dired-other-windowetmessage
- Les fonctions autorisées par défaut sont
- Les signets Emacs enregistrent le répertoire de travail du terminal et le nom du buffer
- Si un buffer existant est présent, il est réutilisé ; sinon, un nouveau shell est lancé dans le répertoire enregistré
- Le scrollback et le contenu de la session ne sont pas enregistrés
Mot de passe, presse-papiers et notifications
- Lorsqu’une invite de mot de passe comme
sudo,ssh,gpgoupasswdest détectée,read-passwds’ouvre et la réponse est envoyée directement au PTY, de sorte que la saisie ne reste ni dansview-lossage, ni dans l’anneau des touches récentes, ni dans une macro clavier- En local, la désactivation du mode canonique et de l’écho est vérifiée via
tcgetattr - Sur shell distant uniquement, une détection de remplacement par expression régulière est utilisée afin de réduire les faux positifs dans les TUI locales en raw mode
- Après l’envoi, la chaîne du mot de passe est immédiatement traitée par
clear-string - Des sources comme auth-source, KeePass ou pass peuvent être ajoutées à
ghostel-password-prompt-functions
- En local, la désactivation du mode canonique et de l’écho est vérifiée via
- Si OSC 52 est activé explicitement, un programme distant peut définir l’anneau de suppression d’Emacs et le presse-papiers système, et le collage est transmis via bracketed paste
- Les notifications OSC 9 et OSC 777 sont transmises à
ghostel-notification-function- Le gestionnaire par défaut utilise alert s’il est installé, sinon il se rabat sur
messagedans la zone d’écho
- Le gestionnaire par défaut utilise alert s’il est installé, sinon il se rabat sur
- La progression OSC 9;4 transmet les états
remove,set,error,indeterminate,pauseainsi qu’une valeur de 0 à 100- Un indicateur textuel par défaut et un indicateur animé basé sur spinner.el sont fournis
Images inline Kitty
- Le placement direct et le placement par placeholder Unicode U+10EEEE du protocole graphique Kitty sont pris en charge, ce qui permet de rendre les images de
timg,kitty +kitten icat,yaziet autres - Les PNG sont traités par le décodeur stb intégré, et les données RGB, RGBA, Gray et GrayAlpha sont converties en PPM par le module natif, donc ImageMagick n’est pas nécessaire
- Les requêtes de taille CSI 14, 16 et 18
treçoivent une réponse, et le ratio de pixels physiques peut être défini avecghostel-cell-pixel-scale - Le traitement des images comporte les limitations suivantes
- Le canal alpha n’est pas composé mais supprimé, ce qui n’est pas adapté aux bords semi-transparents
- Le recadrage partiel source-rect de Kitty n’est pas pris en charge et renvoie une erreur explicite
- Plusieurs placements virtuels dans un même buffer partagent un seul rendu, et la transmission la plus récente est prioritaire
- Par défaut, seul le base64 inline est autorisé ; les médias via fichier, fichier temporaire ou mémoire partagée doivent être activés explicitement pour des raisons de sécurité
- La limite de stockage graphique par défaut est de 320 MiB par terminal
TRAMP et terminfo distant
- Si
default-directoryest un chemin TRAMP, le shell est exécuté sur l’hôte POSIX correspondant, et les méthodes TRAMP de type SSH ainsi que les shells commedockerpeuvent être définis viaghostel-tramp-shellslogin-shelldétecte le shell de connexion de l’utilisateur distant avecgetent passwd- Le suivi de répertoire OSC 7 conserve la méthode, l’utilisateur et le préfixe multi-saut existants de TRAMP
- Les cibles distantes Windows ne sont pas prises en charge dans ce chemin shell/tty POSIX
- L’intégration shell distante n’est pas injectée par défaut, et deux méthodes sont proposées
- Avec
ghostel-tramp-shell-integration=t, un script temporaire est transféré puis nettoyé à la fermeture - Pour des hôtes permanents, les scripts de
etc/shell/et éventuellement terminfo peuvent être installés directement
- Avec
- Si
xterm-ghosttyterminfo n’est pas présent à distance, l’ouverture du terminal peut échouer ;ghostel-ssh-install-terminfogère alors l’installation- L’exécution via TRAMP transfère terminfo dans un répertoire temporaire via la connexion existante, puis le supprime à la fermeture
- Un
sshlancé depuis Ghostel en local normalise la cible avecssh -G, consulte le cache, puis exécute si nécessairetic -x -via une connexion supplémentaire unique - Le hash du terminfo local est inclus dans la clé de cache, ce qui l’invalide automatiquement lors des mises à jour de libghostty, mais les modifications séparées du terminfo à distance ne sont pas détectées
- L’installation est ignorée pour
ssh HOST cmd, les appels d’option sans hôte, ou siinfocmpn’est pas disponible en local
- Si vous ne souhaitez pas modifier l’hôte distant, vous pouvez désactiver l’installation automatique et installer terminfo manuellement ; en remplaçant
ghostel-termparxterm-256color, cette configuration devient inutile, mais le chemin rapide de sortie synchronisée propre à Ghostty disparaît aussi
Fonctions d’extension Emacs
- evil-ghostel synchronise les états insertion et normal d’Evil avec le curseur du terminal
- Sont pris en charge : déplacement, insertion, suppression, modification, remplacement, bracketed paste, annulation readline et forme du curseur selon l’état
- Cela n’affecte pas vim, less ou htop sur écran alternatif
ghostel-compileexécute les commandes sur un vrai PTY tout en fournissant des en-têtes, pieds de page, surlignage des erreurs et navigationnext-errorau formatcompilation-mode- Par défaut, il s’agit d’une navigation en lecture seule, mais un argument préfixe permet de transmettre une saisie interactive
- Même pendant l’exécution, il est possible de basculer entre saisie interactive et navigation de compilation avec
C-c C-jetC-c C-eouC-c C-t ghostel-compile-global-modeenvoie vers Ghostel les appels àcompile,recompile,project-compileetcompilation-startgrep-modeconserve par défaut l’implémentation existante
ghostel-eshell-visual-command-modeexécute les commandes visuelles d’Eshell comme vim, htop ou less dans un buffer Ghostel dédié au lieu determ-modeghostel-comint-modetraite le flux de sortie comint aveclibghostty-vtafin de fournir true color, plusieurs styles de soulignement, les liens OSC 8 et les mises à jour de répertoire OSC 7- Comme ce n’est pas un terminal complet, le positionnement du curseur, l’écran alternatif et le redessin plein écran sont ignorés, ce qui ne convient pas à
htopouless
- Comme ce n’est pas un terminal complet, le positionnement du curseur, l’écran alternatif et le redessin plein écran sont ignorés, ce qui ne convient pas à
ghostel-ime-modeefface puis transmet en UTF-8 au PTY le résultat des méthodes de saisie Elisp qui insèrent directement des caractères dans le buffer, comme pour le hangul- Pendant une composition Quail, le rendu est différé afin d’éviter que le buffer n’écrase la chaîne en cours de composition
Performances
- Sur un Apple M4 Max avec Emacs 32.0.50, en envoyant 1 Mo via un vrai pipe de processus et en conservant environ 1 000 lignes de scrollback, on obtient les résultats suivants
- ASCII standard : Ghostel 75MB/s, Ghostel avec détection de liens désactivée 76MB/s, vterm 18MB/s, eat 6.2MB/s, term intégré 7.2MB/s
- Sortie riche en URL : Ghostel 36MB/s, Ghostel avec détection de liens désactivée 78MB/s, vterm 15MB/s, eat 4.5MB/s, term 5.9MB/s
- La détection des URL et chemins de fichiers s’exécute dans un timer unifié hors du chemin de redessin, ce qui n’a presque aucun coût sur une sortie normale, mais réduit le débit d’environ moitié sur une sortie dense en liens
- Pour une comparaison équitable, les chiffres ci-dessus utilisent le chemin de processus Emacs ; le PTY natif local par défaut est environ 2 fois plus rapide sur des dumps volumineux continus, car le thread de fond Zig lit la sortie
- La médiane sur 5 exécutions d’un
catsur un fichier de 10 Mo est d’environ 110 ms pour Ghostel natif, environ 220 ms pour Ghostel via PTY Emacs, environ 550 ms pour vterm et environ 1,8 seconde pour eat- vterm et eat monopolisent de façon synchrone le thread principal d’Emacs pendant le transfert, tandis que le PTY natif de Ghostel analyse en arrière-plan, ce qui permet à l’UI de rester réactive
M-x ghostel-debug-typing-latencymesure le minimum, la médiane, le p99 et le maximum de la latence PTY, du rendu et de la latence totale, touche par touche
Différences avec vterm et eat
- vterm utilise un module natif C basé sur libvterm, tandis que eat est écrit entièrement en Elisp, donc portable sans compilation, au prix d’un débit plus faible
- Seul Ghostel prend en charge à la fois le clavier et les graphismes Kitty, cinq types de soulignement, OSC 8, OSC 4/10/11, les notifications OSC 9·777, ainsi que la progression OSC 9;4 et DEC 2026
- eat prend en charge les images Sixel mais pas les images Kitty, et vterm ne prend en charge aucun des deux protocoles d’image
- Ghostel et eat transmettent les événements de souris SGR aux TUI, tandis que vterm utilise les clics pour déplacer le point Emacs
- Ghostel et eat proposent un mode line, contrairement à vterm
- Ghostel fournit à la fois un mode copy où la sortie s’arrête et un mode Emacs où la sortie continue
- vterm propose un mode copy figé, tandis que le mode Emacs en lecture seule d’eat continue à se mettre à jour
- Ghostel injecte automatiquement l’intégration shell, alors que vterm et eat nécessitent de charger manuellement un script
- Les invites de mot de passe sont détectées automatiquement par Ghostel ; eat ne fournit qu’une commande d’envoi manuel, et vterm n’intercepte pas l’entrée séparément
Architecture interne
- Pour les buffers locaux, Zig ouvre par défaut le PTY, crée le processus fils, puis transmet la sortie à
libghostty-vtdepuis un thread de fond- Lorsqu’un callback OSC ou un redessin est nécessaire, un événement Lisp est envoyé au pipe Emacs et traité par
ghostel--events-filter - Les sorties volumineuses ne transitent pas octet par octet par le filtre de processus Emacs
- Lorsqu’un callback OSC ou un redessin est nécessaire, un événement Lisp est envoyé au pipe Emacs et traité par
- Les buffers TRAMP reçoivent la sortie via le processus Emacs et la transmettent de façon synchrone au même modèle de terminal, afin de conserver la création distante et les file handlers
- Les frappes passent par l’encodeur libghostty avant d’être écrites immédiatement dans le PTY, et la sortie passe par l’analyseur VT puis l’étape d’invalidation ; en cas d’écho interactif, le rendu est immédiat, sinon
Renderer.zigmet à jour les lignes modifiées via le timer unifié - Le rendu du terminal modifie le buffer Emacs via remplacement de lignes, redessin complet, redimensionnement et reflow, ainsi que l’ajout et la suppression de scrollback ; le renderer est donc responsable de la préservation du point, de la marque et de la position de la fenêtre
- Elisp décide des politiques et de l’intention utilisateur, par exemple faut-il revenir au viewport actif après une saisie, ou préserver l’état de navigation selon le mode
- Il faut éviter de corriger les changements du renderer avec des heuristiques Elisp avant/après redraw, car cela rend difficile la distinction entre défilement utilisateur, correction de redisplay, redimensionnement et réécriture du contenu
Tests et licence
- Les tests sont basés sur ERT ; les tests Elisp peuvent s’exécuter sans le module Zig, et les tests tagués
nativenécessitent le module compilé- Des cibles Makefile sont fournies pour les tests unitaires Zig, la suite complète, les tests de l’extension Evil et les benchmarks rapides
- Les bugs, demandes de fonctionnalités et pull requests sont acceptés sur le dépôt GitHub ; pour les problèmes de rendu, il faut fournir une commande de reproduction, la séquence d’échappement, la version d’Emacs et les informations de plateforme
M-x ghostel-debug-infopermet de collecter les événements de diagnostic- Ghostel est un logiciel libre distribué sous GNU GPL v3 ou ultérieure
3 commentaires
On dirait que la saisie en coréen ne fonctionne pas.
Même avec
Ctrl-\, il semble que la méthode de saisie bascule bien en coréen, mais en pratique seule la saisie en anglais fonctionne.C’est un peu dommage.
Avis sur Lobste.rs
ghostel-projectS’il existe déjà une instance pour le projet, on bascule directement dessus, donc il est très rapide de passer d’un terminal à l’autre
vterma quelques limites, mais le fait de pouvoir utiliser les commandes de l’éditeur telles quelles même dans le terminal est vraiment appréciableQuand on parle d’émulation de terminal dans Emacs, on reçoit souvent comme réponse qu’il suffit d’utiliser
diredau lieu decd/mv/ls/cp/rm/mkdr/..., oucompileau lieu des commandes de build, alors pourquoi en avoir besoin. Mais même sans faire de tâches complexes, le terminal paraît plus familier et plus flexibleS’il existe un guide expliquant comment réduire sa dépendance au terminal dans Doom Emacs, j’aimerais bien l’essayer. Voir des gens naviguer rapidement dans leurs projets avec des réglages avancés est toujours impressionnant
vterm, et des problèmes de calcul de taille de ligne font que l’écran dejjse retrouve parfois complètement déréglé, ce qui est frustrantAu final, je garde quand même Ghostty ouvert à côté, mais j’espère qu’un jour tous les outils fonctionneront correctement dans Emacs
eshellAvec
eat-eshell, des programmes qui nécessitent une émulation de terminal comme les outils de build, le CLI de Podman ou les applications TUI fonctionnent directement dans un buffereshell, donc pour les personnes qui utilisent souventeshell, c’est une fonctionnalité qui change complètement la donneeshell. Comme je n’utilise pas beaucoupeshell, j’ai souvent l’impression de passer à côté de son intérêtCommentaires sur Hacker News
Je suis le mainteneur principal de Ghostel. Avec baokaola, nous comptions publier un Show HN la semaine prochaine, mais quelqu’un a soumis le lien avant nous
Pour un aperçu rapide, le dépôt GitHub est plus pratique : https://github.com/dakra/ghostel
Ghostel est un émulateur de terminal Emacs basé sur libghostty-vt, et une comparaison de fonctionnalités avec vterm et eat est disponible sur https://dakra.github.io/ghostel/#ghostel-vs-vterm. Il y a aussi un comparatif en images des performances et de la précision : https://gist.github.com/dakra/4a0b76ebcf5d52338e134864378465...
Personnellement, il a remplacé non seulement vterm/eat, mais aussi des terminaux externes comme kitty et Ghostty. Le fait de pouvoir traiter le texte du terminal comme un buffer Emacs ordinaire ouvre énormément de possibilités d’extension absentes des autres terminaux. Même une tâche simple comme rechercher dans le scrollback, puis se déplacer et sélectionner un paragraphe à copier uniquement au clavier, est bien plus naturelle et rapide pour un utilisateur d’Emacs
Si vous essayez Ghostel et gardez quand même un terminal externe, je serais curieux de savoir si c’est à cause de fonctionnalités manquantes ou parce que vous voulez exécuter certains processus hors d’Emacs. Nous sommes aussi très réactifs sur GitHub, donc n’hésitez pas à ouvrir une issue en cas de problème
f1au basculement entre le mode semi-char et le mode copie, et avant d’exécuter une commande, je me demande : « est-ce grave si Emacs plante ou est forcé de quitter ? » Si oui, je la lance dans un terminal classiqueGhostel n’est pas intégré au même niveau, et des extensions comme evil-ghostel-mode ont aussi leurs limites. Je me demande s’il est prévu d’améliorer cela, ou si c’est une contrainte structurelle à accepter, et une fonctionnalité équivalente à eat-eshell-mode serait excellente
Le titre doit contenir Emacs. Un émulateur de terminal généraliste et un émulateur de terminal pour Emacs, ce n’est pas la même chose
.elest l’extension de fichier d’Emacs LispJe suis passé récemment de vterm à Ghostel, et globalement c’est bien meilleur. C’est visiblement rapide, au point que même les applis TUI sophistiquées qui rafraîchissent tout le terminal à chaque frame tournent correctement, la gestion des entrées est plus stable et l’API ELisp est bonne
En revanche, il m’est arrivé qu’il n’efface pas correctement le terminal, laissant des déchets au-dessus du prompt actuel, ou qu’il se fige complètement, m’obligeant à fermer le buffer et redémarrer. Pour un usage quotidien, c’est déjà largement utilisable et prometteur, mais pour devenir un produit mature, il faut encore corriger des bugs et peaufiner l’ensemble
Le problème des déchets en haut de l’écran peut correspondre à https://github.com/dakra/ghostel/issues/495, corrigé dans la dernière version, mais il peut aussi s’agir d’un autre bug. La partie difficile consiste à répliquer les données internes de libghostty-vt dans un buffer Emacs en ne remplaçant que les sections nécessaires. Il existe des tests basés sur les propriétés pour valider cela largement, mais certains problèmes passent parfois à travers
Dans la release la plus récente, la gestion du cycle de vie a aussi été améliorée, ce qui a pu résoudre certains problèmes en même temps. Le projet est encore jeune, donc nous comptons le polir progressivement
J’aimerais voir de vrais exemples pratiques d’utilisation efficace des différents modes d’entrée. Le terminal veut toutes les frappes, tandis que l’éditeur veut aussi utiliser les touches pour ses propres commandes, donc un terminal intégré à l’éditeur a forcément besoin de modes qui basculent la propriété du clavier
:termde Neovim n’a que deux modes, et si on ne comprend pas pourquoi Ghostel en a cinq, on peut facilement croire à une surconception. En réalité, cette complexité résout davantage de problèmes, et les modes supplémentaires sont des outils optionnels pour des tâches que nvim ne couvre pas. Mais la manière de tirer efficacement parti de cet avantage en pratique n’est pas encore suffisamment claireJ’avais du mal avec vterm, puis j’ai testé Ghostel et c’est excellent, au point qu’il pourrait devenir mon terminal principal
Je l’utilise depuis plus d’un mois, et j’aime particulièrement la fonction qui permet de cliquer sur les références de code dans les résumés Codex pour les ouvrir directement dans un buffer Emacs
ghostel-previous-hyperlinkoughostel-next-hyperlinkUne map repeat-mode est aussi installée, donc s’il y a trois URL ou liens de fichiers dans la sortie, j’utilise souvent
C-c C-p p p RETpour ouvrir le premier lienGrâce à l’intégration entre Ghostel et Claude Code, j’utilise beaucoup plus Emacs, qui est désormais le hub central de mon travail
Avec une dizaine de terminaux répartis dans quelques fenêtres, Ghostty plantait presque toutes les nuits. Du coup, je n’ai jamais pu vraiment l’utiliser, et je n’ai pas envie de l’intégrer à un outil dont je me sers tous les jours
J’ai même lancé
ls -lRdans autant de shells que possible sur un système de fichiers contenant plusieurs millions de fichiers, sans rencontrer de problème ni de plantage. Je l’utilise intensivement tous les jours depuis des mois et je n’ai jamais vu de crash ni de comportement suspectCela ressemble davantage à un bug d’une version précise de Ghostty, ou à une interaction particulière avec un autre logiciel, comme le pilote GPU. Ici, j’utilise un GPU NVIDIA
Il est écrit que « les modules natifs sont des binaires précompilés téléchargés automatiquement lors de la première utilisation », mais je me demande pourquoi ils ne sont pas inclus dans le paquet distribué
Jinx, un paquet populaire qui utilise aussi des modules natifs Emacs, propose comme vterm une compilation au premier usage. Donc, pour offrir une installation conviviale dans un paquet Emacs, il n’y a en pratique que deux possibilités : télécharger ou compiler au premier lancement