Logo
Published on

Vim 生存指南:模式與移動

Vim 系列文章

  1. Vim 生存指南:模式與移動 (本篇)
  2. Vim 編輯基礎:輸入、刪除和複製貼上
  3. Vim 選取模式:三種 Visual Mode
  4. Vim 語法系統:動詞 + 量詞 + 名詞
  5. Vim 搜尋技巧:快速定位與取代
  6. Vim 效率倍增:重複與自動化
  7. 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輸入文字iaoEsc
Visual選取文字vVCtrl+vEsc
Command執行命令:EnterEsc

關鍵觀念: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    → 往下 510k   → 往上 103l    → 往右 3

這是 Vim 的基本規則:數字 + 指令 = 重複 N 次

相對行號:讓數字移動更直覺

但問題來了:你怎麼知道目標在幾行之外?

這時候「相對行號」就派上用場了。開啟後,每一行會顯示它與當前行的距離,讓你一眼就知道要按幾次 jk

只有 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 產生