From:http://blog.csdn.net/smstong/article/details/20567235
0 引言
理解vim的啓動過程對於增強使用vim的信心非常重要,本文所有的信息均來自vim自身提供的參考手冊和作者實際操作實踐。VIM REFERENCE MANUAL的Starting Vim這節詳細描述了vim的啓動過程。vim完整的啓動過程非常複雜,因爲要兼容不同的平臺,不同的運行模式。本文只考慮Windows, Mac OS X, Linux平臺上最常見的啓動流程。
1 vim啓動初始化流程
(1)設置內部變量shell和term
vim根據環境變量$SHELL和$TERM設置這兩個內部變量(option).
(2)處理命令行參數
命令行參數包括選項和要打開的文件名,vim爲每一個文件開闢內存空間。
(3)加載系統級別和用戶級別的配置文件
(a) 根據編譯時指定的路徑,加載系統級別vimrc配置文件
(b) 根據編譯時指定的路徑或默認路徑,加載用戶級別的vimrc配置文件
(4)加載插件文件
根據runtimepath內部變量的值加載。所有runtimepath中的所有目錄下名爲plugin的子目錄們下面所有以.vim結尾的文件都會被加載執行。
(5)設置shellpipe和shellredir內部變量
(6)如果命令行參數有-n,則設置updatecount內部變量
(7)如果命令行參數有-b,則設置二進制相關的多個內部變量
(8)執行GUI部分的初始化
(9)如果viminfo不爲空,則讀取指定的viminfo文件,恢復上次的編輯環境
(10)如果命令行參數有-q,則讀取quickfix文件
(11)打開顯示所有的窗口
(12)執行用戶指定的啓動時命令
可以看出,vim的啓動初始化流程非常複雜。本文我們只關心配置文件的加載部分,這也是與大多數vim使用者直接相關的部分。從上面的流程看出:
- vim加載系統級配置文件是根據編譯時指定的路徑加載的;
- 用戶級配置文件則可以在編譯時指定,也可以不指定,如果不指定,則使用默認值。默認值對於不同的平臺是不同的。
- 對於unix平臺:$HOME/.vimrc
- 對於Windows平臺:$HOME/_vimrc,如果不存在,則使用$VIM/_vimrc
- 插件文件是根據runtimepath來確定路徑的。
- 編譯時指定的系統級配置文件路徑可以是絕對路徑,也可能含有$VIM環境變量。
- 用戶級別配置文件路徑中含有環境變量$HOME。
- runtimepath的默認值如下:對於Unix平臺: $HOME/.vim, $VIM/vimfiles, $VIMRUNTIME, $VIM/vimfiles/after,$HOME/.vim/after;對於Window平臺:$HOME/vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after, $HOME/vimfiles/after.
2 配置文件路徑的確定
2.1 編譯時指定的路徑
在編譯vim源碼的時候,需要指定各種配置文件的路徑。如果最終用戶不是當初執行編譯的人如何知道這些信息呢?編譯後的二進制vim可執行文件,自身包含了當初編譯的時候指定的配置信息。我們可以通過執行vim --version來查看,如下是三個實例,一個是CentOS6.4下自帶vim的編譯時信息,另一個是Mac OS X 10.1系統自帶vim的編譯時信息,第三個是Windows8.1平臺安裝的vim官方7.4二進制版本。
【CentOS自帶vim的編譯時配置信息】
[root@localhost test]# vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr 5 2012 10:12:47)
Included patches: 1-411
Modified by <[email protected]>
Compiled by <[email protected]>
Huge version without GUI. Features included (+) or not (-):
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv +cscope +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
+menu +mksession +modify_fname +mouse -mouseshape +mouse_dec +mouse_gpm
-mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte
+multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra +perl +postscript
+printer +profile +python +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
system vimrc file: "/etc/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -O2 -g -pipe -Wall -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=1 -D_REENTRANT -D_GNU_SOURCE -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/lib/perl5/CORE -I/usr/include/python2.6 -pthread
Linking: gcc -Wl,-E -Wl,-rpath,/usr/lib/perl5/CORE -L/usr/local/lib -o vim -lselinux -lncurses -lacl -lgpm -Wl,-E -Wl,-rpath,/usr/lib/perl5/CORE -fstack-protector -L/usr/local/lib -L/usr/lib/perl5/CORE -lperl -lresolv -lutil -lc -L/usr/lib/python2.6/config -lpython2.6 -lutil -lm -Xlinker -export-dynamic
[root@localhost test]#
【Mac OS X自帶vim的編譯時配置信息】
smstongtekiMac-mini:~ smstong$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Aug 24 2013 18:58:47)
Compiled by [email protected]
Normal version without GUI. Features included (+) or not (-):
-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 +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +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
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses
smstongtekiMac-mini:~ smstong$
【Windows8.1 安裝的vim官方二進制vim7.4編譯配置信息】
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 10 2013 14:33:40)
MS-Windows 32 位控制檯版本
編譯者 mool@tororo
大型版本 無圖形界面。 可使用(+)與不可使用(-)的功能:
+arabic +ex_extra -mouseshape +tag_binary
+autocmd +extra_search +multi_byte +tag_old_static
-balloon_eval +farsi +multi_lang -tag_any_white
-browse +file_in_path -mzscheme -tcl
++builtin_terms +find_in_path -netbeans_intg -tgetent
+byte_offset +float +path_extra -termresponse
+cindent +folding -perl +textobjects
+clientserver -footer +persistent_undo +title
+clipboard +gettext/dyn -postscript -toolbar
+cmdline_compl -hangul_input +printer +user_commands
+cmdline_hist +iconv/dyn -profile +vertsplit
+cmdline_info +insert_expand -python +virtualedit
+comments +jumplist -python3 +visual
+conceal +keymap +quickfix +visualextra
+cryptv +langmap +reltime +viminfo
+cscope +libcall +rightleft +vreplace
+cursorbind +linebreak -ruby +wildignore
+cursorshape +lispindent +scrollbind +wildmenu
+dialog_con +listcmds +signs +windows
+diff +localmap +smartindent +writebackup
+digraphs -lua -sniff -xfontset
-dnd +menu +startuptime -xim
-ebcdic +mksession +statusline -xterm_save
+emacs_tags +modify_fname -sun_workshop -xpm_w32
+eval +mouse +syntax
系統 vimrc 文件: "$VIM\vimrc"
用戶 vimrc 文件: "$HOME\_vimrc"
第二用戶 vimrc 文件: "$HOME\vimfiles\vimrc"
第三用戶 vimrc 文件: "$VIM\_vimrc"
用戶 exrc 文件: "$HOME\_exrc"
第二用戶 exrc 文件: "$VIM\_exrc"
編譯方式: cl -c /W3 /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjCi386/ /Ox /GL -DNDEBUG /Zl /MT -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjCi386/ /Zi
鏈接方式: link /RELEASE /nologo /subsystem:console /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib /machine:i386 /nodefaultlib libcmt.lib user32.lib /PDB:vim.pdb -debug
可以看出,不同版本的vim,其編譯時指定的配置文件路徑並不相同。除了CentOS平臺的vim使用絕對路徑指定/etc/vimrc爲其系統配置文件以外,其他的平臺及配置文件均依賴於環境變量$VIM和$HOME。
2.2 環境變量的確定步驟
先來看$VIM,大部分用戶在使用vim前並沒有手動去設置這個環境變量,而vim仍然正確的找到了配置文件,這是如何做到的呢?vim內部按照如下順序查找或者定義$VIM,一旦有一個步驟成功,那麼後面的步驟就會忽略掉。
(1)如果操作系統平臺定義了$VIM環境變量,則直接使用;
(2)如果helpfile變量的值不包含其他的環境變量,則使用這個變量值來確定。實際上helpfile的默認值是$VIMRUNTIME/doc/help.txt,也就是說包含一個環境變量,所以默認情況下不能通過helpfile來確定。
(3)對於Windows平臺,vim使用自身的可執行文件所在的位置來確定。我們前面Windows平臺的例子中,vim就是在這一步確定的$VIM,其值爲:VIM=C:\Program Files (x86)\Vim。
對於*inx平臺,使用編譯時指定的安裝路徑來確定(也就是前面vim --version結果中顯示的"fall-back for $VIM" 。前面Mac OS X和CentOS平臺的vim都是在這一步確定的$VIM,其值均爲VIM=/usr/share/vim。
再來看$VIMRUNTIME。這個環境變量一般不需要用戶去設置,而是讓vim自身去猜測。下面是猜測步驟:
(1)如果用戶定義了$VIMRUNTIME環境變量,直接使用;
(2)如果$VIM/vim{版本號}這個路徑存在,那麼使用它作爲$VIMRUNTIME的值;
(3)如果$VIM/runtime存在,使用它作爲$VIMRUNTIME的值;
(4)使用$VIM的值作爲$VIMRUNTIME的值,這是vi時期的兼容模式;
(5)如果helpfile內部變量不包含環境變量,則使用helpfile來推導$VIMRUNTIME。
對於我們前面的三個平臺,都是在第(2)步驟確定了$VIMRUNTIME的值。
最後來看$HOME,這個對於unix類環境來說,一般都會設置的,無需多說。
3 在實踐中使用配置文件
3.1 添加或修改配置文件
set nu
set tabstop=4
set autoindent
這樣我們以當前賬戶運行vim的時候,就會總是顯示行號,tab鍵相當於4個空格的寬度,自動縮進。
3.2 添加插件文件
nmap <F10> ggODate:<Esc>:read !date<CR>kJ$
這樣,啓動vim後,就可以通過F10快捷鍵直接在首行輸入當前的日期信息。