函数

像大多数的编程语言一样,Vimscript 也有函数。让我们先看看如何创建函数,然后再谈谈他们诡异的地方。

运行以下命令:

:function meow()

你可能认为这会定义一个名为 meow 的函数。 不幸的是,事实并非如此,而是碰到了一个 Vimscript 的诡异之处。

如果Vimscript 函数没有规定范围,则必须以大写字母开头!

即使你给函数添加了范围(我们在以后还会谈到),你最好还是大写函数名的首字母。 大部分 Vimscript 程序员都会这样做,所以不要破坏规矩。

好的,这次让我们真正地来定义一个函数。运行以下命令:

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

这次 Vim 会正确地定义函数。让我们试试运行它:

:call Meow()

不出所料,Vim 会显示 Meow!

让我们试试返回一个值。运行以下命令:

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

现在试试运行以下命令:

:echom GetMeow()

Vim 会调用函数,并把结果传给 echom,它会显示 Meow String!

调用函数

我们已经看到在 Vimscript 中有两种不同的方法来调用函数。

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

:call Meow()
:call GetMeow()

第一个会显示 Meow!,但是第二个不会显示任何东西。 当你使用 call 时,返回的值会被舍弃,所以这只会在函数有其他作用时才有用。

第二种调用函数的方法是在表达式中。在这种情况中,你不需要使用 call,而只需要声明函数。 运行以下命令:

:echom GetMeow()

就像我们前面看到的,这会调用 GetMeow 并且把返回值传递给 echom

隐式返回值

运行以下命令:

:echom Meow()

这会显示两行:Meow!0。第一行显然是来自于 echom 而不是 Meow。 第二行向我们展示如果一个 Vimscript 函数没有返回一个值,它会隐式返回 0。 让我们好好利用这一优势。运行以下命令:

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

这个函数使用了很多之前学过的重要感念:

如果有任何一个听起来有点陌生,你应该返回一些章节并好好阅读。

现在,我们已经定义了一个函数,它会告诉我们,如果 textwidth 设置在当前缓冲中“太宽了” (因为80个字符,当然,是恰当的宽度,除了 HTML)。

让我们试试。运行以下命令:

:set textwidth=80
:if TextwidthIsTooWide()
:  echom "WARNING: Wide text!"
:endif

在这里,我们做了什么?

因为我们没有显式地返回一个值,如果是假,Vim 会从函数中返回 0。 让我们试试改变它。运行以下命令:

:setlocal textwidth=100
:if TextwidthIsTooWide()
:  echom "WARNING: Wide text!"
:endif

这次,函数中的 if 语句执行了它的主体,返回了 1,因此我们手动键入的 if 语句也执行了它的主体。

练习

阅读 :help :call。目前忽视任何关于“ranges”的内容。 你可以传递多少参数给一个函数?这是否令人惊讶?

阅读 :help E124 的第一段落,并且找出你能在函数名中允许使用些什么字符。 下划线是否可以?破折号呢?重音字符呢?Unicode 字符呢? 如果看文档不是很明白,只要试试看就知道了。

阅读 :help return。这个命令的“缩写形式”是什么(这是我说过永远不要使用的)? 这是你期望的么?如果不是,为什么不是呢?

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