vimrc設定教學
vim 是強大的IDE,很多初學者碰到 vim 會很不習慣,像是用 hjkl 鍵來移動游標,不小心按到方向鍵讓編輯一整個崩潰的悲慘經驗,使得初學者不喜歡碰 vim (被視窗化介面給寵壞了)。 vim 強大的地方在於使用者可以自由的設定和擴充功能,讓 vim 為自己工作,進而擁有良好得編輯體驗。良好的 vim 設定,使得在 coding 過程中不用去煩惱編輯器的問題,增強 coding 效率。
前置作業
安裝 vim
剛安裝好的 linux 系統上只有 vi,vi 預設不支援方向鍵移動光標,還有自動上色等功能。但是 vim 比 vi 強大很多很多很多 ( 真的很多,所以說三次 ),除了以上功能不用另外設定外,還支援多步復原/取消復原、同時編輯多個檔案等。
$ sudo apt-get install vim# linux的安裝指令(常用)
建立 vim 設定檔 .vimrc
$ cd# 移動到使用者的家目錄$ vi .vimrc# 建立新的vim設定檔
基本設定
所有設定都可以在 vim 的 command-mode
中作即時變更,像是如果要關閉自動縮排對齊功能時,先按 Esc
離開 insert-mode,輸入 :set noai 就可以了。
介面優化
:set nu- 顯示行號:對於 debug 相當有幫助!
:set ai- 自動對齊縮排:如果上一行有兩個 tab 的寬度,按 enter 繼續編輯下一行時會自動保留兩個 tab 鍵的寬度。
:set cursorline- 光標底線:光標所在的那一行會有底線,幫助尋找光標位置
:set bg=light- 上色模式-針對亮背景上色
- 預設為亮背景(白色等)上色,但是終端機的初始背景色為深紫色,會出現文字失蹤
( 例如註解為深藍色 ) 的情況。將這一行換成
:set bg=dark即可。
:set tabstop=4- 縮排間隔數 ( 預設為 8 個空白對齊 )
- 也就是說按一次 tab 鍵,游標會自動跳 4 格空白字元的寬度。雖有多個空格但實際上只有一個 tab 字元。
- 注意:也就是說,在其他環境下,看到 tab 字元,依舊是 8 個空白寬
:set shiftwidth=4- 自動縮排對齊間隔數:向右或向左一個縮排的寬度
以下可以斟酌使用
:set mouse=a- 啟用游標選取:游標可以直接選取文字,滾輪可以直接滑動頁面 ( 非移動游標 )。
- 可以取代用
v選取字元的功能,配合ctrl+insert( 複製 ) 及shift+inset( 貼上 ),相當方便
:set mouse=""- 停用游標選取:游標無法選取文字,滾輪只會移動光標的位置。
:set ruler- ( 預設就有 ) 顯示右下角的
行,列 目前在文件的位置 %的資訊
- ( 預設就有 ) 顯示右下角的
:set backspace=2- ( 預設就有 ) 在 insert 模式啟用 backspace 鍵
:set formatoptions+=r- 自動註解(注意:若要貼上的文件某一行有註解,會因為此項設定而讓其以下每一行都變成註解)
:set history=100- 保留 100 個使用過的指令
:set incsearch- 在關鍵字尚未完全輸入完畢前就顯示結果
- 如果覺得這功能太過熱心的話,可以使用
ctrl+n來達成自動補完的功能
Key Mapping
如果有使用過其他IDE,就會發現有個好用的功能,括號自動對齊,例如:只輸入左括號,IDE自動幫你完成右括號。可以使用key mapping來完成。
:inoremap ( ()<Esc>i- 在insert-mode下,只要輸入
(,vim會先執行輸入()→<Esc>進入 Command-mode →i進入 Insert-mode → 就會發現游標在 “(” “)” 之間了 - 其他類似應用還有:
:inoremap " ""<Esc>i:inoremap ' ''<Esc>i:inoremap [ []<Esc>i
- 在insert-mode下,只要輸入
:inoremap {<CR> {<CR>}<Esc>ko- 在 coding 的過程中
{}的使用量很大,所以這個 key mapping 對於 coding 相當有幫助! - 在 insert-mode 時,當輸入
{,vim會輸入{→<CR>換行 → 輸入}→ 進入command-mode →k光標上移 →o插入新的一行 → 自動增加縮排
- 在 coding 的過程中
:inoremap {{ {}<ESC>i- 另外一個用到
{}的時機為陣列的宣告,為了避免跟用於函式宣告之類的大括號混淆,所以故意設成兩個連續鍵。也就是,如果輸入{後按Enter會執行:inoremap {<CR> {<CR>}<Esc>ko,而如果是按{{就會執行:inoremap {{ {}<ESC>i。如果在{後按其他未設定的組合鍵,則視為一般輸入。
- 另外一個用到
tab 與 space
:set expandtab- 輸入
tab都會被轉換成 space,而對應的 space 數量由:set tabstop=x決定 - 但是文件中已經存在的
tab鍵不會受到影響,必須在 command mode 下輸入:retab,才會被替換掉 - 如果只有當下那一行的 tab 要被替換成 space,則輸入
:.retab
- 輸入
更多設定
輸入優化
filetype indent on( 好用! )- 啟用依照檔案類型,決定自動縮排樣式的功能
- 例如:如果正在編輯的檔案是
.c或.cpp檔,遇到{按下enter,會自動往右一縮排。如果是Makefile,輸入完 target 按下enter,為了 rule 而自動往右一縮排。
行號顏色
:hi LineNr cterm=bold ctermfg=DarkGrey ctermbg=NONE- 設定行號為:粗體,前景色為深灰色,沒有背景色
hi為highlight指令的縮寫,擁有同樣的效果LineNr指定為 line number 的顏色設定cterm指的是爲 color terminal 的環境 ( 在 linux 桌面環境所開的 terminal ) 做設定,其他還有term( 一般 terminal,例如透過 putty 連上的工作環境 )、gui。cterm支援的顏色列表,一共有 16 色
NR-16 NR-8 COLOR NAME
0 0 Black
1 4 DarkBlue
2 2 DarkGreen
3 6 DarkCyan
4 1 DarkRed
5 5 DarkMagenta
6 3 Brown, DarkYellow
7 7 LightGray, LightGrey, Gray, Grey
8 0* DarkGray, DarkGrey
9 4* Blue, LightBlue
10 2* Green, LightGreen
11 6* Cyan, LightCyan
12 1* Red, LightRed
13 5* Magenta, LightMagenta
14 3* Yellow, LightYellow
15 7* White
:hi CursorLineNr cterm=bold ctermfg=Green ctermbg=NONE- 設定游標所在的行號為:粗體,前景色為綠色,沒有背景色
- 配合
:hi LineCr就可以很清楚的知道現在游標所在的位置
例子
vim sublime Theme
- vim-monokai
- Screenshot
微 Sublime 風
- Screenshot
- 額外設定
- Additional vim c++ syntax-highlighting
- terminal 背景色設為 #002B36 ( solarized dark,很棒的配色,google 圖片可以找到很多漂亮的上色 )
- .vimrc
set nu
set cursorline
set tabstop=4
set shiftwidth=4
" Color configuration
set bg=dark
color evening " Same as :colorscheme evening
hi LineNr cterm=bold ctermfg=DarkGrey ctermbg=NONE
hi CursorLineNr cterm=bold ctermfg=Green ctermbg=NONE