在语法突出显示中正确匹配开始和结束花括号

时间:2014-10-17 06:00:43

标签: vim latex syntax-highlighting

我正在自定义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

这就是我得到的:

enter image description here

您可以看到第3行的正常文字也会逐字突出显示。

如果我删除contains=innerBrace中的syn region texZone,则会收到以下内容:

enter image description here

2 个答案:

答案 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语法文件中定义的语法组。这使得调试正在发生的事情变得更加困难。