Vim

2024-10-10

最近因為在學 K8s,常常會需要有編輯 pod 之類的情境,所以會需要使用到 vim,但我跟 vim 其實很不熟,所以趁這次學 K8s 順便把 vim 也一起學一學。

基本指令

  • 移動 cursor: h 往左,j 往下,k 往上,l 往右。
  • 退出 vim
    • :q!: 強制退出,不儲存修改
    • :wq: 儲存修改並且退出
  • i: 進入編輯模式

刪除指令

  • dw: 從 cursor 目前位置刪除到單字的尾巴,包括空格
  • de: 同上,但不包括空格
  • d$: 從 cursor 目前位置刪除到行尾
  • dd: 刪除一整行
  • x : 刪除一個字元
  • u : undo
  • U : 將該行恢復到最初的狀態
  • CTRL+R: redo

一個指令的格式是 [number] command object,或是 command [number] object

  • number: 指令執行的次數
  • command: 指令,例如 d 代表刪除
  • object: 操作對象,例如 w 代表單字,$ 代表行尾。

所以我們如果要刪除 5 行的話,可以輸入 5dd

當我們使用刪除指令後,刪除的內容會被存進 vim 的 buffer,這時候可以使用 p 來貼上被刪除的內容。

替換指令

輸入 r 之後再輸入任意字元,可以把 cursor 指到的字元替換成輸入的字元。

輸入 R 則可以連續替換字元,直到按下 ESC。

更改指令

輸入 cw 會把 cursor 指到的字元刪除,並且進入編輯模式。c$ 則是把 cursor 後的所有內容刪除,並且進入編輯模式,當我們想改掉整行的時候可以使用。

定位指令

  • CTRL+G: 顯示當前行數
  • SHIFT+G: 移動到文件最後一行
  • 100 SHIFT+G: 移動到第 100 行

搜尋指令

輸入 / 並且加上想要搜尋的字後按下 enter ,就會定位到目標位置,例如我現在要搜尋 hello,就需要輸入 /hello 然後按下 enter。接著可以按下 n 去尋找下一個, SHIFT+N 尋找上一個。

:set ic 會忽略大小寫(ic = Ignore case)。

:set hsl 會 highlight 搜尋到的字詞。

:set ic 會在輸入搜尋單詞的同時定位到單詞的位置。

/ 會找第一個,要從最後一個開始找的話,可以使用 ?,這時候 nSHIFT+N 代表的意義也會反過來。

搜尋配對的括號

如果要找出對應的括號,可以按下 %,這時候會跳到對應的括號所在地,例如當我在 ( 按下 %,就會跳到對應的 )

修正錯誤

輸入 :s/old/new 可以把 cursor 指到行數的第一個 "old" 單詞換成 "new",如果要整行都換掉的話可以輸入 :s/old/new/g,這樣該行所有的 "old" 都會被換成 "new"。

如果要替換指定行數之間的詞,可以輸入 :10,20s/old/new/g,這樣會把第 10 行到第 20 行之間的所有 "old" 都替換成 "new"。

如果是要替換整個文件的詞,可以輸入 :%s/old/new/g這樣整個文件的 "old" 都會被替換成 "new"。如果在替換過程中詢問是否確認要替換的話可以輸入 :%s/old/new/gc,這樣要替換每個單詞時,都會詢問是否確認要替換。

執行外部指令

輸入 :! 加上對應的指令可以切換到 terminal 的畫面並且執行指令,例如 :!ls 會列出檔案和資料夾。

儲存指令

輸入 :w FILENAME 可以將文件內容寫到指定的檔案中,例如 :w text.txt 會將文件內容寫到 text.txt 中。

輸入 :#,# w FILENAME 則可以將指定行數的內容寫到指定的檔案中,例如 :100,120 w text.txt 會將第 100 至 120 行的內容寫到 text.txt 中。

插入及合併

輸入 :r FILENAME 可以將指定檔案的內容寫到當前游標指到的位置,例如 :r text.txt 就是把 text.txt 的內容寫到當前游標的位置。

  • o: 插入新一行至該行下面,並且進入編輯模式
  • O: 插入新一行至該行上面,並且進入編輯模式
  • a: 在游標之後進入編輯模式
  • A: 在行尾進入編輯模式。這個指令在要插入字元到行尾的時候很有用,當我們使用 $ 移動到行尾,並且用 i 進入編輯模式時,游標會在最後一個字元上,這時候輸入的字元會被插在最後一個字元之前。如果這時候我們使用 A 的話,就可以直接在字元之後進行編輯。

複製貼上

  • yy: 複製該行
  • yw: 複製單詞,只會複製游標後的字詞,假設有一單字 "hello",而游標在 "e" 的話,會複製 "ello"
  • yiw: 複製整個單詞,不管游標在單詞的哪個位置
  • yaw: 同上,但也會複製單詞前或後的空格
  • p: 貼上

縮排

  • >>: 向右縮排
  • <<: 向左縮排

要更改縮排的大小可以輸入 :set shiftwidth=2

總結

有興趣想要玩 vim 的話,可以在 terminal 輸入 vimtutor 進入教學,裡面教到的指令都滿常用的。