Vim: строка после совпадения синтаксиса также является совпадением синтаксиса - PullRequest
1 голос
/ 05 октября 2019

Я хотел бы выделить строки, соответствующие этому регулярному выражению КРАСНЫЙ:

syn match RedLine "^\*\*\*  .*  \*\*\*\n"

Затем я бы хотел выделить следующую строку СИНИЙ, независимо от того, какой текст в ней содержится.

Я пытался использовать\zs, чтобы соответствовать шаблону следующей строки следующим образом:

syn match BlueLine "^\*\*\*  .*  \*\*\*\n\zs.*"

Но это не работает (я понимаю, что позиция чтения прошла часть совпадения до \zs уже).

Итак, я попробовал атом «смотреть за» следующим образом:

syn match BlueLine "\(^\*\*\*  .*  \*\*\*\n\)\@50<=.*"

Но это было слишком медленно, даже с ограничением в 50 байт.

Как я могу всегда соответствоватьвсю строку всякий раз, когда предыдущая строка соответствует определенному шаблону?

например,

***  this line's RED since it's surrounded by pairs of 3 stars  ***
this line's always BLUE because of the preceding line

1 Ответ

0 голосов
/ 15 октября 2019

На самом деле вам не нужно повторно анализировать первую строку, чтобы захватить вторую, следующую за ней строку (что действительно крайне неэффективно). Vim имеет :help :syn-nextgroup, который указывает синтаксическому анализатору продолжить анализ с предпочтением указанной группы. Ключевое слово skipnl пропускает новую строку между ними. Поскольку вы без разбора хотите выделить всю следующую строку, подойдет простой шаблон .*. Единственной важной деталью для этого правила является ключевое слово contained, так что это правило соответствует только срабатыванию nextgroup=, но не само по себе (что будет окрашивать весь буфер в синий цвет).

syn match RedLine "^\*\*\*  .*  \*\*\*$" skipnl nextgroup=BlueLine
syn match BlueLine ".*" contained
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...