我的vimrc

vim它不是个成品,为了让它适应自己的习惯,我们要修改添加许多参数。而像我这样的人工作颇具多样性,文本、程序、网页等这些乱七八糟的事情说不定什么时候就要冲到最前线,因此我要求vim具有以下功能:

  • 打开不显示捐献的提示
  • 自动识别文件编码并载入,状态栏显示文件编码,能转换编码
  • 语法高亮,php、shell、c/c++、html/css、python等
  • 括号自动匹配,能识别大括号、中括号、中文成对的符号
  • 显示行号
  • 显示标尺
  • 搜索逐字提示、高亮显示所以匹配的字符串,并不区分大小写
  • 换行时能自动缩进
  • 不自动换行
  • 底色为暗色,主题为murphy
  • 带文件管理器
  • 不自动保存
  • 中文帮助
  • 显示控制字符
  • 有列模式,能处理像csv等文件
  • 删除行尾特定字符

以上要求会逐步变化,以下的vimrc内容也会随之改变

“不与vi兼容
set nocompatible
”保存全局变量
set viminfo+=!
“未保存时确认
set confirm
”中文帮助
set helplang=cn
”文件编码
set fenc=utf-8
”文件编码检测类型
set fencs=utf-8,gb18030,gbk,gb2312,cp936

“检测文件类型
filetype on
”启用文件类型插件
filetype plugin on
”为特定文件类型载入相关缩进文件
filetype indent on

“启用语法高亮
syntax enable
”显示行号
set nu
”显示右下角显示当前行列数
set ru
”启用匹配模式
set showmatch
”查找不区分大小写
set ignorecase
”高亮显示查找字符
set hlsearch
”即键即查
set incsearch

“不显示工具栏
set guioptions-=T
“一个tab键为4个空格
set tabstop=4
set softtabstop=4
”缩进的空格数
set shiftwidth=4
”自动对齐
set autoindent
”智能对齐
set smartindent
”使用c/c++语言的自动缩进方式
set cindent
”禁用自动换行
set nowrap
”禁用自动保存
set noautowrite
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v]\ [%p%%]\ %{strftime(\"%d/%m/%y\ %H:%M\")
”总是显示状态行
set laststatus=2

“背景颜色
set background=dark
”配色方案
colorscheme murphy

显示字符编码的办法还是没有找到,比较无奈。

下面转载一段文章:

vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)

其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:set fenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。

fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么 vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:set fenc?来查看具体是什么。

当然这个也是有可能出错的,比如你的文件是gb18030编码的,但是实际上只有一两个字符是中文,那么有可能他们正好也能被utf-8解码,那么这个文件就会被误认为是utf-8的导致错误解码。

至于enc,其作用基本只是显示。不管最后的文件是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在 linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者 utf-8(或者gbk之类的)。

最后再来说一下新建空文件的默认编码。看文档好像说会采用fencs里面的第一个编码作为新建文件的默认编码。但是这里有一个问题,就是fencs 的顺序跟解码成功率有很大关系,根据我的经验utf-8在前比gb18030在前成功率要高一些,那么如果我新建文件默认想让它是gb18030编码怎么办?一个方法是每次新建文件后都:set fenc=gb18030一下,不过我发现在vimrc里面设置fenc=gb18030也能达到这个效果。