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

版本 8091cd61ccfc832e5d9349539764441db0b52f09

vim/vimrc

Changes from 8091cd61ccfc832e5d9349539764441db0b52f09 to ca7878e19e7716d92b79a014b3b58b4e05b859e9

---
title: vimrc設定教學
toc: yes
categories: vim
...


*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 字元('\\t')。也就是說,如果上一行有兩個 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 相當有幫助!
    - 在 coding 的過程中```{}```的使用量很大,所以這個 key mapping 對於 coding 相當有幫助!
    - 在 insert-mode 時,當輸入'{',vim會輸入``{`` → ``<CR>``換行 → 輸入``}`` → 進入command-mode → ``k``光標上移 → ``o``插入新的一行 → 自動增加縮排

- ```:inoremap {{ {}<ESC>i```
    - 另外一個用到 ```{}``` 的時機為陣列的宣告,為了避免跟用於函式宣告之類的大括號混淆,所以故意設成兩個連續鍵。也就是,如果輸入```{```後按```Enter```會執行```:inoremap {<CR> {<CR>}<Esc>ko```,而如果是按```{{```就會執行```:inoremap {{ {}<ESC>i```。如果在```{```後按其他未設定的組合鍵,則視為一般輸入。