Про поиск в Vim
Решившись наконец поразбираться с реализацией поиска в Виме, в очередной
раз был поражён тому, насколько мощный передо мной текстовый редактор.
Казалось бы поиск - он и в Африке поиск! Но размер страницы справочника по
шаблонам поиска в 1296 строк заставил задуматься. Относительно меньше, но всё равное
много занимает страница руководства по непосредственно поиску. Я не буду
пересказывать и переводить это, но попробую кратко рассказать о том,
что показалось интересным и каким приёмами пользуюсь я сам.
Поиск в открытых файлах
Что бы найти какую-либо строку в открытом файле достаточно в нормальном режиме
набрать
/somestring что бы искать с начала файла, либо
?somestring - с конца.
n/N - переместит курсор к следующему вхождению строки.
[I - недавнее открытие :)
Позволяет быстро просмотреть строки, в которых содержится искомое слово.
Вместо того, что бы набирать запрос поиска, можно нажать
*/# и Вим переместит вас
на место первого вхождения слова под курсором аналогично "старшим" командам.
Иногда бывает нужно найти строку, содержащую либо foo, либо bar. В таком случае
можно использовать возможность альтернатив в поиске
/foo\|bar.
\| по сути оператор
OR,
\& в свою очердь -
AND.
Поиск по файловой системе
Признаюсь, долгое время я избегал использовать встроенную поддержку grep в Виме. Открывал
ещё одно окно/вкладку терминала и запускал
grep -R -A ... *. Не могу объяснить почему :)
Тем не менее, настал момент переучиваться.
В Виме есть 2 механизма поиска по файлам: встроенный "греп" vimgrep и обычный вызов
знаменитой утилиты. Встроенный механизм поиска по файлам хорош в первую очередь тем,
что работает везде, где и сам Вим. Также декларируется такая полезная штука как
автоматическое распознавание кодировки файла и какой формат окончания строки используется.
Но в том же время вимовский объективно медленнее обычного грепа. Более того, тем, кто
привык пользоваться последним сразу же будет непривычно использовать встроенный и указывать
его параметры. В качестве эксперимента поищем строку domXss в 5036 файлах проекта w3af.
- vimgrep domXss **/* занял около 13 секунд
- grep -R domXss * занял около 1 секунды
Результат говорит сам за себя! Если вам по каким-то причинам не хочется использовать утилиту
grep, то есть возможность установкой 'grepprg' задать вызов другой программы, которая
позволяет выводить результат своей работы в grep-подобном формате.
И встроенный поиск и внешний выводят свои результаты и позволяют по ним переходить
через т.н. окно ошибок (его можно увидеть на снимке экрана). По нажатию Enter на строке
в окне ошибок открывается файл на месте с найденной строкой.
- copen/cclose - открываем/закрываем окно ошибок
- cnext/cprevious - перемещаемся к следующему/предыдущему результату
Окно ошибок входит в интересную концепцию быстрой правки (:help quickfix), которая есть в Виме.
Этот псевдорежим призван ускорить рутинные действия: "правка-компилирование-правка".
Как вы уже догадались, это же окно ошибок используется главным образом именно для навигации
по выхлопу компилятора и быстрого исправления обнаруженных ошибок.
Полезности в конфиге
Обычно я ищу без учёта регистра букв, поэтому добавляю в конфиг следующую строку:
set ignorecase
При этом, всё-таки бывают случаи, когда необходимо явно указать регистр, для этого указываем:
set smartcase
И ищем уже примерно так:
/abCda, Вим будет искать именно в таком виде эту строку.
Мне лень набирать полностью запрос и хочется по мере набора приближаться к результату
поиска. Эта штука есть во всех уважающих себя текстовых редакторах и называется
инкрементальный поиск:
set incsearch
Результаты поиска не подсвечивать:
set nohlsearch
А это маленький хинт, который позволяет по нажатию клавиши
; сконструировать запрос на
замену слова под курсором:
nmap ; :%s/\<<c-r>=expand("<cword>")<cr>\>/
Продолжение следует...
В Вим существует понятие шаблона поиска. По сути это возможность использовать специальные
символы и подстановки для поиска сложных запросов. Кому знакомы регулярные выражения, тот
сразу поймёт в чем дело :) Думаю, что надо будет обязательно как-нибудь и на них подробно
остановиться.
Источник:http://www.allaboutvim.ru/2011/12/vim.html