實踐中學習vim之vim配置檔案、外掛檔案載入路徑
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的編譯時配置資訊】
[[email protected] 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
[[email protected] 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 位控制檯版本
編譯者 [email protected]
大型版本 無圖形介面。 可使用(+)與不可使用(-)的功能:
+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的使用超出了本文的範疇,作者本人也尚未掌握,以後學習的時候再做記錄。相關推薦
實踐中學習vim之vim配置檔案、外掛檔案載入路徑
0 引言 理解vim的啟動過程對於增強使用vim的信心非常重要,本文所有的資訊均來自vim自身提供的參考手冊和作者實際操作實踐。VIM REFERENCE MANUAL的Starting Vim這節詳細描述了vim的啟動過程。vim完整的啟動過程非常複雜,因為要相容不同的平
實踐中學習vim之按鍵序列對映
不同的模式下,vim都內建了一些必不可少的命令。如normal模式下大家熟悉的移動游標命令j、k、h、l,刪除一行的命令dd,貼上命令p等;命令列模式下的寫入檔案命令:w,退出命令:q,查詢命令/something等;有一些內建命令能夠工作在多個模式下,如複製命令yy技能在normal模式下工作,也能在vis
Linux學習筆記之vim編輯技巧
vim linux學習筆記 linux vim編輯技巧 vim,一個純文本(純文本信息,ASCII text)編輯器,Vi(Visual Interface) IMproved,是一個模式化的編輯器。> vim有自帶的教程,也是linux的一個內置命令一、基本模式分類1 編輯模式(命令模式)
mybatis學習筆記之——mybatis配置資訊中引數值的處理
引數值的處理: 單個引數:mybatis不會做特殊處理 #{引數名}:取出引數值 多個引數:mybatis會做特殊處理。 多個引數會封裝成一個map, &n
mybatis學習筆記之——mybatis的Mapper XML對映檔案配置資訊
sql對映檔案對應的增刪改查都有自己的標籤: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
linux學習筆記之vim的使用
vim vim 常用操作 vim沒有選單,只有命令 ![vim工作模式](https://i.imgur.com/Rnk8Djn.png) 插入命令:-a,-i,-o區分大小寫 定位命令:-set
webpack學習之路------配置多個 HTML 檔案
目錄結構: app.css body { background: pink; } contact.html <!DOCTYPE html> <html lang="en"> <head> <meta c
學習路上之dubbo配置檔案的標籤
Dubbo配置檔案解析 昨天記錄了第一個Dubbo 的Demo程式,今天對自己使用到的Dubbo標籤做一份詳細的解析,因為還未接觸到所有的Dubbo配置檔案的標籤,所以並不是所有的標籤解析 dubbo配置檔案下的標籤 所有配置最終都將轉換為URL表
菜鳥學習shiro之用配置檔案實現登入,身份和許可權驗證2
Maven的和第一篇,一樣直接去複製使用 這篇部落格和上一篇沒有多大的區別,區別之處就是上一篇沒有實現許可權認證,將在這一篇中實現,這裡我們使用四郎給我們提供的內建類IniRealm,來實現登入,身份
react學習筆記之環境配置
大量 bpa blog 第一個 clas 粉絲 安裝 nbsp pac 今天開始學習react環境配置,首先我們知道目前主流框架有三個,即:angular,react,vue,每個框架都有大量粉絲在用,並且每個框架都有自己的一套開發環境和提供的腳手架,今天我們學習一下
Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任務
ans time frame class triggers get ng- conf ger Quartz是一個強大的企業級任務調度框架,Spring中繼承並簡化了Quartz。 Spring中使用Quartz的3種方法(MethodInvokingJobDetailFac
Spring中的packagesToScan的方式配置hibernate的class檔案對映規則的理解
Spring中的packagesToScan的方式配置hibernate的class檔案對映規則的理解 1.持久化實體,使用自動掃描class的形式進行配置時,規則如下 (1)&l
IC數字前端設計開發9(vim——開啟多個檔案、同時顯示多個檔案、在檔案之間切換)
開啟多個檔案: 1.vim還沒有啟動的時候: 在終端裡輸入 vim file1 file2 ... filen便可以開啟所有想要開啟的檔案 2.vim已經啟動 輸入 :open file
《新興實踐》學習筆記之走進新興設計實踐(目錄及主題梳理)
目錄 走近新興設計實踐 設計模型:展望未來的設計教育 為徹底的關聯性而設計:以“關聯性設計”應對危險、併發的依存現實 製造與行動之間:論關聯性的設計教育學 關係能被設計麼?設計方法在社會創新中的作用
《新興實踐》學習筆記之設計模型:展望未來的設計教育(第一章)
作者:Ken Friedman 引言: “如今大部分設計挑戰都需要分析和綜合的規劃能力,而這些能力無法僅僅依靠當代設計的專業實踐來培養” 一、設計的背景 引言: “未來已經來到了,
帆軟報表FineReport中資料連線之Weblogic配置JNDI連線
1. 製作報表的原理 在帆軟報表FineReport設計器中先用JDBC連線到資料庫,建立資料庫連線,然後用SQL或者其他方法建立資料集,使用資料集製作報表,然後把建立的資料庫連線從JDBC連線改成JNDI連線,然後配置好伺服器中的JNDI連線,然後按照我們下面章節所說的部
R語言學習筆記之: 論如何正確把EXCEL檔案餵給R處理
1 Sub getCSV() 2 '這是網上看到的xlsx批量轉化,而改寫的一個xlsx批量轉化csv格式 3 '1)批量轉化csv參考:http://club.excelhome.net/thread-1036776-2-1.html 4 '2)建立資料夾參考:http://jingyan.b
《WebGL程式設計指南》---從示例程式碼中學習WebGL之初識【1】
寫在前面 筆者希望學習WebGL很久了,但是鑑於種種的事一直沒有開展,恰好研究生複試過了,在這空檔時間段內想學一門新技術,於是想到了WebGL,經前同事推薦,果斷買了《WebGL程式設計指南》這本書,於是,我的學習之旅就開始了。對於程式設計人員來說,案例程式碼是最好的教科書
Retrofit2+RxJava學習小計(一):單檔案、多檔案上傳之填平的坑
從Eclipse轉戰AndroidStudio已經有兩個月了。先誇誇Google親兒子的強大吧,各種方便就不一一道來了。主要是現在的Android陣營已經不想前兩年了。各種開源框架開源庫。也正是如此,AndroidStudio匯入開源的專案非常方便。自從Goog
《 機器學習實戰》(Machine Learning in Action) 一書 中的錯誤之處(內容、程式碼)
最近在學 機器學習,發現此書有錯誤的地方,寫成部落格,方便以後查詢。(慢慢更新中……) 1.中文書第22頁(英文版第26頁)中 有一行程式碼: classLabelVector.append(