VIM 中可供用戶定制的選項非常非常多, 作為初學者, 我們沒有必要了解這么多東西。 下面, 滇狐簡單列出了一些最常用的配置項, 大家可以根據自己的需要將這些內容添加到自己的 .vimrc 中。
1 基本設置
- set nocp
該命令指定讓 VIM 工作在不兼容模式下。 在 VIM 之前, 出現過一個非常流行的編輯器叫 vi。 VIM 許多操作與 vi 很相似, 但也有許多操作與 vi 是不一樣的。 如果使用“:set cp”命令打開了兼容模式開關的話, VIM 將盡可能地模仿 vi 的操作模式。
也許有許多人喜歡“最正統的 vi”的操作模式, 對于初學者來說, vi 里許多操作是比較不方便的。
舉一個例子, VIM 里允許在 Insert 模式下使用方向鍵移動光標, 而 vi 里在 Insert 模式下是不能移動光標的, 必須使用 ESC 退回到 Normal 模式下才行。
再舉一個例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u 時, 將撤消“撤消”這個動作本身, 也就是我們常說的“重復”(redo)。 而 VIM 里可以使用 u 命令撤消多步操作, “重復”使用的快捷鍵是 Ctrl + R。
使用兼容模式后, VIM 將放棄這些新的功能, 盡量模仿 vi 的各種操作方式。 只有在不兼容模式下, 才能更好地發揮 VIM 自身的特點。 Bram 爺爺強烈推薦大家使用 VIM 的不兼容模式, 滇狐也是這樣推薦的。 請務必在你的 .vimrc 中的第一行寫上: “set nocp”。 - set ru
該命令打開 VIM 的狀態欄標尺。 默認情況下, VIM 的狀態欄標尺在屏幕底部, 它能即時顯示當前光標所在位置在文件中的行號、列號, 以及對應的整個文件的百分比。 打開標尺可以給文件的編輯工作帶來一定方便。 - set hls
搜索時高亮顯示被找到的文本。 該指令的功能在 vimtutor 中已經有過介紹, 這里就不多說了。 其實似乎許多人并不喜歡這個功能。 - set is
搜索時在未完全輸入完畢要檢索的文本時就開始檢索。 vimtutor 對該命令也有過介紹, 滇狐并不喜歡這個功能, 因此滇狐自己的配置文件里是沒有這條命令的。 但是周圍有朋友很喜歡這個, 因此滇狐還是將它列在這里。 - syntax on
打開關鍵字上色。 進行程序設計的朋友應該都知道關鍵字上色是什么東西, 因此這里就不多說了。 不進行程序設計的朋友不妨也打開這個功能, 雖然不一定能夠用得著, 但這個功能其實也是很好玩的。 - set backspace=indent,eol,start
設想這樣一個情況: 當前光標前面有若干字母, 我們按下 i 鍵進入了 Insert 模式, 然后輸入了 3 個字母, 再按 5 下刪除(Backspace)。 默認情況下, VIM 僅能刪除我們新輸入的 3 個字母, 然后喇叭“嘟嘟”響兩聲。 如果我們“set backspace=start”, 則可以在刪除了新輸入的 3 個字母之后, 繼續向前刪除原有的兩個字符。
再設想一個情況: 有若干行文字, 我們把光標移到中間某一行的行首, 按 i 鍵進入 Insert 模式, 然后按一下 Backspace。 默認情況下, 喇叭會“嘟”一聲, 然后沒有任何動靜。 如果我們“set backspace=eol”, 則可以刪除前一行行末的回車, 也就是說將兩行拼接起來。
當我們設置了自動縮進后, 如果前一行縮進了一定距離, 按下回車后, 下一行也會保持相同的縮進。 默認情況下, 我們不能在 Insert 模式下直接按 Backspace 刪除行首的縮進。 如果我們“set backspace=indent”, 則可以開啟這一項功能。
上述三項功能, 你可以根據自己的需要, 選擇其中一種或幾種, 用逗號分隔各個選項。 建議把這三個選項都選上。 - set whichwrap=b,s,<,>,[,]
默認情況下, 在 VIM 中當光標移到一行最左邊的時候, 我們繼續按左鍵, 光標不能回到上一行的最右邊。 同樣地, 光標到了一行最右邊的時候, 我們不能通過繼續按右跳到下一行的最左邊。 但是, 通過設置 whichwrap 我們可以對一部分按鍵開啟這項功能。 如果想對某一個或幾個按鍵開啟到頭后自動折向下一行的功能, 可以把需要開啟的鍵的代號寫到 whichwrap 的參數列表中, 各個鍵之間使用逗號分隔。 以下是 whichwrap 支持的按鍵名稱列表:- b
在 Normal 或 Visual 模式下按刪除(Backspace)鍵。 - s
在 Normal 或 Visual 模式下按空格鍵。 - h
在 Normal 或 Visual 模式下按 h 鍵。 - l
在 Normal 或 Visual 模式下按 l 鍵。 - <
在 Normal 或 Visual 模式下按左方向鍵。 - >
在 Normal 或 Visual 模式下按右方向鍵。 - ~
在 Normal 模式下按 ~ 鍵(翻轉當前字母大小寫)。 - [
在 Insert 或 Replace 模式下按左方向鍵。 - ]
在 Insert 或 Replace 模式下按右方向鍵。
- b
- set encoding=cp936
設置當前字符編碼為簡體中文。 這里還有一段能夠自動判斷文件的 encoding, 自動選擇合適的編碼的 .vimrc 代碼, 感興趣的話可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8___FCKpd___0quot; || v:lang =~ "UTF-8___FCKpd___0quot;
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本編輯設置
- set sw=4
自動縮進的時候, 縮進尺寸為 4 個空格。 - set ts=4
Tab 寬度為 4 個字符。 - set et
編輯時將所有 Tab 替換為空格。
該選項只在編輯時將 Tab 替換為空格, 如果打開一個已經存在的文件, 并不會將已有的 Tab 替換為空格。 如果希望進行這樣的替換的話, 可以使用這條命令“:retab”。
3 斷行設置
- set lbr
不在單詞中間斷行。 設置了這個選項后, 如果一行文字非常長, 無法在一行內顯示完的話, 它會在單詞與單詞間的空白處斷開, 盡量不會把一個單詞分成兩截放在兩個不同的行里。 - set fo+=mB
打開斷行模塊對亞洲語言支持。 m 表示允許在兩個漢字之間斷行, 即使漢字之間沒有出現空格。 B 表示將兩行合并為一行的時候, 漢字與漢字之間不要補空格。 該命令支持的更多的選項請參看用戶手冊。
4 C/C++ 編碼設置
- set sm
顯示括號配對情況。 打開這個選項后, 當輸入后括號 (包括小括號、中括號、大括號) 的時候, 光標會跳回前括號片刻, 然后跳回來, 以此顯示括號的配對情況。 - set cin
打開 C/C++ 風格的自動縮進。 打開了自動縮進后, 在編碼的時候我們可以使用“V”命令選中一段文本后, 按“=”將這段文本重新調整縮進格式, 在一定程度上起到代碼美化的作用。
另外, 打開了自動縮進后, 在使用 TERM 下的 vim 的時, 粘貼代碼時常常會出現版式混亂的現象。 那是因為 TERM 并不知道你現在正在粘貼代碼, 它直接“粘貼”動作向 vim 解釋為鍵入, 因此 vim 便按照設置的自動縮進格式為你的代碼調整了縮進。 不幸的是, 粘貼進去的代碼中本身已經包含了縮進, 因此便出現了版式混亂的情況。 在 gvim 中就不會出現這個問題, 因為它能夠知道你現在正在粘貼。
知道了這個癥狀的來由, 解決方案也就顯而易見了: 在粘貼的時候把所有自動縮進都關閉, 粘貼完畢之后再打開。 一個個手工關閉自動縮進未免過于繁瑣, vim 為我們提供了一個很好用的命令, 只要輸入“:set paste”, 就可以關閉所有自動縮進。 粘貼完畢后再輸入“:set nopaste”就可以重新打開原有的自動縮進設置了。 - set cino=:0g0t0(sus
設定 C/C++ 風格自動縮進的選項, 這里簡要介紹一下這段代碼里用到的選項的含義, cino 支持的選項還很多, 更多選項請看用戶手冊。
// :0
//
// switch 語句之下的 case 語句縮進 0 個空格,也就是說不縮進,與 switch 塊平
// 齊,使用這樣風格:
switch (x)
{
case 1:
a = b;
break;
default:
}
// g0
//
// class、struct 等之下的訪問權限控制語句,如 public、protected、private 等,
// 相對 class、struct 等所在的塊縮進 0 個空格,與 class 等塊平齊,使用這樣的
// 風格:
class foo
{
public:
int a;
private:
int b;
};
// t0
//
// 如果函數返回值與函數名不在同一行,則返回值縮進 0 個空格,也就是說不縮進,如
// 下所示:
// set cino=t4
int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 當一對括號跨越多行時,其后的行縮進前面 sw 指定的距離,效果如下:
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;
- set ai
打開普通文件類型的自動縮進。 該自動縮進不如 cindent 智能, 但它可以為你編輯非 C/C++ 文件提供一定幫助。
5 其它設置
- set selectmode=
不使用 selectmode。 - set mousemodel=popup
當右鍵單擊窗口的時候, 彈出快捷菜單。 - set keymodel=
不使用“Shift + 方向鍵”選擇文本, “Shift + 方向鍵”代表向指定方向跳一個單詞。 如果你喜歡這項功能的話, 可以使用“set keymodel=startsel,stopsel”打開它。 - set selection=inclusive
指定在選擇文本時, 光標所在位置也屬于被選中的范圍。 如果指定 selection=exclusive 的話, 可能會出現某些文本無法被選中的情況。 - colo torte
選擇 torte 配色方案。 VIM 里內置了許多關鍵字上色的配色方案, 另外你還可以到網上下載更多配色方案, 或是自己編寫。 點擊“編輯”→“調色板”, 就能列出所有支持的配色方案。 你可以把“調色板”子菜單剪下來, 然后慢慢選擇, 挑出一個你最喜歡的配色方案來。
6 圖形界面設置
- set nowrap
指定不折行。 如果一行太長, 超過屏幕寬度, 則向右邊延伸到屏幕外面。 如果使用圖形界面的話, 指定不折行視覺效果會好得多。 - set guioptions+=b
添加水平滾動條。 如果你指定了不折行, 那為窗口添加一個水平滾動條就非常有必要了。 - set guifont=Courier\ 9
設置圖形界面下的字體。 你可以點“編輯”→“選擇字體”, 然后在對話框中選出你喜歡的字體與字號, 選擇完畢后, 先按幾下 ESC 確認處在 Normal 模式下, 然后輸入這條命令:“:set guifont?” 回車后 gvim 屏幕最下方會顯示出你當前所用的字體的名稱與字號。 將獲得的結果寫到配置文件里面就可以了, 需要注意一點, 如果字體名稱里面含有空格的話, 在抄的時候需要在所有空格前面加一個斜杠。
7 條件選擇
同一個配色方案, 在 gvim 下和字符界面的 vim 下效果大相徑庭, 滇狐個人的習慣是, 在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我們有必要針對 gvim 和 vim 進行不同的設置。
另外, 前面我們在 gvim 下不使用折行, 開啟水平滾動條, 但在 vim 下, 是沒有滾動條可用的, 因此還是有必要為 vim 保留自動折行。
條件選擇設置的格式如下:
if (has("gui_running"))
" 圖形界面下的設置
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的設置
set wrap
colo ron
endif