Vim — мощный текстовый редактор, у которого большая аудитория. Хотя программе более 20 лет, её функциональность продолжают улучшать через скрипты vimscript. Последняя версия свободного редактора Vim 7.4 вышла в августе 2013 года.

Проблема в том, что за два десятилетия Vim разросся до страшных размеров: около 300 000 строк кода на C89. «Очень мало людей могут понять этот код или имеют смелость изменять его. Есть проблема и с добавлением нового кода и патчей в Vim: единственный мейнтейнер не успевает за развитием экосистемы плагинов», — пишет бразильский программист Тиаго де Арруда Падилья (Thiago de Arruda Padilha), который создал проект Neovim — обновлённую и улучшенную версию Vim для 21 века.

В рамках проекта Neovim планируется осуществить агрессивный рефакторинг исходного кода Vim. Цели:

  1. Упростить поддержку и увеличить скорость добавления патчей и новых функций;
  2. Распределить работу между несколькими разработчиками;
  3. Внедрить современный GUI как опцию;
  4. Улучшить расширяемость редактора за счёт новой архитектуры плагинов, осно��анной на сопроцессах. Плагины можно будет писать на любом ЯП без их явной поддержки из редактора.

Разработчик отмечает, что не ставит цель переписать 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. Принимаются пожертвования.