###### 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/)