為什麼要學 vim#

在 Linux 世界中,vi 幾乎是唯一保證存在的文字編輯器。無論是最小安裝的伺服器、Docker 容器、還是嵌入式系統,vi 都在。vim(Vi IMproved)是 vi 的增強版,增加了語法高亮、多層撤銷、分割視窗等功能。

學 vim 的理由不是因為它比 VS Code 好用,而是:

  • 無處不在——遠端 SSH 到伺服器時,vim 可能是唯一的選擇
  • 許多系統工具(如 crontab -evisudogit commit)預設呼叫 vi/vim
  • 它的操作模式啟發了大量現代工具(VS Code 的 Vim 插件、瀏覽器的 Vimium 等)

三種模式的設計哲學#

vim 最獨特的設計是模式化操作。這看似反直覺,但背後有深思熟慮的邏輯——將「瀏覽/編輯/指令」三種不同性質的操作分開,讓每種模式都能用最少的按鍵完成最多的工作。

一般指令模式(Normal Mode)#

進入 vim 後的預設模式。在這個模式中,每個按鍵都是指令——移動游標、複製、刪除、搜尋、取代都在這裡完成。

這是 vim 的核心模式,也是初學者最不適應的地方:你打的字不會出現在畫面上,而是被當作指令執行。

編輯模式(Insert Mode)#

按下 iao 等鍵從一般模式切換進來。此時鍵盤輸入才會出現在檔案中,行為和一般的文字編輯器一樣。按 Esc 回到一般模式。

指令列模式(Command-line Mode)#

在一般模式下按 : 進入。用來執行檔案操作(存檔、離開)、全域搜尋取代、設定選項等。

vim 的學習曲線陡峭,但一旦掌握,編輯效率會遠超過一般編輯器。關鍵在於思維轉換:不要把 vim 當作一個有快捷鍵的記事本,而是一種操作語言——「刪除(d)到行尾($)」= d$,「複製(y)3 行(3j)」= y3j

暫存檔與救援機制#

vim 在編輯檔案時會建立一個 暫存檔(swap file),檔名通常是 .filename.swp。這個機制的作用:

  • 如果 vim 意外中斷(如 SSH 斷線),暫存檔保留了未存檔的修改
  • 下次開啟同一個檔案時,vim 會偵測到暫存檔並提供復原選項

如果你在遠端作業時 SSH 斷線,vim 的暫存檔會殘留在檔案系統中。下次開啟時 vim 會顯示警告。確認不需要恢復後,記得刪除暫存檔(或選擇 Delete it),否則每次開啟都會看到警告。

vim 的進階能力#

區塊選擇(Visual Block)#

Ctrl + v 可以進入矩形選取模式,選取一個矩形範圍的文字進行操作。這在編輯結構化的文字(如設定檔、CSV)時特別有用——可以一次對多行的同一欄位進行修改。

多檔案與多視窗#

  • 同時開啟多個檔案,在檔案間複製貼上
  • :sp:vsp 分割視窗,同時檢視多個檔案

環境設定#

~/.vimrc 是 vim 的個人設定檔,可以自訂:

  • 行號顯示、語法高亮
  • 縮排規則(tab 寬度、自動縮排)
  • 搜尋行為(即時搜尋、高亮匹配)
  • 自訂快捷鍵

不需要一開始就追求完美的 .vimrc。先掌握基本操作(移動、編輯、存檔離開、搜尋取代),在實際使用中逐步加入需要的設定。

編碼與換行符號#

編碼問題#

當檔案的編碼與終端的編碼不一致時就會出現亂碼。現代系統建議統一使用 UTF-8

DOS 與 Linux 換行符號#

  • Linux\n(LF)
  • Windows/DOS\r\n(CR+LF)

在 Linux 上執行用 Windows 編輯的 shell script 時,\r 會被當作指令的一部分,導致各種莫名其妙的錯誤。dos2unix 工具可以轉換換行符號。這是跨平台開發中極為常見的問題。