Vim — мощный текстовый редактор, у которого большая аудитория. Хотя программе более 20 лет, её функциональность продолжают улучшать через скрипты vimscript. Последняя версия свободного редактора Vim 7.4 вышла в августе 2013 года.
Проблема в том, что за два десятилетия Vim разросся до страшных размеров: около 300 000 строк кода на C89. «Очень мало людей могут понять этот код или имеют смелость изменять его. Есть проблема и с добавлением нового кода и патчей в Vim: единственный мейнтейнер не успевает за развитием экосистемы плагинов», — пишет бразильский программист Тиаго де Арруда Падилья (Thiago de Arruda Padilha), который создал проект Neovim — обновлённую и улучшенную версию Vim для 21 века.
В рамках проекта Neovim планируется осуществить агрессивный рефакторинг исходного кода Vim. Цели:
- Упростить поддержку и увеличить скорость добавления патчей и новых функций;
- Распределить работу между несколькими разработчиками;
- Внедрить современный GUI как опцию;
- Улучшить расширяемость редактора за счёт новой архитектуры плагинов, основанной на сопроцессах. Плагины можно будет писать на любом ЯП без их явной поддержки из редактора.
Разработчик отмечает, что не ставит цель переписать Vim с нуля и создать IDE, хотя Neovim и имеет некоторые черты IDE. Напротив, изменения не должны сильно изменить модель работы Vim или vimscript в целом. Большинство плагинов vimscript продолжат нормально работать.
Говоря о конкретных изменениях, планируется перейти на современную систему автоматизации сборки на основе cmake, убрать режим эмуляции Vi и некоторые другие не очень важные опции, которые затрудняют поддержку кода, а также убрать платформо-специфичный код. Вместо него будут динамически подключаемая библиотека libuv будет осуществлять асинхронный ввод-вывод на разных платформах.
Новую систему плагинов предлагается построить поверх механизма управления заданиями, похожего на этот. Плагины можно писать на любом языке, наличие плагина редактор будет проверять при запуске, и каждый плагин будет работать асинхронно, ожидая события и отправляя команды в Neovim. Например, вот так может выглядеть сессия работы плагина с использованием json-rpc.
plugin -> neovim: {"id": 1, "method": "listenEvent", "params": {"eventName": "keyPressed"}}
neovim -> plugin: {"id": 1, "result": true}
neovim -> plugin: {"method": "event", "params": {"name": "keyPressed", "eventArgs": {"keys": ["C"]}}}
neovim -> plugin: {"method": "event", "params": {"name": "keyPressed", "eventArgs": {"keys": ["Ctrl", "Space"]}}}
plugin -> neovim: {"id": 2, "method": "showPopup", "params": {"size": {"width": 10, "height": 2} "position": {"column": 2, "line": 3}, "items": ["Completion1", "Completion2"]}}
plugin -> neovim: {"id": 2, "result": true}}
Такая схема даёт Neovim практически неограниченную расширяемость и одновременно улучшает стабильность программы, поскольку плагины отделены от основного исходного кода.
Из основного кода удалят элементы GUI и все соответствующие виджеты. GUI будет подключаться примерно по той же схеме, что и плагины. Отличие только в том, что плагины загружаются в Neovim, а сам Neovim запускается из GUI.
Программа GUI
|
---> Neovim
|
---> Плагин 1
|
---> Плагин 2
|
---> Плагин 3
Гипотетическая сессия GUI.
gui -> vim: {"id": 1, "method": "initClient", "params": {"size": {"rows": 20, "columns": 25}}}
vim -> gui: {"id": 1, "result": {"clientId": 1}}
vim -> gui: {"method": "redraw", "params": {"clientId": 1, "lines": {"5": " Welcome to neovim! "}}}
gui -> vim: {"id": 2, "method": "keyPress", "params": {"keys": ["H", "e", "l", "l", "o"]}}
vim -> gui: {"method": "redraw", "params": {"clientId": 1, "lines": {"1": "Hello ", "5": " "}}}
Таким образом, в редактор можно внедрить современные GUI, написанные на высокоуровневых языках программирования и лучше интегрированные в операционную систему. Плагины смогут взаимодействовать напрямую с GUI, как minimap в Sublime. Ядро редактора можно будет запустить на сервере, а много инстансов GUI — на клиентских машинах. Редактор можно будет встроить в другие программы, также как он фактически встроен в GUI.
Всю разработку Neovim планируется вести на Github. Принимаются пожертвования.
Автор: alizar