Вы прошли тридцать три главы: от философии модального редактирования до LSP, Treesitter и git внутри редактора. Знание разрослось, и в какой-то момент мозг перестаёт держать всё сразу. Эта глава - не учебник, а рабочий справочник: плотный набор таблиц, к которому вы будете возвращаться, когда забыли точный синтаксис :cfdo, перепутали \zs с \ze или не помните, какой регистр хранит последний yank.
Главная идея, которую стоит унести из всего курса и которую эта шпаргалка лишь систематизирует: Vim - это грамматика, а не словарь. Вы не запоминаете тысячи готовых сочетаний - вы комбинируете небольшой набор операторов с движениями и текстовыми объектами. Запомнив N движений и M операторов, вы получаете N x M команд. Поэтому таблицы ниже структурированы по этому принципу: отдельно операторы (глаголы), отдельно движения и объекты (существительные), а вы соединяете их на лету.
Команды даны в семантически корректном виде. Там, где фича специфична для Neovim или Vim 9 - это отмечено явно. Подробные объяснения "почему" вынесены в соответствующие главы курса; здесь - концентрат для быстрого обращения.
Грамматика: оператор + объект
Любая команда редактирования читается как "глагол + существительное": d (delete) + iw (inner word) = diw. Это композиционное ядро всего Vim. Подробнее - главы 5 и 6.
Операторы (глаголы)
Код: Выделить всё
Команда | Действие
---------+------------------------------------------------------
d | удалить (delete)
c | изменить - удалить и войти в insert (change)
y | скопировать в регистр (yank)
> < | сдвинуть отступ вправо / влево
= | автоотступ (по equalprg/Treesitter/LSP)
gU gu | в верхний / нижний регистр
g~ | инвертировать регистр
gq gw | переформатировать по textwidth (gw сохраняет курсор)
! | прогнать через внешнюю команду (filter)
gc | закомментировать (встроено в Neovim 0.10+)
Counts (множители)
Счётчик - это множитель. 3dd удаляет 3 строки, 2d3w удаляет 6 слов (счётчики перемножаются: 3d2w == d6w). Count работает и с объектами по-разному: для парных объектов он расширяет захват наружу - 2di( удаляет содержимое 2-й объемлющей пары скобок (нативно, см. :help ib). Это поведение Vim из коробки, плагины не нужны.
Движения (motions)В своих маппингах используйте v:count1 (даёт 1, когда счётчик не задан), а не v:count (даёт 0) - иначе при вызове без префикса действие сломается. Подробнее в главе 22.
Движение задаёт, куда дотянется оператор. Подробно - глава 3.
Код: Выделить всё
Клавиша | Движение
---------------+------------------------------------------------------------
h j k l | влево / вниз / вверх / вправо
w W | вперёд к началу слова / WORD
e E | вперёд к концу слова / WORD
b B | назад к началу слова / WORD
ge gE | назад к концу слова
0 ^ $ | начало строки / первый непробел / конец строки
g_ | последний непробельный символ строки
f{c} F{c} | к символу {c} вперёд / назад (курсор на нём)
t{c} T{c} | до символа {c} вперёд / назад (курсор перед ним)
; , | повторить последний f/t/F/T вперёд / назад
{ } | предыдущий / следующий абзац (пустая строка)
( ) | предыдущее / следующее предложение
% | к парной скобке ()[]{}
gg G | начало / конец файла
{n}G или :{n} | к строке n
H M L | верх / середина / низ видимого экрана
Ctrl-d Ctrl-u | полэкрана вниз / вверх
Ctrl-f Ctrl-b | страница вперёд / назад
zz zt zb | прокрутить так, чтобы курсор был в центре / сверху / снизу
Объекты курсор-независимы и идеально дружат с dot-repeat (.). Пара i (inner, внутри) и a (around, включая ограничители). Подробно - глава 6.
Код: Выделить всё
Объект | Что выделяет
-------------------+------------------------------------
iw / aw | слово / слово с пробелом
iW / aW | WORD / WORD с пробелом
is / as | предложение
ip / ap | абзац
i( i) ib / a(... | внутри скобок / со скобками
i{ i} iB / a{... | внутри фигурных / с фигурными
i[ i] / a[ a] | внутри квадратных
i< i> / a< a> | внутри угловых
i" i' i / a"... | внутри кавычек / с кавычками
it / at | содержимое HTML/XML-тега / с тегом
Код: Выделить всё
ci( изменить содержимое скобок
da{ удалить блок вместе с фигурными скобками
yi" скопировать содержимое кавычек
gUiw uppercase слова под курсором
dit удалить содержимое тега
cap переписать абзац
Точка-команда и повторяемостьВ Neovim 2026 объекты расширяются плагином mini.ai: добавляет варианты "следующий/предыдущий/последний" - in/an (inner/around next), il/al (last), а опция search_method управляет тем, какой объект выбирать (ближайший/следующий/предыдущий, 'cover_or_next' и т.п.). Для AST-точности (функция, класс, параметр) - nvim-treesitter-textobjects (af/if, ac/ic). Подробнее - главы 6 и 27.
Код: Выделить всё
Команда | Действие
---------------------------+-----------------------------------------------------------------------------------------------------------------------------------
. | повторить последнее изменение
u / Ctrl-r | undo / redo
U | отменить все правки на строке
& | повторить последнюю :s на строке
@: | повторить последнюю команду :
g- g+ | перемещение по дереву undo по состояниям
:earlier {N} / :later {N} | навигация по дереву undo по времени: :earlier 10m (10 минут назад), :later 1h; также {N}f (по файловым записям), {N} (по правкам)
Принцип: предпочитайте text objects (ciw) motion-командам (cw) - . ведёт себя предсказуемо, потому что объект не зависит от позиции курсора. Подробно - глава 7.:earlier/:later особенно удобны с undofile (persistent undo): после переоткрытия файла можно "отмотать" состояние на N минут/часов назад, даже не зная числа шагов.
Регистры
Регистр - именованный буфер обмена. Префикс "{reg} перед операцией. Подробно - глава 8.
Код: Выделить всё
Регистр | Содержимое
---------+--------------------------------------------------
" | unnamed - последний yank/delete
0 | только последний yank (не затирается удалениями)
1-9 | история удалений (1 - самое свежее)
a-z | именованные (заглавные A-Z - дописывают)
+ * | системный буфер обмена
_ | blackhole - "чёрная дыра", ничего не сохраняет
% | имя текущего файла
: | последняя :-команда
/ | последний поисковый паттерн
= | regex-выражение ("=2+2<CR>p)
. | последний вставленный текст
Код: Выделить всё
"ayy скопировать строку в регистр a
"ap вставить из регистра a
"+y скопировать в системный буфер
"_d удалить без засорения регистров
Ctrl-r a (в insert/cmdline) вставить регистр a
Код: Выделить всё
было: foo bar (нужно заменить bar на содержимое буфера)
yiw на foo -> "0p поверх bar (через viw"0p), либо vnoremap <leader>p "_dP
Метки и прыжкиNeovim 0.10+: при работе по SSH OSC52 включается автоматически, если опция clipboard НЕ задана. Выставление clipboard=unnamedplus глушит авто-OSC52. Для удалёнки лучше оставить clipboard пустым и пользоваться явными "+y/"+p. Подробнее - глава 8.
Подробно - глава 9.
Код: Выделить всё
Команда | Действие
-------------------+------------------------------------------------
m{a-z} | поставить метку в буфере (локальная)
m{A-Z} | глобальная метка (между файлами, в shada)
{m} | прыгнуть на позицию метки
'{m} | прыгнуть на строку метки
/ '' | назад к позиции до последнего прыжка
. / ^ | последнее изменение / позиция выхода из insert
dm{x} | удалить метку (:delmarks)
Ctrl-o / Ctrl-i | назад / вперёд по jumplist
g; / g, | назад / вперёд по changelist
:jumps / :changes | показать списки
ПоискNeovim: vim.o.jumpoptions = 'stack,view' - stack делает jumplist как tag-стек (хвост отбрасывается при прыжке из середины), view восстанавливает положение окна. Заглавные метки A-Z - лёгкая нативная замена Harpoon для закладок по файлам проекта.
Подробно - глава 10.
Код: Выделить всё
Команда | Действие
-----------+----------------------------------------------------------------------------
/pat ?pat | поиск вперёд / назад
n N | следующее / предыдущее совпадение
* # | искать слово под курсором вперёд / назад
g* g# | то же, но без границ слова
gd gD | к локальному / глобальному объявлению переменной (текстовый поиск, не LSP)
gn gN | выделить следующее совпадение last search
Код: Выделить всё
Префикс | Режим
---------+----------------------------------------------------+-------
\v | very magic - PCRE-подобный, ()/{}/+/?/ | без \
\m | magic (дефолт)
\M | nomagic
\V | very nomagic - почти литерал (пути, спецсимволы)
Код: Выделить всё
/foo \zsbar\ze baz найдёт только "bar", окружённое foo и baz
Подробно - глава 11.
Код: Выделить всё
:[range]s/pat/repl/[flags]
Код: Выделить всё
Часть | Значение
------------+-------------------------------------------
range | % весь файл, '<,'> выделение, 5,20 строки
Флаг g | все вхождения в строке
Флаг c | подтверждать каждое
Флаг i / I | игнорировать / учитывать регистр
Флаг e | не ругаться, если паттерн не найден
& или \0 | всё совпадение в замене
\1-\9 | ссылки на группы
\u \U..\E | следующий / диапазон в верхний регистр
\l \L..\E | в нижний регистр
\=expr | замена выражением (submatch(n))
Код: Выделить всё
:%s/\v(\w+) (\w+)/\2 \1/g поменять местами пары слов
:%s/\v(\d+)/\=submatch(1)*2/g удвоить все числа
:'<,'>s/foo/bar/g заменить в выделении
Код: Выделить всё
* задать паттерн словом под курсором
cgn изменить следующее совпадение
. повторить для следующего (пропустить - n)
Команда :globalNeovim: set inccommand=split даёт живой предпросмотр :s по мере набора, открывая превью-окно с off-screen совпадениями. Это Neovim-специфичная фича, в классическом Vim её нет.
:g - движок пакетного редактирования. Подробно - глава 12.
Код: Выделить всё
:[range]g/pat/cmd выполнить cmd на строках, совпавших с pat
:[range]g!/pat/cmd (= :v) на НЕ совпавших
Код: Выделить всё
Рецепт | Действие
------------------+----------------------------------
:g/pat/d | удалить совпавшие строки
:v/pat/d | удалить все, кроме совпавших
:g/pat/m$ | собрать совпадения в конец файла
:g/pat/t. | продублировать совпавшие строки
:g/pat/normal @q | прогнать макрос q по совпадениям
:g/pat/s/x/y/g | заменить только в нужных строках
:sort - базовый инструмент массового редактирования, соседствует с :g и :s. Подробно - глава 12.
Код: Выделить всё
:[range]sort[!] [flags] [/pat/]
Код: Выделить всё
Форма | Действие
---------------+------------------------------------------------------------------
:sort | сортировать строки (range, по умолчанию весь файл)
:sort! | в обратном порядке
:sort u | сортировать и убрать дубли (unique)
:sort n | числовая сортировка (по первому числу в строке)
:sort i | без учёта регистра
:sort /pat/ | сортировать по тексту после совпадения pat (ключ - хвост строки)
:sort /pat/ r | сортировать по самому pat (ключ - совпадение)
:'<,'>sort | сортировать только выделенные строки
Буферы, окна, вкладки
Подробно - глава 13.
Буферы
Код: Выделить всё
Команда | Действие
----------------+-----------------------------------------
:e file | открыть файл
:ls / :buffers | список буферов
:b {n/name} | переключиться на буфер
:bn :bp | следующий / предыдущий
:bd | закрыть буфер
Ctrl-^ | переключиться на "альтернативный" буфер
Код: Выделить всё
Команда | Действие
---------------------+---------------------------------------+---------------------------------
Ctrl-w s / Ctrl-w v | split горизонтальный / вертикальный
Ctrl-w h/j/k/l | переход между окнами
Ctrl-w q / Ctrl-w o | закрыть / оставить только текущее
Ctrl-w = | уравнять размеры
Ctrl-w _ / Ctrl-w \ | | максимизировать высоту / ширину
Ctrl-w +/-/</> | изменить размер
Ctrl-w r / Ctrl-w x | повернуть / поменять окна
Код: Выделить всё
Команда | Действие
----------------------+-------------------------
:tabnew | новая вкладка
gt / gT | следующая / предыдущая
{n}gt | к вкладке n
:tabclose / :tabonly | закрыть / оставить одну
Базовые команды записи/чтения файлов в командном режиме. Подробно - глава 13.
Код: Выделить всё
Команда | Действие
--------------+---------------------------------------------------
:w | записать текущий буфер
:w file | записать в указанный файл
:saveas file | записать как и переключить буфер на новое имя
:wq / :x | записать и выйти (:x пишет только при изменениях)
:wa | записать все изменённые буферы
:wqa / :xa | записать все и выйти
:q / :q! | выйти / выйти без сохранения (отбросить правки)
:qa / :qa! | закрыть все окна / выйти без сохранения всего
ZZ / ZQ | (normal) записать и выйти / выйти без сохранения
:e! | перечитать файл с диска, отбросив изменения
Подробно - глава 14.
Код: Выделить всё
Команда | Действие
-------------------+------------------------------------------
:copen / :cclose | открыть / закрыть quickfix
:cnext :cprev | следующая / предыдущая запись
:cfirst :clast | первая / последняя
:cc {n} | перейти к записи n
:colder / :cnewer | предыдущий / следующий список (история)
:cdo {cmd} | команда на каждую запись
:cfdo {cmd} | команда на каждый файл
:Cfilter /pat/ | сузить quickfix (нужен :packadd cfilter)
:grep!/:lgrep! | наполнить quickfix/location list поиском
Замена по всему проекту (обратите внимание на :cfdo, не :cdo, для s///g):
Код: Выделить всё
:grep! TODO
:copen
:cfdo s/TODO/DONE/ge | update
МакросыНастройка под ripgrep: set grepprg=rg\ --vimgrep\ --smart-case и set grepformat=%f:%l:%c:%m. Подробнее - главы 14 и 15.
Подробно - глава 16.
Код: Выделить всё
Команда | Действие
--------------+----------------------------------------------
q{a-z} | начать запись в регистр
q | остановить запись
@{a-z} | проиграть макрос
@@ | повторить последний макрос
{n}@a | проиграть n раз
qaq | очистить регистр a (перед рекурсией)
:put a / "ap | вставить макрос для редактирования как текст
Код: Выделить всё
:%normal @a на каждую строку файла
:'<,'>normal @a на выделение
:g/pat/normal @a только на совпавших строках
Визуальный режим
Подробно - глава 17.
Код: Выделить всё
Команда | Действие
-----------------+---------------------------------------------
v | посимвольный visual
V | построчный visual
Ctrl-v | блочный (столбцовый) visual
gv | восстановить прошлое выделение
o | переключиться на другой конец выделения
I / A (в блоке) | вставка перед / после блока на всех строках
r{c} | заменить всё выделение символом
u U ~ | регистр выделения
: | начать :-команду с '<,'>
Код: Выделить всё
было (3 строки): foo
bar
baz
Ctrl-v jj I// <Esc>
стало: //foo
//bar
//baz
Подробно - глава 18.
Код: Выделить всё
Команда | Действие
-----------------+-----------------------------------------------------------------------------------
i a / I A | вставка до/после курсора / в начале/конце строки
o O | новая строка ниже / выше
gi | вернуться в insert на месте последней правки
Ctrl-w | удалить слово слева
Ctrl-u | удалить до начала строки
Ctrl-r {reg} | вставить регистр
Ctrl-r = | вставить результат выражения
Ctrl-a / Ctrl-@ | Ctrl-a - вставить текст последней вставки; Ctrl-@ - то же + сразу выйти из insert
Ctrl-t / Ctrl-d | увеличить / уменьшить отступ
Ctrl-o {cmd} | выполнить одну normal-команду и вернуться
Ctrl-v {code} | вставить символ по коду (Ctrl-v u00e9)
Ctrl-k {di} | digraph (Ctrl-k a: -> ä)
Ctrl-n / Ctrl-p | автодополнение по словам буфера
Свёртки (folding)Neovim 0.11+: Ctrl-s в insert вызывает signature help LSP. Neovim 0.12: опция 'autocomplete' даёт нативный insert-mode автокомплит без плагинов (экспериментально).
Подробно - глава 19.
Код: Выделить всё
Команда | Действие
------------+-----------------------------------------
za | переключить свёртку под курсором
zo / zc | открыть / закрыть свёртку
zR / zM | открыть / закрыть все свёртки
zr / zm | уменьшить / увеличить foldlevel на 1
zj / zk | к следующей / предыдущей свёртке
zf{motion} | создать свёртку (при foldmethod=manual)
zd | удалить свёртку
Ключевые опции конфига (init.lua)Neovim с Treesitter: foldmethod=expr, foldexpr=v:lua.vim.treesitter.foldexpr(), foldlevel=99 - структурные свёртки по AST. Подробнее - глава 27.
Разумные дефолты 2026. Подробно - глава 20. Синтаксис Neovim Lua; в классическом Vim - set option=value в .vimrc.
Код: Выделить всё
Опция | Зачем
------------------------------------+-------------------------------------------------
number + relativenumber | прыжки числом (8j), вместо повтора j
expandtab, shiftwidth=2, tabstop=2 | отступы пробелами
ignorecase + smartcase | поиск без регистра, но чувствителен к заглавным
incsearch, hlsearch | инкрементальный поиск, подсветка
scrolloff=8 | поля прокрутки вокруг курсора
undofile | persistent undo между сессиями
signcolumn=yes | колонка для git/LSP-знаков не "дёргает" текст
splitright, splitbelow | предсказуемое направление split
termguicolors | 24-битный цвет
updatetime=250 | отзывчивость CursorHold (git/LSP)
inccommand=split | живой предпросмотр :s (только Neovim)
jumpoptions=stack,view | здравый jumplist (только Neovim)
Must-have плагины 2026
Каждый разобран в соответствующей главе; здесь - карта для быстрого выбора.
Код: Выделить всё
Плагин | Роль | Глава
---------------------------------------+--------------------------------------------------------+-------
lazy.nvim | менеджер плагинов с lazy-loading | 23
vim.pack (ядро 0.12) | встроенный менеджер без зависимостей (нет lazy-load) | 23
Нативный LSP (vim.lsp.config/enable) | LSP без плагина-фреймворка | 25
nvim-lspconfig | каталог дефолтных конфигов серверов | 25
mason.nvim + mason-lspconfig | установка серверов, авто-enable | 25
blink.cmp (пин v1) | быстрый автокомплит, дефолт LazyVim | 26
nvim-treesitter (ветка main) | парсеры/подсветка/structural | 27
mini.ai / nvim-treesitter-textobjects | расширенные text objects | 6, 27
mini.surround / nvim-surround | окружение (sa/sd/sr) | 6
conform.nvim | format-on-save (один владелец) | 20
which-key.nvim | дискаверабилити leader-маппингов | 21
telescope / fzf-lua / snacks.picker | fuzzy-поиск | 28
gitsigns.nvim + neogit/lazygit | git в буфере + полный клиент | 29
oil.nvim | файловый менеджер как буфер | 15
grug-far.nvim | интерактивный find&replace по проекту | 14
LazyVim / kickstart.nvim | дистрибутив / обучающий старт | 30
- Нативный LSP вместо lspconfig.setup{}. В Neovim 0.11+ настраивайте серверы через vim.lsp.config('clangd', {...}) и включайте vim.lsp.enable({...}). Конфиги из ~/.config/nvim/lsp/<server>.lua подхватываются автоматически. Старый require('lspconfig').xxx.setup{} - legacy, будет удалён в nvim-lspconfig v3.0.0. Дефолтные кейбинды уже встроены: grn (rename), gra (code action), grr (references), gri (implementation), gO (symbols), K (hover), [d/]d (диагностика).
- Диагностику включайте явно. После 0.11 virtual_text стал opt-in: vim.diagnostic.config({ virtual_text = true }) (или virtual_lines = { current_line = true }).
- Treesitter - ветка main на Neovim 0.12. Старый master заморожен; main - несовместимый rewrite, требует tree-sitter-cli через системный пакетник. Подсветку включают вручную через vim.treesitter.start() в FileType-autocmd; ensure_installed удалён - парсеры ставятся через install() / :TSInstall.
- Пиньте blink.cmp на v1 (version = '1.*' или branch = 'v1'): v2 в разработке, ломающие изменения и зависимость blink.lib.
- lazy-loading через триггеры, не lazy=true вслепую: event/ft/cmd/keys. Не делайте ленивой цветовую схему и библиотеки (plenary) - гонка загрузки.
- Коммитьте lockfile (lazy-lock.json или nvim-pack-lock.json) для воспроизводимости между машинами.
- Один владелец форматирования на язык - либо LSP, либо conform.nvim, иначе двойное форматирование и дёрганье.
- Vim everywhere для закрепления навыка: set -o vi в shell, IdeaVim (.ideavimrc + source ~/.vimrc), Vimium в браузере. Подробно - глава 31.
- Опытным Vim-юзерам не мигрировать на Neovim без причины: на серверах Vim легче и почти везде предустановлен. Держите оба.
- :cdo вместо :cfdo для s///g. :cdo бьёт по каждой записи, поэтому файл с N совпадениями обработается N раз. Для substitute берите :cfdo.
- Забытое сохранение после :cdo/:cfdo. Изменения висят в буферах; добавляйте | update в саму команду.
- clipboard=unnamedplus по SSH глушит авто-OSC52 - текст не уходит в локальный буфер. Оставьте clipboard пустым или форсируйте vim.g.clipboard = 'osc52'.
- Ловушка yank/delete. После yiw любое d/x затирает unnamed-регистр, и p вставит удалённое. Спасает регистр 0 (только yank) или blackhole "_d.
- mapleader после загрузки плагинов - плагины забиндят keys на старый \. Ставьте leader первым.
- Рекурсивный макрос с непустым регистром выполнит старое содержимое. Очищайте qaq перед записью.
- Паттерн в скрипте без \v/\m/\M/\V ломается у пользователя с нестандартной magic. Фиксируйте режим явно.
- s/// без флага e в :cfdo прерывается на первом файле без совпадений (E486). Добавляйте e.
- ensure_installed в spec для nvim-treesitter main - поле удалено, тихо игнорируется. Используйте install() API.
- Старый require('lspconfig').setup{} на 0.11+ дублирует нативный API и даёт deprecation warning.
- Грамматика на лету. Не подглядывая, выведите команды для: "изменить содержимое ближайших кавычек", "удалить абзац вместе с пустой строкой", "привести слово к верхнему регистру", "скопировать содержимое фигурного блока". Затем проверьте себя по таблицам объектов и операторов.
- Замена по проекту. В тестовом проекте из нескольких файлов наполните quickfix через :grep! oldName, сузьте список :Cfilter по нужному пути и выполните :cfdo s/oldName/newName/ge | update. Убедитесь, что изменения сохранились во всех файлах.
- Регистры без потерь. Скопируйте слово (yiw), затем удалите другое слово, и вставьте первое из регистра 0 ("0p). Сравните с p из unnamed - почувствуйте разницу.
- Макрос + диапазон. Запишите макрос, который оборачивает строку в кавычки и добавляет запятую, затем примените его ко всем строкам выделения через :'<,'>normal @a. Повторите тот же результат через рекурсивный макрос и сравните, какой подход чище.
- Позиционный regex. Дан текст key = "value". Напишите :s с \zs/\ze, которая заменит только содержимое кавычек, не трогая сами кавычки и ключ.
- Конфиг-аудит. Откройте свой init.lua. Проверьте: leader задан до плагинов? vim.loader.enable() включён? Lockfile в git? Если используете LSP - это нативный vim.lsp.config/enable или legacy setup{}? Treesitter на ветке main?
- Vim - это грамматика: оператор + движение/объект. Запомнив N движений и M операторов, вы владеете N x M командами. Учите паттерн, а не комбо.
- Text objects (iw, i(, it, ap) предпочтительнее motion-команд - они курсор-независимы и дружат с ..
- Регистры разделяйте: 0 для надёжного yank, _ для удалений без засорения, + для системного буфера.
- :global, :substitute, quickfix + :cfdo - три кита массового редактирования. Не путайте :cdo и :cfdo.
- Макросы масштабируются через :normal по диапазону или паттерну - чаще чище рекурсии.
- В Neovim 2026 базовый IDE-функционал переехал в ядро: нативный LSP (0.11), Treesitter и автокомплит (0.12). Конфиги стали "тише" - многие фичи (virtual_text) теперь opt-in.
- Эта шпаргалка - отправная точка. Настоящая беглость приходит не от чтения таблиц, а от ежедневной практики: берите 1-2 новые команды в неделю и сознательно применяйте их в реальной работе. План обучения - глава 33.