Vim的函数

Vim中使用function ... endfunction定义函数。

需要注意的是,Vim中的函数如果没有标明作用域(前缀s:),那么函数必须以大写字母开头。事实上,Vimer约定所有的函数都用大写字母开头,无论有没有作用域。

使用function!可以避免重复载入时候的冲突。

下面是定义一个简单的函数。

function

Vim

1

2

3

:function Meow()

:  echom "Meow!"

:endfunction

调用方法是:call Meow()

也可以使用返回值。

function call

Vim

1

2

3

:function GetMeow()

:  return "Meow String!"

:endfunction

可以将返回值打印出来。

echo function

Vim

1

:echom GetMeow()

返回值

如果函数没有提供返回值,会返回数字0(即假)。

下面的这个判断宽度是不是太大的函数,在调用的时候就可以直接使用。

call

Vim

1

2

3

4

5

6

7

8

9

10

:function TextwidthIsTooWide()

:  if &l:textwidth ># 80

:    return 1

:  endif

:endfunction

:set textwidth=80

:if TextwidthIsTooWide()

:  echom "WARNING: Wide text!"

:endif

函数参数

Vim的函数当然也可以接受参数。下面的函数声明和调用展示了Vim的函数参数用法。

函数参数

Vim

1

2

3

4

5

6

7

:function DisplayName(name)

:  echom "Hello!  My name is:"

:  echom a:name

:endfunction

" 调用

:call DisplayName("Your Name")

注意,变量的a:前缀是标志作用域。如果删去,Vim就找不到这个变量了。

在VimScript中,如果要函数接受变量,那么任何时候使用这个变量都要带上a:前缀,来告诉Vim他们在函数参数作用域中(argument scope)。

可变长度的参数

和Python,JavaScript一样,VimScript可以接受不确定数量的参数。见以下代码。

可变长度参数

Vim

1

2

3

4

5

6

7

:function Varg(...)

:  echom a:0

:  echom a:1

:  echo a:000

:endfunction

:call Varg("a", "b")

其中:

  • ... 表示这个函数可以接受任意数量的参数,和Python的*args一样
  • a:0表示这个函数的可变长度的参数的个数,我们传给Varg两个参数,那么a:0就是2
  • a:1 a:2 等等就是调用第n个参数
  • a:000 是所有可变长度参数组成的列表(数组),这里会打印出["a", "b"]

可变长度的参数可以和普通的参数一起用,和Python一样。

Vim

1

2

3

4

5

6

7

8

:function Varg2(foo, ...)

:  echom a:foo

:  echom a:0

:  echom a:1

:  echo a:000

:endfunction

:call Varg2("a", "b", "c")

参数不能重新赋值

下面的代码,会抛出一个错误,因为Vim不允许对函数传进来的参数重新赋值。

Vim

1

2

3

4

5

6

:function Assign(foo)

:  let a:foo = "Nope"

:  echom a:foo

:endfunction

:call Assign("test")

为此,我们一般不直接使用传进来的参数,函数的开始一般会将进来的参数复制给新的变量,在函数中使用新的变量。

Vim

1

2

3

4

5

6

7

:function AssignGood(foo)

:  let foo_tmp = a:foo

:  let foo_tmp = "Yep"

:  echom foo_tmp

:endfunction

:call AssignGood("test")