如何在文档开始处启动Vim语法区域,同时又允许在同一位置进行关键字匹配?

时间:2019-01-21 03:31:30

标签: vim vim-plugin vim-syntax-highlighting

由于another question,我设法为文档分配了一个语法区域,该区域从文档的最开始( \%^ )开始

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

要使其正常工作,开始模式必须与文档的第一个字符匹配。也就是说,以上内容仅适用于start=/\%^/;它需要最后一个.(匹配成功后,会排除该字符;但是在发生之前必须进行实际匹配……)

问题是,在同一位置的任何:syn-keyword比赛-甚至:syn-priority的下一场比赛-都将抢占我上面的区域比赛。基本上,这意味着我不能有任何keyword 允许在文档开始处进行匹配的关键字,否则该关键字放置后将阻止上述“整个顶部文档匹配”区域。

具体示例。使用以下语法:

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匹配。

我可以通过在语法定义中将 everything 声明为:syn-match:syn-region,并最后定义上述区域来绕过这个问题,但这可能是性能问题,更重要的是,真的很难管理。

tl; dr:有什么方法可以在文档的开头匹配区域,允许关键字在同一位置进行匹配?

1 个答案:

答案 0 :(得分:1)

要保留关键字,您必须将其设置为SQL> with test (col) as 2 (select 'Negativo' from dual union all 3 select '192' from dual union all 4 select '193.3' from dual union all 5 select '20.a4' from dual 6 ) 7 select col 8 from test 9 where translate(col, '0123456789.', 'a') is null; COL -------- 192 193.3 SQL> 。否则,Vim的语法规则将始终赋予它们优先级,并且它们将不允许您的区域匹配。如果我对您的最后一个问题没有记错,那么整个文档将被解析为一系列不同的区域;那太好了。否则,您必须为文档中尚未涵盖但可能还包含关键字的那些部分创建新的区域或匹配项。

contained

如果这不可行,则实际上必须使用syn keyword menhirDeclarationKeyword contained %parameter %token syn region menhirDeclarations start=/\%^%token\>/rs=e-1 end=/%%/me=s-1 contains=menhirDeclarationKeyword

:syntax match

不要以为这会变慢;通过:help :syntime在各种复杂的输入文件上对其进行测量。

“难于管理”部分可以通过Vimscript元编程解决。例如,您可以将所有关键字保留在列表中,并通过循环动态构建定义:

syn match menhirDeclarationKeyword "\<%token\>"