要透過 SSH 遠端管理 Linux 伺服器,編輯設定檔是每天的日常,而伺服器上幾乎一定內建、也最常見的文字編輯器就是 vi。這篇整理我當初學 vi 時記下的重點:三種操作模式的差別,以及一般模式、編輯模式、指令列命令模式各自的常用按鍵,讓你不用每次都搜尋「vi 怎麼存檔離開」。
為什麼管理 Linux 伺服器一定要會 vi?
若要使用 Linux 來管理伺服器,文書處理是很重要的,因此會需要了解如何操作 Linux 裡的文字編輯軟體 vi。呼叫 vi 的方式很簡單,在終端機輸入 `vi 檔名` 即可,例如:
```bash
vi /etc/hosts
```

vi 的三種使用模式是什麼?
因為 vi 是純鍵盤操作,又要同時支援打字與下指令,所以它把操作分成三種模式:
- 一般模式:可以使用「上下左右」按鍵移動游標,能用「刪除字元」或「刪除整行」處理檔案內容,也可以用「複製、貼上」處理文件資料。
- 編輯模式:用來編輯檔案內容。按下 `i, I, o, O, a, A, r, R` 其中一個鍵即可進入編輯模式,畫面左下方會出現 `INSERT` 或 `REPLACE` 字樣。
- 指令列命令模式:輸入 `:` 或 `/` 就會把游標移到最底下那一行,可進行儲存、搜尋等動作。

上圖左下方的 `I`(INSERT)代表現在正處於編輯模式。按 `Esc` 隨時可以退回一般模式——記住「任何時候先按 Esc 就對了」,是 vi 新手最重要的保命招。
一般模式有哪些常用按鍵?
在一般模式下可以移動游標、搜尋、刪除、複製貼上:
| 按鍵 | 說明 |
|---|---|
| `[Ctrl] + [f]` | 螢幕「向前」移動一頁 |
| `[Ctrl] + [b]` | 螢幕「向後」移動一頁 |
| `/word` | 向游標之後尋找字串 word |
| `?word` | 向游標之前尋找字串 word |
| `:n1,n2s/word1/word2/g` | 在第 n1 與 n2 行之間把 word1 取代為 word2 |
| `:1,$s/word1/word2/g` | 從第一行到最後一行把 word1 取代為 word2 |
| `:1,$s/word1/word2/gc` | 同上,但取代前顯示提示字元讓使用者確認 |
| `x` / `X` | 向後/向前刪除一個字元 |
| `dd` | 刪除游標所在的那一整列 |
| `yy` | 複製游標所在的那一行,`20yy` 則是複製 20 列 |
| `p` / `P` | 在游標下一行/上一行貼上複製的資料 |
| `u` | 復原前一個動作 |
編輯模式怎麼進入與離開?
從一般模式按下以下任一個鍵即可進入編輯模式:
- `i, I`(插入):在目前游標所在處插入輸入的文字,已存在的文字會向後退。
- `a, A`(增加):從目前游標所在的下一個字開始輸入,已存在的文字會向後退。
- `o, O`(插入新的一行):從游標所在的下一行行首開始輸入文字。
- `r, R`(取代):`r` 會取代游標所在的那一個字元;`R` 會一直取代游標所在的文字,直到按下 `Esc` 為止。
- `Esc`:退出編輯模式,回到一般模式。
指令列命令模式怎麼存檔與離開?
輸入 `:` 進入指令列命令模式,常用的存檔、離開與其他指令如下:
| 指令 | 說明 |
|---|---|
| `:w` | 將編輯的資料寫入硬碟檔案中 |
| `:q` | 離開 vi |
| `:wq` | 儲存後離開;`:wq!` 為強制儲存後離開 |
| `:e!` | 將檔案還原到最原始的狀態 |
| `ZZ` | 檔案沒有更動則不儲存離開;有更動則儲存後離開 |
| `:w [filename]` | 將編輯的資料另存成另一個檔案 |
| `:r [filename]` | 讀入另一個檔案的內容,加到游標所在行後面 |
| `:set nu` | 顯示行號;`:set nonu` 則取消行號 |
| `n1,n2 w [filename]` | 將第 n1 到 n2 行的內容儲存成 filename |
| `:! command` | 暫時離開 vi 到指令列執行 command,例如 `:! ls /home` |
指令後面加上 `!` 就代表強制執行。
延伸閱讀
常見問題
vi 跟 vim 有什麼差別?
vim 是 vi 的加強版,相容 vi 的所有操作並新增語法高亮、多重復原等功能。在多數 Linux 發行版上輸入 `vi` 實際啟動的往往就是 vim,這篇的操作按鍵兩者通用。
vi 裡怎麼搜尋並取代字串?
在指令列命令模式輸入 `:1,$s/word1/word2/g` 可以把整個檔案的 word1 取代為 word2;若把結尾改成 `gc`,每次取代前會先詢問確認,建議新手都加上 `c` 比較安全。
vi 沒有存檔想放棄編輯怎麼辦?
先按 `Esc` 回到一般模式,再輸入 `:q!` 強制離開不儲存;若想還原到檔案最初的狀態但繼續編輯,可以輸入 `:e!`。
為什麼我在 vi 裡打字出現亂碼或一直在跳?
那表示你停留在一般模式,按下的英文字母被當成指令執行了。先按 `Esc` 確認回到一般模式,再按 `i` 進入編輯模式即可正常打字。
vi 怎麼顯示行號?
在指令列命令模式輸入 `:set nu` 即可顯示行號,輸入 `:set nonu` 則取消。顯示行號對照錯誤訊息修改設定檔時特別有用。
參考資料
最後更新
2026-08-28(原文發布於 2019-09-20,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2019-09-20
