上一章我們介紹了會話(session)檔案和viminfo檔案,其中‘sessionoptions’選項和‘viminfo’選項的配置可能會根據你的需要進行調整。但如何儲存你所做的調整呢?我們将在這一章中介紹。
本節所用指令的幫助入口:
:help compatible
:help mapleader
:help map
:help autocmd
為什麼我的vim這麼難用?不能文法高亮,沒有折行,不能打開多個視窗多個buffer,不能……
為什麼别人用幾個鍵就可以完成一個很複雜的功能,而我不能?
為什麼别人的vim看起來和我的很不一樣?
……
當你開始問這些問題的時候,是時候去檢查一下你的vimrc了。
當vim在啟動時,如果沒有找到vimrc或gvimrc,它預設工作VI相容的模式。這意味着,你隻能使用VI所具備的功能,而vim中的大量擴充功能将無法使用。也許這就是你的vim如此難用的原因。
vim中自帶了一個vimrc例子,讓我們從這個例子開始吧。
下面我以Linux下的vim為例,windows版本的vim,會在後面提到。
示例的vimrc(名為vimrc_example.vim)通常位于/usr/share/vim/vimXXX/目錄下,其中vimXXX與你所使用的vim版本有關。
首先把這個示例的vimrc拷貝到相應的目錄,在Linux下,應該把它拷貝到你的home目錄下,名字為”.vimrc”,下面是shell指令:
cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc
或者你在vim中執行下面的指令,和上面的shell指令完成相同的功能:
:!cp $vimRUNTIME/vimrc_example.vim ~/.vimrc
現在,你退出vim後再進入,你的vim和剛才已經不一樣了。
你可以先讀一下你的vimrc,看看它都設定了什麼:
:e ~/.vimrc
這是一個注釋良好的檔案,不需要多解釋。
對windows版本的vim,它已經預設的有了一個vimrc,你可以在vim在使用下面的指令來檢視它:
:e $vim/_vimrc
在這個檔案中,它包含了上面提到的vimrc_example.vim。同時,它會把vim設定的更符合windows的操作習慣。比如,支援CTRL-C拷貝,CTRL-V粘貼等等。Windows下的使用者,可以使用$vim/_vimrc來做為你的第一個vimrc。
順便提一句,在unix/linux中,檔案名可以以”.”開頭,表明此檔案是隐藏的。而在windows中,不允許檔案名以”.”開頭,是以,windows版本的vim,将讀取_vimrc來做為自己的配置檔案。
在今後使用vim的日子裡,你會頻繁的更改你的vimrc。是以我們需要設定一些快捷方式,使我們能快速的通路vimrc。
把下面這段内容拷貝到你的vimrc中:
1 "Set mapleader
2 let mapleader = ","
3
4 "Fast reloading of the .vimrc
5 map <silent> <leader>ss :source ~/.vimrc<cr>
6 "Fast editing of .vimrc
7 map <silent> <leader>ee :e ~/.vimrc<cr>
8 "When .vimrc is edited, reload it
9 autocmd! bufwritepost .vimrc source ~/.vimrc
為了友善解釋,我給每一行都加了一個行号。
- 在vimrc中,雙引号開頭的行,将被當作注釋忽略。
-
第2行,用來設定mapleader變量,當mapleader為未設定或為空時,使用預設的”\”來作為mapleader。
mapleader變量是作用是什麼呢?看下面的介紹。
- 第5行定義了一個映射(map),這個映射把<leader>ss,映射為指令:source ~/.vimrc<cr>。當定義一個映射時,可以使用<leader>字首。而在映射生效時,vim會把<leader>替換成mapleader變量的值。也就是說,我們這裡定義的<leader>ss在使用時就變成了”,ss“,當輸入這一快捷方式時,就會source一次~/.vimrc檔案(也就是重新執行一遍.vimrc檔案)。
- 第7行,定義了<leader>ee快捷鍵,當輸入,ee時,會打開~/.vimrc進行編輯。
- 第9行,定義了一個自動指令,每次寫入.vimrc後,都會執行這個自動指令,source一次~/.vimrc檔案。
有了上面的快捷鍵,我們就能快速的打開vimrc檔案編輯,快速重新source vimrc檔案,友善多了。
無論在windows還是在linux中,我都使用vim作為我的預設編輯器。并且,我想使用同一個vimrc檔案。是以,我定義了一個MySys()函數,用來區分不同的平台,以進行不同的配置。
另外,在編輯vimrc檔案時,我更喜歡新開一個标簽頁來編輯,而不是在目前視窗中。是以,我定義了SwitchToBuf()函數,它在所有标簽頁的視窗中查找指定的檔案名,如果找到這樣一個視窗,就跳到此視窗中;否則,它建立一個标簽頁來打開vimrc檔案。(注:标簽頁(tab)功能隻有在vim 7.0版本以上才支援。)
下面是我的vimrc中使用的設定,希望能夠抛磚引玉:
" Platform
function! MySys()
if has("win32")
return "windows"
else
return "linux"
endif
endfunction
function! SwitchToBuf(filename)
"let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
" find in current tab
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec bufwinnr . "wincmd w"
return
else
" find in each tab
tabfirst
let tab = 1
while tab <= tabpagenr("$")
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec "normal " . tab . "gt"
exec bufwinnr . "wincmd w"
return
endif
tabnext
let tab = tab + 1
endwhile
" not exist, new tab
exec "tabnew " . a:filename
endif
endfunction
"Fast edit vimrc
if MySys() == 'linux'
"Fast reloading of the .vimrc
map <silent> <leader>ss :source ~/.vimrc<cr>
"Fast editing of .vimrc
map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
"When .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == 'windows'
" Set helplang
set helplang=cn
"Fast reloading of the _vimrc
map <silent> <leader>ss :source ~/_vimrc<cr>
"Fast editing of _vimrc
map <silent> <leader>ee :call SwitchToBuf("~/_vimrc")<cr>
"When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source ~/_vimrc
endif
" For windows version
if MySys() == 'windows'
source $VIMRUNTIME/mswin.vim
behave mswin
endif
注意:我在windows中也定義一個”HOME”環境變量,然後把_vimrc放在”HOME”環境變量所指向的目錄中。如果你打算在windows中使用上面的設定,也需要這樣做!
好了,現在我們知道如何永久更改‘sessionoptions’選項和‘viminfo’選項了,把對它們的配置放入你的vimrc即可。
vim自帶的示例vimrc中,隻定義最基本的配置。
在http://www.amix.dk/vim/vimrc.html有一個非常強大的vimrc,有人戲稱為”史上最強的vimrc”,或許有些言過其實。不過,如果你通讀了這個vimrc,相信能從中學到很多……
這裡有一個redguardtoo修改過的版本,可以對照參考一下。
我的vimrc也是基于Amix的模闆,然後自已做了很多修改。
建議:不要照拷這個vimrc!可能這個檔案的設定并不符合你的習慣。另外,這個檔案的設定,可能也不能在你的工作環境中運作。
[參考文檔]
- vim手冊
- vim中文手冊
- http://www.amix.dk/vim/vimrc.html