就像其他的编程语言一样,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
这个函数里用了我们之前学到的很多概念:
因为我们没有显示返回一个值,所以vim会默认给个返回值0,也就是false。让我们来修改一下代码,运行下面的命令:
:setlocal textwidth=100
:if TextwidthIsTooWide()
: echom "WARNNING:WIde text!"
:endif
这次函数里的if里的语句执行了,并且函数返回1,所以我们手动输入的if也执行了它里面的语句。