变量的前缀我们上面已经提到了变量的 a: 前缀。变量的前缀实际上有更多,通用编程概念上很容易理解的是下面四个:
- a: 表示这个变量是函数参数,只能在函数内使用。
- g: 表示这个变量是全局变量,可以在任何地方访问。
- l: 表示这个变量是本地变量,但一般这个前缀不需要使用,除非你跟系统的某个名字发生了冲突。
- s: 表示这个变量(或函数,它也能用在函数上)只能用于当前脚本,有点像 C 里面的 static 变量和函数,只在当前脚本文件有效,因而不会影响其他脚本文件里定义的有冲突的名字。
一般编程语言里没有的,是下面这些前缀:
- b: 表示这个变量是当前缓冲区的,不同的缓冲区可以有同名的 b: 变量。比如,在 Vim 里,b:current_syntax 这个变量表示当前缓冲区使用的语法名字。
- w: 表示这个变量是当前窗口的,不同的窗口可以有同名的 w: 变量。
- t: 表示这个变量是当前标签页的,不同的标签页可以有同名的 t: 变量。
- v: 表示这个变量是特殊的 Vim 内置变量,如 v:version 是 Vim 的版本号,等等(详见 :help v:var)。
还有下面这些前缀,可以让我们像使用变量一样使用环境变量和 Vim 选项:
- $ 表示紧接着的名字是一个环境变量。注意,一些环境变量是由 Vim 自己设置的,如 $VIMRUNTIME。
- & 表示紧接着的名字是一个选项,比如, echo &filetype 和 set filetype? 效果相似,都能用来显示当前缓冲区的文件类型。
- &g: 表示访问一个选项的全局(global)值。对于有本地值的选项,如 tabstop,我们用 &tabstop 直接读到的是本地值了,要访问全局值就必须使用 &g:tabstop。
- &l: 表示访问一个选项的本地(local)值。对于有本地值的选项,如 tabstop,我们用 &tabstop 直接读到的已经是本地值了,但修改则和 set 一样,同时修改本地值和全局值。使用 &l: 前缀可以允许我们仅修改本地值,像 setlocal 命令一样。
当我们需要计算出选项值的时候。set filetype=cpp 基本上和 let &filetype = 'cpp' 等效,我们需要注意到后者里面 cpp 是个字符串,可以是通过某种方式算出来的。光使用 set,就不方便做到这样的灵活性了。