基本语法高亮

既然已经有了模板,那就是时候开始为我们的 Potion 插件写一些有用的代码了。 我们将从一些简单的语法高亮开始。

在插件仓库中创建 syntax/potion.vim 文件。把以下代码放进文件中:

if exists("b:current_syntax")
    finish
endif

echom "Our syntax highlighting code will go here."

let b:current_syntax = "potion"

关闭 Vim,然后打开 factorial.pn 文件。你可能会看到输出的信息,也可能看不到, 这取决于是否有其他插件在它之后执行命令。如果运行 :messages 你会清楚地看到文件的确被载入了。

注意:只要说到打开 Potion 文件,就是指打开一个新的 Vim 窗口或者实例,而不是分割窗口或者标签。 打开新的 Vim 窗口会重新载入所有捆绑的文件,而分割窗口不会。

文件开头和结尾的几行是一种惯例,当语法高亮已经在缓冲区开启后,可以防止重复载入。

高亮关键字

本章节剩余部分中,我们会忽略文件开始和结尾处的 iflet 模板。 并不用删除这些代码,暂时忘记它们就行了。

把文件中占位的 echom 替换为以下代码:

syntax keyword potionKeyword to times
highlight link potionKeyword Keyword

关闭 factorial.pn 文件,然后重新打开。totimes 会被配色方案高亮为关键字!

这两行代码展示了 Vim 中简单的语法高亮的基本结构。 高亮一小段代码的语法要:

这让插件作者能以有效的方式来定义语法“块”,并关联到通用高亮组。 它也使配色方案的作者们只需要对编程语言的一组通用结构来定义颜色就可以了,这样就不需要了解每个语言。

Potion 还有很多没在我们的程序中出现的关键字,所以再修改下语法文件使它们也高亮:

syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return

highlight link potionKeyword Keyword

首先:最后一行没有修改。我们仍然告诉 Vim, 任何在 potionKeyword 语法组中的东西都应该被高亮为 Keyword

我们现在有了三行代码,每行都是以 syntax keyword potionKeyword 开始。 这说明多次运行这个命令不会重置语法组 —— 而是添加进去! 这让你可以逐个地定义语法组。

如何定义这些组完全由你决定:

高亮函数

另一个标准的 Vim 高亮组是 Function。 让我们在高亮脚本中添加一些内置的 Potion 函数。 编辑语法文件的内部,使它看上去像这样:

syntax keyword potionKeyword loop times to while
syntax keyword potionKeyword if elsif else
syntax keyword potionKeyword class return

syntax keyword potionFunction print join string

highlight link potionKeyword Keyword
highlight link potionFunction Function

关闭并重新打开 factorial.pn,你会看到内置的 Potion 函数现在高亮显示了.

这和关键字高亮显示是一模一样的。我们定义了一个新的语法组,并关联到另一个高亮组。

练习

想一想为什么文件开始和结尾处的 if existslet 是非常有用的。 如果你不明白,也不用担心。当然,我得问问 Tim Pope 是不是这样。

浏览 :help syn-keyword。特别值得注意的是提到 iskeyword 的那部分。

阅读 :help iskeyword

阅读 :help group-name 来了解配色方案的作者们经常使用的一些通用高亮组。

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