Логотип

20 хитростей Vim, которые изменят ваш подход к редактированию

20 хитростей Vim, которые изменят ваш подход к редактированию

Vim — это мощный текстовый редактор с управлением с помощью клавиатуры, встроенный практически во все системы Linux, Unix и macOS. Большинство пользователей осваивают его настолько, чтобы открывать, редактировать и сохранять файлы, и на этом останавливаются. Следующие 20 хитростей Vim, о которых мы расскажем, помогут вам выйти на новый уровень: редактирование, которое раньше занимало десять нажатий клавиш, теперь можно выполнить за два, а операции, для которых требовался скрипт, теперь выполняются автоматически.

Эффективность Vim зависит от трех факторов:

  1. Навигация (H/M/L, CTRL-^, f+;),
  2. Редактирование (:norm, gi, gv, регистр выражений),
  3. и Регистры («_d, восстановление макросов, Ctrl-r вставка).

 

В последней версии Vim 9.2 добавлено нечеткое автодополнение в режиме вставки с помощью completeopt, linematch алгоритма сравнения и путей к настройкам XDG.

А теперь давайте изучим несколько полезных приемов работы с Vim, которые изменят ваш подход к редактированию.

 

20 хитростей Vim: таблица быстрого доступа

#КомандаЧто он ДелаетКатегория
1H / M / LПереместить курсор в верхнюю / среднюю / нижнюю часть экранаНавигация
2CTRL-^Переключение между текущим и последним буферомНавигация
3f{char} then ;Перейти к следующему вхождению символа в строке; повторитьНавигация
4:%norm A;Добавьте ; к каждой строке в файлеРедактирование в масштабе
5giВозврат к последней точке вставки в текущем буфереРедактирование в масштабе
6gvПовторно выберите последнее визуальное выделениеРедактирование в масштабе
7Ctrl-a / Ctrl-x*Увеличение / уменьшение числа под курсоромРедактирование в масштабе
8g Ctrl-aПревратите столбец Visual Block в инкрементную последовательностьРедактирование в масштабе
9«_dУдалить, не перезаписывая регистрРегистрирует
10Ctrl-r {reg}Вставить из реестра, не выходя из режима вставкиРегистрирует
11Ctrl-r =Открытый регистр выражений (встроенный калькулятор)Регистрирует
12"ap → edit → "ayВставьте, отредактируйте и снова скопируйте неработающий макросРегистрирует
13q:Откройте окно истории команд с возможностью поискаИстория и поиск
14q/Откройте окно истории поиска с возможностью поиска по нейИстория и поиск
15Ctrl-x* Ctrl-fАвтодополнение пути к файлу в режиме вставкиИстория и поиск
16completeopt+=fuzzyБолее интеллектуальное автодополнение слов в режиме вставки (9.2+)Vim 9.2
17linematch diffБолее точное выравнивание одинаковых строк в режиме сравнения (9.2+)Vim 9.2
18XDG config pathПеренести конфигурацию в ~/.config/vim/vimrc (9.2+)Vim 9.2
19:TutorИнтерактивный обучающий плагин с поддержкой версий (9.2+)Vim 9.2
20ZZ / ZQ / :%yСохранить-выйти / выйти без сохранения / скопировать весь файлMicro-tips

 

Эти три приема позволяют управлять курсором в большинстве случаев во время обычного сеанса редактирования. Когда они станут привычными, навигация без мыши покажется естественной уже через неделю.

Перейти к позициям на экране: H, M, L

H, M и L перемещают курсор в Верхнюю (верхнюю), Среднюю и Нижнюю (нижнюю) части видимого в данный момент экрана, а не в файл. Прокрутка не требуется.

Читать  Bash. Принятие решений с помощью операторов if Else и case

Добавьте префикс со значением, чтобы попасть в определенную строку с этого края:

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>+ " вставить из системного буфера обмена

 

Читать  Команда EGREP в Linux с примерами

Регистр выражений (встроенный калькулятор)

В режиме вставки 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 или массово форматируете исходный код.

Читать  Steam по умолчанию активирует Proton для всех игр, у которых нет собственной версии

Пропускайте их, если задача разовая, небольшая и уникальная. Целенаправленная 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

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

четыре × два =

Это может быть вам интересно


Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала