
Neomacs: форк GNU Emacs на Rust з рендерингом через GPU
Розробник Eval Exec опублікував Neomacs (NEO Emacs), робочий форк GNU Emacs. Ядро мовою C обсягом близько 300 000 рядків переписано на Rust, а рендеринг перенесено на GPU через wgpu. Мета: 100% сумісність із наявними конфігураціями та пакетами.
NEO Emacs, або Neomacs, це незавершений форк GNU Emacs, який опублікував на GitHub розробник Eval Exec. Проєкт зберігає все, до чого користувачі вже звикли: init.el, наявні пакети та клавіатурні звички. Начинку ж перебудовано: рендеринг працює на GPU, а ядро мовою C обсягом близько 300 000 рядків переписано на Rust.
Як зазначає репозиторій, у бінарному файлі neomacs ядра на C більше немає: інтерпретатор Elisp, байт-кодова віртуальна машина, збирач сміття, портативний dump, буфери, вікна, обробка клавіатури, процеси, розкладка та рендеринг написані на Rust. Каталог lisp, тобто Elisp-частина редактора, узятий з GNU Emacs і синхронізується з гілкою розробки emacs-31.
Рушій на GPU в окремому потоці
Архітектура розділяє роботу між двома потоками: потік Emacs володіє середовищем Elisp і станом редактора, а потік рендерингу володіє GPU. Рушій відображення побудовано на wgpu, що охоплює Vulkan, Metal, DX12 і OpenGL, а близько 4 000 рядків Rust замінюють приблизно 50 000 рядків xdisp.c. У буферах можна показувати медіа: вбудоване 4K-відео через GStreamer, зображення, декодовані на GPU, браузер WPE WebKit і термінал на GPU. Окремий шар анімацій пропонує вісім режимів курсора, 21 ефект прокрутки та десять переходів між буферами, і все це налаштовується з Elisp.
Чому форк, а не переписування з нуля
У розділі частих запитань Emacs описано як 40-річну кодову базу мовою C, що не встигає за сучасним обладнанням. Серед названих проблем: рендеринг лише на процесорі, відсутність вбудованого відтворення відео і простоюючий GPU. За словами проєкту, Elisp позбавлений inline caching і JIT-оптимізації під час виконання, а збирач сміття зупиняє всю програму. Оскільки Elisp виконується в одному потоці, один повільний виклик заморожує весь редактор. Окрема проблема це великі файли та довгі рядки: весь файл зберігається в одному gap buffer, тож стомегабайтний журнал усе одно блокує редактор.
Рішення зробити форк, а не писати з нуля, свідоме. GNU Emacs залишається в проєкті як еталон і тестовий оракул: набори тестів, порівняння сітки TUI та перевірки паритету GUI постійно зіставляють Neomacs із GNU Emacs, щоб кожна переписана на Rust підсистема давала ідентичну поведінку. Зміни, за словами проєкту, надто глибокі, щоб їх колись прийняли в upstream, саме тому Neomacs називають жорстким форком.
Стан і сумісність
Neomacs відкрито позначено як alpha: README попереджає про шорсткі краї, зміни, що ламають сумісність, і відсутні функції, та просить надсилати звіти про помилки. Заявлений контракт це 100% сумісність у спостережуваній поведінці, тобто в семантиці, роботі та логічному відображенні, зі свободою бути кращим нижче цієї межі, наприклад у швидкості запуску. Наступні цілі це справжній багатопотоковий Elisp і паралельний збирач сміття без пауз. Один і той самий бінарник рендерить і на GPU, і в терміналі (neomacs -nw), а готові образи для amd64 та arm64 опубліковано в Docker Hub і GitHub Container Registry. На момент написання в репозиторію було близько 1 177 зірок і 47 форків.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.