版本 ca7878e19e7716d92b79a014b3b58b4e05b859e9
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 字元(‘\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
- 在insert-mode下,只要輸入 ‘(’ ,vim會先執行輸入
: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
。如果在{
後按其他未設定的組合鍵,則視為一般輸入。
- 另外一個用到