Vim 系列教程目錄:git
vimrc 是 Vim 的配置文件, Vim 在啓動時會加載 vimrc 文件, 你能想到的幾乎全部的配置(包括主題, 快捷鍵, 插件設置等等), 均可以配置在 vimrc 中, 因此, vimrc 在 Vim 使用過程當中有着相當重要的地位. Vim 是極其依賴 vimrc 配置的, 沒有通過配置的 Vim 又醜又難用, 可是你若是懂得怎麼配置, 就能夠把 Vim 變成你想要的樣子.github
這裏要明確一個概念: vimrc 中的大多數配置都是 Vim 命令模式下支持的命令, 均可以在命令模式下使用, 可是在命令模式中使用時, 只針對當前打開的 Vim 實例有效, 關閉了 Vim 以後再次打開, 以前在命令模式下的設置就無效了. 而配置到 vimrc 中, 每次 Vim 啓動時都會自動讀取並執行, 因此能夠自動生效.vim
那麼 vimrc 文件在哪呢? 打開 Vim, 使用 :version
命令, 便可查看 Vim 的版本信息, 其中就包括了 vimrc 文件的位置. 個人電腦是 Windows, 能夠看到相似以下輸出:bash
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
區分大小寫.post
Windows 版的 Vim 在安裝時, 會自動在安裝目錄下生成一個 _vimrc
文件, 也就是 $VIM/_vimrc
, 即 "第三用戶 vimrc 文件", 其餘 vimrc 文件都是不存在的, 因此通常來講修改 $VIM/_vimrc
文件便可.字體
Linux 和 Mac 的查看及尋找方式也是同樣的, 一樣是使用 :version
命令, 這裏再也不贅述.ui
接下來咱們就能夠修改 vimrc 文件了. 在這以前請切記: 不要把任何你不理解的配置放到你的vimrc中, 你能夠在網上找到成噸的 vimrc 配置文件, 但那都是別人的, 若是你不理解他們的配置, 一切照搬過來, 那結果是很糟糕的.編碼
PS. 我後續的演示及配置都是基於 Windows 的. 另外, 在修改 vimrc 以前, 請先本身備份一個, 確保改壞了還能恢復回來.
首先第一條要修改的就是: 關閉兼容模式. Vim 默認是以兼容 Vi 的模式運行的(Vi 是遠古時期的 Vim), 在這種模式下, 不少 Vim 的高級特性都沒法使用, 因此首先就要關閉兼容模式, 請把這條配置放在你 vimrc 文件的第一行:
set nocompatible " 關閉兼容模式 複製代碼
vimrc 中, "
號後面的內容爲註釋.
修改並保存以後要使之生效, 須要重啓 Vim. 還有個更簡單的方法, 就是在命令模式下輸入 下面兩個命令中的任意一個:
:source $vim/_vimrc
:source %
複製代碼
大部分狀況下, 執行完上面的命令後, vimrc 的修改會當即生效, 可是有些特殊配置執行完這兩個命令後不能及時生效, 這時就只能重啓 Vim 了. 另外, :source
命令可簡寫爲 :so
若是你以爲默認字體很差看, 可使用以下配置修改字體:
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
複製代碼
注意: 功能鍵的字母序列不區分大小寫, 即 和 是 等效的.
另外, 使用上述命令配置的按鍵映射只對當前 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
就不會有問題了.
不少 vimer 會把本身的 vimrc 掛到網上, 供別人參考. 這裏也貼一下個人 vimrc 地址吧:
github.com/GraysonGao/…
我其實配置的東西比較少, 大都是些基本配置, 並且添加了詳細的註釋, 很容易看懂.
如今, 你幾乎已是個高階玩家了, 如今的你再去看 Vim 的文檔以及各類 Vim 的文章, 就很容易看懂了.