Привет, коллеги. Сегодня мы обсудим стандартную (идущую в поставке) возможность Вим, которая, однако, отключена по умолчанию. Это плагин MatchIt. В поставке Вим идут несколько плагинов, в том числе и этот, очень удобный при работе с программным кодом. Особенно в языках, активно использующих открывающие и закрывающие ключевые слова: Фортран, Тех, bash, HTML, Паскаль и т.п. См. ниже.
Плагин отключен из соображений совместимости, но накладки еще поискать надо. Лучше его включить из .vimrc, добавив туда строчку
packadd! matchit
Можно сделать это и из командной строки Вим. Если вам он не нужен прямо сейчас (ну, пишете стихи или на Си), то мешать тоже не будет.
Для правильной работы необходимо еще включить файловые плагины, чтобы для распознанного типа файлов были определено все необходимое:
filetype plugin on
Можно тоже в .vimrc
Никаких визуальных эффектов не будет, но появится несколько удобных команд, в том числе %. Обычно команда % перемещается между парными скобками, а при включенном плагине она, кроме того, перемещается между ключевыми словами вроде if/endif, else, do/enddo. Список таких слов (точнее, регулярных выражений) хранится в переменной b:match_words. Посмотреть ее можно так:
:let b:match_words
Обратите внимание, что используется let, а не set, так как это переменная, а не опция Вим (которые я тоже иногда называю переменными).
Команда g% перемещается в обратном направлении. Это важно, если слов в конструкции три, например, if/else/endif. Особенно это удобно при работе с большими фортрановскими select case.
Команды ]% и [% прыгают вперед/назад на ключевое слово без пары. Скажем, вы написали do, потом тело цикла, но enddo еще не написали, и хотите вернуться к заголовку цикла.
Можно использовать все команды с повторителем.
Перемещение посимвольное, так что удалить цикл командой d% не получится до конца: останется хвост последней строки. Но можно так: V%d. То есть, выделить строки и потом их удалить.
Важно, что вложенные конструкции пропускаются:
do ! отсюда команда %
...
do !enddo
...
print*, 'enddo'
enddo
end do ! прыгнет сюда
То есть, поведение именно такое, как вы ожидаете. Если вам нужно иное, используйте простой поиск. Содержимое комментариев тоже пропускается, если только вы не дали команду из комментария. Это тоже именно то, что нужно: вы игнорируете закомментированный текст, но при необходимости можете работать и в нем. Аналогично со строками. Только надо иметь в виду, что плагин полагается на разметку синтаксиса: если syntax off, то ничего пропускать он не будет. Парное слово-то он найдет, а вот что оно "не считается" — понять не сможет.
См. справку (help matchit при включенном плагине), чтобы узнать больше, например, список поддерживаемых языков программирования. Фортран и Латех есть, Вим тоже, языкам с Си-подобным синтаксисом, а также R, это не особо и нужно (там всё на скобках). У Питона нет закрывающих слов и всё на отступах — там нужно что-то другое. Паскаль, bash, HTML и XML есть. Все, что нужно — это создать переменную b:match_words, и это обычно делает файловый плагин. См. его в $VIMRUNTIME/ftplugin для своего любимого типа.
Есть ряд переменных, позволяющих настроить поиск, но вам нет нужды этим заниматься — разве что вы хотите добавить какой-то новый язык. Однако полезно знать, что они есть. Так, можно сделать поиск регистронезависимым (если в языке, как в Фортране, DO может быть парным к end do). Можно совпадать с конструкциями из двух слов, как end do, и одновременно поддерживать и enddo. Можно игнорировать совпадения не только в комментариях и строках, но и в других случаях. Это бывает полезно: например, в ТеХ знак % начинает комментарий, но \% это просто знак процента, а \\% — это знак \ и потом начинается комментарий. И поэтому надо пропускать то, что после \\% и после %, но не то, что после \%. Такие тонкости нуждаются в уточнениях, для которых и предусмотрена специальная переменная.
Можно использовать захваты и совпадать именно с тем, с чем надо. Так, в HTML и особенно в XML надо прыгать между тэгами, открывающим и закрывающим, и один однозначно определяет другой: С тэга <foo> надо прыгать на </foo> и обратно, и все тэги предусматривать не обязательно: можно сообразить, как выглядит парный к данному. Но опять-таки, вам это надо только в том случае, если вы добавляете новый язык.
На самом деле, вся суть сводится к ключению плагина в .vimrc (один раз внесите строчку и забудьте) и потом можно пользоваться удобными командами перемещения % и g%, плюс ]% и [%.
Удачи, коллеги!