版本 7b2a039f051b532cd5fb09d24a9cb0ae64cadce0
Changes from 7b2a039f051b532cd5fb09d24a9cb0ae64cadce0 to current
---
title: vimrc設定教學
toc: no
categories: vim
toc: yes
categories: vim, editor
...
*vim*是強大的IDE,很多初學者碰到*vim*會很不習慣,像是用hjkl鍵來移動光標,不小心按到方向鍵讓編輯一整個崩潰的**悲慘經驗**,使得初學者不喜歡碰*vim*(被視窗化介面給寵壞了)。*vim*強大的地方在於使用者可以自由的設定和擴充功能,讓*vim*為自己工作,進而擁有良好得編輯體驗。良好的*vim*設定,使得在coding過程中不用去煩惱編輯器的問題,增強coding效率。
前置作業
------------------------
- | **安裝*vim***
| 剛安裝好的linux上只有vi,vi預設不支援方向鍵移動光標,還有自動上色等功能。但是*vim*比vi強大很多很多,除了以上功能不用另外設定外,還支援多步復原/取消復原、同時編輯多個檔案等。
- ``$ sudo apt-get install vim`` # linux的安裝指令(常用)
*vim* 是強大的IDE,很多初學者碰到 *vim* 會很不習慣,像是用 hjkl 鍵來移動游標,不小心按到方向鍵讓編輯一整個崩潰的**悲慘經驗**,使得初學者不喜歡碰 *vim* (被視窗化介面給寵壞了)。 *vim* 強大的地方在於使用者可以自由的設定和擴充功能,讓 *vim* 為自己工作,進而擁有良好得編輯體驗。良好的 *vim* 設定,使得在 coding 過程中不用去煩惱編輯器的問題,增強 coding 效率。
|
# **前置作業** #
- **建立vim設定檔.vimrc**
- ``$ cd`` # 移動到使用者的家目錄
- ``$ vi .vimrc`` # 建立新的vim設定檔
## 安裝 *vim* ##
剛安裝好的 linux 系統上只有 vi,vi 預設不支援方向鍵移動光標,還有自動上色等功能。但是 *vim* 比 vi 強大很多很多很多 ( 真的很多,所以說三次 ),除了以上功能不用另外設定外,還支援多步復原/取消復原、同時編輯多個檔案等。
基本設定
------------------------
- ``:set nu``
- **顯示行號:**對於debug相當有幫助!
- ```$ sudo apt-get install vim``` # linux的安裝指令(常用)
- ``:set ai``
- **自動對齊縮排** 縮排即為一個tab字元('\\t')。也就是說,如果上一行有兩個tab的寬度,按enter繼續編輯下一行時會自動保留兩個tab鍵的寬度。
## 建立 vim 設定檔 .vimrc ##
- ```$ cd``` # 移動到使用者的家目錄
- ```$ vi .vimrc``` # 建立新的vim設定檔
- ``:set cursorline``
- **光標底線:**光標所在的那一行會有底線,幫助尋找光標位置
# **基本設定** #
- ``:set bg=light``
- **上色模式-針對亮背景上色**
- 預設為亮背景(白色等)上色,但是終端機的初始背景色為深紫色,會出現文字失蹤(註解為深藍色)的情況。將這一行換成``:set bg=dark``即可。
所有設定都可以在 vim 的 command-mode 中作即時變更,像是如果要關閉自動縮排對齊功能時,先按 ```Esc``` 離開 insert-mode,輸入 ```:set noai``` 就可以了。
- ``:set tabstop=4``
- **縮排間隔數:**預設為8格對齊
- 也就是說按一次tab鍵,游標會跳到第8\*n+1格。雖有多個空格但實際上只有**一個tab字元**。
## 介面優化 ##
- ```:set nu```
- **顯示行號:**對於 debug 相當有幫助!
.. [Not sure]- ``:set shiftwidth=4`` **自動縮排間隔數:**?
- ```:set ai```
- **自動對齊縮排:**如果上一行有兩個 tab 的寬度,按 enter 繼續編輯下一行時會自動保留兩個 tab 鍵的寬度。
- ``:set mouse=a``
- **啟用游標選取:**游標可以直接選取文字,滾輪可以直接滑動頁面(非移動光標)。
- ```:set cursorline```
- **光標底線:**光標所在的那一行會有底線,幫助尋找光標位置
- ``:set mouse=""``
- **停用游標選取:**游標無法選取文字,滾輪只會移動光標的位置。
- ```:set bg=light```
- **上色模式-針對亮背景上色**
- 預設為亮背景(白色等)上色,但是終端機的初始背景色為深紫色,會出現文字失蹤 ( 例如註解為深藍色 ) 的情況。將這一行換成 ```:set bg=dark``` 即可。
- ``:set ruler``
- 顯示右下角的設定值
- ```:set tabstop=4```
- **縮排間隔數** ( 預設為 8 個空白對齊 )
- 也就是說按一次 tab 鍵,游標會自動跳 4 格空白字元的寬度。雖有多個空格但實際上只有**一個 tab 字元**。
- 注意:也就是說,在其他環境下,看到 tab 字元,依舊是 8 個空白寬
- ``:set backspace=2``
- 在insert模式啟用backspace鍵
- ```:set shiftwidth=4```
- **自動縮排對齊間隔數:**向右或向左一個縮排的寬度
- ``:set formatoptions+=r``
- 自動註解(注意:若要貼上的文件某一行有註解,會因為此項設定而讓其以下每一行都變成註解)
以下可以斟酌使用
- ``:set history=100``
- 保留 100 個使用過的指令
- ```:set mouse=a```
- **啟用游標選取:**游標可以直接選取文字,滾輪可以直接滑動頁面 ( 非移動游標 )。
- 可以取代用 ```v``` 選取字元的功能,配合 ```ctrl+insert``` ( 複製 ) 及 ```shift+inset``` ( 貼上 ),相當方便
- ``:set incsearch``
- 在關鍵字尚未完全輸入完畢前就顯示結果
- ```:set mouse=""```
- **停用游標選取:**游標無法選取文字,滾輪只會移動光標的位置。
|
- ```:set ruler```
- ( 預設就有 ) 顯示右下角的 ```行,列 目前在文件的位置 %``` 的資訊
+ 所有設定都可以在vim的command-mode中作即時變更,像是如果要關閉自動縮排對齊功能時,先按``Esc``離開insert-mode,輸入``:set noai``就可以了。
- ```:set backspace=2```
- ( 預設就有 ) 在 insert 模式啟用 backspace 鍵
Key Mapping
----------------
- ```: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 ( ()<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 { {<CR>}<Esc>ko<Tab>``
- 在coding的過程中{}的使用量也很大,所以這個key mapping對於coding相當有幫助!
- 在insert-mode時,當輸入'{',vim會輸入``{``→``<CR>``換行→輸入``}``→進入command-mode→``k``光標上移→``o``插入新的一行→``Tab``增加縮排
- ```: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 色](http://vimdoc.sourceforge.net/htmldoc/syntax.html#highlight-cterm)
~~~ {}
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](https://github.com/sickill/vim-monokai)
- Screenshot
![](https://camo.githubusercontent.com/66d46739895bdea648a10e286a6381943f876d04/68747470733a2f2f636c6f75642e6769746875622e636f6d2f646f776e6c6f6164732f7369636b696c6c2f76696d2d6d6f6e6f6b61692f76696d2d6d6f6e6f6b61692e706e67)
-
## 微 Sublime 風 ##
- Screenshot
![](/vim/highlight_ex1.PNG)
- 額外設定
- [Additional vim c++ syntax-highlighting](https://github.com/octol/vim-cpp-enhanced-highlight)
- 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
```