- Published on
Vim 生存指南:模式與移動

Vim 系列文章
- Vim 生存指南:模式與移動 (本篇)
- Vim 編輯基礎:輸入、刪除和複製貼上
- Vim 選取模式:三種 Visual Mode
- Vim 語法系統:動詞 + 量詞 + 名詞
- Vim 搜尋技巧:快速定位與取代
- Vim 效率倍增:重複與自動化
- Vim 客製化:設定與 IDE 整合
你是否曾經不小心進入 Vim,然後完全不知道怎麼離開?這篇文章會讓你不只能「輕鬆離開」Vim,還能開始用它工作
為什麼要學 Vim?
在 2026 年,我們有那麼多現代化的編輯器,為什麼還要學一個 1991 年的工具?
- SSH 進伺服器、設定 crontab… Vim 就在那裡等你
- 滑鼠是效率殺手,Vim 讓你的手永遠停在打字區
- 學會幾十個指令,就能組合出各種操作
更重要的是,主流 IDE 都有 Vim 外掛(IdeaVim、VSCode Vim),你可以享受 IDE 的功能 + Vim 的編輯效率
Vim 的核心概念:模式
Vim 是一個「模態編輯器」(Modal Editor)。這是它與其他編輯器最大的不同
什麼是模式?
想像你有一個遙控器,按下「1」會怎樣?
- 在「選台模式」:切換到第 1 台
- 在「音量模式」:設定音量為 1
Vim 的邏輯也是這樣。按下 d 會怎樣?
- 在 Normal Mode:等待刪除指令
- 在 Insert Mode:輸入字母 d
四種主要模式
| 模式 | 用途 | 進入方式 | 離開方式 |
|---|---|---|---|
| Normal | 移動、刪除、複製 | 預設模式 | - |
| Insert | 輸入文字 | i、a、o 等 | Esc |
| Visual | 選取文字 | v、V、Ctrl+v | Esc |
| Command | 執行命令 | : | Enter 或 Esc |
關鍵觀念:Normal Mode 是「預設狀態」。在 Vim 中,你大部分時間應該待在 Normal Mode,只有需要打字時才進入 Insert Mode
生存必備:開啟、存檔、離開
開啟檔案
vim filename.txt # 開啟檔案
vim . # 開啟目錄(需要 netrw)
存檔與離開
這是最重要的指令,記住這個
:wq → 存檔並離開(最常用)
以下是完整的存檔與離開指令
| 指令 | 動作 | 記憶方式 |
|---|---|---|
:w | 存檔(Write) | write |
:q | 離開(Quit) | quit |
:wq | 存檔並離開 | write + quit |
:q! | 不存檔強制離開 | quit + 強制 |
:x | 有修改才存檔並離開 | exit |
ZZ | 存檔並離開(Normal Mode) | |
ZQ | 不存檔離開(Normal Mode) |
卡住了怎麼辦?
如果你不知道自己在什麼模式,或是畫面很奇怪
按 Esc → 按 Esc → 再按 Esc
多按幾次 Esc 通常就能回到 Normal Mode
基本移動:丟掉你的滑鼠
h / j / k / l:方向鍵的替代
k
↑
h ← → l
↓
j
| 按鍵 | 方向 | 記憶方式 |
|---|---|---|
h | ← 左 | 最左邊的按鍵 |
j | ↓ 下 | j 像一個往下的鉤子 |
k | ↑ 上 | k 像一個往上的箭頭 |
l | → 右 | 最右邊的按鍵 |
為什麼不用方向鍵?
方向鍵離打字區太遠,每次移動手都要離開 Home Row
數字 + 移動:一次走多步
5j → 往下 5 行
10k → 往上 10 行
3l → 往右 3 格
這是 Vim 的基本規則:數字 + 指令 = 重複 N 次
相對行號:讓數字移動更直覺
但問題來了:你怎麼知道目標在幾行之外?
這時候「相對行號」就派上用場了。開啟後,每一行會顯示它與當前行的距離,讓你一眼就知道要按幾次 j 或 k
只有 relativenumber
3 function foo() {
2 const x = 1
1 const y = 2
0 return x + y ← 游標所在行顯示 0
1 }
2
3 function bar() {
同時開啟 number + relativenumber(推薦)
3 function foo() {
2 const x = 1
1 const y = 2
4 return x + y ← 游標所在行顯示絕對行號(第 4 行)
1 }
2
3 function bar() {
兩者的差別在於游標所在行:只有 relativenumber 會顯示 0,而同時開啟 number 則會顯示實際的行號。後者在除錯時特別有用,因為錯誤訊息通常會告訴你「第幾行出錯」
想跳到 function foo() 那行?看一眼就知道:3k
開啟相對行號
:set relativenumber " 開啟相對行號
:set number " 同時顯示當前行的絕對行號
後續文章會介紹如何在
.vimrc中永久設定
檔案頭尾
| 按鍵 | 動作 |
|---|---|
gg | 跳到檔案開頭 |
G | 跳到檔案結尾 |
50G 或 :50 | 跳到第 50 行 |
Word 移動:比 h / l 快多了
一個一個字元移動太慢了。在 Vim 中,我們可以用 word 為單位移動
w / b / e
| 按鍵 | 動作 | 說明 |
|---|---|---|
w | 下一個 word 開頭 | word |
b | 上一個 word 開頭 | back |
e | 當前 word 結尾 | end |
w 的移動軌跡
在 hello-world foo_bar 這個字串中按 w
hello-world foo_bar
^ ← 起點
hello-world foo_bar
^ ← 第 1 次 w:停在 "-"
hello-world foo_bar
^ ← 第 2 次 w:停在 "world"
hello-world foo_bar
^ ← 第 3 次 w:停在 "foo_bar"
(下一行)
^ ← 第 4 次 w:跳到下一行
注意:w 會在標點符號處停下!hello-world 被視為 3 個 word。如果該行沒有下一個 word,w 會跳到下一行的開頭
b 的移動軌跡
在 hello-world foo_bar 這個字串中按 b(從最後一個字元開始)
hello-world foo_bar
^ ← 起點(r)
hello-world foo_bar
^ ← 第 1 次 b:停在 "foo_bar" 開頭
hello-world foo_bar
^ ← 第 2 次 b:停在 "world"
hello-world foo_bar
^ ← 第 3 次 b:停在 "-"
hello-world foo_bar
^ ← 第 4 次 b:停在 "hello"
e 的移動軌跡
在 hello-world foo_bar 這個字串中按 e
hello-world foo_bar
^ ← 起點
hello-world foo_bar
^ ← 第 1 次 e:停在 "hello" 結尾
hello-world foo_bar
^ ← 第 2 次 e:停在 "-" 結尾
hello-world foo_bar
^ ← 第 3 次 e:停在 "world" 結尾
hello-world foo_bar
^ ← 第 4 次 e:停在 "foo_bar" 結尾
什麼是 word 字元?
Vim 把以下字元視為 word 字元:
- 字母(a-z、A-Z)
- 數字(0-9)
- 底線(
_)
其他符號(如 -、.、/)都會被視為分隔符號
所以:
hello-world= 3 個 word(hello、-、world)foo_bar= 1 個 word(底線是 word 字元)file.txt= 3 個 word(file、.、txt)
w vs W:小寫 vs 大寫
| 指令 | word 的定義 | 範例 |
|---|---|---|
w | 以非 word 字元分隔 | hello-world = 3 個 word |
W | 以空白分隔 | hello-world = 1 個 WORD |
想跳過整個 hello-world,用 W 會快很多
行內移動
| 按鍵 | 動作 | 備註 |
|---|---|---|
0 | 移到行首(第 0 格) | 包含空格 |
^ | 移到第一個非空白字元 | 跳過縮排 |
$ | 移到行尾 |
動畫展示:0 vs ^
在 indented line(前面有 4 個空格)
indented line
^ ← 0:移到第 0 格
^ ← ^:移到第一個非空白字元
寫程式時,^ 通常比 0 更實用,因為我們通常不關心縮排空格
其他實用移動
段落跳轉
| 按鍵 | 動作 |
|---|---|
{ | 跳到上一個段落 |
} | 跳到下一個段落 |
段落的定義是以空行分隔的區塊。在程式碼中,這可以用來快速跳過函數或區塊
配對符號跳轉
% → 跳到配對的括號
游標在 ( 上按 %,會跳到對應的 )。支援 ()、[]、{}
if (condition && (nested || value))
^
按 % 會跳到最後一個 )
畫面位置調整
有時候游標位置沒問題,但想調整畫面讓游標更好閱讀
| 按鍵 | 動作 |
|---|---|
zz | 把游標所在行移到畫面中央 |
zt | 把游標所在行移到畫面頂部 |
zb | 把游標所在行移到畫面底部 |
這些指令不會移動游標,只會捲動畫面
常見問題
Q:為什麼我按 j 會輸入 j,不會往下移動?
A:你在 Insert Mode。按 Esc 回到 Normal Mode
Q:我按了什麼,畫面變得很奇怪?
A:按 Esc 三次,然後輸入 :q! 不存檔離開,重新開始
Q:如何知道自己在什麼模式?
A:看左下角(或是右下角)。如果顯示 -- INSERT --,你在 Insert Mode;什麼都沒顯示,你在 Normal Mode
圖片來源:AI 產生