Vim 3 vimrc

Vim 系列教程目錄:

什么是 vimrc

vimrc 是 Vim 的配置文件, Vim 在啟動時會加載 vimrc 文件, 你能想到的幾乎所有的配置(包括主題, 快捷鍵, 插件設置等等), 都可以配置在 vimrc 中, 所以, vimrc 在 Vim 使用過程中有著至關重要的地位. Vim 是極其依賴 vimrc 配置的, 沒有經過配置的 Vim 又丑又難用, 但是你如果懂得怎么配置, 就可以把 Vim 變成你想要的樣子.

這里要明確一個概念: vimrc 中的大多數配置都是 Vim 命令模式下支持的命令, 都可以在命令模式下使用, 但是在命令模式中使用時, 只針對當前打開的 Vim 實例有效, 關閉了 Vim 之后再次打開, 之前在命令模式下的設置就無效了. 而配置到 vimrc 中, 每次 Vim 啟動時都會自動讀取并執行, 所以可以自動生效.

那么 vimrc 文件在哪呢? 打開 Vim, 使用 :version命令, 即可查看 Vim 的版本信息, 其中就包括了 vimrc 文件的位置. 我的電腦是 Windows, 可以看到類似如下輸出:

VIM - Vi IMproved 8.1 (2018 May 18, compiled May 18 2018 18:36:07)
MS-Windows 32 位圖形界面版本 帶 OLE 支持
包含補丁: 1
...
     系統 vimrc 文件: "$VIM\vimrc"
     用戶 vimrc 文件: "$HOME\_vimrc"
 第二用戶 vimrc 文件: "$HOME\vimfiles\vimrc"
 第三用戶 vimrc 文件: "$VIM\_vimrc"
      用戶 exrc 文件: "$HOME\_exrc"
  第二用戶 exrc 文件: "$VIM\_exrc"
    系統 gvimrc 文件: "$VIM\gvimrc"
    用戶 gvimrc 文件: "$HOME\_gvimrc"
第二用戶 gvimrc 文件: "$HOME\vimfiles\gvimrc"
第三用戶 gvimrc 文件: "$VIM\_gvimrc"
       defaults file: "$VIMRUNTIME\defaults.vim"
        系統菜單文件: "$VIMRUNTIME\menu.vim"

通過上述信息可知, vimrc 文件的位置其實非常多, 加載順序是自上而下, 找到第一個則使用第一個, 后續的不再使用, 如果第一個找不到, 則會依次向下尋找, 直到找到為止.

這里有一個問題, $VIM$HOME 指的是什么? 這兩個變量的值可以使用如下命令查看:

:echo $VIM
:echo $HOME

$VIM 是 Vim 安裝目錄, $VIM 可寫為 $vim, 不區分大小寫, $HOME 是用戶目錄, $HOME 區分大小寫.

Windows 版的 Vim 在安裝時, 會自動在安裝目錄下生成一個 _vimrc 文件, 也就是 $VIM/_vimrc, 即 "第三用戶 vimrc 文件", 其他 vimrc 文件都是不存在的, 所以一般來說修改 $VIM/_vimrc 文件即可.

Linux 和 Mac 的查看及尋找方式也是一樣的, 同樣是使用 :version 命令, 這里不再贅述.

接下來我們就可以修改 vimrc 文件了. 在這之前請切記: 不要把任何你不理解的配置放到你的vimrc中, 你可以在網上找到成噸的 vimrc 配置文件, 但那都是別人的, 如果你不理解他們的配置, 一切照搬過來, 那結果是很糟糕的.

PS. 我后續的演示及配置都是基于 Windows 的. 另外, 在修改 vimrc 之前, 請先自己備份一個, 確保改壞了還能恢復回來.

基本修改

首先第一條要修改的就是: 關閉兼容模式. Vim 默認是以兼容 Vi 的模式運行的(Vi 是遠古時期的 Vim), 在這種模式下, 很多 Vim 的高級特性都無法使用, 所以首先就要關閉兼容模式, 請把這條配置放在你 vimrc 文件的第一行:

set nocompatible " 關閉兼容模式

vimrc 中, " 號后面的內容為注釋.

修改并保存之后要使之生效, 需要重啟 Vim. 還有個更簡單的方法, 就是在命令模式下輸入 下面兩個命令中的任意一個:

:source $vim/_vimrc
:source %

大部分情況下, 執行完上面的命令后, vimrc 的修改會立即生效, 但是有些特殊配置執行完這兩個命令后不能及時生效, 這時就只能重啟 Vim 了. 另外, :source 命令可簡寫為 :so

UI 相關配置

如果你覺得默認字體不好看, 可以使用如下配置修改字體:

set guifont=Consolas:h14

這表示使用 Consolas 字體, 字號為 14.

另外, 對于一個成熟的 vimer 來說, 界面上那些菜單, 工具欄什么的都是沒啥用的, 可以關掉.

" 關閉工具欄
set guioptions-=T
" 關閉菜單
set guioptions-=m
" 關閉左側滾動條
set guioptions-=L
" 關閉右側滾動條
set guioptions-=r
" 啟動時最大化
autocmd GUIEnter * simalt ~x

注意: vimrc 中, 賦值配置的 = 右邊最好不要有空格, 有些值加了空格無法識別.

編碼相關配置

Vim 的編碼系統比較混沌, 幾乎說不清楚, 總之你按照下面的配置方式就沒問題了:

" 設置vim內部編碼
set encoding=utf-8
" 設置編輯文件時的編碼
set fileencoding=utf-8
" 設置 Vim 能識別的編碼
set fileencodings=ucs-bom,utf-8,cp936,gb18030,gb2312,big5,cuc-jp,cuc-kr,latin
" 設置終端模式(非 GUI 模式)下的編碼
set termencoding=utf-8
" 防止特殊符號無法顯示
set ambiwidth=double
" 解決 console 輸出亂碼
language messages zh_CN.utf-8

文件相關配置

默認情況下, Vim 在運行期間會生成臨時文件和備份文件, 以及修改歷史文件(undo文件), 這些文件用處不大, 都是可以關掉的.

" 文件被外部改動后, 自動加載
set autoread
" 不生成備份文件
set nobackup
" 不生成臨時文件
set noswapfile
" 不生成 undo 文件
set noundofile

還有個很重要的設置: 打開文件類型檢測. 這個設置幾乎是必須打開的.

" 自動檢測文件類型, 并根據文件類型顯示代碼高亮, 設置縮進格式, 加載對應插件
filetype plugin indent on
" 相當于下面三行
" filetype on        " 根據文件后綴以及文件內容檢測文件類型
" filetype indent on " 根據文件類型設置相應的縮進格式
" filetype plugin on " 根據文件類型加載相應的插件

編輯器相關配置

下面的配置是大都是和編輯相關的:

" 顯示行號
set number
" 顯示語法高亮
syntax enable
syntax on
" 顯示 tab(>---), 空格(^), 換行(?)
set list
set listchars=tab:>-,trail:^ ",eol:?
" 突出顯示當前行
set cursorline
" 開啟自動縮進
set autoindent
" 智能縮進
set smartindent
" 編輯時按一個 Tab 鍵相當于輸入4個空格
set tabstop=4
" 格式化時縮進尺寸為4個空格
set shiftwidth=4
" 讓 Vim 把連續的空格視為一個 Tab, 刪除時可以一次刪掉一個 Tab 的空格數量
set softtabstop=4
" 把制表符轉換為多個空格, 具體空格數量參考 tabstop 和 shiftwidth
set expandtab
" 在行和段的開始出使用 Tab
set smarttab
" 合并兩行中文時, 不在中間加空格
set formatoptions+=B
" 合并行時不添加多余空格
set nojoinspaces
" 高亮顯示匹配的括號
set showmatch
" 高亮顯示搜索到的關鍵字
set hlsearch
" 即時搜索
set incsearch
" 智能大小寫敏感, 只要有一個字母大寫, 就大小寫敏感, 否則不敏感
set ignorecase smartcase

經過這一系列配置, 你會發現你的 Vim 變好看了一些, 也更好用了一些.

按鍵映射

Vim 中有大量的快捷鍵(按鍵映射), 除此之外, 你還可以配置自己的按鍵映射.

使用 :map 相關的命令可以定義自己的快捷鍵. map 命令的本質是將一個按鍵序列轉化為另一個按鍵序列. 這里我們根據一個例子, 來理解 Vim 的按鍵映射. 在命令模式下執行下面的命令可以將 F3 映射為一個功能: 在文件最底部輸入文件名.

:map <F3> GoFile Name: <Esc>"%p

在命令模式下輸入上述命令, 回車, 然后在普通模式下按 F3, 你會發現文件底部輸入了當前文件名, 很神奇吧.

接下來解釋一下上面的命令干了什么: 首先使用 map 命令進行按鍵映射, 要映射的鍵是 <F3>, 然后空格后面的內容就都是新的按鍵序列了, G 移動到最后一行, o 開始一個新行并進入插入模式, 然后插入文本 'File Name: ', 然后<Esc>鍵進入普通模式, 然后使用 "% 訪問文件名寄存器, 最后 p 粘貼出寄存器內容.

可以看到, 按鍵映射本質上就是一系列輸入, 包括各種模式的切換, 都在輸入序列中了.

map 命令可以在普通模式, 可視模式下工作, 有時候需要在特定的模式下使用某些按鍵映射, Vim 也提供了相應的命令, 如下表:

遞歸 非遞歸 模式
:map :noremap 普通模式, 可視模式
:nmap :nnoremap 普通模式
:xmap :xnoremap 可視模式
:cmap :cnoremap 命令模式
:imap :inoremap 插入模式

這里解釋一下遞歸的問題: 假設你將 按鍵 a 映射成了 按鍵 b, 又把按鍵 b 映射成了 命令x, 當使用遞歸命令映射的情況下, 你按 a 鍵, 最終會執行 命令x, 如果使用非遞歸命令映射, 則你按 a 鍵, 會執行 b 鍵的功能, 只有按 b 鍵, 才會執行 命令x.

結論: 如果確實應該使用遞歸, 則使用遞歸映射, 否則一般使用非遞歸映射

另外, F1-F12鍵, Esc鍵, 回車鍵等各種功能鍵都有對應的字母序列, 可通過下面的命令查看:

help key-notation

注意: 功能鍵的字母序列不區分大小寫, 即 <Esc> 和 <esc> 是 等效的.

另外, 使用上述命令配置的按鍵映射只對當前 Vim 實例有效, 重啟 Vim 之后就無效了. 那咋辦? 很簡單, 把配置寫在 vimrc 中就可以了, 下面是我的一些按鍵配置:

" 將 kk 配置成 esc, Esc 鍵太遠了, 從插入模式到普通模式, 連續按兩次 k 即可
inoremap kk <esc>
" ctrl-h  光標左移一格
inoremap <c-h> <left>
" ctrl-j  垂直下移一行
inoremap <c-j> <down>
" ctrl-k  垂直上移一行
inoremap <c-k> <up>
" ctrl-l  光標右移一格
inoremap <c-l> <right>
" 按 U 執行 redo
noremap U <c-r>
" shift 回車, 在下一行輸入
inoremap <s-cr> <end><cr>
" 在可視模式下使用p粘貼時不替換寄存器內容, 這里是利用了黑洞寄存器
vnoremap p "_dP
" 對于很長的行, vim會自動折行, 此時 j 或者 k 就會一下跳很多行,
" 使用 gk,gj 可以避免跳過多行, 但是不方便, 所以做了如下映射.
nnoremap k gk
nnoremap j gj
vnoremap k gk
vnoremap j gj

看到這里你可能會有疑問: 在插入模式下, 我把 Ctrl-h/j/k/l 映射成左下上右, 不覺得麻煩嗎? 并不, 因為我使用另一款軟件: KeyTweak, 把 Ctrl 鍵的位置換到了 Alt 鍵上, 這樣我就能很方便地使用 Ctrl 鍵了.

<leader>

<leader> 鍵是 Vim 中一個比較特殊的按鍵, 被稱為前置鍵, 默認是 \, 這個鍵的作用是: 先按下前置鍵, 松開后再按別的按鍵, 就可以形成一套快捷鍵.

由于 \ 鍵比較難按到, 一般都會將前置鍵改為容易按到的鍵, 我將其改為 ;了, 需要在 vimrc 中添加如下配置:

let mapleader=";"

然后就可以很愉快的使用前置鍵映射各種快捷鍵了:

" 將 <leader> 鍵配置為 ';'
let mapleader=";"
" 按 <leader>w 保存文件
nnoremap <leader>w :w<cr>
" 按 <leader>2 執行上一次的宏
nnoremap <leader>2 @@
" 可視模式下按 <leader>y 將內容寫入系統寄存器
vnoremap <leader>y "+y
" 按 <leader>p 將系統寄存器中的內容粘貼出來
nnoremap <leader>p "+p
" 按 <leader>no 取消搜索高亮, 沒錯, <leader> 鍵后面可以跟鍵序列
nnoremap <leader>no :nohlsearch<cr>
" 按 <leader>k 向上移動半屏
nnoremap <leader>k <c-u>
" 按 <leader>j 向下移動半屏
nnoremap <leader>j <c-d>

可以看到, 前置鍵的映射方式和其他鍵的映射方式是一樣的.

需要注意的是, <leader> 鍵的按鍵映射可以將多個按鍵映射成另一個序列或指令, 例如:

" 將 <leader>no 映射成命令 :nohosearch<cr>
nmap <leader>no :nohlsearch<cr>

這樣也會帶來一個問題: 如果既有 <leader>n, 又有 <leader>no, 那么當你輸入 <leader>n 的時候, Vim 就得等下一個按鍵 o 的輸入(類似于 kk 映射成 Esc), 這會浪費一些時間, 甚至影響你原本的意圖, 所以多個鍵映射盡量不要出現"同序的相同字符", 改為 <leader>nn, <leader>no 就不會有問題了.

我的 vimrc

很多 vimer 會把自己的 vimrc 掛到網上, 供別人參考. 這里也貼一下我的 vimrc 地址吧:
https://github.com/GraysonGao/MyConfig/blob/master/vim/_vimrc

我其實配置的東西比較少, 大都是些基本配置, 而且添加了詳細的注釋, 很容易看懂.

小結

現在, 你幾乎已經是個高階玩家了, 現在的你再去看 Vim 的文檔以及各種 Vim 的文章, 就很容易看懂了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374