1. 程式人生 > >實踐中學習vim之vim配置檔案、外掛檔案載入路徑

實踐中學習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來確定路徑的。
仔細分析就會發現,其實這裡面還有很多不確定的東西:
  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的編譯時配置資訊】

[[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的使用超出了本文的範疇,作者本人也尚未掌握,以後學習的時候再做記錄。

相關推薦

實踐學習vimvim配置檔案外掛檔案載入路徑

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使用QuartzMethodInvokingJobDetailFactoryBean配置任務

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(