vim函数与脚本范围

时间:2011-05-28 22:43:20

标签: vim macvim

我在MacVim设置中安装了Janus。为了了解vim脚本是如何工作的,我一直在阅读Janus使用的vimrc文件,我不明白这个作者是如何使用函数的。例如,这是vimrc中的一个函数:

function s:setupWrapping()
  set wrap
  set wrapmargin=2
  set textwidth=72
endfunction

现在,根据vim手册的Defining a function部分,“函数名称必须以大写字母开头。”根据手册的Local mappings and functions部分,'在脚本中定义函数时,“s:”可以添加到名称前面,使其成为脚本的本地。但是,在将其范围指定为脚本的本地范围时,没有提及能够以小写字母开头的函数名称。

那么,函数是否在语法上是不正确的,但无论如何都是有效的,或者它在语法上是否正确但是我找不到那样说的文档?

2 个答案:

答案 0 :(得分:6)

据我了解,关于大写函数名称的规则旨在避免与vim的内置函数冲突。脚本本地函数不存在冲突的可能性,因此限制不适用于它们似乎是合理的,因为您必须始终为它们添加其命名空间限定符。

ZyX在评论中纠正了我,并指出,与此答案的早期修订相矛盾,vim不允许声明缓冲区范围函数。你可以声明一个名为b:function_name全局函数,或者_:function_name,但这很令人困惑,可能是一个糟糕的主意,由于评论中提到的原因。

在字典中声明的函数不需要大写。

缓冲区范围Funcref,以及可能在全局或函数级范围之外的其他Funcref(“本地”Funcrefs)不需要大写。但是无论如何它们的用处都是有限的,因为Funcref必须引用全局或脚本范围函数(后者在语法上是笨拙的)或字典函数;在后一种情况下,您必须使用call(funcref, args, dict)调用它。

但无论如何,你正在寻找文件,所以我做了一个:helpgrep capital并找到了这些智慧的小块:

E704一个Funcref变量必须以大写开头,“s:”,“w:”,“t:”或“b:”。

E124:«通过名称{name}定义一个新函数。名称必须由字母数字字符和'_'组成,并且必须以大写或“s:”开头(见上文)。 »“see see”指针指的是user-functionslocal-function部分,它们提供了更多细节,但未提及有关脚本范围函数的非大写的任何内容。 user-functions提到函数名必须以大写字母开头,以避免与内置函数混淆。

在其他作用域出现之前,总是用大写启动函数名的严格规则可能是真的,其中脚本作用域似乎是第一个,或者至少第一个能够包含函数声明。我猜这个规则的部分内容刚刚没有更新,以反映现代vim的状态。

答案 1 :(得分:-2)

我想你永远都不会知道是否有文档但你找不到它

但是,我在他的博客上查看了Derek Wyatt的vimrc文件,并且他一直在函数名中使用首字母。

这只是证明也阅读了手册。