vi是誰?揭密經典文字編輯器的前世今生與高效操作秘訣
您是不是也曾好奇過,那個在Linux終端機裡,彷彿無所不能又讓人摸不著頭緒的「vi」到底是什麼來頭?每次遠端連線到伺服器,或是在一個全新、精簡的Linux環境下,總會看到它的身影,但卻又對它那神秘的操作方式感到卻步。別擔心,今天我們就來好好聊聊這個傳奇性的文字編輯器「vi」,揭開它究竟是誰,為何它能在技術圈中屹立不搖,以及它所蘊含的獨特魅力和高效操作哲學。
快速回答:vi是誰?
vi 是一個輕量級、功能強大且高度普及的模態(Modal)文字編輯器,由 Bill Joy 於 1970 年代末期為 Unix 系統開發,是許多現代文字編輯器(特別是 Vim)的始祖。它在幾乎所有類 Unix 系統上都是預設安裝的編輯器,因此在系統管理、伺服器維護和腳本撰寫等無GUI(圖形使用者介面)的環境下,vi 幾乎是每個工程師的必備技能。它的核心概念是透過「模式切換」來執行不同的操作,讓使用者能以極高的效率,僅透過鍵盤就能完成複雜的文字編輯任務。
Table of Contents
vi 是什麼?它不只是一個文字編輯器,更是一種哲學!
說真的,第一次接觸 vi 的人,多半會覺得它「反人類」,甚至有點「難搞」。因為它不是像我們習慣的記事本或 Word 那樣,一點開就能直接打字。它有自己的「規矩」,有不同的「模式」,這正是 vi 最獨特,也是最讓它高效的「模態編輯」設計。
vi 這個名字,其實是 “visual editor” 的縮寫,誕生於 Bill Joy 在加州大學柏克萊分校攻讀博士學位期間。當時,他需要一個比現有行編輯器(如 `ed` 或 `ex`)更好用的全螢幕編輯器。於是,基於 `ex` 編輯器,他開發了 `vi`,讓使用者可以「視覺化」地看到他們正在編輯的文字,而不是一行一行地操作。這個設計在當時是相當革命性的,大大提升了文字編輯的效率和體驗。vi 隨後被納入 BSD Unix 發行版中,隨著 Unix 的普及,vi 也因此廣為人知,成為了許多系統管理員、程式開發者的標準工具。
vi 不僅僅是一個工具,對於許多資深使用者來說,它更代表一種高效工作流的哲學。它鼓勵你用鍵盤來完成所有事情,減少滑鼠操作的干擾,讓你的雙手始終保持在鍵盤中央,從而達到極致的編輯速度。這種「手不離鍵盤」的哲學,讓 vi 在處理大量文字、程式碼時展現出無與倫比的效率。
深入核心:vi 的主要操作模式
要理解 vi,就必須先搞懂它的核心概念:模式(Mode)。vi 至少有四種主要模式,每一種模式都有其特定的功能和操作邏輯。模式之間的切換是 vi 操作的關鍵。
一般模式 (Normal Mode / Command Mode)
這是你打開 vi 時的預設模式,也是 vi 的「心臟」。在一般模式下,你不能直接輸入文字,而是輸入各種「指令」來對文字進行操作,比如移動游標、刪除、複製、貼上、搜尋等等。所有模式的切換,幾乎都是透過一般模式作為「中轉站」。
想像一下,你手上握著一把瑞士刀,在一般模式下,你選擇要用哪個工具(哪個指令),而不是直接用手去觸碰物件。當你準備好進行文字編輯時,你才會切換到插入模式。
插入模式 (Insert Mode)
顧名思義,這個模式就是用來「插入」或輸入文字的。當你從一般模式進入插入模式後,vi 就會像一般的文字編輯器一樣,你輸入的內容會直接顯示在螢幕上。要從插入模式回到一般模式,只需按下鍵盤上的 Esc
鍵即可。
指令行模式 (Command-line Mode / Ex Mode)
這個模式通常用於執行比較複雜或影響整個檔案的操作,比如存檔、退出、搜尋替換、執行外部指令等。要進入指令行模式,你需要先在一般模式下輸入冒號 :
,然後在螢幕底部會出現一個冒號,你可以在那裡輸入指令並按下 Enter
執行。
視覺模式 (Visual Mode)
視覺模式讓你可以像用滑鼠一樣,透過鍵盤來「選取」文字區塊。這對於複製、刪除或修改特定範圍的文字非常有用。在一般模式下按下 v
(字元選取)、V
(行選取)或 Ctrl+v
(區塊選取)即可進入視覺模式。選取後,你可以再輸入其他指令來操作這些被選取的文字。
vi 指令操作實戰:從菜鳥到高手的必經之路
是不是覺得有點多?沒關係,這正是 vi 的迷人之處。一開始會有點手足無措,但一旦你掌握了這些基本指令,你會發現 vi 的世界超乎想像的寬廣,而且效率超高!我記得剛開始接觸 vi 的時候,也是一頭霧水,常常不知道怎麼存檔和退出,鬧出不少笑話,哈哈。但透過每天一點點的練習,你會慢慢愛上它。
檔案的基本操作:開啟、存檔、退出
這是你學習 vi 的第一課,也是最重要的課!別笑,很多人卡在這邊出不去呀!
- 開啟檔案: 在終端機輸入
vi 檔案名稱
,例如:vi my_document.txt
。如果檔案不存在,vi 會建立一個新檔案。 - 存檔並退出:
- 先按
Esc
鍵確保回到一般模式。 - 輸入
:wq
然後按Enter
。w
代表 write (寫入/存檔),q
代表 quit (退出)。 - 或者,更簡潔的
:x
也能達到同樣效果(僅在檔案有修改時才存檔)。
- 先按
- 不存檔退出:
- 先按
Esc
鍵回到一般模式。 - 輸入
:q!
然後按Enter
。!
代表強制執行,即使檔案有修改也不存檔。這是你「搞砸了」想重來時的救星!
- 先按
- 只存檔不退出:
- 先按
Esc
鍵回到一般模式。 - 輸入
:w
然後按Enter
。
- 先按
文字的移動與導航
在 vi 裡,游標移動可不是靠方向鍵那麼簡單(雖然方向鍵通常也有效,但高手都用 h j k l
啦!)
一般模式下的基本移動指令
指令 | 功能說明 |
---|---|
h |
游標向左移動一字元 |
j |
游標向下移動一行 |
k |
游標向上移動一行 |
l |
游標向右移動一字元 |
w |
移動到下一個單字(word)的開頭 |
b |
移動到上一個單字的開頭 |
e |
移動到下一個單字的結尾 |
0 (數字零) |
移動到目前行的行首(第一個字元) |
^ |
移動到目前行的第一個非空白字元 |
$ |
移動到目前行的行尾 |
gg |
移動到檔案的第一行 |
G |
移動到檔案的最後一行 |
數字G |
移動到指定的行數,例如 10G 會移動到第 10 行 |
Ctrl+f |
向前(下)滾動一頁 |
Ctrl+b |
向後(上)滾動一頁 |
高效編輯:刪除、複製、貼上
這些指令可是 vi 高效的精髓啊!學會了它們,你就能在檔案裡飛快地操作文字了。
一般模式下的編輯指令
指令 | 功能說明 |
---|---|
x |
刪除游標所在位置的單一個字元 |
dw |
刪除游標到下一個單字開頭的文字 |
dd |
刪除游標所在的一整行 |
dG |
刪除游標所在行到檔案結尾的所有內容 |
yy |
複製游標所在的一整行(”yank”) |
yw |
複製游標到下一個單字開頭的文字 |
p |
在游標之後貼上複製或刪除的內容 |
P |
在游標之前貼上複製或刪除的內容 |
i |
在游標當前位置進入插入模式 |
a |
在游標之後進入插入模式 |
I |
在行首(第一個非空白字元)進入插入模式 |
A |
在行尾進入插入模式 |
o |
在游標下方插入新的一行,並進入插入模式 |
O |
在游標上方插入新的一行,並進入插入模式 |
搜尋與替換的藝術
在 vi 裡搜尋和替換可不是簡單的 Ctrl+F 喔,指令行模式的搜尋替換功能超強大,特別是在處理程式碼或設定檔時,簡直是神隊友!
- 搜尋:
- 在一般模式下輸入
/
,然後輸入你要搜尋的關鍵字,按Enter
。例如:/hello
。 - 要搜尋下一個匹配項,按
n
。 - 要搜尋上一個匹配項,按
N
。 - 如果你想從游標位置往上搜尋,可以輸入
?
然後輸入關鍵字,例如:?world
。
- 在一般模式下輸入
- 替換:
- 這是指令行模式的強大功能。基本語法是
:[範圍]s/舊字串/新字串/[旗標]
。 - 單行替換: 將游標所在行的第一個 “old” 替換為 “new”。
:s/old/new/
- 單行所有替換: 將游標所在行的所有 “old” 替換為 “new”。
:s/old/new/g
(g 代表 global,全域替換) - 全檔案替換: 將整個檔案中所有 “old” 替換為 “new”。
:%s/old/new/g
- 全檔案替換並確認: 每次替換前會詢問你是否確認。
:%s/old/new/gc
(c 代表 confirm,確認)
- 這是指令行模式的強大功能。基本語法是
撤銷與重做
編輯嘛,哪有不出錯的?別怕,vi 也有「後悔藥」!
- 撤銷(Undo): 在一般模式下,按下
u
鍵。它可以撤銷上一次操作。多按幾次u
可以回溯更多次操作。 - 重做(Redo): 在一般模式下,按下
Ctrl+r
。
為什麼 vi 至今仍是許多高手的首選?
說真的,既然有這麼多功能強大、介面友善的文字編輯器,為什麼 vi 還能歷久彌新,成為許多工程師、系統管理員不可或缺的工具呢?這裡頭可藏著它獨特的優勢呢!
無處不在的普遍性
這是 vi 最最核心的優勢,也是它之所以無法被取代的重要原因。幾乎所有的類 Unix 系統(包括 Linux、macOS 的終端機、路由器、嵌入式設備等等),都預設安裝了 vi 或其相容版本(如 Vim)。想像一下,當你遠端連線到一台沒有圖形介面的伺服器,或是在一個資源極度有限的裝置上,你根本沒辦法安裝 Visual Studio Code 或 Sublime Text。這時候,vi 就是你唯一的選擇,也是你的救星!作為一個系統工程師,你肯定會碰到這種情況,所以會用 vi 是基本中的基本。
極致的效率與速度
vi 的設計理念是讓使用者「手不離鍵盤」。所有的操作都透過鍵盤指令來完成,沒有滑鼠的干擾。當你熟練這些指令後,你可以像演奏鋼琴一樣,流暢地在文字間移動、刪除、複製、貼上,速度快到飛起!尤其在處理大量程式碼或設定檔時,這種效率簡直是無與倫比。你會發現,你的思路不會被滑鼠移動和點擊的動作打斷,編輯過程更加連貫。
資源佔用極低
vi 是個非常輕量級的編輯器。它不需要大量的記憶體和 CPU 資源,這使得它在舊電腦、資源受限的伺服器、嵌入式系統等環境下表現出色。對於系統管理員來說,這意味著他們可以在不給伺服器增加額外負擔的情況下,快速地修改設定檔。
高度可擴展與客製化(主要指 Vim,但 vi 也受益)
雖然 vi 本身功能已經很強大,但其後繼者 Vim 更是在此基礎上發揚光大,提供了極致的客製化能力和豐富的外掛生態系。你可以透過修改 `~/.vimrc` 設定檔,來調整快捷鍵、配色、行為,甚至載入各種外掛來擴展功能,將 Vim 打造成一個超級開發環境。雖然這是 Vim 的特點,但其哲學思想與 vi 一脈相承,也讓 vi 的使用者能夠從中受益。
學習曲線的價值
沒錯,vi 的學習曲線確實比較陡峭,剛開始會讓人感到挫敗。但就像學騎腳踏車一樣,一旦你掌握了平衡,那種自由自在的感覺是無可取代的。學會 vi 不僅僅是掌握了一套工具,更重要的是,它會訓練你「思考」編輯的過程,讓你對文字操作的理解更上一層樓。這種思維模式的轉變,會讓你對任何文字編輯器都更有掌握力。
vi 的學習策略與常見誤區
要征服 vi 這座大山,你需要一些智慧和耐心。
學習策略
- 從基礎模式開始: 專注於理解一般模式、插入模式和指令行模式的切換,以及最基本的存檔、退出、移動、刪除、插入指令。不要一開始就想學所有東西。
- 每天練習一點: 每天強迫自己用 vi 完成一些小任務,比如修改一個設定檔、寫一個小筆記。熟能生巧,肌肉記憶很重要。
- 使用
vimtutor
: 如果你的系統安裝了 Vim,那麼直接在終端機輸入vimtutor
。這是一個互動式的教學程式,它會一步一步地引導你學習 vi/Vim 的基本操作,超級有用!我超推薦這個! - 「沉浸式」學習: 嘗試一整天只用 vi 編輯文件,你會發現效率逼著你進步。當然,如果你是新手,這可能有點折磨,但效果絕對顯著。
常見誤區
- 把它當作普通編輯器: vi 不是記事本,不要試圖用滑鼠或只用方向鍵操作。它的威力在於指令組合。
- 過於依賴滑鼠: vi 的核心就是鍵盤操作,請盡量減少對滑鼠的依賴。
- 一開始就想記住所有指令: 這是最容易放棄的原因。先記住最常用的幾個,然後逐步擴展。
- 遇到困難就放棄: 堅持住!「vi 卡住了怎麼辦?」這是每個 vi 初學者都會問的問題。多按幾次
Esc
,然後嘗試:q!
退出。
常見問題深入解析
Q1: vi 和 Vim 有什麼關係?哪個比較好用?
這是一個非常常見的問題,也是許多新手容易混淆的地方。簡單來說,vi 是「原版」,而 Vim 則是 vi 的「加強版」或「超集」。
vi(Visual Editor)是 Bill Joy 在 1970 年代末為 Unix 系統開發的。它的目標是提供一個全螢幕、視覺化的文字編輯體驗,相較於當時主流的行編輯器(如 `ed` 或 `ex`)來說,是一大進步。vi 奠定了模態編輯、強大指令集等核心概念。
Vim(Vi IMproved)則是由 Bram Moolenaar 在 1990 年代初開發,它是在 vi 的基礎上進行了大量的改進和擴展。Vim 不僅完整保留了 vi 的所有功能和指令,還增加了許多現代化的特性,例如:
- 多級撤銷/重做: vi 只能撤銷一次,Vim 可以無限次撤銷。
- 語法高亮: 讓程式碼更容易閱讀。
- 分割視窗: 可以同時編輯多個檔案或同一個檔案的不同部分。
- 插件系統: 這是 Vim 最強大的功能之一,可以透過安裝各種插件來擴展編輯器功能,使其成為一個功能豐富的 IDE(整合開發環境)。
- 圖形介面版本: 例如 gVim,提供了滑鼠支援和選單,雖然違背了 vi 的純鍵盤哲學,但在某些情況下更方便。
所以,要說哪個比較好用?對於絕大多數現代使用者來說,Vim 無疑是更好的選擇。因為它擁有 vi 的所有優點,同時又提供了更多現代化、便利的功能。當我們今天提到「vi」時,很多時候指的其實是 Vim,因為在大多數 Linux 發行版中,`vi` 這個指令實際上連結到的是 Vim 的精簡版本(或完整版本)。學習 Vim,就等於掌握了 vi。
Q2: vi 的學習曲線是不是真的那麼高?值得學嗎?
是的,vi 的學習曲線確實是出了名的高。一開始,你可能會覺得它很反直覺,甚至感到挫敗。我記得許多朋友在嘗試後,都表示「我不知道怎麼輸入文字」、「我不知道怎麼存檔退出」,然後就放棄了。這很正常,因為 vi 的操作邏輯與我們習慣的所見即所得編輯器完全不同。它要求你先理解「模式」,並將操作分解成一系列的指令組合。
但是,它絕對值得學習! 為什麼呢?
- 通用性與必要性: 如前所述,vi 在幾乎所有類 Unix 系統上都是預設安裝的。如果你從事系統管理、DevOps、後端開發、嵌入式系統開發等工作,你幾乎一定會遇到需要在沒有圖形介面的環境下編輯檔案的情況。那時候,vi 就是你唯一的救星。它是一項生存技能!
- 極致效率: 一旦你掌握了 vi 的操作,你會發現其鍵盤驅動的效率是其他編輯器難以比擬的。你的手無需離開鍵盤,編輯流程極其流暢。這對於大量文字處理、程式碼修改,特別是重複性高的操作來說,能顯著提升工作效率。
- 思維模式的訓練: 學習 vi 不僅僅是學習指令,更是在訓練一種高效的、結構化的思考方式。你會學會如何用最少的按鍵完成最複雜的操作,這對你的邏輯思維能力也有所助益。
- 社群與生態: Vim 作為 vi 的繼承者,擁有龐大而活躍的社群,有大量的教學資源、插件和設定範例。這意味著你在學習和使用過程中,總能找到幫助。
所以,如果你的工作或學習涉及 Linux 伺服器、遠端開發、或者你只是想提升自己的編輯效率,那麼花時間學習 vi(或 Vim)絕對是一筆划算的投資,它的回報率超高的!
Q3: vi 怎麼存檔和退出?我卡住了怎麼辦?
這是 vi 新手最常遇到的問題,也是讓很多人「勸退」的關卡,哈哈。別擔心,這幾個指令是你的救命稻草!
1. 怎麼存檔和退出?
請記住,所有存檔、退出、搜尋、替換等指令,都必須在指令行模式(Command-line Mode / Ex Mode)下輸入。要進入這個模式,你必須先確保自己處於一般模式(Normal Mode),然後按下冒號 :
。
- 存檔並退出:
Esc
(回到一般模式):wq
+Enter
(write and quit)或者更簡潔地:
Esc
(回到一般模式):x
+Enter
(僅在檔案有修改時存檔並退出) - 不存檔退出(強制退出):
Esc
(回到一般模式):q!
+Enter
(quit without saving, forced)這個指令在你修改了檔案但不想保存這些修改時非常有用,特別是你搞砸了,想回到最初的狀態時。
- 只存檔不退出:
Esc
(回到一般模式):w
+Enter
(write)
2. 我卡住了怎麼辦?螢幕上什麼都沒有,或是一直亂跳字!
當你覺得 vi「卡住」了,或者不確定現在處於哪個模式時,最保險的做法就是:
- 連續多按幾次
Esc
鍵: 這是黃金法則!多按幾次 `Esc` 會把你帶回一般模式,這是所有操作的起點。如果你在插入模式,它會讓你退出;如果你在視覺模式,它也會讓你退出。 - 檢查螢幕左下角: 觀察螢幕左下角。如果沒有任何輸入提示(例如 `-INSERT-` 或 `:’<,'>`),那麼你很可能已經在一般模式了。如果看到一個冒號 `:`,說明你處於指令行模式。
- 嘗試強制退出: 如果你完全不知道自己在哪裡,只想趕快離開這個檔案,就用這個指令:
Esc
(連續多按幾次):q!
+Enter
這個組合會強制 vi 不存檔地退出,讓你可以重新來過。放心,它不會破壞你的檔案,只是不保存你這次會話中的修改而已。
記住這幾個小技巧,下次你就不會再被 vi 卡住了!
Q4: 除了 vi,還有哪些文字編輯器?它們有什麼不同?
當然,vi 並不是唯一的選擇,特別是在有圖形介面的現代電腦上,使用者有非常多功能強大且介面友善的文字編輯器。它們各有特色,針對不同的使用情境和偏好。
以下是一些常見的文字編輯器及其與 vi 的主要區別:
- Nano:
- 特點: Nano 是一個非常簡單易用的終端機文字編輯器。它的介面下方會顯示常用的快捷鍵指令,對於新手來說非常友好,學習曲線幾乎為零。
- 與 vi 的不同: Nano 是非模態的,你可以直接輸入文字,操作方式更接近我們熟悉的記事本。它功能相對簡單,沒有 vi/Vim 那麼多進階的編輯指令和客製化能力。Nano 通常是許多 Linux 發行版中,除了 vi 之外,另一個預設安裝的編輯器。
- 適用情境: 快速修改設定檔、寫短筆記、初學者使用。
- Emacs:
- 特點: Emacs 是另一個歷史悠久、功能極其強大且高度可擴展的文字編輯器,被譽為「帶有作業系統功能的編輯器」。它透過 Lisp 語言進行客製化,可以實現幾乎任何功能,從寫程式、發郵件、瀏覽網頁到玩遊戲。
- 與 vi 的不同: Emacs 也是模態的,但它的模式概念與 vi 不同。Emacs 主要是透過大量的「組合鍵」(通常是 Ctrl 或 Alt 加上其他鍵)來執行指令,而不是像 vi 那樣區分編輯模式和指令模式。Emacs 的學習曲線同樣陡峭,甚至有人說比 vi 還高。兩者在技術圈中各有忠實粉絲,形成「編輯器大戰」。
- 適用情境: 程式開發、需要高度客製化和整合能力的重度使用者。
- Visual Studio Code (VS Code):
- 特點: VS Code 是由 Microsoft 開發的免費開源程式碼編輯器,廣受全球開發者歡迎。它擁有現代化的圖形使用者介面,支援豐富的語言、偵錯、版本控制(Git)整合,以及龐大的擴展(Extension)生態系統。
- 與 vi 的不同: VS Code 是圖形介面編輯器,支援滑鼠操作,是非模態的。它的設計更注重開發者體驗和整合度,提供了一整套開發所需的工具。VS Code 需要圖形介面才能運行,不能在純終端機環境下使用。
- 適用情境: 絕大多數現代程式開發、網頁開發、資料科學等。
- Sublime Text:
- 特點: Sublime Text 是一款輕量級、快速且功能強大的付費程式碼編輯器(提供無限期試用)。它以其「閃電般的速度」和優秀的文字選取、多行編輯等功能著稱,也有豐富的插件社群。
- 與 vi 的不同: 與 VS Code 類似,Sublime Text 也是圖形介面編輯器,是非模態的,主要透過鍵盤快捷鍵和滑鼠操作。它比 VS Code 更輕量,啟動速度更快。
- 適用情境: 程式開發、需要快速啟動和高效編輯的開發者。
總之,每種編輯器都有其優缺點和適用場景。vi 在無圖形介面、遠端伺服器環境下是不可替代的王者,而像 VS Code 和 Sublime Text 則在有圖形介面的開發環境中提供了更豐富的整合功能和更友善的介面。學習 vi 讓你多了一項在任何環境下都能工作的技能,而其他編輯器則能提升你在特定開發流程中的舒適度和效率。
結論:vi 不僅是工具,更是思維
看到這裡,你是不是對「vi 是誰」有了更全面、更深入的理解呢?它不僅僅是一個老舊的文字編輯器,更是Unix/Linux世界中一個不可或缺的存在,一種高效操作的哲學體現。雖然它的學習曲線可能讓人望而卻步,但一旦你掌握了它,你會發現它帶來的不僅僅是編輯效率的提升,更是一種全新的思維方式——讓你學會如何用最少、最精準的操作,去完成最複雜的任務。
所以,下次當你看到終端機裡的 vi 時,別再害怕了!試著去了解它,去駕馭它。我敢說,這段學習的過程會是值得的,它會為你的技術生涯打開一扇新的大門,讓你成為一個更游刃有餘的數位世界探險家。動手試試看吧,你不會後悔的!