Vim и Neovim: модальное редактирование, язык команд и как его освоить

Идея модального редактирования, операторы, движения и текстовые объекты, поиск, макросы и регистры, Neovim с LSP и Treesitter, Vim-режим в IDE, план освоения без потери продуктивности и стоит ли внедрять Vim в команде.

Vim часто воспринимают как мем: редактор, из которого невозможно выйти, и инструмент для тех, кто любит усложнять себе жизнь. На практике модальное редактирование — один из немногих навыков разработчика, который не устаревает десятилетиями. Комбинации клавиш Vim работают в самом Vim и Neovim, в режимах эмуляции популярных IDE и редакторов, в терминальных утилитах и на любом удалённом сервере, куда можно зайти по SSH. Эта статья объясняет, в чём идея модального редактирования, как устроен «язык» команд Vim, какие приёмы дают реальную пользу в ежедневной работе, чем Neovim отличается от Vim, как постепенно освоить этот подход, не теряя продуктивности, и стоит ли его навязывать команде. Без обещаний «вы станете писать код в десять раз быстрее» — только то, что действительно меняется. В чём идея модального редактирования Разработчик большую часть времени не набирает новый текст, а читает, перемещается по коду и изменяет существующий: переименовывает, переставляет, удаляет, копирует фрагменты. В обычном редакторе для этого приходится тянуться к мыши или зажимать сочетания клавиш с модификаторами. Vim разделяет работу на режимы. В обычном режиме клавиши — это команды перемещения и редактирования, в режиме вставки — ввод текста. Благодаря этому команды не требуют модификаторов, а руки остаются на основной части клавиатуры. Обычный режим — перемещение и команды. В нём Vim находится большую часть времени. Режим вставки — ввод текста. Вход — клавишами i , a , o и другими, выход — Esc . Визуальный режим — выделение текста: посимвольное, построчное, блочное. Командная строка — команды после двоеточия: сохранение, поиск и замена, работа с файлами. И да: выход из Vim — :q , выход с сохранением — :wq , выход без сохранения — :q! . Язык команд: глагол, число, объект Главное, что отличает Vim от набора горячих клавиш, — команды складываются как предложения. Оператор говорит, что сделать, движение или текстовый объект — с чем. Операторы d — удалить; c — изменить: удалить и перейти в режим вставки; y — скопировать; и — сдвинуть отступ; gu и gU — перевести в нижний и верхний регистр; = — выровнять отступы. Движения w , b , e — к следующему слову, предыдущему, концу слова; 0 , ^ , $ — начало строки, первый непробельный символ, конец строки; gg , G — начало и конец файла; f и t с символом — к символу в строке и до него; % — к парной скобке; } и { — к следующему и предыдущему абзацу или блоку. Текстовые объекты Текстовые объекты позволяют действовать над смысловой единицей, где бы ни стоял курсор внутри неё. Префикс i означает «внутри», a — «вместе с границами». iw — слово; i" , i' — содержимое кавычек; i( , i{ , i[ — содержимое скобок; it — содержимое HTML- или XML-тега; ip — абзац. Как это складывается ciw изменить слово под курсором di" удалить текст внутри кавычек ca( изменить выражение в скобках вместе со скобками yap скопировать абзац d2w удалить два слова ct, изменить текст до запятой i{ сдвинуть отступ содержимого блока gUiw перевести слово в верхний регистр Выучив десяток операторов и пару десятков движений и объектов, разработчик получает сотни команд без запоминания каждой отдельно. Именно поэтому изучение Vim нелинейно: после определённого порога новые возможности появляются как комбинации уже известного. Повтор: точка Клавиша . повторяет последнее изменение. Изменили слово через ciw , перешли к следующему вхождению через n — нажали . . Для многих повторяющихся правок это быстрее, чем любой поиск с заменой. Поиск и замена /функция поиск вперёд ?функция поиск назад n N следующее и предыдущее совпадение * поиск слова под курсором :%s/old/new/g заменить во всём файле :%s/old/new/gc с подтверждением каждой замены :' ,' s/a/b/g заменить в выделенном фрагменте :%s/\v(\w+)Id/\1_id/g регулярное выражение с группой Команда :g применяет команду к строкам по шаблону: :g/console.log/d удалит все строки с отладочным выводом. Макросы Макрос записывает последовательность действий и воспроизводит её. Это самый мощный инструмент для однотипных преобразований, которые сложно выразить регулярным выражением. qa начать запись макроса в регистр a ... выполнить правку одной строки и перейти к следующей q закончить запись @a воспроизвести 100@a воспроизвести сто раз @@ повторить последний макрос Практический пример: превратить список строк name: string в поля объекта с кавычками, преобразовать выгрузку в SQL-запросы или переставить аргументы в нескольких вызовах функции. Регистры и метки Регистры — несколько буферов обмена. "ayy копирует строку в регистр a , "ap вставляет из него. Регистр "+ — системный буфер обмена, "0 — последнее скопированное, даже если после этого что-то удалялось. Метки — закладки в файле. ma ставит метку, 'a возвращает к ней. Заглавные метки работают между файлами. Список переходов — Ctrl-o и Ctrl-i перемещают назад и вперёд по истории позиций, в том числе между файлами. Файлы, буферы и окна :e path/to/file открыть файл :ls список открытых буферов :b имя перейти к буферу по части имени :sp :vsp разделить окно горизонтально и вертикально Ctrl-w h/j/k/l перейти между окнами gd перейти к определению (при подключённом LSP) Neovim Neovim — ответвление Vim, которое стало самостоятельным и очень активным проектом. Для разработчиков, выбирающих терминальный редактор сегодня, чаще всего именно он. Конфигурация на Lua вместо Vimscript — быстрее и привычнее для программистов. Встроенный клиент LSP — автодополнение, переход к определению, переименование, диагностика ошибок от языковых серверов, как в IDE. Treesitter — синтаксический разбор кода для точной подсветки, текстовых объектов по структуре кода — функция, класс, аргумент — и навигации. Экосистема плагинов на Lua — менеджеры плагинов вроде lazy.nvim, поиск по файлам и тексту, интеграция с Git, отладка. Готовые сборки конфигурации позволяют получить IDE-подобное окружение без недель настройки, а затем адаптировать его под себя. -- init.lua: минимальные настройки vim.opt.number = true vim.opt.relativenumber = true vim.opt.expandtab = true vim.opt.shiftwidth = 2 vim.opt.ignorecase = true vim.opt.smartcase = true vim.opt.clipboard = 'unnamedplus' vim.g.mapleader = ' ' vim.keymap.set('n', ' leader w', ' cmd write cr ', { desc = 'Сохранить' }) Vim-режим в привычном редакторе Необязательно менять редактор, чтобы получить главное преимущество — язык команд. Режимы эмуляции Vim есть в VS Code, в IDE JetBrains и других популярных редакторах. Разработчик сохраняет отладчик, интеграции и привычные инструменты команды, а редактирование текста выполняет командами Vim. Для многих это оптимальный вариант: высокая эффективность правок без затрат на настройку всего окружения. Ограничение — эмуляция поддерживает не все возможности, и отдельные сочетания клавиш конфликтуют со стандартными командами редактора. Обычно это решается настройкой. Как освоить Vim без потери продуктивности Встроенный учебник. Команда vimtutor в терминале — интерактивный урок на полчаса, в Neovim — :Tutor . Vim-режим в текущем редакторе. Начинайте с него, а не со смены всего окружения. Первая неделя — базовые движения и режим вставки. Медленнее, чем раньше, — это нормально. Затем операторы с текстовыми объектами: ciw , di( , yap . На этом этапе появляется ощутимая польза. Точка, поиск и макросы — когда базовые команды стали автоматическими. По одному приёму за раз. Заметили, что повторяете неудобное действие, — найдите команду для него и используйте её несколько дней. Не настраивайте всё сразу. Большая чужая конфигурация без понимания основ мешает учиться. Период замедления обычно занимает от нескольких дней до пары недель. Решение об окончательном переходе разумно принимать после этого периода, а не в первые часы. Стоит ли внедрять Vim в команде Навязывать редактор команде — плохая идея. Продуктивность разработчика определяется прежде всего пониманием кода и предметной области, качеством решений и инструментами команды, а не скоростью перемещения курсора. Разумный подход: не требовать конкретного редактора, но договориться о форматировании, линтере и настройках проекта, которые работают в любом из них; хранить конфигурацию форматирования и правил в репозитории, а не в настройках редакторов; делиться приёмами в команде как опытом, а не как стандартом; базовые навыки работы с Vim полезны каждому, кто работает с серверами: на удалённой машине он часто оказывается единственным доступным редактором. Инструменты, которые действительно влияют на скорость и качество работы команды, — это договорённости о коде, автоматические проверки и ревью. О них — в статьях о Clean Code , о code review и о продвинутой работе с Git . Как устроены процессы и инструменты наших команд разработки, можно узнать на странице разработки веб-проектов . Шпаргалка на первый месяц i a o вставка перед курсором, после курсора, новой строкой Esc обычный режим h j k l влево, вниз, вверх, вправо w b e по словам 0 ^ $ начало строки, первый символ, конец строки gg G начало и конец файла dd yy p удалить строку, скопировать строку, вставить u Ctrl-r отменить и повторить ciw ci" ci( изменить слово, в кавычках, в скобках . повторить последнее изменение /текст n поиск и следующее совпадение :%s/a/b/gc замена с подтверждением v V Ctrl-v визуальный режим: символы, строки, блок :w :q :wq сохранить, выйти, сохранить и выйти Частые вопросы Vim или Neovim? Для нового пользователя, которому нужен терминальный редактор с возможностями IDE, чаще подходит Neovim благодаря встроенному LSP, Treesitter и активной экосистеме. Vim остаётся стабильным и предустановленным на многих серверах, поэтому базовые команды полезно знать в любом случае. Можно ли использовать Vim для больших проектов? Да. С языковыми серверами, поиском по проекту и интеграцией с Git Neovim работает с крупными кодовыми базами. Для отладки и специфических инструментов некоторые разработчики сочетают его с IDE или используют Vim-режим внутри IDE. Правда ли, что Vim делает разработчика быстрее? Он ускоряет редактирование и навигацию по тексту после периода освоения. Насколько это влияет на общую продуктивность, зависит от работы: разработчик, который много правит существующий код, почувствует разницу больше, чем тот, кто основную часть времени проектирует и обсуждает решения. С чего начать настройку? С минимума: номера строк, отступы, поиск без учёта регистра, системный буфер обмена. Затем добавлять плагины по мере появления конкретных потребностей — языковой сервер, поиск по файлам, интеграцию с Git. Как не мучиться с клавишей Esc? Многие переназначают Caps Lock на Esc или используют сочетание вроде Ctrl-[ , которое терминалы воспринимают как Esc. Это снимает главное неудобство при частом переключении режимов. Нужно ли знать Vim, если я работаю в IDE? Не обязательно, но базовые команды пригодятся на серверах и в терминальных утилитах, где Vim-подобное управление используется по умолчанию, — например, при просмотре журналов или редактировании сообщений коммитов.