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