Поля синтаксиса подсветки синтаксиса Vim

Я пытаюсь написать файл синтаксиса vim для файлов дампа SVN. Часть, которую я не могу понять, – это раздел:

Fooprop: Val1 Text-content-length: 20 Barprop: Val2 <- Blank line abcdefghi abcdefghi Next-item-prop: Val3 

Как настроить правило синтаксиса, в котором указано «N символов после первой пустой строки, следующей за« Длина текста-содержимого: N », где N – число»?

Вам нужно будет указать длину текста в другом регулярном выражении. Поскольку Vim (в отличие от Perl) не позволяет оценивать выражения Vimscript внутри регулярных выражений, вам нужно прибегнуть к метапрограммированию , то есть построить правила синтаксиса «на лету»:

 :execute 'syntax match svndumpData /^\n\_.\{' . length . '}/' 

Этот простой эскиз использует \_. для соответствия любому символу (включая символы новой строки) для \{N} раз. Вы должны быть осторожны относительно длины новой строки (CR-LF против LF) и кодировок (количество символов не обязательно равно количеству байтов для их представления!)

Это работает, потому что для каждого обнаружения используется синтаксический плагин, а синтаксис применяется к текущему буферу.

альтернатива

Поскольку это довольно сложно и может не работать, если у вас есть счет байта (для которого не существует атома регулярного выражения) вместо длины символа, всегда существует прагматичное 80% -ное решение, которое игнорирует подсчет содержащихся символов и просто определяет область синтаксиса на окружающие участки собственности. Это не будет правильным во всех случаях, но, вероятно, хорошо работает для большинства данных.