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

版本 97ec1c126f7925190c3b09c6c30e667745ec7b07

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 expendtab
    • 輸入 tab 都會被轉換成 space,而對應的 space 數量由 :set tabstop=x 決定
    • 但是文件中已經存在的 tab 鍵不會受到影響,必須在 command mode 下輸入 :retab ,才會被替換掉
    • 如果只有當下那一行的 tab 要被替換成 space,則輸入 :.retab