跳轉到內容

學習 vi 編輯器/vi 參考

來自華夏公益教科書,開放的書籍,開放的世界

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

以下約定在本參考中使用。


<c>
單個字元,例如 'a' 或 '1'。
<ESC>, <Ctrl-[>
表示應按下鍵盤上的 Escape (Esc) 鍵,它與 Control 和 '[' 相同。
<CR>
表示應按下回車鍵。
<TAB>
表示應按下 Tab 鍵
<Ctrl-x>, <C-x>
表示應同時按下 Control 鍵和 'x' 鍵。'x' 可以是鍵盤上的幾乎任何其他鍵。
<Shift-x>, <S-x>, <X>
表示應同時按下 Shift 鍵和 'x' 鍵
<Meta-x>, <M-x>
表示應同時按下 Meta 或 Alt 鍵和 'x' 鍵。
:quit, :q
Ex 命令。以 <:> 開頭,後跟命令,最後以 <CR> 結尾。對於許多 Ex 命令,存在長形式 (:quit) 和短形式 (:q)。
:set nocompatible
表示設定。
strlen ()
表示函式。
/pattern/, ?pattern?
搜尋模式。vi 中的搜尋模式是 正則表示式
:ranges/search/replace/options, :global /pattern/ delete
搜尋模式與 Ex 命令組合。

vi 中的所有命令都區分大小寫。


c 單個字元,例如 'a' 或 '1'。
m 單個小寫字母,用於標記文字。
string 多個字元,例如 'abc bed'。
pattern 用於搜尋的字串,可能包含正則表示式。例如 'abc' 或 '^ab[123]'。
myfile 要編輯的檔案的名稱。
vi myfile 開啟檔案 myfile 進行編輯。如果檔案不存在,將建立一個新檔案。可以同時開啟多個檔案。
vi +line myfile 開啟檔案 myfile,並將游標定位在給定的行。
  • vi +5 myfile 在第 5 行開啟 myfile
  • vi + myfile 在最後一行開啟 myfile
vi +/string/ myfile 開啟檔案 myfile,並將游標定位在包含該字串的第一行。如果字串包含空格,則應將其括在引號中。
  • vi +/"search string"/ myfile 在包含 search string 的第一行開啟 myfile
vi -r 列出檔案的恢復副本。如果 vi 會話被殺死或系統崩潰,則將儲存恢復副本。
vi -r myfile 開啟檔案 myfile 的恢復副本。
view myfile viewvi 的只讀版本。所有 vi 命令(包括更改檔案的命令)都是允許的,並且與 vi 中的行為相同。不同之處在於,正常嘗試儲存、ZZ:wq 無法正常工作。相反,需要使用 :x!:w

vi 命令

[編輯 | 編輯原始碼]

vi 可以設定在大多數系統上使用鍵盤移動按鈕,例如 游標左頁面上主頁刪除 等。

<G> 移動到檔案的最後一行。可以加一個表示要移動到的行的數字,<1><G> 移動到檔案的首行。
<h> 向左移動一個字元,或游標左。可以加一個數字,<5><h> 向左移動 5 個位置。
<j> 向下移動一行,或游標下。可以加一個數字,<5><j> 向下移動 5 行。
<k> 向上移動一行,或游標上。可以加一個數字,5k 向上移動 5 行。
<l> 向前移動一個字元,或游標右。可以加一個數字,5l 向右移動 5 個位置。

<H> 移動到螢幕頂部的行。
<M> 移動到螢幕中間的行。
<L> 移動到螢幕底部的行。

<-> 移動到上一行的第一個非空格字元。可以加一個數字。
  • 10- 向上移動 10 行。
<+> 移動到下一行的第一個非空格字元。可以加一個數字。
  • 10+ 向下移動 10 行。
<CR> <+> 相同。
<|> 必須加一個數字。移動到當前行的指定列。
  • 10| 移動到第 10 列。

<w> 移動到下一個單詞的開頭,該單詞可能在下一行。
<W> w 相同,但會考慮標點符號。
<e> 移動到當前單詞的結尾,或者如果在單詞之間或在單詞的結尾,則移動到下一個單詞的結尾。
<E> e 相同,但會考慮標點符號。
<b> 向後移動到當前單詞的開頭,或者如果在單詞之間或在單詞的開頭,則移動到前一個單詞的開頭。
<B> b 相同,但會考慮標點符號。

<f>c 找到同一行上字元 c 的第一次出現。

可以使用 <;><,>(反向方向)重複此命令。

  • <3><f><x> 在 x 的第三次出現(如果存在)時向前移動。
<f><x><;><;> 相同。
<F>c f 相同,但反向。
<t>c 找到同一行上字元 c 的第一次出現之前的字元。
<T>c t 相同,但反向,將游標放置在字元 c 之後。

<0> 移動到當前行的開頭。
<^> 移動到當前行的第一個非空格字元。
<$> 移動到當前行的結尾。

<Ctrl-F> 向前移動一頁。
  • 5<Ctrl-F> 向前移動五頁。
<Ctrl-B> 向後移動一頁。
  • 5<Ctrl-B> 向後移動五頁。
<Ctrl-D> 向前移動半頁。
<Ctrl-U> 向後移動半頁。
<Ctrl-E> 在螢幕底部顯示多一行。
<Ctrl-Y> 在螢幕頂部顯示多一行。

所有插入命令將 vi 置於 插入模式插入模式 由 ESC 鍵終止。

<i> 在游標位置進入 插入模式
<I> 在當前行的開頭進入 插入模式

<a> 在游標後進入 插入模式,或追加。
<A> 在當前行的末尾進入 插入模式,或追加到當前行的末尾。

<o> 在當前行下方插入新行,然後進入 插入模式
<O> 在當前行上方插入新行,然後進入 插入模式
r 用接下來輸入的字元替換游標下的字元。 可以用數字開頭,5ra 用字母 a 替換 5 個字元。

R 進入 替換模式。 每輸入一個字母,它都會替換游標下的字母,游標移動到下一個字元。 替換模式 由 ESC 鍵終止。 可以用數字開頭,5Rab 後跟 ESC 將游標下的字元替換為 a,下一個字元替換為 b,然後插入另外 4 個 ab。 原始行被放入緩衝區,替換任何已經存在的文字。

每次使用刪除命令時,被刪除的文字都會被放入緩衝區,替換任何已經存在的文字。 緩衝區中的文字可以透過 pP 檢索。

dd 刪除當前行。 可以用數字開頭。
  • 5dd 刪除五行。 d5d 等同於 5dd
de 從游標下的字元刪除到單詞的末尾。 可以用數字開頭。
  • 5de 刪除五個單詞。 d5e 等同於 5de
dE de 相同,但會考慮標點符號。
dw 從游標下的字元刪除到下一個單詞的開頭。 可以用數字開頭。
  • 5dw 刪除五個單詞。 d5w 等同於 5dw
dW dw 相同,但會考慮標點符號。
db 從游標左側刪除到前一個單詞的開頭。 可以用數字開頭。
  • 5db 刪除游標左側的五個單詞。
dB db 相同,但會考慮標點符號。
dtc 從游標位置刪除到第一個字元的前面。
  • dta 刪除到第一個字母 'a' 之前的所有文字,但不包括 'a'。
dfc 從游標位置刪除到第一個字元(包括字元 c)。
  • dfa 刪除到第一個字母 'a' 之前的所有文字,包括 'a'。
dG 刪除當前行和所有到檔案末尾的內容。
d/string 從游標刪除到字串,向前或向後。

D 從游標刪除到行末。
d$ D 相同。
d^ 從游標左側刪除到行首。

x 刪除游標下的字元。 可以用數字開頭。
  • 5x 刪除游標下的字元和接下來的 4 個字元。
  • xp 交換游標下的字元和它右邊的字元。
X 刪除游標左邊的字元,但不會刪除行末標記或下一行的任何字元。 可以用數字開頭。
  • 5X 刪除游標左邊的 5 個字元。

更改命令都選擇要刪除的文字,文字的末尾用 $ 表示。 進入插入模式,新文字覆蓋或擴充套件文字。 當按 <ESC> 鍵終止插入時,任何剩餘的原始文字都會被刪除。

在更改期間刪除的文字被放入緩衝區,替換任何已經存在的文字。 緩衝區中的文字可以透過 pP 檢索。

C 從游標位置更改到行末。 可以用數字開頭。
  • 5C 更改五行,當前行和接下來的 4 行。

cM 通常與 dMi 相同,其中 M 是任何移動命令。
cc 更改當前行。 可以用數字開頭。
  • 5cc 更改五行,當前行和接下來的 4 行。
ce 更改當前單詞。 可以用數字開頭。
  • 5ce 更改五個單詞。 c5e 等同於 5ce
cw ce 完全相同。

此命令與通常的 vi 移動不一致:cwcedei 相同,但 dwi 還刪除到下一個單詞的所有空格。

ctc 從游標位置更改到第一個字元(不包括字元 c)。
  • cta 更改到第一個字母 'a' 之前的所有文字,但不包括 'a'。
cfc 從游標位置更改到第一個字元(包括字元 c)。
cG 從當前行的開頭更改到檔案末尾。

s 更改游標下的字元。 可以用數字開頭。
  • 5s 更改 5 個字元,游標下的字元和接下來的 4 個字元。
S 更改整行。 與 ddO(大寫字母 "O")相同。

剪下和貼上

[編輯 | 編輯原始碼]

yank 命令將文字複製到 vi 緩衝區。 文字還透過刪除和更改命令複製到緩衝區。 putplace 命令從緩衝區檢索文字。

yy 將當前行復制到緩衝區。 可以用數字開頭。
  • 5yy 複製五行。
Y yy 相同。
yw 將從游標到下一個單詞開頭的文字複製到緩衝區。 可以用數字開頭。
  • 5yw 複製五個單詞。

p 如果緩衝區包含整行,則它們被插入到當前行的後面。 如果它只包含字元,則它們被插入到游標的後面。
P 如果緩衝區包含整行,則它們被插入到當前行的前面。 如果它只包含字元,則它們被插入到游標的前面。

搜尋使用 正則表示式

/pattern/ 搜尋字串,它可能是正則表示式。 搜尋從游標位置向下進行,在第一個匹配項處停止。 如果沒有找到,它將從檔案的開頭繼續到游標位置。 尾部的斜槓字元是可選的。
  • /abc/ 搜尋 abc 的第一次出現。
/pattern/+ 轉到包含搜尋字串的行後的行。
  • /pattern/+3 轉到包含 abc 的行後的第三行。
/pattern/e 將游標停留在 pattern 匹配的字串的最後一個字元上。* 透過在 e 後面新增 +num-num,你可以提供一個字元偏移量,指定游標停留在的位置。 例如:/foo/e+3 將使游標停留在 foo 下一次出現的 3 個字元之後。* 透過使用 b 而不是 e,你可以指定從匹配字串的開頭起的字元偏移量。
/\cpattern/ 進行不區分大小寫的搜尋。
?pattern? /pattern/ 相同,但向上搜尋。 尾部的問號字元是可選的。
?pattern?- 轉到包含搜尋字串的行上面的行。
  • ?abc?-3 轉到包含 abc 的行上面的第三行。
<n> 重複上次搜尋。
<N> 重複上次搜尋,但方向相反。
<f>char 在當前行上向前搜尋 char 的下一個出現位置。
<F>char 在當前行上向後搜尋 char 的下一個出現位置。
<t>char 在當前行上向前搜尋下一個出現的char,並將游標停留在char之前的字元上。
<T>char 在當前行上向後搜尋下一個出現的char,並將游標停留在char之後的字元上。
<;> 重複上一次fF搜尋。
<,> 與<;>類似,但方向相反。

搜尋和替換

[編輯 | 編輯原始碼]

搜尋和替換使用正則表示式和Ex命令:substitute (簡寫為 :s),其語法類似於sed實用程式 - 這並不奇怪,sedExw:Vi 有共同的起源 - Ed 編輯器。

:.s/pattern/replacement/ 將當前行中pattern的第一個出現替換為replacement。* 如果pattern包含\(\),它們將用於記住它們之間匹配的內容,而不是匹配括號字元。例如,:.s/\(\d*\)-\(\d*\)/\2:\1/可以匹配字串12345-6789並將其替換為6789:12345
:.s/pattern/replacement/g 將當前行中所有出現的pattern替換為replacement
:%s/pattern/replacement/g 將整個檔案中所有出現的pattern替換為replacement
:x,ys/pattern/replacement/g 將第x行到第y行中所有出現的pattern替換為replacement。* 例如::14,18s/foo/bar/g 將第14行到第18行中所有出現的foo替換為bar
  • 字元.可以用來表示當前行,字元$可以用來表示最後一行。例如::.,$s/foo/bar/g 將從當前行到檔案末尾的所有foo替換為bar

以下元字元在替換模式中具有特殊含義

& 被與搜尋模式匹配的文字替換。
\n \(\)之間的與搜尋模式匹配的文字替換,其中n在1到9的範圍內,\1被第一個集合的匹配替換。
\u 將下一個字元大寫(如果該字元是字母)。
\l 將下一個字元小寫(如果該字元是字母)。
\U 開啟大寫模式,所有後續字元都將大寫。
\L 開啟小寫模式,所有後續字元都將小寫。
\E 關閉大寫或小寫模式。
\e 關閉大寫或小寫模式。

例如,.:s/\(foo\) \(bar\) \(baz\)/\u\1 \U\2\E \3/可以匹配字串foo bar baz並將其替換為Foo BAR baz

標記文字

[編輯 | 編輯原始碼]

標記的行可以在更改或刪除文字時使用。

<m>m 用字母標記當前行。
  • <m><a> 用字母a標記當前行。
<'>m 移動到用字母標記的行。
  • <'><a> 移動到用a標記的行。

螢幕重新整理

[編輯 | 編輯原始碼]
<Ctrl-L> 重新整理螢幕。
z<CR> 重新整理螢幕,使當前行位於頂部。可以前面加上行號。
  • 35z 重新整理螢幕,使第35行位於頂部。
/pattern/z 找到包含string第一個出現位置的行,然後重新整理螢幕,使該行位於頂部。
z. 重新整理螢幕,使當前行位於螢幕中央。可以前面加上行號,在這種情況下,該行將位於中央。zz 序列也具有相同的效果。
  • 35z. 重新整理螢幕,使第35行位於中央。
/string/z. 找到包含string第一個出現位置的行,然後重新整理螢幕,使該行位於中央。
z- 重新整理螢幕,使當前行位於底部。可以前面加上行號,在這種情況下,該行將位於底部。
  • 35z- 重新整理螢幕,使第35行位於底部。
/string/z- 找到包含string第一個出現位置的行,然後重新整理螢幕,使該行位於底部。
<~> 更改游標下字元的大小寫,並移動到下一個字元。可以前面加上數字,因此5~ 將更改 5 個字元的大小寫。
<.> 重複上一次插入或刪除操作。可以前面加上數字,dd 後面加上5. 將刪除一行,然後刪除另外 5 行。
<%> 將游標移動到匹配的括號,可以是 (), [] 或 {} 中的任何一個。
<Ctrl-G> 臨時在螢幕底部顯示狀態行。
:f <Ctrl-G> 相同。
<J> 將下一行連線到當前行的末尾。可以前面加上數字。1J2JJ 具有相同的操作。
  • 3J 將三行連線在一起,當前行和接下來的兩行。
<u> 撤銷上一次更改。
<U> 撤銷對當前行的所有更改。
<Ctrl-Z> vi置於後臺,即控制權將返回到作業系統。在 UNIX 中,可以使用fgvi 會話返回到前臺。

儲存和退出

[編輯 | 編輯原始碼]
<Z><Z> 儲存並退出。它象徵著睡眠,表示工作的結束。
:quit
:q
退出,但前提是沒有進行過任何更改。
:quit!
:q!
不儲存退出,無論是否進行過任何更改。
:write
:w
儲存當前檔案,但不退出。
  • {Vi/Ex|:write!}} myfile 儲存到名為myfile 的檔案中。
:write!filename
:w!filename
儲存到該檔案,覆蓋任何現有內容。
:wq
:write|quit
儲存並退出。
:exit
:xit
:x
儲存並退出。
:exit!
:xit!
:x!
用於在view 中儲存並退出。
:e filename 退出當前檔案並開始編輯命名檔案。
:e + filename 退出當前檔案並開始編輯命名檔案,並將游標置於檔案末尾。
  • :e +5 myfile 退出當前檔案並開始編輯myfile,從第 5 行開始。
:e! 關閉當前檔案,丟棄所有未儲存的更改,並重新開啟該檔案以進行編輯。
:e# 退出當前檔案並開始編輯上一個檔案。
:n 當命令列中引用了多個檔案時,開始編輯下一個檔案。
:n files 重置:n 的檔案列表。當前檔案將被關閉,列表中的第一個檔案將被開啟以進行編輯。
:r filename 讀取檔案,即插入檔案。
  • :r myfile 在游標之後插入名為myfile 的檔案。
  • :5r myfile 在第 5 行之後插入該檔案。

vi 選項

[編輯 | 編輯原始碼]

所有選項都是ex 選項,因此需要在前面加上冒號。

預設選項可以放在使用者主目錄中的名為.exrc 的檔案中。此檔案中的選項前面沒有冒號,例如:

set ic
:set all 顯示當前的所有設定。
! 啟用 ! 停用 ! 含義
:set ignorecase
:set ic
:set noignorecase
:set noic
忽略大小寫。使搜尋不區分大小寫。
:set list :set nolist 顯示控制字元。<Ctrl-I> 是製表符,$ 是換行符。
:set number
:set nu
:set nonumber
:set nonu
開啟行號。
:set term 顯示終端型別。
:set autoindent
:set ai
:set noautoindent
:set noai
在插入模式下,按下 <CR> 會自動縮排行。
:set hlsearch :set nohlsearch 突出顯示由 /term/ 匹配的搜尋結果。這是一個視覺輔助工具。

ex 命令

[edit | edit source]

ex 命令以 : 開頭,這會將 vi 進入 最後一行模式,在螢幕的最後一行輸入。

:! command 執行指定的系統命令,然後返回到 vi
  • :! ls 執行 UNIX 的 ls 命令。
:sh 啟動一個 shell。exit 返回到 vi 會話。
:vi 退出 最後一行模式 並返回到正常的 命令模式


ex 行命令

[edit | edit source]

這些命令編輯行,並具有以下語法:

  1. 沒有行號,表示在當前行操作。
  2. 帶有 %,表示對所有行操作。
  3. 一對行號,例如 '3,5',表示對第 3 行到第 5 行(包含)進行操作。任何一個數字都可以用 . 替換,表示當前行,或者用 $ 表示最後一行。因此 .,$ 表示從當前行到檔案末尾,1,$ 表示與 % 相同。此外,可以使用簡單的算術運算,所以 .+1 表示當前行的下一行,$-5 表示最後一行之前的 5 行。


co 複製,後面跟著要複製到的行的位置。
  • :co 5 複製當前行並將其放在第 5 行之後。
    • :1,3 co 4 複製第 1 行到第 3 行並將其放在第 4 行之後。
d 刪除。
  • :d 刪除當前行。
    • :.,.+5d 刪除當前行和接下來的 5 行。
    • :%d 刪除所有行。
m 移動,後面跟著要移動到的行的位置。
  • :m 10 移動當前行並將其放在第 10 行之後。
    • :1,3 m 4 移動第 1 行到第 3 行並將其放在第 4 行之後。

對映 / 重新對映 vi 命令

[edit | edit source]
:map 在 vi 命令模式下建立新的命令或覆蓋現有的命令。
  • :map v i--<Ctrl-[> 新命令 v 會插入 -- 並返回到命令模式。 <Ctrl-[> 是跳脫字元,鍵入方式為 <CTRL-V><ESC>。
:map! 在命令模式和插入模式下建立新命令。
  • :map! ;r <Ctrl-[> 在插入模式下鍵入 ;r 會返回到命令模式。
[edit | edit source]


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

華夏公益教科書