Это не может быть сделано только с помощью регулярных выражений. Вам понадобится специальный атом, который работает как группа захвата, но вместо этого захватывает столбец, а затем соответствующий атом для вызова. Лучшее, что вы можете сделать, это сопоставить каждую строку в следующей строке, для вашего примера
/ab\ze.*\n.*ba.*\n.*ab/
При этом сопоставляются не только строки, которые совпадают со строками блока, но и все вхождения, которые содержат текст блока, хотя и не только с одинаковым вертикальным выравниванием, и подсвечивается только совпадение первой строки. Мой плагин SearchHighlighting также предоставляет эту функцию (сопоставленную с {Visual}*
).
Если этого недостаточно (вы можете использовать флаг /c
для :substitute
чтобы вручную проверять и подтверждать каждое совпадение), вы должны создать свою собственную поисковую (и замещающую) инфраструктуру, то есть эквиваленты /
, n
/ N
и :s
, и сделайте дополнительное утверждение для выравнивания блоков в Vimscript.