20 хитростей Vim, которые изменят ваш подход к редактированию
Vim — это мощный текстовый редактор с управлением с помощью клавиатуры, встроенный практически во все системы Linux, Unix и macOS. Большинство пользователей осваивают его настолько, чтобы открывать, редактировать и сохранять файлы, и на этом останавливаются. Следующие 20 хитростей Vim, о которых мы расскажем, помогут вам выйти на новый уровень: редактирование, которое раньше занимало десять нажатий клавиш, теперь можно выполнить за два, а операции, для которых требовался скрипт, теперь выполняются автоматически.
Эффективность Vim зависит от трех факторов:
- Навигация (H/M/L, CTRL-^, f+;),
- Редактирование (:norm, gi, gv, регистр выражений),
- и Регистры («_d, восстановление макросов, Ctrl-r вставка).
В последней версии Vim 9.2 добавлено нечеткое автодополнение в режиме вставки с помощью completeopt, linematch алгоритма сравнения и путей к настройкам XDG.
А теперь давайте изучим несколько полезных приемов работы с Vim, которые изменят ваш подход к редактированию.
20 хитростей Vim: таблица быстрого доступа
| # | Команда | Что он Делает | Категория |
|---|---|---|---|
| 1 | H / M / L | Переместить курсор в верхнюю / среднюю / нижнюю часть экрана | Навигация |
| 2 | CTRL-^ | Переключение между текущим и последним буфером | Навигация |
| 3 | f{char} then ; | Перейти к следующему вхождению символа в строке; повторить | Навигация |
| 4 | :%norm A; | Добавьте ; к каждой строке в файле | Редактирование в масштабе |
| 5 | gi | Возврат к последней точке вставки в текущем буфере | Редактирование в масштабе |
| 6 | gv | Повторно выберите последнее визуальное выделение | Редактирование в масштабе |
| 7 | Ctrl-a / Ctrl-x* | Увеличение / уменьшение числа под курсором | Редактирование в масштабе |
| 8 | g Ctrl-a | Превратите столбец Visual Block в инкрементную последовательность | Редактирование в масштабе |
| 9 | «_d | Удалить, не перезаписывая регистр | Регистрирует |
| 10 | Ctrl-r {reg} | Вставить из реестра, не выходя из режима вставки | Регистрирует |
| 11 | Ctrl-r = | Открытый регистр выражений (встроенный калькулятор) | Регистрирует |
| 12 | "ap → edit → "ay | Вставьте, отредактируйте и снова скопируйте неработающий макрос | Регистрирует |
| 13 | q: | Откройте окно истории команд с возможностью поиска | История и поиск |
| 14 | q/ | Откройте окно истории поиска с возможностью поиска по ней | История и поиск |
| 15 | Ctrl-x* Ctrl-f | Автодополнение пути к файлу в режиме вставки | История и поиск |
| 16 | completeopt+=fuzzy | Более интеллектуальное автодополнение слов в режиме вставки (9.2+) | Vim 9.2 |
| 17 | linematch diff | Более точное выравнивание одинаковых строк в режиме сравнения (9.2+) | Vim 9.2 |
| 18 | XDG config path | Перенести конфигурацию в ~/.config/vim/vimrc (9.2+) | Vim 9.2 |
| 19 | :Tutor | Интерактивный обучающий плагин с поддержкой версий (9.2+) | Vim 9.2 |
| 20 | ZZ / ZQ / :%y | Сохранить-выйти / выйти без сохранения / скопировать весь файл | Micro-tips |
Эти три приема позволяют управлять курсором в большинстве случаев во время обычного сеанса редактирования. Когда они станут привычными, навигация без мыши покажется естественной уже через неделю.
Перейти к позициям на экране: H, M, L
H, M и L перемещают курсор в Верхнюю (верхнюю), Среднюю и Нижнюю (нижнюю) части видимого в данный момент экрана, а не в файл. Прокрутка не требуется.
Добавьте префикс со значением, чтобы попасть в определенную строку с этого края:
4H "переместить на 4-ю строку сверху 2L "переместить на 2-ю строку снизу
Переключение между буферами с помощью CTRL-^
При работе с двумя файлами вам не нужно вводить имя файла для переключения между ними. CTRL-^ (каноническое название в Vim; также можно нажать Ctrl-6 на клавиатуре в США) переключает между текущим буфером и альтернативным буфером, то есть между файлами, которые были открыты ранее.
Примечание: Ctrl-6 — псевдоним, зависящий от раскладки клавиатуры. На многих международных клавиатурах и некоторых эмуляторах терминалов он не запускается. CTRL-^ — надежная привязка. Если ни то, ни другое не сработает, наметьте запасной вариант: nnoremap <Leader>b <C-^>
:e config.yaml " открыть второй файл <C-^> " мгновенно вернуться к первому файлу <C-^> " снова перейти вперед
Перемещение символов с помощью f и ;
f{char} перемещает курсор к следующему вхождению {char} в текущей строке. Нажмите ; для повторного перехода или , для возврата. Для поиска в обратном направлении используйте заглавную F{char}
fa "перейдите к следующей 'a' в этой строке ; "перейдите к 'a' после этого , "вернитесь на одну позицию назад
Масштабное редактирование: больше возможностей за меньшее количество нажатий
Одна только команда :norm сэкономила мне часы при массовой нормализации конфигурационных файлов через SSH, когда нет доступа к IDE, а функция поиска и замены не справляется.
Массовое редактирование с помощью :norm
Команда :normal (сокращенная до :norm) выполняет любую последовательность действий в обычном режиме для каждой строки в указанном диапазоне. Используйте ее вместе с % для работы со всем файлом.
:%norm A; "добавляет точку с запятой в каждую строку :%norm I// "добавляет // (комментарий) в начало каждой строки :5,20norm A, "добавляет запятую только в строки с 5-й по 20-ю
Примечание: всегда просматривайте выделенный фрагмент с помощью :5,20p перед выполнением :norm для него. Эта команда мгновенно изменяет строки — отмена не предусмотрена.
Вернуться к последнему редактированию с помощью gi
gi Возвращается к точному местоположению последней вставленной в текущем буфере строки и сразу же переходит в режим вставки. Это самый быстрый способ продолжить ввод после проверки ссылки в другом месте того же файла.
gi " перейдите к последней точке вставки и начните печатать
Примечание: gi работает только в текущем буфере. Если вы хотите перейти к последней позиции вставки во всех буферах, используйте список переходов (Ctrl-o).
Повторное выделение области просмотра с помощью gv
Нажали не ту клавишу и потеряли выделенный фрагмент? gv восстанавливает последний выделенный фрагмент — с теми же началом, концом и режимом (символ, строка или блок).
gv "восстановить последнее визуальное выделение"
Увеличение и последовательное увеличение чисел
Ctrl-a прибавляет 1 к числу под курсором. Ctrl-x* вычитает 1. Добавление префикса с указанием количества:
10<C-a> " прибавить 10 к числу под курсором 3<C-x*> " вычесть 3
Здесь,
- 10<C-a> означает — введите 10 и нажмите Ctrl+a.
- 3<C-x*> означает — введите 3 и нажмите Ctrl+x*.
Чтобы создать автоинкрементную последовательность, сначала войдите в режим визуального блока с помощью Ctrl-v, выберите столбец с нулями, затем нажмите g Ctrl-a:
«До» (визуальный блок выделен с помощью Ctrl-v): 0 0 0 "После g<C-a>: 1 2 3
Регистры и буфер обмена: скрытая суперсила Vim
Регистры — это функция, которую большинство пользователей Vim игнорируют дольше всего и о которой больше всего сожалеют. Понимание даже трех из них навсегда изменит ваш подход к редактированию.
Регистр «черная дыра»: «_d
Каждое стандартное удаление (d, c, x*) перезаписывает последнее скопированное значение. Используйте «_d для отправки удаленного текста в регистр «черная дыра» — он будет удален, а ваш регистр копирования останется нетронутым.
"_dd " — удалить текущую строку; регистр не изменился "_dw " — удалить слово; регистр не изменился
Вставьте в режиме вставки с помощью Ctrl-r
В режиме вставки Ctrl-r за именем регистра следует команда для вставки его содержимого без переключения в обычный режим.
<C-r>" " вставить из безымянного (по умолчанию) регистра <C-r>a " вставить из регистра 'a' <C-r>+ " вставить из системного буфера обмена
Регистр выражений (встроенный калькулятор)
В режиме вставки Ctrl-r = открывает подсказку регистра выражений. Введите любое арифметическое выражение и нажмите Enter — результат будет вставлен в позицию курсора. Внешний калькулятор не требуется.
<C-r>=7*24<CR> " вставляет 168
<C-r>=len("hello")<CR> " вставляет 5
Исправление макросов с помощью редактирования реестра
Макросы — это просто текст, хранящийся в именованных регистрах. Если в макросе, записанном в регистре a, есть ошибка, вам не нужно записывать его заново с нуля.
"ap " 1. вставьте текст макроса в буфер " (отредактируйте текст вручную) 0"ay$ " 2. скопируйте исправленную строку обратно в регистр 'a'
Макрос исправлен и готов к повторению с помощью @a.
История, поиск и автодополнение
Окно истории команд: q:
q: открывает полноэкранный редактируемый список всех введенных вами команд Ex. Перемещайтесь по нему, как по любому буферу, редактируйте предыдущую команду и нажимайте Enter, чтобы выполнить ее.
Примечание: большинство пользователей случайно открывают q: из-за опечатки в :q. Этому стоит учиться целенаправленно — сложные :substitute или :global команды здесь гораздо проще доработать, чем перепечатывать с нуля.
Закройте окно с помощью Ctrl-c или :q внутри него.
Окно истории поиска: q/
q/ выполняет те же действия для шаблонов поиска — это важно при доработке сложного регулярного выражения, которое вы написали ранее.
q/ "открыть историю поиска по запросу q? "открыть историю поиска по запросу в обратном направлении
Автодополнение пути к файлу: Ctrl-x* Ctrl-f
При вводе пути к файлу в режиме вставки Ctrl-x* Ctrl-f запускает автодополнение с учетом файловой системы. Vim считывает текущий каталог и предлагает варианты.
/etc/nginx/<C-x*><C-f> " выводит список файлов в каталоге /etc/nginx/
Vim 9.2: что нового и что стоит попробовать
Проверка версии:
запустите :version и убедитесь, что первая строка выглядит так: VIM — Vi IMproved 9.2 прежде чем использовать советы из этого раздела.
Для всех четырех функций, описанных ниже, требуется Vim 9.2+. Поддержка Wayland в настоящее время экспериментальная, поэтому не используйте ее в рабочих средах.
Нечеткое сопоставление при автодополнении в режиме вставки
В Vim 9.2 добавлена функция нечеткого сопоставления для автодополнения в режиме вставки (Ctrl-n / Ctrl-p). Теперь не требуется строгое совпадение префикса — частичные совпадения и совпадения с символами в неправильном порядке ранжируются и отображаются. Чтобы включить эту функцию, добавьте fuzzy в completeopt:
set completeopt+=fuzzy "правильная" опция для нечеткого автодополнения в режиме вставки
Распространенная ошибка: set wildoptions=fuzzy это другая опция. Она включает нечеткое сопоставление только в подстановочном меню командной строки (клавиша Tab в приглашении :). Она не влияет на автозаполнение Ctrl-n / Ctrl-p .
Источник: github.com/vim/vim — патч 9.1.0463, runtime/doc/options.txt [Раздел: completeopt]
Алгоритм сравнения строк
В Vim 9.2 появилась опция linematch для режима сравнения. При стандартном сравнении выделяются все измененные блоки; linematch дополнительно выравнивает наиболее похожие строки внутри блока для более точной посимвольной подсветки.
set diffopt+=linematch:60 "60 — рекомендуемый порог совпадения"
Источник: github.com/vim/vim — проблема № 18185: «Рекомендуемое значение для параметра linematch — 60».
Миграция пути к конфигурации XDG
Vim 9.2 поддерживает спецификацию базового каталога XDG. Перенесите свою конфигурацию из корневого каталога домашнего каталога:
mkdir -p ~/.config/vim mv ~/.vimrc ~/.config/vim/vimrc mv ~/.vim ~/.config/vim
Vim найдет ~/.config/vim/vimrc автоматически. Дополнительная настройка не требуется. Если путь XDG отсутствует, используется ~/.vimrc
Интерактивный плагин :Tutor
. Команда :Tutor запускает в редакторе обучающий курс с учетом версии, который дополняет и модернизирует классическую команду vimtutor в командной строке.
Он охватывает возможности Vim 9.2 и адаптирует свой контент в соответствии с тем, что вы еще не освоили. Команды :Tutor и vimtutor по-прежнему доступны в версии 9.2.
:Tutor "запустите интерактивное обучение"
Микросоветы: ZZ, ZQ и :%y
| Команда | Экшен |
|---|---|
| ZZ | Записать файл и выйти (эквивалентно :wq) |
| ZQ | Уйти без объяснения причин (эквивалентно :q!) |
| :%y | Скопируйте весь файл в буфер обмена (:%y+ — для системного буфера обмена) |
Когда стоит использовать эти приемы, а когда нет
Используйте их, когда ловите себя на том, что повторяете одно и то же ручное редактирование более двух раз, просматриваете большие файлы журналов по SSH или массово форматируете исходный код.
Пропускайте их, если задача разовая, небольшая и уникальная. Целенаправленная ciw обработка с последующим повторным вводом данных выполняется быстрее, чем создание :norm конвейера для одного слова. За сложность приходится платить.
Заключение
Освоение продвинутых приёмов работы в Vim позволяет существенно повысить продуктивность при редактировании текста и кода. Большинство трюков направлены на сокращение количества действий: вместо многократных операций пользователь выполняет одну команду, что экономит время и снижает нагрузку.
Ключевая идея статьи — Vim становится по-настоящему мощным инструментом только тогда, когда пользователь выходит за рамки базовых команд и начинает использовать регистры, макросы, глобальные команды и тонкую настройку редактора. Такие возможности позволяют автоматизировать рутинные задачи и работать с большими файлами значительно быстрее.
Также важно понимать, что Vim — это не просто текстовый редактор, а полноценная среда для работы с текстом, где навигация, редактирование и поиск тесно связаны между собой. Чем глубже пользователь изучает команды и их комбинации, тем более эффективной становится его работа.
В итоге можно сказать, что регулярная практика и внедрение даже небольшого количества новых приёмов способны дать заметный прирост скорости и удобства при работе в Vim.
Часто задаваемые вопросы
В чем разница между :norm и макросом?
Макрос воспроизводит записанную последовательность действий один раз за вызов. :norm применяет последовательность действий в обычном режиме к каждой строке в диапазоне с помощью одной команды. Запись не требуется. Используйте :norm для посимвольных массовых операций, а макросы — для многоэтапных последовательностей, охватывающих несколько строк или требующих логики ветвления.
Почему в моем терминале не работает сочетание клавиш CTRL-^ (или Ctrl-6)?
Ctrl-6 — это зависящий от раскладки клавиатуры псевдоним для CTRL-^. На многих клавиатурах, отличных от американской, Ctrl+6 не приводит к появлению символа ^, который ожидает Vim. Попробуйте ввести CTRL-^ напрямую. Если ваш терминал перехватывает этот символ, добавьте пользовательское сопоставление:
nnoremap <Leader>b <C-^>
Где должен находиться мой файл vimrc в Vim 9.2?
Vim 9.2 сначала проверяет ~/.config/vim/vimrc (путь XDG), а затем возвращается к ~/.vimrc. Оба варианта работают, но путь XDG позволяет поддерживать порядок в домашнем каталоге.
Я установил wildoptions=fuzzy, но автозавершение в режиме вставки по-прежнему работает без функции fuzzy. Почему?
wildoptions=fuzzy управляет только wildmenu в командной строке (Tab в : командной строке). Для Ctrl-n/Ctrl-p нечеткого сопоставления в режиме вставки добавьте fuzzy в completeopt:
set completeopt+=fuzzy
gi привел меня в неожиданное место, не туда, куда я в последний раз заходил.
gi работает локально в буфере. Возвращает позицию последней вставки в текущем буфере. Если вы хотите перейти к позиции последней вставки во всех открытых буферах, используйте список переходов с помощью Ctrl-o вместо этого.
Совместим ли Vim 9.2 с моими существующими плагинами?
Большинство плагинов Vimscript, написанных для Vim 8.x*, совместимы. Плагины, использующие недокументированные внутренние функции, могут нуждаться в обновлении. Прежде чем переносить всю конфигурацию, протестируйте ее с минимальным vimrc (запустите Vim с vim -u NONE).
Как закрыть окно истории команд q:?
Нажмите Ctrl-c , чтобы закрыть его и вернуться на предыдущую позицию, или введите :q в окне истории, чтобы закрыть его, как любой другой буфер.
Функция linematch недоступна. При настройке diffopt возникает ошибка.
linematch требуется Vim 8.2 или более поздняя версия. Проверьте свою версию с помощью :version. В Vim 9.2 эта функция полностью стабильна. В более ранних версиях флаг linematch можно не указывать.
set diffopt+=internal,algorithm:patience » safe fallback for Vim < 8.2
Редактор: AndreyEx