Vimscript编程指南

函数

就像其他的编程语言一样,vimscript也有函数。我们先来看看怎么创建函数,然后再看看它们古怪的地方。

运行下面的命令: :function meow()

也许你会认为这个命令会创建一个名叫Meow的函数,不过遗憾的是,事实上不是这样,我们现在已经碰到了vimscript一个古怪的地方。

在vimscript里,如果函数没有指定范围的话,函数名必要以大写字母开始

即使你给函数加上了范围(后面会讨论怎么加),不过你也最好对函数名以大写字母开始。因为大部分的vimscript程序员都会这样做,所以不要打破这个潜规则。

好了,现在让我们来真正定义一个函数,运行下面的命令:


     :funciont Meow()
     :     echom "Meow!"
     :endfunction

这样就正确的地定义了一个函数,现在让我们来运行这个函数: :call Meow()

正如我们所预料的,vim会输出“Meow!”。

现在让我们试着返回一个值,运行下面的命令:


     :function GetMeow()
     :     return "Meow String!"     
     :endfunction

现在通过下面的方式来运行它: :echom GetMeow()

Vim会调用上面的函数,并且把返回值传给echom,这样就会输出“Meow String!”。

调用函数

通过上面已经知道我们有两种方式来调用函数。

当你想直接调用一个函数的时候,可以用call命令,运行下面的函数:

     
     :call Meow()
     :call GetMeow()

第一个会输出“Meow!”,但是第二个不会输出任何信息。当你用call来调用函数的时候,返回值就被丢弃了,所以call在函数有副作用的时候用比较好。

第二个调用的方式就是通过表达式。在表达式里,你不需要用call,只需要用函数的名称来调用。运行下面的函数:


     :echom GetMeow()

就像之前一样,这样会调用GetMeow()然后把返回值传给echom。

隐式返回值

运行下面的命令:


     :echom Meow()

这次会输出两行:“Meow!”和“o”。第一个结果显然来自于Meow函数内部的echom。第二个向我们显示了当一个vimscript函数没有返回值时,它会默认返回一个0.让我们利用这个特点,并且运行下面的命令:


     :function TextwidthIsTooWide()
     :     if &l:textwidth ># 80
     :          return 1     
     :   endif
     :endfunction

这个函数里用了我们之前学到的很多概念:

  • if语句
  • 把选项当作变量
  • 把选项本地化
  • 大小写敏感的比较

因为我们没有显示返回一个值,所以vim会默认给个返回值0,也就是false。让我们来修改一下代码,运行下面的命令:


     :setlocal textwidth=100
     :if TextwidthIsTooWide()
     :     echom  "WARNNING:WIde text!"
     :endif

这次函数里的if里的语句执行了,并且函数返回1,所以我们手动输入的if也执行了它里面的语句。

练习

  • 阅读:help call,忽略任何超出我们现在学习范围的内容。回答一下,你可以给函数传多少个参数呢?这个是不是有点吃惊呢?
  • 阅读:help E124的第一段,找出那些字符是可以用在函数名称里的。下划线可以么?斜杠呢?重音符号呢?unicode字符呢?如果看了文档还不清楚的话,你可以直接在vim里试试。
  • 阅读 :help return。看看它的缩写形式是什么呢?是不是你所认为的呢?如果不是,那是为什么呢?