天天看點

vi/vim: vimrc初步

上一章我們介紹了會話(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
上一篇: vim

繼續閱讀