Поиск в Vim: приёмы, настройки и шпаргалка
Внимание: все примеры, команды и инструкции в этом материале проверены на Ubuntu 14.04 с Vim 7.4.
Введение
Vim — мощный текстовый редактор с огромным набором функций. Поиск текста и шаблонов занимает центральное место среди этих функций: он нужен при чтении кода, исправлении ошибок, рефакторинге и навигации по большим файлам. В этой статье мы рассмотрим не только базовые приёмы, но и полезные настройки, трюки, чек-листы для разных ролей и готовую шпаргалку команд.
Базовые операции поиска
Перед началом поиска выйдите из режима Insert в Normal Mode. Основные приёмы поиска:
- /pattern — поиск вперед от текущей позиции вниз по файлу
- ?pattern — поиск назад от текущей позиции вверх по файлу
- n — перейти к следующему совпадению в направлении поиска
- N — перейти к предыдущему совпадению
- ggn — перейти к первому совпадению в файле
- GN — перейти к последнему совпадению в файле
Пример. Чтобы найти слово linux, в Normal Mode наберите:
/linuxНажмите Enter, и курсор окажется на первом найденном совпадении. Нажимайте n для перехода к следующему совпадению.
Если вы начали поиск с ?, то n будет двигаться по направлению назад, а N — вперед.
Настройка поиска
Подсветка совпадений
Чтобы визуально выделять все совпадения, включите подсветку:
:set hlsearchЧтобы временно убрать подсветку найденного, выполните:
:nohlsearchИгнорирование регистра
По умолчанию поиск регистрозависимый. Включите игнорирование регистра:
:set ignorecaseМожно временно переопределять поведение с помощью спецсимволов в строке поиска: добавляйте \C для чувствительности к регистру и \c для игнорирования регистра в конкретном запросе.
Умный регистр
Комбинация ignorecase + smartcase делает поиск регистронезависимым, если в запросе нет заглавных букв, и регистрозависимым, если есть хотя бы одна заглавная:
:set ignorecase
:set smartcaseПример: поиск /LINUX найдёт только LINUX, а /linux найдёт LINUX и linux.
Инкрементальный поиск
Показывает совпадения в процессе набора запроса:
:set incsearchИнкрементальный поиск полезен для быстрого визуального подбора шаблона.
Отключение цикличного поиска
По умолчанию поиск оборачивается по файлу. Отключите это поведение:
:set nowrapscanВключить обратно:
:set wrapscanПолезные трюки и приёмы
- Поиск слова под курсором: нажмите * в Normal Mode. Это ищет слово под курсором вперед. Для поиска назад используйте #.
- Частичный поиск под курсором: нажмите g (нажмите g, затем ), чтобы искать вхождения как части слова.
- Вставить слово под курсором в командную строку поиска: введите /, затем Ctrl-r Ctrl-w. Это вставит слово под курсором для редактирования перед поиском.
- Быстрое копирование найденных строк в список quickfix: используйте :vimgrep /pattern/ */.c или :vimgrep /pattern/ % для текущего файла, затем :copen.
- Поиск и замена с подтверждением:
:%s/old/new/gcФлаги: g — глобально в строке, c — спрашивать подтверждение для каждого совпадения.
- Используйте \V в начале паттерна для very nomagic режима, если не хотите экранировать многие символы:
/\Va+b*c- Для регулярных поисков по множеству файлов полезны внешние инструменты в сочетании с Vim: grep, ag, rg, а затем :copen для результата.

ALT: Скриншот подсветки совпадений поиска в Vim

ALT: Скриншот результата поиска с опцией ignorecase

ALT: Скриншот группированных результатов поиска внизу окна Vim
Шпаргалка команд: кратко
- /pattern — поиск вперед
- ?pattern — поиск назад
- n — следующее совпадение
- N — предыдущее совпадение
- — искать слово под курсором вперед
- g* — частичный поиск под курсором
- :set hlsearch — включить подсветку
- :nohlsearch — выключить подсветку
- :set ignorecase — игнорировать регистр
- :set smartcase — умный регистр
- :set incsearch — инкрементальный поиск
- :set nowrapscan — отключить оборачивание
- /\cpattern — поиск с игнорированием регистра для конкретного запроса
- /\Cpattern — заставить чувствительность к регистру для конкретного запроса
- :%s/old/new/gc — замена с подтверждением
Когда тактика поиска может не подойти
- Большие двоичные файлы или минимально форматированные логи — встроенный поиск менее удобен: используйте внешние инструменты вроде ripgrep (rg) или grep для предварительной фильтрации.
- Поиск сложных многострочных шаблонов — стандартный поиск Vim не работает с многострочными регулярными выражениями в одном простом /pattern. Для многострочных сопоставлений лучше применять :vimgrep с расширенными регулярными выражениями, внешние утилиты или плагины.
- При работе с кодовой базой, где много совпадений в разных файлах, лучше комбинировать поиск по проекту и навигацию через quickfix или плагины типа fzf и ctags.
Альтернативные подходы
- Внешние инструменты поиска: ripgrep (rg), the_silver_searcher (ag), grep. Преимущество — скорость и удобство поиска по проекту. Результат можно открыть в Vim через :copen или использовать плагины интеграции.
- Плагины: fzf.vim, vim-grepper, ack.vim — дают более удобный интерфейс для поиска по проекту и перехода к совпадениям.
- Использование ctags/ctags поддерживает семантическую навигацию по символам и функциям, а не только текстовый поиск.
Ментальные модели: как думать о поиске в Vim
- «Поиск как указатель»: /pattern — это не только способ найти слово, но и быстрый способ переместить точку редактирования к месту, где вы хотите работать.
- «Фильтрация перед редактированием»: сначала сузьте область поиска внешним инструментом, затем открывайте только релевантные файлы в Vim.
- «Проверка перед заменой»: всегда используйте режим подтверждения (c) для замены в неочевидных или критичных местах.
Playbook: безопасный поиск и замена в проекте
- Найдите все совпадения по проекту через ripgrep:
rg --no-heading --line-number 'pattern' > matches.txt- Просмотрите matches.txt и убедитесь, что паттерн соответствует ожидаемому контексту.
- В Vim запустите :vimgrep для результатов по файлам проекта:
:vimgrep /pattern/ **/*
:copen- Откройте :copen и проходите совпадения, выполняя замены локально с :s или глобально с подтверждением :%s/old/new/gc.
- Выполните тесты проекта и откатите изменения, если что-то пошло не так.
Критерии приёмки
- Все критические тесты проходят после замены
- Нет незапланированных изменений в файлах с внешними зависимостями
- Резервная ветка или коммит создан до массовой замены
Чек-листы для ролей
Разработчик:
- Использовать :set hlsearch для визуальной проверки
- Пробегать совпадения с n и N
- Перед массовой заменой делать коммит или ветку
Системный администратор:
- Для логов предпочесть внешние утилиты типа rg
- При работе с конфигами делать резервную копию
Технический писатель:
- Для правки терминологии искать оба регистра терминов или включать ignorecase
- Использовать :%s/old/new/gc для точного контроля правок
Примеры и сценарии использования
- Найти функцию foo в проекте и перейти к её определению:
:vimgrep /\v^\s*def\s+foo\b/ **/*.py
:copen- Заменить табы на 2 пробела в текущем файле:
:%s/\t/ /g- Быстро вставить слово под курсором в поиск и изменить его:
- Поставьте курсор на слово
- Нажмите /
- Нажмите Ctrl-r Ctrl-w
- Отредактируйте при необходимости, Enter
Частые ошибки и как их избежать
- Ошибка: забыли выйти из Insert Mode и попытались ввести /. Решение: нажмите Esc.
- Ошибка: провели замену без резервной копии. Решение: всегда коммитьте перед глобальными заменами.
- Ошибка: не учли регистр. Решение: используйте smartcase или явные \c/\C.
Советы по производительности
- Для очень больших проектов используйте ripgrep или ag и интегрируйте их с Vim через плагины.
- Ограничивайте поиск по маске файлов, например */.js, чтобы не просматривать ненужные бинарники и зависимости.
Сопутствующие заметки по совместимости
Примеры в этой статье были проверены на Ubuntu 14.04 и Vim 7.4. В более новых версиях Vim и Neovim поведение большинства команд совпадает, но отдельные плагины и возможности могут отличаться. Если вы используете Neovim, плагины интеграции с внешними инструментами часто работают ещё быстрее.
Краткое резюме
- Начните с базовых команд /, ?, n, N
- Настройте :set hlsearch, ignorecase и smartcase для комфортной работы
- Для массовой замены используйте подтверждение с флагом c и делайте резервные коммиты
- Для поиска по проекту предпочитайте внешние инструменты и интеграцию через :vimgrep или плагины
Спасибо за чтение. Попробуйте включить одну опцию и потренировать её в реальных файлах. Если знаете другие полезные приёмы — поделитесь в комментариях.
Похожие материалы
Как включить камеру на Mac
Устранение Fatal Application Exit в Resident Evil 7
Уменьшение фонового шума микрофона
Ускорение загрузок в Microsoft Store на Windows
YouTube Kids: настройка безопасности и родительский контроль