利器系列之 —— 编辑利器 Vim 之基础配置

Vim 党和 emacs 党之间有一场旷日持久的战争,他们都号称自己使用的编辑 器是最好用的编辑器,这是一场编辑器之神和神之编辑器的战争,从来都分 不清胜负。

我是一个从 Emacs 阵营转移到 Vim 阵营的人,当年放弃 Emacs 只是因为想 要学习 Vim,然后就没有然后了。Emacs 是一个非常优秀编辑器,只是我现 在使用的是 Vim,而我目前没有遇到想要放弃它的痛点。

Vim 的功能非常强大,不过没有配置过的 Vim 像是一把没有用过的宝刀 —— 锋利但不顺手。这个系列的文章目的是让 Vim 顺手起来,让它使用起来至少 不会那么别扭,让你有坚持使用它的冲动。

Vim 是一个可高度配置的编辑器,我无法在一篇文章中把他讲透侧说清楚。 所以这个工具分成三个部分介绍:

  • Vim 常用选项配置

  • Vim 快捷键配置

  • Vim 插件配置

这篇文章是 Vim 系列的第一篇文章,主要介绍 Vim 在日常编程中常用的一 些选项设置。文中完整的配置文件你可以在我的代码仓库中找

如何配置你的 Vim

要修改 Vim 的各种配置通常有两种方式,第一种方式是输入: 然后在命 令行模式下输入配置命令,比如 set number,这种方式改变的配置会在 Vim 退出之后失效;第二种方式是在你的配置文件中加入你的配置命令,比 如在 ~/.vimrc 中加入 set number,这种方式改变的配置会一直有效, 因为 Vim 启动的时候会先读取配置文件。

非兼容模式

这几乎是所有的 Vim 配置文件的第一个配置,因为 Vim 是基于 VI 的,为 了兼容 VI,Vim 默认使用了兼容模式。然而 VI 毕竟是上个世纪的产物,它 有很多地方显得非常的诡异,比如你无法使用 backspace 删除、使用 c 指令替换掉的内容在退出 insert mode 之前会残留在屏幕上等等。

Vim 是 VI Improved 的意思,为了能够使用这些 Improved 的部分,我们 需要使用非兼容模式。你只需要在你的配置文件中加入

set nocompatible

行号

Vim 默认不显示行号,如果你需要显示行号可以在你的配置文件中加入

set number

当然你也可以设置不显示行号,因为理论上你打开的特性越多,你的 Vim 就 越慢,你可以通过下面的配置来关闭行号的显示。

set nonumber

不过行号在调试程序的时候还是非常有用的,因为你的编译器通常会告诉你 问题出在哪一行。我比较喜欢的做法是默认关闭行号,在需要用到的时候输 入 set number 指令打开行号,为了简化这个过程,我把 F2 绑定为行号 的开关按键,方法如下:

nnoremap <F2> :set number!<CR>

语法高亮

语法高亮可以说是一个必不可少的功能,一方面它可以增加程序的美感,另 一方面它可以帮助减少程序中的 typo,比如关键字如果写错了,一目了然, 因为它不会被高亮。打开语法高亮:

syntax on

同样绑定 F3 作为语法高亮的开关:

nnoremap <F3> :exec exists('syntax_on') ? 'syn off' : 'syn on'<CR>

TAB 宽度设置

TAB 缩进在任何一门语言的 coding style 中都会被反复的提及,而不同 的规范也会有不同的缩进要求。通常来说,编写程序的时候我们习惯使用 TAB 进行缩进,不过不同的环境下一个 TAB 会被显示成不同的宽度,我 们经常会遇到一个源文件在你的电脑上显示的非常漂亮,到了其他地方就显 示的非常诡异,这也是我们需要进行配置的原因。

在 Vim 中完整的配置 TAB 宽度涉及到四个参数的设置:tabstopsofttabstopshiftwidthexpandtab。而它们的设置取决于你想要如何使 用 TAB

保留 \t 字符缩进

如果你需要在你的文件中保留 \t 字符,你只需要设置 tabstopshiftwidth

set tabstop=4
set shiftwidth=4

以上设置会保留你的 \t 字符,并把它显示成四个空格。这种做法并不是很推荐, \t 的宽度在其他软件中很可能是不一样的,比如:cat 中显示 8 个空格, 在视觉上和你在 Vim 显示的有很大的差别。这也是为什么很多人不提倡使用 \t 作为缩进的原因。

\t 转换成空格

大部分的编码规范中提倡使用空格作为缩进,但是空格输入起来非常的麻烦 ,所以我们通常还是使用 TAB 来进行缩进,然后把 \t 字符转换成空格 。 Vim 中提供了把 \t 转换成空格的功能:

set expandtab

而你需要把一个 \t 字符转换成多少个空格可以通过 softtabstop 这个参 数来设置。比如:

set softtabstop=4

让一个 \t 字符转换成 4 个空格。

和缩进相关的另一个值是 shiftwidth,它表示一次 shift 缩进(比如 > 向右 shift)的空格数,最常见的做法也是把它设置成和 softtabstop 一 样的值。

set shiftwidth=4

因为我们把 \t 转换成空格,所以你可以选择不设置 tabstop 的值。

代码自动缩进设置

Vim 的缩进并不强大而且很容易让人迷惑,你想要用它来完成代码的格式化 工作其实比较困难,因此这里不会重点介绍它的设置。后续的文章中会介绍 如何使用 astyle 在 Vim 完成代码的缩进。

Vim 的代码缩进设置和它的 TAB 宽度设置一样让人迷惑,因为它包含了太多 的选项。和缩进相关的选项主要是:autoindent, smartindent, cindent。

这里不想去介绍这几个选项之间的区别以及如何设置它们,因为没有一种设 置是适合所有的文件类型的。最合适的做法是根据不同的文件类型设置不同 的 indent。 Vim 给我们提供了这个功能,你需要做的只是在你的 ~/.vimrc 中加入:

filetype plugin indent on

如此一来 Vim 会自动为了探测文件的类型从而应用不同的 indent 设置。这 些默认的设置一般位于 /usr/share/vim/vim74/indent 目录下面,理论上 你只有在对这些默认的设置不满意的时候才需要去设置 smartindentcindent 等信息。

我通常使用 Vim 做 c、c++ 的开发,Vim 会自动的识别出文件类型并且设置 indent 为 cindent。和 cindent 相关的一个参数有 cinoptions、cinwords 、cinkeys 等等,你可以在你的配置文件中设置这些值来改变缩进的行为。 不过我通常不会这么做,因为它能够设置的东西太少,我更倾向于使用 astyle 结合插件来完成我想要的各种格式化和缩进设置。

80 字符限制

源文件不超过 80 个字符几乎在任何一个编码规范中都有提及,如果使用过 像 Tmux 这样的分屏工具,你会发现这一点非常有意义,因为你通常需要在 半屏查看源码。如果你的代码超过半屏,换行之后的显示非常难看。在 Vim 中我们可以在 80 个字符的位置显示一条竖线来警示我们写代码不要超过 80 个字符:

set colorcolumn=81

此外,你可以使用 Vim 的另一个选项 textwidth,让它在超过 80 个字符 的时候自动换行,方法如下:

set textwidth=80

这些设置是对于英文设定的,如果你需要使中文也能如此,你需要加入如下 的配置:

set fo+=mB

其中 m 表示允许在两个汉字中间换行,而 B 表示将两行合为一行的时 候不要在两个汉字之间加入空格。

和宽度有关的另一个设置是 wrap。如果你的终端尺寸太小,在 Vim 的一 行很可能超过了终端的宽度,Vim 在这种情况下会把这一行在自动换行显示 ,很多时候这会让你的代码乱成一团,尤其是在你没有遵守上面的 80 个字 节限制的时候更是如此。如果你想要关闭 Vim 的自动换行显示,你可以进行 如下设置:

set nowrap

我习惯为这个功能做一个按键绑定:

nnoremap <F4> :set wrap!<CR>

搜索

搜索相关的两个常用设置是 ic 忽略大小写,hlsearch 高亮搜索

set ic
set hlsearch
nnoremap <F5> :set hlsearch!<CR>

同样绑定 来切换这个功能

文件编码格式

如果你不用考虑跨平台的问题,那么文件编码其实不是什么大问题,但是如 果你需要在不同的平台下编辑文件,那么你最好设置好合适的文件编码格式 ,否则你很可能会遇到一个文件在 windows 上显示正常在其 Linux 上就出 现乱码的问题。

在 Vim 中设置文件的默认编码的参数是 encoding,比较常用的做法是设 置成通用的 utf-8 格式,如下:

set encoding=utf-8

当然,如果你打开一个别人提供的文件,那么很有可能它使用的编码不是 utf-8,因为文件不是由你编辑,你无法指定它的编码格式。Vim 默认的会按 照 fileencodings 选项中列出的编码格式依次探测文件的格式。所以你可以 把这个选项设置成常用的格式列表:

set fileencodings=utf-8,ucs-bom,GB2312,big5

当然如果你经常遇到乱码问题,你可以考虑使用 fencview.vim 插件,它 使用词汇频率统计的方式来猜测编码,成功率据说比较高。

其他常用选项

还有一些常用的选项,有兴趣的也可以试一试。

" 高亮当前行
set cursorline

" 智能补全命令行
set wildmenu

" 不使用代码折叠功能
set nofoldenable

" 不使用 swapfile
set noswapfile

第一个设置可以高亮你的当前行,这样至少你不至于在神游回来之后找不到你的光标 所在位置。第二个设置可以让你在命令模式下把可用的补全列出来非常直观,对于命 令的输入还是有非常大的帮助的。第三个这是完全是个人喜好,因为有了个人很少用 到代码的折叠。最后一个选项是关于 swap 文件,Vim 默认的开启 swap 文件, 它会使得 Vim 在编辑一个文件的时候首先把文件拷贝成一个临时的 swap 文件, 只有你使用 :w 保存之后才写入源文件中。Vim 在打开一个文件之前会先查看是否 存在这个文件,如果存在会有类似于 swap file already exists 这样的提示信息 ,比如你同时开两个 Vim 进程编辑同一个文件就会出现前面这种情况, noswapfile 这个选项就是用来禁用 swap 文件。


有了基础的配置之后其实我们已经可以开始比较顺畅的使用 Vim 进行日常的 编辑了。下一篇文章中我会重点介绍 Vim 的快捷键设置,让你的在 Vim 中 感受飞一般的感觉。