Как запустить область синтаксиса Vim в самом начале документа, а также разрешить совпадение ключевых слов в той же позиции? - PullRequest
0 голосов
/ 21 января 2019

Благодаря другому вопросу мне удалось назначить синтаксическую область для моего документа, которая начинается с в самом начале (\%^) документа :

syn region menhirDeclarations start=/\%^./rs=e-1 end=/%%/me=s-1

Чтобы это работало, шаблон запуска должен соответствовать самому первому символу документа.То есть вышеописанное не будет работать только с start=/\%^/;он нуждается в этом последнем . (совпадение, в случае успеха, исключает этого символа; но оно должно фактически совпадать, прежде чем это произойдет ...)

Проблема в том, что любой :syn-keyword совпадение в том же месте - даже на один ниже в :syn-priority - будет препятствовать моему вышеупомянутому региону.По сути, это означает, что у меня не может быть любого keyword, которому разрешено совпадать в начале документа, или это ключевое слово, если таковое будет размещено, предотвратит вышеприведенную "целую верхнюю часть-document "область из сопоставления вообще.

Конкретный пример.Со следующим синтаксисом:

syn keyword menhirDeclarationKeyword %parameter %token " ...
syn region menhirDeclarations start=/\%^./rs=e-1 end=/%%/me=s-1

… документ…

%token <blah> blah
blah blah blah

… не будет содержать необходимую область menhirDeclarations, поскольку menhirDeclarationKeyword соответствует самому первому символу, потребляяи предотвращая сопоставление menhirDeclarations.

Я могу обойти это, объявив все в определении синтаксиса как :syn-match или :syn-region, и определение вышеуказанного региона самое последнее ... но это, вероятно, проблема с производительностью, и, что более важно, действительно трудно поддается управлению.

tl; dr: Есть ли способсопоставить регион в самом начале документа, и разрешить совпадение ключевых слов в одном месте?

1 Ответ

0 голосов
/ 21 января 2019

Чтобы сохранить ключевые слова, вы должны сделать их contained.Иначе, правила синтаксиса Vim всегда будут иметь приоритет, и они не позволят вашим регионам совпадать.Если я правильно помню из вашего последнего вопроса, весь документ анализируется как последовательность различных регионов;это было бы прекрасно.Иначе, вы должны создать новые регионы или соответствия для тех частей документа, которые еще не охвачены, но могут также содержать ключевые слова.

syn keyword menhirDeclarationKeyword contained %parameter %token
syn region menhirDeclarations start=/\%^%token\>/rs=e-1 end=/%%/me=s-1 contains=menhirDeclarationKeyword

Если это невозможно, у вас действительно естьиспользовать :syntax match вместо:

syn match menhirDeclarationKeyword "\<%token\>"

Не думайте, что это будет медленнее;измерьте его с помощью :help :syntime в различных сложных входных файлах.

Часть «сложность в управлении» может быть решена с помощью метапрограммирования Vimscript.Например, вы можете сохранить все ключевые слова в списке и динамически создавать определения с помощью цикла:

for s:keyword in ['parameter', 'token']
    execute printf('syntax match menhirDeclarationKeyword "\<%%%s\>"', s:keyword)
endfor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...