插入

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


插入模式 插入和取代文字 mode-ins-repl
本檔案的大部分內容是關於插入和取代模式。最後是一些以其他方式插入文字的命令。
最常用的命令概述可以在使用者手冊的第 24 章 usr_24.txt 中找到。
另請參閱 'virtualedit',將游標移動到沒有字元的位置。對於編輯表格很有用。

1. 特殊按鍵 ins-special-keys

在插入和取代模式下,以下字元具有特殊含義;其他字元直接插入。要將這些特殊字元之一插入緩衝區,請在其前面加上 CTRL-V。要插入 <Nul> 字元,請使用 "CTRL-V CTRL-@" 或 "CTRL-V 000"。在某些系統上,您必須使用 "CTRL-V 003" 來插入 CTRL-C注意:CTRL-V 被映射時,您通常可以使用 CTRL-Q 來代替 i_CTRL-Q
如果您在插入文字時正在使用特殊的語言模式,請參閱 'langmap' 選項,'langmap',瞭解如何避免一直開啟和關閉此模式。
字元 動作
<Esc>CTRL-[ 結束插入或取代模式,返回到普通模式。完成縮寫。注意:如果您的 <Esc> 鍵很難按到,請嘗試使用 CTRL-[ 代替。i_META i_ALT ALT (META) 如果該組合鍵沒有被映射,則可能像 <Esc> 一樣。例如,如果 <A-x> 沒有插入模式映射,則 <A-x> 的行為就像 <Esc>x。i_CTRL-C
CTRL-C 退出插入模式,返回到普通模式。不檢查縮寫。不觸發 InsertLeave 自動指令事件。
i_CTRL-@
CTRL-@ 插入先前插入的文字並停止插入。
i_CTRL-A
CTRL-A 插入先前插入的文字。
i_CTRL-H i_<BS> i_BS <BS>CTRL-H 刪除游標之前的字元(有關連接行的資訊,請參閱 i_backspacing)。i_<Del> i_DEL <Del> 刪除游標下的字元。如果游標位於行尾,並且 'backspace' 選項包含 "eol"(預設值),則刪除 <EOL>;下一行附加到目前行之後。i_CTRL-W
CTRL-W 刪除游標之前的單字(有關連接行的資訊,請參閱 i_backspacing)。有關單字的定義,請參閱 "單字移動" 章節,word-motionsi_CTRL-W-default
預設情況下,在刪除之前設定一個新的還原點。default-mappings i_CTRL-U
CTRL-U 刪除目前行中游標之前輸入的所有字元。如果沒有新輸入的字元,並且 'backspace' 不為空,則刪除目前行中游標之前的所有字元。如果啟用了 C 縮排,則如果該行變成空白,則將調整縮排。有關連接行的資訊,請參閱 i_backspacingi_CTRL-U-default
預設情況下,在刪除之前設定一個新的還原點。default-mappings i_CTRL-I i_<Tab> i_Tab <Tab>CTRL-I 插入一個製表符。如果開啟 'expandtab' 選項,則插入等效數量的空格(使用 CTRL-V <Tab> 避免展開;如果 CTRL-V 被映射,則使用 CTRL-Q <Tab> i_CTRL-Q)。另請參閱 'smarttab' 選項和 ins-expandtabi_CTRL-J i_<NL> <NL>CTRL-J 開始新的一行。i_CTRL-M i_<CR> <CR>CTRL-M 開始新的一行。i_CTRL-K
CTRL-K {char1} [char2] 輸入二合字母(請參閱 digraphs)。當 {char1} 是特殊鍵時,該鍵的程式碼以 <> 形式插入。例如,字串 "<S-Space>" 可以透過輸入 <C-K><S-Space>(兩個鍵)來輸入。兩個字元都不會被視為映射。
CTRL-N 尋找下一個關鍵字(請參閱 i_CTRL-N)。CTRL-P 尋找上一個關鍵字(請參閱 i_CTRL-P)。
CTRL-R {register} i_CTRL-R
插入暫存器的內容。在輸入 CTRL-R 和第二個字元之間,將顯示 '"',表示您需要輸入暫存器的名稱。文字的插入方式就像您輸入的一樣,但不使用映射和縮寫。如果您設定了 'textwidth''formatoptions''autoindent' 等選項,則會影響將要插入的內容。這與 "p" 命令和使用滑鼠貼上的情況不同。特殊暫存器:'"' 未命名的暫存器,包含上次刪除或複製的文字 '%' 目前檔案名稱 '#' 備用檔案名稱 "*" 剪貼簿內容(X11:主要選取)'+' 剪貼簿內容 '/' 上次搜尋模式 ':' 上次命令列 '.' 上次插入的文字 i_CTRL-R_-
'-' 上次小的(小於一行的)刪除暫存器。這可以使用 . 重複,因為它會記住要放置的暫存器,而不是要插入的文字。i_CTRL-R_=
'=' 表達式暫存器:系統會提示您輸入表達式(請參閱 expression)請注意,0x80(十進制 128)用於特殊鍵。例如,您可以使用它向上移動游標:CTRL-R ="\<Up>" 使用 CTRL-R CTRL-R 以文字方式插入文字。當結果為 List 時,這些項目會用作行。它們也可以包含換行符號。當結果為浮點數時,它會自動轉換為字串。當調用 append() 或 setline() 時,還原序列將被中斷。有關暫存器的資訊,請參閱 registers
CTRL-R CTRL-R {register} i_CTRL-R_CTRL-R
插入暫存器的內容。工作方式與使用單個 CTRL-R 類似,但文字以文字方式插入,而不是像輸入的一樣。當暫存器包含 <BS> 等字元時,此行為會有差異。例如,暫存器 a 包含 "ab^Hc"
CTRL-R a                results in "ac".
CTRL-R CTRL-R a                results in "ab^Hc".
'textwidth''formatoptions' 等選項仍然適用。如果您也想避免這些,請使用 CTRL-R CTRL-O,請參閱下文。'.' 暫存器(上次插入的文字)仍然像輸入一樣插入。執行此命令後,'.' 暫存器包含來自暫存器的文字,就像它是透過輸入插入的一樣。
CTRL-R CTRL-O {register} i_CTRL-R_CTRL-O
以文字方式插入暫存器的內容,並且不自動縮排。與使用滑鼠貼上 <MiddleMouse> 的效果相同。當暫存器是行式時,這會在目前行的上方插入文字,就像使用 P 一樣。'.' 暫存器(上次插入的文字)仍然像輸入一樣插入。執行此命令後,'.' 暫存器包含輸入的命令,而不是文字。也就是說,文字 "^R^O",而不是來自暫存器的文字。在 取代模式 中不取代字元!
CTRL-R CTRL-P {register} i_CTRL-R_CTRL-P
以文字方式插入暫存器的內容,並修正縮排,就像 [<MiddleMouse> 一樣。'.' 暫存器(上次插入的文字)仍然像輸入一樣插入。執行此命令後,'.' 暫存器包含輸入的命令,而不是文字。也就是說,文字 "^R^P",而不是來自暫存器的文字。在 取代模式 中不取代字元!
i_CTRL-T
CTRL-T 在目前行的開頭插入一個 shiftwidth 的縮排。縮排始終捨入到 'shiftwidth'i_CTRL-D
CTRL-D 刪除目前行開頭的一個 shiftwidth 的縮排。縮排始終捨入到 'shiftwidth'
i_0_CTRL-D
0 CTRL-D 刪除目前行中的所有縮排。
i_^_CTRL-D
^ CTRL-D 刪除目前行中的所有縮排。縮排將在下一行中還原。這在插入標籤時很有用。
i_CTRL-V
CTRL-V 以文字方式插入下一個非數字。也可以輸入字元的十進制、八進制或十六進制值 i_CTRL-V_digitCTRL-V 之後輸入的字元不會被視為映射。對於特殊鍵,CTRL 修飾符可以包含在按鍵中,以產生控制字元。如果該鍵沒有控制字元,則插入其 按鍵標記法注意:CTRL-V 被映射(例如,用於貼上文字)時,您通常可以使用 CTRL-Q 來代替 i_CTRL-Q
i_CTRL-Q
CTRL-Q 與 CTRL-V 相同。注意:某些終端連線可能會吃掉 CTRL-Q,它就無法工作。它在 GUI 中可以正常工作。

CTRL-SHIFT-V i_CTRL-SHIFT-V i_CTRL-SHIFT-Q

CTRL-SHIFT-Q 的工作方式與 CTRL-V 相同,但不要嘗試將 CTRL 修飾符包含在按鍵中。
CTRL-X 進入 CTRL-X 模式。這是一個子模式,可以在其中使用命令來完成單字或捲動視窗。請參閱 i_CTRL-Xins-completion
i_CTRL-E
CTRL-E 插入游標下方的字元。i_CTRL-Y
CTRL-Y 插入游標上方的字元。請注意,對於 CTRL-ECTRL-Y,不會使用 'textwidth',以便能夠從長行複製字元。
i_CTRL-_
CTRL-_ 透過切換 'revins' 來切換插入方向。
CTRL-_ 將游標移動到輸入文字的末尾。
僅當設定了 'allowrevins' 選項時,此命令才可用。有關從右到左模式的更多資訊,請參閱 rileft.txt
i_CTRL-^
CTRL-^ 切換使用輸入語言字元。當定義了語言 :lmap 映射時
如果 'iminsert' 為 1(使用 langmap 映射),則其變為 0(不使用 langmap 映射)。
如果 'iminsert' 具有其他值,則其變為 1,因此啟用 langmap 映射。當未定義任何語言映射時
如果 'iminsert' 為 2(使用輸入法),則其變為 0(不使用輸入法)。
如果 'iminsert' 有其他值,則會變成 2,因此會啟用輸入法。當設定為 1 時,狀態列中會顯示 "b:keymap_name" 變數的值、'keymap' 選項或 "<lang>"。語言對應通常用於輸入與鍵盤產生不同的字元。 'keymap' 選項可以用來安裝大量的語言對應。
i_CTRL-]
CTRL-] 觸發縮寫,不插入字元。
i_<Insert>
<Insert> 在插入模式和取代模式之間切換。
<BS>CTRL-WCTRL-U 的效果取決於 'backspace' 選項(除非設定了 'revins')。這是一個以逗號分隔的項目列表
項目 動作
indent 允許退格鍵移除自動縮排 eol 允許退格鍵移除行尾 (合併行) start 允許退格鍵移除插入的起始位置;CTRL-WCTRL-U 會在起始位置停止
'backspace' 為空時,會使用 Vi 相容的退格鍵行為。您無法退格移除自動縮排、第一欄之前的內容或插入開始之前的位置。
為了向後相容,也允許使用 "0"、"1"、"2" 和 "3" 的值,請參閱 'backspace'
如果 'backspace' 選項包含 "eol",且當使用三個按鍵之一時,游標位於第一欄,則會將目前行與前一行合併。這實際上會刪除游標前面的 <EOL>
i_CTRL-V_digit
使用 CTRL-V 可以直接輸入字元的十進位、八進位或十六進位值。這樣您就可以輸入任何字元,除了換行符號(<NL>,值為 10)。有五種輸入字元值的方法
第一個字元 模式 最大字元數 最大值
(無) 十進位 3 255 o 或 O 八進位 3 377 (255) x 或 X 十六進位 2 ff (255) u 十六進位 4 ffff (65535) U 十六進位 8 7fffffff (2147483647)
通常您會輸入最大字元數。因此,要輸入一個空格(值為 32),您會輸入 <C-V>032。您可以省略開頭的零,在這種情況下,數字後輸入的字元必須是非數字。其他模式也是如此:一旦您輸入對該模式無效的字元,就會使用它之前的值,並以正常方式處理「無效」字元。
如果您輸入的值為 10,它最終會以 0 的形式出現在檔案中。10 是 <NL>,在內部用於表示 <Nul> 字元。當將緩衝區寫入檔案時,<NL> 字元會被轉換為 <Nul><NL> 字元會寫在每一行的末尾。因此,如果您想在檔案中插入 <NL> 字元,您必須換行。另請參閱 'fileformat'
i_CTRL-X insert_expand CTRL-X 會進入子模式,可以使用幾個命令。這些命令大多用於關鍵字完成;請參閱 ins-completion
可以使用兩個命令向上或向下捲動視窗,而無需退出插入模式
i_CTRL-X_CTRL-E
CTRL-X CTRL-E 將視窗向上捲動一行。當進行完成時,請查看這裡: complete_CTRL-E
i_CTRL-X_CTRL-Y
CTRL-X CTRL-Y 將視窗向下捲動一行。當進行完成時,請查看這裡: complete_CTRL-Y
按下 CTRL-X 後,每個 CTRL-E (CTRL-Y) 都會將視窗向上(向下)捲動一行,除非這會導致游標從檔案中的目前位置移動。一旦按下另一個按鍵,就會退出 CTRL-X 模式,並將該按鍵視為在插入模式中解釋。

2. 特殊按鍵 ins-special-special

以下按鍵是特殊的。它們會停止目前的插入操作、執行某些操作,然後重新開始插入。這表示您可以在不退出插入模式的情況下執行某些操作。如果您喜歡一直使用插入模式,就像沒有單獨的普通模式的編輯器一樣,這非常方便。如果您想將功能鍵對應到命令,可以使用 CTRL-O
這些按鍵之前和之後的變更(插入或刪除的字元)可以單獨取消。只有最後一個變更可以重做,並且永遠像 "i" 命令一樣運作。
字元 動作

<Up> 游標向上移動一行 i_<Up>

<Down> 游標向下移動一行 i_<Down>
CTRL-G <Up> 游標向上移動一行,插入起始欄位 i_CTRL-G_<Up>
CTRL-G k 游標向上移動一行,插入起始欄位 i_CTRL-G_k
CTRL-G CTRL-K 游標向上移動一行,插入起始欄位 i_CTRL-G_CTRL-K
CTRL-G <Down> 游標向下移動一行,插入起始欄位 i_CTRL-G_<Down> CTRL-G j 游標向下移動一行,插入起始欄位 i_CTRL-G_j CTRL-G CTRL-J 游標向下移動一行,插入起始欄位 i_CTRL-G_CTRL-J <Left> 游標向左移動一個字元 i_<Left>
<Right> 游標向右移動一個字元 i_<Right>
<S-Left> 游標向後移動一個單字(如 "b" 命令) i_<S-Left>
<C-Left> 游標向後移動一個單字(如 "b" 命令) i_<C-Left>
<S-Right> 游標向前移動一個單字(如 "w" 命令) i_<S-Right> <C-Right> 游標向前移動一個單字(如 "w" 命令) i_<C-Right> <Home> 游標移動到該行的第一個字元 i_<Home>
<End> 游標移動到該行的最後一個字元之後 i_<End>
<C-Home> 游標移動到檔案中的第一個字元 i_<C-Home>
<C-End> 游標移動到檔案中的最後一個字元之後 i_<C-End>
<LeftMouse> 游標移動到滑鼠點擊的位置 i_<LeftMouse>
<S-Up> 將視窗向上移動一頁 i_<S-Up>
<PageUp> 將視窗向上移動一頁 i_<PageUp>
<S-Down> 將視窗向下移動一頁 i_<S-Down>
<PageDown> 將視窗向下移動一頁 i_<PageDown>
<ScrollWheelDown> 將視窗向下移動三行 i_<ScrollWheelDown> <S-ScrollWheelDown> 將視窗向下移動一頁 i_<S-ScrollWheelDown>
<ScrollWheelUp> 將視窗向上移動三行 i_<ScrollWheelUp>
<S-ScrollWheelUp> 將視窗向上移動一頁 i_<S-ScrollWheelUp>
<ScrollWheelLeft> 將視窗向左移動六欄 i_<ScrollWheelLeft> <S-ScrollWheelLeft> 將視窗向左移動一頁 i_<S-ScrollWheelLeft>
<ScrollWheelRight> 將視窗向右移動六欄 i_<ScrollWheelRight> <S-ScrollWheelRight> 將視窗向右移動一頁 i_<S-ScrollWheelRight>
CTRL-O 執行一個命令,返回插入模式 i_CTRL-O CTRL-\ CTRL-O 類似於 CTRL-O,但不移動游標 i_CTRL-\_CTRL-O
CTRL-G u 關閉復原序列,開始新的變更 i_CTRL-G_u
CTRL-G U 不會以接下來的 i_CTRL-G_U 左右游標移動開始新的復原區塊,如果游標保持在同一行內
CTRL-O 命令有時會有副作用:如果游標超出該行的末尾,它將會被放置在該行的最後一個字元上。在對應中,最好使用 <Esc> (先在文字中放置一個 "x",然後 <Esc> 將永遠把游標放在上面)。或者使用 CTRL-\ CTRL-O,但請注意游標可能超出該行的末尾。請注意,CTRL-\ CTRL-O 後面的命令仍然可以移動游標,它不會恢復到其原始位置。
CTRL-O 命令會將您帶到普通模式。如果您然後使用命令再次進入插入模式,它通常不會巢狀。因此,當輸入 "a<C-O>a" 然後 <Esc> 將您帶回普通模式時,您不需要鍵入兩次 <Esc>。例外情況是當不鍵入命令時,例如,當執行對應或來源腳本時。這使得簡短切換到插入模式的對應能夠正常工作。
並非所有終端機都提供 Shift 修飾的游標鍵。
另一個副作用是,在 "i" 或 "a" 命令之前指定的計數會被忽略。這是因為在 CTRL-O 之後重複命令的效果太複雜了。
使用 CTRL-G u 的範例
:inoremap <C-H> <C-G>u<C-H>
這會重新定義退格鍵以開始一個新的復原序列。現在您可以使用 CTRL-O u 來復原退格鍵的效果,而不會改變您之前輸入的內容。另一個範例
:inoremap <CR> <C-]><C-G>u<CR>
這會在每個換行符號處開始一個新的復原區塊。它也會在此之前展開縮寫。
使用 CTRL-G U 的範例
inoremap <Left>  <C-G>U<Left>
inoremap <Right> <C-G>U<Right>
inoremap <expr> <Home> col('.') == match(getline('.'), '\S') + 1 ?
 \ repeat('<C-G>U<Left>', col('.') - 1) :
 \ (col('.') < match(getline('.'), '\S') ?
 \     repeat('<C-G>U<Right>', match(getline('.'), '\S') + 0) :
 \     repeat('<C-G>U<Left>', col('.') - 1 - match(getline('.'), '\S')))
inoremap <expr> <End> repeat('<C-G>U<Right>', col('$') - col('.'))
inoremap ( ()<C-G>U<Left>
這使得在插入模式中使用游標鍵成為可能,而不會開始新的復原區塊,因此使用 . (重做) 將會如預期般運作。此外,輸入像這樣的文字(使用上面"("的映射)
Lorem ipsum (dolor
將可以使用 . 重複到預期的
Lorem ipsum (dolor)
使用 CTRL-O 會分割復原:它之前和之後輸入的文字會分別復原。如果您想要避免這種情況(例如,在映射中),您或許可以使用 CTRL-R = i_CTRL-R。例如,呼叫函數
:imap <F2> <C-R>=MyFunc()<CR>
'whichwrap' 選項設定適當後,在該行第一個/最後一個字元上的 <Left><Right> 鍵會使游標換行至上一行/下一行。
CTRL-G j 和 CTRL-G k 命令可用於在欄位前方插入文字。範例
int i;
int j;
將游標定位在第一個 "int" 上,輸入 "istatic <C-G>j "。結果是
static int i;
       int j;
當在每一行的欄位前方插入相同的文字時,請使用視覺區塊命令 "I" v_b_I
'textwidth' 選項可用於在行太長之前自動換行。將 'textwidth' 選項設定為所需的最大行長度。如果您然後輸入更多字元(非空格或 Tab),最後一個字將會放在新的一行(除非它是該行唯一的字)。如果您將 'textwidth' 設定為 0,則此功能將會停用。
'wrapmargin' 選項的功能幾乎相同。不同之處在於 'textwidth' 具有固定寬度,而 'wrapmargin' 則取決於螢幕的寬度。當使用 'wrapmargin' 時,這相當於使用 'textwidth',其值等於 (欄數 - 'wrapmargin'),其中欄數是螢幕的寬度。
'textwidth''wrapmargin' 皆設定時,會使用 'textwidth'
如果您不希望真的換行,而是想要在方便的位置查看換行的行,請參閱 'linebreak' 選項。
只有在使用插入模式或附加到行時,才會自動換行。當處於取代模式且行長度未變更時,該行將不會換行。
如果在邊界之後輸入非空白字元,則長行會被換行。可以透過將字元新增到 'formatoptions' 選項來限制換行的情況:"l" 只有當行長度在插入開始時不超過 'textwidth' 時才會換行。"v" 僅在目前插入命令期間輸入的空白字元處換行。這主要與 Vi 相容。"lv" 只有當行長度在插入開始時不超過 'textwidth' 且僅在目前插入命令期間輸入的空白字元處換行。只有在跨越 'textwidth' 邊界時輸入非空白字元時,才與 "l" 不同。
通常,會使用內部函數來決定在哪裡換行。如果您想要以不同的方式執行此操作,請將 'formatexpr' 選項設定為將處理換行的表達式。
如果您想要格式化文字區塊,可以使用 "gq" 運算符。輸入 "gq" 和移動命令,將游標移動到區塊的末尾。在許多情況下,命令 "gq}" 會執行您想要的操作(格式化到段落結尾)。或者,您可以使用 "gqap",它將格式化整個段落,無論游標目前在哪裡。或者,您可以使用視覺模式:按 "v",移動到區塊的末尾,然後輸入 "gq"。另請參閱 gq
如果 'expandtab' 選項開啟,則會使用空格來填滿 Tab 的空白量。如果您想要輸入真正的 <Tab>,請先輸入 CTRL-V(當 CTRL-V 被映射時,請使用 CTRL-Q i_CTRL-Q)。預設情況下,'expandtab' 選項是關閉的。請注意,在取代模式下,單個字元會被多個空格取代。這樣做的結果是該行中的字元數會增加。退格鍵會一次刪除一個空格。只有在您退格刪除的空格 (最後一個) 時,才會放回原始字元。
ins-smarttab
'smarttab' 選項開啟時,<Tab> 會在行的開頭插入 'shiftwidth' 個位置,並在其他位置插入 'tabstop' 個位置。這表示通常會插入空格而不是 <Tab> 字元。當 'smarttab' 關閉時,<Tab> 總是插入 'tabstop' 個位置,而 'shiftwidth' 僅用於 ">>" 等。
ins-softtabstop
'softtabstop' 選項為非零時,<Tab> 會插入 'softtabstop' 個位置,而用於刪除空白的 <BS> 會刪除 'softtabstop' 個位置。這感覺像是將 'tabstop' 設定為 'softtabstop',但真正的 <Tab> 字元仍然佔用 'tabstop' 個位置,因此您的檔案在其他應用程式使用時仍然看起來正確。
如果 'softtabstop' 為非零,則 <BS> 將嘗試刪除盡可能多的空白,以移動到上一個 'softtabstop' 位置,除非先前插入的字元是空格,否則它只會刪除游標之前的字元。否則,您無法始終刪除游標之前的單個字元。您必須先刪除 'softtabstop' 個字元,然後輸入額外的空格才能到達您想要的位置。
使用正常模式中的 "R" 命令進入取代模式。
在取代模式中,您輸入的每個字元都會刪除該行中的一個字元。如果沒有要刪除的字元(在行尾),則會附加輸入的字元(如在插入模式中)。因此,行中的字元數保持不變,直到您到達行尾。如果輸入 <NL>,則會插入換行符號,且不會刪除任何字元。
請小心使用 <Tab> 字元。如果您在其位置輸入正常的列印字元,則字元數仍然相同,但欄數會變小。
如果您在取代模式下刪除字元(使用 <BS>CTRL-WCTRL-U),會發生的情況是您會刪除變更。被取代的字元會還原。如果您已輸入超過現有文字,則您新增的字元會被刪除。這實際上是一個字元接字元的復原。
如果 'expandtab' 選項開啟,則 <Tab> 會將一個字元取代為多個空格。這樣做的結果是該行中的字元數會增加。退格鍵會一次刪除一個空格。只有在您退格刪除的空格 (最後一個) 時,才會放回原始字元。

6. 虛擬取代模式 vreplace-mode Virtual-Replace-mode

使用正常模式中的 "gR" 命令進入虛擬取代模式。
虛擬取代模式與取代模式類似,但您不是取代檔案中的實際字元,而是取代螢幕上的實際空間,因此檔案中更後面的字元永遠不會看起來移動。
因此,如果您輸入 <Tab>,它可能會取代數個正常字元,而如果您在 <Tab> 的頂端輸入字母,則可能根本不會取代任何內容,因為 <Tab> 仍會與之前的位置對齊。
輸入 <NL> 仍然不會導致檔案中較後面的字元看起來移動。目前行的其餘部分將被 <NL> 取代(也就是說,它們被刪除),並且取代會繼續在下一行上進行。除非您超出檔案結尾,否則不會插入新行。
當使用 CTRL-TCTRL-D 時,會看到有趣的效果。游標之前的字元會像往常一樣橫向移動,但該行中較後面的字元仍然保持靜止。CTRL-T 會將部分舊行隱藏在移動的字元下方,但 CTRL-D 會再次顯示它們。
與取代模式一樣,使用 <BS> 等會還原被取代的字元。這仍然與 'smartindent'CTRL-T 和 CTRL-D、'expandtab''smarttab''softtabstop' 等結合使用。
'list' 模式中,虛擬取代模式的行為就像它不在 'list' 模式中一樣,除非 "L" 在 'cpoptions' 中。
請注意,應該使游標之外的字元看起來移動的唯一情況是在清單模式 'list' 中,以及偶爾在設定 'wrap' 時(且行長度變更為比螢幕寬度更短或更寬)。在其他情況下,可能會插入空格以避免後續字元移動。
此模式對於編輯表格中以 <Tab> 分隔的欄位非常有用,以便在保持所有欄位對齊的情況下輸入新資料。

7. 插入模式完成 ins-completion

在插入和取代模式中,有幾個命令可以完成已輸入的關鍵字或行的一部分。如果您使用複雜的關鍵字(例如,帶有大寫字母和底線的函數名稱),這會很有用。
可以完成以下項目的完成
1. 整行 i_CTRL-X_CTRL-L 2. 目前檔案中的關鍵字 i_CTRL-X_CTRL-N 3. 'dictionary' 中的關鍵字 i_CTRL-X_CTRL-K 4. 'thesaurus' 中的關鍵字,同義詞庫風格 i_CTRL-X_CTRL-T 5. 目前和包含檔案中的關鍵字 i_CTRL-X_CTRL-I 6. 標籤 i_CTRL-X_CTRL-] 7. 檔案名稱 i_CTRL-X_CTRL-F 8. 定義或巨集 i_CTRL-X_CTRL-D 9. Vim 命令列 i_CTRL-X_CTRL-V 10. 使用者定義的補全 i_CTRL-X_CTRL-U 11. 全方位補全 i_CTRL-X_CTRL-O 12. 拼寫建議 i_CTRL-X_s 13. 'complete' 中的關鍵字 i_CTRL-N i_CTRL-P
此外,i_CTRL-X_CTRL-Z 會停止補全,但不變更文字。
除了 CTRL-NCTRL-P 之外,所有這些都在 CTRL-X 模式下完成。這是插入和取代模式的子模式。輸入 CTRL-X 並加上其中一個 CTRL-X 命令,即可進入 CTRL-X 模式。輸入非有效的 CTRL-X 模式命令的按鍵,即可離開 CTRL-X 模式。有效的按鍵是 CTRL-X 命令本身、CTRL-N(下一個)和 CTRL-P(上一個)。
若要取得目前的補全資訊,可以使用 complete_info()。如果您想調整匹配項的大小寫,另請參閱 'infercase' 選項。
complete_CTRL-E
當補全處於啟用狀態時,您可以使用 CTRL-E 來停止補全並返回原始輸入的文字。CTRL-E 不會被插入。
complete_CTRL-Y
當彈出式選單顯示時,您可以使用 CTRL-Y 來停止補全,並接受目前選取的項目。CTRL-Y 不會被插入。輸入空格、Enter 或其他一些不可列印的字元將會離開補全模式,並插入輸入的字元。
當彈出式選單顯示時,還有一些其他的特殊按鍵,請參閱 popupmenu-keys
注意:CTRL-X 模式下有效的按鍵不會被映射。這使得 :map <C-F> <C-X><C-F> 可以運作。結束 CTRL-X 模式的按鍵(任何非有效的 CTRL-X 模式命令的按鍵)會被映射。此外,使用 'complete' 進行補全時,映射會照常套用。
E565
注意:當補全處於啟用狀態時,無法遞迴使用插入模式,且無法變更緩衝區文字。以某種方式調用 ":normal i.." 的映射將會產生 E565 錯誤。
建議使用以下映射,以讓輸入補全命令更加容易(儘管它們會隱藏其他命令)
:inoremap <C-]> <C-X><C-]>
:inoremap <C-F> <C-X><C-F>
:inoremap <C-D> <C-X><C-D>
:inoremap <C-L> <C-X><C-L>
作為一種特殊情況,輸入 CTRL-R 來執行暫存器插入(請參閱 i_CTRL-R)不會退出 CTRL-X 模式。這主要是為了允許使用 '=' 暫存器來調用一些函數,以確定下一個操作。如果暫存器的內容(或 '=' 暫存器求值的結果)不是有效的 CTRL-X 模式按鍵,那麼 CTRL-X 模式將會退出,如同已輸入這些按鍵一樣。
例如,以下程式碼會將 <Tab> 映射為:如果目前行目前只有空白字元,則實際插入 <Tab>;或者開始/繼續 CTRL-N 補全操作
function! CleverTab()
   if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
      return "\<Tab>"
   else
      return "\<C-N>"
   endif
endfunction
inoremap <Tab> <C-R>=CleverTab()<CR>
補全整行 compl-whole-line
i_CTRL-X_CTRL-L
CTRL-X CTRL-L 向後搜尋以與游標前目前行開頭字元相同的字元開頭的行。會忽略縮排。匹配的行會插入到游標之前。'complete' 選項用於決定要搜尋哪些緩衝區以尋找匹配項。會使用已載入和未載入的緩衝區。CTRL-LCTRL-P 向後搜尋下一個匹配行。此行會取代先前的匹配行。
CTRL-N 向前搜尋下一個匹配行。此行會取代先前的匹配行。
CTRL-X CTRL-L 在展開一行之後,您可以透過再次輸入 CTRL-X CTRL-L 來取得它旁邊的行,除非使用了雙 CTRL-X。僅適用於已載入的緩衝區。
補全目前檔案中的關鍵字 compl-current
i_CTRL-X_CTRL-P
i_CTRL-X_CTRL-N
CTRL-X CTRL-N 向前搜尋以游標前的關鍵字開頭的單字。找到的關鍵字會插入到游標之前。
CTRL-X CTRL-P 向後搜尋以游標前的關鍵字開頭的單字。找到的關鍵字會插入到游標之前。
CTRL-N 向前搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-P 向後搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-X CTRL-NCTRL-X CTRL-P 除非使用了雙 CTRL-X,否則進一步使用 CTRL-X CTRL-NCTRL-X CTRL-P 將會在其他內容中複製先前展開後面的單字。
如果游標前有關鍵字(由字母字元和 'iskeyword' 中的字元組成的名稱),則會將其用作搜尋模式,並在前面加上 "\<"(表示:單字的開頭)。否則,會使用 "\<\k\k" 作為搜尋模式(至少兩個字元的任何關鍵字的開頭)。
在取代模式中,取代的字元數取決於匹配字串的長度。這就像在取代模式中輸入匹配字串的字元一樣。
如果游標前沒有有效的關鍵字元,則會匹配至少兩個字元的任何關鍵字。例如,若要取得:printf("(%g, %g, %g)", vector[0], vector[1], vector[2]); 只要輸入:printf("(%g, %g, %g)", vector[0], ^P[1], ^P[2]);
搜尋會在檔案末尾環繞,這裡不會使用 'wrapscan' 的值。
會跳過同一補全項的多個重複項目;因此,每個 CTRL-NCTRL-P 都會插入不同的匹配項(除非只有一個匹配的關鍵字)。
永遠不會包含單個字元匹配項,因為它們通常只會妨礙您真正需要的內容。例如,若要取得:printf("name = %s\n", name); 只要輸入:printf("name = %s\n", n^P); 甚至:printf("name = %s\n", ^P); '\n' 中的 'n' 會被跳過。
展開一個單字後,您可以使用 CTRL-X CTRL-PCTRL-X CTRL-N 來取得其他內容中展開後面的單字。這些序列會搜尋剛展開的文字,並透過取得額外的單字來進一步展開。如果您需要重複一系列複雜的單字,這會很有用。儘管 CTRL-PCTRL-N 只會尋找至少兩個字元的字串,但 CTRL-X CTRL-P 和 CTRL-X CTRL-N 可用於展開僅一個字元的單字。例如,若要取得:M&eacute;xico,您可以輸入:M^N^P^X^P^X^P CTRL-N 會啟動展開,然後 CTRL-P 會取回單個字元 "M",接下來的兩個 CTRL-X CTRL-P 會取得單字 "&eacute" 和 ";xico"。
如果先前的展開因長度超過 'textwidth' 而分割,則只會使用目前行中的文字。
如果找到的匹配項位於行的末尾,則會插入下一行的第一個單字,並顯示訊息「來自其他行的單字」,如果接受這個單字,則下一個 CTRL-X CTRL-PCTRL-X CTRL-N 將會搜尋以這個單字開頭的那些行。
補全 'dictionary' 中的關鍵字 compl-dictionary
i_CTRL-X_CTRL-K
CTRL-X CTRL-K'dictionary' 選項給定的檔案中,搜尋以游標前的關鍵字開頭的單字。這類似於 CTRL-N,但只會搜尋字典檔案,而不會搜尋目前檔案。找到的關鍵字會插入到游標之前。這可能會相當慢,因為會在首次使用匹配項之前找到所有匹配項。預設情況下,'dictionary' 選項為空。如需在哪裡找到單字列表的建議,請參閱 'dictionary' 選項。'ignorecase''smartcase''infercase' 會套用。
CTRL-KCTRL-N 向前搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-P 向後搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
補全 'thesaurus' 中的單字 compl-thesaurus
i_CTRL-X_CTRL-T
CTRL-X CTRL-T 的運作方式與 CTRL-X CTRL-K 相同,但採用特殊方式。它會使用 'thesaurus' 選項,而不是 'dictionary'。如果在同義詞庫檔案中找到匹配項,則同一行中的所有剩餘單字都會包含為匹配項,即使它們沒有完成該單字。因此,可以完全取代一個單字。
CTRL-TCTRL-N 向前搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-P 向後搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
'thesaurus' 選項使用的檔案中,檔案中的每一行都應包含意思相似的單字,並以非關鍵字字元分隔(最好使用空白字元)。最大行長度為 510 個位元組。
例如,想像一下 'thesaurus' 檔案有一行像這樣
angry furious mad enraged
將游標放在字母 "ang" 之後,並輸入 CTRL-X CTRL-T,會完成單字 "angry";後續按下會將單字變更為 "furious"、"mad" 等。
其他用途包括兩種語言之間的翻譯,或依關鍵字分組 API 函數。
這個 github 問題中新增了一個英文單字列表:https://github.com/vim/vim/issues/629#issuecomment-443293282 解壓縮 thesaurus_pkg.zip,將 thesaurus.txt 檔案放在某個地方,例如 ~/.vim/thesaurus/english.txt,並將 'thesaurus' 選項設定為這個檔案名稱。
使用 'thesaurusfunc' 補全關鍵字 compl-thesaurusfunc
如果設定了 'thesaurusfunc' 選項,則會調用使用者指定的函數來取得補全匹配項的列表,而不會使用 'thesaurus' 選項。請參閱 complete-functions 以了解如何調用函數及其應傳回的內容。
以下範例使用 "aiksaurus" 命令 (由 Magnus Groß 提供)
func Thesaur(findstart, base)
  if a:findstart
    return searchpos('\<', 'bnW', line('.'))[1] - 1
  endif
  let res = []
  let h = ''
  for l in systemlist('aiksaurus ' .. shellescape(a:base))
    if l[:3] == '=== '
      let h = '(' .. substitute(l[4:], ' =*$', ')', '')
    elseif l ==# 'Alphabetically similar known words are: '
      let h = "\U0001f52e"
    elseif l[0] =~ '\a' || (h ==# "\U0001f52e" && l[0] ==# "\t")
      call extend(res, map(split(substitute(l, '^\t', '', ''), ', '), {_, val -> {'word': val, 'menu': h}}))
    endif
  endfor
  return res
endfunc
if exists('+thesaurusfunc')
  set thesaurusfunc=Thesaur
endif
補全目前和包含檔案中的關鍵字 compl-keyword
include」選項用於指定包含 include 檔名稱的行。「path」選項用於搜尋 include 檔案。
i_CTRL-X_CTRL-I
CTRL-X CTRL-I 搜尋目前及包含的檔案中,第一個與游標前字元開頭相同的關鍵字。找到的關鍵字會插入到游標前。
CTRL-N 向前搜尋下一個符合的關鍵字。此關鍵字會取代前一個符合的關鍵字。注意:CTRL-I<Tab> 相同,通常會在成功補全後輸入,因此 CTRL-I 不用於搜尋下一個符合項。
CTRL-P 向後搜尋前一個符合的關鍵字。此關鍵字會取代前一個符合的關鍵字。
CTRL-X CTRL-I 除非使用雙 CTRL-X,否則進一步使用 CTRL-X CTRL-I 將複製先前展開後在其他上下文中的單字。
補全標籤 compl-tag
i_CTRL-X_CTRL-]
CTRL-X CTRL-] 搜尋第一個與游標前字元開頭相同的標籤。找到的標籤會插入到游標前。字母字元和 iskeyword 中的字元用於決定哪些字元包含在標籤名稱中(與關鍵字相同)。另請參閱 CTRL-]。「showfulltag」選項可用於加入標籤定義周圍的上下文。CTRL-]CTRL-N 向前搜尋下一個符合的標籤。此標籤會取代前一個符合的標籤。
CTRL-P 向後搜尋前一個符合的標籤。此標籤會取代前一個符合的標籤。
補全檔案名稱 compl-filename
i_CTRL-X_CTRL-F
CTRL-X CTRL-F 搜尋第一個與游標前字元開頭相同的檔案名稱。找到的檔案名稱會插入到游標前。字母字元和 isfname 中的字元用於決定哪些字元包含在檔案名稱中。注意:這裡尚未使用「path」選項。 CTRL-FCTRL-N 向前搜尋下一個符合的檔案名稱。此檔案名稱會取代前一個符合的檔案名稱。
CTRL-P 向後搜尋前一個符合的檔案名稱。此檔案名稱會取代前一個符合的檔案名稱。
補全定義或巨集 compl-define
define」選項用於指定包含定義的行。「include」選項用於指定包含 include 檔名稱的行。「path」選項用於搜尋 include 檔案。
i_CTRL-X_CTRL-D
CTRL-X CTRL-D 在目前和包含的檔案中搜尋第一個與游標前字元開頭相同的定義(或巨集)名稱。找到的定義名稱會插入到游標前。CTRL-DCTRL-N 向前搜尋下一個符合的巨集名稱。此巨集名稱會取代前一個符合的巨集名稱。
CTRL-P 向後搜尋前一個符合的巨集名稱。此巨集名稱會取代前一個符合的巨集名稱。
CTRL-X CTRL-D 除非使用雙 CTRL-X,否則進一步使用 CTRL-X CTRL-D 將複製先前展開後在其他上下文中的單字。
補全 Vim 命令 compl-vim
補全是依內容而定的。它的運作方式與在命令列上相同。它會補全 Ex 命令及其引數。這在編寫 Vim 腳本時很有用。
i_CTRL-X_CTRL-V
CTRL-X CTRL-V 猜測游標前項目的類型,並找到第一個符合項。注意:CTRL-V 被對應時,您通常可以使用 CTRL-Q 而不是 i_CTRL-QCTRL-VCTRL-N 向前搜尋下一個符合項。此符合項會取代前一個符合項。
CTRL-P 向後搜尋前一個符合項。此符合項會取代前一個符合項。
CTRL-X CTRL-V 進一步使用 CTRL-X CTRL-V 將執行與 CTRL-V 相同的操作。這允許將按鍵對應以執行 Vim 命令補全,例如
:imap <Tab> <C-X><C-V>
使用者定義的補全 compl-function
補全由使用者使用「completefunc」選項定義的函式完成。請參閱下方有關如何呼叫函式以及 complete-functions 範例。
i_CTRL-X_CTRL-U
CTRL-X CTRL-U 猜測游標前項目的類型,並找到第一個符合項。CTRL-UCTRL-N 使用下一個符合項。此符合項會取代前一個符合項。
CTRL-P 使用前一個符合項。此符合項會取代前一個符合項。
Omni 補全 compl-omni
補全由使用者使用「omnifunc」選項定義的函式完成。這將用於特定檔案類型的補全。
請參閱下方有關如何呼叫函式以及 complete-functions 範例。有關特定檔案類型的註解,請參閱 compl-omni-filetypes。將出現更多補全腳本,請查看 www.vim.org。目前有 C++ 的第一個版本。
i_CTRL-X_CTRL-O
CTRL-X CTRL-O 猜測游標前項目的類型,並找到第一個符合項。CTRL-OCTRL-N 使用下一個符合項。此符合項會取代前一個符合項。
CTRL-P 使用前一個符合項。此符合項會取代前一個符合項。
拼字建議 compl-spelling
找到游標之前或在游標處的單字,並建議正確拼寫的單字來取代它。如果該行中、游標之前或下方有拼寫錯誤的單字,游標會移動到它之後。否則,即使拼寫沒有錯誤,也會使用游標正前方的單字來提供建議。
注意:CTRL-S 會在許多 Unix 終端機中暫停顯示。請改用 's'。輸入 CTRL-Q 以恢復顯示。
i_CTRL-X_CTRL-S i_CTRL-X_s CTRL-X CTRL-S 或 CTRL-X s 找到游標前的單字,並找到它的第一個拼字建議。CTRL-SCTRL-N 使用下一個建議。這會取代前一個建議。請注意,您不能在此處使用 's'。
CTRL-P 使用前一個建議。這會取代前一個建議。
從不同來源補全關鍵字 compl-generic
i_CTRL-N
CTRL-N 尋找以游標前的關鍵字開頭的單字的下一個符合項,搜尋「complete」選項中指定的位置。找到的關鍵字會插入到游標前。
i_CTRL-P
CTRL-P 尋找以游標前的關鍵字開頭的單字的前一個符合項,搜尋「complete」選項中指定的位置。找到的關鍵字會插入到游標前。
CTRL-N 向前搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-P 向後搜尋下一個匹配的關鍵字。此關鍵字會取代先前的匹配關鍵字。
CTRL-X CTRL-NCTRL-X CTRL-P 除非使用了雙 CTRL-X,否則進一步使用 CTRL-X CTRL-NCTRL-X CTRL-P 將會在其他內容中複製先前展開後面的單字。
停止補全 compl-stop
i_CTRL-X_CTRL-Z
CTRL-X CTRL-Z 停止補全,而不變更文字。

自動補全 compl-autocomplete

若要在不安裝外掛程式的情況下取得基本的「自動補全」,請嘗試此腳本
local triggers = {"."}
vim.api.nvim_create_autocmd("InsertCharPre", {
  buffer = vim.api.nvim_get_current_buf(),
  callback = function()
    if vim.fn.pumvisible() == 1 or vim.fn.state("m") == "m" then
      return
    end
    local char = vim.v.char
    if vim.list_contains(triggers, char) then
      local key = vim.keycode("<C-x><C-n>")
      vim.api.nvim_feedkeys(key, "m", false)
    end
  end
})

尋找補全的函式 complete-functions

這適用於「completefunc」、「thesaurusfunc」和「omnifunc」。
函式以兩種不同方式呼叫
首先呼叫函式以尋找要補全的文字的開頭。
稍後呼叫函式以實際尋找符合項。
在第一次呼叫時,引數為:a:findstart 1 a:base 空白
函式必須傳回補全開始的欄位。它必須是零和游標欄位「col('.')」之間的一個數字。這涉及查看游標之前的字元,並包含那些可能是已補全項目一部分的字元。此欄位和游標欄位之間的文字將被符合項取代。如果傳回值大於游標欄位,則使用游標欄位。
負傳回值:-2 靜默取消並保持在補全模式中。-3 靜默取消並離開補全模式。另一個負值:補全從游標欄位開始
在第二次呼叫時,引數為:a:findstart 0 a:base 應與之比對的符合項文字;在第一次呼叫中找到的文字(可以為空)
函式必須傳回一個包含符合單字的列表。這些符合項通常包含「a:base」文字。當沒有符合項時,傳回一個空列表。請注意,游標可能自第一次呼叫以來已移動,文字可能已變更。
為了傳回比符合單字更多的資訊,請傳回一個包含列表的字典。該字典可以具有以下項目:words 符合單字的列表(強制)。refresh 用於控制重新呼叫函式的字串(可選)。目前唯一可識別的值是「always」,其效果是在前導文字變更時呼叫函式。其他項目會被忽略。
為了對補全結束採取動作,請參閱 CompleteDonePreCompleteDone 自動命令事件。
例如,函式可以包含以下內容
let matches = ... list of words ...
return {'words': matches, 'refresh': 'always'}
補全項目
每個列表項目可以是字串或字典。當它是字串時,它會被用作補全。當它是字典時,它可以包含以下項目:word 將插入的文字,強制性 abbr 「word」的縮寫;當不為空時,它會在選單中用來取代「word」 menu 快顯選單的額外文字,顯示在「word」或「abbr」之後 info 有關該項目的更多資訊,可以顯示在預覽視窗中 kind 單個字母表示補全的類型 icase 當非零時,比較項目是否相等時會忽略大小寫;當省略時,使用零,因此只在大小寫上不同的項目會被加入 equal 當非零時,比較時始終將此項目視為相等。這表示「equal=1」會停用此項目的篩選。dup 當非零時,即使已經存在具有相同單字的項目,也會加入此符合項。empty 當非零時,即使它是空字串,也會加入此符合項 user_data 與項目關聯且在 v:completed_item 中可用的自訂資料;它可以是任何類型;預設為空字串 abbr_hlgroup 附加的強調顯示群組,其屬性與 hl-PmenuSelhl-Pmenuhl-PmenuMatchSelhl-PmenuMatch 強調顯示屬性結合,以將刪除線等 cterm 和 gui 屬性(具有較高優先級)套用至補全項目的縮寫 kind_hlgroup 特別用於設定補全類型的強調顯示屬性的額外強調顯示群組。當此欄位存在時,它將覆寫 hl-PmenuKind 強調顯示群組,允許自訂補全類型的 ctermfg 和 guifg 屬性
除了 "icase"、"equal"、"dup" 和 "empty" 之外,所有項目都必須是字串。如果項目不符合這些要求,則會顯示錯誤訊息,並且不會使用清單中的後續項目。您可以在返回的清單中混合使用字串和字典項目。
「menu」項目用於快顯選單,可能會被截斷,因此它應該相對較短。「info」項目可以更長,當 'completeopt' 中出現「preview」時,它將顯示在預覽視窗中。「info」項目在快顯選單移除後也會保持顯示。這對於函數參數很有用。在「info」中使用單個空格可以移除預覽視窗中現有的文字。預覽視窗的大小為三行,但當 'previewheight' 的值為 1 或 2 時,則會使用該值。
「kind」項目使用單個字母來表示完成的類型。這可以用來以不同的方式(不同的顏色或圖示)顯示完成。目前可以使用以下類型:v 變數 f 函數或方法 m 結構或類別的成員 t typedef d #define 或巨集
當搜尋符合項需要一些時間時,請呼叫 complete_add() 以將每個符合項加入到總清單中。這些符合項不應出現在返回的清單中!現在和之後呼叫 complete_check(),以便允許使用者在仍然搜尋符合項時按下按鍵。當它返回非零值時,停止搜尋。
E840
允許函數移動游標,之後會還原。函數不允許移動到另一個視窗或刪除文字。
一個完成月份名稱的範例
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    let res = []
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=CompleteMonths
相同的範例,但現在假裝搜尋符合項很慢
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call complete_add(m)
      endif
      sleep 300m        " simulate searching for next match
      if complete_check()
        break
      endif
    endfor
    return []
  endif
endfun
set completefunc=CompleteMonths

插入完成快顯選單 ins-completion-menu

popupmenu-completion
Vim 可以在一個簡化的快顯選單中顯示符合項。
當滿足以下條件時,會使用此選單
'completeopt' 選項包含 "menu" 或 "menuone"。
終端機至少支援 8 種顏色。
至少有兩個符合項。如果使用 "menuone",則有一個符合項。
可以使用 'pumheight' 選項設定最大高度。預設是使用所有可用的空間。可以使用 'pumwidth' 選項設定最小寬度。預設值為 15 個字元。
有三種狀態:1. 已插入完全符合的項目,例如,在使用 CTRL-NCTRL-P 之後。2. 已使用游標鍵選擇另一個符合項。此時尚未插入該符合項,僅在快顯選單中反白顯示該項目。3. 僅插入了部分符合項,並且輸入了字元或使用了退格鍵。然後會根據游標前面的內容調整符合項清單。
您通常從第一種狀態開始,並插入第一個符合項。當 'completeopt' 中有 "longest" 且有多個符合項時,您會從第三種狀態開始。
如果您選擇另一個符合項,例如,使用 CTRL-NCTRL-P,則會進入第一種狀態。這不會變更符合項清單。
當您回到原始文字時,您會處於第三種狀態。為了立即到達那裡,您可以使用在開始完成後立即使用 CTRL-P 的對應。
:imap <F7> <C-N><C-P>
popupmenu-keys
在第一種狀態下,這些按鍵具有特殊含義:<BS>CTRL-H 刪除一個字元,尋找游標之前單字的符合項。這會縮減符合項清單,通常只剩下一個項目,並切換到第二種狀態。任何非特殊字元:停止完成,而不變更符合項並插入輸入的字元。
在第二和第三種狀態下,這些按鍵具有特殊含義:<BS>CTRL-H 刪除一個字元,尋找游標之前較短單字的符合項。這可能會找到更多符合項。CTRL-L 從目前的符合項新增一個字元,可能會減少符合項的數量。任何可列印的非空白字元:新增此字元並減少符合項的數量。
在所有三種狀態下,都可以使用以下按鍵:CTRL-Y 是:接受目前選取的符合項並停止完成。CTRL-E 結束完成,回到選取符合項之前的位置(輸入的內容或最長共同字串)。<PageUp> 選取多個項目之前的符合項,但不插入。<PageDown> 選取多個項目之後的符合項,但不插入。<Up> 選取上一個符合項,如同使用 CTRL-P 一樣,但不插入。<Down> 選取下一個符合項,如同使用 CTRL-N 一樣,但不插入。<Space><Tab> 停止完成,而不變更符合項並插入輸入的字元。
<Enter> 按鍵的行為取決於您所處的狀態:第一種狀態:使用文字原樣並插入換行符號。第二種狀態:插入目前選取的符合項。第三種狀態:使用文字原樣並插入換行符號。
換句話說:如果您使用游標鍵選取符合項清單中的另一個項目,則 <Enter> 按鍵會插入該符合項。如果您輸入了其他內容,則 <Enter> 會插入換行符號。
可以使用以下反白群組變更選單的顏色:Pmenu 一般項目 hl-Pmenu PmenuSel 選取的項目 hl-PmenuSel PmenuSbar 捲軸 hl-PmenuSbar PmenuThumb 捲軸的拇指 hl-PmenuThumb
當快顯選單可見時,沒有特殊的對應。但是,您可以使用插入模式對應檢查 pumvisible() 函數來執行不同的操作。範例
:inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR>
您可以在對應中使用 <expr>,以便在輸入字元且滿足某些條件時使用快顯選單。例如,用於輸入點
inoremap <expr> . MayComplete()
func MayComplete()
    if (can complete)
      return ".\<C-X>\<C-O>"
    endif
    return '.'
endfunc
請參閱 :map-<expr> 以取得更多資訊。

針對 Omni 完成的檔案類型特定備註 compl-omni-filetypes

用於 {filetype} 的檔案應該是 'runtimepath' 中的 autoload/{filetype}complete.vim。因此,對於 "java",它是 autoload/javacomplete.vim。
C 程式碼的完成需要標籤檔案。您應該使用 Universal/ Exuberant ctags,因為它會加入完成所需的額外資訊。您可以在此處找到它:Universal Ctags:https://ctags.io
建議使用 Universal Ctags,Exuberant Ctags 不再維護。
如果您想要完成系統函數,您可以執行類似這樣的操作。使用 ctags 為所有系統標頭檔案產生標籤檔案
% ctags -R -f ~/.config/nvim/systags /usr/include /usr/local/include
在您的 vimrc 檔案中,將此標籤檔案新增至 'tags' 選項
set tags+=~/.config/nvim/systags
當在沒有任何 "." 或 "->" 的名稱之後使用 CTRL-X CTRL-O 時,會直接從標籤檔案完成。這適用於任何識別碼,也適用於函數名稱。如果您想要完成標籤檔案中沒有出現的本機變數名稱,請改用 CTRL-P
當在具有 "." 或 "->" 的內容之後使用 CTRL-X CTRL-O 時,Vim 會嘗試識別變數的類型,並判斷它具有哪些成員。這表示只會列出對該變數有效的成員。
當成員名稱已完成時,CTRL-X CTRL-O 會為複合類型新增 "." 或 "->"。
Vim 不包含 C 編譯器,只會識別格式最明顯的宣告。前置處理器內容可能會造成混淆。當相同的結構名稱出現在多個位置時,會包含所有可能的成員。
根據 CSS 2.1 規格完成屬性及其適當的值。
CTRL-X CTRL-O 提供 (X)HTML 檔案各種元素的完成。它旨在支援撰寫 XHTML 1.0 Strict 檔案,但也適用於其他 HTML 版本。功能
在 "<" 之後,根據內容完成標籤名稱(在 a 標籤內沒有 div 建議);'/>' 表示空白標籤
在標籤內完成適當的屬性(a 標籤沒有 width 屬性);也顯示屬性的類型;"*" 表示必要的屬性
當屬性具有有限數量的可能值時,協助完成這些值
完成實體名稱
完成從 <style> 標籤和包含的 CSS 檔案取得的 "class" 和 "id" 屬性的值
當完成 "style" 屬性的值或在 "style" 標籤內工作時,切換至 ft-css-omni 完成
當完成事件屬性的值或在 "script" 標籤內工作時,切換至 ft-javascript-omni 完成
在 "</" 之後使用時,CTRL-X CTRL-O 會關閉最後開啟的標籤
注意:第一次使用時,完成選單會稍微延遲顯示
這是載入資料檔案所需的時間。注意:完成可能會在格式錯誤的文件中失敗。在這種情況下,請嘗試執行 :make 命令以偵測格式問題。
HTML 樣式 html-flavor
預設的 HTML 完成取決於檔案類型。對於 HTML 檔案,它是 HTML 4.01 Transitional('filetype' 為 "html"),對於 XHTML,它是 XHTML 1.0 Strict('filetype' 為 "xhtml")。
當在任何其他標籤之外進行完成時,您將可以選擇 DOCTYPE,並且會載入適當的資料檔案,並用於所有後續完成。
如需資料檔案格式的詳細資訊,請參閱 xml-omni-datafile。某些資料檔案可以在 Vim 網站 (www) 上找到。
請注意,b:html_omni_flavor 可能指向具有任何 XML 資料的檔案。這使得可以將 PHP (ft-php-omni) 完成與任何 XML 方言混合(假設您具有其資料檔案)。如果未設定該變數,則會使用 XHTML 1.0 Strict。
完成 JavaScript 語言和 DOM 元素的大部分元素。
完成
變數
函數名稱;顯示函數引數
函數引數
變數的屬性,嘗試偵測變數的類型
根據內容完成 DOM 物件和屬性
語言的關鍵字
完成適用於個別 JavaScript 檔案 (&ft==javascript)、(X)HTML 的 <script> 標籤內以及事件屬性的值中(包括掃描外部檔案)。
DOM 相容性
目前(2006 年初)有兩個主要的瀏覽器 - MS Internet Explorer 和 Mozilla Firefox。這兩個應用程式涵蓋了超過 90% 的市場。理論上,標準是由 W3C 組織 (https://www.w3.org/) 建立的,但它們並非總是遵循/實作。
IE        FF        W3C  Omni completion ~
+/-        +/-        +    +                     ~
+        +        -    +                     ~
+        -        -    -                     ~
-        +        -    -                     ~
無論瀏覽器中的實作狀態如何,但如果元素是在標準中定義的,完成外掛程式將會將元素放在建議清單中。當兩個主要的引擎都實作了元素時,即使它不在標準中,也會建議。所有其他元素都不會放在建議清單中。
PHP 程式碼的完成需要標籤檔案,以便從外部檔案完成資料並進行類別感知的完成。您應該使用 Universal/ Exuberant ctags 5.5.4 或更新版本。您可以在此處找到它
Universal Ctags:https://ctags.io
指令碼完成
在 $ 變數名稱之後
如果變數被宣告為物件,則加入 "->",如果標籤檔可用,則顯示類別名稱
在 "->" 之後,只會完成給定類別特定的函式和變數名稱。要找到類別位置和內容,需要標籤檔。由於 PHP 不是強型別語言,使用者可以使用 @var 標籤來宣告類別
/* @var $myVar myClass */
$myVar->
儘管如此,要找到 myClass 的內容,仍然需要標籤檔。
具有額外資訊的函式名稱
如果是內建函式,則列出可能的引數,並在 | 之後顯示函式回傳的資料型別
如果是使用者函式,則顯示引數以及定義函式所在的檔案名稱 (如果不是當前檔案)
常數名稱
在 "new" 宣告之後的類別名稱
注意:第一次進行補全時,Vim 會將所有必要的資料載入記憶體。這可能需要幾秒鐘的時間。在下次使用補全功能後,延遲應該不會很明顯。
腳本會偵測游標是否位於 <?php ?> 標籤內。如果它在外面,則會自動切換到 HTML/CSS/JavaScript 補全。注意:與原始 HTML 檔案不同,標籤的補全(而且只有標籤)不是上下文感知的。
注意: Ruby 程式碼的 compl-omni 需要安裝 provider-ruby
Ruby 補全會根據需求解析您的緩衝區,以提供補全列表。這些補全將來自 "require" 載入的模組以及在目前緩衝區中定義的模組。
CTRL-X CTRL-O 提供的補全會根據上下文而有所不同
提供的上下文補全
1. 不在類別定義內:類別、常數和全域變數
2. 在類別定義內:在類別中定義的方法或常數
3. 在 '.'、'::' 或 ':' 之後:適用於正在取值的物件的方法
4. 在 ':' 或 ':foo' 之後:符號名稱(以 "foo" 開頭)
注意事項
Vim 會載入/評估程式碼以提供補全。這可能會導致一些程式碼執行,這可能會引起一些疑慮。此功能預設不再啟用,要啟用此功能,請加入
let g:rubycomplete_buffer_loading = 1
<- 在上面的上下文 1 中,Vim 可以解析整個緩衝區,以將類別列表添加到補全結果中。此功能預設為關閉,要啟用它,請加入
let g:rubycomplete_classes_in_global = 1
到您的 vimrc
在上面的上下文 2 中,不支援匿名類別。
在上面的上下文 3 中,Vim 將嘗試確定物件支援的方法。
Vim 可以偵測並載入 Rails 專案中檔案的 Rails 環境。此功能預設為停用,要啟用它,請加入
let g:rubycomplete_rails = 1
到您的 vimrc
Vim 具有為近 500 種語言著色語法高亮顯示的能力。這種高亮顯示的一部分包括知道哪些關鍵字是語言的一部分。許多檔案類型已經為它們編寫了自訂的補全腳本,syntaxcomplete 外掛程式為所有其他檔案類型提供基本的補全功能。它透過用 Vim 已經知道如何著色高亮顯示的文字來填充 omni 補全列表來實現這一點。它可以適用於任何檔案類型,並提供最小的語言敏感補全。
要啟用語法程式碼補全,您可以執行
setlocal omnifunc=syntaxcomplete#Complete
您可以透過將以下內容放入您的 init.vim(在任何 ":filetype" 命令之後)來自動執行此操作
if has("autocmd") && exists("+omnifunc")
    autocmd Filetype *
                \        if &omnifunc == "" |
                \                setlocal omnifunc=syntaxcomplete#Complete |
                \        endif
endif
只有在特定外掛程式尚未存在於該檔案類型時,上述操作才會將補全設定為此腳本。
每個檔案類型可以有範圍廣泛的語法項目。此外掛程式允許您自訂要包含或排除在列表中的語法群組。讓我們看一下 PHP 檔案類型,看看它是如何運作的。
如果您編輯一個名為 index.php 的檔案,請執行以下命令
syntax list
您首先會注意到有許多不同的語法群組。PHP 語言可以包含來自不同語言的元素,例如 HTML、JavaScript 和更多。語法外掛程式只會包含以檔案類型 "php" 開頭的語法群組,在本例中。例如,這些語法群組預設包含在 PHP 中:phpEnvVar、phpIntVar、phpFunctions。
如果您希望也包含非檔案類型的語法項目,則可以使用正規表示式語法(在 autoload/syntaxcomplete.vim 的 13.0 版中新增)來新增項目。查看在編輯 PHP 檔案時 ":syntax list" 的輸出,我可以看到一些這些條目
htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects
要在編輯 PHP 檔案時擷取任何 JavaScript 和 HTML 關鍵字語法群組,您可以使用 3 個不同的正規表示式,每個語言一個。或者,您可以直接將包含群組限制為特定值,而無需使用正規表示式字串
let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+'
let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods'
此變數的基本形式為
let g:omni_syntax_group_include_{filetype} = 'regex,comma,separated'
PHP 語言具有大量它知道如何語法高亮顯示的項目。這些項目將在 omni 補全列表中可用。
有些人可能會覺得此列表很難管理,或者只對某些項目感興趣。有兩種方法可以修剪此列表(如果需要)。如果您發現某些語法群組不希望顯示,則可以使用兩種不同的方法來識別這些群組。第一種是按名稱明確列出語法群組。第二種是使用正規表示式來識別兩個語法群組。只需將以下其中一個新增到您的 vimrc
let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant'
let g:omni_syntax_group_exclude_php = 'php\w*Constant'
透過逗號分隔,在此列表中新增任意數量的語法群組。此變數的基本形式為
let g:omni_syntax_group_exclude_{filetype} = 'regex,comma,separated'
您可以根據需要建立任意數量的這些變數,只變更變數名稱結尾的檔案類型。
此外掛程式使用 isKeyword 選項來確定語法項目的單字邊界。例如,在 Scheme 語言中,補全應包含 "-", call-with-output-file。根據您的檔案類型,這可能不會提供您預期的單字。將 g:omni_syntax_use_iskeyword 選項設定為 0 將強制語法外掛程式在單字字元上中斷。您可以透過將以下內容新增到您的 vimrc 來控制此行為
let g:omni_syntax_use_iskeyword = 0
對於外掛程式開發人員,此外掛程式公開了一個公共函式 OmniSyntaxList。此函式可用於請求語法項目列表。在編輯 SQL 檔案 (:e syntax.sql) 時,您可以使用 ":syntax list" 命令來查看各種群組和語法項目。例如
syntax list
產生類似於此的資料
sqlOperator xxx some prior all like and any escape exists in is not
or intersect minus between distinct
連結到 Operator
sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier
date money long tinyint unsigned xml text smalldate
double datetime nchar smallint numeric time bit char
varbinary binary smallmoney
image float integer timestamp real decimal
這裡列出了兩個語法群組:sqlOperator 和 sqlType。要擷取語法項目列表,您可以使用多種不同的方式呼叫 OmniSyntaxList。要擷取所有語法項目,無論語法群組為何
echo OmniSyntaxList( [] )
要僅擷取 sqlOperator 語法群組的語法項目
echo OmniSyntaxList( ['sqlOperator'] )
要擷取 sqlOperator 和 sqlType 群組的所有語法項目
echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
也可以使用正規表示式
echo OmniSyntaxList( ['sql\w\+'] )
在外掛程式內,您通常會將輸出指派給 List
let myKeywords = []
let myKeywords = OmniSyntaxList( ['sqlKeyword'] )

SQL ft-sql-omni

SQL 語言的補全包括陳述式、函式、關鍵字。它還將使用直接從資料庫中提取的資料,動態完成資料表、程序、檢視表和欄位清單。如需詳細說明和教學課程,請參閱 omni-sql-completion
SQL 補全外掛程式可以與其他補全外掛程式結合使用。例如,PHP 檔案類型有自己的補全外掛程式。由於 PHP 通常透過存取資料庫來產生動態網站,因此也可以啟用 SQL 補全外掛程式。這允許您同時完成 PHP 程式碼和 SQL 程式碼。
Vim 7 提供了一種用於 XML 檔案上下文感知補全的機制。它依賴於一個特殊的 xml-omni-datafile 和兩個命令::XMLns:XMLent。功能包括
在 "<" 之後,根據上下文完成標籤名稱
在標籤內完成適當的屬性
當屬性有有限數量的可能值時,協助完成它們
完成實體的名稱(在 xml-omni-datafile 中定義,並在目前檔案中使用 "<!ENTITY" 宣告)
在 "</" 之後使用時,CTRL-X CTRL-O 會關閉最後開啟的標籤
XML 資料檔案的格式 xml-omni-datafile
XML 資料檔案儲存在 'runtimepath' 中的 "autoload/xml" 目錄中。Vim 發行版在 "$VIMRUNTIME/autoload/xml" 目錄中提供了資料檔案的範例。它們有一個有意義的名稱,該名稱將在命令中使用。它應該是一個唯一的名稱,不會產生衝突。例如,名稱 xhtml10s.vim 表示它是 XHTML 1.0 Strict 的資料檔案。
每個檔案都包含一個名稱類似 g:xmldata_xhtml10s 的變數。它由兩部分組成
1. "g:xmldata_" 一般前綴,所有資料檔案的常數 2. "xhtml10s" 檔案的名稱和描述的 XML 方言的名稱;它將用作 :XMLns 命令的引數
第二部分必須與檔案名稱完全相同。
此變數是一個 Dictionary。索引鍵是標籤名稱,每個值都是一個兩元素 List。List 的第一個元素也是一個包含可能子項名稱的 List。第二個元素是一個 Dictionary,索引鍵為屬性的名稱,值為屬性的可能值。範例
let g:xmldata_crippled = {
\ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"],
\ 'vimxmlroot': ['tag1'],
\ 'tag1':
\ [ ['childoftag1a', 'childoftag1b'], {'attroftag1a': [],
\ 'attroftag1b': ['valueofattr1', 'valueofattr2']}],
\ 'childoftag1a':
\ [ [], {'attrofchild': ['attrofchild']}],
\ 'childoftag1b':
\ [ ['childoftag1a'], {'attrofchild': []}],
\ "vimxmltaginfo": {
\ 'tag1': ['Menu info', 'Long information visible in preview window']},
\ 'vimxmlattrinfo': {
\ 'attrofchild': ['Menu info', 'Long information visible in preview window']}}
此範例將放置在 "autoload/xml/crippled.vim" 檔案中,並且可以協助編寫此檔案
<tag1 attroftag1b="valueofattr1">
    <childoftag1a attrofchild>
            &amp; &lt;
    </childoftag1a>
    <childoftag1b attrofchild="5">
        <childoftag1a>
            &gt; &apos; &quot;
        </childoftag1a>
    </childoftag1b>
</tag1>
在此範例中,可以看到四個特殊元素
1. "vimxmlentities" - 一個特殊索引鍵,其中包含此 XML 方言的實體列表。 2. 如果包含屬性可能值的列表有一個元素,且該元素等於屬性的名稱,則該屬性將被視為布林值,並以 "attrname" 而不是 'attrname="' 的形式插入。 3. "vimxmltaginfo" - 一個特殊索引鍵,其中包含一個 Dictionary,索引鍵為標籤名稱,值為兩個元素的 List,用於額外的選單資訊和長描述。 4. "vimxmlattrinfo" - 一個特殊索引鍵,其中包含一個 Dictionary,索引鍵為屬性名稱,值為兩個元素的 List,用於額外的選單資訊和長描述。
注意: 資料檔中的標籤名稱**必須**不包含命名空間描述。請查看 xsl.vim 以取得範例。注意: 所有資料和函數皆以公開的全域變數/函數形式提供,可供個人編輯函數使用。
DTD -> Vim dtd2vim
www 上有一個名為 dtd2vim 的腳本,它會解析 DTD 並建立一個 XML 資料檔,供 Vim XML 自動完成功能使用。
請查看該檔案的開頭以了解使用細節。該腳本需要 perl 和
指令
:XMLns {name} [{namespace}] :XMLns
Vim 必須知道應該使用哪個資料檔以及哪個命名空間。若要載入資料檔並將資料與適當的命名空間連接,請使用 :XMLns 指令。第一個(必要)參數是資料的名稱 (xhtml10s, xsl)。第二個參數是命名空間的代碼 (h, xsl)。當不使用第二個參數時,將使用該方言作為預設值,而不使用命名空間宣告。例如,若要在 .xsl 檔案中使用 XML 自動完成
:XMLns xhtml10s
:XMLns xsl xsl
:XMLent {name} :XMLent
預設情況下,實體將從預設命名空間的資料檔完成。如果沒有預設命名空間,則應使用 XMLent 指令
:XMLent xhtml10s
用法
在此情況下使用(在上一部分的宣告之後,| 是游標位置)
<|
將自動完成為適當的 XHTML 標籤,在此情況下
<xsl:|
將自動完成為適當的 XSL 標籤。
透過 autoload 機制提供的腳本 xmlcomplete.vim,具有 xmlcomplete#GetLastOpenTag() 函數,該函數可在 XML 檔案中用來取得最後一個開啟標籤的名稱 (必須定義 b:unaryTagsStack)。
:echo xmlcomplete#GetLastOpenTag("b:unaryTagsStack")

8. 插入模式指令 inserting

以下指令可用於將新文字插入緩衝區。它們都可以使用「.」指令復原和重複。
a
a 在游標後方附加文字 [count] 次。如果游標位於空行的第一欄,則插入從該處開始。但是當 'virtualedit' 設定時則不適用!
A
A 在行尾附加文字 [count] 次。若要在視覺區塊模式中使用 "A",請參閱 v_b_A
<insert>i insert <Insert> i 在游標前方插入文字 [count] 次。在插入模式中使用 CTRL-Oi_CTRL-O 不支援次數。
I
I 在行中第一個非空白字元之前插入文字 [count] 次。當 'cpoptions' 中存在 'H' 旗標,且該行只包含空白時,插入會從最後一個空白之前開始。若要在視覺區塊模式中使用 "I",請參閱 v_b_I
gI
gI 在第 1 欄中插入文字 [count] 次。
gi
gi 在目前的緩衝區中,與上次停止插入模式的位置相同的處插入文字。這會使用 '^ 標記。當標記超過行尾時,它與 "`^i" 不同。該位置會針對插入/刪除的行進行修正,但**不**針對插入/刪除的字元進行修正。當使用 :keepjumps 指令修飾符時,'^ 標記不會變更。
o
o 在游標下方開始新行並插入文字,重複 [count] 次。
O
O 在游標上方開始新行並插入文字,重複 [count] 次。
這些指令用於開始插入文字。您可以使用 <Esc> 結束插入模式。有關插入模式中的其他特殊字元,請參閱 mode-ins-repl。[count] 的效果會在結束插入模式後發生。
'autoindent' 開啟時,新行的縮排會從上一行取得。當 'smartindent''cindent' 開啟時,會針對 C 程式自動調整行的縮排。
可以設定 'formatoptions',以便在開啟新行時複製註解符號。
可以將 'textwidth' 設定為行的最大寬度。當附加字元時行變得太長時,會自動插入換行符號。

9. Ex 插入指令 inserting-ex

:a :append :{range}a[ppend][!] 在指定的行下方插入數行文字。如果缺少 {range},則文字會插入在目前行之後。加入 [!] 會在執行此指令時切換 'autoindent'
:i :in :insert :{range}i[nsert][!] 在指定的行上方插入數行文字。如果缺少 {range},則文字會插入在目前行之前。加入 [!] 會在執行此指令時切換 'autoindent'
這兩個指令會持續要求輸入行,直到您輸入只包含「.」的行。請注意以反斜線開頭的行,請參閱 line-continuation
在 "|" 指令分隔符號之後輸入的文字會先使用。因此,在 ex 模式中執行以下指令
:a|one
two
.
:visual
會在游標行之後附加以下文字
one
two
注意: 這些指令不能與 :global:vglobal 搭配使用。":append" 和 ":insert" 在 ":if" 和 ":endif"、":for" 和 ":endfor"、":while" 和 ":endwhile" 之間無法正常運作。
:start :startinsert :star[tinsert][!] 在執行此指令後立即開始插入模式(或 終端模式,在 終端 緩衝區中)。作用如同在一般模式中輸入 "i"。當包含 ! 時,它的作用如同 "A",附加到該行。否則插入會在游標位置開始。請注意,當在函數或腳本中使用此指令時,插入只會在函數或腳本完成後才開始。此指令無法從 :normal 使用。
:stopi :stopinsert :stopi[nsert] 盡快停止插入模式或 終端模式。作用如同在插入模式中輸入 <Esc>。可以在自動指令中使用,例如
:au BufEnter scratch stopinsert
replacing-ex :startreplace :startr[eplace][!] 在執行此指令後立即開始取代模式。作用如同在一般模式中輸入 "R"。當包含 ! 時,它的作用如同輸入 "$R"(也就是說,在行尾開始取代模式)。否則取代會在游標位置開始。請注意,當在函數或腳本中使用此指令時,取代只會在函數或腳本完成後才開始。
:startgreplace
:startg[replace][!] 就像 :startreplace,但使用虛擬取代模式,如同 gR

10. 插入檔案 inserting-file

:r :re :read :r[ead] [++opt] [name] 在游標下方插入檔案 [name] (預設:目前的檔案)。請參閱 ++opt 以取得 [++opt] 的可能值。
:{range}r[ead] [++opt] [name] 在指定的行下方插入檔案 [name] (預設:目前的檔案)。請參閱 ++opt 以取得 [++opt] 的可能值。
:r! :read! :[range]r[ead] [++opt] !{cmd} 執行 {cmd},並將其標準輸出插入在游標下方或指定的行下方。會使用一個暫存檔案來儲存指令的輸出,然後將其讀取到緩衝區中。'shellredir' 用於儲存指令的輸出,可以設定為是否包含 stderr。{cmd} 的執行方式與 ":!{cmd}" 相同,任何 '!' 都會取代為上一個指令 :!。請參閱 ++opt 以取得 [++opt] 的可能值。
這些指令會將檔案的內容或指令的輸出插入緩衝區中。它們可以復原。它們無法使用「.」指令重複。它們以行為基礎運作,插入會從游標所在的行下方或指定的行下方開始。若要將文字插入第一行上方,請使用指令 ":0r {name}"。
在 ":read" 指令之後,游標會保留在第一行新行的第一個非空白字元上。除非在 Ex 模式中,否則游標會保留在最後一行新行上 (抱歉,這是與 Vi 相容)。
如果使用 ":r" 提供檔案名稱,它會變成替代檔案。例如,當您想要改為編輯該檔案時可以使用:":e! #"。可以從 'cpoptions' 選項中移除 'a' 旗標來關閉此功能。
在 [++opt] 引數中,有一個專門用於 ":read",即 ++edit 引數。當 ":read" 指令實際用於將檔案讀取到緩衝區中,如同編輯該檔案時,這會很有用。在空的緩衝區中使用此指令
:read ++edit filename
效果是 'fileformat''fileencoding''bomb' 等選項會設定為 "filename" 偵測到的內容。請注意,仍會保留單一空行,您可能需要將其刪除。
file-read
'fileformat' 選項會設定檔案的 <EOL> 樣式
'fileformat' 字元名稱
"dos" <CR><NL><NL> DOS 格式 "unix" <NL> Unix 格式 "mac" <CR> Mac 格式
如果 'fileformat' 設定為 "dos",則會忽略 <NL> 前面的 <CR>,並忽略檔案結尾的 CTRL-Z
如果 'fileformat' 設定為 "mac",檔案中的 <NL> 在內部會以 <CR> 表示。這是為了避免與用來表示 <NUL><NL> 混淆。請參閱 CR-used-for-NL
如果 'fileformats' 選項不為空,Vim 會嘗試辨識 <EOL> 的類型 (請參閱 檔案格式)。然而,'fileformat' 選項不會被更改,偵測到的格式僅在讀取檔案時使用。 'fileencodings' 也會發生類似情況。
在非 Win32 系統上,如果以 DOS 格式讀取檔案,會顯示訊息 "[dos format]",提醒您正在執行不尋常的操作。在 Macintosh 和 Win32 上,如果以 Unix 格式讀取檔案,則會顯示訊息 "[unix format]"。在非 Macintosh 系統上,如果以 Mac 格式讀取檔案,則會顯示訊息 "[mac format]"。
以下是如何使用 ":r !" 的範例。
:r !uuencode binfile binfile
此命令會讀取 "binfile",將其進行 uuencode 編碼,然後讀取到目前的緩衝區中。當您編輯電子郵件並想要包含二進位檔案時,這會很有用。
讀取訊息
當讀取檔案時,Vim 會顯示一則包含讀取檔案資訊的訊息。下表解釋了其中一些項目。其他項目則不言自明。使用長版本或短版本取決於 'shortmess' 選項。
長訊息 短訊息 意義
[readonly] {RO} 檔案為寫入保護 [fifo/socket] 使用串流 [fifo] 使用 fifo 串流 [socket] 使用 socket 串流 [CR missing] 使用 "dos" 'fileformat' 讀取,並且發現沒有前導 CR 的 NL。[NL found] 使用 "mac" 'fileformat' 讀取,並且發現 NL (可能是 "unix" 格式) [long lines split] 至少有一行被分割成兩行 [NOT converted] 想要從 'fileencoding' 轉換到 'encoding',但無法轉換 [converted] 已完成從 'fileencoding' 轉換到 'encoding' [READ ERRORS] 並非所有檔案內容都能讀取
主要
指令索引
快速參考