前面我们算是对 vimscript
做了一个入门,并且实现了一个 输出 hello world
的语句。现在我们继续进行 vimscript
的学习。
set语句
之前在介绍 vim
基础的时候,我们说要开启或者关闭某个属性,并且给出了相关的配置代码。那个时候已经接触了 set
语句了。例如我们使用 set number
来显示行号。这里我们可以知道 set的第一个用法:
set attribute
其中这个 attribute
是一个属性名称,用于开启/关闭属性。
设置布尔值
一般在程序设计中将开启或者关闭某个特性的变量设置为 bool
值。在 vim
中也是如此,但是它的特殊性在于它并不是将这个变量设置为 true
或者 false
而是设置为 name
或者 noname
的样子。举个例子,设置显示行号使用 set number
设置不显示行号使用 set nonumber
。
另外对于 bool
类型的属性值还可以使用 !
来对现有值进行取反,使用 ?
来查看当前使用的值。例如,如果当前不显示行号 set number!
会显示行号,再次执行则 :set number!
则不会执行。我们可以使用 set number?
来查看当前是否显示行号
下面我们来执行这么一个例子
代码语言:javascript复制set number
set number?
set number!
set number?
第一个 set number?
应该会返回 number
而第二个应该会返回 nonumber
设置键值对
有些值是属于 bool
类型,我们只需要 set
某一选项即可。但是有些属性并不适合设计成 bool
类型,例如窗口宽度、高度等等。他们更适合做成一个键值对的形式。针对这种形式的属性,我们直接使用 set key=value
的形式。例如 set columns=80
。对于这种类型的属性仍然可以使用 ?
来显示当前的值。例如 set columns?
来显示当前每行的最大字符长度。
当然,与其他编程语言类似,我们也可以使用 set
语句,一次性给多个属性进行赋值,例如
set number columns=80
只是一般编程语言多个变量的赋值使用 ,
作为分割,但是 vimscript
中使用 空格。
使用 lua 设置vim属性
作为一门更加规范的编程语言,lua
提供了多种方式来对这些变量进行赋值。目前有如下办法能对这些属性进行赋值。
使用neovim提供的全局函数进行设置
neovim
中提供了一组函数来设置这些属性。常见的分为三类:
- 设置全局属性
a.
vim.api.nvim_set_option()
:设置值 b.vim.api.nvim_get_option()
: 获取值 - 设置窗口相关属性
a.
vim.api.nvim_win_set_option()
: 设置值 b.vim.api.nvim_win_get_option()
: 获取值 - 设置缓冲区相关属性
a.
vim.api.nvim_buf_set_option()
:设置值 b.vim.api.nvim_buf_set_option()
: 获取值
例如我们可以使用 vim.api.nvim_set_option('number', true)
来设置 显示行号。使用这些函数时需要严格区分对应属性是 bool
、数字或者字符串类型。在 vimscript
中则没有这么严格的区分。
使用元访问器进行设置
neovim
的接口针对上述这些函数进行了一定的封装,提供了一组元访问器,以便我们能够像使用普通变量一样使用这些属性值。至于什么是元访问器暂时不用关心,只需要知道我们可以像使用变量一样来设置和获得这些属性,但是本质上还是在调用上述那些函数。
针对上述函数,我们可以使用如下几种访问对象:
- vim.o: 全局属性,我们可以利用 options来记忆
- vim.bo: 缓冲区属性,我们可以利用 buffer-option来记忆
- vim.wo: 窗口属性, 我们可以利用 window-option来记忆
例如我们可以使用 vim.o.number = true
或者 vim.o.columns = 80
来设置对应选项。等效于 vim.api.nvim_set_option("number", true)
和 vim.api.nvim_set_option("columns", 80)
总结
通过这篇文章,我们讨论了使用 set
来设置一些选项,并且给出了对应的使用 lua
来设置的方法。下面小伙伴们要做的就是读一下 vim
的用户手册,根据自己的喜好尝试着设置一些其他选项。
例如我喜欢的基本配置如下:
vim.o.syntax = "enable"
vim.o.relativenumber = true
vim.o.number = true
vim.o.wrap = true
vim.o.ruler = true
vim.o.incsearch = true
vim.o.softtabstop = 4
vim.o.shiftwidth = 4
vim.o.expandtab = true
如果是vim可能需要的配置更多,但是 neovim
没有历史包袱,默认的已经很好用了
最后,目前教程采取这种 vimscript
穿插着 lua
的方式进行讲解,后续配置虽然主要以 lua
为主,但是有时候又离不开 vimscript
,neovim
并没有完全开放 vim
的内置功能,有些功能只能使用 vimscript
来实现。
目前我不太确定是继续采用这种 vimscript
穿插着 lua
进行讲解还是采用将 vimscript
和 lua
分开进行讲述。各位小伙伴觉得哪种方式更能接受呢?