實踐中學習vim之vim配置文件、插件文件加載路徑


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來確定路徑的。
仔細分析就會發現,其實這裏面還有很多不確定的東西:
  1. 編譯時指定的系統級配置文件路徑可以是絕對路徑,也可能含有$VIM環境變量。
  2. 用戶級別配置文件路徑中含有環境變量$HOME。
  3. 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.
可見除了編譯時通過絕對路徑指定的系統級配置文件vimrc之外的所有其他情況下的配置文件路徑都嚴重依賴於環境變量的設置。問題是用戶如果在運行vim之前沒有設置這些環境變量,vim該如何是好呢?

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 在實踐中使用配置文件

通過前面的分析,我們弄清楚了vim配置文件及插件文件的加載時機與加載路徑。接下來就可以根據這些知識來定製屬於我們自己的配置了。

3.1 添加或修改配置文件

配置文件的主要作用是修改vim的默認行爲以滿足個性化需求,也就是修改vim內部變量的默認值。vim分爲系統級配置文件和用戶級配置文件。vim的手冊推薦用戶自定義的配置放入用戶自定義文件中。我們以CentOS平臺下的vim爲例。用戶級配置文件路徑爲:$HOME/.vimrc。在這個文件裏增加如下代碼:
  set nu
  set tabstop=4

  set autoindent

這樣我們以當前賬戶運行vim的時候,就會總是顯示行號,tab鍵相當於4個空格的寬度,自動縮進。

3.2 添加插件文件

插件文件的主要作用是增強vim的功能,也就是創造新的功能而不是修改已有的功能。從前面的分析,我們知道插件文件可以存在很多路徑下。我們以/usr/share/vim/vim72/plugin目錄下爲例。在這個目錄下隨便新建一個文本文件test.vim。內容如下:
nmap <F10> ggODate:<Esc>:read !date<CR>kJ$

這樣,啓動vim後,就可以通過F10快捷鍵直接在首行輸入當前的日期信息。

其實vim配置文件和插件文件所支持的語法完全一樣,只是人爲的按照功能作用分開存儲了,兩者都支持vim的專用腳本語言VimScript,關於vimscript的使用超出了本文的範疇,作者本人也尚未掌握,以後學習的時候再做記錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章