Три терминальных движка для Emacs — ghostel (libghostty-vt), vterm (libvterm) и eat — серьёзно различаются по возможностям и производительности. Ghostel использует начинку от Ghostty — современного GPU-ускоренного терминала. Он единственный поддерживает протоколы клавиатуры и графики от Kitty, пять стилей подчёркивания, гиперссылки OSC 8, цветовые запросы OSC 4/10/11 и синхронизированный вывод DEC 2026. Vterm завязан на эмуляцию VT220/xterm и самый консервативный — без тусклого текста, с одним типом подчёркивания и без изображений. Eat посередине: true color, тусклый текст, цветные подчёркивания и Sixel, но никаких протоколов Kitty, OSC 8 или уведомлений рабочего стола.
Главное преимущество eat — это чистый Emacs Lisp. Ничего не нужно компилировать или скачивать: оно работает на любой машине с Emacs, даже там, где нельзя собрать нативный модуль. Ghostel при первом запуске скачивает готовый модуль (или собирает его через Zig), а vterm компилирует C-зависимость с помощью CMake. Платой за удобство eat становится производительность: на бенчмарке (1 MB потока, ~1000 строк скролла, Emacs 32.0.50) ghostel выдаёт ~75 MB/s на чистом ASCII — это примерно в 4 раза быстрее vterm (~18) и в 12 раз быстрее eat (~6). Встроенный term из Emacs показывает около 7.
С графикой всё строго: ghostel использует протокол Kitty, eat — Sixel, vterm не умеет вообще. Протоколы несовместимы. Обработка мыши: ghostel и eat передают события мыши (нажатие, отпускание, перетаскивание) в программу через SGR, поэтому htop или lazygit получают настоящий ввод. Vterm же перехватывает клики для движения курсора Emacs.
Режимы ввода — модель char/semi-char/Emacs/line родом из eat. Ghostel её заимствовал с пятью режимами. У vterm есть только режим по умолчанию (≈ semi-char) плюс vterm-copy-mode и нет полноценного line-режима. Ghostel предлагает два режима для работы с текстом: замораживающий copy-mode и живой read-only Emacs-режим. Eat использует только живой.
По интеграции с оболочкой ghostel внедряется автоматически в bash, zsh и fish — не нужно править RC-файлы. Vterm и eat требуют ручного подключения скриптов. Все три отслеживают рабочий каталог (даже через TRAMP) и умеют навигировать между приглашениями: ghostel через OSC 133, остальные через свои аннотации на OSC 51. Ghostel и vterm позволяют оболочке выполнять разрешённый Elisp, eat даёт только фиксированные команды UI.
Детекция паролей: ghostel автоматически распознаёт, когда программа читает пароль (sudo, ssh, gpg), запрашивает его через read-passwd и отправляет прямо в PTY, минуя клавиатурный конвейер Emacs. Срабатывает даже хук для auth-source. У eat есть ручная команда eat-send-password без автоопределения. У vterm — никакого перехвата, каждый символ попадает в view-lossage.
Методы ввода: ghostel и vterm пробрасывают вводные методы Emacs в терминал (у ghostel через ghostel-ime-mode), eat — нет. Рендеринг во всех трёх построен на текстовых свойствах, а не наложениях. Ghostel обновляет только грязные строки (дефолтные ~30 fps), vterm использует коллбеки повреждённых прямоугольников (~10 fps), eat группирует вывод с задержкой 8–33 мс.