- PVSM.RU - https://www.pvsm.ru -
Vim — мощный текстовый редактор, у которого большая аудитория. Хотя программе более 20 лет, её функциональность продолжают улучшать через скрипты vimscript. Последняя версия свободного редактора Vim 7.4 вышла в августе 2013 года.
Проблема в том, что за два десятилетия Vim разросся до страшных размеров: около 300 000 строк кода на C89. «Очень мало людей могут понять этот код или имеют смелость изменять его. Есть проблема и с добавлением нового кода и патчей в Vim: единственный мейнтейнер не успевает за развитием экосистемы плагинов», — пишет бразильский программист Тиаго де Арруда Падилья (Thiago de Arruda Padilha), который создал проект Neovim [1] — обновлённую и улучшенную версию Vim для 21 века.
В рамках проекта Neovim планируется осуществить агрессивный рефакторинг исходного кода Vim. Цели:
Разработчик отмечает, что не ставит цель переписать Vim с нуля и создать IDE, хотя Neovim и имеет некоторые черты IDE. Напротив, изменения не должны сильно изменить модель работы Vim или vimscript в целом. Большинство плагинов vimscript продолжат нормально работать.
Говоря о конкретных изменениях, планируется перейти на современную систему автоматизации сборки на основе cmake [2], убрать режим эмуляции Vi и некоторые другие не очень важные опции, которые затрудняют поддержку кода, а также убрать платформо-специфичный код. Вместо него будут динамически подключаемая библиотека libuv [3] будет осуществлять асинхронный ввод-вывод на разных платформах.
Новую систему плагинов предлагается построить поверх механизма управления заданиями, похожего на этот [4]. Плагины можно писать на любом языке, наличие плагина редактор будет проверять при запуске, и каждый плагин будет работать асинхронно, ожидая события и отправляя команды в 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 [5]. Принимаются пожертвования [6].
Автор: alizar
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vim/55661
Ссылки в тексте:
[1] Neovim: https://github.com/neovim/neovim
[2] cmake: http://www.cmake.org/
[3] libuv: https://github.com/joyent/libuv
[4] этот: https://groups.google.com/forum/#!topic/vim_dev/QF7Bzh1YABU
[5] на Github: https://github.com/neovim
[6] пожертвования: https://www.bountysource.com/fundraisers/539-neovim-first-iteration
[7] Источник: http://habrahabr.ru/post/213517/
Нажмите здесь для печати.