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