變更

Nvim 的 :help 頁面,是使用 tree-sitter-vimdoc 解析器,從 來源 產生 的。


此檔案描述刪除或變更文字的指令。在此上下文中,變更文字表示刪除文字,並使用一個指令將其替換為其他文字。您可以還原所有這些指令。您可以使用「.」指令重複非 Ex 指令。
有關插入文字,請參閱 insert.txt

1. 刪除文字 E470

["x]<Del> 或 <Del> x dl ["x]x 刪除游標下方和之後的 [count] 個字元 [到暫存器 x] (非行模式)。與 "dl" 相同。<Del> 鍵不接受 [count]。而是刪除計數的最後一個字元。請參閱 'whichwrap' 以刪除換行符號(合併行)。
X dh ["x]X 刪除游標之前的 [count] 個字元 [到暫存器 x] (非行模式)。與 "dh" 相同。另請參閱 'whichwrap'
d
["x]d{motion} 刪除 {motion} 移動到的文字 [到暫存器 x]。例外情況請參閱下文。
dd
["x]dd 刪除 [count] 行 [到暫存器 x] 行模式
D
["x]D 刪除游標下方的字元直到行尾,以及另外 [count]-1 行 [到暫存器 x];與 "d$" 同義。(非行模式)
{Visual}["x]x 或 v_x v_d v_<Del> {Visual}["x]d 或 {Visual}["x]<Del> 刪除醒目提示的文字 [到暫存器 x] (對於 {Visual},請參閱 Visual-mode)。
{Visual}["x]CTRL-H 或 v_CTRL-H v_<BS> {Visual}["x]<BS> 在選取模式下:刪除醒目提示的文字 [到暫存器 x]。
{Visual}["x]X 或 v_X v_D v_b_D {Visual}["x]D 刪除醒目提示的行 [到暫存器 x] (對於 {Visual},請參閱 Visual-mode)。在視覺區塊模式中,「D」會刪除醒目提示的文字以及所有直到行尾的文字。
:d :de :del :delete :dl :dp :[range]d[elete] [x] 刪除 [range] 行(預設值:目前行)[到暫存器 x]。請注意這些奇怪的縮寫::dl delete and list :dell idem :delel idem :deletl idem :deletel idem :dp delete and print :dep idem :delp idem :delep idem :deletp idem :deletep idem
:[range]d[elete] [x] {count} 刪除 {count} 行,從 [range] 開始(預設值:目前行 cmdline-ranges)[到暫存器 x]。
這些指令會刪除文字。您可以使用 . 指令重複它們(:d 除外)並還原它們。使用視覺模式刪除文字區塊。請參閱 暫存器 以了解暫存器的說明。
d{motion} 指令的一個例外:如果 motion 不是行模式,motion 的開始和結束不在同一行,並且開始之前只有空白,且 motion 結束之後沒有非空白,則刪除會變成行模式。這表示刪除也會移除您可能希望保留的空白行。請使用 o_v 運算子強制 motion 為字元模式。
'cpoptions' 包含 'E' 旗標時,嘗試刪除空的文字區域(例如,第一欄中的 "d0")會發生錯誤。
J
J 合併 [count] 行,最少兩行。移除縮排並插入最多兩個空格(請參閱下文)。當在緩衝區的最後一行時,會失敗。如果 [count] 太大,則會減少為可用的行數。
v_J
{Visual}J 合併醒目提示的行,最少兩行。移除縮排並插入最多兩個空格(請參閱下文)。
gJ
gJ 合併 [count] 行,最少兩行。不插入或移除任何空格。
v_gJ
{Visual}gJ 合併醒目提示的行,最少兩行。不插入或移除任何空格。
:j :join :[range]j[oin][!] [flags] 合併 [range] 行。與 "J" 相同,除了使用 [!] 合併不會插入或刪除任何空格。如果 [range] 的開始和結束值相等,則此指令不會執行任何動作。預設行為是將目前行與下一行合併。請參閱 ex-flags 以了解 [flags]。
:[range]j[oin][!] {count} [flags] 合併 {count} 行,從 [range] 開始(預設值:目前行 cmdline-ranges)。與 "J" 相同,除了使用 [!] 合併不會插入或刪除任何空格。請參閱 ex-flags 以了解 [flags]。
這些指令會刪除行之間的 <EOL>。這會將多行合併為一行。您可以重複這些指令(:j 除外)並還原它們。
這些指令("gJ" 除外)會在 <EOL> 的位置插入一個空格,除非有尾隨的空白或下一行以 ')' 開頭。這些指令("gJ" 除外)會刪除下一行中的任何開頭空白。如果 'joinspaces' 選項開啟,則這些指令會在 '.'、'!' 或 '?' 之後插入兩個空格。'formatoptions' 中的 'B' 和 'M' 旗標會變更在多位元組字元 fo-table 之前和之後插入空格的行為。
「[」標記設定在合併的第一行的結尾,「]」設定在結果行的結尾。

2. 刪除和插入 delete-insert replacing

R
R 進入取代模式:您輸入的每個字元都會取代現有的字元,從游標下方的字元開始。重複輸入的文字 [count]-1 次。有關更多詳細資訊,請參閱 取代模式
gR
gR 進入虛擬取代模式:您輸入的每個字元都會取代螢幕空間中的現有字元。因此,<Tab> 可能會一次取代多個字元。重複輸入的文字 [count]-1 次。有關更多詳細資訊,請參閱 虛擬取代模式
c
["x]c{motion} 刪除 {motion} 文字 [到暫存器 x] 並開始插入。當 'cpoptions' 包含 'E' 旗標且沒有要刪除的文字時(例如,當游標在 'x' 之後時使用 "cTx"),會發生錯誤且不會開始插入模式(這與 Vi 相容)。當 'cpoptions' 不包含 'E' 旗標時,即使沒有文字要刪除,"c" 指令也會始終開始插入模式。
cc
["x]cc 刪除 [count] 行 [到暫存器 x] 並開始插入 行模式。如果 'autoindent' 開啟,則保留第一行的縮排。
C
["x]C 從游標位置刪除到行尾,以及另外 [count]-1 行 [到暫存器 x],並開始插入。與 c$ 同義 (非行模式)。
s
["x]s 刪除 [count] 個字元 [到暫存器 x] 並開始插入 (s 代表取代)。與 "cl" 同義 (非行模式)。
S
["x]S 刪除 [count] 行 [到暫存器 x] 並開始插入。與 "cc" 同義 行模式
{Visual}["x]c 或 v_c v_s {Visual}["x]s 刪除醒目提示的文字 [到暫存器 x] 並開始插入 (對於 {Visual},請參閱 Visual-mode)。
v_r
{Visual}r{char} 將所有選取的字元替換為 {char}CTRL-C 將按原樣插入。
v_C
{Visual}["x]C 刪除醒目提示的行 [到暫存器 x] 並開始插入。在視覺區塊模式下,其運作方式不同 v_b_Cv_S
{Visual}["x]S 刪除醒目提示的行 [到暫存器 x] 並開始插入 (對於 {Visual},請參閱 Visual-mode)。 v_R
{Visual}["x]R 目前與 {Visual}["x]S 相同。在下一個版本中,它可能會以不同的方式運作。
注意事項
您可以使用 <Esc> 結束插入和取代模式。
有關這些模式中的其他特殊字元,請參閱「插入和取代模式」一節 mode-ins-repl
[count] 的效果會在 Vim 退出插入或取代模式後發生。
'cpoptions' 選項包含 '$' 且變更在同一行內時,Vim 會繼續顯示要刪除的文字,並在最後一個刪除的字元處放置 '$'。
請參閱 暫存器 以了解暫存器的說明。
取代模式與插入模式相同,只是您輸入的每個字元都會刪除一個字元。如果您到達行尾,Vim 會附加任何其他字元(就像插入模式一樣)。在取代模式中,退格鍵會還原原始文字(如果有的話)。(請參閱「插入和取代模式」一節 mode-ins-repl)。
cw cW 特例:當游標位於一個單字中時,"cw" 和 "cW" 不包含單字之後的空白,它們只變更到單字的結尾。這是因為 Vim 將 "cw" 解釋為變更單字,而單字不包含後面的空白。
如果您希望 "cw" 包含單字之後的空格,請使用此對應
:map cw dwi
或使用 "caw"(請參閱 aw)。
:c :ch :change :{range}c[hange][!] 使用一些不同的文字取代文字行。輸入僅包含 "." 的行以停止取代。如果沒有 {range},則此指令只變更目前行。新增 [!] 會在此指令執行期間切換 'autoindent'

3. 簡單變更 simple-change changing

r
r{char} 將游標下的字元替換為 {char}。如果 {char}<CR><NL>,則會用換行符號替換該字元。若要以真正的 <CR> 替換,請使用 CTRL-V <CR>CTRL-V <NL> 會替換為 <Nul>
如果 {char}CTRL-ECTRL-Y,則會使用下方或上方行的字元,就像 i_CTRL-Ei_CTRL-Y 一樣。這也適用於計數,因此 10r<C-E> 會從下方行複製 10 個字元。
如果您提供 [count],Vim 會將 [count] 個字元替換為 [count] 個 {char}。然而,當 {char}<CR><NL> 時,Vim 只會插入一個 <CR>:「5r<CR>」會將五個字元替換為一個換行符號。當 {char}<CR><NL> 時,Vim 會執行自動縮排。這就像刪除被替換的字元,然後執行「i<CR><Esc>」一樣。{char} 可以像 digraph-arg 一樣輸入。 :lmap 對應會套用於 {char}。插入模式中的 CTRL-^ 命令可以用來開啟/關閉此功能 i_CTRL-^。關於當 'encoding' 是 Unicode 時如何使用組合字元,請參閱 utf-8-char-arg
gr
gr{char} 將游標下的虛擬字元替換為 {char}。這是以螢幕空間而非檔案空間進行替換。如需更多詳細資訊,請參閱 gRVirtual-Replace-mode。與 r 一樣,可以給定計數。{char} 可以像 r 一樣輸入,但插入模式中具有特殊意義的字元,例如大多數 CTRL-k 按鍵,則無法使用。
gr-default
Nvim 會建立以「gr」為前綴的預設對應,這可能會抑制 gr 的行為。請使用以下方式來還原內建行為
nnoremap <nowait> gr gr
digraph-arg
Normal 模式指令 (如 rt) 的參數是單一字元。當 'cpo' 不包含 'D' 旗標時,此字元也可以像 digraphs 一樣輸入。先輸入 CTRL-K,然後輸入兩個 digraph 字元。
case
以下指令會變更字母的大小寫。使用目前作用中的 locale。請參閱 :language。LC_CTYPE 值在這裡很重要。
~
~ 'notildeop' 選項:切換游標下字元的大小寫,並將游標向右移動。如果給定 [count],則會對那麼多字元執行此動作。
~{motion} 'tildeop' 選項:切換 {motion} 文字的大小寫。
g~
g~{motion} 切換 {motion} 文字的大小寫。
g~g~ g~g~ g~~ g~~ 切換目前行的大小寫。
v_~
{Visual}~ 切換醒目提示文字的大小寫 (關於 {Visual},請參閱 Visual-mode)。
v_U
{Visual}U 將醒目提示文字設為大寫 (關於 {Visual},請參閱 Visual-mode)。
gU uppercase gU{motion} 將 {motion} 文字設為大寫。範例
:map! <C-F> <Esc>gUiw`]a
這在插入模式中有效:按 CTRL-F 可將游標前的單字設為大寫。方便以小寫輸入單字,然後將其設為大寫。
gUgU gUgU gUU gUU 將目前行設為大寫。
v_u
{Visual}u 將醒目提示文字設為小寫 (關於 {Visual},請參閱 Visual-mode)。
gu lowercase gu{motion} 將 {motion} 文字設為小寫。
gugu gugu guu guu 將目前行設為小寫。
g? rot13 g?{motion} 將 {motion} 文字編碼為 Rot13。
v_g?
{Visual}g? 將醒目提示文字編碼為 Rot13 (關於 {Visual},請參閱 Visual-mode)。
g?g? g?g? g?? g?? 將目前行編碼為 Rot13。
若要將一行轉換為標題大小寫,請將每個單字的第一個字母設為大寫
:s/\v<(.)(\w*)/\u\1\L\2/g
加法和減法
CTRL-A
CTRL-A 將 [count] 加到游標所在或之後的數字或字母字元。
v_CTRL-A
{Visual}CTRL-A 將 [count] 加到醒目提示文字中的數字或字母字元。
v_g_CTRL-A
{Visual}g CTRL-A 將 [count] 加到醒目提示文字中的數字或字母字元。如果醒目提示多行,則每一行都會額外遞增 [count] (因此有效地建立 [count] 遞增序列)。例如,如果您有以下數字列表
1.
1.
1.
1.
將游標移至第二個「1.」,並視覺選取三行,按下 g CTRL-A 會產生
1.
2.
3.
4.
CTRL-X
CTRL-X 從游標所在或之後的數字或字母字元減去 [count]。
v_CTRL-X
{Visual}CTRL-X 從醒目提示文字中的數字或字母字元減去 [count]。
v_g_CTRL-X
{Visual}g CTRL-X 從醒目提示文字中的數字或字母字元減去 [count]。如果醒目提示多行,則每個值都會額外遞減 [count] (因此有效地建立 [count] 遞減序列)。
CTRL-ACTRL-X 指令適用於 (帶正負號) 十進位數字、不帶正負號的二進位/八進位/十六進位數字和字母字元。
這取決於 'nrformats' 選項
'nrformats' 包含「bin」時,Vim 會假設以 '0b' 或 '0B' 開頭的數字是二進位。
'nrformats' 包含「octal」時,Vim 會將以 '0' 開頭的數字視為八進位,除非該數字包含 '8' 或 '9'。其他數字是十進位,且可能會有前導負號。如果游標位於數字上,則指令會套用於該數字;否則 Vim 會使用游標右側的數字。
'nrformats' 包含「hex」時,Vim 會假設以 '0x' 或 '0X' 開頭的數字是十六進位。數字中最右側字母的大小寫會決定產生的十六進位數字的大小寫。如果目前數字中沒有字母,則 Vim 會使用先前偵測到的大小寫。
'nrformats' 包含「alpha」時,Vim 會變更游標下或之後的字母字元。這對於使用字母索引建立列表非常有用。
對於十進位數,會考慮前導負號進行遞增或遞減,對於二進位、八進位和十六進位值,則不會考慮。若要忽略符號,請在使用 CTRL-ACTRL-X 之前視覺選取數字。
對於具有前導零的數字 (包括所有八進位和十六進位數字),Vim 會盡可能保留數字中的字元數。對「0077」執行 CTRL-A 會產生「0100」,對「0x100」執行 CTRL-X 會產生「0x0ff」。有一個例外:當發現以零開頭的數字不是八進位 (它包含 '8' 或 '9'),但 'nrformats' 確實包含「octal」時,會移除前導零,以避免結果可能被識別為八進位數字。
請注意,當 'nrformats' 包含「octal」時,具有前導零的十進位數字會導致錯誤,因為它們可能會與八進位數字混淆。
同樣請注意,當 'nrformats' 同時包含「bin」和「hex」時,帶有前導 '0x' 或 '0X' 的二進位數字可能會被解譯為十六進位而不是二進位,因為 '0b' 是有效的十六進位數字。對「0x0b11」執行 CTRL-A 會產生「0x0b12」,而不是「0x0b100」。當 'nrformats' 包含「bin」但不包含「hex」時,對「0x0b11」中的「0b11」執行 CTRL-A 會產生「0x0b100」。
當游標下的數字太大而無法放入 64 位元時,它會四捨五入為最接近的可表示數字,並跳過加法/減法。例如,對 18446744073709551616 執行 CTRL-X 會產生 18446744073709551615。較大的數字 (例如 18446744073709551618) 也是如此。
CTRL-A 指令在巨集中非常有用。範例:使用以下步驟建立編號列表。
1. 建立第一個列表項目,確保它以數字開頭。2. qa - 開始錄製到暫存器 'a' 3. Y - 複製項目 4. p - 將項目的副本放在第一個項目下方 5. CTRL-A - 遞增數字 6. q - 停止錄製 7. <count>@a - 重複複製、放置和遞增 <count>

將行向左或向右移動 shift-left-right

<
<{motion} 將 {motion} 行向左移動一個 'shiftwidth'
如果 'shiftwidth' 選項設定為零,則縮排量會根據行中第一個非空白字元計算。 <<
<< 將 [count] 行向左移動一個 'shiftwidth'
v_<
{Visual}[count]< 將醒目提示的行向左移動 [count] 個 'shiftwidth' (關於 {Visual},請參閱 Visual-mode)。
>
>{motion}{motion} 行向右移動一個 'shiftwidth'
如果 'shiftwidth' 選項設定為零,則縮排量會根據行中第一個非空白字元計算。 >>
>> 將 [count] 行向右移動一個 'shiftwidth'
v_>
{Visual}[count]> 將醒目提示的行向右移動 [count] 個 'shiftwidth' (關於 {Visual},請參閱 Visual-mode)。
:<
:[range]< 將 [range] 行向左移動一個 'shiftwidth'。重複 '<' 可移動多個 'shiftwidth'
:[range]< {count} 從 [range] 開始,將 {count} 行向左移動一個 'shiftwidth' (預設為目前行 cmdline-ranges)。重複 '<' 可移動多個 'shiftwidth'
:[range]le[ft] [indent] 將 [range] 中的行向左對齊。將行中的縮排設定為 [indent] (預設為 0)。
:>
:[range]> [flags] 將 [range] 行向右移動一個 'shiftwidth'。重複 '>' 可移動多個 'shiftwidth'。如需 [flags],請參閱 ex-flags
:[range]> {count} [flags] 從 [range] 開始,將 {count} 行向右移動一個 'shiftwidth' (預設為目前行 cmdline-ranges)。重複 '>' 可移動多個 'shiftwidth'。如需 [flags],請參閱 ex-flags
「>」和「<」指令對於變更程式內的縮排非常方便。請使用 'shiftwidth' 選項來設定這些指令插入或刪除的空格大小。通常 'shiftwidth' 選項為 8,但您可以將其設定為 (例如) 3 來建立較小的縮排。向左移動會在沒有縮排時停止。向右移動不會影響空白行。
如果 'shiftround' 選項開啟,則縮排會四捨五入為 'shiftwidth' 的倍數。
如果 'smartindent' 選項開啟,或 'cindent' 開啟且 'cinkeys' 包含 '#' 且值為零,則向右移動不會影響以 '#' 開頭的行 (這些行應該是必須保持在第 1 欄的 C 前置處理器行)。這可以使用 'cino' 選項來變更,請參閱 cino-#
'expandtab' 選項關閉時(這是預設值),Vim 會盡可能使用 <Tab> 來進行縮排。您可以使用 ">><<" 將由空格組成的縮排替換為由 <Tab> 組成的相同縮排(如有必要,會加上一些空格)。如果 'expandtab' 選項開啟,Vim 則只會使用空格。您可以使用 ">><<" 將縮排中的 <Tab> 替換為空格(或者使用 :retab!)。
要將一行移動數個 'shiftwidth',請使用視覺模式或 : 指令。例如:
Vjj4>                move three lines 4 indents to the right
:<<<                move current line 3 indents to the left
:>> 5                move 5 lines 2 indents to the right
:5>>                move line 5 2 indents to the right

4. 複雜的變更 complex-change

4.1 過濾器指令 filter
過濾器是一個程式,它接收標準輸入的文字,以某種方式進行變更,然後將其傳送到標準輸出。您可以使用以下指令將一些文字透過過濾器傳送,使其被過濾器的輸出替換。過濾器的範例包括 "sort",它會按字母順序排序行,以及 "indent",它會格式化 C 程式檔案(您需要一個像過濾器一樣工作的 indent 版本;並非所有版本都如此)。'shell' 選項指定 Vim 用於執行過濾器指令的 shell。您可以使用 "." 重複過濾器指令。Vim 不會辨識 :! 指令後的註解(以 '"' 開頭)。
!
!{motion}{filter} 將 {motion} 文字行透過外部程式 {filter} 進行過濾。
!!
!!{filter} 將 [count] 行透過外部程式 {filter} 進行過濾。
v_!
{Visual}!{filter} 將醒目提示的行透過外部程式 {filter} 進行過濾(對於 {Visual},請參閱 視覺模式)。
:{range}![!]{filter} [!] [arg] :range!
{range} 行透過外部程式 {filter} 進行過濾。Vim 會將可選的驚嘆號替換為最後給定的指令,並附加可選的 [arg]。Vim 會將過濾器指令的輸出儲存到暫存檔中,然後將該檔案讀入緩衝區 暫存檔。Vim 會使用 'shellredir' 選項將過濾器輸出重新導向到暫存檔。然而,如果 'shelltemp' 選項關閉,則在可能的情況下(在 Unix 上)會使用管道。當 'R' 旗標包含在 'cpoptions' 中時,過濾行中的標記會被刪除,除非使用 :keepmarks 指令。範例:
:keepmarks '<,'>!sort
當過濾後的行數少於過濾前時,遺失行中的標記仍會被刪除。
=
={motion} 將 {motion} 行透過 'equalprg' 選項所給定的外部程式進行過濾。當 'equalprg' 選項為空時(這是預設值),使用內部格式化函式 C 縮排'lisp'。但是當 'indentexpr' 不為空時,會改為使用它 縮排表達式
==
== 像使用 ={motion} 一樣過濾 [count] 行。
v_=
{Visual}= 像使用 ={motion} 一樣過濾醒目提示的行。
tempdir tempfile setuid Nvim 會使用暫存檔進行過濾和產生 diff。外掛程式通常也會將 tempname() 用於自己的目的。在首次請求暫存檔時,Nvim 會建立一個共用目錄(「Nvim 暫存目錄」),用作儲存所有暫存檔(包括目前工作階段中的 stdpath("run") 檔案 $XDG_RUNTIME_DIR)的儲存空間。
Nvim 暫存目錄會在第一個可用的系統暫存目錄中建立:Unix:$TMPDIR、/tmp、目前目錄、$HOME。Windows:$TMPDIR、$TMP、$TEMP、$USERPROFILE、目前目錄。
在 Unix 上,暫存目錄會以 0700 的權限(僅限目前使用者存取)建立,以避免安全問題(例如,符號連結攻擊)。在結束時,Nvim 會刪除暫存目錄及其內容。E5431
如果您看到錯誤或 記錄 訊息,例如:
E5431: tempdir disappeared (2 times)
這表示您系統上的外部程序刪除了 Nvim 暫存目錄。這通常是由於「防毒軟體」或設定錯誤的清除服務所造成的。
如果 Nvim 設定了 setuid 位元,這可能會導致問題:暫存檔由 setuid 使用者擁有,但過濾器指令可能以原始使用者身分執行。
4.2 替換 :substitute
:s :su :[range]s[ubstitute]/{pattern}/{string}/[flags] [count] 對於 [range] 中的每一行,將 {pattern} 的比對項替換為 {string}。關於 {pattern},請參閱 pattern{string} 可以是文字字串,也可以是特殊內容;請參閱 sub-replace-special。當省略 [range] 和 [count] 時,只會在目前行中替換。當給定 [count] 時,會從 [range] 中的最後一行開始在 [count] 行中替換。當省略 [range] 時,會從目前行開始。E939 E1510 [count] 必須是正數(最大值為 2147483647)。另請參閱 cmdline-ranges
請參閱 :s_flags 以取得 [flags]。分隔符號不一定要是 /,請參閱 pattern-delimiter
:[range]s[ubstitute] [flags] [count] :[range]&[&][flags] [count] :&
重複最後一次 :substitute,使用相同的搜尋模式和替換字串,但不使用相同的旗標。您可以加入 [flags],請參閱 :s_flags。請注意,在 :substitute 之後,不能使用 '&' 旗標,它會被識別為模式分隔符號。:substitute 與 'c'、'g'、'i'、'I' 和 'r' 旗標之間的空格不是必要的,但在指令碼中,為了避免混淆,最好保留它。另請參閱下文的兩個和三個字母的指令,以重複 :substitute :substitute-repeat
:[range]~[&][flags] [count] :~
重複最後一次替換,使用相同的替換字串,但使用上次使用的搜尋模式。這類似於 :&r。請參閱 :s_flags 以取得 [flags]。
&
& :s 的同義詞(重複最後一次替換)。請注意,旗標不會被記住,因此它實際上可能會以不同的方式運作。您可以使用 :&& 來保留旗標。
&-預設
預設對應至 ":&&<CR>"。default-mappings
g&
g& :%s//~/& 的同義詞(在所有行上使用相同的旗標重複最後一次替換,使用最後的搜尋模式)。例如,當您先使用 :s/pattern/repl/flags 進行替換,然後使用 /search 搜尋其他內容時,g& 將執行 :%s/search/repl/flags。助記符:全域替換。
:snomagic :sno :[range]sno[magic] ... 與 :substitute 相同,但始終使用 'nomagic'
:smagic :sm :[range]sm[agic] ... 與 :substitute 相同,但始終使用 'magic'
:s_flags
您可以對替換指令使用的旗標
:&&
[&] 必須是第一個:保留上一個替換指令的旗標。範例:
:&&
:s/this/that/&
請注意,:s:& 不會保留旗標。
[c] 確認每次替換。Vim 會以 hl-IncSearch 醒目提示比對的字串。您可以輸入::s_c
'y' 替換此比對項 'l' 替換此比對項然後結束(「最後」) 'n' 跳過此比對項 <Esc> 結束替換 'a' 替換此比對項和所有剩餘比對項 'q' 結束替換 CTRL-E 將螢幕向上捲動 CTRL-Y 將螢幕向下捲動
:s_e
[e] 當搜尋模式失敗時,不要發出錯誤訊息,特別是,在對應中繼續進行,就像沒有發生錯誤一樣。這對於防止「找不到比對項」錯誤中斷對應最有用。但是,Vim 不會抑制以下錯誤訊息:常規表達式不能以字母分隔 \ 後面應該跟著 /、? 或 & 沒有先前的替換常規表達式 尾隨字元 中斷
:s_g
[g] 替換行中的所有出現次數。如果沒有此引數,則只會在每一行中替換第一次出現的次數。如果 'gdefault' 選項開啟,則此旗標預設為開啟,而 [g] 引數會將其關閉。
:s_i
[i] 忽略模式的大小寫。'ignorecase''smartcase' 選項不會被使用。
:s_I
[I] 不忽略模式的大小寫。'ignorecase''smartcase' 選項不會被使用。
:s_n
[n] 報告比對項的數目,不實際進行替換。[c] 旗標會被忽略。回報比對項時,就像 'report' 為零一樣。對於 count-items 很有用。如果使用 \= sub-replace-expression,則會在每個比對項處的 沙箱中評估表達式。
[p] 印出包含最後一次替換的行。:s_p
[#] 類似於 [p],並在前面加上行號。:s_#
[l] 類似於 [p],但印出文字的方式類似於 :list:s_l
:s_r
[r] 僅在與 :& 或沒有引數的 :s 組合時有用。:&r 的運作方式與 :~ 相同:當搜尋模式為空時,使用先前使用的搜尋模式,而不是上次替換或 :global 的搜尋模式。如果最後一個執行搜尋的指令是替換或 :global,則不會有任何效果。如果最後一個指令是搜尋指令(例如 "/"),則使用該指令中的模式。對於具有引數的 :s,已經會發生這種情況。
:s/blue/red/
/green
:s//red/   or  :~   or  :&r
最後一個指令會將 "green" 替換為 "red"。
:s/blue/red/
/green
:&
最後一個指令會將 "blue" 替換為 "red"。
請注意,沒有旗標可以變更模式的「magicness」。而是使用不同的指令,或者您可以使用 /\v 等。原因在於,只能透過跳過模式來找到旗標,而為了跳過模式,必須知道「magicness」。進退兩難!
如果替換指令的 {pattern} 為空,則該指令會使用上次替換或 :global 指令中的模式。如果沒有,但有先前的搜尋模式,則會使用該模式。使用 [r] 旗標時,該指令會使用上次替換、:global 或搜尋指令中的模式。
如果省略了 {string},則替換的執行方式會像它是空的一樣。因此,會刪除比對的模式。{pattern} 後面的分隔符號也可以省略。範例:
:%s/TESTING
這會從所有行中刪除 "TESTING",但每行只刪除一個。
為了與 Vi 相容,允許以下兩種例外情況:"\/{string}/" 和 "\?{string}?" 的作用與 "//{string}/r" 相同。"&{string}&" 的作用與 "//{string}/" 相同。pattern-delimiter E146 你可以使用另一個單字元來代替包圍模式和替換字串的 '/'。如果你想在搜尋模式或替換字串中包含 '/',這會很有用。範例
:s+/+//+
你可以使用大多數字元,但不能使用字母數字字元、'\'、'"' 或 '|'。
關於模式的定義,請參閱 pattern。在視覺區塊模式中,請在模式中使用 /\%V,以使替換僅在區塊中運作。否則它無論如何都會在整行上運作。
sub-replace-special :s\={string} 以 "\=" 開頭時,它會被評估為一個表達式,請參閱 sub-replace-expression。你可以使用它來進行複雜的替換或特殊字元。
替換的遞迴次數限制為 4 層。E1290
否則,{string} 中的這些字元具有特殊含義
magic nomagic 動作
& \& 被整個匹配的模式取代 s/\&
\& & 被 & 取代 \0 被整個匹配的模式取代 \0 s/\0 \1 被第一對 () 中匹配的模式取代 s/\1
\2 被第二對 () 中匹配的模式取代 s/\2
.. .. s/\3
\9 被第九對 () 中匹配的模式取代 s/\9
~ \~ 被先前替換的 {string} 取代 s~
\~ ~ 被 ~ 取代 s/\~
\u 下一個字元設為大寫 s/\u
\U 後續字元設為大寫,直到 \E s/\U \l 下一個字元設為小寫 s/\l
\L 後續字元設為小寫,直到 \E s/\L \e \u、\U、\l 和 \L 的結尾 (注意:不是 <Esc>!) s/\e
\E \u、\U、\l 和 \L 的結尾 s/\E
<CR> 在此處將行分割成兩行(請輸入 <CR> 作為 CTRL-V <Enter>s<CR>
\r 相同 s/\r
\<CR> 插入一個歸位字元 (CTRL-M) (請輸入 <CR> 作為 CTRL-V <Enter>) s/\<CR>
\n 插入一個 <NL> (檔案中的 <NUL>) (不會中斷行) s/\n
\b 插入一個 <BS> s/\b
\t 插入一個 <Tab> s/\t
\\ 插入一個單個反斜線 s/\\
\x,其中 x 是上面未提及的任何字元:保留供未來擴展
substitute() 函數的第三個引數 {sub} 內部也使用特殊含義,但以下情況除外
A % 會逐字插入百分比,而無需考慮 'cpoptions'
magic 始終設定,而無需考慮 'magic'
A ~ 會逐字插入波浪號。
<CR> 和 \r 會插入歸位字元 (CTRL-M)。
\<CR> 沒有特殊含義。它只是 \x 的其中一種。
範例
:s/a\|b/xxx\0xxx/g                 modifies "a b"             to "xxxaxxx xxxbxxx"
:s/\([abc]\)\([efg]\)/\2\1/g         modifies "af fa bg" to "fa fa gb"
:s/abcde/abc^Mde/                 modifies "abcde"    to "abc", "de" (two lines)
:s/$/\^M/                         modifies "abcde"    to "abcde^M"
:s/\w\+/\u\0/g                 modifies "bla bla"  to "Bla Bla"
:s/\w\+/\L\u\0/g                 modifies "BLA bla"  to "Bla Bla"
注意: "\L\u" 可用於將單字的第一個字母大寫。這與 Vi 和舊版本的 Vim 不相容,在這些版本中,"\u" 會取消 "\L"。"\U\l" 也是如此。
注意: 在先前的版本中,CTRL-V 的處理方式很特殊。由於這與 Vi 不相容,因此已移除。請改用反斜線。
指令 文字 結果
:s/aa/a^Ma/ aa a<換行符號>a :s/aa/a\^Ma/ aa a^Ma :s/aa/a\\^Ma/ aa a\<換行符號>a
(你需要輸入 CTRL-V <CR> 才能在此處取得 ^M)
"\1"、"\2" 等的編號是根據模式中哪個 "\(" 先出現(從左到右)。當一個括號群組匹配多次時,最後一個將用於 "\1"、"\2" 等。範例
:s/\(\(a[a-d] \)*\)/\2/      modifies "aa ab x" to "ab x"
"\2" 用於 "\(a[a-d] \)"。首先,它匹配 "aa ",其次是 "ab "。
當將括號與 '|' 結合使用時,例如在 \([ab]\)\|\([cd]\) 中,括號中的第一個或第二個模式都沒有匹配,因此 \1 或 \2 為空。範例
:s/\([ab]\)\|\([cd]\)/\1x/g   modifies "a b c d"  to "ax bx x x"
這些指令會使用給定的旗標重複先前的 :substitute 指令。第一個字母始終是 "s",後跟一個或兩個可能的旗標字元。例如,:sce 的作用與 :s///ce 相同。該表格列出了可能的組合,並非所有旗標都是可能的,因為該指令是另一個指令的簡寫。
:substitute 指令的清單 | c e g i I n p l r | c :sc :sce :scg :sci :scI :scn :scp :scl | e | g :sgc :sge :sg :sgi :sgI :sgn :sgp :sgl :sgr | i :sic :sie :si :siI :sin :sip :sir | I :sIc :sIe :sIg :sIi :sI :sIn :sIp :sIl :sIr | n | p | l | r :src :srg :sri :srI :srn :srp :srl :sr
例外情況::scr 是 :scriptnames、:se 是 :set、:sig 是 :sign、:sil 是 :silent、:sn 是 :snext、:sp 是 :split、:sl 是 :sleep、:sre 是 :srewind
使用表達式進行替換 sub-replace-expression
sub-replace-\= s/\= 當替換字串以 "\=" 開頭時,其餘部分會被解讀為表達式。
sub-replace-special 中提及的字元的特殊含義不適用,但 "<CR>" 除外。<NL> 字元用作換行符號,你可以使用雙引號字串取得一個:"\n"。在前面加上一個反斜線可取得一個真正的 <NL> 字元(它在檔案中將會是 NUL)。
"\=" 標記法也可以在 substitute() 函數的第三個引數 {sub} 內使用。在這種情況下,在 sub-replace-special 中提及的字元的特殊含義完全不適用。特別是,<CR><NL> 並不解讀為換行符號,而是分別解讀為歸位字元和換行符號。
當結果為 List 時,項目會以分隔換行符號連結。因此,每個項目都會成為一行,但它們本身可以包含換行符號。
可以使用 submatch() 函數來取得匹配的文字。可以使用 "submatch(0)" 來存取整個匹配的文字。使用 "submatch(1)" 來存取與第一對 () 匹配的文字。其餘的 () 中進一步的子匹配也是如此。
請小心:分隔字元不得出現在表達式中!請考慮使用類似 "@" 或 ":" 的字元。如果表達式的結果包含分隔字元,則沒有問題。
範例
:s@\n@\="\r" .. expand("$HOME") .. "\r"@
這會將行尾替換為包含 $HOME 值的換行符號。
s/E/\="\<Char-0x20ac>"/g
這會將每個 'E' 字元替換為歐元符號。請在 <Char-> 中閱讀更多資訊。
4.3 變更 Tab 鍵 change-tabs
:ret :retab :retab! :[range]ret[ab][!] [new_tabstop] 將所有包含 <Tab> 的空白字元序列,使用給定的新跳格值,替換為新的空白字元字串。 如果您未指定新的跳格大小或其為零,Vim 會使用 'tabstop' 的目前值。 'tabstop' 的目前值總是會被用來計算現有 Tab 的寬度。 使用 ! 時,Vim 也會將僅由普通空格組成的字串,在適當的位置替換為 Tab。 在 'expandtab' 開啟的情況下,Vim 會將所有 Tab 替換為適當數量的空格。 此指令會將 'tabstop' 設定為給定的新值,如果在整個檔案上執行(預設行為),應該不會產生任何可見的變更。 注意:此指令會修改 C 程式中字串內的任何 <Tab> 字元。 請使用 "\t" 來避免此情況(這無論如何都是個好習慣)。 :retab! 也可能會將一連串的空格替換為 <Tab> 字元,這可能會搞亂 printf()。 您可以使用以逗號分隔的跳格寬度清單來代替單一的跳格。 列表中每個值代表一個跳格的寬度,但最後一個值除外,它適用於所有後續的跳格。
retab-example
以下範例說明如何使用自動指令和 ":retab" 來編輯以跳格設定為 8 儲存,但以跳格設定為 4 編輯的檔案。警告:字串內的空白可能會變更!另請參閱 'softtabstop' 選項。
:auto BufReadPost        *.xx        retab! 4
:auto BufWritePre        *.xx        retab! 8
:auto BufWritePost        *.xx        retab! 4
:auto BufNewFile        *.xx        set ts=4

5. 複製與移動文字 copy-move

quote
"{register} 為下一個刪除、複製或貼上動作使用 {register}。 使用大寫字元來附加刪除和複製動作。 暫存器 ".", "%", "#" 和 ":" 僅適用於貼上。
:reg :registers :reg[isters] 顯示所有編號和具名暫存器的類型和內容。 如果暫存器是為了 :redir 而寫入,則不會被列出。 類型可以是下列其中之一:「c」代表字元式文字,「l」代表行式文字,「b」代表區塊式視覺文字
:reg[isters] {arg} 顯示 {arg} 中提及的編號和具名暫存器的內容。 例如
:reg 1a
顯示暫存器 '1' 和 'a'。 {arg} 中允許使用空格。
:di :dis :display :di[splay] [arg] 與 :registers 相同。
y yank ["x]y{motion} 複製 {motion} 文字 [到暫存器 x]。 如果沒有要複製的字元(例如,在第一欄中的 "y0"),當 'cpoptions' 包含 'E' 旗標時,會發生錯誤。
yy
["x]yy 複製 [count] 行 [到暫存器 x] 行式
Y
["x]Y 複製 [count] 行 [到暫存器 x](與 yy 同義,行式)。 Y-default
預設對應到 "y$"。 預設對應
zy
["x]zy{motion} 複製 {motion} 文字 [到暫存器 x]。 只有在選取文字區塊時,才與 y 不同,請參閱 v_zy
v_y
{Visual}["x]y 複製醒目提示的文字 [到暫存器 x](關於 {Visual} 請參閱 視覺模式)。
v_Y
{Visual}["x]Y 複製醒目提示的行 [到暫存器 x](關於 {Visual} 請參閱 視覺模式)。
v_zy
{Visual}["x]zy 複製醒目提示的文字 [到暫存器 x]。 選取區塊的每一行結尾的尾隨空白不會被複製。 特別適用於搭配 zp 使用。(關於 {Visual} 請參閱 視覺模式
:y :yank E850 :[range]y[ank] [x] 複製 [range] 行 [到暫存器 x]。
:[range]y[ank] [x] {count} 從 [range] 中最後一個行號開始,複製 {count} 行(預設:目前行 指令列範圍),[到暫存器 x]。
p put E353 E1240 ["x]p 在游標之後貼上 [來自暫存器 x] 的文字 [count] 次。
P
["x]P 在游標之前貼上 [來自暫存器 x] 的文字 [count] 次。
<MiddleMouse>
["x]<MiddleMouse> 在游標之前貼上來自暫存器的文字 [count] 次。 除非另有指定,否則使用 "*" 暫存器。 將游標留在新文字的結尾。 只有當 'mouse' 包含 'n' 或 'a' 時,滑鼠才能使用。 如果您有滾輪且經常意外貼上文字,您可以使用這些對應來停用使用滑鼠中鍵貼上文字的功能
:map <MiddleMouse> <Nop>
:imap <MiddleMouse> <Nop>
您可能也想停用多次點擊的版本,請參閱 雙擊
gp
["x]gp 與 "p" 相同,但將游標留在新文字的後面。
gP
["x]gP 與 "P" 相同,但將游標留在新文字的後面。
:pu :put :[line]pu[t] [x] 在 [line] 之後貼上 [來自暫存器 x] 的文字(預設為目前行)。 這總是 行式運作,因此可以使用此指令將複製的區塊貼為新行。 如果未指定暫存器,則取決於 'cb' 選項:如果 'cb' 包含 "unnamedplus",則從 + 暫存器貼上 quoteplus。 否則,如果 'cb' 包含 "unnamed",則從 * 暫存器貼上 quotestar。 否則,從未命名的暫存器貼上 quote_quote。 暫存器也可以是 '=',後面跟著一個可選的運算式。 運算式會持續到指令結束。 您需要逸出 '|' 和 '"' 字元,以防止它們終止指令。 範例
:put ='path' .. \",/test\"
如果 '=' 後面沒有運算式,Vim 會使用先前的運算式。 您可以使用 ":dis =" 來檢視它。
:[line]pu[t]! [x] 在 [line] 之前貼上 [來自暫存器 x] 的文字(預設為目前行)。
["x]]p 或 ]p ]<MiddleMouse> ["x]]<MiddleMouse> 與 "p" 類似,但會將縮排調整為目前行。 只有當 'mouse' 包含 'n' 或 'a' 時,滑鼠才能使用。
["x][P 或 [P
["x]]P 或 ]P
["x][p 或 [p [<MiddleMouse> ["x][<MiddleMouse> 與 "P" 類似,但會將縮排調整為目前行。 只有當 'mouse' 包含 'n' 或 'a' 時,滑鼠才能使用。
["x]zp 或 zp zP ["x]zP 與 "p" 和 "P" 類似,除了在貼上區塊時不會加上尾隨空格。 因此,插入的文字不一定總是矩形。 特別適用於搭配 v_zy 使用。
您可以使用這些指令來將文字從一個位置複製到另一個位置。 請先使用複製、刪除或變更指令將文字放入暫存器,然後使用貼上指令插入暫存器內容。 您也可以使用這些指令來將文字從一個檔案移動到另一個檔案,因為 Vim 在變更緩衝區時會保留所有暫存器(CTRL-^ 指令是在兩個檔案之間切換的快速方法)。
行式暫存器 字元式暫存器 您可以使用 "." 重複貼上指令(除了 :put),並將它們復原。 如果用來將文字放入暫存器的指令是 行式的,Vim 會在游標所在的行的下方("p")或上方("P")插入文字。 否則,Vim 會在游標之後("p")或之前("P")插入文字。 使用 ":put" 指令時,Vim 總是將文字插入下一行。 您可以使用 "xp" 指令序列來交換兩個字元。 您可以使用 "ddp" 指令序列來交換兩行。 您可以使用 "deep" 指令序列來交換兩個單字(從第一個單字之前的空白處開始游標)。 您可以在貼上指令之後使用 "']" 或 "`]" 指令將游標移動到插入文字的結尾,或是使用 "'[" 或 "`[" 將游標移動到開頭。
視覺模式貼上 v_p v_P 在視覺模式中使用像是 pP 的貼上指令時,Vim 會嘗試將選取的文字替換為暫存器的內容。 這是否能順利運作取決於選取的類型和暫存器中文字的類型。 透過區塊式選取,它也取決於區塊的大小以及角落是否位於現有的字元上。(實作細節:它實際上是先將暫存器放在選取範圍之後,然後刪除選取範圍)。 使用 p 時,先前選取的文字會放入未命名的暫存器(以及可能選取範圍和/或剪貼簿)。 如果您想將該文字放在其他地方,這會很有用。 但您無法重複相同的變更。 使用 P 時,未命名的暫存器不會變更(選取範圍或剪貼簿也不會變更),您可以重複相同的變更。 但無法使用刪除的文字。 如果您確實需要它,您可以使用 p 與另一個暫存器。 例如,複製要複製的文字,以視覺模式選取要取代的文字,然後使用 "0p 。 您可以隨意重複此操作多次,而且每次都會變更未命名的暫存器。 區塊式貼上
當暫存器包含來自一行的文字(字元式)時,使用區塊式視覺選取,貼上該暫存器會在每個選取的行中重複貼上該文字,因此將區塊式選取區域替換為暫存器文字的多個副本。 例如
使用 yw 將單字 "TEXT" 複製到暫存器中
選取視覺區塊,在此文字中以 "v" 標示:aaavvaaa bbbvvbbb cccvvccc
按下 p,結果為:aaaTEXTaaa bbbTEXTbbb cccTEXTccc
區塊式暫存器
如果您使用區塊式視覺模式指令將文字放入暫存器,則文字區塊會插入到目前行和下一行的游標欄之前("P")或之後("p")。 Vim 會讓整個文字區塊在同一欄開始。 因此,插入的文字看起來會與複製或刪除時相同。 Vim 可能會將某些 <Tab> 字元替換為空格,以達到此目的。 然而,如果區塊的寬度不是 <Tab> 寬度的倍數,而且插入區塊之後的文字包含 <Tab>,則該文字可能會對齊錯誤。
使用 zP/|zp| 來貼上區塊式複製的暫存器,而不會附加尾隨空格。
請注意,在字元式複製指令之後,Vim 會將游標留在最接近緩衝區開頭的第一個複製字元上。 這表示 "yl" 不會移動游標,但 "yh" 會將游標向左移動一個字元。 基本原理:在 Vi 中,"y" 指令後接向後移動有時不會將游標移動到第一個複製的字元,因為跳過了重新顯示。 在 Vim 中,它總是會移動到第一個字元,如 Posix 所指定。 使用行式複製指令時,游標會放在第一行,但欄不會被修改,因此它可能不會在第一個複製的字元上。
共有十種類型的暫存器:暫存器 {register} E354 1. 未命名暫存器 "" 2. 10 個編號暫存器 "0 到 "9 3. 小型刪除暫存器 "- 4. 26 個命名暫存器 "a 到 "z 或 "A 到 "Z 5. 三個唯讀暫存器 ":、".、"% 6. 替用緩衝區暫存器 "# 7. 表達式暫存器 "= 8. 選取暫存器 "* 和 "+ 9. 黑洞暫存器 "_ 10. 最後搜尋模式暫存器 "/"
1. 未命名暫存器 "" quote_quote quotequote Vim 會將使用 "d"、"c"、"s"、"x" 命令刪除或使用 "y" 命令複製的文字填入此暫存器,無論是否使用了特定的暫存器(例如 "xdd)。這就像未命名暫存器指向最後使用的暫存器。因此,當使用大寫暫存器名稱附加時,未命名暫存器包含與命名暫存器相同的文字。'_' 暫存器是例外:"_dd 不會在任何暫存器中儲存刪除的文字。Vim 會使用未命名暫存器的內容來執行任何未指定暫存器的貼上命令 (p 或 P)。此外,您可以使用名稱 '"' 來存取它。這表示您必須輸入兩個雙引號。寫入 "" 暫存器會寫入 "0 暫存器。
2. 編號暫存器 "0 到 "9 quote_number quote0 quote1 quote2 quote3 quote4 quote9 Vim 會將來自複製和刪除命令的文字填入這些暫存器。編號暫存器 0 包含最近一次複製命令的文字,除非該命令指定了另一個使用 ["x] 的暫存器。編號暫存器 1 包含最近一次刪除或變更命令刪除的文字(即使該命令指定了另一個暫存器),除非該文字少於一行(則會使用小型刪除暫存器)。對於帶有以下移動命令的刪除運算子,則會例外:%()`/?nN{}。則會總是使用暫存器 "1(這是與 Vi 相容的)。如果刪除動作是在一行之內,則也會使用 "-" 暫存器。請注意,這些字元可能會被對應。例如,% 會被 matchit 外掛程式對應。隨著每次連續的刪除或變更,Vim 會將暫存器 1 的先前內容移到暫存器 2,將 2 移到 3,依此類推,並遺失暫存器 9 的先前內容。
3. 小型刪除暫存器 "- quote_- quote- 此暫存器包含來自刪除少於一行的命令的文字,除非該命令指定了使用 ["x] 的暫存器。
4. 命名暫存器 "a 到 "z 或 "A 到 "Z quote_alpha quotea Vim 僅在您指示時才會填入這些暫存器。將它們指定為小寫字母會取代其先前的內容,或將它們指定為大寫字母會附加到其先前的內容。如果 'cpoptions' 中存在 '>' 旗標,則會在附加文字之前插入換行符號。
5. 唯讀暫存器 ":、". 和 "% 這些是 '%'、':' 和 '.'。您只能將它們與 "p"、"P" 和 ":put" 命令以及 CTRL-R 一起使用。quote_. quote. E29 ". 包含最後插入的文字(與使用插入模式命令 CTRL-ACTRL-@ 插入的文字相同)。請注意:這不適用於命令列上的 CTRL-R。它的運作方式略有不同,像是插入文字而不是貼上文字('textwidth' 和其他選項會影響插入的內容)。quote_% quote% "% 包含目前檔案的名稱。quote_: quote: E30 ": 包含最近執行的命令列。範例:使用 "@:" 來重複先前的命令列命令。命令列只有在至少輸入一個字元時才會儲存在此暫存器中。因此,如果命令完全來自對應,它會保持不變。
quote_# quote# 6. 替用檔案暫存器 "# 包含目前視窗的替用檔案名稱。它會變更 CTRL-^ 命令的運作方式。此暫存器可寫入,主要是為了允許在外掛程式變更它之後還原它。它接受緩衝區編號
let altbuf = bufnr(@#)
...
let @# = altbuf
如果您傳遞緩衝區編號且此緩衝區不存在,它會產生錯誤 E86。它也可以接受與現有緩衝區名稱的符合項
let @# = 'buffer_name'
如果有多個緩衝區與給定的名稱相符,則會發生錯誤 E93,如果沒有任何緩衝區與給定的名稱相符,則會發生 E94
7. 表達式暫存器 "= quote_= quote= @= 這實際上不是儲存文字的暫存器,而是一種在使用暫存器的命令中使用表達式的方法。表達式暫存器是可讀寫的。
在 " 或 CTRL-R 後輸入 '=' 時,游標會移至命令列,您可以在其中輸入任何表達式(請參閱 expression)。所有標準命令列編輯命令都可用,包括表達式的特殊歷程記錄。當您輸入 <CR> 來結束命令列時,Vim 會計算表達式的結果。如果您使用 <Esc> 來結束它,Vim 會放棄表達式。如果您沒有輸入表達式,Vim 會使用先前的表達式(如使用 "/" 命令)。
表達式必須評估為字串。數字會永遠自動轉換為字串。對於 "p" 和 ":put" 命令,如果結果是浮點數,它會轉換為字串。如果結果是清單,每個元素都會轉換為字串並用作一行。字典會轉換為字串。函式參照會導致錯誤訊息(使用 string() 來轉換)。
如果 "= 暫存器用於 "p" 命令,則字串會在 <NL> 字元處分割。如果字串以 <NL> 結尾,則會將其視為逐行暫存器。
8. 選取暫存器 "* 和 "+ 使用這些暫存器來儲存和擷取 GUI 的選取文字。請參閱 quotestarquoteplus。當剪貼簿不可用或無法運作時,則會改為使用未命名暫存器。對於 Unix 系統和 Mac OS X,請參閱 primary-selection
9. 黑洞暫存器 "_ quote_
寫入此暫存器時,不會發生任何事。這可以用來刪除文字而不影響一般暫存器。從此暫存器讀取時,不會傳回任何內容。
10. 最後搜尋模式暫存器 "/" quote_/ quote/ 包含最近的搜尋模式。這用於 "n" 和 'hlsearch'。它可以使用 :let 寫入,您可以變更它以讓 'hlsearch' 反白顯示其他相符項,而無需實際搜尋。您無法複製或刪除到此暫存器中。搜尋方向可在 v:searchforward 中取得。請注意,當從函式傳回時,值會還原 function-search-undo
@/
您可以使用 :let 命令 :let-@ 寫入暫存器。範例
:let @/ = "the"
如果您使用貼上命令而不指定暫存器,Vim 會使用最後填入的暫存器(這也是未命名暫存器的內容)。如果您感到困惑,請使用 :dis 命令來找出 Vim 將會貼上的內容(此命令會顯示所有命名和編號暫存器;未命名暫存器會標記為 '"')。
以下三個命令始終適用於整行。
:[range]co[py] {address} :co :copy 將 [range] 指定的行複製到 {address} 指定的行下方。
:t
:t 複製的同義字。
:[range]m[ove] {address} :m :mo :move E134 將 [range] 指定的行移動到 {address} 指定的行下方。

6. 格式化文字 格式化

:[range]ce[nter] [width] :ce :center 將 [range] 中的行在 [width] 欄之間置中對齊(預設為 'textwidth' 或當 'textwidth' 為 0 時為 80)。
:[range]ri[ght] [width] :ri :right 將 [range] 中的行在 [width] 欄中靠右對齊(預設為 'textwidth' 或當 'textwidth' 為 0 時為 80)。
:le :left :[range]le[ft] [indent] 將 [range] 中的行靠左對齊。將行中的縮排設定為 [indent](預設為 0)。
gq
gq{motion} 格式化 {motion} 移動的行。格式化是使用三種方法之一來完成:1. 如果 'formatexpr' 不為空,則會評估表達式。每個緩衝區可能不同。2. 如果 'formatprg' 不為空,則會使用外部程式。3. 否則會在內部完成格式化。
在第三種情況下,'textwidth' 選項會控制每個格式化行的長度(請參閱下方)。如果 'textwidth' 選項為 0,則格式化行的長度為螢幕寬度(最大寬度為 79)。'formatoptions' 選項會控制格式化的類型 fo-table。游標會保留在最後格式化行的第一個非空白處。注意:"Q" 命令先前執行此功能。如果您仍然想要使用 "Q" 進行格式化,請使用此對應
:nnoremap Q gq
gqgq gqgq gqq gqq 格式化目前行。使用計數來格式化那麼多行。
v_gq
{Visual}gq 格式化反白顯示的文字。(對於 {Visual},請參閱 Visual-mode)。
gw
gw{motion} 格式化 {motion} 移動的行。與 gq 類似,但會將游標放回文字中的相同位置。但是,不會使用 'formatprg''formatexpr'
gwgw gwgw gww gww 使用 "gw" 格式化目前行。
v_gw
{Visual}gw 使用 "gw" 格式化反白顯示的文字。(對於 {Visual},請參閱 Visual-mode)。
範例:若要格式化目前的段落,請使用:gqap
gqap
「gq」指令會將游標留在動作指令將游標移動到的那一行。這允許您使用「.」重複格式化操作。這對於「gqj」(格式化目前行和下一行)和「gq}」(格式化到段落結尾)非常有用。注意:'formatprg'設定時,「gq」會將游標留在第一個格式化的行上(與使用過濾器指令時相同)。
如果您想格式化目前的段落並回到您原本的位置,請使用
gwap
如果您希望段落永遠保持格式化,您可能需要將 'a' 旗標加入'formatoptions'。請參閱自動格式化
如果'autoindent'選項開啟,Vim 會使用第一行的縮排來處理後續的行。
格式化不會變更空行(但會變更只有空白字元的行!)。
當行合併在一起時,會使用'joinspaces'選項。
您可以將'formatexpr'選項設定為一個運算式,或將'formatprg'選項設定為外部程式的名稱,以供 Vim 用於文字格式化。'textwidth'和其他選項對外部程式的格式化沒有影響。
format-formatexpr
'formatexpr'選項可以設定為一個 Vim 腳本函數,該函數會執行緩衝區的重新格式化。這通常應該在ftplugin中進行,因為格式化高度依賴於檔案類型。使用autoload腳本是有意義的,這樣對應的腳本只會在實際需要時載入,並且腳本應該被稱為<filetype>format.vim。
例如,Vim 中 $VIMRUNTIME 目錄中隨附的 XML 檔案類型外掛程式,將'formatexpr'選項設定為
setlocal formatexpr=xmlformat#Format()
這表示您會在以下目錄中找到定義 xmlformat#Format() 函數的對應腳本:$VIMRUNTIME/autoload/xmlformat.vim
以下是一個範例腳本,它會從選取的文字中移除尾隨空白。將其放入您的自動載入目錄中,例如 ~/.vim/autoload/format.vim
func! format#Format()
  " only reformat on explicit gq command
  if mode() != 'n'
    " fall back to Vim's internal reformatting
    return 1
  endif
  let lines = getline(v:lnum, v:lnum + v:count - 1)
  call map(lines, {key, val -> substitute(val, '\s\+$', '', 'g')})
  call setline('.', lines)
  " do not run internal formatter!
  return 0
endfunc
然後,您可以透過執行以下指令啟用格式化
setlocal formatexpr=format#Format()
注意:當從插入模式呼叫時,此函數會明確傳回非零值(基本上表示文字插入超過'textwidth'限制)。這會導致 Vim 回退使用內部格式化器重新格式化文字。
但是,如果使用gq指令重新格式化文字,該函數將接收選取的行,從這些行中修剪尾隨空白,並將它們放回原位。如果您打算將單行分割成多行,請小心不要覆寫任何內容。
如果您想允許從插入或取代模式重新格式化文字,則必須非常小心,因為該函數可能會被遞迴呼叫。對於偵錯,設定'debug'選項會很有幫助。
right-justify
Vim 中沒有指令可以對齊文字。您可以使用外部指令來執行此操作,例如「par」(例如:「!}par」可格式化到段落結尾),或將'formatprg'設定為「par」。
format-comments
註解格式化的概述位於使用者手冊的30.6節。
Vim 可以自動以特殊方式插入和格式化註解。Vim 會透過行首的特定字串來識別註解(忽略空白字元)。可以使用三種類型的註解
一個在每行開頭重複的註解字串。一個範例是 shell 腳本中使用的註解類型,以「#」開頭。
一個僅在第一行出現的註解字串,不在後續行中出現。一個範例是帶有破折號的此清單。
三段式註解,具有起始字串、結束字串,以及中間的可選行。起始、中間和結束字串不同。一個範例是 C 樣式註解
/*
 * this is a C comment
 */
'comments'選項是一個以逗號分隔的部分清單。每個部分定義一種註解字串類型。一個部分包含:{flags}:{string}
{string}是必須出現的文字。
{flags}:n 巢狀註解。允許與混合部分巢狀。如果'comments'為「n:),n:>」,則以「> ) >」開頭的行為註解。
b {string}之後需要空白(<Space><Tab><EOL>)。
f 只有第一行具有註解字串。不要在下一行重複註解,但保留縮排(例如,項目符號清單)。
s 三段式註解的開頭
m 三段式註解的中間
e 三段式註解的結尾
l 左對齊。與 's' 或 'e' 一起使用,起始或結尾的最左側字元將與中間的最左側字元對齊。這是預設值,可以省略。請參閱下文以了解更多詳細資訊。
r 右對齊。與上方相同,但最右側而不是最左側。請參閱下文以了解更多詳細資訊。
O 不要將此註解用於「O」指令。
x 允許三段式註解僅透過在新行上鍵入結束註解字串的最後一個字元作為第一個動作來結束,當中間註解字串已自動插入時。請參閱下文以了解更多詳細資訊。
{digits} 與 's' 或 'e' 一起使用時:將 {digit} 數量的偏移量加入自動插入的中間或結束註解前導符。偏移量從左對齊開始。請參閱下文以了解更多詳細資訊。
-{digits} 類似於 {digits},但減少縮排。這僅在起始或結束部分存在一些可以移除的縮排時才有效。
當字串沒有 'f'、's'、'm' 或 'e' 旗標時,Vim 會假設註解字串在每行開頭重複。旗標欄位可能為空白。
{string} 前後文字中的任何空白字元都是 {string} 的一部分,因此除非空白字元是註解字串的必要部分,否則請勿包含前導或尾隨空白。
當一個註解前導符是另一個註解前導符的一部分時,請在整個註解前導符之後指定該部分。例如,要同時包含「-」和「->」,請使用
:set comments=f:->,f:-
三段式註解必須始終以開始、中間、結束的形式給出,中間沒有其他部分。三段式註解的一個範例是
sr:/*,mb:*,ex:*/
對於 C 註解。為避免將「*ptr」識別為註解,中間字串包含 'b' 旗標。對於三段式註解,Vim 會檢查開始和中間字串之後的文字是否有結束字串。如果 Vim 找到結束字串,則註解不會在下一行繼續。三段式註解必須具有中間字串,因為否則 Vim 無法識別中間行。
請注意上述三段式註解定義中使用了「x」旗標。當您在 C 註解中按下 Return 鍵時,Vim 會為新行插入中間註解前導符:「 * 」。要關閉此註解,您只需在新行上鍵入任何其他內容之前鍵入「/」。這將以結束註解前導符取代中間註解前導符,並套用任何指定的對齊方式,只留下 " */"。無需先按 Backspace 鍵。
當中間部分有符合項時,但也有更長的符合結束部分時,會使用結束部分。這使得 C 樣式註解可以運作,而無需中間部分以空格結尾。
以下是一個範例,說明如何使用對齊旗標來使註解突出顯示(有點像數字 1)。請考慮註解字串
:set comments=sr:/***,m:**,ex-2:******/
                                  /*** ~
                                    **<--right aligned from "r" flag ~
                                    ** ~
offset 2 spaces for the "-2" flag-->** ~
                                  ******/ ~
在這種情況下,先鍵入了第一個註解,然後按了 4 次 return 鍵,然後按了「/」來結束註解。
以下是三部分註解的一些更精細的重點。共有三次會考慮對齊和偏移旗標:在起始註解後開啟新行、在結束註解前開啟新行,以及自動結束三段式註解。結束對齊旗標具有向後透視;結果是與「s」和「e」一起使用相同的對齊旗標將導致起始和結束部分具有相同的縮排。每個註解部分只打算使用一個對齊方式,但偏移量數字會覆寫「r」和「l」旗標。
啟用'cindent'會在許多情況下覆寫對齊旗標。使用不同的方法(如gq=)重新縮排也不會查詢對齊旗標。相同的行為可以在其他格式化選項中定義。一個考量是'cindent'具有用於註解的基於內容縮排的其他選項,但無法複製許多三部分縮排對齊方式。但是,'indentexpr'能夠更好地處理三部分註解。
其他範例
"b:*"        Includes lines starting with "*", but not if the "*" is
             followed by a non-blank.  This avoids a pointer dereference
             like "*str" to be recognized as a comment.
"n:>"        Includes a line starting with ">", ">>", ">>>", etc.
"fb:-"        Format a list that starts with "- ".
預設情況下,會包含「b:#」。這表示以「#include」開頭的行不會被識別為註解行。但是,以「# define」開頭的行會被識別。這是一種折衷方案。
fo-table
您可以使用'formatoptions'選項來影響 Vim 如何格式化文字。'formatoptions'是一個字串,可以包含以下任何字母。您可以以逗號分隔選項字母,以提高可讀性。
字母在'formatoptions'中存在時的含義
fo-t
t 使用'textwidth'自動換行文字fo-c
c 使用'textwidth'自動換行註解,自動插入目前的註解前導符。fo-r
r 在插入模式中按下 <Enter> 後自動插入目前的註解前導符。fo-o
o 在普通模式中按下「o」或「O」後自動插入目前的註解前導符。如果註解在特定位置不需要,請使用 CTRL-U 快速刪除它。i_CTRL-U fo-/
/ 當包含 'o' 時:不要在語句之後為 // 註解插入註解前導符,只有當 // 在行首時才插入。fo-q
q 允許使用「gq」格式化註解。請注意,格式化不會變更空白行或僅包含註解前導符的行。在此類行之後或註解前導符變更時,會開始一個新的段落。fo-w
w 尾隨空白表示段落在下一行繼續。以非空白字元結尾的行會結束段落。fo-a
a 自動格式化段落。每次插入或刪除文字時,都會重新格式化段落。請參閱自動格式化。當存在 'c' 旗標時,這僅針對已識別的註解發生。fo-n
n 格式化文字時,識別編號清單。這實際上使用'formatlistpat'選項,因此可以使用任何類型的清單。數字後的文字縮排用於下一行。預設值是尋找一個數字,後面可選擇跟隨「.」、「:」、「)」、「]」或「}」。請注意,也必須設定'autoindent'。與「2」搭配使用效果不佳。範例
1. the first item
   wraps
2. the second item
fo-2
2 格式化文字時,使用段落第二行的縮排來處理段落的其餘部分,而不是第一行的縮排。這支援第一行的縮排與其餘部分不同的段落。請注意,也必須設定'autoindent'。範例
        first line of a paragraph
second line of the same paragraph
third line.
這在註解內部也有效,忽略註解前導符。fo-v
v 在插入模式中啟用 Vi 相容的自動換行:僅在目前插入指令期間輸入的空白處斷行。(注意:這並非 100% 與 Vi 相容。Vi 在此區域有一些「非預期功能」或錯誤。它使用螢幕欄而非行欄。)fo-b
b 類似於 'v',但僅在輸入的空白位於或在換行邊界之前時才自動換行。如果行在開始插入時長度超過 'textwidth',或在到達 'textwidth' 之前未在插入時輸入空白,Vim 則不會執行自動換行。fo-l
l 長行在插入模式中不會被斷行:當一行在插入指令開始時長度超過 'textwidth',Vim 不會自動格式化它。fo-m
m 也會在超過 255 的多位元組字元處斷行。這對於亞洲文字很有用,其中每個字元本身就是一個單字。fo-M
M 當連接行時,不要在多位元組字元之前或之後插入空格。覆蓋 'B' 標誌。fo-B
B 當連接行時,不要在兩個多位元組字元之間插入空格。被 'M' 標誌覆蓋。fo-1
1 不要在一字單詞後斷行。而是在它之前斷行(如果可能)。fo-]
] 嚴格遵守 'textwidth'。設定此標誌後,除非禁止斷行的規則使其不可能,否則任何行都不能長於 'textwidth'。主要用於 CJK 文字,且僅在 'encoding' 為 "utf-8" 時有效。fo-j
j 在有意義的情況下,連接行時會移除註解開頭。例如,連接
int i; // 索引
// 在列表中
會變成
int i; // 索引在列表中
fo-p
p 不要於句點後面的單一空格處斷行。這是為了配合 'joinspaces'cpo-J,用於句子以兩個空格分隔的散文。例如,'textwidth' 設定為 28
Surely you're joking, Mr. Feynman!
會變成
Surely you're joking,
Mr. Feynman!
而不是
Surely you're joking, Mr.
Feynman!
使用 't' 和 'c' 您可以指定 Vim 何時執行自動換行
值 動作
"" 不自動格式化 (您可以使用 "gq" 進行手動格式化) "t" 自動格式化文字,但不包括註解 "c" 自動格式化註解,但不包括文字(適用於 C 程式碼) "tc" 自動格式化文字和註解
請注意,當 'textwidth' 為 0 時,Vim 不會進行任何自動格式化 (但會根據 'comments' 選項插入註解開頭)。例外情況是存在 'a' 標誌時。自動格式化
請注意,即使 Vim 從不執行自動換行,'textwidth' 也可以是非零的;'textwidth' 對於使用 "gq" 進行格式化仍然有用。
如果 'comments' 選項包含 "/*"、"*" 和/或 "*/",那麼 Vim 會有一些內建功能,可以更聰明地處理這些類型的註解。在 "/*" 或 "*/" 之前或之後開啟新行(如果 'formatoptions' 中存在 'r' 或 'o'),會自動提供正確的行開頭。格式化和自動換行也會發生相同的情況。在以 "/*" 或 "*" 開頭且包含 "*/" 的行之後開啟一行,將不會插入註解開頭,且新行的縮排會取自包含註解開頭的行。例如
/*
 * Your typical comment.
 */
The indent on this line is the same as the start of the above
comment.
所有這些都應該非常酷,特別是結合新的 :autocmd 指令,為不同類型的檔案準備不同的設定。
一些範例:對於 C 程式碼(僅格式化註解)
:set fo=croq
對於郵件/新聞(格式化所有內容,不要使用 "o" 指令開始註解)
:set fo=tcrq
'formatoptions' 中存在 'a' 標誌時,在插入或刪除文字時會自動格式化文字。這對於編輯文字段落非常有用。以下是一些關於如何使用此功能的提示
您需要正確定義段落。最簡單的方法是使用空白行分隔的段落。當沒有分隔的空白行時,請考慮使用 'w' 標誌,並在段落中除了最後一行之外的每一行末尾新增空格。
您可以根據檔案類型 檔案類型 或使用 模式行 針對特定檔案設定 'formatoptions'
'formatoptions' 設定為 "aw2tq" 以製作像這樣的縮排文字
bla bla foobar bla bla foobar bla foobar bla bla bla foobar bla bla foobar bla bla foobar
新增 'c' 標誌以僅自動格式化註解。在原始碼中很有用。
'textwidth' 設定為所需的寬度。如果它為零,則使用 79,如果螢幕較小,則使用螢幕寬度。
還有一些警告
當部分文字未在段落中正確分隔時,對此文字進行變更仍會導致其被格式化。請考慮執行
:set fo-=a
當使用 'w' 標誌(結尾空格表示段落繼續)並使用 dd 刪除段落的最後一行時,該段落將與下一個段落連接。
變更的文字會儲存以供復原。格式化也是一種變更。因此,每個格式化動作都會儲存文字以供復原。這可能會消耗大量記憶體。
格式化長段落和/或具有複雜縮排的段落可能會很慢。

7. 排序文字 排序

Vim 有排序函數和排序命令。排序函數可以在這裡找到:sort()uniq()
:sor :sort :[範圍]sor[t][!] [b][f][i][l][n][o][r][u][x] [/{pattern}/] 排序 [範圍] 中的行。如果未給定範圍,則排序所有行。
使用 [!] 會反轉順序。
使用 [i] 會忽略大小寫。
使用 [l] 排序會使用目前的校對地區設定。實作細節:使用 strcoll() 來比較字串。請參閱 :language 以檢查或設定校對地區設定。範例
:language collate en_US.UTF-8
:%sort l
v:collate 也可用於檢查目前的地區設定。使用地區設定排序通常會忽略大小寫。這在 Mac 上無法正常運作。
選項 [n][f][x][o][b] 是互斥的。
使用 [n] 會根據行中的第一個十進位數字(在 {pattern} 匹配之後或之中)進行排序。數字中包含一個前導 '-'。
使用 [f] 會根據行中的浮點數進行排序。浮點數的值類似於將文字(在 {pattern} 匹配之後或之中)傳遞給 str2float() 函數來決定。
使用 [x] 會根據行中的第一個十六進位數字(在 {pattern} 匹配之後或之中)進行排序。會忽略前導 "0x" 或 "0X"。數字中包含一個前導 '-'。
使用 [o] 會根據行中的第一個八進位數字(在 {pattern} 匹配之後或之中)進行排序。
使用 [b] 會根據行中的第一個二進位數字(在 {pattern} 匹配之後或之中)進行排序。
使用 [u](u 代表唯一),僅保留一系列相同行中的第一行(當使用 [i] 時會忽略大小寫)。若沒有此標誌,則會以原始順序保留一系列相同行。請注意,前導和尾隨的空白可能會導致行有所不同。
當指定 /{pattern}/ 且沒有 [r] 標誌時,會跳過與 {pattern} 匹配的文字,以便您根據匹配後的內容排序。'ignorecase' 適用於模式,但不使用 'smartcase'。可以使用任何非字母代替斜線。例如,要根據以逗號分隔的第二個欄位排序
:sort /[^,]*,/
要根據虛擬欄 10 的文字排序(因此忽略 Tab 和空格之間的差異)
:sort /.*\%10v/
要根據行中的第一個數字排序,無論它前面有什麼
:sort /.\{-}\ze\d/
(說明:".\{-}" 匹配任何文字,"\ze" 設定匹配的結尾,\d 匹配一個數字。)使用 [r],會根據匹配的 {pattern} 而不是像上面所述跳過它來進行排序。例如,要僅根據每一行的前三個字母排序
:sort /\a\a\a/ r
如果使用 {pattern},任何沒有 {pattern} 匹配的行都會以目前的順序保留,但與匹配 {pattern} 的行分開。如果您以相反的順序排序,它們會在排序後的行之後以相反的順序出現,否則它們會在排序後的行之前以原始順序出現。
如果 {pattern} 為空(例如,指定 //),則使用最後一個搜尋模式。這可以先試用模式。
請注意,將 :sort:global 一起使用不會排序匹配的行,這完全沒用。
除非使用 l 標誌,否則 :sort 不會使用目前的地區設定。Vim 會執行「穩定」排序。
排序可以中斷,但如果您在處理過程中太晚中斷它,您可能會得到重複的行。這也取決於使用的系統函式庫函式。
主要
指令索引
快速參考