學習 vi 編輯器/Vim/模式
VIM 提供比 vi 更多的模式(vi 只提供“普通”、“插入”和“命令列”模式)。這些額外的模式使 VIM 更強大,更容易使用;正因為如此,vim 使用者至少應該知道它們的存在。(注意:如果您不小心進入了您不熟悉的模式,通常您可以按 ESC 鍵返回到 普通 模式。)
以下是 vim 中每個模式的簡要概述
| 名稱 | 描述 | 幫助頁面 |
|---|---|---|
| 普通 | 用於文字導航和操作。這是 vim 通常啟動的模式,通常可以透過按 ESC 鍵返回該模式。 | :help Normal-mode
|
| 插入 | 用於插入新文字。與 vi 的主要區別在於,許多重要的“普通”命令也可以在插入模式下使用——只要您的鍵盤有足夠的元鍵(例如 Ctrl、Alt、Windows 鍵等)。 | :help Insert-mode
|
| 可視 | 用於文字選擇導航和操作,此模式允許您對選定的文字執行大多數普通命令以及一些額外命令。 | :help Visual-mode
|
| 選擇 | 與可視模式類似,但行為更像 MS Windows。 | :help Select-mode
|
| 命令列 | 用於輸入編輯器命令——就像第 3 列中的幫助命令。 | :help Command-line-mode
|
| Ex 模式 | 類似於命令列模式,但針對批處理進行了最佳化。 | :help Ex-mode
|
下面將詳細介紹每個模式。
在插入模式下,您可以鍵入新文字。在經典的 vi 中,插入模式僅僅是插入文字,除此之外沒有其他功能。Vim 利用了現代鍵盤上的許多元鍵;在正確配置的 vim 中,游標鍵應該可以在插入模式下工作。
可以透過多種方式進入插入模式,但最常見的一些方式是 <a> (在游標後追加)、<i> (在游標前插入)、<A> (在行尾追加)、<I> (在行首插入)、<C> (更改到行尾) 以及 <s> (替換字元)。
如果您希望透過選擇和替換來編輯文字,就像許多基於 GUI 的編輯器中常用的那樣,<C> 可以很好地完成此操作。選定的文字將在進入插入模式之前被刪除。
除非您使用 evim 介面,否則這是 vim 的標準模式(vim 在普通模式下啟動)。使用者在普通模式下鍵入的所有內容都將被解釋為命令(包括切換使用者到其他模式的命令)。
如果 vim 作為 evim 啟動(命令列中為 evim),vim 將始終讓使用者處於插入模式。可以透過按 <Ctrl-O> 鍵,然後按所需的命令進入普通模式。執行完一個命令後,使用者將返回到插入模式。(每個普通命令必須首先透過按 <Ctrl-O> 鍵開始。)您也可以透過按 Esc 鍵從插入模式進入命令模式。
可視模式中有三種不同的高亮顯示型別。每種型別都允許使用者以不同的方式高亮顯示文字。通常隻影響一個字元、一行或一個區域的命令將影響高亮顯示的文字(例如,將文字更改為大寫 (<Ctrl-~>)、刪除文字 (<d>)、縮排行 (>>、<< 和 =) 等等)。
可視模式有三種(子)型別:可視、塊可視 和 行可視
普通 可視 模式可以透過在普通模式下按 'v' 鍵啟動。在任何時候,按 ESC 或 <v> 鍵都會退出 VISUAL 模式,而不會執行任何操作。移動命令會更改選擇區域,而其他命令通常會對文字執行預期的操作(有一些例外情況,行為會發生改變或命令無法工作,但如果它沒有按你希望的那樣做,你可以隨時使用 <u> 鍵撤消)。
塊可視 模式可以透過按 <Ctrl-V> 鍵(或在某些 Windows 版本中按 <Ctrl-Q> 鍵啟動。如果這兩個鍵都不起作用,請使用“:help visual-block”查詢啟動方式)。可視塊始終保持矩形選擇,只高亮顯示跨多行的特定字元列。在以下示例中,使用者想要在每個電話號碼的第二和第三個數字欄位之間新增一個連字元
使用者首先將游標移動到該列的頂部(如果您願意,也可以從底部開始)。
|
接下來,按 <Ctrl-V> 鍵。這將使您進入塊可視模式(VISUAL BLOCK 將出現在底部,告訴您您處於哪種可視模式)。接下來,向下移動到所需的底部行。您可以在此示例中看到一列被高亮顯示,但您也可以向右或向左移動並高亮顯示更多列。
|
在本例中,使用者想要將空格 更改 為連字元。要更改文字,我們按 'c' 鍵。所有空格都會消失,並且更改只顯示在當前行,直到我們鍵入
|
當我們按 <ESC> 鍵時,更改會在所有行上覆制。
|
(注意:如果您只想 插入 文字而不是更改文字,則需要使用 '<I>' 或 '<A>' 鍵,而不是 '<i>' 或 '<a>' 鍵。)
在 行可視 模式中,透過按 <Shift-V> 鍵進入,整個行會被高亮顯示。否則,它通常與普通 可視 模式的工作方式相同。
類似於可視模式,但行為更像 CUA。這意味著如果您鍵入單個字元,它將替換選擇的內容。當然,您會失去所有對選擇的單鍵操作,例如 <U> 將選擇的內容改為大寫。
此模式通常透過以下方式啟用
:behave mswin
這是 MS-Windows 安裝的預設設定。您可以透過以下方式獲得正常模式:
:behave xterm
在命令列中,您可以執行 Ex 命令,輸入搜尋模式,並輸入過濾器命令。在底部會出現一個命令列,您可以在其中輸入命令。與 vi 不同,vim 支援游標鍵,這使得輸入命令變得容易很多。執行完一個命令後,編輯器將返回到正常模式。
您可以在正常模式下輸入冒號 : 來輸入 Ex 命令。一些示例包括
:set number :substitute/search/replace/ig
您可以輸入斜槓 / 來向前搜尋,或問號 ? 來向後搜尋,以輸入搜尋模式。您可以在這些搜尋模式中使用 vim 的擴充套件正則表示式。例如,
/word
將跳到 "word" 的下一個出現位置(即使它是 "sword" 或 "wordlessly"),但是
/\<word\>
將只跳到完整的單詞 "word"(而不是 "sword" 或 "wordless")。
您可以輸入一個過濾器,方法是在正常模式下輸入 !,然後輸入一個移動命令,然後輸入一個要在由移動命令捕獲的文字上執行的 shell 命令。例如,在 Linux 和其他類 UNIX 作業系統中,輸入
!22jsort
將使用 sort 系統命令對當前行及其後的 22 行進行排序。同樣的事情也可以用
:.,.+22!sort
事實上,如果您按照第一個示例操作,vim 會為您建立上述命令!
Ex 模式類似於命令列模式,因為它也允許您輸入 Ex 命令。與命令列模式不同,您不會自動返回到正常模式。您可以在正常模式下輸入 Q 來輸入 Ex 命令,並使用 :visual 命令退出 Ex 模式。請注意,Ex 模式是為批處理而設計的,因此它不支援對映或命令列編輯。
對於批處理,Ex 模式通常從外部啟動,方法是在呼叫編輯器時使用 "-E" 選項。以下是一個來自 RPM 包管理器 規範的真實示例
vim -E -s Makefile <<-EOF :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/ :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/ :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/ :update :quit EOF
RPM 使用 Bash 作為指令碼語言,這使得該示例有點難以理解,因為兩種不同的指令碼語言在一個檔案中混合在一起。
vim -E -s- 以改進的 Ex 模式啟動 vim,該模式允許使用比 vi 相容的 Ex 模式 (由
vim -e -s啟動) 更高階的命令。 <<-EOF- 告訴 bash 將其後的所有行復制到剛啟動的外部程式的標準輸入。'-' 告訴 shell 去除製表符。
:- 是包含 Ex 命令的行,vim 將執行這些命令。
:是可選的,但在兩個指令碼語言在一個檔案中混合在一起時很有用 :update- 初學者常犯的一個錯誤是忘記在更改後實際儲存檔案,錯誤地認為這是自動發生的。
:quit- 最後但並非最不重要的一點是:不要忘記實際退出 vim。
EOF- 標記標準輸入重定向的結束 - 從現在起,bash 將再次執行該命令本身。
如果您的 shell 不允許這種巧妙的標準輸入重定向,那麼您始終可以使用更經典的 I/O 重定向方法,使用兩個檔案
vim -E -s Makefile <Makefile-Fix1.vim
如果您沒有標準輸入重定向可用,那麼您可以嘗試使用 -c 選項和 source 命令的組合
vim -E -s -c "source Makefile-Fix1.vim" Makefile
使用改進的 Ex 模式,許多傳統上由 awk 或 sed 執行的任務可以使用 vim 完成,而且通常做得更好
- awk 和 sed 是面向流的 - 它們只從頭到尾向前讀取檔案,而 vim 是面向緩衝區的 - 您可以在檔案中隨意向前和向後移動。
- vim 的 正則表示式 比 awk 和 sed 的表示式更強大 - 例如,vim 可以跨多行匹配,並支援零匹配。
|
學習 vi 編輯器: 熟悉 — 基本任務 — 使工作更輕鬆 — 高階任務 — 細節 — Vi 克隆 (Vim – 基本導航 – 模式 – 技巧和竅門 – 程式設計師需要了解的有用內容 – 增強 Vim – Windows 上的 Vim – VimL 指令碼語言, Vile, BB vi) — vi 參考 |



