Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Особые команды поиска

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

Нашли!
Нашли!

* — ищет вниз слово под курсором. Может предваряться повторителем — тогда ищет соответствующее вхождение (второе, третье и т.п.). Если под курсором нет слова-идентификатора (см. iskeyword), то ищется первое такое слово правее курсора в данной строке; если нет и его, ищется слово из любых непробельных символов по тем же правилам. Но только в данной строке. Хотя найтись слово может, конечно, где угодно в тексте. Так, если у вас написано !!! Francesca !!! и вы нажмете * на первом восклицательном знаке, то будет искаться имя девушки, а если просто !!! !!!, то три восклицательных знака. Используется ignorecase, то есть учет или игнорирование регистра символов работает как и при обычном поиске. А вот smartcase не учитывается, так что если ignorecase выставлен, то слово ищется без учета регистра, даже если в образце есть заглавные буквы. В регистре / будет слово в обрамлении якорей "граница слова": \<word\>. Повторный поиск через n и N, соответственно, будет работать ожидаемо.

# — то же самое, но ищет вверх. Если есть на клавиатуре знак фунта (£), он тоже так может.

g* и g# — делают то же, но не добавляют к шаблону границы слов, так что "слово" 42 найдется и в 421, и в 642, и в 6421. А слово sех, как я уже говорил в другой заметке, найдется и в sехuаlitу, и в Еssех, и в аsехuаl.

gd — ищет локальное объявление идентификатора (слова, по сути). Вим будет искать вверх по тексту начало функции в синтаксисе Си. Если найдет, то будет искать ниже пустую строку. А после нее уже будет искать слово под курсором, пропуская при этом комментарии.

В простом тексте или на языке не си-подобного синтаксиса просто ищется первое вхождение слова. Повтор поиска (n) будет идти вниз.

gD — ищет глобальное объявление. Всегда начинает с первой строки, комментарии пропускаются.

Обе команды можно предварить числом 1: 1gd или 1gD. В этом случае слово не ищется в {}-блоках, которые закончились до курсора.

Проиллюстрируем все команды на примере:

1 {int number=0}
2 int number=0;
3 void main()
4 {
5
6 int number;
7 //number
8 number+=1;
9 }

Курсор стоит на строчке 8 (с +=) на слове number. Команда # переместит его на строчку 7 на то же слово. Команда gd найдет определение на строчке 6, проигнорировав комментарий. Здесь важна пустая строка 5 и что скобка { на отдельной строке 4. А gD прыгнет на строчку 1. Команда 1gd в данном случае сработает как gd, а вот 1gD перейдет на строку 2, проигнорировав блок на строке 1. Команда * перейдет через низ и найдет number на строке 1.

Есть ещё изощренная команда [-<C-I> (нажимаем скобку, потом одновременно control, shift и i), которая ищет первую строку, содержащую слово под курсором, заглядывая в include-файлы по пути. Начинает с начала данного файла. Если инклюдов нет, похожа на gD. А команды [i и [I покажут первую строку/все строки, которые содержат слово под курсором. Если заменить скобку на ] в этих командах, поиск начнется с позиции курсора. Подробнее см. в материале про команды квадратных скобок.

Можно отметить команды поиска символа в данной строке: f прыгает на символ правее курсора, F прыгает влево, t и T делают то же, но сам символ не захватывают. Команды , и ; повторяют поиск в том же и обратном направлении. Эти команды учитывают раскладку, что и логично.

Наконец, есть команды vimgrep и lvimgrep, которые ищут шаблон в указанных файлах. Можно указать % в качестве файла и искать только в текущем. vimgrep поместит список найденных строк в QuickFix, который позволяет удобно перемещаться по найденному (:cnext, :cprev), а lvimgrep — в локальный список для буфера, так что в каждом редактируемом файле может быть свой список найденного.

Общий вид команды:

:vimgrep! /поиск/gj file

Без флага g каждая строка с совпадение добавляется один раз. С регистром всё так же, как у команды *. Флаг j предотвращает прыжок на первое совпадение. Восклицательный знак разрешает переход в другой файл (если вы их указали много), даже если текущий не сохранен. Перед командой можно указать число, ограничивающее число совпадений. Так, :1vimgrep ищет до первого совпадения.

Еще в качестве поиска можно использовать замену с подтверждением:

:%s/что ищем//gc

Ключ g предписывает искать всё (а не только первое вхождение на строке), а ключ c означает "подтверждать каждую замену". Подтверждать мы ничего не будем, у нас другие цели, а будем либо продолжать поиск (ответ n) либо завершим поиск (ответ q). Такой прием позволяет искать по диапазону строк, по выделенным строкам, можно искать только первое вхождение, есть и еще возможности, о которых мы поговорим в другой раз. Например, можно запомнить найденное...

В следующей заметке обсудим замену подробнее.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022