Variables

时隔一个多月没更了, 这频率委实慢了些😄️

虽慢但不弃坑, 来继续填坑😉.

从这一节开始, 我们正式来学 VimScript 的语法知识啦.

先从变量开始. 来看下变量的声明, 赋值及作用域.

声明与赋值

VimScript 使用 let 来声明变量.

:let foo='bar'
:echo foo
:let foo=2
:echo foo

会分别输出:

bar
2

之前我们提到 option, option 可以通过 &{option} 来做为变量进行读写操作.

看个例子:

:set textwidth=80
:echo &textwidth
:let &textwidth = &textwidth + 10
:echo &textwidth
:set textwidth?

会依次输出:

80
90
textwidth=90

这里也可以看出, 把 option 转为变量, 使用 let 来更新 option 的值, 比 set option={value} 要灵活一些.

如果只想针对当前 Window 的 option 进行写操作而不修改全局的 option, 只需要给变量添加相应的 namespace 即可.[其实是变量的作用域, 待会会提到]

:let &l:textwidth = 10
:echo &textwidth

此时输出是10. [我们也可以使用:setlocal textwidth = 10 来设置 local textwidth]

开一个新的 Window, 继续输出:

:e text.txt
:echo &textwidth

此时输出是 90.

说明刚刚针对 textwidth 的修改, 只对前一个 Window 有效.

[ 这里需要在不同的 Windows 下进行上面的操作, 因为同一个 Window 下的 buffers 共享相同的 option, 如果在同一个 Window 下的不同 buffer 中执行 :echo &textwidth , 输出都是10.]

除了 option 外, registers 也可以作为变量来进行读写. 格式为 @{register}

比如, 我们设置寄存器 a 的值为 hello.

:let @a="hello"

Normal 模式下, 在文件的任何位置, 按"ap, Vim 会把 寄存器 a 的值 hello, 粘贴在光标处.

也可以读取寄存器的值. 在文件中, 选中某个单词, 比如 world, 按 y 后, 在命令行执行:

:echo @"

会输出 world.

使用:help registers , 可以查看所有可以读写的寄存器.

除了声明变量外, 当我们想要删除某个变量时, 可以使用 unlet.

:unlet foo
:echo foo

此时会输出错误信息: Undefined variable: foo.

注意, unlet 不能用于 &{option}, @{register}.

作用域

在设置 local option 时, 我们已经提到了作用域.

现在以 buffer 为例, 我们来定义一个 buffer-variable:

:let b:hello = "world"
:echo b:hello

输出: world.

在另一个 buffer 中, 执行:

:echo b:hello

输出: Undefined variable: b:hello.

因为声明的 b:hello 只对前一个 buffer 有效.

可以通过 :help internal-variables , 来查看内部变量的 scope 列表.

|buffer-variable|    b:	  Local to the current buffer.
|window-variable| w: Local to the current window.
|tabpage-variable| t: Local to the current tab page.
|global-variable| g: Global.
|local-variable| l: Local to a function.
|script-variable| s: Local to a |:source|'ed Vim script.
|function-argument| a: Function argument (only inside a function).
|vim-variable| v: Global, predefined by Vim.

这里可以看出, 刚刚我们通过&l:textwidth={value} 设置了textwidth, 我们可以猜 Vim 中的 {option}, {option}= 本质上应该是个函数.

上述列表中的 script-variable, function-argument 大量存在plugin中,随意选择一个Vim 插件,查看其源代码,就会看到s:var, a:var 的身影.

OK, 变量的介绍就到这啦, 下一篇来说说 if.