---
# System prepended metadata

title: VIM 常用操作
tags: [EfficiencyTool]

---

###### tags: `EfficiencyTool`

# VIM 常用操作

## 模式

- 普通模式 (normal/common mode) : 默認模式，操縱游標。
- 可視模式 (visual mode) : 選取範圍，操縱範圍內文字。
- 編輯模式 (insert mode) : 編輯文字。
- 命令模式 (command line mode) : 輸入命令列指令。

## 普通模式

### 移動

- 字元

| 指令 | 動作         | 備註                          |
| ---- | ------------ | ----------------------------- |
| h    | 游標往左移動 | 5h，游標往左移動5行，列數不變 | 
| j    | 游標往下移動 | 5j，游標往下移動5列，行數不變 |
| k    | 游標往上移動 | 3k，游標往上移動3列，行數不變 |
| l    | 游標往右移動 | 2l，游標往右移動2行，列數不變 |
![](https://i.imgur.com/AbB1BCt.gif)


- 單列

| 指令 | 動作                                                     | 備註                             |
| ---- |:-------------------------------------------------------- | -------------------------------- |
| w    | 由左往右的字間移動，游標在單字的第一個字元               | 5w，移動到第五個字               |
| e    | 由左往右的字間移動，游標在單字的最後一個字元             | 3e                               |
| b    | 由右往左的字間移動，游標在單字的第一個字元               | 2b                               |
| W    | 由左往右字間移動，游標在字的第一個字元，間隔一個空格     | 2W                               |
| E    | 由左往右的字間移動，游標在字的最後一個字元，間隔一個空格 | 6E                               |
| B    | 由右往左的字間移動，游標在字的第一個字元，間隔一個空格   | 9B                               |
| 0    | 游標移動到第一個字元                               | 0w，回到第一個字的字首           |
| ^    | 游標移動到第一個非空字元                            |                                  |
| _    | 游標移動到第一個非空字元                            |                                  |
| $    | 游標移動到最後一個字元                              |                                  |
| G    | 游標移到檔案最後一列                                | 22G，移動到第22列                |
| gg   | 游標移到檔案第一列                                  | 30gg，移動到第30列               |
| H    | 游標移到檔案顯示畫面的最上面一列                         |                                  |
| M    | 游標移到檔案顯示畫面的中間那一列                         |                                  |
| L    | 游標移到檔案顯示畫面的最下面一列                         |                                  |
| ==   | 重新自動縮進游標所在列                                   | 3==，從游標所在列起算3列自動縮進 |
| %    | 跳至檔案大概位置                                         | 檔案有100行，10%跳至第10行                                 |

- 頁面

| 指令     | 動作                             | 備註 | 
| -------- | -------------------------------- | ---- |
| Ctrl + f | 頁面往下捲動一頁                 |      |
| Ctrl + d | 頁面往下捲動半頁                 |      |
| Ctrl + b | 頁面往上捲動一頁                 |      |
| Ctrl + u | 頁面往上捲動半頁                 |      |
| Ctrl + e | 頁面往上捲動一行                 |      |
| Ctrl + y | 頁面往下捲動一行                 |      |
| zz       | 以當下游標所在列為中心調整頁面   |      |
| zt       | 以當下游標所在列為最上列調整頁面 |      |
| zb       | 以當下游標所在列為最下列調整頁面 |      |
| gg=G     | 重新縮進整個檔案                 |      |

### 刪除

| 指令 | 動作                                   | 備註                       |
| ---- | -------------------------------------- | -------------------------- |
| x    | 刪除游標處所在字元                     | 7x，刪除游標處後7個字元    |
| X    | 刪除游標處前一個字元                   | 8X，刪除游標處前8個字元    |
| dd   | 刪除游標處的一整列                     | 3dd，刪除從游標所在列開始下3列 |
| dw   | 刪除游標處單字                         | 4dw，刪除從游標處開始4個單字 |
| d0   | 從游標處前一個字元刪除到該列第一個字元           |                            |
| d$   | 從游標處刪除到該列最後一個字元         |                            |
| dgg  | 從游標處刪除到第一列               |                            |
| dG   | 從游標處刪除到最後一列             |                            |

### 復原/重做

| 指令     | 動作               | 備註               |
| -------- | ------------------ | ------------------ |
| u        | 撤銷動作     | 2u，撤銷2個動作 |
| Ctrl + r | 重做動作     |                    |
| .        | 重做上一個指令     |                  |


### 複製/貼上

| 指令 | 動作                                                      | 備註                       |
| ---- | --------------------------------------------------------- | -------------------------- |
| yy   | 複製游標處一整列                                          | 3yy，複製從游標處開始下3列 |
| yw   | 複製游標處單字                                            |                            |
| y1G  | 複製游標處到第一列所有資料                            |                            |
| yG   | 複製游標處到最後一列所有資料                          |                            |
| y0   | 複製游標處字元到該列行首所有資料                          |                            |
| y$   | 複製游標處字元到該列行尾所有資料                          |                            |
| p    | 在下一列貼上複製或刪除之列/在游標處往右貼上複製或刪除的字 | 3p，游標處起算下3列貼上    |
| P    | 在上一列貼上複製或刪除之列/在游標處往左貼上複製或刪除的字 | 8p,游標處起算上8列貼上     |
| J    | 將游標所在列與下一列黏貼                                  | 6J，游標處起算黏貼下6列    |


### 搜索/取代

| 指令     | 動作                                    | 備註                                    |
| -------- | --------------------------------------- | --------------------------------------- |
| f + 字元 | 往右搜索字元，游標移動到第一個符合處    |                                         |
| F + 字元 | 往左搜索字元，游標移動到第一個符合處    |                                         |
| ;        | 游標移動到同方向的符合處                |                                         |
| ,        | 游標移動到反方向的符合處                |                                         |
| r        | 取代游標所在字元一次                    | 按下r，再打一個字元，原來字元就會被替代 |
| R        | 進入取代模式，直接輸入文字，直到按下ESC |                                         |
| #        | 往游標處上面列尋找游標處的單字(完全符合)          |                                         |
| *        | 往游標處下面列尋找游標處的單字(完全符合)          |                                         |
| g#       | 往游標處上面高亮符合游標處的單字(部分符合)        | 可用n，N跳躍符合的單字                  |
| g*       | 往游標處下面高亮符合游標處的單字(部分符合)        | 可用n，N跳躍符合的單字                  |
| gd       | 跳至游標處的定義                        |                                         |


### 標記
| 指令 | 動作                          | 備註 |
| ---- | ----------------------------- | ---- |
| ma   | 標記游標所在列為標記a         |      |
| `a   | 跳到標記a的所在行與列         |      |
| 'a   | 跳到標記a的所在列的第一個字元 |      |`
| ''   | 回跳上一列                    |      |

### 切換模式

| 指令     | 動作                                             | 備註             |
| -------- | ------------------------------------------------ | ---------------- |
| i        | 游標所在處進入編輯模式                           |                  |
| I        | 游標所在列第一個字的字首進入編輯模式             |                  |
| a        | 游標所在處下一個字元進入編輯模式                 |                  |
| A        | 游標所在列最後一個字的字尾進入編輯模式           |                  |
| s        | 刪除游標所在處字元後進入編輯模式                 |                  |
| S        | 刪除游標所在列的所有字後進入編輯模式             |                  |
| o        | 在游標所在下一列插入新的一列並進入編輯模式       |                  |
| O        | 在游標所在上一列插入新的一列並進入編輯模式       |                  |
| cc       | 效果等同於S                                      |                  |
| cw       | 刪除游標所在單字並進入編輯模式                   | c是change的簡寫  |
| c0       | 刪除游標處到第一個字元並進入編輯模式             | 不含游標處字元   |
| c$       | 刪除游標處到最後一個字元並進入編輯模式           | 含游標處字元     |
| v        | 進入可視模式，選取游標移動的足跡                 | character visual |
| V        | 進入可視模式，每次選取整列                       | line visual      |
| Ctrl + v | 進入可視模式，每次選擇單字元，可縱向選取矩形區域 | block visual     |
| :        | 進入命令模式                                     |                  |
| /        | 進入命令模式，游標處往下搜索                     |                  |
| ?        | 進入命令模式，游標處往上搜索                     |                  |
| ZZ       | 儲存並離開                                       |                  |

### 其他
| 指令     | 動作                              | 備註                |
| -------- | --------------------------------- | ------------------- |
| Ctrl + x | 游標在數字上，使用此指令將數字減1 |                     |
| Ctrl + a | 游標在數字上，使用此指令將數字加1 |                     |
| Ctrl + o | 游標跳回上一個游標位置            |                     |
| Tab      | 游標跳回下一個游標位置            |                     |
| :ju      | 查看所有位置                      |                     |
| [[       | 游標跳至當前區塊的{處             |                     |
| ]]       | 游標跳至當前區塊的{處             |                     |
| %        | 括號間移動{},[],()                |                     |
| (        | 游標移到上一個句子之首            | 英文句子，以.!?區隔 |
| )        | 游標移到下一個句子之首            |                     |
| {        | 游標移到上一個段落之首            | 段落以空白行為區隔  |
| }        | 游標移到下一個段落之首            |                     |
| 輸入模式下 + ctrl R + shift "+"        | 貼上copyboard的內容|                     |

## 可視模式

| 指令    | 動作                                          | 備註                                 |
| ------- | --------------------------------------------- | ------------------------------------ |
| d       | 刪除選取區域                                  |                                      |
| y       | 複製選取區域                                  |                                      |
| I + ESC | 插入文字後，按ESC，其他列開頭會複製一樣的文字 | 只有利用Ctrl + v所選取區域才有此效果 | 
| vaw     | 選取一個單字 | 含空白 |
| viw     | 選取一個單字 | 不含空白 |
| vi(     | 選取括號內單字 | 不含空白, 括號可換成\[, \{, \", \' |


## 命令模式

### 搜尋/取代

| 指令  | 動作                                     | 備註 |
| ----- | ---------------------------------------- | ---- |
| /word | 進入命令模式，搜尋游標以下內容為word的字 |      |
| ?word | 進入命令模式，搜尋游標以上內容為word的字 |      |
| n     | 重複搜尋動作，游標跳至符合字             |      |
| N     | 反向重複搜尋動作，游標跳至符合字         |      |

### 讀/寫/離開檔案
| 指令        | 動作                     | 備註 |
| ----------- | ------------------------ | ---- |
| :w          | 儲存目前檔案             |      |
| :q          | 離開                     |      |
| :wq         | 儲存並離開               |      |
| :w!         | 對唯讀檔強制儲存         |      | 
| :q!         | 不儲存檔案，強制離開     |      |
| :wq!        | 強制儲存並離開           |      |
| :w filename | 另存新檔，名稱為filename |      |

### 搜尋並清除非結果行數
:v/test/d

### easymotion

### nubmer increase

[How to generate a number sequence in file using vi or Vim?](https://stackoverflow.com/questions/9903660/how-to-generate-a-number-sequence-in-file-using-vi-or-vim)

arting with Vim 7.4.754 one can use g Ctrl-a, see :help v_g_CTRL-A

Go to line #4, use Ctrl-v to blockwise select the first character, go down 4 lines, press Shift i, enter 0  (this is 0, followed by Space) and Esc to exit insert mode.

Now use gv to re-select the previously selected area. Press g Ctrl-a to create a sequence.

I start with a 0 here, so I can re-select by gv. If you start with a 1, you need to re-select by hand while omitting the first 1.

Use 2g Ctrl-a to use a step count of 2.

![CbUTo](https://hackmd.io/_uploads/By0iUd14p.gif)


### 改變檔案編碼
進入指令模式(改成支持簡體中文格式)
:edit ++enc=gb18030


## 參考

[Vim](https://www.vim.org/)

[大家來學VIM](http://www.study-area.org/tips/vim/index.html)

[Vim Tips維基](https://vim.fandom.com/wiki/Vim_Tips_Wiki)

[vi、Vim 文字編輯器教學和常用按鍵與指令表](https://www.footmark.info/linux/centos/vi-vim/)

[vim 教程網](https://vimjc.com/)