###### 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行,列數不變 |

- 單列
| 指令 | 動作 | 備註 |
| ---- |:-------------------------------------------------------- | -------------------------------- |
| 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.

### 改變檔案編碼
進入指令模式(改成支持簡體中文格式)
: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/)