Ядро компактное и ничего не знает о GUI. Форматы, подсветка, темы и инструменты подключаются к нему через API на чистом C. Одно это скучное решение и позволяет расширению работать между компиляторами и языками.
01 · зачем c abi
C++ ABI нестабилен между компиляторами, стандартными библиотеками и даже флагами сборки. Редактор, отдающий плагинам C++-классы, заставил бы каждого автора расширения повторять свой тулчейн — и ломал бы их при следующем обновлении компилятора.
Поэтому граница описана на C: непрозрачные хендлы, простые структуры и указатели на функции. Плагин, собранный MSVC, загружается в сборку от Clang; плагин на C или Rust живёт рядом с плагином на C++.
Ядро при этом остаётся без GUI. Плагин формата не тянет интерфейсных зависимостей — именно это делает ядро тестируемым, а поведение редактора на больших файлах предсказуемым.
02 · виды плагинов
Учит редактор типу файла: как он читается, показывается и записывается. Такого вида csv (табличный режим) и epub (WYSIWYG).
Поставляет грамматику и правила отступов. Плагин cpp из комплекта подключает грамматику tree-sitter.
Добавляет возможность поверх документа или проекта: ripgrep, git, clangd.
Поставляет палитру и параметры оформления внутри существующих дизайн-направлений.
03 · форма
Он представляется, объявляет версию ABI, под которую собран, и возвращает таблицу колбэков своего вида.
/* схема — точные имена смотрите в PluginAPI.h из SDK */ typedef struct the_plugin_desc { uint32_t abi_version; /* проверяется хостом при загрузке */ const char* id; /* "csv", "markdown", ... */ const char* name; const char* version; uint32_t kind; /* format | highlight | tool | theme */ } the_plugin_desc; /* единственные символы, которые ищет хост */ const the_plugin_desc* the_plugin_describe(void); int the_plugin_init(const the_host_api* host, the_plugin_ctx** out); void the_plugin_shutdown(the_plugin_ctx* ctx);
placeholder
Блок выше показывает форму границы, а не настоящие сигнатуры. Точные имена типов и функций нужно взять из core/include/editor/PluginAPI.h в SDK до публикации: выдуманный API в документации хуже пустого раздела.
04 · сборка
Шаблон зависит только от публичных заголовков и собирает одну разделяемую библиотеку. Ядро не пересобирается и не линкуется в плагин.
placeholder
Настоящие имена целей, опции CMake, минимальные версии тулчейна и требования к подписи на macOS нужно сверить с SDK.
# схематичная последовательность, цели — из SDK $ cmake -S . -B build \ -DTHE_SDK=/path/to/the-sdk $ cmake --build build --config Release # → build/the-plugin-example.(dll|dylib)
05 · установка
placeholder
Путь к каталогу плагинов для каждой платформы нужно взять из сборки.
06 · совместимость
| Гарантия | Что это значит для вас |
|---|---|
| Независимость от компилятора | Сборки MSVC, Clang и GCC совместимы; подбирать вариант стандартной библиотеки не нужно. |
| Независимость от языка | Подходит всё, что умеет экспортировать символы C: C, C++, Rust и другие. |
| Версионированная граница | Плагин объявляет версию ABI, хост её проверяет: несовместимый плагин падает громко, а не роняет редактор. |
| Без пересборки ядра | Плагин подключается к выпущенной сборке The. |
07 · чего нет
Сторонний плагин работает в процессе редактора с его правами. Песочница WASM запланирована, без даты.
Ни каталога, ни лицензирования расширений — установка ручная.
Граница ещё может меняться; изменения будут перечислены в списке изменений.
Пока песочницы нет, запускайте только те плагины, чей исходник вы прочитали.