*usr_24.txt* For Vim version 7.3. 最近更新: 2006年12月VIM 用戶手冊 - Bram Moolenaar 著
譯者
: Chimin Yen,tocer http://vimcdoc.sf.net快速插入輸入文本時,Vim 提供你各種各樣的方法來減少鍵擊次數(shù)和避免打字錯誤。你可以利用插入模式下的補全功能來重復先前打過的單詞。也可以把長詞縮寫成短詞。甚至可以打出你鍵盤上沒有的字符。|24.1| 更正 > CTRL+W CTRL+U|24.2| 顯示匹配 > :set showmatch|24.3| 補全 > CTRL+P CTRL+N CTRL+X {CTRL+F,CTRL+V,CTRL+O,CTRL+I,CTRL+L,CTRL+D,CTRL+K,CTRL+T}|24.4| 重復一次插入 > CTRL+A CTRL+@|24.5| 從另一行拷貝 > CTRL+Y CTRL+E|24.6| 插入一個寄存器內(nèi)容 > CTRL+R|24.7| 縮寫 > iabb|24.8| 插入特殊字符 > CTRL+V CTRL+Q 65 x44 o071|24.9| 二合字母 > CTRL+K Co :digraphs|24.10| 普通模式命令下一章: |usr_25.txt| 編輯帶格式的文本前一章: |usr_23.txt| 編輯特殊文件目錄: |usr_toc.txt|
*24.1* 更正
退格鍵<BS>
已經(jīng)在前面提過了。它刪除位于光標前一格的字符。而刪除鍵<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
當你發(fā)現(xiàn)幾個詞之前有個錯誤,你需要把光標移到那兒作更正。例如,你打了這樣一行:The horse had follen to the ground
你要把 "follen" 改成 "fallen"。讓光標留在行尾,你輸入這個字符串就能更正那錯誤:
<Esc>
4blraA脫離插入模式
<Esc>
退回 4 個單詞 4b移到字母 "o" 上 l以字母 "a" 替代 ra重新開始插入模式 A另一種更正這個錯誤的方法:
<C-Left>
<C-Left>
<C-Left>
<C-Left>
<Right>
<Del>
a<End>
退回 4 個詞
<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
現(xiàn)在你鍵入比如 "(example)" 這樣幾個字,當你鍵入右括號 ) 時,Vim 就把光標閃到匹配的左括號 ( 上,在那兒停留半秒鐘,然后返回原處。如果匹配的左括號不存在,Vim 就鳴起響鈴。這樣你就會想起來你可能在哪兒忘了一個左括號,或鍵入了太多次的右括號。Vim 也會為 [] 和
{}
這樣的括號顯示匹配。你不必等待光標返回原處才鍵入下一個字符,只要下一個字符一鍵入,光標就會返回,而插入就會跟以前一樣繼續(xù)。你可以用 'matchtime' 選項改變 Vim 在匹配括號上停留的時間。例如,要讓 Vim 等待 1.5 秒::set matchtime=15
指定的時間以 1/10 秒為單位。
*24.3* 補全
Vim 能自動補全插入的單詞。你鍵入一個單詞的開頭部分,按CTRL-P
,Vim 就會為你猜測余下的部分。例如,假定你正在建立一個 C 程序,并要鍵入以下語句:total = ch_array[0] + ch_array[1] + ch_array[2];
你先輸入下面這部分:total = ch_array[0] + ch_
此時,你用命令CTRL-P
告訴 Vim 來補全這個詞。Vim 就會搜索以光標前字符串開頭的詞。在這個例子中,就是 "ch_",與詞 ch_array 匹配。所以,鍵入CTRL-P
就會得到下面的結(jié)果:total = ch_array[0] + ch_array
再鍵入幾個字符使這個語句變成這樣 (結(jié)尾是空格):total = ch_array[0] + ch_array[1] +
如果你現(xiàn)在鍵入CTRL-P
,Vim 將再次搜索以補全光標前的詞。由于光標前是空格,它找到的是之前的第一個詞,即 "ch_array"。再鍵入CTRL-P
給你下一個匹配的詞,在本例中就是 "total"。第三次CTRL-P
搜尋更前面的。如果那兒沒其它的了,編輯器就會陷入無詞可配狀態(tài),所以搜索就返回原處,即那個空格。第四次CTRL-P
導致編輯器周而復始,又找到 "ch_array"。往下搜索,用CTRL-N
。由于在文件結(jié)尾搜索又繞回開頭,CTRL-N
和CTRL-P
將找到相同的匹配,但順序不同。提示:CTRL-N
意為下一個匹配,而CTRL-P
意為前一個匹配。(譯者
: 英文 Next 意為下一個,Previous 意為前一個)Vim 編輯器會非常努力的來補全不完整的詞。默認情況下,它搜索如下一些地方:1.當前文件2.其它窗口內(nèi)的文件3.其它載入文件 (隱藏緩沖區(qū))4.未載入文件 (非激活緩沖區(qū))5.標簽文件6.被當前文件以 #include 語句包含的所有頭文件選 項你可以利用 'complete' 選項定制搜索順序。還可以使用 'ignorecase' 選項。設(shè)定這個選項后,搜尋匹配時大小寫的區(qū)別就會被忽略。一個特殊的補全選項是 'infercase'。它的用處是在尋找忽略大小寫的匹配時('ignorecase' 必須先被設(shè)定),但仍然采用已鍵入部分的大小寫。這樣,如果你鍵入"For" 而 Vim 找到了匹配 "fortunately",所產(chǎn)生的結(jié)果將是 "Fortunately"。補 全 特 定 文 本如果你知道你要找什么,那么你可以用這些命令來補全某種類型的文本:CTRL-X
CTRL-F
文件名CTRL-X
CTRL-L
整行CTRL-X
CTRL-D
宏定義 (包括包含文件里的)CTRL-X
CTRL-I
當前文件以及所包含的文件CTRL-X
CTRL-K
字典文件內(nèi)的單詞CTRL-X
CTRL-T
同義詞詞典文件內(nèi)的單詞CTRL-X
CTRL-]
標簽CTRL-X
CTRL-V
Vim 命令行每個命令之后,CTRL-N
可以用來搜索下一個匹配,而CTRL-P
則用于搜索前一個匹配。關(guān)于每個命令的詳細用法,參見: |ins-completion|。補 全 文 件 名我們以CTRL-X
CTRL-F
為例。這個命令將找尋文件名。它在當前目錄里搜索文件,并顯示每一個與光標前單詞匹配的文件名。例如,假定你在當前目錄里有下面這些文件:main.c sub_count.c sub_done.c sub_exit.c現(xiàn)在進入插入模式并開始鍵入:The exit code is in the file sub
就在這點上,你輸入CTRL-X
CTRL-F
。現(xiàn)在,Vim 通過查看當前目錄里的文件來補全當前詞 "sub"。最初的匹配是 sub_count.c。這不是你想要的,所以你按CTRL-N
以匹配下一個文件。這次匹配的是 sub_done.c。再鍵入CTRL-N
給了你 sub_exit.c。結(jié)果:The exit code is in the file sub_exit.c
如果文件名以 / (Unix) 或 C:\ (MS-Windows) 開頭,那么你就能搜索文件系統(tǒng)下所有的文件。例如,鍵入 "/u" 然后CTRL-X
CTRL-F
,這將匹配 "/usr" (這是在 Unix 上):the file is found in /usr/
如果你現(xiàn)在按CTRL-N
,你就又回到 "/u"。接受 "/usr/" 并進入下一層目錄,再來一次CTRL-X
CTRL-F
:the file is found in /usr/X11R6/
當然,匹配結(jié)果取決于你的文件系統(tǒng)上有什么文件。匹配結(jié)果以字母順序來排列。補 全 源 代 碼源代碼文件有良好的結(jié)構(gòu)。這使通過某種智能方式補全成為可能。在 Vim 中,這被稱為全能補全。在其他編輯器中,它被稱為智能補全(intellisense),但這是一個注冊商標。全能補全的熱鍵是CTRL-X
CTRL-O
。顯然,O 在這里代表全能 (Omni),這樣方便我們記憶。讓我們以編輯 C 程序為例:
{
struct foo *p;
p->
光標在 "p->" 之后?,F(xiàn)在鍵入
CTRL-X
CTRL-O
。Vim 會給你提供一個可選項的列表,這些可選項為 "struct foo" 所擁有。這和使用CTRL-P
有很大不同,后者補全任意單詞,而我們這里只要求 "struct foo" 的成員。為使全能補全工作,需要做一些初始化。起碼,要保證打開文件類型插件。你的 vimrc文件應(yīng)該包含形如:filetype plugin on
或:filetype plugin indent on
的一行。對于 C 代碼,需要建立標簽文件并設(shè)置 'tags' 選項。在|ft-c-omni|中有進一步的解釋。對于其他文件類型,需要做類似的事情,請查看 |*24.4* 重復一次插入
如果你按CTRL-A
,編輯器就把你上次在插入模式下輸入的文本再輸入一次。比如,假定你有個文件,開頭是這樣的:"file.h"
/* Main program begins */
你在第一行開始處插入 "#include ":#include "file.h"
/* Main program begins */
你再用命令 "j^" 往下來到下一行的開始處?,F(xiàn)在你開始插入一個新的 "#include" 行。所以你鍵入:i
CTRL-A
結(jié)果就像下面這樣:
#include "file.h"
#include /* Main program begins */
"#include " 被插入是因為CTRL-A
會插入上次插入過的文本?,F(xiàn)在你鍵入 "main.h"<Enter>
以結(jié)束這一行:#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;
現(xiàn)在你需要把這一行再鍵入一次,并以 "s_prev" 取代 "s_next"。換行以后,按 14 次CTRL-Y
,直到光標位于 "next" 的 "n" 上:b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_
現(xiàn)在你鍵入 "prev":b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev
繼續(xù)按CTRL-Y
直到下一個 "next":b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev = a_array[i]->s_
現(xiàn)在鍵入 "prev;" 以結(jié)束這一行。CTRL-E
命令操作起來跟CTRL-Y
一樣,只不過它插入光標下方的字符。*24.6* 插入一個寄存器內(nèi)容
命令CTRL-R
{register}
插入寄存器里的內(nèi)容。它的用處是讓你不必鍵入長詞。例如,你要輸入下面這些:r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c)
這個函數(shù)的定義見于另一個文件。編輯那個文件并把光標移到該函數(shù)名上,然后把文件名攝入寄存器 v:"vyiw
"v 指定寄存器,"yiw" 意思是拷貝一個詞,不含空格 (yank-inner-word)?,F(xiàn)在編輯那個要插入一行代碼的文件,先鍵入開頭幾個字符:
r =
現(xiàn)在用CTRL-R
v 來插入函數(shù)名:r = VeryLongFunction
你接下來在函數(shù)名后面鍵入其它必要字符,然后再用兩次CTRL-R
v。你也可以用補全功能來完成同樣的工作。但當你有好幾個詞,其開頭幾個字符都一樣的時候,寄存器就有用多了。如果寄存器存放著諸如<BS>
或其它特殊字符,這些字符就被解釋成好像它們本來是從鍵盤鍵入的。如果你不要這樣解釋 (你確實要在文本中插入<BS>
),那么要命令CTRL-R
CTRL-R
{register}
。*24.7* 縮寫
縮寫是取代一個長詞的短詞。例如,"ad" 指代 "advertisement"。Vim 讓你鍵入縮寫,然后為你自動擴展。用以下命令告訴 Vim,每當你輸入 "ad" 就把它擴展成 "advertisement"::iabbrev ad advertisement
現(xiàn)在,當你鍵入 "ad",完整的單詞 'advertisement" 就被插入文本。鍵入一個不可能成為單詞一部分的字符,例如一個空格,就會觸發(fā)縮寫功能:輸入的文本 看到的文本
I saw the a I saw the a
I saw the ad I saw the ad
I saw the ad
當你僅僅鍵入 "ad" 時,擴展并沒發(fā)生。它可以被你輸入 "add" 這樣的詞而不被擴展。Vim 只對那些完整的詞檢查縮寫。多 詞 縮 寫為幾個詞定義一個縮寫也是可能的。例如,用下面這個命令,把 "JB" 定義成 "JackBenny":<Space>
I saw the advertisement<Space>
:iabbrev JB Jack Benny
作為程序員,我使用兩個相當不尋常的縮寫:
:iabbrev #b /****************************************
:iabbrev #e
<Space>
****************************************/它們用于生成大段注釋。注釋以縮寫 #b 開始,劃出頂線。接著,我鍵入注釋文字,最后以縮寫 #e 劃出底線。
注意
縮寫 #e 以一個空格開頭。換言之,開頭兩個字符是空格和星號 (*)。通常 Vim忽略不計位于縮寫及其擴展之間的空格。為了避免空格被忽略,我把空格以七個字符表示:<、S、p、a、c、e、>
。備注
:":iabbrev" 有點嫌長。":iab" 作用也一樣。縮寫命令被縮寫了!更 正 打 字 錯 誤我們經(jīng)常會犯同一個打字錯誤。例如,把 "the" 打成 "teh"。你可以利用縮寫功能來更正這樣的錯誤::abbreviate teh the
你可以加上一系列這樣的縮寫。每次發(fā)現(xiàn)一個常見錯誤就加一個??s 寫 列 表":abbreviate" 命令列出所有縮寫::abbreviatei #e ****************************************/i #b /****************************************i JB Jack Bennyi 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"??s 寫 再 映 射定義縮寫時,有一點要
注意
的: 擴展產(chǎn)生的字符串不應(yīng)當被映射成別的什么。例如::abbreviate @a adder
:imap dd disk-door
現(xiàn)在,你鍵入 @a,你得到 "adisk-doorer"。那不是你要的結(jié)果。為了避免這種事發(fā)生,用 ":noreabbrev" 命令。它的作用跟 ":abbreviate" 一樣,但卻避免了擴展產(chǎn)生的字符串被用于映射:
:noreabbrev @a adder
現(xiàn)在好了,縮寫擴展后的結(jié)果不可能被映射了。
*24.8* 插入特殊字符
CTRL-V
命令用來插入下一個字面意義上的字符。換言之,無論該字符多特殊,其特殊含義都被忽略不計。例如:
CTRL-V
<Esc>
插入一個
<Esc>
字符。而你并未脫離插入模式。(不要在CTRL-V
后面鍵入空格,那個空格僅僅為了方便閱讀)。備注
:在 MS-Windows 環(huán)境下,CTRL-V
用來粘貼文本。所以用CTRL-Q
代替CTRL-V
。另外,在 Unix 環(huán)境下,CTRL-Q
在某些終端上不起作用,因其另有特殊意義。你也可以用命令CTRL-V
{digits}
來插入一個以若干個十進位數(shù)字{digits}
表示的字符。例如,字符編碼 127 是字符<Del>
(但并不一定是<Del>
鍵!)。要插入<Del>
,鍵入:
CTRL-V
127你可以用這樣的方法輸入數(shù)值不超過 255 的字符。當你鍵入一個不足兩位的數(shù)字時,就要添加一個非數(shù)字的字符來結(jié)束命令。為了回避這個非數(shù)字字符的要求,在它前面加一或兩個零以滿足三位數(shù)的要求。以下命令都插入一個
<Tab>
字符,然后一個點字符:CTRL-V
9.CTRL-V
09.CTRL-V
009.輸入一個 16 進制數(shù)字,在CTRL-V
后面,用 "x" 開頭:
CTRL-V
x7f這方法也可以用來輸入數(shù)值不超過 255 (
CTRL-V
xff) 的字符。你可以用 "o" 開頭輸入一個以 8 進制數(shù)表示的字符,以及另外兩種方法,讓你輸入多至二進制 16 位和 32 位的數(shù)字表示的字符 (例如,Unicode 字符):
CTRL-V
o123
CTRL-V
u1234
CTRL-V
U12345678*24.9* 二合字母
有些字符在鍵盤上找不到。例如,表示版權(quán)的字符 (©) 要在 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 是 Pound (英鎊) 的簡寫。大多數(shù)二合字母讓你一看就猜到兩個字符生成什么字符。如果你一個個讀下來,便不難理解其中的邏輯。你可以交換兩個字符的順序,只要那樣組合不代表另一個二合字母。因此CTRL-K
dP也沒問題。由于 "dP" 不是二合字母,Vim 會轉(zhuǎn)而搜索表示成 "Pd" 的二合字母。備注
:二合字母表取決于 Vim 假定你所使用的字符集。在 MS-DOS 系統(tǒng)上采用的二合字母集不同于 MS-Windows 系統(tǒng)上的。務(wù)必用 ":digraphs" 命令來查找當前可供利用的二合字符。你可以定義你自己的二合字母。例如::digraph a" ä
以上命令定義了
CTRL-K
a" 插入一個 ä 字符。你也可以用十進值數(shù)指定這個字符。下面這個命令定義了同一個二合字母::digraph a" 228
更多關(guān)于二合字母信息參見: |digraphs|另一種插入特殊字符的方法是利用鍵盤映射。詳情參見: |45.5|
*24.10* 普通模式命令
插入模式提供的命令數(shù)量有限。在普通模式下,你可用的命令就多得多了。當你要用一個普通模式命令時,你通常用<Esc>
鍵來脫離插入模式,執(zhí)行這個普通模式命令,然后再用 "i" 或 "a" 命令重新進入插入模式。有一個快捷的方法。用CTRL-O
{command}
你可以在插入模式下執(zhí)行任何普通模式命令。例如,把光標后面直至行尾的文本刪除:
CTRL-O
D用這個方法,你只能執(zhí)行一個普通模式命令。但是,你可以指定一個寄存器或一個計數(shù)。請看下面這個更復雜的命令:
CTRL-O
"g3dw這個命令把光標后面三個單詞一起刪除,存進了寄存器 g。
下一章: |usr_25.txt| 編輯帶格式的文本版權(quán): 參見 |manual-copyright| vim:tw=78:ts=8:ft=help:norl:Generated by vim2html on Wed Sep 8 00:16:19 UTC 2010