Usr_24

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


VIM 使用者手冊 - 作者 Bram Moolenaar
快速插入
當輸入文字時,Vim 提供了多種方法來減少按鍵次數並避免輸入錯誤。使用插入模式的自動完成功能來重複先前輸入的文字。將長字縮寫成短字。輸入鍵盤上沒有的字元。
24.1 修正錯誤 24.2 顯示匹配 24.3 自動完成 24.4 重複插入 24.5 從另一行複製 24.6 插入暫存器 24.7 縮寫 24.8 輸入特殊字元 24.9 雙字符 24.10 一般模式指令
下一章:usr_25.txt 編輯格式化文字 上一章:usr_23.txt 編輯其他檔案 目錄:usr_toc.txt

修正錯誤

前面已經提到 <BS> 鍵。它可以刪除游標前的字元。<Del> 鍵對游標下(後)的字元執行相同的操作。當您輸入整個錯誤的單字時,請使用 CTRL-W
The horse had fallen to the sky
CTRL-W
The horse had fallen to the
如果您真的把一行弄亂了,想重新開始,請使用 CTRL-U 將其刪除。這會保留游標後的文字和縮排。只會刪除從第一個非空白字元到游標之間的文字。當游標位於下一行 "fallen" 的 "f" 上時,按下 CTRL-U 會執行以下操作
The horse had fallen to the
CTRL-U
fallen to the
當您發現幾個單字前的錯誤時,您需要將游標移動到那裡進行更正。例如,您輸入了以下內容
The horse had follen to the ground
您需要將 "follen" 更改為 "fallen"。游標位於結尾時,您需要輸入以下內容來更正它
<Esc>4blraA
離開插入模式 <Esc> 返回四個單字 4b 移動到 "o" 的上方 l 將其替換為 "a" ra 重新開始插入模式 A
另一種方法是
<C-Left><C-Left><C-Left><C-Left><Right><Del>a<End>
返回四個單字 <C-Left><C-Left><C-Left><C-Left> 移動到 "o" 的上方 <Right> 刪除 "o" <Del> 插入 "a" a 移至行尾 <End>
這使用了特殊的按鍵來移動,同時保持在插入模式。這類似於您在非模態編輯器中所做的操作。它更容易記住,但需要更多時間(您必須將手從字母鍵移動到游標鍵,並且在不看鍵盤的情況下很難按下 <End> 鍵)。這些特殊按鍵在編寫不離開插入模式的映射時最有用。額外的輸入在那時並不重要。以下是您可以在插入模式中使用的按鍵概述
<C-Home> 到檔案開頭 <PageUp> 向上移動一整個螢幕 <Home> 到行首 <S-Left> 向左一個單字 <C-Left> 向左一個單字 <S-Right> 向右一個單字 <C-Right> 向右一個單字 <End> 到行尾 <PageDown> 向下移動一整個螢幕 <C-End> 到檔案結尾
還有一些,請參閱 ins-special-special

24.2 顯示匹配

當您輸入 ) 時,如果能看到它與哪個 ( 匹配,那就太好了。要讓 Vim 這樣做,請使用此命令
:set showmatch
現在,當您輸入像 "(example)" 這樣的文字時,當您輸入 ) 時,Vim 會短暫地將游標移動到匹配的 (,保持在那裡半秒鐘,然後移回您正在輸入的位置。如果沒有匹配的 (,Vim 會發出嗶聲。那麼您就知道您可能在某處忘記了 (,或者輸入了太多 )。匹配也會顯示在 [] 和 {} 配對中。您不必等待輸入下一個字元,只要 Vim 看到它,游標就會移回,並且插入會像以前一樣繼續。您可以使用 'matchtime' 選項來變更 Vim 等待的時間。例如,要讓 Vim 等待一秒半
:set matchtime=15
時間以十分之一秒為單位指定。

24.3 自動完成

Vim 可以在插入時自動完成單字。您輸入一個單字的第一部分,按下 CTRL-P,Vim 會猜測其餘部分。例如,假設您正在建立一個 C 程式並想輸入以下內容
total = ch_array[0] + ch_array[1] + ch_array[2];
您首先輸入以下內容
total = ch_array[0] + ch_
此時,您告訴 Vim 使用命令 CTRL-P 自動完成單字。Vim 會搜尋以游標前的文字開頭的單字。在這種情況下,它是 "ch_",它與單字 ch_array 匹配。因此,輸入 CTRL-P 會產生以下內容
total = ch_array[0] + ch_array
在多輸入一些內容後,您會得到以下內容(以空格結尾)
total = ch_array[0] + ch_array[1] +
如果您現在輸入 CTRL-P,Vim 會再次搜尋完成游標前單字的單字。由於游標前沒有任何內容,它會向後找到第一個單字,即 "ch_array"。再次輸入 CTRL-P 會給您下一個匹配的單字,在本例中為 "total"。第三次 CTRL-P 會進一步向後搜尋。如果沒有其他內容,則會導致編輯器用完單字,因此它會返回到原始文字,即沒有任何內容。第四次 CTRL-P 會導致編輯器從 "ch_array" 重新開始。
要向前搜尋,請使用 CTRL-N。由於搜尋會環繞檔案結尾,CTRL-NCTRL-P 會找到相同的匹配項,但順序不同。提示:CTRL-N 是下一個匹配項,而 CTRL-P 是上一個匹配項。
Vim 編輯器會盡力尋找要完成的單字。預設情況下,它會搜尋以下位置
1. 目前檔案 2. 其他視窗中的檔案 3. 其他已載入的檔案(隱藏的緩衝區) 4. 未載入的檔案(非活動的緩衝區) 5. 標籤檔案 6. 目前檔案 #include 的所有檔案

選項

您可以使用 'complete' 選項自訂搜尋順序。
使用 'ignorecase' 選項。設定後,在搜尋匹配項時會忽略大小寫差異。
一個用於自動完成的特殊選項是 'infercase'。這對於在忽略大小寫的情況下(必須設定 'ignorecase')查找匹配項,但仍使用目前輸入單字的大小寫非常有用。因此,如果您輸入 "For",而 Vim 找到匹配項 "fortunately",則會產生 "Fortunately"。

完成特定項目

如果您知道要尋找的內容,可以使用這些命令來完成特定類型的項目
CTRL-X CTRL-F 檔案名稱 CTRL-X CTRL-L 整行 CTRL-X CTRL-D 巨集定義(也包含在 include 檔案中) CTRL-X CTRL-I 目前和 include 檔案 CTRL-X CTRL-K 字典中的單字 CTRL-X CTRL-T 辭典中的單字 CTRL-X CTRL-] 標籤 CTRL-X CTRL-V Vim 命令列
在每個命令之後,可以使用 CTRL-N 尋找下一個匹配項,使用 CTRL-P 尋找上一個匹配項。有關每個命令的更多資訊,請參閱:ins-completion

完成檔案名稱

讓我們以 CTRL-X CTRL-F 為例。這將尋找檔案名稱。它會掃描目前目錄中的檔案,並顯示每個與游標前單字匹配的檔案。例如,假設您在目前目錄中有以下檔案
main.c sub_count.c sub_done.c sub_exit.c
現在進入插入模式並開始輸入
The exit code is in the file sub
此時,您輸入命令 CTRL-X CTRL-F。現在 Vim 會查看目前目錄中的檔案,並完成目前的單字 "sub"。第一個匹配項是 sub_count.c。這不是您想要的,因此您輸入 CTRL-N 來匹配下一個檔案。此匹配項是 sub_done.c。再次輸入 CTRL-N 會帶您到 sub_exit.c。結果是
The exit code is in the file sub_exit.c
如果檔案名稱以 / (Unix) 或 C:\ (MS-Windows) 開頭,您可以在檔案系統中找到所有檔案。例如,輸入 "/u" 和 CTRL-X CTRL-F。這將匹配 "/usr"(這是 Unix 上的情況)
the file is found in /usr/
如果您現在按下 CTRL-N,您將返回 "/u"。相反,要接受 "/usr/" 並深入一個目錄層級,請再次使用 CTRL-X CTRL-F
the file is found in /usr/X11R6/
結果取決於您在檔案系統中找到的內容。匹配項會依字母順序排序。

完成原始碼

原始碼檔案結構良好。這使得可以以智慧方式進行自動完成。在 Vim 中,這稱為 Omni 自動完成。在其他一些編輯器中,它稱為 intellisense,但這是一個商標。
Omni 自動完成的關鍵是 CTRL-X CTRL-O。顯然,這裡的 O 代表 Omni,這樣您就更容易記住它。讓我們以編輯 C 原始碼為例
{
    struct foo *p;
    p->
游標位於 "p->" 之後。現在輸入 CTRL-X CTRL-O。Vim 會為您提供一個替代方案清單,這些方案是 "struct foo" 包含的項目。這與使用 CTRL-P 完全不同,後者會完成任何單字,而此處只有 "struct foo" 的成員才有效。
要使 Omni 自動完成正常工作,您可能需要進行一些設定。至少要確保啟用 filetype 外掛程式。您的 vimrc 檔案應包含類似以下的一行
filetype plugin on
filetype plugin indent on
對於 C 程式碼,您需要建立標籤檔案並設定 'tags' 選項。這在 ft-c-omni 中進行了說明。對於其他檔案類型,您可能需要執行類似的操作,請參閱下面的 compl-omni-filetypes。它僅適用於特定的檔案類型。請檢查 'omnifunc' 選項的值,以瞭解它是否有效。

24.4 重複插入

如果您按下 CTRL-A,編輯器會插入您上次處於插入模式時輸入的文字。例如,假設您有一個以以下內容開頭的檔案
"file.h" ~
/* Main program begins */ ~
您透過在第一行開頭插入 "#include " 來編輯此檔案
#include "file.h" ~
/* Main program begins */ ~
您使用命令 "j^" 下移到下一行的開頭。現在您開始插入新的 "#include" 行。因此您輸入
i CTRL-A
結果如下
#include "file.h" ~
#include /* Main program begins */ ~
之所以插入「#include "」是因為 CTRL-A 會插入前一個插入的文字。現在你輸入「main.h」<Enter> 來完成這一行。
#include "file.h" ~
#include "main.h" ~
/* Main program begins */ ~
CTRL-@ 命令會執行 CTRL-A,然後退出插入模式。這是一個快速重複相同插入的方法。

24.5 從另一行複製

CTRL-Y 命令會插入游標上方的字元。當你要複製前一行時,這很有用。例如,你有這行 C 程式碼:
b_array[i]->s_next = a_array[i]->s_next;
現在你需要輸入相同的行,但將「s_next」替換為「s_prev」。開始新的一行,然後按 CTRL-Y 14 次,直到游標位於「next」的「n」上。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_
現在你輸入「prev」。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev
繼續按 CTRL-Y 直到下一個「next」。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev = a_array[i]->s_
現在輸入「prev;」來完成它。
CTRL-E 命令的作用類似 CTRL-Y,但它會插入游標下方的字元。

24.6 插入暫存器

命令 CTRL-R {暫存器} 會插入暫存器的內容。這有助於避免輸入長單字。例如,你需要輸入:
r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c)
函數名稱定義在另一個檔案中。編輯該檔案,將游標移到該處的函數名稱上,然後將其複製到暫存器 v 中。
"vyiw
「v」是暫存器指定符,「yiw」是複製內單字。現在編輯要插入新行的檔案,並輸入首幾個字母:
r =
現在使用 CTRL-R v 來插入函數名稱。
r = VeryLongFunction
你繼續輸入函數名稱之間的字元,並再使用 CTRL-R v 兩次。你可以使用完成功能來達到相同的效果。當有許多單字以相同的字元開頭時,使用暫存器很有用。
如果暫存器包含諸如 <BS> 或其他特殊字元,它們會被視為從鍵盤輸入。如果你不希望發生這種情況(你真的希望 <BS> 被插入到文字中),請使用命令 CTRL-R CTRL-R {暫存器}

24.7 縮寫

縮寫是一個簡短的單字,可以代替一個長單字。例如,「ad」代表「advertisement」(廣告)。Vim 允許你輸入縮寫,然後會自動為你展開它。要告訴 Vim 每次插入「ad」時都展開為「advertisement」,請使用以下命令:
:iabbrev ad advertisement
現在,當你輸入「ad」時,整個單字「advertisement」將被插入到文字中。這會在你輸入一個不能作為單字一部分的字元時觸發,例如空格。
輸入的內容 你看到的內容
I saw the a I saw the a
I saw the ad I saw the ad
I saw the ad<Space> I saw the advertisement<Space>
當只輸入「ad」時,不會發生展開。這允許你輸入像「add」這樣的單字,它不會被展開。只有整個單字才會檢查是否有縮寫。

縮寫多個單字

可以定義一個縮寫,產生多個單字。例如,要將「JB」定義為「Jack Benny」,請使用以下命令:
:iabbrev JB Jack Benny
身為程式設計師,我使用兩個相當不尋常的縮寫:
:iabbrev #b /****************************************
:iabbrev #e <Space>****************************************/
這些用於建立框線註解。註解以 #b 開始,它會繪製頂線。然後我輸入註解文字,並使用 #e 來繪製底線。請注意,#e 縮寫以空格開頭。換句話說,前兩個字元是空格-星號。通常 Vim 會忽略縮寫和展開之間的空格。為避免此問題,我將空格拼寫為七個字元:<, S, p, a, c, e, >。
注意:「:iabbrev」是一個很長的輸入。 「:iab」也一樣有效。這是在縮寫縮寫命令!

修正輸入錯誤

每次都犯相同的輸入錯誤很常見。例如,輸入「teh」而不是「the」。你可以使用縮寫來修正此問題:
:abbreviate teh the
你可以新增一整串這些。每次發現常見錯誤時,就新增一個。

列出縮寫

「:abbreviate」命令會列出縮寫。
:abbreviate
i  #e                  ****************************************/
i  #b                 /****************************************
i  JB                 Jack Benny
i  ad                 advertisement
!  teh                 the
第一欄的「i」表示插入模式。這些縮寫僅在插入模式中有效。其他可能的字元是:
c 命令列模式 :cabbrev ! 插入和命令列模式 :abbreviate
由於縮寫在命令列模式中通常不太有用,你大多會使用「:iabbrev」命令。這避免了,例如,當輸入像這樣的命令時,「ad」被展開:
:edit ad

刪除縮寫

要刪除縮寫,請使用「:unabbreviate」命令。假設你有以下縮寫:
:abbreviate @f fresh
你可以使用此命令刪除它:
:unabbreviate @f
當你輸入此命令時,你會注意到 @f 被展開為「fresh」。別擔心,Vim 仍然會理解它(除非你有「fresh」的縮寫,但這不太可能)。要刪除所有縮寫:
:abclear
「:unabbreviate」和「:abclear」也有插入模式(「:iunabbreviate 和 :iabclear」)和命令列模式(「:cunabbreviate」和「:cabclear」)的變體。

重新對應縮寫

在定義縮寫時,有一件事要注意:產生的字串不應該被對應。例如:
:abbreviate @a adder
:imap dd disk-door
現在當你輸入 @a 時,你會得到「adisk-doorer」。這不是你想要的。為了避免這種情況,請使用「:noreabbrev」命令。它的作用與「:abbreviate」相同,但避免了產生的字串被用於對應。
:noreabbrev @a adder
幸運的是,縮寫的結果被對應的情況不太可能發生。

24.8 輸入特殊字元

CTRL-V 命令用於以字面方式插入下一個字元。換句話說,該字元的任何特殊含義都將被忽略。例如:
CTRL-V <Esc>
插入一個跳脫字元。因此你不會離開插入模式。(不要在 CTRL-V 後面輸入空格,這只是為了讓它更容易閱讀)。
注意:在 MS-Windows 上,CTRL-V 用於貼上文字。使用 CTRL-Q 而不是 CTRL-V。另一方面,在 Unix 上,CTRL-Q 在某些終端機上無法運作,因為它具有特殊含義。
你也可以使用命令 CTRL-V {數字} 來插入十進位數字為 {數字} 的字元。例如,字元編號 127 是 <Del> 字元(但不一定是 <Del> 鍵!)。要插入 <Del>,請輸入:
CTRL-V 127
你可以用這種方式輸入最多 255 個字元。當你輸入少於兩位數字時,非數字字元會終止命令。為了避免需要輸入非數字字元,請在前面加上一或兩個零以形成三位數字。接下來的所有命令都會插入一個 <Tab>,然後是一個點。
CTRL-V 9. CTRL-V 09. CTRL-V 009.
要以十六進位輸入字元,請在 CTRL-V 後面使用「x」。
CTRL-V x7f
這也適用於最多 255 個字元 (CTRL-V xff)。你可以使用「o」將字元輸入為八進位數字,另有兩種方法可讓你輸入最多 16 位元和 32 位元的數字(例如,對於 Unicode 字元)。
CTRL-V o123
CTRL-V u1234
CTRL-V U12345678

24.9 二合字母

有些字元不在鍵盤上。例如,版權符號(©)。要在 Vim 中輸入這些字元,請使用二合字母,其中兩個字元代表一個字元。例如,要輸入 ©,請按三個鍵:
CTRL-K Co
要找出有哪些二合字母可用,請使用以下命令:
:digraphs
Vim 將顯示二合字母表。以下是其中的三行:
AC ~_ 159 NS | 160 !I ¡ 161 Ct ¢ 162 Pd £ 163 Cu ¤ 164 Ye ¥ 165
BB ¦ 166 SE § 167 ': ¨ 168 Co © 169 -a ª 170 << « 171 NO ¬ 172
-- ­ 173 Rg ® 174 'm ¯ 175 DG ° 176 +- ± 177 2S ² 178 3S ³ 179
例如,這表示輸入 CTRL-K Pd 所得到的二合字母是字元(£)。這是字元編號 163(十進位)。Pd 是磅的簡寫。大多數二合字母的選擇都會給你關於它們將產生字元的提示。如果你仔細查看清單,就會了解其中的邏輯。如果該組合沒有二合字母,你可以交換第一個和第二個字元。因此,CTRL-K dP 也有效。由於「dP」沒有二合字母,Vim 也會搜尋「Pd」二合字母。
注意:二合字母取決於 Vim 假設你使用的字元集。請務必使用「:digraphs」來找出目前可用的二合字母。
你可以定義自己的二合字母。範例:
:digraph a" ä
這定義了 CTRL-K a" 會插入一個 ä 字元。你也可以使用十進位數字指定字元。這定義了相同的二合字母。
:digraph a" 228
有關二合字母的詳細資訊,請參閱此處:二合字母 另一種插入特殊字元的方法是使用鍵盤對應。有關詳細資訊,請參閱此處:45.5

24.10 一般模式命令

插入模式提供的命令數量有限。在一般模式中,你有更多命令。當你要使用其中一個命令時,通常會使用 <Esc> 離開插入模式,執行一般模式命令,然後使用「i」或「a」重新進入插入模式。有一個更快的方法。使用 CTRL-O {命令},你可以從插入模式執行任何一般模式命令。例如,要從游標刪除到行尾:
CTRL-O D
你只能以這種方式執行一個一般模式命令。但是你可以指定暫存器或計數。更複雜的範例:
CTRL-O "g3dw
這會刪除到第三個單字,並將其放入暫存器 g 中。
下一章:usr_25.txt 編輯格式化文字
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速參考