跳至主要内容

[Vim] 操作模式

TL;DR

參考資料

圖片所有權

本篇有些圖片取自高見龍老師在IT幫的鐵人賽文章中。

僅供紀錄學習用途,如有不妥麻煩告知。

相關連結


模式介紹

操作方式主要分為normal模式insert模式visual模式

我們一般在移動都是使用normal模式。

insert模式顧名思義就是插入(即在輸入文字時會使用的模式。

而visual模式則是需要選取複製貼上時會使用的模式。

可以在不同模式之間切換,如果要回到normal模式的時候可以使用esc按鍵,或是使用ctrl+[

tip
  • normal:一般模式
  • insert:插入(輸入)模式
  • visual:選取模式
  • esc ( or ctrl+[ ):退回一般模式
Windows

在windows系統上,如果是使用注音輸入法則無法使用ctrl+[

必須切換成純英文輸入法才可以使用ctrl+[跳脫不同模式。

移動

基本上不推薦在insert模式下移動,如果要移動或是選取的話要先回到normal模式之下再移動。 以下沒有特別說明模式皆為normal模式移動。
在vim裡面有很多種方法,所以可以根據自己的需求選擇最適合自己的指令

基礎上下左右

我們移動可以使用上下左右按鍵,但是因為使用上下左右時,右手需要離開鍵盤主要打字區域,所以不建議使用,可以使用hjkl來移動。

tip
  • ,,,分別對應k,j,h,l

折行上下控制

有時候在同一行的時候,只是礙於寬度的關係導致明明是同一行,卻折到第二行。這時候Vim仍然會將其視為同一行,所以j,k的上下切換會無效,但是如果這時候仍想切換的時候,可以使用g+jg+k來上下切換。

tip
  • 折行時可以使用g+jg+k來在同一行內上下切換

跳往指定行號

可以直接使用行號+G去前往該行,例如輸入15G可以直接前往15行

tip

行號+G前往該行號第一個文字的位置(等同前往該行+^)

切換文章頂端/底部

可以使用gg回到文字頂端,G回到文字底部

tip
  • gg回到文字頂端,G回到文字底端

切換下(上)一段落(paragraph)

}跳到下一個段落(利用空白行來區分段落),{回到上一個段落。

tip
  • }跳到下一個段落,{回到上一個段落

切換下(上)文字(word)

使用w可以前往下一個Word,b前往上一個Word

但是使用小寫時,如果像是Andy’s或是有等等含標點符號時,就會沒辦法跳到下一個字

這時候可以使用大寫W,忽略標點符號並跳到下個Word,大寫B跳到前一個Word

另外還有一個比較少使用的,可以使用e跳到字尾(如果已在該字字尾會跳到下一個文字字尾),E忽略標點跳到字尾。

tip
  • w前往下一個Word、W忽略標點前往下一個Word
  • b前往上一個Word、B忽略標點前往上一個Word
  • e跳到字尾、E忽略標點跳到字尾

同行指定文字跳躍

如果想要在該行快速跳到下一個指定的字時,可以使用f+key,但是只能在同一行內使用

相對的可以使用F+key回到上一個指定的字

tip
  • f+key可直接跳到該行的下一個指定key
  • F+key跳到上一個指定的key

跳往行首(末)

行內可以使用0來跳到行首,跳到該行第一個文字,$跳到行末(包含空白)

tip
  • 0跳到行首(包含空白)
  • ^跳到該行第一個字
  • $跳到行末(包含空白)

調整所在行視窗位置

可以使用zz,zt,zb來調整目前所在行在整個視窗的位置,並且可以搭配設定檔來設置zt,zb的位置(會參考滾動時距離多少就會開始滾動的設定)

zz可以將目前所在行設定在畫面中間區域

zt(t代表top的意思)可以將目前所在行設定到畫面上方區域(如果下方已經沒有段落了,可能會出現~符號代表沒有資料的區域)

zb可以將目前所在行設定到畫面下方區域

tip
  • zz調整目前所在行到畫面中間
  • zt調整目前所在行到畫面上方
  • zb調整目前所在行到畫面下方

輸入

插入編輯位置

normal模式之下:

  • 可以使用a在目前位置之後插入文字,A可以在目前所在行的最後面插入文字。
  • 使用i在目前位置之前插入文字,I可以在目前所在行的最前面插入文字,
  • 使用o可以在目前所在行創造下一行,並直接進入編輯模式(大寫O可以在目前所在行的前一行創造空行並進入insert模式)
tip
  • a在所在位置後插入文字、A在目前所在行的最後插入文字
  • i在所在位置前插入文字、I在目前所在行的最前面插入文字
  • o新增下一行並插入文字、新增上一行並插入文字

vim的基本模式切換圖,圖片為高見�龍所有,如有不妥歡迎告知

vim的基本模式切換圖

刪除文字及替代文字

如果需要刪除文字,有兩種方式可以使用,一種是使用x,另一個是使用d。使用x的時候需要在normal模式之下或是visual模式之下皆可

使用d的時候則一定要在visual模式之下(就算只是要刪除一個字,也要先使用v選到該字之後再按d

如果想要刪除整行可以在該行任意位置使用dd(會整行刪除不見,而0D則是只有將內容清空,行本身還在)。可以先在visual模式之下選取之後按c來刪除並直接進入insert模式

如果想要替換文字可以在normal模式使用r,可以替換單個文字。

如果使用visual模式先選取了,再使用r,則會將所有所選的文字全部都替換成該文字(選了幾個就換幾個該文字)。

R在normal模式之下,會從目前所在位置開始連續覆蓋掉所選的文字(如果在visual模式之下會將整行先刪除,同X&D

tip
  • x刪除目前所選文字、X刪除目前所選文字之前的文字
  • d刪除所選(in visual mode)的文字、D刪除目前所在行所在位置之後的全部文字
  • c刪除所選文字並直接進入insert模式&C刪除目前位置之後全部文字並進入insert模式
  • dd可以直接刪除目前所在整行 (同樣可使用量詞eg:2dd
  • r可以替代目前文字,R進入Replace模式,替代目前位置之後所有文字直到退出Replace模式

刪除文字表格整理

指令xdD
Normal模式不可不可
Visual模式
在normal模式下功能刪除目前所在位置的文字刪除目前所在位置之前的文字NANA
在visual模式下的功能刪除目前所選文字刪除目前所在整行刪除目前所選文字刪除目前所在整行
可否搭配其他指令不可不可不可

搜尋

搜尋在vim裡面有兩組,僅需記得其中一組即可:

使用/+欲搜尋的字(or regex)可以在文件內搜尋,當使用的是/的時候,n可以跳到下一個搜尋字串,N跳到上一個搜尋字串

也可以利用*來搜尋目前所在位置的文字(測試過後發現?可以視為一個文字,但是. ,等等不可視為文字,會直接搜尋下一個文字)

如果要關閉掉目前已經設定好搜尋的字串時,可以使用:noh來關閉

tip
  • :noh取消搜尋模式
  • /+欲搜尋的字搜尋字串
  • n前往下一個字串
  • N前往上一個字串
  • * 搜尋目前所在位置字串
對照組

使用?+欲搜尋的字(or regex)可以在文件內搜尋,因為使用的是?,所以基本上會與/相反,n在使用?搜尋時會跳到上一個字串,N則會前往下一個字串,對應的快速搜尋所在位置文字的按鍵為#

  • :noh取消搜尋模式
  • ?+欲搜尋的字搜尋字串
  • n前往一個字串
  • N前往一個字串
  • # 搜尋目前所在位置字串

複製/貼上

首先要先進入visual模式,進入方式有兩種,可以一個字一個字選取的v,以及一行一行選取的V,如果使用的是選取整行的V則在上下選取時也會選取一整行visual模式選取整行gif圖示

選取整行範例

vim的基本模式切換圖,圖片為高見龍所有,如有不妥歡迎告知

vim的基本模式切換圖

在選取到文字的狀態下,可以使用y(yank)來複製,複製完之後會直接回到normal模式

接著在normal模式之下使用p來貼上剛剛複製的文字(預設是貼在目前游標的後面)。如果需要貼在目前游標之前則需使用P

需要注意這邊yank如果沒有設定,並不會與在vim編輯器以外的地方使用的ctrl+c剪貼簿內的內容共用。vim的yank會將文字儲存在暫存器中,而不是剪貼簿

yank

因為目前棄用terminal下的vim,只有使用vsc上的vim plugin

所以使用yank只能儲存在暫存器中,無法儲存到剪貼簿

使用command+c 會儲存到剪貼簿中,可以在不同應用程式中貼上(如codepen貼到vsc)

也可以使用yy來複製目前所在的行(效果同Vy

tip
  • v選取文字、V選取行
  • 在visual模式下y可以複製、在normal模式下p可以貼上
  • yy可以一次複製所在行

復原&重做

就像在word或是任何常用的軟體一樣,如果輸入錯誤或不小心誤刪某個文字,可以使用u指令(undo)來回復,ctrl+r來重做(redo)

tip
  • u復原
  • ctrl+r重做

縮排

在寫程式的時候很常會需要使用到縮排。

如果在normal模式之下可以使用>>來縮到下一階,<<回到上一階。

但是如果已經在visual模式之下,則只要輸入一次>就會縮到下一排。

相同的,在visual模式之下使用<可以退回上一階。

tip
  • normal:>>縮排、<<退回縮排。也可以搭配量詞來使用(eg:3>>)
  • visual:>縮排、<退回縮排
  • 全選之後使用=可以自動根據偵測到的程式語言來進行自動縮排
自動排版(auto format)

如果有開啟syntax的話

可以在全選(ggVG)之後使用=來自動排版(類似VS Code的alt+shift+F

這部分因為棄用terminal下的vim,所以沒有研究。都使用vsc上提供的功能了

進階visual模式

visual block

visual模式除了V整行選取(Visual Line模式)以外,還有另一種模式。可以使用ctrl+v進入visual block模式,來選取一個方塊範圍的內容(如下圖)

可以使用x或是d來刪除所選取的方塊區域:

visual block mode

利用visual block同時編輯多行

可以在行首ctrl+v進入block visual mode,接著往下選取下面幾行的行首。

接著使用I在前方插入文字。編輯完想要插入的文字(例如插入//來更改成備註)

使用esc or ctrl+[回到normal mode,就會發現每一行都插入一樣的文字了!(如下)

使用ctrl+v搭配I來在多行前方插入//