设置选项的命令是 set
。根据选项值的不同情况,可以将选项分为以下三类:
:set option
表示开启选项,:set nooption
表示关闭选
项。例如 :set number
是设置显示行号,:set nonumber
是设置不显示行号。:set option=value
设定该类选项的值。选项值可以是数字
或字符串,但字符串的值也不能加引号,就按字面字符串理解。也就是说,:set
后
面的参数,不是 VimL 的表达式,与 :let
命令有根本的不同。这个命令更像是
shell
设置变量的语法,=
前后也最好不要用空格。:set option=val1,val2
。
此外还支持 +=
增量与 -=
减量语法,如 :set option+=val3
或 :set option-=val2
,表示在原来的“值集合”的基础上增加某个值或移除某个值。在选项名前面加个 &
符号,就将一个选项变成了相应的选项值变量。例如,以下两条
命令是等效的:
: set option=value
: let &option = value
与普通变量赋值一样,=
前后的空格是可选的,这里的空格只是一种编程习惯,为增加
可读性。另外有以下几点要注意:
:set
命令时不需要等号,但是用 :let &
命令时也要用等号将
其值赋为 1 或 0,分别表示开启选项与关闭选项。同时 &
只允许作用在没有 no
前缀的选项之前。比如 :let &nonumber = 1
是非法的,只能用 :let &number = 0
表示相同意图。:let &
命令时要将值用引号括起来,也就像普
通变量赋值一样,要求等号后面是合法的表达式。:echo &rtp
。并不
能由于这类选项支持多个值就将 VimL 的列表赋给它,不过很容易通过 split()
函
数从这类选项值中分隔出一个列表。备注:选项设置 :set
应是历史渊源最早的命令之一吧。而 :let
是后来 VimL 语言
发展丰富起来提供的命令。两者有不一样的语法,所以又提供了这种等价转换方法。
严格地说,:set
是设置全局选项的命令。既是影响全局的选项,一般是要第一时间在
vimrc
中配置的。最重要的是以下两条配置:
: set nocompatible
: filetype plugin indent on
第一条配置是说不要兼容 vi
,否则可能有很多 vim
的高级功能用不了。第二条配置
(虽然不是 set
选项)是用 Vim 编写程序源代码必要的,意思是自动检测文件类型,
加载插件,自动缩进的意思。除非在很老旧的机器上,或为了研究需要,一般都没理由不
加上这两条至关重要的配置。
下面再介绍一些比较重要的几类配置选项,当然这远远不够全面。查看选项的帮助命令是
:help options
,查看某一个选项的帮助是在用单引号括起选项名作为帮助参数,例如
:help 'option'
。查看某个选项的当前值是命令 :set option?
或 :echo &option
。
编码相关:encoding fileencodings fileencoding
:set encoding=utf-8
。:set fileencodings=ucs-bom,utf-8,gb18030,cp936,latin1
。外观相关:number/relativenumber wrap statusline/tabline
2
表示始终显示状态栏。GUI外观:只在 gVim 或有 GUI 版本的 Vim 有效
颜色主题:
set
选项。选择一个颜色主题。颜色主题
是放在运行时各路径的 colors/
子目录的 *.vim
文件。dark
或浅色 light
。有的 colorscheme 只适于深色或
浅色背景,有的则分别为不同背景色定义不同的颜色主题。格式控制:
路径相关:
&rtp
路径
下,现在流行的是将插件工程主目录添加至 Vim 的 &rtp
中。~/.vim/pack
。
插件主目录可置于 {packpath}/{packname}/opt/{plugin}
。然后用 :packadd
启用插件。gf
:find
等命令时所要搜索的一组目录。Ctrl-]
或 :tag
等命令所依据的标签文件,默认是
./tags,tags
(相对路径)。一般不建议修改默认值,但可以默认值基础上添加更
多的标签文件,比如编辑一个工程时,将工程主目录下的 tags 文件也加进来。:e
命令打开同目录下的其他文件时很方便。Vim 所支持的选项实在是太多了。初学者建议参考前人经验成熟的配置,用 :help
查
看每个选项的具体含义,然后决定这种选项是否适合自己。另外注意有些选项可能要配合
起来才能发挥更好的效果。
局部选项是只影响当前缓冲文件或窗口(buffer/window)的选项。严格来说是局部选项 值,而不是有另外一类选项。默认情况下每个新文件或窗口都继承选项的全局值,但对于 一些选项,可以为该文件或窗口设定一个不同与全局的局部值。然而并不是所有选项都有 局部值意义,在每个选项的帮助文档中,会指明该选项是全局(global)或局部的( local to buffer 或 local to window)。
设置局部选项(值)用 :setlocal
命令。如果目标选项没有局部值,则等效 :set
命令设置全局值。但是最好不要混用,避免误解。局部选项值变量用 &l:option
表示
。比如 number
行号就是个局部选项:
: set nonumber
: setlocal number
: echo &number
: echo &l:number
: echo &g:number
你可以将 vim 分裂出两个窗口(:split
或 :vsplit
),在其中一个窗口上执行以上
语句,试试看结果。需要注意的是,虽然局部选项值借用了变量的局部作用域前缀 l:
,但它的默认规则又有点不同。看这里的 &number
是默认的 &l:number
而不是
&g:number
。事实上,普通的局部变量 l:var
根本不能在函数外的命令行使用。
当用 VimL 写脚本时,如果要改变选项设置,且该选项支持局部值,最好用 :setlocal
只改变局部值。这也是编程的一大原则,尽量将影响局部化。下面介绍一些比较重要的局
部选项设置:
~/.vim/ftplugin/*.vim
脚本内若涉及选项更改,也尽量用
:setlocal
只设局部选项。buftype
的两个重要的选项值是 nofile
与 nowrite
,表示特殊的不用写文件
的 buffer,而这两者又还有细微差别,具体请读文档。由于在 Vim 中,最主要的可见(可编辑)对象就只是 buffer,所以在一些复杂而细致的
插件中,经常会开辟一个辅助窗口,仅为展示辅助内容,这就往往要设置一个特殊的
buftype
及其他一些 buffer 属性。
此外,在脚本中,可能有需求只临时改变某个选项值,处理完毕后再恢复原选项设置,这 就要借且选项值变量了。处理流程大致如下:
: let l:save_option = &l:option
: let &l:option = ? |" 或者 setlocal option = ?
: " do something
: let &l:option = l:save_option