vim 个性化设置与功能扩展均通过 script 来实现,这种 script 又叫 plugin。plugin 是 vim 的核心与精髓。
最常用的配置文件 vimrc,也是一种 plugin。换句话说,所有的 plugin 都在配置 vim 的行为。
常见的 plugin 类型:
vimrc 是核心 plugin (类似 main
函数),所有的配置都可以在这一个文件中完成。 所有其他配置都直接或间接由该文件调用以生效。
与其他编程语言一样,为了提高源文件的可读性,增加代码的可重用性等, 衍生出了 global/filetype/syntax/compile 等 4 中主要的 plugin。
通过 runtime
, source
等命令加载其他 plugin。
vim 通过路径区分 plugin 类型。 由 runtimepath
控制搜索顺序,一旦找到立即停止。
默认搜索顺序:
$HOME/.vim
: linux home 目录下的用户个性化设置建议将个性化配置全部放在 $HOME/.vim
中, 与 vim 自带的配置文件隔离,方便备份。 vim 中执行 :echo $variable
查看变量取值.
查看默认 plugin 搜索路径:
:set runtimepath? runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/ vim73,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after
拷贝到对应的 plugin 目录下即可。
更新帮助文档,在 vim 中运行 :helptags ~/vimfiles/doc
global plugin 位于 plugin
目录下,对全局生效,所以默认自动加载。
filetype plugin 只对特定类型的文件生效。
根据文件类型动态决定行为,通过事件监听(autocmd)实现。 基本原理如下:
" required filetype plugin on " define behavior when filetype change to `tt` " here, the behavior is set to execute echo "hello" autocmd FileType tt echo "hello" " execute cmd below, output "hello" at the bottom of vim window :set filetype=tt
如果没有用 autocmd 显式声明 xxx 文件对应的行为, 则加载 ftplugin 目录下的 xxx.vim
:set filetype=c "expt: load c.vim and change highlight in c syntax "required: c.vim in ftplugin, it is in $VIMRUNTIME/ftplugin by default
注意:使用 ftplugin 时,需要开启 filetype
和 filetype plugin
:filetype plugin on " 开启 filetype 和 filetype plugin
:filetype " 查看状态,输出如下
filetype detection:ON plugin:ON indent:ON
一个更深入 filetype plugin 的例子
autocmd BufNewFile,BufRead *.xml source ~/.vim/ftplugin/xml.vim
同样是事件监听机制,区别在于:
ftplugin/xml.vim
原理与 ftplugin 类似,监听 syntax 事件,加载 syntax 目录下的插件。 触发 filetype 事件的同时,也会触发对应的 syntax 事件。
syntax on
:set syntax=c
compile plugin
同样是事件监听,插件位于 compiler 目录。
" add below to vimrc autocmd BufNewFile,BufRead *.py compiler python` " open a file ending with .py and run :make " expt: errors printed
vim 在 vi 的基础上进行了很多的功能扩展。 若要使用 vim 的特性,vim 必须运行于与 vi 不兼容的模式。
一般,把 set noncompaible
放在配置文件开始处即可。
ubuntu 12.04 默认的 vimrc 先加载 ubuntu.vim, 其中设置了该选项。
vim 自身有很多 feature, plugin 都依赖于相应的 feature.
为了使 vimrc 通用,使用 plugin 前先用has()
检测feature 是否存在。 如下:
if has("syntax") syntax on endif
:version
查看 feature-list
:version VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35) 包含补丁: 1-429 修改者 pkg-vim-maintainers@lists.alioth.debian.org 编译者 buildd@ 巨型版本 无图形界面。 可使用(+)与不可使用(-)的功能: +arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent -clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape +mouse_dec +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +mouse_urxvt +multi_byte +multi_lang -mzscheme +netbeans_intg +path_extra -perl +persistent_undo +postscript +printer +profile +python -python3 +quickfix +reltime +rightleft -ruby +scrollbind +signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp -xterm_clipboard -xterm_save 系统 vimrc 文件: "VIM/vimrc" 用户 vimrc 文件: "HOME/.vimrc" 用户 exrc 文件: "HOME/.exrc" VIM 预设值: "/usr/share/vim" 编译方式: gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-s ecurity -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 链接方式: gcc -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L /usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 请按 ENTER 或其它命令继续