macvim函数具有脚本范围



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

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

现在,根据vim手册的"定义函数"一节,"函数名称必须以大写字母开头。"根据手册的"本地映射和函数"部分,"在脚本中定义函数时,可以在名称前加上"s:",使其成为脚本的本地函数。"然而,在将函数名称的作用域指定为脚本的本地时,没有提到可以用小写字母开头函数名称。

那么,编写的函数是语法不正确但仍然有效,还是语法正确但我找不到这样的文档?

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

ZyX在评论中纠正了我的错误,指出与这个答案的早期版本相矛盾的是,vim不允许声明缓冲区范围函数。可以声明一个名为b:function_name_:function_name全局函数,但由于注释中提到的原因,这很令人困惑,可能是一个糟糕的想法。

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

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

但不管怎样,你正在寻找文档,所以我做了一个:helpgrep capital,发现了以下智慧:

E704:Funcref变量必须以大写字母"s:"、"w:"、"t:"或"b:"开头

E124:«用名称{name}定义一个新函数。名称必须由字母数字字符和"_"组成,并且必须以大写字母或"s:"开头(请参见上文)。»"见上文"指针指的是用户函数和本地函数部分,它们提供了更多细节,但没有提及脚本范围函数的非大写。user-functions提到函数名称必须以大写字母开头,以避免与内置函数混淆

在其他作用域出现之前,总是以大写字母开头函数名的严格规则可能是正确的,其中脚本作用域似乎是第一个,或者至少是第一个能够包含函数声明的作用域。我猜,手册中断言这一规则的部分只是没有更新以反映现代vim的状态。

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

然而,我在Derek Wyatt的博客上查看了他的vimrc文件,他在函数名中一直使用大写首字母。

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

最新更新