introduce to vim configs structure

Introduction

此文章简要介绍一下此 vim 配置文件和分享 vim 的实用插件。

自己的平时文本编辑和 coding 很依赖 vim,无论是在 windows 还是在各种 linux distributions 上,因此必然就要设计到配置文件的适用性问题。windows的确是 比较累人的系统,vim 所写作的各种外围工具(ctags, cscope, grep)都需要额外安装, 而且 windows 处理路径与 unix 路径很不相同,非常不习惯。

为了实现各个平台的配置文件可以及时更新,源代码管理系统是必不可少的。自己 选择了 git。由于一年中只有中总有一段时间没有网络,因此 svn 不大适合自己。而分布 式的 mercurial 虽然跨平台性要明显优于 git,但是托管平台可供选择的余地不 大,而且 git 的各种客户端非常丰富,因此选择了 github 这个优秀的源代码 hoster。

Structer

由于自己的 vim 配置文件很庞杂,因此要好好的组织管理。

.vimrc(windows上是_vimrc) 是默认的配置文件,自己是将此文件作为对各个局部 文件的管理文件,可以灵活的控制载入多少配置文件,一般情况时都会载入,vim 还是比较轻便的 editor。

局部配置文件还直接放置在 HOME 目录下,感觉还不是很合理。其余相关的插件都 放置在 ~/.vim(windows 下是 ~/vimfiles) 目录。

" load appearance settings
source $HOME/appearance.vim
" load programming related settings
source $HOME/program.vim

现在还只有两个局部配置文件,以后随着自己对于 vim 使用深入还会再添加其他 的自定义文件。appearance.vim 文件主要是控制 vim 的外观,例如编码,字体和 颜色主题。program.vim主要用来控制各种编程相关的设置和一些插件。

外观设置

外观设置主要有文件 appearance.vim 文件控制。这里的外观比较广泛,包括 vim 的编码设置,中英文字体和颜色方案(colorscheme)。

编码设置

vim 默认是使用 UTF-8 编码的,vim 的编码功能很强大,对双字节语言的支持非 常完善。可以设置读取文件的编码顺序,也可以指定默认的保存文件编码。另外, 当然也可以设置 vim 的菜单栏和信息的语言。

在 vim 的编码系统中,filencodings 表示读取文件时编码的依次自动探测顺序。 如果要获得对于中文的支持,需要添加 "chinese,taiwan",就可以处理以 gbk 和 big5 编码的中文文件了。相应的 fileencoding 便是保存文件时的编码,由于要 经常跨平台编辑文件,首选 utf-8。encoding 表示 vim 内部使用的编码,设置为 utf-8 是 很妥当的。

默认情况下, vim 会根据当前的语言环境,例如如果是 "zh_CN.UTF_8",就会显 示中文界面和信息。但如果你喜欢英文的界面,你也可以更改设置。其中, langmenu 可以设置菜单栏的语言, $LANG 可以用来设置信息的语言。

在读取和保存文件时,还必然会碰到不同的文件格式,即 EOF 不同的问题。vim 也可以设置默认的保存格式。此处变量 fileformats 表示可以读取的文件为 unix 或 是 dos 格式,而fileformat 表示只用 unix 格式保存文件。

if has("gui_running")
    set encoding=utf-8              " always use UTF-8 as vim internal encoding
    " set input character to be encoded in utf-8
    let &termencoding = &encoding
    " configured to edit file encoded by utf-8,GBK,japanese and BIG5
    set fileencodings=ucs-bom,utf-8,chinese,taiwan,japan,korea,latin-1
    set fileencoding=utf-8          " always use utf-8 to save file

" solve menu characters unrecongnizable
    " menu language settings 
    source $VIMRUNTIME/delmenu.vim
    set langmenu=none               " use english menu defaultly
    source $VIMRUNTIME/menu.vim
    " solve console output characters unrecongnizable
    " set environment variable $LANG
    let $LANG = "en_US.UTF-8"
endif

" file fomats autodetection is enabled
set fileformats=unix,dos
" always use unix format to save files,Don't display ^M character
set fileformat=unix

字体设置

vim 的字体设置可以非常惬意,可以分别为中文和英文指定不同的字体。但是在 windows 上,可能默认不能使用所有系统中所有的中文字体,你可以下载另外一个 recompile and hacked 的 vim,就可以正常使用那些优雅的中文字体(雅黑)。 在 windows 上,使用 Consolas, 感觉要比 DejaVu Sans Mono 更舒服,在 linux 上, 肯定是当仁不让的 "DejaVu Sans Mono + WenQuanYi Zenhei" 的组合。

变量 guifont 控制默认的使用字体, guitontwide 可以另外设置双字节语言所使 用的字体,就是CJK,就可以设置使用的中文字体。

if has("win32")
let s:win_font = "Consolas"
let &guifont = s:win_font
elseif has("unix")
    let s:win_font = "DejaVu Sans Mono"
    let s:unix_chs_font = "WenQuanYi Zen Hei Mono"
    let &guifont = s:unix_font
    let &guifontwide = s:unix_chs_font
endif

这里的代码会涉及到一些 vim script 的用法,简单说明一下。

"s:win_font" 和 "s:unix_font" 以及 "s:unix_chs_font" 都是为了更好的模块 化而设置的局部变量,用来存放具体要设置的字体的名称(设计是用来从 .vimrc 传入的,现在还未实现,还在学习中),然后再把相应的值赋值给 guifont 变量。这里用到了 let 语句,如果有兴趣,可以参考 vim 的参考手册。

颜色主题以及工具菜单栏

由于 gvim 的工具栏不是很美观而且基本还是更多的倾向于 cli,因此默认不显示 工具栏。

if has("win32")
    "set guioptions-=m              " disabel menu
    set guioptions-=T               " disable toolbar
endif

vim 也可以变得很靓丽,可以很柔和,也可以很深沉。vim 的颜色主题非常丰富, 自己也有一些比较偏爱的主题。在淡系主题里,eclipse 和 pyte 很不错,在深色 系主题里,选择的余地很大,例如经典的 desert 以及 desertEx,oceandeep 和 zenburn 也是非常舒服。

vim 的颜色主题也分为两种,一种是只适用于 cli 的,另外是 cli 和 gui 都可 以使用。为了避免 cli 下可能的兼容问题(在 cmd 下曾出现过问题),在没有 gui 情况下, 默认不使用主题。

let s:theme = "tango-morning"
if has("gui_running")
    let g:colors_name = s:theme
else
    " colorscheme can't work in windows cmd 
    if has("unix")
        let g:colors_name = s:theme
    endif
endif

这里的代码为了更好地可能实现的模块化,舍弃了部分代码的可读性。

默认的颜色主题设置是通过命令 "colorscheme" 设置的,这里的颜色主题切换是 直接使用此命令背后的 vim 内置的全局变量 "g:colors_name" 变量了,通过定 义局部变量 s:theme 用于存放当前设置的颜色主题。

常规设置

如下是一些比较杂的使用常规设置。

set nocompatible                           " always in no compatible mode
set number                                  
set noerrorbells                           " No sound on errors.
set novisualbell
set t_vb=
set showmatch                              " show matching bracets
set mouse=a                                " mouse work in console well
set clipboard+=unnamed                     " share clipboard with windows system

" sometimes backspace can't delete characters in insert mode
" allow backspacing over indent, line breaks and start of insert
set backspace=indent,eol,start
set autoread                                
" Set to auto read when a file is changed from the outside
" status line
set laststatus=2                          " always display a status line
set statusline=%t%r%h%w%m\ [%Y]\ [%{&fileformat}]\ [%{&fileencoding}:%{&encoding}]\ Line:\ %l/%L:%c\ Percentage:\ %p%%-%P

coding相关设置

缩进(indent)

使用 vim 进行 coding 时,第一个要涉及的问题是如何处理程序代码之间的缩进, 以及缩进是使用 tab 还是 spaces 键,以及默认的缩进长度是4个字符还是8个 字符。对于所谓的 coding style,程序员们对此还是有所争执的。

自己推荐的 coding style 是只使用空格键做缩进,只是不想再被 tab 和空格键混 合所折腾,对于绝大多数的语言(python,ruby)是使用4空格的缩进。但是,对于 C 语言,还是使用 unix 传统的8个字符的缩进,vim 对此也是额外对 C 语言提供了 设置选项(cinoptions)。详细的可以参考 program.vim对于 coding style 的说明 。

在 vim中, shiftwidth 用来设置默认的缩进宽度,tabstop 为 tab 的宽度, expandtab 变量控制是否在自动缩进用等量的空格替代 tab 字符。对于 C 语言, 可以使用 cinoptions 进行详细的设置,vim 手册中也提供了 gnu style 相应的 设置,可以参考。

当然,你也可以用你喜欢的 coding style 去快乐的 coding,vim对此也有很强大 的支持,以后还会介绍。

另外,建议一行的字符数最好不要超出 80 个字符,也是 unix 历史传统。

set cindent
set cinoptions=>8       " tab characters for c is 8 characters.
set shiftwidth=4        " default indent width(not for c) is 4 characters
set tabstop=8           "  width is 8 characters set softtabstop=4       " Press an tab forward 4 characters set expandtab           " always use spaces to insert a  

折叠设置

vim 和 emacs 都是历史悠久优秀的 editor,但是个人体会折叠功能不如现在的编 辑器如 scite,eclipse 好用,但还可以,自定义的空间比较大。

vim 一共有 5 种折叠方法,依次为手工折叠、缩进折叠、语法折叠、标记折叠、 表达式折叠和根据标志折叠。可以通过变量 foldmethod 选择具体的折叠方式,常用的 为 syntax 和 indent。分别为根据缩进折叠这根据语法折叠。缩进折叠适用于绝大数的 编程语言,特别适用于python,而对于 C 语言,vim 提供了很好的 syntax folding 支持。

常用的快捷键为 zr 和 zm,分别为折叠的更少(reduce)更多(more),zR 和 zM 可 以打开或是折叠所有折行,实际上,这几个命令只是增减了变量 foldlevel 的值。 通过设置变量 foldlevel 可以设置折叠层级,例如 "set foldlevel=100" 可以设 置打开时默认不折叠,而 "set foldlevel=0" 时打开文件时会折叠所有可能的折行。

" Fold config
" use autocmd to set syntax foldmethod for c and h filetype.
autocmd BufNewFile,BufRead *.c set foldmethod=syntax
autocmd BufNewFile,BufRead *.h set foldmethod=syntax
if &filetype == "c"
    " FIXME: can't set right foldmethod when detect c filetype
    " fold based syntax file for c source files
    set foldmethod=syntax
else
    " fold based indent for mostly languages
    set foldmethod=indent
endif
"set foldlevel=100      " dont't fold when open
set foldlevel=0         " fold when open

coding convenient 设置

coding 时,语法高亮是必不可少的,打开了自动对长行的自动换行的设置。

syntax enable
set textwidth=72        " width of text for comments
set formatoptions+=mM   " vim can process multi-characters reformat
set wrap
set linebreak

在搜索时,高亮搜索词是很使用的,打开增量搜索可以实时性的更新,不忽略字母不大 写,不循环搜索。

" search setting
set hlsearch            " Highlight search thingss
set incsearch
set noignorecase
set nowrapscan          " no serach wrap

实用插件

使用过 vim 的很多插件以后,最后剩下的还在使用的插件也不多。只有[taglist], [autocomplpop],[bufexplorer]。关于插件还会做单独的介绍。