*insert.txt* For Vim version 7.1. 最近更新: 2007年5月
VIM å‚考手册 by Bram Moolenaar
译者: Willis,tocer
http://vimcdoc.sf.net
*Insert* *Insert-mode*
æ’å…¥å’Œæ›¿æ¢æ–‡æœ¬ *mode-ins-repl*
本文件主è¦è®¨è®ºæ’å…¥å’Œæ›¿æ¢æ¨¡å¼ã€‚最åŽè®¨è®ºä¸€äº›å…¶å®ƒæ–¹å¼æ’入文本的命令。
最常用的命令的总览å¯ä»¥åœ¨ç”¨æˆ·æ‰‹å†Œç¬¬ 24 ç« |usr_24.txt| 找到。
1. 特殊键 |ins-special-keys|
2. 特殊的特殊键 |ins-special-special|
3. 'textwidth' 和 'wrapmargin' 选项 |ins-textwidth|
4. 'expandtab'ã€'smarttab' å’Œ 'softtabstop' 选项 |ins-expandtab|
5. æ›¿æ¢æ¨¡å¼ |Replace-mode|
6. è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ |Virtual-Replace-mode|
7. æ’入模å¼è¡¥å…¨ |ins-completion|
8. æ’入模å¼å‘½ä»¤ |inserting|
9. Ex æ’入命令 |inserting-ex|
10. æ’入文件 |inserting-file|
å…³äºŽå¦‚ä½•ç§»åŠ¨å…‰æ ‡åˆ°æ²¡æœ‰å—符的ä½ç½®ï¼Œå¦è§ 'virtualedit'ã€‚å¯¹ç¼–è¾‘è¡¨æ ¼æœ‰ç”¨ã€‚
1. 特殊键 *ins-special-keys*
在æ’å…¥å’Œæ›¿æ¢æ¨¡å¼é‡Œï¼Œä»¥ä¸‹å—符有特殊å«ä¹‰ï¼›å…¶å®ƒå—符被直接æ’å…¥ã€‚è¦æ’入这些特殊å—符 到缓冲区里,在å‰é¢åŠ ä¸ŠCTRL-Vã€‚è¦æ’å…¥<Nul>å—符,使用 "CTRL-VCTRL-@" 或者 "CTRL-V000"ã€‚åœ¨æœ‰çš„ç³»ç»Ÿä¸Šï¼Œä½ å¿…é¡»ä½¿ç”¨ "CTRL-V003" æ¥æ’å…¥CTRL-C。注æ„: 如果CTRL-Vè¢«æ˜ å°„ï¼Œä½ ä¹Ÿè®¸ä¼šç»å¸¸ä½¿ç”¨CTRL-Qæ¥ä»£æ›¿ |i_CTRL-Q|。 如果æ’å…¥æ—¶ä½ åœ¨ç‰¹æ®Šçš„è¯è¨€æ¨¡å¼ä¸‹å·¥ä½œï¼Œå‚è§ 'langmap' 选项 |'langmap'| äº†è§£å¦‚ä½•é¿ å…åå¤è¿›å‡ºè¿™äº›æ¨¡å¼ã€‚ 如果置ä½äº† 'insertmode',<Esc>和一些其它的键有å¦å¤–çš„å«ä¹‰ã€‚è§ |'insertmode'|。å—符 动作
*i_CTRL-[* *i_<Esc>*
<Esc> 或 CTRL-[ ç»“æŸæ’å…¥æˆ–æ›¿æ¢æ¨¡å¼ï¼Œå›žåˆ°æ™®é€šæ¨¡å¼ã€‚结æŸç¼©å†™ã€‚
注æ„: å¦‚æžœä½ å¾ˆéš¾åœ¨é”®ç›˜ä¸Šæ•²ä¸Š <Esc> 键,è®ç»ƒè‡ªå·±ä½¿ç”¨ CTRL-[。
*i_CTRL-C*
CTRL-C 退出æ’入模å¼ï¼Œå›žåˆ°æ™®é€šæ¨¡å¼ã€‚䏿£€æŸ¥ç¼©å†™ã€‚䏿¿€æ´» |InsertLeave|
自动命令事件。
*i_CTRL-@*
CTRL-@ æ’入最近æ’å…¥çš„æ–‡æœ¬ï¼Œå¹¶åœæ¢æ’å…¥ {Vi: 仅当敲入第一个å—符时,而且
åªé™äºŽå‰ 128 个å—符}
*i_CTRL-A*
CTRL-A æ’入最近æ’入的文本。{Vi æ— æ¤åŠŸèƒ½}
*i_CTRL-H* *i_<BS>* *i_BS*
<BS> 或 CTRL-H åˆ é™¤å…‰æ ‡å‰çš„å—符 (å…³äºŽè¿žæŽ¥è¡Œï¼Œè§ |i_backspacing|)。
å¦‚æžœä½ çš„ <BS> 键䏿£ç¡®ï¼Œè§ |:fixdel|。{Vi: ä¸åˆ 除自动的缩进}
*i_<Del>* *i_DEL*
<Del> åˆ é™¤å…‰æ ‡ä¸‹çš„å—ç¬¦ã€‚å¦‚æžœå…‰æ ‡åœ¨è¡Œå°¾ï¼Œå¹¶ä¸” 'backspace' 选项包括
"eol"ï¼Œåˆ é™¤ <EOL>;下一行就æ¤é™„åŠ äºŽå½“å‰è¡Œä¹‹åŽã€‚
å¦‚æžœä½ çš„ <Del> 键䏿£ç¡®ï¼Œè§ |:fixdel|。{Vi: ä¸åˆ 除自动的缩进}
{Vi æ— æ¤åŠŸèƒ½}
*i_CTRL-W*
CTRL-W åˆ é™¤å…‰æ ‡å‰çš„å•è¯ (å…³äºŽè¿žæŽ¥è¡Œï¼Œè§ |i_backspacing|)。关于å•è¯çš„
å®šä¹‰ï¼Œè§ |word-motions| 关于 "å•è¯åŠ¨ä½œ" 的定义。
*i_CTRL-U*
CTRL-U åˆ é™¤å…‰æ ‡æ‰€æœ‰è¾“å…¥çš„å—符 (å…³äºŽè¿žæŽ¥è¡Œï¼Œè§ |i_backspacing|)。
*i_CTRL-I* *i_<Tab>* *i_Tab*
<Tab> 或 CTRL-I æ’入制表。如果打开 'expandtab' 选项,ç‰ä»·æ•°ç›®çš„ç©ºæ ¼è¢«æ’å…¥ (使
用 CTRL-V <Tab> é¿å…è¿™ç§æ‰©å±•: 如果 CTRL-V è¢«æ˜ å°„ï¼Œå¯ä»¥ä½¿ç”¨
CTRL-Q <Tab>。|i_CTRL-Q|)。å¦è§ 'smarttab' 选项和
|ins-expandtab|。
*i_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> (两个键)。两个键都ä¸è€ƒè™‘æ˜ å°„ã€‚ {Vi æ— æ¤åŠŸèƒ½}
CTRL-N æŸ¥æ‰¾ä¸‹ä¸€ä¸ªå…³é”®å— (è§ |i_CTRL-N|)。{Vi æ— æ¤åŠŸèƒ½}
CTRL-P æŸ¥æ‰¾ä¸Šä¸€ä¸ªå…³é”®å— (è§ |i_CTRL-P|)。{Vi æ— æ¤åŠŸèƒ½}
CTRL-R {0-9a-z"%#*+:.-=} *i_CTRL-R*
æ’入寄å˜å™¨å†…容。在输入 CTRL-R 和第二个å—符之间,'"' 会显示出
æ¥ï¼Œä»¥æç¤ºä½ 需è¦è¾“入寄å˜å™¨çš„åå—。文本æ’入方å¼å’Œç›´æŽ¥è¾“入相åŒï¼Œ
但ä¸ä½¿ç”¨æ˜ 射和缩写。如果设置了 'textwidth'ã€'formatoptions' 或
'autoindent',æ’入的结果会å—到影å“。这和使用 "p" å‘½ä»¤å’Œç”¨é¼ æ ‡
粘贴文本ä¸åŒã€‚
特殊寄å˜å™¨:
'"' æ— å寄å˜å™¨ï¼ŒåŒ…嫿œ€è¿‘åˆ é™¤æˆ–æŠ½å‡ºçš„æ–‡æœ¬
'%' 当剿–‡ä»¶å
'#' è½®æ¢æ–‡ä»¶å
'*' 剪贴æ¿å†…容 (X11: 主选择)
'+' 剪贴æ¿å†…容
'/' 最近的æœç´¢æ¨¡å¼
':' 最近的命令行
'.' 最近æ’入的文本
'-' 最近的行内 (少于一行) åˆ é™¤
'=' 表达å¼å¯„å˜å™¨ï¼›ä½ 会被æç¤ºè¾“å…¥ä¸€ä¸ªè¡¨è¾¾å¼ (è§
|expression|)
æ³¨æ„ 0x80 (å进制 128) ç”¨äºŽç‰¹æ®Šé”®ã€‚ä¾‹å¦‚ï¼Œä½ å¯
ä»¥è¿™æ ·ç§»åŠ¨å…‰æ ‡å‘上:
CTRL-R ="\<Up>"
用 CTRL-R CTRL-R å¯ä»¥æŒ‰æœ¬ä¹‰æ’入文本。
如果结果是 |List|,里é¢çš„项目被看作行,之间以
æ¢è¡Œç¬¦è¿žæŽ¥ã€‚
关于寄å˜å™¨è§ |registers|。{Vi æ— æ¤åŠŸèƒ½}
CTRL-R CTRL-R {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-R*
æ’入寄å˜å™¨å†…容。和å•个 CTRL-R 类似,但是文本按本义æ’å…¥ï¼Œè€Œä¸æ˜¯
åƒé”®ç›˜è¾“å…¥é‚£æ ·ã€‚è¿™æ„味ç€å¦‚果寄å˜å™¨åŒ…å« <BS> è¿™æ ·çš„å—符,结果会
ä¸åŒã€‚例如,如果寄å˜å™¨åŒ…å« "ab^Hc":
CTRL-R a 产生 "ac"。
CTRL-R CTRL-R a 产生 "ab^Hc"。
'textwidth'ã€'formatoptions' ç‰ç‰é€‰é¡¹ä»ç„¶é€‚ç”¨ã€‚å¦‚æžœä½ è¿žè¿™äº›éƒ½
想é¿å…,使用 "<C-R><C-O>r",è§ä¸‹ã€‚
'.' 寄å˜å™¨ (最近æ’入的文本) ä¾ç„¶å¦‚åŒé”®ç›˜è¾“å…¥é‚£æ ·çš„æ–¹å¼æ’入。
{Vi æ— æ¤åŠŸèƒ½}
CTRL-R CTRL-O {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-O*
按本义æ’入寄å˜å™¨å†…容,并且ä¸è¿›è¡Œè‡ªåŠ¨ç¼©è¿›ã€‚å’Œé¼ æ ‡ç²˜è´´æ–‡æœ¬ç›¸åŒ
|<MiddleMouse>|。
ä¸ä¼šæ›¿æ¢å—符ï¼
'.' 寄å˜å™¨ (最近æ’入的文本) ä¾ç„¶å¦‚åŒé”®ç›˜è¾“å…¥é‚£æ ·çš„æ–¹å¼æ’入。
{Vi æ— æ¤åŠŸèƒ½}
CTRL-R CTRL-P {0-9a-z"%#*+/:.-=} *i_CTRL-R_CTRL-P*
按本义æ’入寄å˜å™¨å†…容,修æ£ç¼©è¿›ï¼Œå’Œ |[<MiddleMouse>| 类似。
ä¸ä¼šæ›¿æ¢å—符ï¼
'.' 寄å˜å™¨ (最近æ’入的文本) ä¾ç„¶å¦‚åŒé”®ç›˜è¾“å…¥é‚£æ ·çš„æ–¹å¼æ’入。
{Vi æ— æ¤åŠŸèƒ½}
*i_CTRL-T*
CTRL-T 在当å‰è¡Œå¼€å§‹å¤„æ’入一个 shiftwidth çš„ç¼©è¿›ã€‚ç¼©è¿›æ€»æ˜¯å–æ•´åˆ°
'shiftwidth' çš„å€æ•° (这是 vi 兼容的)。
{Vi: åªæœ‰åœ¨ç¼©è¿›å†…部æ‰èƒ½ç”¨}
*i_CTRL-D*
CTRL-D 在当å‰è¡Œå¼€å§‹å¤„åˆ é™¤ä¸€ä¸ª shiftwidth çš„ç¼©è¿›ã€‚ç¼©è¿›æ€»æ˜¯å–æ•´åˆ°
'shiftwidth' çš„å€æ•° (这是 vi 兼容的)。
{Vi: CTRL-D åªæœ‰åœ¨ä½¿ç”¨è‡ªåŠ¨ç¼©è¿›ä¹‹åŽæ‰æœ‰æ•ˆ}
*i_0_CTRL-D*
0 CTRL-D åˆ é™¤æ‰€æœ‰å½“å‰è¡Œçš„缩进。
{Vi: CTRL-D åªæœ‰åœ¨ä½¿ç”¨è‡ªåŠ¨ç¼©è¿›ä¹‹åŽæ‰æœ‰æ•ˆ}
*i_^_CTRL-D*
^ CTRL-D åˆ é™¤å½“å‰è¡Œçš„æ‰€æœ‰ç¼©è¿›ã€‚缩进在下一行上æ¢å¤ã€‚è¿™å¯ä»¥ç”¨äºŽæ’入巿 ‡ã€‚
{Vi: CTRL-D åªæœ‰åœ¨ä½¿ç”¨è‡ªåŠ¨ç¼©è¿›ä¹‹åŽæ‰æœ‰æ•ˆ}
*i_CTRL-V*
CTRL-V å¦‚æžœä¸‹ä¸€ä¸ªæ˜¯éžæ•°å—,按本义æ’入。对特殊键而言,æ’入其终端代ç 。
ä¸ç„¶ï¼Œè¾“入的是å—符的åã€å…«æˆ–åå…进制值。|i_CTRL-V_digit|。
CTRL-V 之åŽç´§æŽ¥ç€è¾“入的å—符ä¸ç»è¿‡æ˜ 射。
{Vi: 没有å进制å—节输入}
注æ„: 当 CTRL-V è¢«æ˜ å°„æ—¶ (例如,用æ¥ç²˜è´´æ–‡æœ¬)ï¼Œä½ å¯èƒ½ç»å¸¸éœ€è¦
使用 CTRL-Q æ¥ä»£æ›¿ã€‚|i_CTRL-Q|。
*i_CTRL-Q*
CTRL-Q ç‰åŒäºŽ CTRL-V。
注æ„: æœ‰çš„ç»ˆç«¯è¿žæŽ¥ä¼šåƒæŽ‰ CTRL-Q,导致该快æ·é”®æ— 效。在 GUI 版本
里就ä¸ä¼šå‡ºçŽ°è¿™æ ·çš„é—®é¢˜ã€‚
CTRL-X 进入 CTRL-X 模å¼ï¼Œä¸€ä¸ªå模å¼ã€‚é‚£é‡Œä½ å¯ä»¥ç»™å‡ºå‘½ä»¤æ¥è¡¥å…¨å•è¯æˆ–者
滚动窗å£ã€‚è§ |i_CTRL-X| å’Œ |ins-completion|。{Vi æ— æ¤åŠŸèƒ½}
*i_CTRL-E*
CTRL-E æ’å…¥å…‰æ ‡ä¸‹é¢çš„å—符。{Vi æ— æ¤åŠŸèƒ½}
*i_CTRL-Y*
CTRL-Y æ’å…¥å…‰æ ‡ä¸Šé¢çš„å—符。{Vi æ— æ¤åŠŸèƒ½}
æ³¨æ„ CTRL-E å’Œ CTRL-Y ä¸ä½¿ç”¨ 'textwidth',从而å¯ä»¥ä»Žé•¿è¡Œé‡Œå¤åˆ¶
å—符。
*i_CTRL-_*
CTRL-_ 切æ¢è¯è¨€ï¼Œå¦‚下:
- 在从å³åˆ°å·¦çš„窗å£é‡Œï¼Œåˆ‡æ¢ revins å’Œ nohkmapï¼Œå› ä¸ºåœ¨è¿™ç§æƒ…况
下英è¯çš„输入å¯èƒ½å°±æ˜¯å€’过æ¥çš„。
- 在éžä»Žå³åˆ°å·¦çš„窗å£é‡Œï¼Œåˆ‡æ¢ revins å’Œ hkmapã€‚å› ä¸ºå¸Œä¼¯æ¥è¯ç‰
è¯ç§å¯èƒ½æ˜¯å€’过æ¥è¾“入的。
CTRL-_ ç§»åŠ¨å…‰æ ‡åˆ°è¾“å…¥æ–‡æœ¬çš„å°¾éƒ¨ã€‚
è¯¥å‘½ä»¤åªæœ‰åœ¨ 'allowrevins' 选项置ä½çš„æ—¶å€™æ‰æœ‰æ•ˆã€‚
请å‚考 |rileft.txt|,那里å¯ä»¥äº†è§£åˆ°æ›´å¤šæœ‰å…³ä»Žå³åˆ°å·¦æ¨¡å¼çš„ä¿¡
æ¯ã€‚{Vi æ— æ¤åŠŸèƒ½}
åªæœ‰åœ¨ç¼–è¯‘æ—¶åŠ å…¥ |+rightleft| ç‰¹æ€§æ‰æœ‰æ•ˆã€‚
*i_CTRL-^*
CTRL-^ 切æ¢è¯è¨€å—符输入的使用方å¼ã€‚
如果定义了è¯è¨€æ˜ å°„ |:lmap|:
- 如果 'iminsert' 为 1 (使用 langmap æ˜ å°„)ï¼Œå˜æˆ 0 (ä¸ä½¿ç”¨
langmap æ˜ å°„)。
- 如果 'iminsert' ä¸ºå…¶å®ƒå€¼ï¼Œå˜æˆ 1ï¼Œè¿™æ ·æ‰“å¼€äº† langmap æ˜ å°„ã€‚
如果没有定义è¯è¨€æ˜ å°„:
- 如果 'iminsert' 为 2 (使用输入方法 (Input Method))ï¼Œå˜æˆ 0
(ä¸ä½¿ç”¨è¾“入方法)。
- 如果 'iminsert' ä¸ºå…¶å®ƒå€¼ï¼Œå˜æˆ 2,从而打开输入方法。
如果 "b:keymap_name" å˜é‡çš„值设为 1,'keymap' 选项或者
"<lang>" 出现在状æ€è¡Œä¸Šã€‚è¯è¨€æ˜ 射通常用æ¥è¾“å…¥ä¸åŒäºŽé”®ç›˜ä¸Šèƒ½ç›´
接产生的å—符。'keymap' 选项用æ¥å®‰è£…è‹¥å¹²å®Œæ•´çš„æ˜ å°„è¡¨ã€‚{Vi æ— æ¤
功能}
*i_CTRL-]*
CTRL-] 切æ¢ç¼©å†™ï¼Œä¸æ’å…¥å—符。{Vi æ— æ¤åŠŸèƒ½}
*i_<Insert>*
<Insert> åˆ‡æ¢æ’å…¥å’Œæ›¿æ¢æ¨¡å¼ã€‚{Vi æ— æ¤åŠŸèƒ½}
*i_backspacing*
<BS>ã€CTRL-W å’Œ CTRL-U 的效果决定于 'backspace' 选项 (除éžç½®ä½äº† 'revins')。这
时一个逗å·åˆ†éš”的项目列表:
项目 动作
indent å…è®¸é€€æ ¼åˆ é™¤è‡ªåŠ¨ç¼©è¿›
eol å…è®¸é€€æ ¼åˆ é™¤æ¢è¡Œç¬¦ (连接行)
start å…è®¸é€€æ ¼åˆ é™¤æ’入开始之å‰çš„ä½ç½®ï¼›CTRL-W å’Œ CTRL-U 在开始ä½ç½®åœæ¢
如果 'backspace' 为空,则使用 Vi å…¼å®¹çš„é€€æ ¼æ–¹å¼ã€‚ä¸èƒ½é€€æ ¼åˆ 除自动缩进ã€å›žåˆ°ç¬¬
一列之å‰ã€æˆ–者超过æ’入开始的地方。
为了åŽå‘兼容起è§ï¼Œå–值 "0"ã€"1" å’Œ "2" 也是å…è®¸çš„ï¼Œè§ |'backspace'|。
如果 'backspace' é€‰é¡¹çš„ç¡®åŒ…å« "eol"ï¼Œå…‰æ ‡åœ¨ç¬¬ä¸€åˆ—ï¼Œè€Œä½¿ç”¨äº†è¿™ä¸‰ä¸ªé”®ä¸çš„一个,
当å‰è¡Œä¼šå’Œä¸Šä¸€è¡Œè¿žæŽ¥ã€‚è¿™å®žé™…ä¸Šåˆ é™¤äº†å…‰æ ‡ä¹‹å‰çš„ <EOL>。
{Vi: ä¸ä¼šè·¨è¡Œï¼Œä¸ä¼šåˆ 除æ’入开始ä½ç½®ä¹‹å‰çš„内容}
*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> å—ç¬¦ï¼Œä½ éœ€è¦ä½¿ç”¨æ¢è¡Œã€‚
*i_CTRL-X* *insert_expand*
CTRL-X è¿›å…¥ä¸€ä¸ªåæ¨¡å¼ï¼Œé‚£é‡Œå¯ä»¥ä½¿ç”¨è‹¥å¹²å‘½ä»¤ã€‚ç»å¤§å¤šæ•°å‘½ä»¤æ‰§è¡Œå…³é”®å—补全;è§
|ins-completion|ã€‚åªæœ‰åœ¨ Vim ç¼–è¯‘æ—¶åŠ å…¥ |+insert_expand| 特性æ‰èƒ½ä½¿ç”¨è¿™äº›åŠŸ
能。
有两个命令å¯ä»¥åœ¨ä¸é€€å‡ºæ’入模å¼çš„å‰æä¸‹ä¸Šä¸‹æ»šåŠ¨çª—å£:
*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*
ä¸€äº›çš„é”®æ˜¯ç‰¹æ®Šçš„ã€‚å®ƒä»¬åœæ¢å½“å‰çš„æ’å…¥ï¼Œåšä¸€äº›äº‹æƒ…,然åŽé‡æ–°æ’入。这æ„味ç€ä½ å¯ä»¥ ä¸è„±ç¦»æ’入模å¼çš„æƒ…况下åšä¸€äº›äº‹æƒ…。这适åˆäºŽç»å¸¸ä½¿ç”¨æ’入模å¼çš„用户,就åƒç¼–辑器没 有å•独的普通模å¼ä¸€æ ·ã€‚这时,也å¯ä»¥è®¾ç½® 'backspace' 选项为 "indent,eol,start" è¿˜æœ‰ç½®ä½ 'insertmode' é€‰é¡¹ã€‚å¦‚æžœä½ æƒ³ç»™åŠŸèƒ½é”®æ˜ å°„åˆ°ä¸€ä¸ªå‘½ä»¤ï¼Œä½ å¯ä»¥ä½¿ç”¨CTRL-O。 这些键å‰åŽçš„æ”¹åЍ (æ’å…¥æˆ–è€…åˆ é™¤å—符) å¯ä»¥åˆ†åˆ«æ’¤é”€ã€‚åªæœ‰æœ€åŽçš„æ”¹åЍå¯ä»¥é‡åšï¼Œè€Œå…¶ 行为和 "i" 命令相当。å—符 动作
<Up>å…‰æ ‡ä¸Šç§»ä¸€è¡Œ *i_<Up>*<Down>å…‰æ ‡ä¸‹ç§»ä¸€è¡Œ *i_<Down>*CTRL-G<Up>å…‰æ ‡ä¸Šç§»ä¸€è¡Œï¼Œåˆ°æ’入开始时所在的列 *i_CTRL-G_<Up>*CTRL-Gk å…‰æ ‡ä¸Šç§»ä¸€è¡Œï¼Œåˆ°æ’入开始时所在的列 *i_CTRL-G_k*CTRL-GCTRL-Kå…‰æ ‡ä¸Šç§»ä¸€è¡Œï¼Œåˆ°æ’入开始时所在的列 *i_CTRL-G_CTRL-K*CTRL-G<Down>å…‰æ ‡ä¸‹ç§»ä¸€è¡Œï¼Œåˆ°æ’入开始时所在的列 *i_CTRL-G_<Down>*CTRL-Gj å…‰æ ‡ä¸‹ç§»ä¸€è¡Œï¼Œåˆ°æ’入开始时所在的列 *i_CTRL-G_j*CTRL-GCTRL-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>*<MouseDown>å‘下滚动三行 *i_<MouseDown>*<S-MouseDown>å‘下滚动一个整页 *i_<S-MouseDown>*<MouseUp>å‘上滚动三行 *i_<MouseUp>*<S-MouseUp>å‘上滚动一个整页 *i_<S-MouseUp>*CTRL-O执行命令,然åŽè¿”回到æ’å…¥æ¨¡å¼ *i_CTRL-O*CTRL-\CTRL-O类似于CTRL-O,但ä¸ç§»åŠ¨å…‰æ ‡ *i_CTRL-\_CTRL-O*CTRL-Lç½®ä½ 'insertmode' æ—¶: è½¬åˆ°æ™®é€šæ¨¡å¼ *i_CTRL-L*CTRL-Gu æ‰“æ–æ’¤é”€åºåˆ—ï¼Œå¼€å§‹æ–°çš„æ”¹å˜ *i_CTRL-G_u*
注æ„: å¦‚æžœå…‰æ ‡é”®æŠŠä½ å¸¦å‡ºæ’入模å¼ï¼ŒæŸ¥æŸ¥ 'noesckeys' 选项。CTRL-O命令有时有副作用: å¦‚æžœå…‰æ ‡åœ¨è¡Œå°¾ä¹‹åŽï¼Œå®ƒä¼šå…ˆè¢«ç§»åŠ¨è¯¥è¡Œæœ€åŽä¸€ä¸ªå—符上。 åœ¨æ˜ å°„é‡Œï¼Œé€šå¸¸æ›´å¥½çš„æ–¹æ³•æ˜¯ä½¿ç”¨<Esc>(å…ˆåœ¨æ–‡æœ¬ä¸æ”¾ä¸€ä¸ª "x",<Esc>这时总会把 å…‰æ ‡æ”¾åˆ°å®ƒçš„ä¸Šé¢)。或者使用CTRL-\CTRL-O,ä¸è¿‡è¿™æ—¶è¦æ³¨æ„å…‰æ ‡å¯èƒ½ç§»åˆ°è¡Œå°¾ä¹‹å¤– çš„ä½ç½®ã€‚ 䏿˜¯åœ¨æ‰€æœ‰çš„终端上都能用 Shift + å…‰æ ‡é”®ã€‚ å¦å¤–一个副作用是 "i" 或 "a" 命令之剿Œ‡å®šçš„è®¡æ•°ä¼šè¢«å¿½ç•¥ã€‚è¿™æ˜¯å› ä¸ºè¦å®žçްCTRL-O之åŽçš„命令的é‡å¤æ‰§è¡Œå¤ªå¤æ‚了。 一个使用CTRL-Gu 的例å::inoremap<C-H><C-G>u<C-H>它é‡å®šä¹‰é€€æ ¼é”®å¼€å§‹æ–°çš„æ’¤é”€åºåˆ—ã€‚ä½ å¯ä»¥æ’¤é”€é€€æ ¼é”®çš„æ•ˆæžœï¼Œè€Œä¸ä¼šæ”¹å˜ä½ 之å‰è¾“入的 内容,就åƒCTRL-Ou é‚£æ ·ã€‚CTRL-O的使用分割撤销: 之å‰è¾“入的文本和之åŽçš„è¢«åˆ†åˆ«æ’¤é”€ã€‚å¦‚æžœä¸æƒ³å¦‚æ¤ (比如用 åœ¨æ˜ å°„é‡Œ)ï¼Œä½ å¯ä»¥ç”¨CTRL-R= |i_CTRL-R|。例如,è¦è°ƒç”¨å‡½æ•°::imap<F2><C-R>=MyFunc()<CR>如果æ£ç¡®è®¾ç½® 'whichwrap' 选项,在一行的第一个/最åŽä¸€ä¸ªå—符上按<Left>å’Œ<Right>é”®ä½¿å¾—å…‰æ ‡å›žç»•åˆ°ä¸Šä¸€è¡Œ/下一行。CTRL-Gj å’ŒCTRL-Gk 命令å¯ä»¥ç”¨æ¥åœ¨æŸä¸€åˆ—剿’入文本。例如:int i;int j;æŠŠå…‰æ ‡å®šä½åœ¨ç¬¬ä¸€ä¸ª "int" 上,输入 "istatic<C-G>j "。结果是:static int i;int j;è¦æŠŠç›¸åŒçš„æ–‡æœ¬æ’入在æ¯è¡Œçš„æŸåˆ—ä¹‹å‰ï¼Œä½¿ç”¨å¯è§†åˆ—å—命令 "I" |v_b_I|。
3. 'textwidth' 和 'wrapmargin' 选项 *ins-textwidth*
'textwidth' 选项å¯ä»¥ç”¨æ¥åœ¨è¡Œå˜å¾—很长之å‰è‡ªåЍæ–行。设置 'textwidth' 选项为希望 çš„æœ€å¤§è¡Œé•¿ã€‚å¦‚æžœä½ è¾“å…¥æ›´å¤šå—符 (䏿˜¯ç©ºæ ¼æˆ–者制表),最åŽä¸€ä¸ªå•è¯ä¼šæ”¾åœ¨ä¸€ä¸ªæ–°è¡Œ 上 (除éžè¿™æ˜¯è¯¥è¡Œå”¯ä¸€ä¸€ä¸ªå•è¯)ã€‚å¦‚æžœä½ è®¾ç½® 'textwidth' 为 0,关é—该特性。 'wrapmargin' 选项åšçš„事情基本相åŒã€‚区别在于 'textwidth' 是一个固定的宽度,而 'wrapmargin' æ ¹æ®å±å¹•的宽度设置。如果设置 'wrapmargin',这ç‰ä»·äºŽ 'textwidth' 设为 (columns - 'wrapmargin')ï¼Œå…¶ä¸ columns 是å±å¹•的宽度。 å¦‚æžœåŒæ—¶è®¾ç½® 'textwidth' å’Œ 'wrapmargin',使用 'textwidth'。 å¦‚æžœä½ å¹¶ä¸çœŸçš„æƒ³æ–å¼€è¡Œï¼Œè€Œåªæ˜¯æƒ³æ–‡æœ¬è¡Œåœ¨åˆé€‚çš„ä½ç½®å›žç»•ï¼Œè§ 'linebreak' 选项。 æ–‡æœ¬è¡Œåªæœ‰åœ¨æ’入模å¼ä¸‹æˆ–è€…é™„åŠ åˆ°è¡ŒåŽçš„æ—¶å€™æ‰ä¼šè‡ªåЍæ–å¼€ã€‚åœ¨æ›¿æ¢æ¨¡å¼ä¸‹ï¼Œåªè¦è¡Œçš„ 长度没有å˜ï¼Œå°±ä¸ä¼šæ–行。 é•¿è¡Œåœ¨ä½ è¾“å…¥ä¸€ä¸ªå‡ºçŽ°åœ¨è¾¹ç•Œä¹‹åŽçš„éžç©ºç™½å—符的时候æ–开。什么时候æ–行的é™åˆ¶è¿˜å¯ä»¥ 通过在 'formatoptions' é€‰é¡¹å¢žåŠ å¦‚ä¸‹å—æ¯å†³å®š: "l" æ–è¡Œåªæœ‰åœ¨æ’入开始时文本行的长度ä¸è¶…过 'textwidth' æ‰ä¼šå‘生。 "v" åªæœ‰åœ¨å½“剿’入命令ä¸è¾“入的空白å—符上æ‰ä¼šæ–行。这是和 Vi 最兼容的行为。 "lv" æ–è¡Œåªæœ‰åœ¨æ’入开始时文本行的长度ä¸è¶…过 'textwidth' å¹¶ä¸”åœ¨å½“å‰æ’入命令ä¸è¾“ 入的空白å—符上æ‰ä¼šå‘生。和 "l" 唯一的ä¸åŒåœ¨è¶…过 'textwidth' 边界之åŽè¾“å…¥ éžç©ºç™½å—符的时候。 通常使用内部函数æ¥å†³å®šå“ªé‡Œæ–è¡Œã€‚å¦‚æžœä½ æƒ³ä½¿ç”¨ä¸åŒçš„æ–¹æ³•,设置 'formatexpr' 选项 为一个表达å¼ï¼Œå®ƒå¤„ç†æ¢è¡Œçš„行为。 å¦‚æžœä½ æƒ³æŽ’ç‰ˆæ–‡æœ¬å—,å¯ä»¥ä½¿ç”¨ "gq" æ“作符。输入 "gq" å’Œå¯ä»¥ç§»åŠ¨å…‰æ ‡åˆ°å—尾的移动 命令。在许多情况下,命令 "gq}" 会åšä½ 想è¦åšçš„事情 (排版直到段è½å°¾éƒ¨)ã€‚æˆ–è€…ï¼Œä½ å¯ä»¥ä½¿ç”¨ "gqap"。它会排版整个段è½ï¼Œå’Œå½“å‰å…‰æ ‡æ‰€åœ¨çš„ä½ç½®æ— å…³ã€‚æˆ–è€…ï¼Œä½ å¯ä»¥ä½¿ç”¨ å¯è§†æ¨¡å¼: 敲击 "v",移动到å—尾,然åŽè¾“å…¥ "gq"。å¦è§ |gq|。
4. 'expandtab'ã€'smarttab' å’Œ 'softtabstop' 选项 *ins-expandtab*
如果打开 'expandtab' é€‰é¡¹ï¼Œç©ºæ ¼å¯ä»¥ç”¨æ¥å¡«å……制表键的空白ä½ç½®ã€‚å¦‚æžœä½ éœ€è¦è¾“入一 个真æ£çš„<Tab>,先输入CTRL-V(用CTRL-Q如果CTRL-Vè¢«æ˜ å°„çš„è¯ |i_CTRL-Q|)。 ç¼ºçœ 'expandtab' 选项是关é—的。注æ„åœ¨æ›¿æ¢æ¨¡å¼é‡Œï¼Œä¸€ä¸ªå—ç¬¦è¢«å¤šä¸ªç©ºæ ¼å—符所代 替。结果是,行内的å—ç¬¦æ•°ä¼šå¢žåŠ ã€‚é€€æ ¼é”®åªä¼šä¸€æ¬¡åˆ ä¸€ä¸ªç©ºæ ¼é”®ã€‚åŽŸæ¥çš„å—ç¬¦åªæœ‰åœ¨ä¸€ ä¸ªç©ºæ ¼ (最åŽä¸€ä¸ª) ä¸Šé€€æ ¼æ‰èƒ½å¾—回æ¥{Vi 没有 'expandtab' 选项}*ins-smarttab* 当 'smarttab' 选项打开时,<Tab>在行首æ’å…¥ 'shiftwidth' 个ä½ç½®ï¼Œè€Œåœ¨å…¶å®ƒåœ°æ–¹æ’ å…¥ 'tabstop' 个。这æ„味ç€ç»å¸¸ä¼šæ’å…¥ç©ºæ ¼è€Œä¸æ˜¯<Tab>å—符。当 'smarttab' å…³é— æ—¶ï¼Œ<Tab>总是æ’å…¥ 'tabstop' 个ä½ç½®ï¼Œè€Œ 'shiftwidth' åªæœ‰åœ¨ ">>" 和类似的命令 䏿‰ä¼šç”¨åˆ°ã€‚*ins-softtabstop* 如果 'softtabstop' 选项ä¸ä¸ºé›¶ï¼Œ{Vi æ— æ¤åŠŸèƒ½}<Tab>æ’å…¥ 'softtabstop' 个ä½ç½®ï¼Œè€Œè¿‡åŽ»ç”¨æ¥åˆ 除 ç©ºæ ¼çš„<BS>ï¼ŒçŽ°åœ¨ä¼šåˆ é™¤ 'softtabstop' 个ä½ç½®ã€‚感觉上, 'tabstop' 被设æˆäº† 'softtabstop' 的值,但实际上一个真æ£çš„<Tab>å—ç¬¦è¿˜æ˜¯å æ® 'tabstop' 个ä½ç½®ã€‚从 è€Œï¼Œä½ çš„æ–‡ä»¶åœ¨åˆ«çš„åº”ç”¨ç¨‹åºé‡Œçœ‹èµ·æ¥è¿˜æ˜¯æ£ç¡®çš„。 如果 'softtabstop' ä¸ä¸ºé›¶ï¼Œ<BS>ä¼šè¯•å›¾åˆ é™¤å°½é‡å¤šçš„ç©ºç™½ï¼Œä»¥ä¾¿èƒ½å¤Ÿå›žåˆ°å¾€å‰ 'softtabstop' çš„ä½ç½®ï¼Œé™¤éžå‰é¢ä¸€ä¸ªæ’入的å—符æ£å¥½å°±æ˜¯ä¸€ä¸ªç©ºæ ¼ï¼Œè¿™æ—¶å®ƒåªä¼šåˆ 除光 æ ‡å‰çš„那个å—符。å¦åˆ™ï¼Œä½ ä¸ä¸€å®šæ€»èƒ½åˆ é™¤å…‰æ ‡å‰çš„一个å—ç¬¦ã€‚ä½ éœ€è¦å…ˆåˆ 除 'softabstop' 个å—符,然åŽå†è¾“å…¥é¢å¤–çš„ç©ºæ ¼ï¼Œä»¥åˆ°è¾¾ä½ æƒ³è¦çš„地方。
5. æ›¿æ¢æ¨¡å¼ *Replace* *Replace-mode* *mode-replace*
在普通模å¼é‡Œè¾“å…¥ "R" å‘½ä»¤è¿›å…¥æ›¿æ¢æ¨¡å¼ã€‚ åœ¨æ›¿æ¢æ¨¡å¼é‡Œï¼Œè¡Œå†…çš„å•个å—ç¬¦åœ¨ä½ è¾“å…¥å—ç¬¦çš„æ—¶å€™è¢«åˆ é™¤ã€‚å¦‚æžœæ²¡æœ‰å—符å¯ä»¥åˆ 了 (在 行尾),输入的å—ç¬¦è¢«é™„åŠ (å’Œæ’入模å¼ä¸€æ ·)ã€‚è¿™æ ·ï¼Œä¸€è¡Œå†…çš„å—ç¬¦æ•°ä¿æŒä¸å˜ï¼Œç›´åˆ°ä½ 到达行尾为æ¢ã€‚如果输入了<NL>,æ’入一个æ¢è¡Œç¬¦ï¼Œä½†ä¸ä¼šåˆ 除任何å—符。 è¦å°å¿ƒ<Tab>å—ç¬¦ã€‚å¦‚æžœä½ è¾“å…¥ä¸€ä¸ªæ£å¸¸çš„æ‰“å°å—符在它上é¢ï¼Œå—符数ä»ç„¶ä¸€æ ·ï¼Œä½†æ˜¯ 列数看起æ¥å°‘了。 å¦‚æžœä½ åœ¨æ›¿æ¢æ¨¡å¼ä¸‹åˆ 除å—符 (用<BS>ã€CTRL-W或CTRL-U),实际å‘ç”Ÿçš„äº‹æ˜¯ä½ åˆ é™¤äº† 改å˜ã€‚被替æ¢çš„å—符被å¤åŽŸäº†ã€‚å¦‚æžœä½ çš„è¾“å…¥è¶…è¿‡å·²æœ‰çš„éƒ¨åˆ†ï¼Œæ–°å¢žçš„å—ç¬¦è¢«åˆ é™¤äº†ã€‚å®ž 际上,这å¯ä»¥çœ‹ä½œæ˜¯ä¸€æ¬¡ä¸€ä¸ªå—符的撤销。 如果打开了 'expandtab' 选项,<Tab>ä¼šç”¨å¤šä¸ªç©ºæ ¼æ›¿æ¢ä¸€ä¸ªå—ç¬¦ã€‚ç»“æžœæ˜¯ï¼Œè¡Œå†…çš„å— ç¬¦æ•°å¢žåŠ äº†ã€‚é€€æ ¼é”®åªèƒ½ä¸€æ¬¡åˆ ä¸€ä¸ªç©ºæ ¼ã€‚åŽŸæ¥çš„å—ç¬¦åªæœ‰åœ¨ä¸€ä¸ªç©ºæ ¼ (最åŽä¸€ä¸ª) 上退 æ ¼æ‰èƒ½å¾—回æ¥{Vi 没有 'expandtab' 选项}
6. è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ *vreplace-mode* *Virtual-Replace-mode*
在普通模å¼é‡Œè¾“å…¥ "gR" å‘½ä»¤è¿›å…¥è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ã€‚{ä»…å½“ç¼–è¯‘æ—¶åŠ å…¥ +vreplace 特性æ‰ä¼šæœ‰æ•ˆ}è™šæ‹Ÿæ›¿æ¢æ¨¡å¼å’Œæ›¿æ¢æ¨¡å¼ç±»ä¼¼ï¼Œä½†ä¸æ˜¯æ›¿æ¢æ–‡ä»¶é‡Œçš„实际å—符,而是替æ¢å±å¹•的领地。这 æ ·ï¼Œæ–‡ä»¶é‡Œçš„å—符看起æ¥ä¸ä¼šç§»åŠ¨ã€‚ æ‰€ä»¥ï¼Œå¦‚æžœä½ è¾“å…¥äº†{Vi æ²¡æœ‰è™šæ‹Ÿæ›¿æ¢æ¨¡å¼}<Tab>,它会替æ¢å¤šä¸ªæ™®é€šçš„å—ç¬¦ï¼Œè€Œå¦‚æžœä½ åœ¨<Tab>ä¸Šè¾“å…¥å— æ¯ï¼Œå®ƒå¯èƒ½ä»€ä¹ˆéƒ½æ²¡æœ‰ä»£æ›¿ï¼Œå› 为<Tab>è¿˜æ˜¯ä¼šå æ®ç›¸åŒçš„ä½ç½®ã€‚ 输入<NL>䏿˜¯å¯¼è‡´æ–‡ä»¶åŽé¢çš„å—符看起æ¥åœ¨ç§»åŠ¨ã€‚ç»“æžœæ˜¯ï¼Œå½“å‰è¡Œçš„åŽé¢éƒ¨åˆ†è¢«<NL>æ‰€æ›¿æ¢ (ä¹Ÿå°±æ˜¯ï¼Œå®ƒä»¬è¢«åˆ é™¤),而替æ¢ç»§ç»åœ¨ä¸‹ä¸€è¡Œè¿›è¡Œã€‚新行_ä¸_会被æ’入,除éžä½ 到达文件尾部之åŽã€‚ 输入CTRL-Tå’ŒCTRL-Dä¼šçœ‹åˆ°æœ‰è¶£çš„æ•ˆæžœã€‚å…‰æ ‡å‰é¢çš„å—符å‘ä¸€è¾¹ç§»åŠ¨ï¼Œè·Ÿå¹³å¸¸ä¸€æ ·ï¼Œ ä½†æ˜¯å…‰æ ‡åŽé¢çš„å—ç¬¦ä¿æŒä¸åŠ¨ã€‚CTRL-T会éšè—一些被移动å—符é®ç›–的旧行,但是CTRL-Dä¼šé‡æ–°è®©å®ƒä»¬æ˜¾çŽ°å‡ºæ¥ã€‚ å’Œæ›¿æ¢æ¨¡å¼ä¸€æ ·ï¼Œä½¿ç”¨<BS>ç‰ä¼šæ¢å¤è¢«æ›¿æ¢çš„å—符。å³ä½¿å’Œ 'smartindent'ã€CTRL-Tå’ŒCTRL-Dã€'expandtab'ã€'smarttab'ã€'softtabstop' ç‰ä¸€èµ·ä½¿ç”¨çš„æ•ˆæžœä¹Ÿæ˜¯å¦‚æ¤ã€‚ 在 'list' 模å¼ä¸‹ï¼Œè™šæ‹Ÿæ›¿æ¢æ¨¡å¼çš„行为和ä¸åœ¨ 'list' 模å¼ä¸‹ä¸€æ ·ï¼Œé™¤éž 'cpoptions' 里设置了 "L"。注æ„唯一ä¸åœ¨å…‰æ ‡ä½ç½®ä¸Šçš„å—符看起æ¥åœ¨ç§»åŠ¨çš„å¯èƒ½æ˜¯åœ¨ 'list' 模å¼ä¸‹ï¼Œå¶å°”也会在 ç½®ä½ 'wrap' 的时候出现 (这时行改å˜é•¿åº¦ï¼Œä½¿å¾—比å±å¹•宽度更窄或者更宽),难得也会 在输入 CTRL å—符的时候。CTRL å—ç¬¦å æ®ä¸¤ä¸ªå±å¹•ä½ç½®ã€‚如果用两个普通å—符替æ¢ï¼Œç¬¬ 一个会被æ’å…¥ï¼Œè€Œç¬¬äºŒä¸ªä¼šæ›¿æ¢ CTRL å—符。 该模å¼å¯¹ç¼–辑<Tab>åˆ†éš”è¡¨æ ¼åˆ—çš„æ—¶å€™å¾ˆæœ‰ç”¨ï¼Œå› ä¸ºè¾“å…¥æ–°çš„æ•°æ®çš„æ—¶å€™åŒæ—¶è¿˜èƒ½ä¿æŒ 所有的列对é½ã€‚
7. æ’入模å¼è¡¥å…¨ *ins-completion*
在æ’å…¥å’Œæ›¿æ¢æ¨¡å¼ä¸‹ï¼Œæœ‰è‹¥å¹²å‘½ä»¤å¯ä»¥è¡¥å…¨è¾“å…¥çš„éƒ¨åˆ†å…³é”®å—æˆ–者行。这å¯ä»¥ç”¨äºŽä½¿ç”¨å¤ æ‚关键å—çš„åœºåˆ (例如,函数åé‡Œæœ‰å¤§å†™å—æ¯æˆ–者下划线)。 如果编译时关é—了 |+insert_expand| 特性,这些功能都ä¸å¯ç”¨ã€‚ 补全å¯ä»¥æ˜¯é’ˆå¯¹: 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. 全能 (omni) 补全 |i_CTRL-X_CTRL-O| 12. 拼写建议 |i_CTRL-X_s| 13. 'complete' çš„å…³é”®å— |i_CTRL-N| 所有这些 (除了 2 以外 (译者注: 原文如æ¤)) 都通过CTRL-X模å¼å®Œæˆã€‚这是æ’入和替 æ¢æ¨¡å¼çš„ä¸€ä¸ªåæ¨¡å¼ã€‚ä½ å¯ä»¥é”®å…¥CTRL-X和一个CTRL-X命令进入CTRL-X模å¼ã€‚è¦é€€ 出,输入ä¸åˆæ³•çš„CTRL-X模å¼çš„å‘½ä»¤ã€‚åˆæ³•的键包括CTRL-X命令本身,CTRL-N(下一 个) å’ŒCTRL-P(å‰ä¸€ä¸ª)。 å¦‚æžœä½ æƒ³è°ƒæ•´åŒ¹é…的大å°å†™ï¼Œå‚è§ 'infercase' 选项。 *complete_CTRL-E* 如果补全处于激活状æ€ï¼Œå¯ä»¥ç”¨CTRL-Eæ¥åœæ¢è¡¥å…¨å¹¶å›žåˆ°åŽŸæ¥å½•入的文å—。CTRL-E本 身ä¸ä¼šè¢«æ’入。 *complete_CTRL-Y* 如果已ç»å¼¹å‡ºèœå•,å¯ä»¥ä½¿ç”¨CTRL-Yåœæ¢è¡¥å…¨å¹¶æŽ¥å—当å‰çš„选择项。CTRL-Y本身ä¸ä¼š 被æ’å…¥ã€‚é”®å…¥ç©ºæ ¼ã€å›žè½¦æˆ–者其他ä¸å¯æ˜¾ç¤ºå—符将离开补全模å¼å¹¶æ’入键入的å—符。 弹出èœå•显示时,有一些特殊键å¯ç”¨ï¼Œè§ |popupmenu-keys|。注æ„:CTRL-X模å¼ä¸‹åˆæ³•的键ä¸ç»è¿‡æ˜ 射。这使得 ":map ^F ^X^F" 能够工作 (å…¶ä¸ ^F 是CTRL-F而 ^X 是CTRL-X)。能够使得CTRL-X模å¼é€€å‡ºçš„é”® (任何䏿˜¯åˆæ³•CTRL-X模å¼å‘½ä»¤çš„é”®) 则ç»è¿‡æ˜ 射。 å¦å¤–,通过 'complete' çš„è¡¥å…¨ä¹Ÿä½¿ç”¨æ˜ å°„ã€‚æ³¨æ„: 补全激活时,ä¸èƒ½é€’归使用æ’入模å¼ã€‚以æŸç§æ–¹å¼è°ƒç”¨ ":normal i.." çš„æ˜ å°„å°† 产生 E523 错误。 å»ºè®®ä½¿ç”¨ä»¥ä¸‹æ˜ å°„æ¥ä½¿å¾—输入补全命令简å•一点 (ä¸è¿‡å®ƒä»¬å¯èƒ½å±è”½å…¶å®ƒçš„命令)::inoremap ^] ^X^]:inoremap ^F ^X^F:inoremap ^D ^X^D:inoremap ^L ^X^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>"elsereturn "\<C-N>"endfunctioninoremap<Tab><C-R>=CleverTab()<CR>补全整行 *compl-whole-line* *i_CTRL-X_CTRL-L*CTRL-XCTRL-Lå呿œç´¢å’Œå½“å‰è¡Œå…‰æ ‡å‰å—符åºåˆ—完全相åŒçš„行。忽略缩进。 找到的行æ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚ 'complete' 选项用æ¥å†³å®šåŒ¹é…在哪个缓冲区里æœç´¢ï¼Œå·²è½½å…¥ 和未载入的缓冲区都被使用。CTRL-L或CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…行。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的行。CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…行。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的行。CTRL-XCTRL-L在扩展一行以åŽï¼Œä½ å¯ä»¥é€šè¿‡æŽ¥ç€è¾“å…¥CTRL-XCTRL-L得到 紧接ç€åŒ¹é…行之åŽçš„行,直到è§åˆ°ä¸¤ä¸ªCTRL-X为æ¢ã€‚ è¡¥å…¨å½“å‰æ–‡ä»¶å†…çš„å…³é”®å— *compl-current* *i_CTRL-X_CTRL-P* *i_CTRL-X_CTRL-N*CTRL-XCTRL-Næ£å‘æœç´¢ä»¥å…‰æ ‡å‰é¢çš„关键å—开始的å•è¯ã€‚æ‰¾åˆ°çš„å…³é”®å—æ’å…¥ åœ¨å…‰æ ‡çš„å‰é¢ã€‚CTRL-XCTRL-På呿œç´¢ä»¥å…‰æ ‡å‰é¢çš„关键å—开始的å•è¯ã€‚æ‰¾åˆ°çš„å…³é”®å—æ’å…¥ åœ¨å…‰æ ‡çš„å‰é¢ã€‚CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-XCTRL-N或CTRL-XCTRL-Pç»§ç»ä½¿ç”¨CTRL-XCTRL-N或CTRL-XCTRL-P会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±» 型补全在其它上下文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ° 两个CTRL-X为æ¢ã€‚ å¦‚æžœåœ¨å…‰æ ‡çš„å‰é¢æœ‰ä¸€ä¸ªå…³é”®å— (ç”±å—æ¯å—符和 '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-Nå’ŒCTRL-P都会æ’å…¥ä¸åŒçš„åŒ¹é… (除éžåªæœ‰ä¸€ä¸ªåŒ¹é…的关键å—)。 永远ä¸ä¼šå¾—到å•个å—符的匹é…ï¼Œå› ä¸ºå®ƒä»¬é€šå¸¸ä¸æ˜¯ä½ 真想è¦çš„。 例如,è¦å¾—到: printf("name = %s\n", name); 或者: printf("name = %s\n", n^P); 甚至: printf("name = %s\n", ^P); '\n' ä¸çš„ 'n' 被跳过。 在扩展完一个è¯åŽï¼Œä½ å¯ä»¥ä½¿ç”¨CTRL-XCTRL-P或CTRL-XCTRL-Nå¾—åˆ°ç´§è·Ÿåœ¨æ‰©å±•è¯ ä¹‹åŽçš„å•è¯ã€‚这些åºåˆ—æœç´¢åˆšåˆšæ‰©å±•çš„æ–‡æœ¬ï¼Œå¹¶ä¸”ç»§ç»æ‰©å±•之,使之包括å¦å¤–一个è¯ã€‚è¿™ å¯ä»¥ç”¨äºŽä½ 需è¦é‡å¤ä¸€ç³»åˆ—夿‚çš„å•è¯çš„场åˆã€‚尽管CTRL-På’ŒCTRL-Nåªæ‰¾è‡³å°‘ä¸¤ä¸ªå— ç¬¦çš„å—符串,CTRL-XCTRL-På’ŒCTRL-XCTRL-Nå¯ä»¥ç”¨æ¥æ‰©å±•åªæœ‰ä¸€ä¸ªå—符的å•è¯ã€‚ 例如,è¦å¾—到: México ä½ å¯ä»¥è¾“å…¥: M^N^P^X^P^X^PCTRL-N开始一个扩展,而CTRL-P回到å•个å—符 "M",然åŽåŽé¢çš„两个CTRL-XCTRL-P分别得到 "é" å’Œ ";xico"。 å¦‚æžœä¸Šæ¬¡çš„æ‰©å±•å› ä¸ºè¶…è¿‡ 'textwidth' 被分割,则åªä¼šä½¿ç”¨å½“å‰è¡Œçš„æ–‡æœ¬ã€‚ 如果匹é…在行尾,那么下一行的第一个å•è¯ä¼šè¢«æ’å…¥ï¼Œè€Œä¸”æ˜¾ç¤ºæ¶ˆæ¯ "word from next line"。如果该è¯è¢«æŽ¥å—,那么下个CTRL-XCTRL-P或者CTRL-XCTRL-N会æœç´¢é‚£äº›ä»¥ 这个å•è¯å¼€å§‹çš„行。 补全 'dictionary' çš„å…³é”®å— *compl-dictionary* *i_CTRL-X_CTRL-K*CTRL-XCTRL-Kæ ¹æ® 'dictionary' 选项给出的文件æœç´¢å…‰æ ‡å‰å…³é”®å—开始的 å•è¯ã€‚这和CTRL-N类似,åªä¸è¿‡æœç´¢çš„æ˜¯å—å…¸æ–‡ä»¶ï¼Œè€Œä¸æ˜¯ 当剿–‡ä»¶ã€‚æ‰¾åˆ°çš„å…³é”®å—æ’å…¥åœ¨å…‰æ ‡ä¹‹å‰ã€‚è¿™å¯èƒ½å¾ˆæ…¢ï¼Œå› 为 在第一个匹é…用到之å‰ï¼Œæ‰€æœ‰çš„匹é…都会被找到。缺çœï¼Œ 'dictionary' 选项为空。 è¦å¾—到哪里能找å•è¯åˆ—è¡¨çš„å»ºè®®ï¼Œè§ 'dictionary' 选项。CTRL-K或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。 *i_CTRL-X_CTRL-T*CTRL-XCTRL-Tå’ŒCTRL-XCTRL-Kç±»ä¼¼ï¼Œä½†ç¨æœ‰ä¸åŒã€‚它使用 'thesaurus' é€‰é¡¹ï¼Œè€Œä¸æ˜¯ 'dictionary'。如果匹é…在åŒä¹‰è¯å—典里找 到,åŒä¸€è¡Œé‡Œå…¶ä½™å•è¯ä¹Ÿåœ¨åŒ¹é…里列出,å³ä½¿å®ƒä»¬å¹¶ä¸çœŸçš„匹 é…ã€‚è¿™æ ·ä¸€ä¸ªå•è¯å¯ä»¥è¢«å®Œå…¨æ›¿æ¢ã€‚ 举一个例åï¼Œå‡æƒ³ 'thesaurus' 文件有一行形如:angry furious mad enragedæŠŠå…‰æ ‡æ”¾åœ¨å—æ¯ "ang" 之åŽå¹¶è¾“å…¥CTRL-XCTRL-T会匹é…å• è¯ "angry"ï¼›ç»§ç»æŒ‰ä¼šæŠŠå•è¯æ”¹ä¸º "furious"ã€"mad" ç‰ç‰ã€‚ 其它的使用包括两ç§è¯è¨€ä¹‹é—´çš„翻译,或者用关键å—ç»™ API 函数归类。CTRL-T或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。 补全当å‰å’Œå¤´æ–‡ä»¶å†…çš„å…³é”®å— *compl-keyword* 'include' é€‰é¡¹æŒ‡å®šå¦‚ä½•æ‰¾åˆ°å«æœ‰å¤´æ–‡ä»¶åå—的行。'path' é€‰é¡¹ç”¨æ¥æœç´¢å¤´æ–‡ä»¶ã€‚ *i_CTRL-X_CTRL-I*CTRL-XCTRL-Iæœç´¢å½“å‰å’Œå¤´æ–‡ä»¶é‡Œç¬¬ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„å—æ¯åºåˆ—开始的关键 å—ã€‚æ‰¾åˆ°çš„å…³é”®å—æ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。注æ„:CTRL-Iå’Œ<Tab>相åŒï¼Œè€Œè¿™å¯èƒ½ä¼šåœ¨æˆåŠŸçš„è¡¥å…¨ä¹‹åŽ è¾“å…¥ï¼Œå› æ¤ä¸ä½¿ç”¨CTRL-Iæ¥æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-XCTRL-Iç»§ç»ä½¿ç”¨CTRL-XCTRL-I会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±»åž‹è¡¥å…¨åœ¨å…¶å®ƒä¸Šä¸‹ 文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ°ä¸¤ä¸ªCTRL-X为 æ¢ã€‚ è¡¥å…¨æ ‡ç¾ *compl-tag* *i_CTRL-X_CTRL-]*CTRL-XCTRL-]æœç´¢ç¬¬ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„å—æ¯åºåˆ—å¼€å§‹çš„æ ‡ç¾ã€‚匹é…çš„æ ‡ç¾æ’ åœ¨å…‰æ ‡å‰é¢ã€‚æ ‡ç¾åå¯ä»¥åŒ…å«å—æ¯å—符和由 'iskeyword' 决 定的å—符 (和关键å—相åŒ)。å¦è§ |CTRL-]|。 'showfulltag' 选项å¯ä»¥ç”¨æ¥å¢žåŠ æ ‡ç¾å®šä¹‰å‰åŽçš„上下文。CTRL-]或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…çš„æ ‡ç¾ã€‚替æ¢ä¸Šä¸€æ¬¡åŒ¹é…çš„æ ‡ç¾ã€‚CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…çš„æ ‡ç¾ã€‚替æ¢ä¸Šä¸€æ¬¡åŒ¹é…çš„æ ‡ç¾ã€‚ 补全文件å *compl-filename* *i_CTRL-X_CTRL-F*CTRL-XCTRL-Fæœç´¢ç¬¬ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„å—æ¯åºåˆ—开始的文件。匹é…çš„æ–‡ä»¶æ’ åœ¨å…‰æ ‡å‰é¢ã€‚æ ‡ç¾åå¯ä»¥åŒ…å«å—æ¯å—符和由 'isfname' 决 定的å—符 (和关键å—相åŒ)。注æ„,(ç›®å‰) 这里ä¸ä½¿ç”¨ 'path' 选项。CTRL-F或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的文件å。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的文件å。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的文件å。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的文件å。 è¡¥å…¨å®šä¹‰æˆ–å® *compl-define* 'define' é€‰é¡¹ç”¨æ¥æŒ‡å®šåŒ…å«å®šä¹‰çš„行。'include' é€‰é¡¹ç”¨æ¥æŒ‡å®šåŒ…å«å¤´æ–‡ä»¶å的行。 'path' é€‰é¡¹ç”¨æ¥æœç´¢å¤´æ–‡ä»¶ã€‚ *i_CTRL-X_CTRL-D*CTRL-XCTRL-Dæœç´¢å½“å‰å’Œå¤´æ–‡ä»¶é‡Œç¬¬ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„å—æ¯åºåˆ—开始的 定义 (或å®)ã€‚æ‰¾åˆ°çš„å®šä¹‰åæ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚CTRL-D或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的定义。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的定义。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的定义。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的定义。CTRL-XCTRL-Dç»§ç»ä½¿ç”¨CTRL-XCTRL-D会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±»åž‹è¡¥å…¨åœ¨å…¶å®ƒä¸Šä¸‹ 文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ°ä¸¤ä¸ªCTRL-X为 æ¢ã€‚ 补全 Vim 命令 *compl-vim* è¿™é‡Œï¼Œè¡¥å…¨æ˜¯ä¸Šä¸‹æ–‡æ•æ„Ÿçš„,和命令行上的情况相似。它既能补全 Ex 命令,åˆèƒ½è¡¥å…¨å®ƒ çš„å‚æ•°ã€‚å¯ç”¨äºŽç¼–写 Vim 脚本。 *i_CTRL-X_CTRL-V*CTRL-XCTRL-VçŒœæµ‹å…‰æ ‡å‰çš„项目的æ¡ç›®ï¼Œå¹¶æ‰¾åˆ°ç¬¬ä¸€ä¸ªåŒ¹é…。注æ„: 如果CTRL-Vè¢«æ˜ å°„ï¼Œä½ é€šå¸¸å¯ä»¥ç”¨CTRL-Qæ¥ä»£æ›¿ |i_CTRL-Q|。CTRL-V或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。CTRL-XCTRL-Vç»§ç»ä½¿ç”¨CTRL-XCTRL-Vå’ŒCTRL-Vä¸€æ ·ã€‚è¿™å…è®¸æ˜ å°„é”®æ¥ æ‰§è¡Œ Vim 命令补全,例如::imap<Tab><C-X><C-V>用户定义补全 *compl-function* 命令补全å¯ä»¥ç”±ç”¨æˆ·é€šè¿‡ 'completefunc' 选项自定义一个函数æ¥å®Œæˆã€‚下é¢è¯´æ˜Žå¦‚何调 用æ¤å‡½æ•°ï¼Œå¹¶æä¾›ç¤ºä¾‹ |complete-functions|。 *i_CTRL-X_CTRL-U*CTRL-XCTRL-UçŒœæµ‹å…‰æ ‡å‰é¢é¡¹ç›®çš„类型,并寻找它的第一个匹é…。CTRL-U或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。 全能 (omni) 补全 *compl-omni* 命令补全å¯ä»¥ç”±ç”¨æˆ·é€šè¿‡ 'omnifunc' 选项自定义一个函数æ¥å®Œæˆã€‚这通常用于特定文件 类型的补全。 下é¢è¯´æ˜Žå¦‚何调用æ¤å‡½æ•°ï¼Œå¹¶æä¾›ç¤ºä¾‹ |complete-functions|。 å…³äºŽç‰¹å®šæ–‡ä»¶ç±»åž‹çš„è¯´æ˜Žï¼Œè§ |compl-omni-filetypes|。 å°†æ¥ä¼šæœ‰æ›´å¤šè¡¥å…¨è„šæœ¬ï¼Œæ¬¢è¿ŽæŸ¥é˜… www.vim.org。目å‰å·²ç»æœ‰äº† C++ 的首个版本。 *i_CTRL-X_CTRL-O*CTRL-XCTRL-OçŒœæµ‹å…‰æ ‡å‰é¢é¡¹ç›®çš„类型,并寻找它的第一个匹é…。CTRL-O或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。 拼写建议 *compl-spelling* 定ä½å…‰æ ‡æ‰€åœ¨æˆ–之å‰çš„å•è¯ï¼Œç„¶åŽæå‡ºæ£ç¡®æ‹¼å†™çš„å•è¯ä½œä¸ºå»ºè®®è¿›è¡Œæ›¿ä»£ã€‚如果该行里有 一个错误拼写的å•è¯åœ¨å…‰æ ‡ä¹‹å‰æˆ–ä¹‹ä¸‹ï¼Œç§»åŠ¨å…‰æ ‡åˆ°å®ƒåŽé¢ã€‚å¦åˆ™ï¼Œä½¿ç”¨åˆšåˆšåœ¨å…‰æ ‡ä¹‹å‰ 的那个å•è¯æ¥æå‡ºå»ºè®®ï¼Œå³ä½¿è¯¥å•è¯æ²¡æœ‰æ‹¼å†™é”™è¯¯ã€‚NOTE:很多 Unix 终端上,CTRL-Sæš‚åœæ˜¾ç¤ºã€‚这时用 's' å¯ä»¥ä»£æ›¿ã€‚如果显示暂åœï¼Œè¾“ å…¥CTRL-Qä¼šç»§ç»æ˜¾ç¤ºã€‚ *i_CTRL-X_CTRL-S* *i_CTRL-X_s*CTRL-XCTRL-S或CTRL-Xs 定ä½å…‰æ ‡ä¹‹å‰çš„å•è¯ï¼Œå¹¶å¯»æ‰¾å®ƒçš„第一个拼写建议。CTRL-S或CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªå»ºè®®ã€‚替æ¢ä¸Šä¸€æ¬¡çš„建议。注æ„这里ä¸èƒ½ç”¨ 's'。CTRL-På呿œç´¢å‰ä¸€ä¸ªå»ºè®®ã€‚替æ¢ä¸Šä¸€æ¬¡çš„建议。 从ä¸åŒçš„æ¥æºè¡¥å…¨å…³é”®å— *compl-generic* *i_CTRL-N*CTRL-N在 'complete' 选项给出的地方æœç´¢ä¸‹ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„关键 å—开始的å•è¯ã€‚找到的关键å—åæ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚ *i_CTRL-P*CTRL-P在 'complete' 选项给出的地方æœç´¢ä¸Šä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„关键 å—开始的å•è¯ã€‚找到的关键å—åæ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚CTRL-Næ£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-På呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键å—。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键å—。CTRL-XCTRL-N或CTRL-XCTRL-Pç»§ç»ä½¿ç”¨CTRL-XCTRL-N或CTRL-XCTRL-P会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±» 型补全在其它上下文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ° 两个CTRL-X为æ¢ã€‚ 寻 找 è¡¥ å…¨ çš„ 函 æ•° *complete-functions* 这里指 'completefunc' å’Œ 'omnifunc'。 函数被调用两次,使用ä¸åŒçš„æ–¹å¼: - 首先,调用函数以寻找补全文本的开始ä½ç½®ã€‚ - ç„¶åŽï¼Œè°ƒç”¨å‡½æ•°ä»¥å¯»æ‰¾å®žé™…的匹é…。 ç¬¬ä¸€æ¬¡è°ƒç”¨æ—¶ï¼Œå‚æ•°æ˜¯: a:findstart 1 a:base 空 函数必须返回补全开始ä½ç½®çš„列数,这个数å—å¿…é¡»åœ¨é›¶åˆ°å…‰æ ‡æ‰€åœ¨åˆ— "col('.')" 之间。 è¿‡ç¨‹åº”è¯¥æ£€æŸ¥å…‰æ ‡ä¹‹å‰çš„å—符,并包å«é‚£äº›å¯èƒ½æˆä¸ºè¡¥å…¨é¡¹ä¸€éƒ¨åˆ†çš„å—ç¬¦ã€‚è¯¥åˆ—åˆ°å…‰æ ‡åˆ— 之间的文本将æ¥ä¼šè¢«åŒ¹é…结果替æ¢ã€‚å¦‚æžœè¡¥å…¨æ— æ³•è¿›è¡Œï¼Œè¿”å›ž -1。 ç¬¬äºŒæ¬¡è°ƒç”¨æ—¶ï¼Œå‚æ•°æ˜¯: a:findstart 0 a:base 补全必须匹é…的文本;å³ç¬¬ä¸€æ¬¡è°ƒç”¨å®šä½çš„æ–‡æœ¬ (å¯ä»¥ä¸ºç©º) 函数必须返回匹é…å•è¯çš„列表。这些匹é…é€šå¸¸åŒ…å« "a:base" 文本。如果没有匹é…,返回 空列表。 *complete-items* æ¯ä¸ªåˆ—表项å¯ä»¥æ˜¯å—符串或者å—典类型。如果是å—ç¬¦ä¸²ï¼Œç›´æŽ¥ç”¨ä½œè¡¥å…¨æ–‡æœ¬ã€‚å¦‚æžœæ˜¯å— å…¸ï¼Œå¯ä»¥åŒ…å«ä»¥ä¸‹å„项: word éœ€è¦æ’入的文本,必需 abbr "word" 的缩写;如果éžç©ºï¼Œèœå•é‡Œä½¿ç”¨å®ƒè€Œä¸æ˜¯ "word" menu 用于弹出èœå•的补充文本,在 "word" 或 "abbr" ä¹‹åŽæ˜¾ç¤º info 关于补全项的更多信æ¯ï¼Œèƒ½å¤Ÿåœ¨é¢„è§ˆçª—å£æ˜¾ç¤º kind 代表补全类型的å•ä¸ªå—æ¯ icase 如果éžé›¶ï¼Œæ¯”较项目是å¦ç‰åŒæ—¶å¿½ç•¥å¤§å°å†™ï¼›å¦‚æžœçœç•¥å°±å‡å®š 为零,这时å¯ä»¥åŒæ—¶åŠ å…¥åªæœ‰å¤§å°å†™æœ‰å·®å¼‚的匹é…项 dup 如果éžé›¶ï¼Œé‚£ä¹ˆå³ä½¿å’Œæ¤åŒ¹é…包å«ç›¸åŒå•è¯çš„匹é…项已ç»å˜åœ¨ ä¹Ÿæ— å¦¨ã€‚ 除了 'icase' (译者注: 还有 'dup') 以外,其它å„项必须是å—符串。如果有一项ä¸åˆè¦ 求,报错,而列表的其余项目也ä¸å†ä½¿ç”¨ã€‚ä½ å¯ä»¥åœ¨è¿”å›žåˆ—è¡¨ä¸æ··ç”¨å—符串和å—典项目。 "menu" 项目用于弹出èœå•且å¯èƒ½è¢«æˆªçŸï¼Œæ‰€ä»¥å®ƒåº”该尽é‡ç®€çŸã€‚"info" 项目å¯ä»¥ç¨é•¿ã€‚ 如果在 'completeopt' ä¸åŒ…å« "preview",预览窗å£ä¼šæ˜¾ç¤ºè¯¥é¡¹ä¿¡æ¯ã€‚å…³é—弹出èœå•åŽï¼Œ "info" 项目将ä¿ç•™æ˜¾ç¤ºï¼Œè¿™å¯¹å½•å…¥å‡½æ•°å‚æ•°å¾ˆæœ‰ç”¨ã€‚用å•ä¸ªç©ºæ ¼è®¾ç½® "info" å¯ä»¥æ¸…除 预览窗å£çްå˜çš„æ–‡æœ¬ã€‚ "kind" 项目用å•䏀嗿¯è¡¨ç¤ºè¡¥å…¨ç±»åž‹ã€‚用它å¯ä»¥æŒ‡å®šè¡¥å…¨çš„ä¸åŒæ˜¾ç¤ºæ–¹å¼ (ä¸åŒé¢œè‰²æˆ– è€…å›¾æ ‡)。目å‰ï¼Œå¯ç”¨å¦‚下类型: v å˜é‡ f 函数或方法 m 结构或类æˆå‘˜ t typedef d #define æˆ–å® å¦‚æžœæœç´¢åŒ¹é…耗时较长,å¯ä»¥è°ƒç”¨|complete_add()|呿€»åˆ—表ä¸å¢žåŠ æ¯ä¸ªåŒ¹é…。ä¸è¦åœ¨è¿” 回的列表里包å«è¿™äº›åŒ¹é…ï¼æœç´¢åŒ¹é…çš„åŒæ—¶ï¼Œæ—¶ä¸æ—¶åœ°è°ƒç”¨ |complete_check()| æ¥ä½¿å¾— 用户ä»ç„¶å¯ä»¥æŒ‰é”®ã€‚如果该函数返回éžé›¶ï¼Œæœç´¢åœæ¢ã€‚ 该函数å¯ä»¥ç§»åŠ¨å…‰æ ‡ï¼Œç»“æŸåŽå…‰æ ‡ä¼šæ¢å¤ã€‚ä¸ºäº†å®‰å…¨åŽŸå› ï¼Œä¸èƒ½åœ¨ |modeline| 或 |sandbox| ä¸è®¾ç½®æ¤é€‰é¡¹ã€‚ 补全月份å的示例:fun! CompleteMonths(findstart, base)if a:findstart" 定ä½å•è¯çš„开始处let line = getline('.')let start = col('.') - 1while start > 0 && line[start - 1] =~ '\a'let start -= 1endwhilereturn startelse" å¯»æ‰¾åŒ¹é… "a:base" 的月份let res = []for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")if m =~ '^' . a:basecall add(res, m)endifendforreturn resendifendfunset completefunc=CompleteMonths功能åŒä¸Šï¼Œä½†æ˜¯çŽ°åœ¨å‡è®¾æœç´¢æ¯”较慢:fun! CompleteMonths(findstart, base)if a:findstart" 定ä½å•è¯çš„开始处let line = getline('.')let start = col('.') - 1while start > 0 && line[start - 1] =~ '\a'let start -= 1endwhilereturn startelse" å¯»æ‰¾åŒ¹é… "a:base" 的月份for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")if m =~ '^' . a:basecall complete_add(m)endifsleep 300m " simulate searching for next matchif complete_check()breakendifendforreturn []endifendfunset completefunc=CompleteMonthsæ’ å…¥ è¡¥ å…¨ å¼¹ 出 èœ å• *ins-completion-menu* *popupmenu-completion* Vim å¯ä»¥ç”¨æ›´ç®€å•的弹出èœå•æ¥æ˜¾ç¤ºåŒ¹é…。 当䏋颿¡ä»¶ç¬¦åˆæ—¶ä½¿ç”¨å¼¹å‡ºèœå•: - 'completeopt' é€‰é¡¹åŒ…å« "menu" 或 "menuone"。 - æ˜¾ç¤ºç»ˆç«¯è‡³å°‘æ”¯æŒ 8 色。 - 至少有两æ¡åŒ¹é…项。如果使用 "menuone",一æ¡åŒ¹é…也å¯ä»¥ã€‚ 选项 'pumheight' 用于设置最大高度。默认值是使用全部有效空间。 有三个状æ€: 1. æ’入了完整的匹é…,例如在CTRL-N或CTRL-P之åŽã€‚ 2. ç”¨å…‰æ ‡é”®é€‰æ‹©å…¶å®ƒåŒ¹é…é¡¹ã€‚æ¤æ—¶ä¸æ’入该匹é…项,åªåœ¨å¼¹å‡ºèœå•ä¸é«˜äº®é€‰ä¸çš„æ¡ç›®ã€‚ 3. åªæ’å…¥äº†éƒ¨åˆ†åŒ¹é…æ–‡æœ¬ï¼Œå¹¶ä¸”å·²ç»è¾“å…¥å—ç¬¦æˆ–è€…ä½¿ç”¨äº†é€€æ ¼é”®ï¼Œè¿™æ—¶åŒ¹é…é¡¹åˆ—è¡¨æ ¹æ® å…‰æ ‡å‰çš„内容进行调整。 å¼€å§‹æ—¶ä½ é€šå¸¸å¤„äºŽçŠ¶æ€ä¸€å¹¶æ’入第一个匹é…。如果 'completeopt' 包å«äº† "longest" 而 且有多个匹é…项,那么开始于状æ€ä¸‰ã€‚ 如果选择其它匹é…项,例如键入CTRL-N或CTRL-P,就进入了状æ€ä¸€ã€‚è¿™ä¸ä¼šæ”¹å˜åŒ¹é… 项列表。 如果退回到原文,就会处于状æ€ä¸‰ã€‚è¦ç«‹å³è¿›å…¥è¯¥çжæ€ï¼Œå¯ä»¥ä½¿ç”¨å¿«æ·é”®æ˜ å°„æ–¹æ³•ï¼Œè¯¥æ˜ å°„åœ¨è¡¥å…¨å¼€å§‹åŽç«‹å³ä½¿ç”¨CTRL-P::imap*popupmenu-keys* 状æ€ä¸€ä¸‹ï¼Œè¿™äº›é”®æœ‰ç‰¹åˆ«çš„å«ä¹‰:<F7><C-N><C-P><BS>å’ŒCTRL-Håˆ é™¤ä¸€ä¸ªå—ç¬¦ï¼ŒæŸ¥æ‰¾å…‰æ ‡å‰å•è¯çš„匹é…项。这会å‡å°‘列表ä¸åŒ¹é…项的 æ•°ç›®ï¼Œå¸¸å¸¸åˆ°åªæœ‰ä¸€ä¸ªé¡¹ç›®ï¼Œç„¶åŽåˆ‡æ¢åˆ°çжæ€äºŒã€‚ 其它éžç‰¹æ®Šå—符: åœæ¢è¡¥å…¨ï¼Œä¸æ”¹å˜åŒ¹é…ï¼Œç„¶åŽæ’入输入的å—符。 状æ€äºŒå’Œçжæ€ä¸‰ä¸‹ï¼Œè¿™äº›é”®æœ‰ç‰¹åˆ«çš„å«ä¹‰:<BS>å’ŒCTRL-Håˆ é™¤ä¸€ä¸ªå—ç¬¦ï¼Œå¹¶æŸ¥æ‰¾å…‰æ ‡å‰å˜çŸçš„å•è¯çš„匹é…项。这å¯èƒ½ä¼šå‘现更 多的匹é…项。CTRL-L从当å‰åŒ¹é…项ä¸å¢žåŠ ä¸€ä¸ªå—符,å¯èƒ½ä¼šå‡å°‘匹é…项的数é‡ã€‚ 任何坿˜¾ç¤ºçš„éžç©ºç™½å—符: åŠ å…¥è¯¥å—符,å‡å°‘匹é…项的数é‡ã€‚ 全部三个状æ€ä¸ï¼Œå¯ä»¥ä½¿ç”¨è¿™äº›é”®:CTRL-Y是 (Yes): 接å—当å‰é€‰æ‹©çš„匹é…é¡¹å¹¶åœæ¢è¡¥å…¨ã€‚CTRL-Eç»“æŸ (End) 补全,回退到选择匹é…å‰åŽŸæœ‰çš„å†…å®¹ (原先输入的或者 最长的公共å—符串)。<PageUp>åå‘若干项选择一个匹é…é¡¹ï¼Œä½†ä¸æ’入。<PageDown>æ£å‘若干项选择一个匹é…é¡¹ï¼Œä½†ä¸æ’入。<Up>选择å‰ä¸€ä¸ªåŒ¹é…,åŒCTRL-Pï¼Œä½†ä¸æ’入。<Down>选择下一个匹é…,åŒCTRL-Nï¼Œä½†ä¸æ’入。<Space>或<Tab>åœæ¢è¡¥å…¨ï¼Œä¸æ”¹å˜åŒ¹é…,æ’入键入的该å—符<Enter>键的行为å–å†³äºŽä½ çŽ°åœ¨æ‰€å¤„çš„çŠ¶æ€: 状æ€ä¸€: ä½¿ç”¨çŽ°æœ‰çš„æ–‡æœ¬ï¼Œç„¶åŽæ’å…¥æ¢è¡Œç¬¦ã€‚ 状æ€äºŒ: æ’入当å‰é€‰æ‹©é¡¹ã€‚ 状æ€ä¸‰: ä½¿ç”¨çŽ°æœ‰çš„æ–‡æœ¬ï¼Œç„¶åŽæ’å…¥æ¢è¡Œç¬¦ã€‚ æ¢å¥è¯è¯´: å¦‚æžœä½ åªä½¿ç”¨å…‰æ ‡é”®åœ¨åŒ¹é…项列表ä¸é€‰æ‹©å…¶å®ƒæ¡ç›®ï¼ŒæŒ‰<Enter>键将æ’入该 匹é…。如果键入其它å—符,按<Enter>键将æ’å…¥æ¢è¡Œç¬¦ã€‚ 下é¢çš„高亮组能够改å˜èœå•颜色: Pmenu 普通项 |hl-Pmenu| PmenuSel 选ä¸é¡¹ |hl-PmenuSel| PmenuSbar æ»šåŠ¨æ¡ |hl-PmenuSbar| PmenuThumb æ»šåŠ¨æ¡æ‹‡æŒ‡ (thumb) |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>"endifreturn '.'endfuncè¯¦è§ |:map-<expr>|。 特 定 æ–‡ ä»¶ ç±» åž‹ å…¨ 能 è¡¥ å…¨ çš„ è¡¥ å…… 说 明 *compl-omni-filetypes* 文件类型{filetype}使用的是 'runtimepath' çš„ autoload/{filetype}complete.vim 文件。比如对于 "java",就是文件 autoload/javacomplete.vim。 C *ft-c-omni* C 代ç è¡¥å…¨éœ€è¦æ ‡ç¾æ–‡ä»¶ã€‚ä½ åº”è¯¥ä½¿ç”¨ Exuberant ctags è½¯ä»¶ï¼Œå› ä¸ºå®ƒä¼šåŠ å…¥è¡¥å…¨æ‰€éœ€ è¦çš„é¢å¤–ä¿¡æ¯ã€‚ä½ å¯ä»¥åœ¨è¿™é‡Œæ‰¾åˆ°å®ƒï¼š http://ctags.sourceforge.net/ 推è使用 5.6 或以åŽç‰ˆæœ¬ã€‚ 对于 5.5.4 ç‰ˆæœ¬ï¼Œä½ åº”è¯¥æ‰“ä¸Šå¢žåŠ "typename:" å—æ®µçš„è¡¥ä¸: ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch å¯ä»¥åœ¨è¿™é‡Œæ‰¾åˆ° MS-Windows 上已ç»ç¼–è¯‘å¥½çš„å¯æ‰§è¡Œç‰ˆæœ¬: http://georgevreilly.com/vim/ctags.html å¦‚æžœä½ æƒ³è¡¥å…¨ç³»ç»Ÿå‡½æ•°ï¼Œå¯ä»¥ç”¨ ctags 生æˆåŒ…嫿‰€æœ‰ç³»ç»Ÿå¤´æ–‡ä»¶çš„æ ‡ç¾æ–‡ä»¶:% ctags -R -f ~/.vim/systags /usr/include /usr/local/include在 vimrc 文件ä¸ï¼ŒæŠŠè¿™ä¸ªæ ‡ç¾æ–‡ä»¶å¢žåŠ åˆ° 'tags' 选项ä¸:set tags+=~/.vim/systags如果在ä¸åŒ…å« "." 或 "=" çš„åå—åŽé¢ç”¨CTRL-XCTRL-Oï¼Œä¼šç›´æŽ¥ä»Žæ ‡ç¾æ–‡ä»¶ä¸è¡¥å…¨ã€‚è¿™ é€‚ç”¨äºŽä»»ä½•æ ‡è¯†ç¬¦ï¼ŒåŒ…æ‹¬å‡½æ•°åã€‚å¦‚æžœä½ æƒ³è¡¥å…¨æ ‡ç¾æ–‡ä»¶æ²¡æœ‰çš„局部å˜é‡å,用CTRL-P代替。 å¦‚æžœåœ¨åŒ…å« "." 或 "=" çš„åå—åŽé¢ç”¨CTRL-XCTRL-O,Vim 会试图识别å˜é‡ç±»åž‹å¹¶æŒ‡å‡º 它所å«çš„æˆå‘˜ã€‚è¿™æ„味ç€åªä¼šåˆ—出该å˜é‡çš„æœ‰æ•ˆæˆå‘˜ã€‚ 如果æˆå‘˜åå—å·²ç»å®Œæ•´ï¼ŒCTRL-XCTRL-O会为å¤åˆç±»åž‹åŠ ä¸Š "." 或 "->"。 Vim æ²¡æœ‰åŒ…å« C 编译器,它åªèƒ½è¯†åˆ«ä½¿ç”¨æ˜Žç¡®æ ¼å¼çš„声明。预处ç†å™¨æŒ‡ä»¤å¯èƒ½ä¼šå¼•èµ·æ·· 淆。如果在多个ä½ç½®é‡Œå®šä¹‰äº†åŒæ ·çš„结构å,所有å¯èƒ½çš„结构æˆå‘˜éƒ½ä¼šè¢«åŒ…括。 CSS *ft-css-omni* éµå¾ª CSS 2.1 æ ‡å‡†æ¥è¡¥å…¨å±žæ€§å’Œç›¸åº”的值。 HTML *ft-html-omni* XHTML *ft-xhtml-omni*CTRL-XCTRL-O能够补全 (X)HTML 文件的å„ç§å…ƒç´ 。它是为了支æŒç¼–写 XHTML 1.0 Strict 文件而设计的,但也å¯ç”¨äºŽå…¶å®ƒ HTML 版本。特性: - "<" 之åŽï¼Œæ ¹æ®ä¸Šä¸‹æ–‡è¡¥å…¨æ ‡ç¾å (åœ¨æ ‡ç¾å†…部,ä¸ç»™å‡º div æ ‡ç¾å»ºè®®)ï¼›'/>' 表明 ç©ºæ ‡ç¾ - åœ¨æ ‡ç¾ä¸ï¼Œè¡¥å…¨åˆé€‚的属性 (ä¸åŒ…æ‹¬æ ‡ç¾çš„ width 属性)ï¼›åŒæ—¶æ˜¾ç¤ºå±žæ€§ç±»åž‹ï¼›'*' 表 明必需的属性 - å¦‚æžœå±žæ€§åªæœ‰æœ‰é™çš„å‡ ä¸ªå¯èƒ½å€¼ï¼Œç”¨å®ƒä»¬æ¥è¡¥å…¨ - 补全实体 (entity) å - æ ¹æ®<style>æ ‡ç¾å’ŒåŒ…å«çš„ CSS 文件里æå–的数æ®ï¼Œè¡¥å…¨ "class" å’Œ "id" 属性值 - 对 "style" 属性值或在 "style" æ ‡ç¾å†…部补全时,切æ¢åˆ° |ft-css-omni| 补全 - 对事件属性值或在 "script" æ ‡ç¾å†…部补全时,切æ¢åˆ° |ft-javascript-omni| 补全 - "</" 之åŽï¼ŒCTRL-XCTRL-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 *ft-javascript-omni* 补全ç»å¤§éƒ¨åˆ† JavaScript è¯è¨€å’Œ DOM å…ƒç´ ã€‚ 补全: - å˜é‡ - 函数åï¼›æ˜¾ç¤ºå‡½æ•°å‚æ•° - å‡½æ•°å‚æ•° - å˜é‡å±žæ€§ï¼Œè¯•图检测å˜é‡ç±»åž‹ - æ ¹æ®ä¸Šä¸‹æ–‡è¡¥å…¨ DOM 对象和属性 - è¯è¨€ä¸çš„å…³é”®å— è¡¥å…¨æœºåˆ¶å¯ä»¥ç”¨äºŽå•独的 JavaScript 文件 (&ft==javascript)ã€(X)HTML çš„<script>æ ‡ç¾å†…部和事件的属性值 (包å«å¯¹å¤–部文件的扫æ)。 DOM 兼容性 å½“å‰ (2006 å¹´åˆ) 有两ç§ä¸»è¦æµè§ˆå™¨ - MS Internet Explorer å’Œ Mozilla Firefox。 è¿™ä¸¤ä¸ªè½¯ä»¶å¸‚åœºå æœ‰çŽ‡è¾¾åˆ° 90% 以上。ç†è®ºä¸Šï¼ŒW3C 组织 (http://www.w3c.org) 建立 æ ‡å‡†ï¼Œä½†æ˜¯è¿™äº›æ ‡å‡†å¹¶æ²¡æœ‰å®Œå…¨éµå®ˆå’Œå®žçŽ°ã€‚IE FF W3C 全能补全+/- +/- + ++ + - ++ - - -- + - -ä¸ç®¡æµè§ˆå™¨çš„实现进度如何,补全æ’ä»¶æ€»æ˜¯æŠŠæ ‡å‡†å®šä¹‰çš„å…ƒç´ æ”¾å…¥å»ºè®®åˆ—è¡¨ã€‚ä¸¤ä¸ªä¸»è¦æµ è§ˆå™¨éƒ½å®žçŽ°ä½†æ ‡å‡†æ²¡æœ‰è¦†ç›–çš„å…ƒç´ ä¹Ÿä½œä¸ºå»ºè®®ã€‚è€Œå…¶å®ƒçš„å…ƒç´ åˆ™ä¸å‡ºçŽ°äºŽå»ºè®®åˆ—è¡¨ã€‚ PHP *ft-php-omni* PHP 代ç çš„è¡¥å…¨éœ€è¦æ ‡ç¾æ–‡ä»¶æ‰èƒ½å¯¹å¤–部文件的数æ®å’Œç±»è¿›è¡Œè¡¥å…¨ã€‚应该使用 Exuberant ctags 5.5.4 版本或更新的版本。在这里å¯ä»¥æ‰¾åˆ°å®ƒ: http://ctags.sourceforge.net/ 脚本对以下项目进行补全: - $ å˜é‡åä¹‹åŽ - 如果å˜é‡å£°æ˜Žä¸ºå¯¹è±¡ï¼ŒåŠ ä¸Š "->"ï¼Œå¦‚æžœæ ‡ç¾æ–‡ä»¶æœ‰æ•ˆï¼Œæ˜¾ç¤ºç±»å - 在 "->" 之åŽï¼Œåªè¡¥å…¨ç»™å®šç±»ä¸çš„函数和å˜é‡å。为了查找类的ä½ç½®å’Œå†…å®¹ï¼Œéœ€è¦æ ‡ ç¾æ–‡ä»¶ã€‚å› ä¸º PHP 䏿˜¯å¼ºç±»åž‹çš„è¯è¨€ï¼Œç”¨æˆ·å¯ä»¥ä½¿ç”¨ @var æ ‡ç¾æ¥å£°æ˜Žç±»:/* @var $myVar myClass */$myVar->ä¸è¿‡ï¼Œè¦æ‰¾åˆ° myClass 的内容,ä»ç„¶éœ€è¦æ ‡ç¾æ–‡ä»¶ã€‚ - å¸¦æœ‰é™„åŠ ä¿¡æ¯çš„函数å: - 如果是内建函数,列出å¯èƒ½çš„傿•°ï¼Œåœ¨ | 之åŽåˆ—出函数返回的数æ®ç±»åž‹ - å¦‚æžœæ˜¯ç”¨æˆ·å‡½æ•°ï¼Œåˆ—å‡ºå‚æ•°å’Œå‡½æ•°å®šä¹‰çš„æ–‡ä»¶å (å¦‚æžœä¸æ˜¯å½“剿–‡ä»¶) - 常é‡å - 在 "new" 声明之åŽçš„ç±»åæ³¨æ„: 如果第一次调用补全功能,Vim 会把所有需è¦çš„æ•°æ®è½½å…¥å†…å˜ã€‚è¿™å¯èƒ½éœ€è¦å‡ ç§’ é’Ÿã€‚ä¸‹æ¬¡è¡¥å…¨æ—¶ï¼Œå°±å‡ ä¹Žæ„Ÿè§‰ä¸åˆ°å»¶è¿Ÿäº†ã€‚ è„šæœ¬æ£€æµ‹å…‰æ ‡æ˜¯å¦åœ¨<?php ?>æ ‡ç¾å†…ã€‚å¦‚æžœä¸æ˜¯ï¼Œä¼šè‡ªåŠ¨åˆ‡æ¢åˆ° HTML/CSS/JavaScript 补全。注æ„: 和原始 HTML 文件ä¸åŒï¼Œæ ‡ç¾è¡¥å…¨ (ä¹Ÿä»…å¯¹æ ‡ç¾è¡¥å…¨è€Œè¨€) å’Œä¸Šä¸‹æ–‡æ— å…³ã€‚ RUBY *ft-ruby-omni* Ruby 代ç çš„è¡¥å…¨éœ€è¦ Vim 编译时带 |+ruby| 特性。 Ruby è¡¥å…¨ä¼šå› éœ€åˆ†æžä½ 的缓冲区以æä¾›è¡¥å…¨åˆ—表。它会从 'require' 载入的和当å‰ç¼“冲 区定义的模å—里æå–补全。CTRL-XCTRL-Oæä¾›çš„补全是上下文相关的:上 下 æ–‡ æ ä¾› çš„ è¡¥ å…¨1. ä¸åœ¨ç±»å®šä¹‰ä¸ ç±»åã€å¸¸é‡å’Œå…¨å±€å˜é‡ 2. ç±»å®šä¹‰ä¸ è¿™ä¸ªç±»æ‰€å®šä¹‰çš„æ–¹æ³•æˆ–å¸¸é‡ 3. '.'ã€'::' 或者 ':' ä¹‹åŽ è¢«è§£é™¤å‚照的对象所适用的方法 4. ':' 或者 ':foo' ä¹‹åŽ ç¬¦å·å ('foo' 起始的那些)备注: - Vim 会载入/执行程åºä»£ç ,以便æä¾›è¡¥å…¨ã€‚è¿™å¯èƒ½ä¼šå¯¼è‡´éƒ¨åˆ†ä»£ç 被执行。这一点也 许值得关注。缺çœè¡Œä¸ºä¸å†æ‰“å¼€è¿™ä¸€åŠŸèƒ½ã€‚å¦‚æžœéœ€è¦æ¤ç‰¹æ€§ï¼ŒåŠ ä¸Šlet g:rubycomplete_buffer_loading = 1- 在第 1 点ä¸ï¼ŒVim å¯ä»¥è§£æžæ•´ä¸ªç¼“冲区以获得用作补全结果的类ååˆ—è¡¨ã€‚é»˜è®¤å…³é—æ¤ 功能。è¦ä½¿å…¶ç”Ÿæ•ˆï¼Œåœ¨ vimrc é‡ŒåŠ å…¥let g:rubycomplete_classes_in_global = 1- 在第 2 点ä¸ï¼Œä¸æ”¯æŒåŒ¿å类。 - 在第 3 点ä¸ï¼ŒVim 会试图判æ–对象所支æŒçš„æ–¹æ³•。 - Vim å¯ä»¥æ£€æµ‹å’Œè½½å…¥ Rails 环境并用于 rails é¡¹ç›®çš„æ–‡ä»¶ã€‚é»˜è®¤å…³é—æ¤ç‰¹æ€§ã€‚è¦ä½¿ 其生效,在 vimrc é‡ŒåŠ å…¥let g:rubycomplete_rails = 1SYNTAX *ft-syntax-omni* Vim 能够对将近 500 ç§è¯è¨€è¿›è¡Œè¯æ³•高亮。高亮支æŒçš„一部分是需è¦çŸ¥é“æž„æˆè¯è¨€çš„å…³ é”®å—ã€‚è®¸å¤šæ–‡ä»¶ç±»åž‹å·²ç»æœ‰ä¸“门的补全脚本,而对其它的文件类型而言,syntaxcomplete 脚本å¯ä»¥æä¾›åŸºæœ¬çš„补全。实现的方法是用 Vim 知é“å¦‚ä½•è‰²å½©é«˜äº®çš„é‚£äº›æ–‡æœ¬æ¥æž„é€ å…¨ 能补全列表。它适用于任何文件类型,并å¯ä»¥æä¾›åŸºæœ¬ä½†å’Œè¯è¨€ç›¸å…³çš„补全机制。 è¦æ‰“å¼€è¯æ³•打开补全:setlocal omnifunc=syntaxcomplete#Completeä½ å¯ä»¥æŠŠä¸‹åˆ—è¯å¥æ”¾åˆ° vimrc ä¸ (è¦åœ¨ä»»ä½• ":filetype" 命令之åŽ),使其自动生效if has("autocmd") && exists("+omnifunc")autocmd Filetype *\ if &omnifunc == "" |\ setlocal omnifunc=syntaxcomplete#Complete |\ endifendifåªæœ‰åœ¨é’ˆå¯¹ç‰¹å®šæ–‡ä»¶ç±»åž‹çš„æ’ä»¶ä¸å˜åœ¨çš„æƒ…况下,上述è¯å¥æ‰å¯¹è„šæœ¬è®¾ç½®è¡¥å…¨æ“作。 æ¯ä¸ªæ–‡ä»¶ç±»åž‹å¯èƒ½æœ‰å¾ˆå¤šè¯æ³•é¡¹ç›®ã€‚æ¤æ’ä»¶å…è®¸ä½ å®šåˆ¶ä»Žåˆ—è¡¨é‡ŒåŒ…å«æˆ–æŽ’é™¤å“ªäº›è¯æ³•组。 让我们看看 PHP 文件类型如何处ç†ã€‚ å¦‚æžœä½ æ£åœ¨ç¼–辑一个 index.php 文件,è¿è¡Œå¦‚下命令::syntax listé¦–å…ˆä½ å°†çœ‹åˆ°æœ‰è®¸å¤šä¸åŒçš„è¯æ³•组。PHP è¯è¨€å¯ä»¥åŒ…嫿¥è‡ªä¸åŒè¯è¨€çš„å…ƒç´ ï¼Œæ¯”å¦‚ HTML〠JavaScript 和许多其它è¯è¨€ã€‚è¿™ç§æƒ…况下,syntax æ’ä»¶åªåŒ…å«ç”±æ–‡ä»¶ç±»åž‹ "php" å¼€å¤´çš„è¯æ³•ç»„ã€‚ä¾‹å¦‚ï¼Œç¼ºçœ PHP 包å«è¿™äº›è¯æ³•组: phpEnvVarã€phpIntVar〠phpFunctions。 PHP è¯è¨€å¯ä»¥è¿›è¡Œè¯æ³•高亮的项目éžå¸¸å¤šï¼Œè€Œè¿™äº›é¡¹ç›®åœ¨å…¨èƒ½è¡¥å…¨åˆ—表里都会出现。有些 人å¯èƒ½è§‰å¾—现这个列表ä¸å®žç”¨æˆ–者åªå¯¹æŸäº›é¡¹æ„Ÿå…´è¶£ã€‚ (如有必è¦) æœ‰ä¸¤ç§æ–¹æ³•å¯ä»¥è£å‰ªè¿™ä¸ªåˆ—è¡¨ã€‚å¦‚æžœä¸æƒ³æ˜¾ç¤ºç‰¹å®šè¯æ³•组,在 vimrc ä¸å¢žåŠ ä¸‹åˆ—è¯å¥:let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant'该列表å¯ä»¥åŠ å…¥å¤šä¸ªè¯æ³•组,以逗å·åˆ†éš”。这个å˜é‡çš„åŸºæœ¬å½¢å¼æ˜¯:let g:omni_syntax_group_exclude_{filetype}= '逗å·,分隔的,列表'为了完整起è§ï¼Œè¿˜æœ‰ç›¸å的形å¼ã€‚在 vimrc 里建立下é¢çš„å˜é‡å¯ä»¥åªåŒ…å« phpFunctions å’Œ phpMethods è¯æ³•组的项目:let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods'å¯ä»¥å»ºç«‹ä»»æ„多个这些å˜é‡ï¼Œåªè¦å˜é‡å尾部的文件类型ä¸åŒå°±è¡Œäº†ã€‚ æ¤æ’件使用 isKeyword 选项æ¥å†³å®šç”¨äºŽè¯æ³•项目的å•è¯è¾¹ç•Œã€‚例如,Scheme è¯è¨€çš„补全 åº”è¯¥åŒ…å« "-",call-with-output-file。å–å†³äºŽä½ çš„æ–‡ä»¶ç±»åž‹ï¼Œæ¤æ–¹æ³•未必能æä¾›ä½ 期 å¾…çš„å•è¯ã€‚设置 g:omni_syntax_use_iskeyword 选项为 0 ä¼šå¼ºåˆ¶è¯æ³•æ’件在å•è¯å—符上 æ–开。在 vimrc å¯ä»¥åŠ å¦‚ä¸‹è¡Œè¿›è¡ŒæŽ§åˆ¶:let g:omni_syntax_use_iskeyword = 0SQL *ft-sql-omni* SQL è¯è¨€çš„补全包括è¯å¥ã€å‡½æ•°å’Œå…³é”®å—。还å¯ä»¥åЍæ€åœ°è¡¥å…¨è¡¨ã€è¿‡ç¨‹ã€è§†å›¾å’Œåˆ—的列 è¡¨ï¼Œæ¤æ—¶æ•°æ®ç›´æŽ¥ä»Žæ•°æ®åº“里æå–ã€‚è¯¦ç»†çš„æŒ‡ä»¤å’Œæ•™ç¨‹è§ |omni-sql-completion|。 SQL 补全æ’ä»¶å¯ä»¥å’Œå…¶å®ƒè¡¥å…¨æ’件一起使用。例如,PHP 文件类型有它自己的补全æ’件。 å› ä¸º PHP 常用æ¥ç”Ÿæˆè®¿é—®æ•°æ®åº“的动æ€ç½‘站,也å¯ä»¥åŒæ—¶æ‰“å¼€ SQL 补全æ’ä»¶ã€‚è¿™æ ·å°±å¯ ä»¥åŒæ—¶è¡¥å…¨ PHP 代ç å’Œ SQL 代ç 。 XML *ft-xml-omni* Vim 7 为 XML æ–‡ä»¶ä¸æä¾›ä¸Šä¸‹æ–‡ç›¸å…³çš„è¡¥å…¨æœºåˆ¶ã€‚å®ƒä¾èµ–äºŽç‰¹æ®Šçš„æ•°æ®æ–‡ä»¶ |xml-omni-datafile| 和两个命令: |:XMLns| å’Œ |:XMLent|。特性如下: - "<" 之åŽï¼Œæ ¹æ®ä¸Šä¸‹æ–‡è¡¥å…¨æ ‡ç¾å - æ ‡ç¾å†…部补全åˆé€‚的属性 - å¦‚æžœå±žæ€§åªæœ‰æœ‰é™çš„å‡ ä¸ªå¯èƒ½å€¼ï¼Œç”¨å®ƒä»¬æ¥è¡¥å…¨ - 补全实体 (entity) å (|xml-omni-datafile| é‡Œçš„å®šä¹‰åŠ ä¸Šå½“å‰æ–‡ä»¶ "<!ENTITY" çš„ 声明) - "</" 之åŽï¼ŒCTRL-XCTRL-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|。列表ä¸ç¬¬ ä¸€ä¸ªå…ƒç´ ä¹Ÿæ˜¯åˆ—è¡¨ï¼ŒåŒ…å«å¯èƒ½çš„åå…ƒç´ åç§°ï¼Œç¬¬äºŒä¸ªå…ƒç´ æ˜¯å—å…¸ |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>& <</childoftag1a><childoftag1b attrofchild="5"><childoftag1a>> ' "</childoftag1a></childoftag1b></tag1>从该例ä¸ï¼Œæˆ‘们å¯ä»¥çœ‹åˆ°å››ç§ç‰¹æ®Šå…ƒç´ : 1. "vimxmlentities" - ç‰¹æ®Šé”®ï¼ŒåŒ…å«æ¤ XML 方言的所有实体的列表。 2. 如果这个包å«å±žæ€§å¯èƒ½å€¼çš„åˆ—è¡¨åªæœ‰ä¸€ä¸ªå…ƒç´ ï¼Œè€Œè¯¥å…ƒç´ å’Œå±žæ€§åä¸€æ ·ï¼Œé‚£ä¹ˆè¯¥å±žæ€§ 被看作逻辑值,æ’入时使用 'attrname' è€Œä¸æ˜¯ 'attrname="'。 3. "vimxmltaginfo" - 特殊键,包å«é”®ä¸ºæ ‡ç¾åã€å€¼ä¸ºä¸¤å…ƒç´ 列表的å—å…¸ã€‚å€¼åˆ—è¡¨åŒ…å« é™„åŠ çš„èœå•ä¿¡æ¯å’Œé•¿æè¿°ã€‚ 4. "vimxmlattrinfo" - 特殊键,包å«é”®ä¸ºå±žæ€§åã€å€¼ä¸ºä¸¤å…ƒç´ 列表的å—å…¸ã€‚å€¼åˆ—è¡¨åŒ…å« é™„åŠ çš„èœå•ä¿¡æ¯å’Œé•¿æè¿°ã€‚注æ„: æ•°æ®æ–‡ä»¶é‡Œçš„æ ‡ç¾å_å¿…é¡»_ä¸èƒ½åŒ…å«å‘½å空间的æè¿°ã€‚ç¤ºä¾‹è§ xsl.vim。注æ„: 所有的数æ®å’Œå‡½æ•°éƒ½ä½œä¸ºå…¨å±€å˜é‡/函数å¯ä»¥åœ¨ä»»ä½•地方访问,所以它们å¯ä»¥ç”¨äºŽ 个人编辑用的函数。 DTD -> Vim *dtd2vim* |www| 上有个脚本 |dtd2vim|ï¼Œèƒ½å¤Ÿè§£æž DTD 并为 Vim XML 全能补全建立 XML æ•°æ®æ–‡ 件。 dtd2vim: http://www.vim.org/scripts/script.php?script_id=1462 查看文件开始部分的详细用例。 è¯¥è„šæœ¬éœ€è¦ Perl å’Œ: perlSGML: http://savannah.nongnu.org/projects/perlsgml 命令 :XMLns{name}[{namespace}] *:XMLns* Vim 需è¦çŸ¥é“è¦ä½¿ç”¨çš„æ•°æ®æ–‡ä»¶å’Œå‘½å空间。|:XMLns| 命令å¯ä»¥è½½å…¥æ•°æ®æ–‡ä»¶å¹¶æŠŠæ•°æ® 连接到åˆé€‚的命å空间。第一个 (必需的) 傿•°æ˜¯æ•°æ®å (xhtml10sã€xsl)ã€‚ç¬¬äºŒä¸ªå‚æ•° 是命å空间编ç (h,xsl)。如果ä¸ä½¿ç”¨ç¬¬äºŒä¸ªå‚数,那么将使用默认值--ä¸å£°æ˜Žå‘½å空 间。例如在 .xsl 文件ä¸ä½¿ç”¨ XML 补全::XMLns xhtml10s:XMLns xsl xsl:XMLent{name}*:XMLent* 缺çœï¼Œæ ¹æ®é»˜è®¤å‘½åç©ºé—´çš„æ•°æ®æ–‡ä»¶è¡¥å…¨å®žä½“ (entity) 。如果没有默认命å空间,应该 用 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]次。<insert>或 *i* *insert* *<Insert>* i åœ¨å…‰æ ‡å‰æ’入文本[count]次。在æ’入模å¼é‡Œä½¿ç”¨CTRL-O的时候,|i_CTRL-O| 䏿”¯æŒè®¡æ•°ã€‚ *I* I 在本行第一个éžç©ºç™½å—ç¬¦ä¹‹å‰æ’入文本[count]次。 如果 'cpoptions' 里有 'H' æ ‡å¿—ä½è€Œæœ¬è¡Œåªæœ‰ç©ºç™½ï¼Œåœ¨æœ€åŽ ä¸€ä¸ªç©ºç™½å‰æ’入。 *gI* gI 在第一列æ’入文本[count]次。*gi* gi 在当å‰ç¼“冲区最近一次æ’入模å¼åœæ¢çš„ä½ç½®ç»§ç»æ’入文本。 该ä½ç½®è®°åœ¨ |'^| ä½ç½®æ ‡è®°é‡Œã€‚å¦‚æžœæ ‡è®°åœ¨è¡Œæœ«ä¹‹åŽï¼Œå’Œ "`^i" 有所差异。 该ä½ç½®åœ¨æ’å…¥/åˆ é™¤è¡Œæ—¶ä¼šè‡ªåŠ¨ä¿®æ£ã€‚但_ä¸_在æ’å…¥/åˆ é™¤å—符 时被修æ£ã€‚ 使用 |:keepjumps| å‘½ä»¤ä¿®é¥°ç¬¦æ—¶ï¼Œä¸æ”¹å˜ |'^| ä½ç½®æ ‡è®°ã€‚{Vi æ— æ¤åŠŸèƒ½}*o* o åœ¨å…‰æ ‡ä¸‹æ–¹å¼€å¯æ–°è¡Œï¼Œå¹¶æ’入文本,é‡å¤{Vi æ— æ¤åŠŸèƒ½}[count]次。{Vi: 清空[count]个å±å¹•行} 如果 'cpoptions' 里有 '#' æ ‡å¿—ä½ï¼Œå¿½ç•¥è®¡æ•°ã€‚ *O* O åœ¨å…‰æ ‡ä¸Šæ–¹å¼€å¯æ–°è¡Œï¼Œå¹¶æ’入文本,é‡å¤[count]次。{Vi: 清空[count]个å±å¹•行} 如果 'cpoptions' 里有 '#' æ ‡å¿—ä½ï¼Œå¿½ç•¥è®¡æ•°ã€‚ 这些命令用以开始æ’å…¥æ–‡æœ¬ã€‚ä½ å¯ä»¥ç”¨<Esc>退出æ’入模å¼ã€‚关于æ’入模å¼é‡Œçš„其它特 殊å—ç¬¦ï¼Œè§ |mode-ins-repl|。[count]çš„æ•ˆæžœåªæœ‰åœ¨é€€å‡ºæ’入模å¼ä»¥åŽæ‰ä¼šå‘生。 如果打开 'autoindent',新行的缩进从上一行得到。打开 'smartindent' 或 'cindent' æ—¶ï¼Œè¡Œçš„ç¼©è¿›æ ¹æ® C 程åºçš„è¦æ±‚自动调整。 'textwidth' å¯ä»¥è®¾ç½®ä¸€è¡Œçš„æœ€å¤§å®½åº¦ã€‚å¦‚æžœä¸€è¡Œè¿‡é•¿ï¼Œåœ¨æ·»åŠ å—ç¬¦æ—¶ä¼šè‡ªåŠ¨æ·»åŠ æ¢è¡Œ 符。
9. Ex æ’入命令 *inserting-ex*
*:a* *:append* :{range}a[ppend][!] åœ¨æŒ‡å®šè¡Œä¸‹æ–¹æ·»åŠ è‹¥å¹²è¡Œã€‚å¦‚æžœæ²¡æœ‰ç»™å‡º{range},文本会在 当å‰è¡Œä¹‹åŽæ’入。 åŠ å…¥ [!] åˆ‡æ¢æ¤å‘½ä»¤æ‰§è¡Œæ—¶çš„ 'autoindent'。 *:i* *:in* *:insert* :{range}i[nsert][!] åœ¨æŒ‡å®šè¡Œä¸Šæ–¹æ·»åŠ è‹¥å¹²è¡Œã€‚å¦‚æžœæ²¡æœ‰ç»™å‡º{range},文本会在 当å‰è¡Œä¹‹å‰æ’入。 åŠ å…¥ [!] åˆ‡æ¢æ¤å‘½ä»¤æ‰§è¡Œæ—¶çš„ 'autoindent'。 这两个命令会继ç»è¦æ±‚è¡Œï¼Œç›´åˆ°ä½ è¾“å…¥äº†åªåŒ…å« "." 的一行。å°å¿ƒåæ–œæ å¼€å§‹çš„è¡Œï¼Œè§ |line-continuation|。 如果这些命令和 |:global| 或 |:vglobal| 一起使用,那么从命令之åŽçš„æ–‡æœ¬é‡ŒèŽ·å¾—æ–‡ æœ¬è¡Œã€‚è¿™äº›è¡Œä»¥åæ–œæ 转义的 NL 分隔::global/abc/insert\one line\another lineä¸å†éœ€è¦æœ€åŽçš„ "." 。注æ„: ":append" å’Œ ":insert" 在 ":if" å’Œ ":endif"ã€":for" å’Œ ":endfor" 还有 ":while" å’Œ ":endwhile" 之间ä¸èƒ½å¾ˆå¥½çš„工作。 *:start* *:startinsert* :star[tinsert][!] 在执行完本命令åŽï¼Œå¯åЍæ’入模å¼ã€‚和普通模å¼ä¸‹è¾“å…¥ "i" ç±»ä¼¼ã€‚å¦‚æžœåŒ…å« !,和 "A" ç±»ä¼¼ï¼Œé™„åŠ åˆ°è¡ŒåŽã€‚å¦åˆ™ï¼Œå°±ä»Ž å…‰æ ‡å½“å‰ä½ç½®å¼€å§‹æ’入。注æ„在函数或者脚本里使用本命令时,æ’å…¥åªä¼šåœ¨å‡½æ•°å’Œè„š æœ¬ç»“æŸçš„æ—¶å€™æ‰ä¼šå¼€å§‹ã€‚ æ¤å‘½ä»¤ä¸èƒ½åœ¨ |:normal| 里使用。{Vi æ— æ¤åŠŸèƒ½}*:stopi* *:stopinsert* :stopi[nsert] å°½å¿«åœæ¢æ’入模å¼ã€‚和在æ’å…¥æ¨¡å¼æ—¶è¾“å…¥{仅当编译时带 +ex_extra 特性时æ‰å¯ç”¨}<Esc>类似。å¯ä»¥ 用在自动命令里。示例::au BufEnter scratch stopinsert*replacing-ex* *:startreplace* :startr[eplace][!] 在执行完本命令åŽï¼Œå¯åŠ¨æ›¿æ¢æ¨¡å¼ã€‚和普通模å¼ä¸‹è¾“å…¥ "R" ç±»ä¼¼ã€‚å¦‚æžœåŒ…å« !,和 "$R" 类似 (ä¹Ÿå°±æ˜¯ï¼Œä»Žè¡Œå°¾å¼€å§‹æ›¿æ¢ æ¨¡å¼)。å¦åˆ™ï¼Œä»Žå…‰æ ‡å½“å‰ä½ç½®å¼€å§‹æ›¿æ¢ã€‚注æ„在函数或者脚本里使用本命令时,替æ¢åªä¼šåœ¨å‡½æ•°å’Œè„š æœ¬ç»“æŸçš„æ—¶å€™æ‰ä¼šå¼€å§‹ã€‚{Vi æ— æ¤åŠŸèƒ½}*:startgreplace* :startg[replace][!] å’Œ |:startreplace| å®Œå…¨ç±»ä¼¼ï¼Œç”¨è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ï¼Œå’Œä½¿ç”¨ |gR| 类似。{仅当编译时带 +ex_extra 特性时æ‰å¯ç”¨}{Vi æ— æ¤åŠŸèƒ½}{仅当编译时带 +ex_extra 特性时æ‰å¯ç”¨}
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] !{cmd}执行{cmd}å¹¶æŠŠå®ƒçš„æ ‡å‡†è¾“å‡ºæ’å…¥åˆ°å…‰æ ‡ä¸‹æ–¹ã€‚ä¸´æ—¶æ–‡ä»¶ä¼š 建立æ¥ä¿å˜å‘½ä»¤è¾“出的结果,并被读到缓冲区里。 'shellredir' 用æ¥ä¿å˜å‘½ä»¤çš„输出结果,它å¯ä»¥è®¾ç½®æ˜¯å¦åŒ… 嫿 ‡å‡†é”™è¯¯çš„输出。{cmd}的执行和 ":!{cmd}" 类似,任何 çš„ '!' ä¼šè¢«æ›¿æ¢æˆä»¥å‰çš„命令 |:!|。 这些命令æ’入文件的内容,或者命令的输出结果到缓冲区里。两者都å¯ä»¥æ’¤é”€ã€‚但ä¸èƒ½ç”¨ "." 命令é‡å¤ã€‚它们是基于行工作的,æ’å…¥ä»Žå…‰æ ‡æ‰€åœ¨è¡Œæˆ–æŒ‡å®šè¡Œçš„ä¸‹æ–¹å¼€å§‹ã€‚è¦åœ¨ç¬¬ä¸€ 行之上æ’入文本,使用命令 ":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 æ ¼å¼ ä»¥å‰ä½¿ç”¨ 'textmode'。现在已ç»åºŸå¼ƒäº†ã€‚ 如果 'fileformat' 为 "dos",在<NL>之å‰çš„<CR>被忽略,而在文件尾部的CTRL-Z被忽略。 如果 'fileformat' 为 "mac",文件里的<NL>被内部表示为<CR>。这是为了é¿å…和用 æ¥è¡¨ç¤º<NUL>çš„<NL>å¼•èµ·æ··æ·†ã€‚è§ |CR-used-for-NL|。 如果 'fileformats' 选项ä¸ä¸ºç©ºï¼ŒVim 试图识别<EOL>的类型 (è§ |file-formats|)。 ä¸è¿‡ï¼Œ'fileformat' 选项的值ä¸ä¼šè¢«æ”¹å˜ï¼Œæ£€æµ‹åˆ°çš„æ ¼å¼åªä¼šåœ¨è¯»å…¥æ–‡ä»¶æ—¶ä½¿ç”¨ã€‚ 'fileencodings' ä¸Žæ¤æƒ…形类似。 åœ¨éž MS-DOSã€Win32 å’Œ OS/2 ç³»ç»Ÿä¸Šï¼Œæ¶ˆæ¯ "[dos format]" 会在读入 DOS æ ¼å¼çš„æ–‡ä»¶ 时给出,以æé†’ä½ å‘生了ä¸å¯»å¸¸çš„事情。 在 Macintoshã€MS-DOSã€Win32 å’Œ OS/2 ç³»ç»Ÿä¸Šï¼Œæ¶ˆæ¯ "[unix format]" 会在读入 Unix æ ¼å¼çš„æ–‡ä»¶æ—¶ç»™å‡ºã€‚ åœ¨éž Macintosh çš„ç³»ç»Ÿä¸Šï¼Œæ¶ˆæ¯ "[Mac format]" 会在读入 Mac æ ¼å¼çš„æ–‡ä»¶æ—¶ç»™å‡ºã€‚ 关于如何使用 ":r !" 的一个例å::r !uuencode binfile binfile该命令读入 "binfile",用 uuencode 进行编ç ,并读入当å‰ç¼“冲区。å¯ä»¥ç”¨äºŽç¼–è¾‘åŒ…å« é™„å¸¦çš„äºŒè¿›åˆ¶çš„æ–‡ä»¶çš„ e-mail。 *read-messages* 在读入文件时,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' çš„è½¬æ¢ å®Œæˆ [crypted] 文件被解密 [READ ERRORS] 䏿˜¯æ–‡ä»¶æ‰€æœ‰éƒ¨åˆ†éƒ½è¢«æˆåŠŸè¯»å…¥ vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on Thu Sep 20 19:25:31 UTC 2007