Neovim: современный клон текстового редактора Vim

от автора

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 program<br> |<br> ---> Neovim<br> |<br> ---> Plugin 1<br> |<br> ---> Plugin 2<br> |<br> ---> Plugin 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.

ссылка на оригинал статьи http://habrahabr.ru/post/213517/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *