libvim
? libvim
— это ответвление Vim, целью которого является предоставление минимального API на основе C, моделирующего модальное редактирование Vim. Он вообще не включает в себя никакого пользовательского интерфейса (даже пользовательского интерфейса терминала) и в первую очередь отвечает за работу в качестве механизма быстрого манипулирования буфером, точного нажатия клавиш Vim. Работа над этим все еще продолжается, и предстоит еще много работы по стабилизации.
Если вы ищете терминал Vim, обратите внимание на neovim или Vim с графическим интерфейсом, обратите внимание на Onivim 2.
libvim
в первую очередь предназначен для Onivim 2. После реализации нескольких итераций «UI Vims» между v1, v2 и другими проектами, абстракция, которую я хотел иметь, была своего рода чистым функциональным Vim, полностью отделенным от пользовательского интерфейса терминала - где «vim ' является функцией (editor state, input) => (new editor state)
. Поскольку Onivim 2 полностью обрабатывает уровень рендеринга, эта функция Vim, смоделированная как чистая, может сосредоточиться только на манипуляциях с буфером.
С этой целью libvim
предоставляет простой C API для работы с Vim и поддерживает прослушивание изменений буфера, сообщений и т. д.
Он отвечает за:
НЕ несет ответственности за:
Все это предназначено для обработки потребителем библиотеки, поэтому libvim
остается сосредоточенным на быстрой манипуляции с буфером.
libvim
создает кросс-платформенную версию (поскольку Onivim 2 требует этого!), а также для WebAssembly — мы хотели бы перенести наши руководства по версии 1 на браузерную версию.
Есть и другие интересные применения такого «абстрактного Vim»:
readline
. Пример использования API можно найти в аптестах, например,normal_mode_motion. Полный API доступен здесь: libvim.h.
Сердцем API является vimInput
, который принимает один ключ и синхронно обрабатывается конечным автоматом. На «побочные эффекты», такие как обновления буфера, сообщения и т. д., можно подписаться через обратные вызовы, такие как vimSetBufferUpdateCallback
.
Эта библиотека находится в активной разработке, и в настоящее время мы не даем никаких гарантий относительно обратной совместимости. Используйте API на свой страх и риск.
esy
похож на npm
для машинного кода. Если у вас его еще нет, установите его, выполнив:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
Рабочий процесс esy
отлично подходит для одноразовых сборок, но каждый раз будет перестраивать мир, поэтому во время разработки лучше использовать поэтапный рабочий процесс.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Вы можете протестировать локально собранный libvim
с локально созданным Onivim 2, добавив разрешение в файл Onivim 2 package.json
, например:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Просто убедитесь, что он указывает на папку libvim/src
.
ПРИМЕЧАНИЕ. Мы видели проблемы с этим рабочим процессом, когда двоичные файлы могут быть устаревшими в Onivim 2, поэтому мы рекомендуем запускать
rm -rf _esy && esy i
после каждого изменения, чтобы перестроить зависимость.
libvim
основан на Vim, а не на Neovim? Я большой поклонник работы, которую делает команда Neovim (и команда оказала невероятную поддержку проекту Onivim). В идеале мы бы остановились на Neovim или реализовали бы libvim
на основе libnvim
. Фактически, когда я впервые попытался построить эту «минимальную абстракцию», я попытался взять за основу libnvim
от Neovim. Я ограничил время расследования двумя днями и столкнулся с некоторыми серьезными препятствиями: наша среда сборки в Windows немного сложна (она основана на наборе инструментов кросс-компилятора Cygwin + MingW). Я столкнулся с несколькими проблемами при сборке Neovim + deps в этой среде. . Основываясь на этом всплеске, я прикинул, что потребуется около 3-4 недель, чтобы заставить его работать в этой цепочке инструментов.
Обратите внимание, что это не проблема Neovim — использование зависимостей и использование CMake
— хорошие решения — это следствие нашей системы сборки OCaml. Цепочка инструментов кросс-компилятора Cygwin + MingW не очень хорошо обрабатывается всеми зависимостями (будучи странным гибридом Win32 и Unix, часто бывает, что #ifdefs неверны, подтягиваются неправильные зависимости, и это может быть огромной потерей времени. работа над этими вопросами).
Vim, напротив, смог легко скомпилироваться в этой среде (ПРИМЕЧАНИЕ. Если кто-то заинтересован в создании кроссплатформенного пакета Neovim с поддержкой esy
- мы можем вернуться к этому вопросу!). Меня также интересуют сборки WebAssembly для переноса учебных пособий по Onivim v1 в Интернет, для которых эта C-абстрагированная библиотека, скомпилированная в WebAssembly, идеально подойдет.
Помимо проблем со сборкой, как Neovim, так и Vim потребуется рефакторинг, чтобы обеспечить синхронный функциональный API:
Мотивацией всей этой работы было удаление уровня RPC из Onivim v2, чтобы уменьшить сложность и количество режимов сбоев — в конце концов, это было чисто техническое решение, основанное на ограничениях. Если мы сможем получить аналогичный API, который можно создать с помощью кроссплатформенной системы esy
, с помощью nvim
— я был бы рад его использовать :)
Если вам интересна libvim
и вы хотите поддержать разработку, рассмотрите следующее:
Если вы хотите помочь улучшить libvim
, посмотрите файл CONTRIBUTING.md.
Некоторые места для вклада:
libvim
Код libvim
лицензируется по лицензии MIT.
Это также зависит от стороннего кода, особенно Vim, а также от других — подробности лицензии см. в файле ThirdPartyLicenses.txt.