优雅的配置 Vim
如果你是个 Vim 爱好者,且如果你在各种不同的计算机,不同的操作系统 ( Windows, Linux, Macos X 以及 BSD 等 )下,不同的 Vim 版本 下,以及不同的 Vim 打包下(最小安装或自定义安装),你的 vimrc 可能无法通用,启动 vim 时出现很多错误。当然你也可以保存一个最精简的 vimrc,阉割掉很多实用的功能来忽略这些可能出现的错误。
不过实际上完全不必如此,一个兼容性良好的 vimrc 即可,下面几种方法可以有效的解决这些问题。
功能:
可能这是最好的方式了,在 vimrc 中采用 has()
函数来检查这些功能的存在,并尝试相关的任何配置,譬如
if has("spell")
set spelllang=en_us
nnoremap <leader>s :set spell!<CR>
endif
这里设置 spelllang 存在的情况下,配置选项,并定义快捷键。
在不同的 Linux 发行版下,Vim 被编译成默认包含不同功能的版本,不过你可以通过 vim --version
来列出你系统上 Vim 的功能列表清单,看看 Vim 包含哪些库,譬如:
^_^ ~ $ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep 28 2013 07:48:12)
Included patches: 1-41
Modified by Gentoo-7.4.41
Compiled by danny@Havee
Huge version without GUI. Features included (+) or not (-):
+acl +farsi +mouse_netterm +syntax
+arabic +file_in_path +mouse_sgr +tag_binary
+autocmd +find_in_path -mouse_sysmouse +tag_old_static
-balloon_eval +float +mouse_urxvt -tag_any_white
......
system vimrc file: "/etc/vim/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: x86_64-pc-linux-gnu-gcc -c -I. -Iproto -DHAVE_CONFIG_H -march=corei7 -O2 -pipe -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: x86_64-pc-linux-gnu-gcc -Wl,-O1 -L/usr/local/lib -Wl,--as-needed -o vim -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -lncurses -lelf -lnsl -lacl -lattr -ldl
列表中列出了很多不同的功能,譬如 +statusline
,可能其他的发行版或其他的计算机默认没有包含次功能,那么可以如此设置:
if has("statusline")
hi Statusline cterm=bold ctermfg=yellow ctermbg=blue
set statusline=%F%m%r%h%w\ %=[FORMAT=%{&ff}]\ %{\"[\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\" ,B\":\"\").\"]\"}\ [TYPE=%Y]\ [POS=%l,%v][%p%%]
set laststatus=2
endif
如果你经常在 Windows & Linux 下使用 Vim,那么可以如此设置:
if has("unix")
set some
else
set other
endif
你当然可以通过如下查看具体的 feature-list
:help feature-list
检查
你可以检查一些功能是否存在其本身的一些选项,譬如
if exists("&foldenable")
set foldenable
endif
一些功能可能只能存在高版本的 Vim 中
if v:version >= 700
set foldenable
endif
不同的终端
if &term == "xterm"
" Do stuff for xterm
elseif &term == "vt100"
" Do stuff for a vt100 terminal
else
" Do something for other terminals
endif
Silent calls
如果你实在无法确定是否包含的功能与版本,则可以通过 silent!
来避免一旦没有包含相关功能选项时的出错。
silent! call pathogen#infect()
silent! colorscheme pablo
Try/Catch/If
你也可以使用 try/catch/endtry
来配置一些备用的选项,譬如
try
colorscheme pablo
catch
colorscheme default
endtry