我正在自定义tex.vim
语法文件,以使LaTeX宏\PVerb
以与\verb
相同的方式突出显示。我在语法文件中模仿\verb
的行,添加以下行:
syn region texZone start="\\PVerb{" end="}\|%stopzone\>"
也就是说,我希望将文本区域从\PVerb{
高亮显示到匹配的}
。
但是,如果{}
内有\PVerb{...}
,那么封闭的}
将会过早匹配,例如,
\PVerb{{text1}...{text2}}
由于前面有...{text2}
,}
部分不会突出显示。
那么如何在这些情况下绕过}
,这不是正确的匹配括号?
我已尝试在this question中提出建议,但无法使其正常工作突出显示的区域超出匹配的}
。< / p>
这就是我的尝试(按照@Ingo Karkat的建议添加innerBrace
):
syn region innerBrace start=+{+ end=+}+ transparent contains=texZone,innerBrace
syn region texZone start="\\PVerb{" end="}\|%stopzone\>" contains=innerBrace
这就是我得到的:
您可以看到第3行的正常文字也会逐字突出显示。
如果我删除contains=innerBrace
中的syn region texZone
,则会收到以下内容:
答案 0 :(得分:3)
问题是,innerBrace
已经与{
区域开始结束的\PVerb{
匹配。我能够通过innerBrace
区域开头的否定后瞻来纠正此问题,并在紧接其前的\PVerb
时禁止匹配。这会将语法组限制为真正的内部大括号,并且跨越和嵌套有效。
syn region innerBrace start=+\%(\\PVerb\)\@<!{+ end=+}+ transparent contains=innerBrace
syn region texZone start="\\PVerb{" end="}\|%stopzone\>" contains=innerBrace
此外,innerBrace
不需要再次包含texZone
(因为它本身已经只包含在其中)。
答案 1 :(得分:1)
有趣的是,对我而言,{
的{{1}}已经与innerBrace匹配。我不确定,为什么会发生这种情况,所以我修改了innerBrace的开始模式,以便在\PVerb{
部分不匹配:
对我而言,这有效:
\PVerb{
注意,您不应该使用已在tex.vim语法文件中定义的语法组。这使得调试正在发生的事情变得更加困难。