分享到plurk 分享到twitter 分享到facebook

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
  • :inoremap {<CR> {<CR>}<Esc>ko
    • 在 coding 的過程中 {} 的使用量很大,所以這個 key mapping 對於 coding 相當有幫助!
    • 在 insert-mode 時,當輸入 { ,vim會輸入 {<CR> 換行 → 輸入 } → 進入command-mode → k 光標上移 → o 插入新的一行 → 自動增加縮排
  • :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
    • 設定行號為:粗體,前景色為深灰色,沒有背景色
    • hihighlight 指令的縮寫,擁有同樣的效果
    • 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

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