Трюки режима вставки

Рейтинг: 71.7% · 16 голосов
Исчерпывающий курс по Vim и Neovim: модальное редактирование и грамматика (операторы, движения, текстовые объекты, точка-команда), регистры, метки, макросы, поиск и :substitute, :global, буферы/окна/quickfix, визуальный режим, конфигурация на Lua, маппинги, плагины (lazy.nvim), LSP, автодополнение (blink.cmp), Treesitter, fuzzy-поиск, Git, эргономика и антипаттерны. 34 главы, актуально на 2026 (Vim 9.1, Neovim 0.11/0.12).
Ответить
Аватара пользователя
Roman_Vim
Сообщения: 34
Зарегистрирован: 11 май 2026, 05:31

Трюки режима вставки

Сообщение Roman_Vim »

Оглавление курса (34)
  1. Философия Vim: модальное редактирование и почему это актуально в 2026
  2. Установка и выживание: первый запуск, режимы, как выйти
  3. Перемещение по тексту: движения как основа эффективности
  4. Базовое редактирование: вставка, удаление, копирование
  5. Грамматика Vim: операторы + движения = команды
  6. Текстовые объекты: оперируем структурой, а не символами
  7. Точка-команда и повторяемость: "один штрих, чтобы повторить"
  8. Регистры: продвинутая работа с буфером обмена
  9. Метки и прыжки: навигация по истории перемещений
  10. Поиск: /, ?, *, # и магия паттернов
  11. Замена :substitute и регулярные выражения Vim
  12. Команда :global - оружие массового редактирования
  13. Буферы, окна и вкладки: организация рабочего пространства
  14. Quickfix и location list: пакетная работа по всему проекту
  15. Навигация по файлам: netrw, fuzzy-поиск и проекты
  16. Макросы: автоматизация повторяющихся правок
  17. Визуальный режим и блочное редактирование
  18. Трюки режима вставки (вы здесь)
  19. Свёртки, автодополнение и аббревиатуры (встроенные)
  20. Конфигурация с нуля: init.lua и разумные дефолты 2026
  21. Маппинги: leader, which-key и здравые привычки
  22. Скриптинг: основы Vimscript и Lua для Neovim
  23. Менеджеры плагинов: lazy.nvim и lazy-loading
  24. Neovim в 2026: чем отличается и почему выбирают
  25. LSP в Neovim: умные возможности языка
  26. Автодополнение 2026: blink.cmp против nvim-cmp
  27. Treesitter: точная подсветка и структурное редактирование
  28. Fuzzy-поиск: Telescope, fzf-lua и snacks.picker
  29. Git внутри редактора: fugitive, gitsigns и lazygit
  30. Дистрибутивы, отладка и терминал: быстрый старт и интеграции
  31. Vim повсюду: IDE, браузер и shell
  32. Эргономика и антипаттерны: как не навредить себе и не застрять
  33. Рабочие рецепты, тренажёры и план обучения
  34. Шпаргалка-справочник: все ключевые команды одним списком
Большинство пользователей Vim воспринимают режим вставки как "обычный текстовый редактор внутри Vim": вошёл по i, набрал текст, вышел по <Esc>. Это рабочая, но крайне расточительная привычка. На самом деле режим вставки - это полноценная мини-среда со своим набором горячих клавиш на базе Ctrl, которая позволяет вставлять регистры и выражения, дополнять текст по словам/строкам/файлам, исправлять отступы, управлять гранулярностью отмены и даже выполнять одиночные команды нормального режима - не покидая ввода. А по соседству, в командной строке, живут родственные <C-r>-команды для захвата слова из-под курсора.

Зачем это нужно? Каждый выход в нормальный режим и возврат обратно - это разрыв потока: руки уходят с домашнего ряда, фокус мысли смещается с "что я пишу" на "как я навигируюсь". Трюки insert-режима убирают этот разрыв для самых частых микрозадач. Набираете и поняли, что нужно вставить только что скопированное имя переменной? <C-r>0 - и продолжаете печатать. Опечатались в начале слова? <C-w> стирает слово целиком. Нужно дополнить длинное имя функции? <C-n> подберёт его из открытых буферов. Это не "продвинутая магия для гиков", а базовая гигиена эффективного ввода.

В этой главе мы пройдём весь арсенал: вставку регистров, одиночные команды нормального режима, удаление слов и строк, управление отписами, и главное - встроенное автодополнение с его подрежимом Ctrl-X. Завершим вводом спецсимволов через Ctrl-V и диграфы.
Договоримся об обозначениях: <C-r> означает Ctrl+r. Большинство сочетаний этой главы работают в режиме вставки. Отдельно отметим: у <C-r> есть "родственники" в командной строке Vim (вставка слова/файла/строки из-под курсора) - у них своя справка (c_CTRL-R_*), и в insert-режиме они не действуют. Мы явно проговорим, где какой контекст.
Вставка содержимого: <C-r> и его варианты

Регистры мы подробно разбирали в главе 8. В режиме вставки их можно вставлять без выхода в нормальный режим - командой <C-r>{регистр}.

После <C-r> Vim ждёт имя регистра и вставляет его содержимое прямо в точку курсора, как будто вы его набрали. Это особенно ценно, когда вы в потоке набора кода и вспомнили, что нужное значение уже лежит в буфере.

Код: Выделить всё

Сочетание  |  Что вставляет
-----------+------------------------------------------------------------
<C-r>0     |  Регистр 0 - последний *yank* (не затрагивается удалениями)
<C-r>"     |  Безымянный регистр (последний yank/delete)
<C-r>+     |  Системный буфер обмена
<C-r>%     |  Имя текущего файла
<C-r>/     |  Последний поисковый паттерн
<C-r>:     |  Последняя выполненная команда :
<C-r>=     |  Результат вычисления выражения (см. ниже)
<C-r>a     |  Содержимое именованного регистра a
Почему <C-r>0 - любимый рецепт? Регистр 0 хранит только последний yank и не перезаписывается операциями d/c/x. То есть классическая боль "скопировал слово, потом что-то удалил, а p вставил удалённое" здесь не возникает: <C-r>0 всегда отдаёт именно то, что вы намеренно копировали.

Код: Выделить всё

Скопировали имя: yiw на user_name (попало в "0)
Печатаем:        const  -> <C-r>0 -> const user_name
Регистр-выражение <C-r>=

<C-r>= открывает мини-командную строку, куда вы вводите выражение Vimscript, а его результат вставляется в текст. Это калькулятор прямо в потоке набора:

Код: Выделить всё

Печатаем:  Итого:  -> <C-r>= -> 19*1.2<CR> -> Итого: 22.8
Можно дёргать функции: <C-r>=strftime('%Y-%m-%d')<CR> вставит сегодняшнюю дату, <C-r>=expand('%:t')<CR> - имя файла без пути.

Литеральная вставка: <C-r><C-r> и <C-r><C-o>

Обычный <C-r> вставляет регистр так, будто текст набран с клавиатуры - а значит, на него влияют 'autoindent', аббревиатуры и опции форматирования. Для многострочного кода это иногда ломает отступы. Чтобы вставить регистр дословно, есть варианты:
  • <C-r><C-r>{рег} - вставляет содержимое буквально, без обработки "как при наборе" (аббревиатуры, авто-раскладка). Но учтите: форматирование по 'textwidth'/'formatoptions' всё ещё применяется.
  • <C-r><C-o>{рег} - вставить регистр буквально и без автоотступа (ведёт себя как paste средней кнопкой мыши; для построчного регистра вставляет над текущей строкой, как P). Это самый "дословный" вариант - никакого автоотступа и форматирования.
  • <C-r><C-p>{рег} - вставляет с исправлением отступа под текущее окружение.
На практике: если многострочная вставка "съезжает лесенкой" из-за раскладки как-при-наборе - <C-r><C-r>. Если же мешает само форматирование (отступ, перенос по 'textwidth') и нужна полностью буквальная вставка - берите <C-r><C-o>.

<C-r><C-w> и друзья: захват слова из-под курсора (это командная строка, не insert)

Важное уточнение, в котором часто путаются. Сочетания <C-r><C-w>, <C-r><C-a>, <C-r><C-f>, <C-r><C-l> захватывают слово/WORD/имя файла/строку из-под курсора - но это команды командной строки Vim (:, /, ?), а не режима вставки. В insert-режиме после <C-r> Vim ждёт имя регистра, а <C-w> регистром не является (там работают лишь <C-r><C-r>, <C-r><C-o>, <C-r><C-p> из раздела выше). Их справка - c_CTRL-R_CTRL-W и соседние (см. :help cmdline.txt).

Стоя курсором на слове в нормальном режиме, вы открываете командную строку и подтягиваете это слово:

Код: Выделить всё

Сочетание (в командной строке)  |  Что вставляет
--------------------------------+-----------------------------------------------------------------------------------------------
<C-r><C-w>                      |  Слово под курсором (word)
<C-r><C-a>                      |  WORD под курсором - непрерывная последовательность непробельных символов (включая пунктуацию)
<C-r><C-f>                      |  Имя файла под курсором
<C-r><C-l>                      |  Текущую строку целиком
Главное применение - поиск и замена без копипасты. Встаньте курсором на имя переменной и наберите:

Код: Выделить всё

:%s/<C-r><C-w>//g      -> паттерн уже заполнен словом из-под курсора
Так же удобно с :g, :vimgrep, / и ?: /<C-r><C-w> мгновенно ищет слово под курсором.

<C-o>: одна команда нормального режима

<C-o> - это "выгляни в нормальный режим ровно на одну команду и вернись". Vim выполняет следующую введённую команду как нормальную, после чего автоматически возвращает вас в insert ровно туда, где вы были.

Зачем? Чтобы не делать ритуал <Esc> -> команда -> i/a ради одного движения или правки.

Код: Выделить всё

Печатаем длинную строку, нужно вставить пустую строку выше:
... текущий текст| -> <C-o>O -> курсор уходит на новую строку выше
Полезные применения:
  • <C-o>D - удалить всё от курсора до конца строки и продолжить печатать.
  • <C-o>zz - отцентрировать экран, не прерывая ввод.
  • <C-o>0 - прыгнуть в начало строки одним движением (а <C-o>$ - в конец).
  • <C-o>p - вставить регистр через нормальный p (с его семантикой) посреди ввода.
Важный нюанс: если <C-o> стоит в самом конце строки, курсор после возврата окажется "за последним символом" - это специальное виртуальное положение режима вставки, и это нормально.

Удаление на лету: <C-w>, <C-u>, <C-h>

Стирать набранное по одному символу <BS> - медленно. В insert-режиме есть "оптовые" удаления, знакомые всем по shell (readline):

Код: Выделить всё

Сочетание  |  Действие
-----------+----------------------------------------------
<C-h>      |  Удалить символ слева (то же, что <BS>)
<C-w>      |  Удалить слово слева от курсора
<C-u>      |  Удалить до начала набранного / начала строки
Эти команды - мышечная память, которая переносится в shell (bash/zsh), браузерные поля ввода и большинство Unix-окружений. <C-w> стирает слово, <C-u> - строку.

Код: Выделить всё

Опечатались в имени:
function calculuate( -> <C-w> -> function | -> дописываем calculate(
Тонкость про <C-u> и <C-w>: по умолчанию они не дают стереть текст, который был в строке до входа в режим вставки (поведение управляется опцией 'backspace'). В современных Neovim и Vim 9 'backspace' по умолчанию выставлен в indent,eol,start, поэтому удаление работает "как ожидаешь" - сквозь точку входа, через переносы строк и автоотступ. Если на старом Vim <C-w> упирается в невидимую стену - проверьте :set backspace?.

Гранулярный undo: <C-g>u

По умолчанию весь текст, набранный за одну сессию вставки (от i до <Esc>), откатывается одним u целиком. Иногда это неудобно: вы написали абзац, а отменить хотите только последнее предложение - но u сносит всё.

<C-g>u ставит разрыв в последовательности undo прямо посреди ввода, не выходя из режима вставки. После него последующий u остановится на этой точке, а не отмотает всю сессию.

Код: Выделить всё

Сочетание  |  Действие
-----------+------------------------------------------------------------------------------------------
<C-g>u     |  Разорвать undo-последовательность (начать новый шаг отмены)
<C-g>U     |  Не разрывать undo при следующем движении курсора (чтобы . и undo вели себя предсказуемо)
Самое практичное применение - сделать "крупные" удаления <C-w> и <C-u> отменяемыми по отдельности. По умолчанию <C-w>, стерев слово, и продолженный набор попадают в один шаг undo, и случайно стёртое слово не вернуть, не потеряв набранное после. Частая практика 2026 - переопределить эти клавиши так, чтобы перед ними вставлялся разрыв:

Код: Выделить всё

inoremap <C-w> <C-g>u<C-w>
inoremap <C-u> <C-g>u<C-u>
Теперь каждое <C-w>/<C-u> - отдельная точка отмены: промахнулись со стиранием - один u возвращает слово, не трогая остальной ввод. Тот же приём часто вешают на <CR> (inoremap <CR> <C-g>u<CR>), чтобы каждая строка абзаца откатывалась независимо.

Повтор вставленного: <C-a> и <C-@>

Внутри одной сессии вставки доступны два "повторителя":

Код: Выделить всё

Сочетание  |  Действие
-----------+------------------------------------------------------
<C-a>      |  Вставить текст, введённый в предыдущей сессии insert
<C-@>      |  То же, что <C-a>, но сразу выйти в нормальный режим
<C-a> повторяет ровно тот текст, что вы напечатали в последний раз, когда были в режиме вставки. Удобно, когда один и тот же фрагмент нужно вбить в нескольких местах: напечатали один раз, перешли в новую точку, i<C-a>.

<C-@> (это Ctrl+@, на многих раскладках Ctrl+Space) делает то же и моментально возвращает в нормальный режим - то есть "вставь предыдущий ввод и всё". Будьте аккуратны: на некоторых терминалах <C-@> совпадает с нулевым байтом и может вести себя неожиданно; <C-a> надёжнее.
Не путайте insert-режимный <C-a> с нормальным <C-a> (инкремент числа под курсором) - это разные команды в разных режимах.
Отступы прямо из вставки: <C-t> и <C-d>

Поправить отступ строки, не выходя из ввода:

Код: Выделить всё

Сочетание  |  Действие
-----------+-------------------------------------------------------------
<C-t>      |  Добавить один уровень отступа (shiftwidth) к текущей строке
<C-d>      |  Убрать один уровень отступа
0<C-d>     |  Снести весь отступ строки до нуля
^<C-d>     |  Снести отступ на этой строке, но восстановить на следующей
Эти команды двигают всю текущую строку, независимо от позиции курсора, и шагают на величину 'shiftwidth'. Это куда удобнее, чем выходить в нормальный режим ради >>/<<.

Код: Выделить всё

Печатаем тело if, строка недо-отступлена:
return result;| -> <C-t> -> Tabreturn result;|
Автодополнение в режиме вставки: <C-n>, <C-p> и подрежим <C-x>

Это самая мощная часть главы. Vim умеет дополнять текст прямо при наборе встроенными средствами - без единого плагина.

Базовое дополнение по словам: <C-n> / <C-p>

Начните печатать слово и нажмите:
  • <C-n> - дополнить следующим подходящим словом (next);
  • <C-p> - дополнить предыдущим (previous).
Vim ищет кандидатов по источникам, заданным опцией 'complete' (по умолчанию - текущий буфер, другие буферы, словари, теги). Появляется всплывающее меню; повторные <C-n>/<C-p> листают варианты, <C-y> подтверждает выбор (yes), <C-e> отменяет и возвращает набранное (end/escape completion).

Код: Выделить всё

Печатаем:  calc -> <C-n> -> меню: calculateTotal / calculateTax / ...
           ещё <C-n> листает, <C-y> принимает
Подрежим <C-x>: точечное дополнение

После <C-x> Vim входит в подрежим дополнения, где следующая клавиша выбирает источник. Это позволяет дополнять не "чем попало из буфера", а конкретным видом данных:

Код: Выделить всё

Сочетание                |  Источник дополнения
-------------------------+---------------------------------------------------------------------
<C-x><C-n> / <C-x><C-p>  |  Слова только из текущего файла
<C-x><C-i>               |  Ключевые слова из текущего и включённых файлов (#include и т.п.)
<C-x><C-l>               |  Целые строки (whole-line completion)
<C-x><C-f>               |  Имена файлов и путей из ФС
<C-x><C-d>               |  Определения и макросы (по #define, из текущего и включённых файлов)
<C-x><C-o>               |  Omni-дополнение (умное, по 'omnifunc')
<C-x><C-u>               |  Пользовательское дополнение через 'completefunc'
<C-x><C-]>               |  Дополнение по тегам (tags)
<C-x><C-k>               |  По словарю ('dictionary')
<C-x><C-t>               |  По тезаурусу ('thesaurus')
<C-x><C-s>               |  Орфографические варианты (нужен 'spell')
<C-x><C-v>               |  Команды командной строки Vim
Отдельно стоят источники, которые задаются опцией 'complete' (это та же опция, по которой работает обычный <C-n>/<C-p>): <C-x><C-u> зовёт вашу функцию из 'completefunc', тогда как <C-x><C-o> - функцию из 'omnifunc'. На практике LSP в Neovim вешается на omnifunc, а completefunc остаётся под ваши собственные источники.

И ещё пара пунктов подрежима <C-x>, которые не дополняют текст, но полезны рядом:

Код: Выделить всё

Сочетание                |  Действие
-------------------------+---------------------------------------------------------------------------------------------------------------------
<C-x><C-e> / <C-x><C-y>  |  Прокрутить окно вверх/вниз на строку, не выходя из режима вставки
<C-x><C-z>               |  Остановить текущее дополнение, оставив текст как есть (в отличие от <C-e>, который откатывает к набранному вручную)
Несколько из них вы будете использовать постоянно.

<C-x><C-l> - дополнение целой строкой. Незаменимо, когда нужно повторить уже существующую строку (лог-вызов, импорт, повторяющийся паттерн). Печатаете начало строки, <C-x><C-l> находит во всех буферах строки с таким префиксом.

Код: Выделить всё

Печатаем:  import { -> <C-x><C-l> -> меню всех строк, начинающихся так
<C-x><C-f> - дополнение путей. Печатаете начало пути, и Vim предлагает файлы и каталоги относительно текущей директории. Идеально для import, require, include и любых ссылок на файлы.

Код: Выделить всё

Печатаем:  ./src/comp -> <C-x><C-f> -> ./src/components/ ...
<C-x><C-o> - omni-дополнение. Это "умное" дополнение, понимающее синтаксис языка через 'omnifunc'. В классическом Vim его поставляют ftplugin'ы (например, для CSS, HTML), а в Neovim с подключённым LSP omnifunc автоматически указывает на vim.lsp.omnifunc - то есть <C-x><C-o> отдаёт полноценные LSP-подсказки без всякого nvim-cmp/blink.cmp.
Neovim 0.11+: встроенное LSP-дополнение включается per-buffer через vim.lsp.completion.enable() (обычно в autocmd LspAttach), после чего работает уже автоматически по мере набора. А Neovim 0.12 (релиз - март 2026) принёс нативный insert-автокомплит через стабильную опцию 'autocomplete' (vim.o.autocomplete) - без сторонних движков. Подробно про LSP и современные движки дополнения - в главе 25 и главе 26. Встроенные механизмы из этой главы остаются фундаментом: понимать <C-x>-подрежим полезно, даже если поверх стоит плагин.
Навигация по меню дополнения

Код: Выделить всё

Клавиша        |  Действие в открытом меню
---------------+--------------------------------------------------------
<C-n> / <C-p>  |  Следующий / предыдущий кандидат
<C-y>          |  Подтвердить выбранный
<C-e>          |  Закрыть меню и откатить к тому, что вы набрали вручную
<C-x><C-z>     |  Закрыть меню, но оставить уже выбранный текст как есть
<C-x><C-x>...  |  Сменить источник, не закрывая дополнение
Разница между <C-e> и <C-x><C-z> тонкая, но важная: <C-e> отменяет вставку и возвращает ваш ручной ввод, а <C-x><C-z> останавливает дополнение, сохраняя выбранный вариант - удобно, когда подходящее слово уже подставлено и вы просто хотите выйти из меню и печатать дальше.

Поведение меню управляется опцией 'completeopt' (например, menuone,noselect - показывать меню даже для одного варианта и не выбирать его автоматически).

Спецсимволы: <C-v> и диграфы

Иногда нужно ввести символ, которого нет на клавиатуре, или вставить управляющий символ буквально.

<C-v> - литеральный ввод

<C-v> говорит "следующий ввод - буквально". Применения:
  • Управляющие символы. <C-v><Esc> вставляет реальный символ Escape (^[), <C-v><Tab> - настоящий таб, <C-v><CR> - символ возврата каретки. Это критично при редактировании макросов как текста (см. главу 16).
  • По коду символа. Числа после <C-v> задают код:
  • <C-v>065 - десятичный код -> A
  • <C-v>u00e9 - Unicode (4 hex-цифры) -> é
  • <C-v>U0001F600 - Unicode (8 hex) -> эмодзи
  • <C-v>x41 - hex-код -> A

Код: Выделить всё

Печатаем:  cafe -> <C-v>u0301 -> café (комбинируемый акут)
<C-v> против <C-q>. Это синонимы: i_CTRL-Q делает ровно то же, что i_CTRL-V. Зачем дубликат? Во многих терминалах (и в эмуляторах с включённым flow control) Ctrl+V перехватывается системой - классически под "вставку" (paste) или под XON/XOFF, - и до Vim сочетание просто не доходит. В такой ситуации используйте <C-q>: оно работает идентично, но обычно не перехватывается. Если <C-v><Tab> "ничего не делает" - первым делом попробуйте <C-q><Tab>.
<C-k> - диграфы

Диграфы - это мнемонические двухсимвольные имена для спецсимволов. <C-k>{симв1}{симв2} вставляет соответствующий знак. Список всех доступных - командой :digraphs.

Код: Выделить всё

Ввод     |  Результат             |  Мнемоника
---------+------------------------+-----------------------
<C-k>a:  |  ä                     |  a + умляут
<C-k>e'  |  é                     |  e + акут
<C-k>->  |  стрелка вправо        |  мнемоника со стрелкой
<C-k>Co  |  ©                     |  copyright
<C-k><-  |  стрелка влево         |  парная стрелка
<C-k>14  |  ¼                     |  дробь
<C-k>OK  |  галочка (check mark)  |  OK
<C-k>SE  |  §                     |  section
Диграфы читабельнее, чем запоминать Unicode-коды: <C-k>e' куда понятнее, чем <C-v>u00e9.

Лучшие практики 2026
  • Не выходите в нормальный режим ради мелочей. Вставка регистра (<C-r>), одна команда (<C-o>), удаление слова (<C-w>) - всё это дешевле полного цикла <Esc>...i. Сознательно ловите себя на ритуале "вышел-сделал-вернулся" и заменяйте его insert-командой.
  • <C-r>0 для надёжной вставки yank. Поскольку регистр 0 не перезаписывается удалениями, <C-r>0 спасает от классической ловушки yank/delete. Для системного буфера - <C-r>+. В Neovim 0.10+ при работе по SSH + авто-подхватывает OSC52, так что <C-r>+ часто работает "из коробки" без xclip/wl-clipboard (детали - в главе 8).
  • <C-x><C-f> вместо угадывания путей. При написании импортов и ссылок на файлы дополнение по ФС исключает опечатки в путях и экономит память на структуре проекта.
  • <C-x><C-l> для повторяющихся строк дешевле копипасты и не засоряет регистры.
  • Опирайтесь на нативный LSP-omnifunc в Neovim. Даже без плагина-движка <C-x><C-o> (или включённое vim.lsp.completion.enable() в 0.11+) даёт рабочее семантическое дополнение. Полноценный движок ставьте, когда нужны сниппеты, ранжирование и UX (см. главу 26) - но не как обязательную замену встроенного.
  • Настройте 'completeopt' под себя. menuone,noselect - разумный дефолт 2026: меню показывается всегда, ничего не выбирается автоматически, вы осознанно жмёте <C-n>/<C-y>.
  • Гранулярный undo через <C-g>u. Повесьте inoremap <C-w> <C-g>u<C-w> и аналогично для <C-u> и <CR>, чтобы крупные удаления и абзацы откатывались по отдельности, а не всей сессией вставки.
  • Если <C-v> не срабатывает - берите <C-q>. В терминалах Ctrl+V часто перехвачен под paste/flow control; <C-q> делает то же самое и обычно проходит.
  • Диграфы вместо запоминания кодов. Для типографики (->, ©, - , "") <C-k> читабельнее и быстрее, чем <C-v>u.....
Частые ошибки
  • <C-r> ломает отступ при многострочной вставке. Обычный <C-r> пропускает текст через autoindent. <C-r><C-r>{рег} убирает раскладку "как при наборе", но форматирование ('textwidth'/'formatoptions') всё ещё применяется. Для полностью буквальной вставки без автоотступа используйте <C-r><C-o>{рег}.
  • Путают insert-<C-a> (повтор ввода) и normal-<C-a> (инкремент числа). Это разные команды в разных режимах. В insert <C-a> повторяет предыдущую сессию набора.
  • <C-w>/<C-u> "упираются в стену" на старом Vim. Причина - опция 'backspace'. Проверьте :set backspace?; в Neovim/Vim 9 дефолт indent,eol,start уже корректен.
  • <C-@> ведёт себя странно в терминале. На ряде терминалов Ctrl+@ = нулевой байт. Если повтор нужен без выхода - берите <C-a>.
  • Ждут, что omni-дополнение "само знает" язык. <C-x><C-o> работает только если задан 'omnifunc'. В Neovim это обеспечивает LSP; в чистом Vim - ftplugin или ваша функция. Без omnifunc меню будет пустым.
  • Считают, что нужен nvim-cmp/blink.cmp для любого дополнения. Базовое <C-n>/<C-x>-дополнение встроено и не требует ничего. Плагины добавляют UX, а не саму возможность.
  • <C-x><C-f> ищет относительно неожиданного каталога. По умолчанию пути считаются от текущего рабочего каталога Vim, а не от каталога файла. Проверяйте :pwd, если предложения "не те".
Упражнения
  1. Вставка регистров. Скопируйте слово через yiw, затем удалите другое слово через diw. В режиме вставки наберите строку, используя <C-r>0 и <C-r>" - убедитесь, что 0 отдаёт скопированное, а " - удалённое.
  2. Одна команда нормального режима. Печатая длинную строку, посреди ввода добавьте пустую строку выше через <C-o>O, затем отцентрируйте экран через <C-o>zz, не выходя из режима вставки.
  3. Дополнение путём. Создайте пару вложенных каталогов с файлами. В новом буфере напишите require(' и через <C-x><C-f> дойдите дополнением до нужного файла, не печатая путь руками.
  4. Дополнение строкой. Напишите три похожие строки логирования. На четвёртой наберите общий префикс и вызовите <C-x><C-l>; пролистайте кандидатов <C-n> и подтвердите <C-y>.
  5. Захват слова. Встаньте курсором на имя переменной в нормальном режиме, войдите в командную строку :%s/ и вставьте слово через <C-r><C-w>, дополнив команду замены.
  6. Спецсимволы. Введите строку cafe, превратите e в é через диграф <C-k>e'. Затем вставьте стрелку <C-k>-> и символ копирайта <C-k>Co. Сравните с вводом тех же символов через <C-v>u.....
Главное из главы
  • Режим вставки - это полноценная среда с Ctrl-командами, а не просто "ввод текста".
  • <C-r>{рег} вставляет регистр; <C-r>0 - надёжный yank, <C-r>+ - системный буфер, <C-r>= - выражение. Для дословной вставки - <C-r><C-r>, а полностью без автоотступа/форматирования - <C-r><C-o>. Захват слова из-под курсора (<C-r><C-w> и друзья) - это командная строка, а не insert.
  • <C-o> выполняет одну команду нормального режима и возвращает в insert.
  • <C-w>/<C-u> удаляют слово/строку; <C-t>/<C-d> правят отступ; <C-a> повторяет предыдущий ввод. <C-g>u ставит точку отмены посреди вставки для гранулярного undo.
  • Автодополнение встроено: <C-n>/<C-p> по словам, подрежим <C-x> выбирает источник - <C-x><C-l> (строки), <C-x><C-f> (файлы), <C-x><C-o> (omni/LSP), <C-x><C-u> (completefunc), <C-x><C-i> (включённые файлы), <C-x><C-d> (определения). <C-y> подтверждает, <C-e> откатывает, <C-x><C-z> останавливает с сохранением выбора; <C-x><C-e>/<C-x><C-y> скроллят окно не выходя из вставки.
  • <C-v> вводит символ буквально или по коду; <C-k> - диграфы для типографики.
  • В Neovim omni-дополнение питается от LSP; современные движки (глава 26) - это надстройка над встроенным механизмом, а не замена ему.
👍4 ❤️3 🔥3 😄 🤔2
Аватара пользователя
mounir
Сообщения: 1
Зарегистрирован: 30 май 2026, 03:17

Re: Трюки режима вставки

Сообщение mounir »

о, вот теперь дошло почему у меня вечно p вставлял какую-то фигню после удаления. сидел на безымянном регистре, а надо было <C-r>0. спасибо, реально боль всей жизни закрыли
👍 ❤️1 🔥 😄 🤔1
Аватара пользователя
golangenjoyer
Сообщения: 1
Зарегистрирован: 08 июн 2026, 07:52

Re: Трюки режима вставки

Сообщение golangenjoyer »

Roman_Vim писал(а):inoremap <C-w> <C-g>u<C-w>
вот это маст хэв, поставил себе сразу и на <C-u> и на <CR>. до этого один промах со стиранием слова и весь абзац u сносил, бесило жутко
👍4 ❤️ 🔥 😄 🤔
Аватара пользователя
henery
Сообщения: 2
Зарегистрирован: 24 май 2026, 15:41

Re: Трюки режима вставки

Сообщение henery »

а у меня <C-x><C-o> упорно показывал пустое меню, думал сломалось. оказалось omnifunc не подцепился потому что LspAttach не сработал на этом типе файла. как навесил lsp - сразу заработало без всякого cmp
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
lmikles
Сообщения: 1
Зарегистрирован: 12 май 2026, 09:46

Re: Трюки режима вставки

Сообщение lmikles »

короткий вопрос про <C-r><C-w> - я правильно понял что в самом инсерте оно НЕ работает, только в командной строке после двоеточия или слеша? а то пробовал в режиме вставки и vim просто ждал имя регистра
👍3 ❤️ 🔥 😄 🤔
Аватара пользователя
tattoo000
Сообщения: 1
Зарегистрирован: 27 май 2026, 09:37

Re: Трюки режима вставки

Сообщение tattoo000 »

кайф что <C-x><C-f> от pwd считает а не от файла. полдня не мог понять почему пути не те предлагает, а у меня :pwd в корне проекта торчал. в общем смотрите :pwd если предложения мимо
👍1 ❤️ 🔥 😄 🤔1
Ответить
← Предыдущая глава
Визуальный режим и блочное редактирование
Следующая глава →
Свёртки, автодополнение и аббревиатуры (встроенные)

Все главы курса «Vim и Neovim: модальное редактирование от основ до современного Neovim»

Поделиться темой: ✈ Telegram VK

Вернуться в «Vim и Neovim: модальное редактирование от основ до Neovim 2026»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость