Ghostel.el: терминал для Emacs на движке Ghostty

Разработчик под ником dakra выпустил Ghostel.el, терминальный эмулятор для редактора Emacs, построенный на libghostty-vt, движке терминала Ghostty. Проект вдохновлён пакетом emacs-libvterm и повторяет его двухслойную архитектуру: нативный модуль, написанный на языке Zig, отвечает за состояние терминала, рендеринг и работу с локальным псевдотерминалом (PTY), а код на Elisp управляет клавишами, буферами, командами и интеграцией с удалёнными процессами.

Главное отличие от libvterm, современный движок Ghostty, который поддерживает то, чего libvterm не умеет: протоколы клавиатуры и графики Kitty (в том числе показ картинок прямо в терминале), расширенные стили подчёркивания, гиперссылки по стандарту OSC 8, запросы цвета через OSC 4/10/11 и синхронизированный вывод (спецификация DEC 2026).

Нативный модуль автоматически скачивается при первом запуске пакета, поэтому в типовом случае не нужен ни компилятор, ни toolchain, открыть терминал можно сразу командой M-x ghostel. Готовые бинарники доступны для Apple Silicon и Intel Mac, Linux (x86_64 и aarch64), FreeBSD и Windows (x86_64 и aarch64, включая нативные ConPTY-терминалы). Сборка из исходников требует Zig версии 0.15.2 и автоматически подтягивает зависимость Ghostty через пакетный менеджер Zig.

Пакет предлагает пять режимов ввода в духе пакета eat.el: полусимвольный режим по умолчанию (почти все клавиши уходят в терминал, кроме служебных вроде M-x), символьный режим (буквально все клавиши идут в терминал), построчный режим (поведение как у M-x shell, строка отправляется целиком по Enter), а также режим Emacs и режим копирования для навигации и выделения текста без разрыва вывода команд.

Автоматически, без правки конфигурационных файлов, работает интеграция с shell (bash, zsh, fish, nushell): отслеживание текущей директории через OSC 7, навигация по приглашениям через OSC 133, отслеживание заголовка через OSC 2 и возможность вызывать функции Elisp прямо из shell-скриптов через ghostel_cmd. Поддерживаются и удалённые терминалы через TRAMP.

Ключевые факты

  • Ghostel.el, новый терминальный эмулятор для Emacs на движке libghostty-vt, том же, что используется в самом терминале Ghostty
  • Архитектура двухслойная: нативный модуль на Zig отвечает за состояние терминала, рендеринг и PTY, а Elisp, за клавиши, буферы и команды
  • В отличие от libvterm поддерживает протоколы Kitty (клавиатура и графика, включая инлайн-картинки), гиперссылки OSC 8, цветовые запросы OSC 4/10/11 и синхронизированный вывод
  • Пять режимов ввода в стиле eat.el: полусимвольный (по умолчанию), символьный, построчный, emacs-режим и режим копирования
  • Нативный модуль скачивается автоматически при первом запуске, готовые бинарники есть под macOS, Linux, FreeBSD и Windows; сборка из исходников требует Zig 0.15.2

Почему это важно

Терминал внутри Emacs долго держался на двух вариантах: старом emacs-libvterm с движком libvterm, который развивается медленно, и чистом на Elisp eat.el, который проще ставится, но менее производителен. Ghostel приносит в Emacs современный, активно развиваемый VT-движок из терминала Ghostty, с поддержкой протоколов и возможностей, которых раньше в Emacs просто не было.

Кому это важно

В первую очередь, пользователям Emacs, которые держат терминал прямо внутри редактора вместо отдельного окна, особенно те, кто уже сидит на vterm или eat.el. Также это интересно разработчикам, которым нужен протокол графики Kitty для показа картинок в терминале, и тем, кто работает с удалёнными машинами через TRAMP.

Как это применить

Пакет ставится как обычный Emacs-пакет, через MELPA (use-package ghostel :ensure t) или через :vc в Emacs 30+ прямо из репозитория на GitHub. Нужен Emacs 28.1+ с поддержкой динамических модулей. После установки терминал открывается командой M-x ghostel, а нативный модуль для конкретной платформы скачивается автоматически без ручной сборки.

Можно ли доверять

Это официальная документация проекта на GitHub Pages автора dakra, обсуждение набрало 268 баллов и 52 комментария на Hacker News. Проект доступен через MELPA, использует стандартный для Zig-экосистемы пакетный менеджер для подтягивания зависимости Ghostty и публикует готовые бинарники под все основные платформы, признаки реального, поддерживаемого пакета, а не однодневного эксперимента.

Риски и подводные камни

Автоматическая загрузка нативного бинарного модуля при первом запуске, это точка доверия к сборкам с GitHub Releases, которую стоит иметь в виду. Сборка из исходников привязана к конкретной версии Zig (0.15.2), а на Windows нестандартные сборки Emacs (например, со статическим CRT) поддерживаются только «по возможности», без гарантий. Плюс это ещё молодой проект, конкурирующий с давно обкатанными vterm и eat.el, зрелость экосистемы и стабильность API пока не проверены временем.