Vim 语法文件...尝试理解"contains"

15

我正在尝试为我使用的一些自定义格式补丁新的vim语法文件。大部分我都可以理解,但是关键字"contains"让我头疼。

这里有没有人能够以一种向树解释的方式给我解释它的作用(我已经读了帮助->还是没完全明白)。


请查看$VIMRUNTIME/syntax中现有的语法文件,其中很多使用了“contains”关键字。 - Josh Lee
1个回答

35

一般而言,在同一位置只能有一种语法高亮方法。因此,以类C语法为例,如果您定义一个区域从左大括号'{'开始到右大括号'}'结束,该区域的语法高亮将保持相同。

contains= 可以让您配置其他语法高亮组包含在外部组中。按照之前的示例,您可能希望即使在外部区域中也可以突出显示int。那么您可以像下面这样做:

syn keyword Keyword int
syn region BraceBlock start='{' end='}' contains=Keyword

需要随后添加包含关键词列表中的项目是非常常见的。有几种方法可以实现这一点。首先,您可以使用contains=ALLcontains=ALLBUT,Error来允许任何内容在区域内。其次,您可以使用containedin将某些内容推入另一个区域的包含范围:

syn region BraceBlock start='{' end='}'
syn keyword Keyword int containedin=BraceBlock

第三,您可以将“包含”的任何内容视为此组中有效的内容:

syn region BraceBlock start='{' end='}' contains=CONTAINED
syn keyword Keyword int contained

最后,你可以使用集群,这使得决定哪些内容放在哪里变得非常容易:

syn region BraceBlock start='{' end='}' contains=@MyCluster
syn keyword Keyword int
syn cluster MyCluster contains=Keyword
syn keyword Conditional if else
syn cluster MyCluster add=Conditional
" Now conditionals and keywords can appear in a BraceBlock

如果不知道你想要了解什么,我不确定还有什么可以说的 - 你想要实现什么,遇到了什么问题?


所以,如果我理解正确的话,这是一种在规则内部定义规则的方式,可以这么说。例如,匹配括号之间的所有内容......然后,在括号选择中匹配“某些东西”的另一个规则?(我是否走在正确的轨道上)? - Rook
@ldigas:这是一个很好的总结。请注意,内部的“somethings”可以仅在外部组中(如果您将“contained”关键字添加到内部项中-如上面的第三个示例),或者在外部组和任何其他地方(如果您不添加“contained”关键字)。 - DrAl
请解释一下 contained 的用法。在第三个点上,syn region BraceBlock start='{' end='}' contains=CONTAINED 和它下面的那行。 - Harshiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接