VIM поиск по тексту и замена
Великая точка g: как искать текстовые вхождения и делать замену, волшебный оператор поиска.
Для поиска в VIM по тексту есть несколько способов.
Сделаю сразу несколько замечаний:
- для подсветки при поиске желательно включить подсветку вхождений текста
set hlsearch incsearch - по умолчанию поиск регистрозависимый
set ignorecase smartcase
Это всё желательно прописать в vimrc или init.vim (если пользуетесь neovim).
Обычный поиск по тексту
Первый и частоиспользуемый способ поиска в тексте это слеш (/).
Пример: /пример.
Поиск с выполнением команд
Поиск с заменой текста или выполнением других команд начинается с двоеточия (:).
После двоеточия идёт указание диапазона применимости команды. Это может быть:
%- применение ко всему документу$- применение к концу файла15:32- применение к диапазону строк с 15-ой по 32-ю.- применение к текущей строке (можно опустить)
Далее идёт команда, например s - сокр. substitute. Затем её параметры, например слеши для разделения искомого от заменяемого.
Так же вместо слешей-разделителей можно использовать другие символы, см. Alternate delimiters for the replace command
В конце разделителей для замены могут быть использованы следующие модификаторы:
g- поиск и заменаа других вхождений в диапазонеi- не учитывать регистр, т.е. на /text/ сматчитсяtextиtExTc- перед каждой заменой будет спрашивать, заменить или нет + другие варианты =)
Полный пример: :15:$s/зачем/затем/gic.
Более подробно про регулярки VIM можно поизучать например тут: http://vimregex.com/ или :h [regexp](regexp).
Поиск с заменой
Примеры:
Замена первого вхождения текста в текущей строке (точка . опущена, можно было написать :.s/текст/новый текст/): :s/текст/новый текст/.
Для поиска и замены ПОЛНОГО вхождения текста используются операторы < и >: :s/\<текст\>/новый текст/.
Различие в том, что первый вариант заменит этоттекствот на этотновый текствот. Тогда как второй найдёт только слово (слова) “текст” и заменит.
Та самая точка G
Часто встречается задача найти и удалить строки текста по какому-нибудь критерию.
Наипростейшее решение для строк включающих символ решётки: :g/#/d.
Каждая строка (g - global), содержащая решётку, будет удалена (d - сокр. delete).
Подобное я испоьзую для удаления комментариев в json: :g#//#d
Ещё забавный пример для изменения порядка строк на обратный: :g/^/m0.
Здесь для каждой строки у которой есть начало выполняем команду move на первую (нулевую) строку.
Так как команда выполняется для каждой строки текста начиная с первой, перемещение каждой последующей строки включая последнюю будет происходить на первую строку и порядок строк поменяется.
Если решили перейти с какой-либо IDE на VIM, скорее всего заинтересует:
- Переход с PHPStorm или Intellij IDEA на VIM
- Оптимизация и ускорение редактора VIM
- Статусная строка VIM без плагинов в 5 строк
А вообще, чаще смотрите в справку VIM: :h :, :h substitute например.
Остались вопросы или есть пожелания, замечания — пишите в комментарии: