毫无疑问,Vimscript函数可以接受参数。执行下面的命令:
~~~
:function DisplayName(name)
: echom "Hello! My name is:"
: echom a:name
:endfunction
~~~
执行下面的函数:
~~~
:call DisplayName("Your Name")
~~~
Vim将显示两行:`Hello! My name is:` 和 `Your Name`。
注意我们传递给`echom`命令的参数前面的`a:`。这表示一个变量的作用域,在前几章(译注:第20章)我们曾讲过。
让我们试一下不带作用域前缀会怎么样。执行下面的命令:
~~~
:function UnscopedDisplayName(name)
: echom "Hello! My name is:"
: echom name
:endfunction
:call UnscopedDisplayName("Your Name")
~~~
这次Vim抱怨说它找不到变量`name`。
在写需要参数的Vimscript函数的时候,你_总需要_给参数加上前缀`a:`,来告诉Vim去参数作用域查找。
## 可变参数
Vimscript函数可以设计为接受不定数目的参数,就像Javascript和Python中的一样。执行下面命令:
~~~
:function Varg(...)
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg("a", "b")
~~~
这个函数向我们展示了许多东西,让我们来逐一审视。
函数定义中的`...`说明这个函数可以接受任意数目的参数。就像Python函数中的`*args`
函数中的第一行为输出消息`a:0`,结果显示`2`。当你在Vim中定义了一个接受可变参数的函数,`a:0`将被设置为你额外给的参数数量(译注:注意是额外的参数数量)。 刚才我们传递了两个参数给`Varg`,所以Vim显示`2`。(译注:2 - 0 ==# 2)
第二行为输出`a:1`,结果显示`a`。你可以使用`a:1`,`a:2`等等来引用你的函数接受的每一个额外参数。 如果我们用的是`a:2`,Vim就会显示"b"
第三行有些费解。当一个函数可以接受可变参数,`a:000`将被设置为一个包括所有传递过来的额外参数的列表(list)。 我们还没有讲过列表,所以不要太纠结于此。你不能对列表使用`echom`,因而在这里用`echo`代替。
你也可以将可变参数和普通参数一起用。执行下面的命令:
~~~
:function Varg2(foo, ...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg2("a", "b", "c")
~~~
我们可以看到Vim将`"a"`作为具名参数(named argument)`a:foo`的值,将余下的塞进可变参数列表中。
## 赋值
试试执行下面的命令:
~~~
:function Assign(foo)
: let a:foo = "Nope"
: echom a:foo
:endfunction
:call Assign("test")
~~~
Vim将抛出一个错误,因为你不能对参数变量重新赋值。现在执行下面的命令:
~~~
:function AssignGood(foo)
: let foo_tmp = a:foo
: let foo_tmp = "Yep"
: echom foo_tmp
:endfunction
:call AssignGood("test")
~~~
这次就可以了,Vim显示`Yep`。
## 练习
阅读`:help function-argument`的前两段。
阅读`:help local-variables`。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?