跳轉到內容

學習 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 模式類似於命令列模式,因為它也允許您輸入 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 模式,許多傳統上由 awksed 執行的任務可以使用 vim 完成,而且通常做得更好

  • awksed 是面向流的 - 它們只從頭到尾向前讀取檔案,而 vim 是面向緩衝區的 - 您可以在檔案中隨意向前和向後移動。
  • vim 的 正則表示式awksed 的表示式更強大 - 例如,vim 可以跨多行匹配,並支援零匹配。


學習 vi 編輯器: 熟悉基本任務使工作更輕鬆高階任務細節Vi 克隆 (Vim基本導航模式技巧和竅門程式設計師需要了解的有用內容增強 VimWindows 上的 VimVimL 指令碼語言, Vile, BB vi)vi 參考

華夏公益教科書