vim 脚本简述


原文链接: vim 脚本简述

笨方法学Vimscript
vim 脚本简述
1.1 函数调用的两种方式

有两种调用VimScript函数的方式。

(1)不关心返回值

call search("Date: ", "W")

使用关键字call 来显式调用函数。
(2)关心返回值

    let line = getline(".")
    let repl = substitute(line, '\a', "*", "g")
    call setline(".", repl)

上例子,getline(".")返回当前光标所在的行文本,substitue()则返回替换后的文本, 这种情况下自动调用函数,无需使用call。

其实函数调用的call与变量赋值的let类似,看起来好像真的是多余的,C和PHP都没有这种用法,也能工作的很好啊,搞不懂VimScript的开发者是如何想的。

2.1 基本变量命名空间
在VimScript中默认的作用域是全局作用域,也就是说你在一个脚本文件中定义了一个变量,在其他脚本中也可以读取和修改这个变量。在任何编程语言中,全局变量的滥用都会造成混乱,所以VimScript提供了更多的非全局作用域。

s:name 脚本文件作用域,此时s:name这个变量只在当前脚本文件中有效,其他的脚本文件中如果也定义了同名的s:name也没关系,因为这两者彼此独立。这一点与C中的static关键字类似。
b:name 缓冲区作用域,b:name只在指定的缓冲区中有效
w:name 窗口作用域,w:name只在指定的窗口中有效
g:name 全局作用域,函数外定义的变量的默认值
v:name vim预定义的变量,注意预定义变量不同于vim的选项(option)变量。
l:name 函数内部的局部变量,函数内部定义的变量的默认值

注意这些作用域只针对变量名,而不能作用于函数名。

表 1. Vimscript 变量范围
前缀 含义
g: varname 变量为全局变量
s: varname 变量的范围为当前的脚本文件
w: varname 变量的范围为当前的编辑器窗口
t: varname 变量的范围为当前的编辑器选项卡
b: varname 变量的范围为当前的编辑器缓冲区
l: varname 变量的范围为当前的函数
a: varname 变量是当前函数的一个参数
v: varname 变量是 Vim 的预定义变量

还有一些伪变量(pseudovariables),脚本可以使用它们访问 Vim 提供的其他类型的值容器。表 2 对此进行了总结。

表 2. Vimscript 伪变量
前缀 含义
& varname 一个 Vim 选项(如果指定的话,则为本地选项,否则为全局选项)
&l: varname 本地 Vim 选项
&g: varname 全局 Vim 选项
@ varname 一个 Vim 注册器
$ varname 一个环境变量

“option” 伪变量非常有用。例如,可以设置两个键映射(key-map)来增加或减小当前的表空间,如下所示:

nmap ]] :let &tabstop += 1

nmap [[ :let &tabstop -= &tabstop > 1 ? 1 : 0

option 如果变量名以&开头,那么这个变量是一个vim内部变量。vim提供了很多可以配置的选项,也被称为vim内部变量。

    同一个名称的内部变量往往有很多副本,一个是全局的,还有buffer和window局部的,而且提供了不同的读写命令set和setlocal。
    内部变量共使用了三种数据类型:boolean,Number, String。其实VimScript并不支持boolean,而是用Number模仿而已。

改变一个option有两种方法:一是使用set命令,如 set number, set tabstop=4; 二是给变量直接赋值,如 let &number=1, let &tabstop=4。两种方法达到的效果是一样的。不过需要注意的是:

    set命令可以使用简写形式的option名字,如set nu,而直接赋值必须使用完整的内部变量名称;
    直接赋值时要在变量名之前添加&,否则会新建一个同名变量,而不是使用vim的内部变量。如 let number=1不会修改vim的number内部变量。

register 如果变量名以@开头,那么这本变量是暂存区变量,注意register在这里的含义与CPU中的寄存器没有直接关系。

register其实就是一块内存,用来存放各种临时性的东西,比如拷贝的文本,文件的名称,最近删除的文本等等。共有9种类型的register。分别是:

(1)无名register "" , 在vim中register使用引号开头
(2)以数字为名的register,"0到"9,共10个
(3)小删除register, “-(连接符)
(4)以字母为名的register, ”a到"z,共26个
(5)只读register,共有4个,分别是 ", ,“。,”%,"#
(6)表达式register,"=
(7)选择与删除register,共3个,分别是 "*,"+以及"~
(8)黑洞register, “_(下划线),注意与"-区别
(9)上次查找模式register, ”/

这些register中,有一些是vim自身使用的,有些则是共用户使用的。
在VimScript中,使用@+暂存区名的语法来读取和设置暂存区。如下:
[plain] view plain copy

echo @"
let @/ = "hello" " 写入register
echo type(@/)
echo type(@_)

通过实验得知,所有的register类型变量的数据类型都是String。

`