TheThe0.5.0
The/SDK

Плагин пишется под границу на чистом C.

Ядро компактное и ничего не знает о GUI. Форматы, подсветка, темы и инструменты подключаются к нему через API на чистом C. Одно это скучное решение и позволяет расширению работать между компиляторами и языками.

01 · зачем c abi

Граница на C++ ломала бы плагин при следующем компиляторе.

1.1

C++ ABI нестабилен между компиляторами, стандартными библиотеками и даже флагами сборки. Редактор, отдающий плагинам C++-классы, заставил бы каждого автора расширения повторять свой тулчейн — и ломал бы их при следующем обновлении компилятора.

1.2

Поэтому граница описана на C: непрозрачные хендлы, простые структуры и указатели на функции. Плагин, собранный MSVC, загружается в сборку от Clang; плагин на C или Rust живёт рядом с плагином на C++.

1.3

Ядро при этом остаётся без GUI. Плагин формата не тянет интерфейсных зависимостей — именно это делает ядро тестируемым, а поведение редактора на больших файлах предсказуемым.

02 · виды плагинов

Четыре вида, одна граница.

format

Учит редактор типу файла: как он читается, показывается и записывается. Такого вида csv (табличный режим) и epub (WYSIWYG).

highlight

Поставляет грамматику и правила отступов. Плагин cpp из комплекта подключает грамматику tree-sitter.

tool

Добавляет возможность поверх документа или проекта: ripgrep, git, clangd.

theme

Поставляет палитру и параметры оформления внутри существующих дизайн-направлений.

03 · форма

Плагин — разделяемая библиотека с несколькими точками входа на C.

Он представляется, объявляет версию 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 · сборка

Самостоятельный проект CMake.

Шаблон зависит только от публичных заголовков и собирает одну разделяемую библиотеку. Ядро не пересобирается и не линкуется в плагин.

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 · установка

Вручную — и это осознанно.

  • Положите собранную библиотеку в каталог плагинов редактора и перезапустите его.
  • Плагин появляется в панели «Плагины» и включается тумблером.
  • Хост проверяет объявленную версию ABI при загрузке; при несовпадении плагин не загружается, а причина сообщается.
  • Ничего не скачивается автоматически: магазина и автообновления расширений нет.

placeholder

Путь к каталогу плагинов для каждой платформы нужно взять из сборки.

06 · совместимость

Что гарантирует граница на C.

ГарантияЧто это значит для вас
Независимость от компилятораСборки MSVC, Clang и GCC совместимы; подбирать вариант стандартной библиотеки не нужно.
Независимость от языкаПодходит всё, что умеет экспортировать символы C: C, C++, Rust и другие.
Версионированная границаПлагин объявляет версию ABI, хост её проверяет: несовместимый плагин падает громко, а не роняет редактор.
Без пересборки ядраПлагин подключается к выпущенной сборке The.

07 · чего нет

Сказано прямо, чтобы никто не строил на этом планы.

Нет песочницы

Сторонний плагин работает в процессе редактора с его правами. Песочница WASM запланирована, без даты.

Нет магазина

Ни каталога, ни лицензирования расширений — установка ручная.

Нет стабильности API до 1.0

Граница ещё может меняться; изменения будут перечислены в списке изменений.

Пока песочницы нет, запускайте только те плагины, чей исходник вы прочитали.