高级语法高亮

目前为止,我们已经为 Potion 文件定义了一些简单的语法高亮:关键字和函数。

如果你没做前一章节的练习,最好回去完成它们。我会假设你已经完成了。

实际上,你应该回去完成所有跳过的练习。即使觉得不需要,但为了使这本书发挥效果,你就必须完成它们。 在这一点上,请务必相信我。

高亮注释

Potion 中有个肯定需要高亮的部分就是注释。 问题是 Potion 的注释是以 # 开始的,而这(通常都)不在 iskeyword 内。

如果你不知道 iskeyword 是什么,那就说明你没听我的。回头去做完那该死的练习。 当我为每个章节出练习的时候,并不只是要扔给你们一堆没用的作业。 你真的需要完成它们以便理解本书。

因为 # 不是关键字字符,我们需要用一个正则表达式来匹配它(以及注释的剩余部分)。 我们将用 syntax match ,而非 syntax keyword。 把以下代码添加到语法文件中:

syntax match potionComment "\v#.*$"
highlight link potionComment Comment

我之后不会再让你把代码放到文件中了。你是个程序员:应该自己判断。

关闭并重新打开 factorial.pn。在文件随意位置加上一行注释,你会看到它被高亮为注释了。

第二行很简单:它告诉 Vim 把 potionComment 语法组中的任何东西都高亮为注释。

第一行是新的内容。我们用 syntax match 来让 Vim 匹配正则表达式,而不是字面的关键字。

注意,我们使用的正则表达式以 \v 开始,这会让 Vim 使用“very magic”模式。 如果你不确定这表示什么,请重新阅读基本正则表达式这一章节。

在这个例子中,“very magic”模式不是必须的。 但未来,我们可能会修改这个正则表达式,并疑惑为什么会不起效, 所以我建议,为了保持一致,总是用“very magic"的正则表达式。

至于正则表达式本身,就相当简单了:注释以井号开始,并包括了所有到行尾的字符。

如果你需要一份正则表达式的进修课程,可以看一看 Zed Shaw 写的 Learn Regex the Hard Way

高亮操作符

Potion 中另一个需要用正则表达式来高亮显示的就是操作符。 把以下代码添加到语法文件中:

syntax match potionOperator "\v\*"
syntax match potionOperator "\v/"
syntax match potionOperator "\v\+"
syntax match potionOperator "\v-"
syntax match potionOperator "\v\?"
syntax match potionOperator "\v\*\="
syntax match potionOperator "\v/\="
syntax match potionOperator "\v\+\="
syntax match potionOperator "\v-\="

highlight link potionOperator Operator

关闭并重新打开 factorial.pn。注意,factorial 函数中的 *= 现在是高亮的。

可能你注意到的第一件事是,我把每个正则表达式都放单独一行,而不是像关键字那样聚合在一起。 这是因为 syntax match支持一行中有多个组。

你也应该会注意到,我在每个表达式之前都加上了 \v,虽然这并不是严格要求的。 即使在编写 Vimscript 时需要多写几个字符,我还是更愿意保持正则表达式语法的一致。

你也许会想,为什么不用 "\v-\=?" 这样一行的正则表达式来匹配 --=。 只要愿意,完全可以这样做。它也能正常工作。 我只是倾向于把 --= 当作独立的操作符,所以就把它们放在不同的行中了。

把这些操作符作为独立的匹配能简化正则表达式,避免额外的冗余。 我更愿意这样做,但你也许不这么认为。自己决定吧。

而且,我也没有把 = 定义为一个操作符。 我们瞬间就能完成它,但我暂时还不想这么做,这样,我就能给你们上上一课。

因为,我为 --= 定义了独立的正则表达式,所以我也必须在 - 之后定义 -=

如果弄反了顺序,并且在 Potion 文件中使用了 -=,Vim 会匹配 -(当然,也会高亮显示),然后只剩下 = 等待匹配。 这表示,当你在用 syntax match 构建组时,每个组都会“消耗掉”一些代码,而它们不会再被匹配。

这是一种极度简化,但我并不想过于追究细节。 目前,基本准则应该是尽量把长的组放在短的组后面,因为定义的组拥有比定义的组更高的优先级。

让我们继续,并把 = 作为一个操作符,现在,课题出来了:

syntax match potionOperator "\v\="

花点时间思考下,你应该把这行代码放在语法文件的哪一行。 如果需要帮助,请重新阅读上面几段。

练习

阅读 :help syn-match

阅读 :help syn-priority

以上例子中,并没有出现 : 的操作符。 阅读 Potion 的文档,并理性的决定是否需要 : 的操作符。 如果你决定需要,把它添加进语法文件。

同样对于 ./

添加一个 potionNumber 的语法组,并高亮显示数字。把它关联到 Number 高亮语法组。 记住,Potion 支持类似 20xffaf123.231e-2 以及 1.9956e+2 这样的数字。 记得要平衡处理极端例子所花费的时间和极端例子实际可能出现的时间。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/46.html