【问题标题】:Correctly match begin and end curly braces in syntax highlighting在语法突出显示中正确匹配开始和结束大括号
【发布时间】:2014-12-12 16:00:02
【问题描述】:

我正在自定义 tex.vim 语法文件以使 LaTeX 宏 \PVerb 以与 \verb 相同的方式突出显示。我在语法文件中模仿了\verb 的行,添加了以下行:

syn region texZone      start="\\PVerb{"            end="}\|%stopzone\>"

也就是说,我想突出显示从 \PVerb{ 到与其匹配的 } 的文本区域。

但是,如果\PVerb{...}里面有{},那么封闭的}就会过早匹配,例如,

\PVerb{{text1}...{text2}}

...{text2} 部分不会被高亮显示,因为它前面有 }

那么在这些情况下如何绕过},这不是正确的匹配大括号?

我已经尝试过this question 中提出的建议,但无法让它发挥作用突出显示的区域超出了匹配的}

这是我尝试过的(按照@Ingo Karkat 的建议添加了innerBrace):

syn region innerBrace       start=+{+               end=+}+ transparent contains=texZone,innerBrace
syn region texZone      start="\\PVerb{"            end="}\|%stopzone\>" contains=innerBrace

这就是我得到的:

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

如果我删除syn region texZone 中的contains=innerBrace,得到的结果如下:

【问题讨论】:

  • 这对我有用。如果你使用syn region innerBrace start=+{+ end=+}+ transparent contains=texZone,innerBrace,它甚至会处理嵌套的{ ... { ...
  • @IngoKarkat 您好,感谢您的建议。我已经编辑了我的描述。问题是突出显示的区域超出了匹配的}。从我的截图中可以看出。
  • 感谢您的补充;我现在看到了问题。

标签: vim latex syntax-highlighting


【解决方案1】:

问题在于innerBrace 已经与结束\PVerb{ 区域开始的{ 匹配。我能够通过innerBrace 区域开始上的否定后视 更正此问题,当紧接在它之前的\PVerb 时不允许匹配。这会将语法组限制为真正的 inner 大括号,并且跨越和嵌套有效。

syn region innerBrace   start=+\%(\\PVerb\)\@<!{+   end=+}+ transparent contains=innerBrace
syn region texZone      start="\\PVerb{"            end="}\|%stopzone\>" contains=innerBrace

另外,innerBrace 不需要再次包含texZone(因为它本身已经只包含在其中)。

【讨论】:

  • 再次感谢您的帮助,Ingo。它终于奏效了。 :-)
【解决方案2】:

有趣的是,对我来说,\PVerb{{ 已经与 innerBrace 匹配。我不确定,为什么会发生这种情况,所以我修改了 innerBrace 的开始模式,使其在 \PVerb{ 部分不匹配:

对我来说,这是可行的:

syn region MyTexZone start="\\PVerb{" end="}" containedin=TOP
syn region innerBrace start="\(\\PVerb\)\@<!{" end="}" transparent containedin=MyTexZone

注意,你不应该使用已经在 tex.vim 语法文件中定义的语法组。这使得调试正在发生的事情变得更加困难。

【讨论】:

  • 有趣的是,您是如何得出几乎相同的解决方案的!帮助中解释了匹配:包含的组也将匹配区域的开始和结束模式。如果不需要,可以使用“matchgroup”参数|:syn-matchgroup|。 "ms=" 和 "me=" 偏移量可用于更改包含项目匹配的区域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2020-08-25
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多