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
宽度涉及到四个参数的设置:tabstop
、
softtabstop
、shiftwidth
、expandtab
。而它们的设置取决于你想要如何使
用 TAB
。
保留 \t
字符缩进
如果你需要在你的文件中保留 \t
字符,你只需要设置 tabstop
和
shiftwidth
。
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
目录下面,理论上
你只有在对这些默认的设置不满意的时候才需要去设置 smartindent
,
cindent
等信息。
我通常使用 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 中 感受飞一般的感觉。