Это не вопрос вкуса или моды. За форком Neovim стоит десятилетие архитектурных решений, которые превратили "текстовый редактор с плагинами" в платформу для встраивания IDE-функций. В этой главе мы разберём, откуда взялся форк, какие у него были цели, чем он технически отличается от классического Vim, что нового принесли релизы 0.11 и 0.12, как Vim ответил языком Vim9script - и, главное, кому какой редактор реально нужен. Эта глава - концептуальный фундамент для всей части VI: следующие главы про LSP (25), автодополнение (26), Treesitter (27), пикеры (28) и Git (29) опираются именно на те возможности Neovim, о которых пойдёт речь здесь.
Откуда взялся Neovim: история и цели форка
Vim - проект Брама Моленаара, развивавшийся с 1991 года как улучшенная версия редактора vi. К началу 2010-х кодовая база Vim насчитывала сотни тысяч строк C, написанных с расчётом на совместимость с десятками платформ и терминалов, в том числе давно вымерших. Любое крупное изменение упиралось в одного мейнтейнера и риск что-нибудь сломать.
Neovim родился в 2014 году как форк именно из этого напряжения. Его цели были сформулированы прямо:
- Упростить сопровождение - выкинуть легаси, навести порядок в коде, открыть дорогу контрибьюторам через распределённую разработку (а не модель "один человек принимает патчи").
- Сделать расширяемость первоклассной - встроенный язык (Lua), асинхронность и программный API, чтобы плагины не блокировали редактор и могли управляться извне.
- Отделить ядро от UI - редактор как сервер, к которому подключаются разные интерфейсы (терминальный, графический, встроенный в IDE) по протоколу RPC.
Ключевые технические отличия
Встроенный Lua
Главное отличие - первоклассный Lua как язык конфигурации и плагинов. В Vim единственный родной язык скриптинга - Vimscript (его мы разбирали в главе 22). В Neovim рядом с Vimscript встроен интерпретатор LuaJIT, а весь редактор доступен через глобальный объект vim: опции через vim.opt, глобалы через vim.g, функции Vim через vim.fn, API через vim.api.
Почему это важно: Lua - полноценный язык программирования с таблицами, замыканиями, модулями и быстрым JIT-компилятором. Конфиг на Lua запускается быстрее, лучше структурируется и не упирается в синтаксические ограничения Vimscript. Именно поэтому канон 2026 года - init.lua, а не init.vim (см. главу 20). LuaJIT настолько быстр, что Neovim дополнительно кэширует скомпилированный байткод через vim.loader.enable(). Выигрыш сильно зависит от числа Lua-модулей в конфиге: на больших конфигах он может ускорить старт на десятки процентов, а на пустом конфиге эффект почти нулевой.
Асинхронность
В классическом Vim длинная операция (запрос к языковому серверу, индексация, сетевой вызов) блокировала редактор - курсор замирал до завершения. Vim позже добавил job/channel и таймеры, частично решив проблему, но асинхронность там осталась надстройкой.
В Neovim асинхронность встроена в ядро через событийный цикл libuv (тот же, что в Node.js). Плагины запускают фоновые процессы, делают сетевые запросы и обрабатывают события, не подвешивая ввод. Без этого фундамента не существовали бы быстрые движки автодополнения вроде blink.cmp (глава 26), реагирующие на каждое нажатие за единицы миллисекунд.
Встроенные LSP, Treesitter и DAP
Это, пожалуй, самая заметная для пользователя разница.
- LSP (Language Server Protocol) - клиент языковых серверов встроен прямо в ядро Neovim. Это даёт "умные" возможности - переход к определению, переименование, диагностику, code actions - без сторонних плагинов вроде coc.nvim. Оговорка: встроенный клиент покрывает не всё "из коробки" - для удобного автодополнения и форматирования исторически всё равно нужны omnifunc (CTRL-X CTRL-O) или сторонние движки вроде blink.cmp/conform.nvim (в 0.12 появилась нативная опция 'autocomplete', но пока экспериментальная). Подробно настройку LSP разбираем в главе 25.
- Treesitter - инкрементальный парсер, строящий синтаксическое дерево (AST) кода. Он даёт точную подсветку (по структуре, а не по регуляркам), структурные текстовые объекты и сворачивание. Подробно - в главе 27.
- DAP (Debug Adapter Protocol) - поддержка отладчиков через плагин nvim-dap, использующий встроенную асинхронность. О терминале и отладке - в главе 30.
API и RPC
Neovim выставляет наружу программный API через msgpack-RPC. Любой внешний процесс - на Python, Rust, JavaScript - может управлять редактором: читать буферы, ставить курсор, создавать окна. На этом построена интеграция Neovim в другие среды: расширение vscode-neovim встраивает настоящий Neovim в VSCode, а IDE-плагины используют его как движок (подробнее о "Vim повсюду" - в главе 31).
Floating windows
Neovim умеет рисовать плавающие окна (floating windows) - прямоугольники, парящие поверх текста вне обычной сетки сплитов. На них держится почти весь современный UI: всплывающие подсказки документации (hover), меню автодополнения, окна диагностики, попапы which-key, интерфейсы пикеров вроде Telescope. В классическом Vim аналога floating windows на уровне ядра нет (есть popup-окна, но они ограниченнее).
Сводная таблица отличий
Код: Выделить всё
Возможность | Vim 9.1 | Neovim 0.12
-----------------------------+------------------------------+--------------------------
Язык конфигурации | Vimscript / Vim9script | Lua (+ Vimscript)
Асинхронность | jobs/channels (надстройка) | libuv в ядре
Встроенный LSP-клиент | нет | да
Встроенный Treesitter | нет | да (парсеры в комплекте)
API / RPC | ограниченный | msgpack-RPC, полный
Floating windows | popup-окна | да, полноценные
Менеджер плагинов в ядре | packages (без UI) | vim.pack
Нативный HTTP | нет | vim.net.request()
Время старта (ориентир) | ~28 мс | ~12 мс
Память в простое (ориентир) | ~12 МБ | ~18 МБ
Состояние версий в 2026: что нового в 0.11 и 0.12
Neovim 0.11 (март 2025): нативный LSP без обвязки
Релиз 0.11 переписал то, как настраивается LSP. Раньше канон был require('lspconfig').<server>.setup{} - то есть для базовой работы языкового сервера требовался плагин nvim-lspconfig. В 0.11 появились нативные высокоуровневые API:
- vim.lsp.config('clangd', {...}) - задаёт конфигурацию сервера;
- vim.lsp.enable({'clangd', 'lua_ls'}) - активирует серверы для их типов файлов.
Вместе с этим в 0.11 появились дефолтные LSP-маппинги прямо из коробки - раньше каждый писал их сам:
Код: Выделить всё
Клавиша | Действие
-----------------+---------------------------------------
grn | переименование (rename)
gra | code action
grr | список ссылок (references)
gri | переход к реализации (implementation)
grt | переход к типу (type definition)
gO | символы документа (document symbol)
K | hover-документация
CTRL-S (insert) | подсказка сигнатуры
[d / ]d | навигация по диагностике
Код: Выделить всё
vim.diagnostic.config({ virtual_text = true })
-- или более компактный вариант, разворачивающий диагностику строками:
vim.diagnostic.config({ virtual_lines = { current_line = true } })
Neovim 0.12 (29 марта 2026): менеджер плагинов и автокомплит в ядре
Релиз 0.12 - крупный шаг к тому, чтобы базовый IDE-функционал работал вообще без плагинов:
- vim.pack - встроенный менеджер плагинов на Lua, без внешних зависимостей. API: vim.pack.add(), vim.pack.update(), vim.pack.del(), vim.pack.get(). Версии задаются полем version (ветка, тег, коммит или диапазон vim.version.range('2.x')), есть lockfile nvim-pack-lock.json, который коммитится в репозиторий. Важная оговорка: у vim.pack нет ленивой загрузки по event/ft/cmd - её приходится писать руками через autocmd. Поэтому на больших конфигах (30+ плагинов) lazy.nvim пока остаётся предпочтительнее (см. главу 23).
- Нативный автокомплит в insert-режиме через опцию 'autocomplete' - базовое автодополнение работает без nvim-cmp/blink.cmp. Помечен как экспериментальный.
- vim.net.request() - нативные HTTP-запросы. Плагинам больше не нужно шеллить curl; работает и :edit https://....
- :restart - перезапуск Neovim без выхода, с переподключением UI.
- Интерактивная :lsp - управление LSP-клиентами; заменяет функциональность команд плагина nvim-lspconfig (:LspInfo/:LspRestart/:LspLog), которые никогда не были частью ядра. Добавлен autocmd LspProgress.
- Treesitter в ядре - парсеры и подсветка для распространённых языков включены по умолчанию, Markdown подсвечивается из коробки. Отдельный плагин nvim-treesitter для базовой подсветки больше не обязателен (детали и нюансы миграции - в главе 27).
- Расширенный LSP - selectionRange, inlineCompletion, linkedEditingRange, documentLink, семантические токены только для видимой области.
- Экспериментальный UI2 - редизайн сообщений и командной строки, убирающий промпты "Press ENTER".
- Встроенные :Undotree (packadd nvim.undotree) и :DiffTool (packadd nvim.difftool).
Ответ Vim: Vim9script
Vim не стоял на месте. Главный его ответ на эпоху Neovim - Vim9script, новый диалект скриптинга, призванный решить две проблемы старого Vimscript: медлительность и архаичный синтаксис.
Vim9script компилирует команды функции в инструкции при первом вызове, давая прирост скорости в 10-100 раз. Синтаксис приближен к JavaScript/TypeScript/Java:
Код: Выделить всё
vim9script
# комментарий через #, а не "
var count = 0 # var вместо let
def Greet(name: string): string
return $"Hello, {name}"
enddef
echo Greet('world')
Что важно понимать честно: Vim9script отвечает на критику Vimscript "он медленный и уродливый", но не закрывает архитектурные отличия. В Vim по-прежнему нет встроенного LSP-клиента, Treesitter и Lua; асинхронность остаётся надстройкой. Vim9script делает написание Vim-плагинов приятнее, но не превращает Vim в платформу уровня Neovim. Это две разные стратегии: Vim улучшает свой язык, Neovim меняет архитектуру.
Состояние экосистемы и сообщества
Цифры 2026 года говорят за себя. Репозиторий Neovim - около 88 тысяч звёзд на GitHub (рост ~15% за год), порядка 85 000 коммитов и ~1450 контрибьюторов. Репозиторий Vim растёт менее чем на 3% в год - это зрелый, стабильный, но не бурно развивающийся проект.
Дистрибутив LazyVim достиг ~1.2 миллиона загрузок и стоит, по оценкам, за ~45% всех Neovim-конфигов - это самая популярная готовая сборка для новичков. Подробно дистрибутивы (LazyVim, kickstart.nvim, NvChad, AstroNvim) разбираем в главе 30.
Практический вывод: основная масса новых плагинов, гайдов и инструментов 2026 года пишется под Neovim. Если вы выбираете редактор "на вырост" под современный IDE-подобный workflow - импульс сообщества на стороне Neovim.
Совместимость конфигов
Частый вопрос при переезде: "придётся ли переписывать конфиг?". Ответ - зависит от направления и от того, что в конфиге.
Из Vim в Neovim. Neovim умеет читать классический ~/.vimrc и понимает Vimscript. Базовый конфиг с опциями (set number, маппинги, autocmd) обычно работает почти без правок. Расхождения начинаются на:
- путях (Neovim использует ~/.config/nvim/ и init.lua/init.vim, а не ~/.vimrc);
- провайдерах (Python/Ruby/clipboard у Neovim настраиваются иначе);
- плагинах, завязанных на Vim-специфичные механизмы.
Практическая рекомендация: не пытайтесь поддерживать один конфиг для обоих редакторов. Если работаете в обоих - держите минимальный портируемый vimrc для Vim (опции + базовые маппинги на Vimscript) и полноценный init.lua для Neovim.
Честное сравнение: кому хватит Vim, кому нужен Neovim
Это не "что лучше", а "что под вашу задачу".
Vim вам подходит, если:
- Вы много редактируете на серверах, в контейнерах и чужих окружениях, где нельзя ставить софт. Vim почти везде предустановлен, легче по памяти и не требует провайдеров.
- Ваш текущий Vim-конфиг работает и устраивает - переезд ради переезда не нужен.
- Вам не нужна полноценная IDE внутри редактора: правка конфигов, текстов, быстрые сессии.
- Вы цените стабильность и минимализм без зоопарка плагинов.
- Вы хотите IDE-возможности (LSP, Treesitter, умное автодополнение, отладка) с минимумом боли.
- Вы пишете конфиг и плагины и предпочитаете Lua архаичному Vimscript.
- Вы хотите быть в актуальной экосистеме 2026 года, где пишется большинство новых инструментов.
- Вы встраиваете Vim-движок в другие среды (VSCode, IDE) через RPC.
Лучшие практики 2026
- Настраивайте LSP через нативные vim.lsp.config/vim.lsp.enable и каталог lsp/, а не через старый require('lspconfig').setup{}. Это убирает зависимость от плагина для базовой работы. Не смешивайте оба подхода - будут дублирующиеся/конфликтующие конфиги.
- Явно включайте "тихие" дефолты. После 0.11 виртуальный текст диагностики выключен - включайте vim.diagnostic.config({ virtual_text = true }) (или virtual_lines). Для Treesitter из main-ветки подсветку и фолды тоже надо включать вручную (детали - глава 27). Важно для миграции: к 2026 году nvim-treesitter разделён на две ветки - старая master архивирована (legacy, новых фич не получает), актуальна именно main с переработанным API. Если в гайдах встречается старый require('nvim-treesitter.configs').setup{} - это код для архивированной master.
- Не спешите мигрировать с lazy.nvim на vim.pack. vim.pack стабилен, но без ленивой загрузки по event/ft/cmd. Для конфигов в 30+ плагинов lazy.nvim держит старт быстрым; vim.pack оправдан для умеренных конфигов, ценящих нулевые зависимости.
- Новичкам - LazyVim как рабочая основа, kickstart.nvim параллельно для обучения. Живите на готовом дистрибутиве, но в свободное время разберите минимальный однофайловый kickstart.nvim, чтобы не зависеть от "магии" дистрибутива.
- Опытным Vim-юзерам - не мигрировать без причины. Если Vim-конфиг работает, переезд не обязателен. На серверах держите беглость в Vim.
- Новые Vim-скрипты пишите на Vim9script - с var, классами (9.1) и :defer. Это даёт и скорость, и читаемость.
- Включайте vim.loader.enable() в начале init.lua для кэша Lua-байткода. На больших Lua-конфигах это может ускорить старт на десятки процентов; на пустом конфиге эффект почти не заметен.
- Думать, что Neovim несовместим с Vim. Модальное редактирование, грамматика, Ex-команды и Vimscript работают в обоих. Расхождение - в архитектуре, а не в редактировании текста.
- Ждать, что виртуальный текст диагностики включён по умолчанию в 0.11+. Он стал opt-in. Включайте явно.
- Продолжать использовать require('lspconfig').xxx.setup{} на 0.11+. Это legacy-путь, который выдаёт warning и будет удалён в v3.0.0. Переходите на vim.lsp.config/vim.lsp.enable.
- Ожидать, что vim.pack заменит lazy.nvim один-в-один. У него нет ленивой загрузки и packspec - на больших конфигах старт деградирует.
- Пытаться собрать на Vim полноценную IDE и удивляться сложности. Без нативных LSP/Treesitter/Lua это упирается в сторонние плагины (coc.nvim и т. п.). Это возможно, но это не "из коробки".
- Тащить старый стек по инерции на 0.12. Часть функций (Treesitter-подсветка, базовый LSP, автокомплит) уже в ядре - конфиг можно облегчить. Но не закладывайтесь на экспериментальные 'autocomplete' и ui2 как на стабильные.
- Пытаться поддерживать единый Lua-конфиг для Vim и Neovim. Vim не исполняет Lua с Neovim API. Держите конфиги раздельно.
- Проверьте свою версию. Запустите nvim --version и vim --version (если Vim установлен). Определите мажорную версию Neovim. Если это не 0.11+, прикиньте, какие фичи из главы вам недоступны.
- Исследуйте нативный LSP-каталог. Создайте файл ~/.config/nvim/lsp/lua_ls.lua с минимальной конфигурацией и активируйте сервер через vim.lsp.enable({'lua_ls'}) в init.lua. Откройте .lua-файл и убедитесь через :lsp (или :LspInfo на 0.11), что клиент подключился. Полная настройка - в главе 25.
- Включите диагностику осознанно. Добавьте в конфиг vim.diagnostic.config({ virtual_text = true }), перезапустите Neovim, внесите синтаксическую ошибку в код и убедитесь, что текст ошибки появился справа от строки. Затем поэкспериментируйте с virtual_lines.
- Сравните старт. Запустите nvim --startuptime startup.log и откройте полученный лог. Найдите самые медленные строки. Затем добавьте vim.loader.enable() первой строкой init.lua и сравните время повторно.
- Попробуйте Vim9script. В Vim (не Neovim) создайте файл с vim9script, объявите функцию через def/enddef с типизированными параметрами и вызовите её. Сравните синтаксис с тем, что вы писали на Vimscript в главе 22.
- Оцените свой кейс. Письменно ответьте на вопросы: где вы редактируете чаще всего (локально / по SSH / в контейнерах)? Нужны ли вам LSP и Treesitter ежедневно? На основе раздела "Честное сравнение" сформулируйте, какой редактор основной для вас и почему.
- Neovim - форк Vim 2014 года с целями: упростить сопровождение, сделать расширяемость первоклассной (Lua, async, API/RPC) и отделить ядро от UI. Модальное редактирование и грамитика полностью совместимы.
- Ключевые отличия от Vim: встроенный LuaJIT, асинхронность на libuv в ядре, встроенные LSP/Treesitter/DAP, msgpack-RPC API и floating windows.
- Neovim 0.11 принёс нативный LSP (vim.lsp.config/vim.lsp.enable, каталог lsp/), дефолтные LSP-маппинги (grn/gra/grr/gri/K) и сделал виртуальный текст диагностики opt-in.
- Neovim 0.12 (март 2026) добавил в ядро менеджер плагинов vim.pack, нативный автокомплит, vim.net.request(), :restart, интерактивную :lsp и Treesitter по умолчанию - но часть фич экспериментальна.
- Vim ответил Vim9script (скорость в 10-100 раз, классы в 9.1, :defer), но это улучшение языка, а не архитектуры: нативных LSP/Treesitter/Lua в Vim нет.
- Выбор честный: Vim - для серверов, минимализма и "оно уже работает"; Neovim - для IDE-возможностей, Lua и актуальной экосистемы. Практика 2026 - оба: Neovim основной, Vim для серверов.
- Конфиги совместимы в одну сторону: Vimscript-конфиг чаще всего едет в Neovim, Lua-конфиг в Vim - нет.