соответствие регулярного выражения с содержащимся ключевым словом в vim - PullRequest
3 голосов
/ 21 ноября 2011

Я использую vim и хочу выделить следующую конструкцию (которая принята в ifort, но отклонена xlf)

write(5,*), foo

запишите запятую перед переменной foo.Я попробовал следующее

syn match fortranWriteComma "write\s*\(.?*,.?*\),"

Это работает хорошо, пока вместо «записи» я использую что-нибудь еще.Пример

syn match fortranWriteComma "whatever\s*\(.?*,.?*\),"

это соответствует и правильно выделяет

whatever(5,*),

Если я использую запись, распознавание ключевого слова запускается и не выполняет никакого выделения.Как настроить vim так, чтобы совпадение преобладало над распознаванием ключевых слов?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Q. Если я использую запись, распознавание ключевого слова вступает в силу и не выполняет никакого выделения.Как настроить vim так, чтобы совпадение преобладало над распознаванием ключевого слова

A. Я считаю, что вы должны иметь возможность использовать оба способа, используя transparent syntax region:

ПРОЗРАЧНЫЙ

В файле языка C вы хотели бы выделить текст () после "while""отличается от текста () после" для ".В обоих случаях могут быть вложенные элементы (), которые должны быть выделены одинаково.Вы должны убедиться, что подсветка () останавливается на совпадении).Это один из способов сделать это:

:syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
  \ contains=cCondNest
:syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
  \ contains=cCondNest
:syntax region cCondNest start=/(/ end=/)/ contained transparent

Теперь вы можете задать cWhile и cFor для различного выделения.Элемент cCondNest может присутствовать в любом из них, но он берет на себя выделение элемента, в котором он содержится. Причиной этого является «прозрачный» аргумент.Обратите внимание, что аргумент «matchgroup» имеет ту же группу, что и сам элемент.Зачем тогда это определять?Что ж, побочным эффектом использования группы совпадений является то, что содержащиеся элементы не найдены в совпадении с начальным элементом.Это позволяет избежать совпадения группы cCondNest с (сразу после «while» или «for». Если это произойдет, оно будет охватывать весь текст до совпадения), а регион будет продолжен после него.Теперь cCondNest совпадает только после совпадения со стартовым шаблоном, то есть после первого (.

1 голос
/ 21 ноября 2011

Я частично решил, переопределив ключевое слово как совпадение

syn clear fortranReadWrite 
syn keyword fortranReadWrite backspace close endfile inquire open print read rewind 
syn match fortranWrite "write" contained
hi def link fortranWrite Keyword
syn match fortranWriteComma "write\s*(.*,.*)," contains=fortranWrite
hi def link fortranWriteComma Error

К сожалению, это все еще не идеально, так как «запись» остается желтой, и выделяются только скобки.

enter image description here

Я не мог это исправить, но это нормально для моих целей. Если у кого-то есть способ получить запись желтым цветом в нормальных условиях, но все красное, если запятая добавлена, пожалуйста, добавьте это в комментариях, чтобы я мог уточнить это.

...