Vimscript编程指南

基本语法高亮

现在我们已经搞定了基本的东西了,现在是时候来给我们的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窗口或者是实例里打开,而不是在一个新的split或者tab下打开。因为用Vim窗口打开的话,会让Vim重新加载所有和那个窗口有关的文件,但是用spilt打开的话就不会了。

第一行和最后一行是用来防止重复加载语法高亮配置的习惯用法。

高亮关键字

在后面的代码里我们会忽略文件开头的和结尾的if和let这样的模板。但是不要删除这些文本行,忘记它们就可以了。

把echom的代码换成下面的代码:


     syantax keyword potionKeyword to times
     highlight      link  potionKeyword Keyword

关闭factorial.pn文件,然后再打开它。to和time就会在你的颜色主题里被作为关键字进行高亮了。

上面的两行代码展示了Vim里基本的语法高亮的机构。为了高亮一片语法:

  • 你首先需要定义一个语法块,这个可以使用syntax keyword或者其他相关的命令(这个我们后面会进行讨论的)来实现。
  • 然后,你需要把语法块和高亮组进行关联。高亮显示组是你在颜色主题里定义的,例如“函数名应该是蓝色的”。

这样就是得插件的作者,按照他们自己的理解来定义语法块,然后来把它和常见的高亮显示组进行管理。它也允许主题创建者为一组编程语言的结构设计颜色,但是无须了解具体的编程语言。

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开始的。这个向我们展示了多次运行这个命令是不会重置语法组的——它会把它添加进去!这样你就可以逐个地添加语法组了。

具体怎么定义语法组完全取决于你自己:

  • 你可以把所有东西都放在一行文本里完成
  • 你也可以拆分成多行,保持每行文本不超过80哥字符,这样就便于阅读了
  • 你可以对一个分组里的每一个元素单独定义一行
  • 你也可以像我一样,把相关的元素放在一起进行定义

高亮函数

另外一个Vim的高亮显示组是Function。我们来给高亮脚本加上对Potion的一些内置函数的出力。修改syantax文件如下所示:


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

     syatax keyword potionFunction print join string

     highlight   link  potionKeyword Keyword
     highlight   link  potionFunction Function

关闭再打开factorial.pn文件,你会看到potion的内置函数都会被高亮显示的。

这个和关键词高亮的原理是一样的。我们定义了一个新的语法组,然后把它连接到一个不同的高亮组。

练习

  • 思考一下,为什么第一行的if exists和最后一行的let命令非常有用呢。如果你不清楚的话,也不必担心。我也得找Tim Pope去确认一下。
  • 浏览一下:help syn-keyword。多留意一下提到iskeyword的部分内容。
  • 阅读:help iskeyword。
  • 阅读:help goup-name,熟悉一下颜色主题的作者常用的集中高亮组。