要匹配包含正斜杠(/
)的行,我们可以在语法文件中使用以下内容
syntax match colorpath "\v/.*$" #highlight link colorpath Comment1
匹配具有双正斜杠(//
)的行,我们可以使用相同的语句
syntax match colorpath2 "\v//.*$" #highlight link colorpath2 Comment2
但第一部分覆盖第二部分,如image1所示。 此外,在第1行中,pathA没有着色,如果我使用“\ v。 /。 $”,它将为整行着色。
有没有什么方法可以区分这两行,如图2所示?
答案 0 :(得分:0)
这是一个简单的问题,可以根据您的需要调整正则表达式。
要在pathA
之前加入/
,您需要匹配它。 .*/.*$
将匹配整行(正如您已经发现的那样); .
匹配任何(也是空格),*
是贪心匹配。你必须问自己哪些字符可以包含在 colorpath 中,哪些不能。让我们假设它可以包含任何空格。正则表达式原子是\S
(和集合中的等效[^[:space:]]
)。有了这个,我们到达:
syntax match colorpath "\S*/.*$"
第二个问题是这会遮挡 colorpath2 ,因为 colorpath2 是 colorpath 的子集。我们需要使匹配集合分离,例如:
syntax match colorpath "\S*[^/[:space:]]/[^/].*$"
这基本上说:在斜线之前的任何非空格,没有斜线(并且仍然没有空格),然后是单斜线,后面没有斜线,到线的末尾。
上一个命令仅在斜杠之前确实存在路径字符时才有效(因此它在/pathX
上失败)。要解决这个问题,我们必须在行的开头添加分支以及在空格之后立即(当然,只有当你的语法实际允许这些地方时):
syntax match colorpath "\%(\S*[^/[:space:]]\|^\|\s\zs\)/[^/].*$"
另一种表达方式是使用负面的lookbehind和lookahead ;这样可读性较差,但避免了手动加入\S
和[^/]
,就像在上一个命令中一样,并且它会在开始时自动处理单个斜杠的极端情况,而不需要任何其他分支。 / p>
syntax match colorpath "\S*/\@<!//\@!.*$"
这是因为原子只断言匹配,但不消耗任何东西。有关详细信息,请参阅:help /zero-width
。