【问题标题】:vim functions with script scope具有脚本范围的 vim 函数
【发布时间】:2011-05-30 09:45:17
【问题描述】:

我已经使用我的 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:”,使其成为脚本的本地名称。但是,没有提到在将其范围指定为脚本本地时能够以小写字母开头的函数名称。

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

【问题讨论】:

    标签: vim macvim


    【解决方案1】:

    据我了解,函数名大写的规则是为了避免与 v​​im 的内置函数发生冲突。脚本本地函数没有冲突的可能性,因此限制不适用于它们似乎是合理的,因为您必须始终为其命名空间限定符添加前缀。

    ZyX 在 cmets 中纠正了我,指出与此答案的早期版本相矛盾的是,vim 不允许声明缓冲区范围函数。您可以声明一个 global 函数,其名称类似于 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-functionslocal-function 部分,它们提供了更多详细信息,但没有提及脚本范围函数的非大写。 user-functions 提到 函数名称必须以大写字母开头,以避免与内置函数混淆。

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

    【讨论】:

    • 非常感谢。我认为原因是为了避免内置函数冲突,并且指定函数是本地范围的否定了需要,但想在我尝试使用该功能之前确保这是 vim 的记录行为。
    • 没有缓冲区本地函数。而且实际上没有脚本本地函数:s: 只是被 <SNR>{SID}_ 替换,但函数仍然是全局的。即使在第一个源脚本之外,您也可以手动定义像 <SNR>1_exampleFunction 这样的函数。
    • 您可以定义在没有函数引用的情况下无法访问的匿名函数(因此,如果此引用仅存储在脚本局部变量中,则必须使用调试器,因为这些变量实际上是脚本局部变量) ,但缺点是设置了dict 属性。这是定义缓冲区局部函数的唯一方法。
    • 第三,你可以定义函数名为_:_{letter}:{name}与作用域无关。 s: 被替换,仅此而已。我不知道为什么要实现它,我在文档中找不到这个事实,所以我建议你不要在脚本中使用它。
    • @ZyX:是的,这很奇怪。这就是为什么我认为存在缓冲区局部函数的原因:我没有注意到我声明的 b:Testing 函数实际上是一个全局函数。我同意声明这样一个函数可能不是一个好主意——这可能只是因为解析器错误。无论如何,: 后面的字母不必大写。
    【解决方案2】:

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

    但是,我查看了Derek Wyatt 在他的博客上的 vimrc 文件,他始终在函数名中使用大写的首字母。

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

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多