This page was created by www.chinacode.com.
Address: http://man.chinacode.com/VIM/insert.html
Title: VIM: insert  •  Size: 119593  •  Last Modified: Thu, 20 Sep 2007 19:59:13 GMT

INSERT

*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-V CTRL-@" 或者 "CTRL-V 000"。在有的系统上,你必须使用 "CTRL-V 003" æ¥æ’å…¥ 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-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>*
<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-G u        打断撤销åºåˆ—ï¼Œå¼€å§‹æ–°çš„æ”¹å˜                   *i_CTRL-G_u*


注æ„: 如果光标键把你带出æ’入模å¼ï¼ŒæŸ¥æŸ¥ 'noesckeys' 选项。

CTRL-O 命令有时有副作用: 如果光标在行尾之åŽï¼Œå®ƒä¼šå…ˆè¢«ç§»åŠ¨è¯¥è¡Œæœ€åŽä¸€ä¸ªå­—符上。
在映射里,通常更好的方法是使用 <Esc>  (先在文本中放一个 "x",<Esc> 这时总会把
光标放到它的上é¢)。或者使用 CTRL-\ CTRL-O,ä¸è¿‡è¿™æ—¶è¦æ³¨æ„光标å¯èƒ½ç§»åˆ°è¡Œå°¾ä¹‹å¤–
çš„ä½ç½®ã€‚

䏿˜¯åœ¨æ‰€æœ‰çš„终端上都能用 Shift + 光标键。

å¦å¤–一个副作用是 "i" 或 "a" 命令之剿Œ‡å®šçš„计数会被忽略。这是因为è¦å®žçް CTRL-O
之åŽçš„命令的é‡å¤æ‰§è¡Œå¤ªå¤æ‚了。

一个使用 CTRL-G u 的例å­:

        :inoremap <C-H> <C-G>u<C-H>

它é‡å®šä¹‰é€€æ ¼é”®å¼€å§‹æ–°çš„æ’¤é”€åºåˆ—。你å¯ä»¥æ’¤é”€é€€æ ¼é”®çš„æ•ˆæžœï¼Œè€Œä¸ä¼šæ”¹å˜ä½ ä¹‹å‰è¾“入的
å†…å®¹ï¼Œå°±åƒ  CTRL-O u 那样。

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|。


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' åªæœ‰åœ¨ ">>" 和类似的命令 中æ‰ä¼šç”¨åˆ°ã€‚{Vi 无此功能} *ins-softtabstop* 如果 'softtabstop' 选项ä¸ä¸ºé›¶ï¼Œ<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>" else return "\<C-N>" endfunction inoremap <Tab> <C-R>=CleverTab()<CR> 补全整行 *compl-whole-line* *i_CTRL-X_CTRL-L* CTRL-X CTRL-L å呿œç´¢å’Œå½“å‰è¡Œå…‰æ ‡å‰å­—符åºåˆ—完全相åŒçš„行。忽略缩进。 找到的行æ’入在光标的å‰é¢ã€‚ 'complete' 选项用æ¥å†³å®šåŒ¹é…在哪个缓冲区里æœç´¢ï¼Œå·²è½½å…¥ 和未载入的缓冲区都被使用。 CTRL-L 或 CTRL-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-N 或 CTRL-X CTRL-P 继续使用 CTRL-X CTRL-N 或 CTRL-X CTRL-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-X CTRL-P 或 CTRL-X CTRL-N å¾—åˆ°ç´§è·Ÿåœ¨æ‰©å±•è¯ ä¹‹åŽçš„å•è¯ã€‚这些åºåˆ—æœç´¢åˆšåˆšæ‰©å±•的文本,并且继续扩展之,使之包括å¦å¤–一个è¯ã€‚è¿™ å¯ä»¥ç”¨äºŽä½ éœ€è¦é‡å¤ä¸€ç³»åˆ—夿‚çš„å•è¯çš„场åˆã€‚尽管 CTRL-P å’Œ CTRL-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' 被分割,则åªä¼šä½¿ç”¨å½“å‰è¡Œçš„æ–‡æœ¬ã€‚ 如果匹é…在行尾,那么下一行的第一个å•è¯ä¼šè¢«æ’å…¥ï¼Œè€Œä¸”æ˜¾ç¤ºæ¶ˆæ¯ "word from next line"。如果该è¯è¢«æŽ¥å—,那么下个 CTRL-X CTRL-P 或者 CTRL-X CTRL-N 会æœç´¢é‚£äº›ä»¥ 这个å•è¯å¼€å§‹çš„行。 补全 'dictionary' 的关键字 *compl-dictionary* *i_CTRL-X_CTRL-K* CTRL-X CTRL-K æ ¹æ® 'dictionary' 选项给出的文件æœç´¢å…‰æ ‡å‰å…³é”®å­—开始的 å•è¯ã€‚这和 CTRL-N 类似,åªä¸è¿‡æœç´¢çš„æ˜¯å­—å…¸æ–‡ä»¶ï¼Œè€Œä¸æ˜¯ 当剿–‡ä»¶ã€‚找到的关键字æ’入在光标之å‰ã€‚è¿™å¯èƒ½å¾ˆæ…¢ï¼Œå› ä¸º 在第一个匹é…用到之å‰ï¼Œæ‰€æœ‰çš„匹é…都会被找到。缺çœï¼Œ 'dictionary' 选项为空。 è¦å¾—到哪里能找å•è¯åˆ—è¡¨çš„å»ºè®®ï¼Œè§ 'dictionary' 选项。 CTRL-K 或 CTRL-N æ­£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键字。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键字。 CTRL-P å呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键字。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键字。 *i_CTRL-X_CTRL-T* CTRL-X CTRL-T å’Œ CTRL-X CTRL-K ç±»ä¼¼ï¼Œä½†ç¨æœ‰ä¸åŒã€‚它使用 'thesaurus' é€‰é¡¹ï¼Œè€Œä¸æ˜¯ 'dictionary'。如果匹é…在åŒä¹‰è¯å­—典里找 到,åŒä¸€è¡Œé‡Œå…¶ä½™å•è¯ä¹Ÿåœ¨åŒ¹é…里列出,å³ä½¿å®ƒä»¬å¹¶ä¸çœŸçš„匹 é…。这样一个å•è¯å¯ä»¥è¢«å®Œå…¨æ›¿æ¢ã€‚ 举一个例å­ï¼Œå‡æƒ³ 'thesaurus' 文件有一行形如: angry furious mad enraged æŠŠå…‰æ ‡æ”¾åœ¨å­—æ¯ "ang" 之åŽå¹¶è¾“å…¥ CTRL-X CTRL-T 会匹é…å• è¯ "angry";继续按会把å•è¯æ”¹ä¸º "furious"ã€"mad" 等等。 其它的使用包括两ç§è¯­è¨€ä¹‹é—´çš„翻译,或者用关键字给 API 函数归类。 CTRL-T 或 CTRL-N æ­£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的关键字。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键字。 CTRL-P å呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的关键字。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的关键字。 补全当å‰å’Œå¤´æ–‡ä»¶å†…的关键字 *compl-keyword* 'include' é€‰é¡¹æŒ‡å®šå¦‚ä½•æ‰¾åˆ°å«æœ‰å¤´æ–‡ä»¶å字的行。'path' é€‰é¡¹ç”¨æ¥æœç´¢å¤´æ–‡ä»¶ã€‚ *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-I 会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±»åž‹è¡¥å…¨åœ¨å…¶å®ƒä¸Šä¸‹ 文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ°ä¸¤ä¸ª CTRL-X 为 止。 补全标签 *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-F 或 CTRL-N æ­£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的文件å。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的文件å。 CTRL-P å呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的文件å。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的文件å。 è¡¥å…¨å®šä¹‰æˆ–å® *compl-define* 'define' é€‰é¡¹ç”¨æ¥æŒ‡å®šåŒ…å«å®šä¹‰çš„行。'include' é€‰é¡¹ç”¨æ¥æŒ‡å®šåŒ…å«å¤´æ–‡ä»¶å的行。 'path' é€‰é¡¹ç”¨æ¥æœç´¢å¤´æ–‡ä»¶ã€‚ *i_CTRL-X_CTRL-D* CTRL-X CTRL-D æœç´¢å½“å‰å’Œå¤´æ–‡ä»¶é‡Œç¬¬ä¸€ä¸ªä»¥å…‰æ ‡å‰é¢çš„å­—æ¯åºåˆ—开始的 定义 (或å®)ã€‚æ‰¾åˆ°çš„å®šä¹‰åæ’å…¥åœ¨å…‰æ ‡çš„å‰é¢ã€‚ CTRL-D 或 CTRL-N æ­£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…的定义。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的定义。 CTRL-P å呿œç´¢å‰ä¸€ä¸ªåŒ¹é…的定义。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…的定义。 CTRL-X CTRL-D 继续使用 CTRL-X CTRL-D 会å¤åˆ¶ä¸Šæ¬¡æœ¬ç±»åž‹è¡¥å…¨åœ¨å…¶å®ƒä¸Šä¸‹ 文里扩展的å•è¯ä¹‹åŽç´§è·Ÿçš„å•è¯ï¼Œç›´åˆ°è§åˆ°ä¸¤ä¸ª CTRL-X 为 止。 补全 Vim 命令 *compl-vim* è¿™é‡Œï¼Œè¡¥å…¨æ˜¯ä¸Šä¸‹æ–‡æ•æ„Ÿçš„,和命令行上的情况相似。它既能补全 Ex 命令,åˆèƒ½è¡¥å…¨å®ƒ çš„å‚æ•°ã€‚å¯ç”¨äºŽç¼–写 Vim 脚本。 *i_CTRL-X_CTRL-V* CTRL-X CTRL-V 猜测光标å‰çš„项目的æ¡ç›®ï¼Œå¹¶æ‰¾åˆ°ç¬¬ä¸€ä¸ªåŒ¹é…。 注æ„: 如果 CTRL-V 被映射,你通常å¯ä»¥ç”¨ CTRL-Q æ¥ä»£æ›¿ |i_CTRL-Q|。 CTRL-V 或 CTRL-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-U 或 CTRL-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-O 或 CTRL-N æ­£å‘æœç´¢ä¸‹ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。 CTRL-P å呿œç´¢å‰ä¸€ä¸ªåŒ¹é…。替æ¢ä¸Šä¸€æ¬¡åŒ¹é…。 拼写建议 *compl-spelling* 定ä½å…‰æ ‡æ‰€åœ¨æˆ–之å‰çš„å•è¯ï¼Œç„¶åŽæå‡ºæ­£ç¡®æ‹¼å†™çš„å•è¯ä½œä¸ºå»ºè®®è¿›è¡Œæ›¿ä»£ã€‚如果该行里有 一个错误拼写的å•è¯åœ¨å…‰æ ‡ä¹‹å‰æˆ–之下,移动光标到它åŽé¢ã€‚å¦åˆ™ï¼Œä½¿ç”¨åˆšåˆšåœ¨å…‰æ ‡ä¹‹å‰ 的那个å•è¯æ¥æå‡ºå»ºè®®ï¼Œå³ä½¿è¯¥å•è¯æ²¡æœ‰æ‹¼å†™é”™è¯¯ã€‚ NOTE: 很多 Unix 终端上,CTRL-S æš‚åœæ˜¾ç¤ºã€‚这时用 's' å¯ä»¥ä»£æ›¿ã€‚如果显示暂åœï¼Œè¾“ å…¥ CTRL-Q 会继续显示。 *i_CTRL-X_CTRL-S* *i_CTRL-X_s* CTRL-X CTRL-S 或 CTRL-X s 定ä½å…‰æ ‡ä¹‹å‰çš„å•è¯ï¼Œå¹¶å¯»æ‰¾å®ƒçš„第一个拼写建议。 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-X CTRL-N 或 CTRL-X CTRL-P 继续使用 CTRL-X CTRL-N 或 CTRL-X CTRL-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('.') - 1 while start > 0 && line[start - 1] =~ '\a' let start -= 1 endwhile return start else " å¯»æ‰¾åŒ¹é… "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 " 定ä½å•è¯çš„开始处 let line = getline('.') let start = col('.') - 1 while start > 0 && line[start - 1] =~ '\a' let start -= 1 endwhile return start else " å¯»æ‰¾åŒ¹é… "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' 用于设置最大高度。默认值是使用全部有效空间。 有三个状æ€: 1. æ’入了完整的匹é…,例如在 CTRL-N 或 CTRL-P 之åŽã€‚ 2. 用光标键选择其它匹é…é¡¹ã€‚æ­¤æ—¶ä¸æ’入该匹é…项,åªåœ¨å¼¹å‡ºèœå•中高亮选中的æ¡ç›®ã€‚ 3. åªæ’å…¥äº†éƒ¨åˆ†åŒ¹é…æ–‡æœ¬ï¼Œå¹¶ä¸”å·²ç»è¾“入字符或者使用了退格键,这时匹é…é¡¹åˆ—è¡¨æ ¹æ® å…‰æ ‡å‰çš„内容进行调整。 开始时你通常处于状æ€ä¸€å¹¶æ’入第一个匹é…。如果 'completeopt' 包å«äº† "longest" 而 且有多个匹é…项,那么开始于状æ€ä¸‰ã€‚ 如果选择其它匹é…项,例如键入 CTRL-N 或 CTRL-P,就进入了状æ€ä¸€ã€‚è¿™ä¸ä¼šæ”¹å˜åŒ¹é… 项列表。 如果退回到原文,就会处于状æ€ä¸‰ã€‚è¦ç«‹å³è¿›å…¥è¯¥çжæ€ï¼Œå¯ä»¥ä½¿ç”¨å¿«æ·é”®æ˜ å°„方法,该映 射在补全开始åŽç«‹å³ä½¿ç”¨ CTRL-P: :imap <F7> <C-N><C-P> *popupmenu-keys* 状æ€ä¸€ä¸‹ï¼Œè¿™äº›é”®æœ‰ç‰¹åˆ«çš„å«ä¹‰: <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>" endif return '.' 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-X CTRL-O,会直接从标签文件中补全。这 适用于任何标识符,包括函数å。如果你想补全标签文件没有的局部å˜é‡å,用 CTRL-P 代替。 å¦‚æžœåœ¨åŒ…å« "." 或 "=" çš„åå­—åŽé¢ç”¨ CTRL-X CTRL-O,Vim 会试图识别å˜é‡ç±»åž‹å¹¶æŒ‡å‡º 它所å«çš„æˆå‘˜ã€‚è¿™æ„味ç€åªä¼šåˆ—出该å˜é‡çš„æœ‰æ•ˆæˆå‘˜ã€‚ 如果æˆå‘˜åå­—å·²ç»å®Œæ•´ï¼ŒCTRL-X CTRL-O 会为å¤åˆç±»åž‹åŠ ä¸Š "." 或 "->"。 Vim æ²¡æœ‰åŒ…å« C 编译器,它åªèƒ½è¯†åˆ«ä½¿ç”¨æ˜Žç¡®æ ¼å¼çš„声明。预处ç†å™¨æŒ‡ä»¤å¯èƒ½ä¼šå¼•èµ·æ·· 淆。如果在多个ä½ç½®é‡Œå®šä¹‰äº†åŒæ ·çš„结构å,所有å¯èƒ½çš„结构æˆå‘˜éƒ½ä¼šè¢«åŒ…括。 CSS *ft-css-omni* éµå¾ª CSS 2.1 标准æ¥è¡¥å…¨å±žæ€§å’Œç›¸åº”的值。 HTML *ft-html-omni* XHTML *ft-xhtml-omni* CTRL-X CTRL-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-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 *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-X CTRL-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 = 1 SYNTAX *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 | \ endif endif åªæœ‰åœ¨é’ˆå¯¹ç‰¹å®šæ–‡ä»¶ç±»åž‹çš„æ’ä»¶ä¸å­˜åœ¨çš„æƒ…å†µä¸‹ï¼Œä¸Šè¿°è¯­å¥æ‰å¯¹è„šæœ¬è®¾ç½®è¡¥å…¨æ“作。 æ¯ä¸ªæ–‡ä»¶ç±»åž‹å¯èƒ½æœ‰å¾ˆå¤šè¯­æ³•项目。此æ’ä»¶å…è®¸ä½ å®šåˆ¶ä»Žåˆ—è¡¨é‡ŒåŒ…å«æˆ–排除哪些语法组。 让我们看看 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 = 0 SQL *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-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|。列表中第 一个元素也是列表,包å«å¯èƒ½çš„å­å…ƒç´ å称,第二个元素是字典 |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" - 特殊键,包å«é”®ä¸ºæ ‡ç­¾åã€å€¼ä¸ºä¸¤å…ƒç´ åˆ—è¡¨çš„å­—å…¸ã€‚å€¼åˆ—è¡¨åŒ…å« é™„åŠ çš„èœå•ä¿¡æ¯å’Œé•¿æè¿°ã€‚ 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] 次。{Vi 无此功能} *gi* gi 在当å‰ç¼“冲区最近一次æ’入模å¼åœæ­¢çš„ä½ç½®ç»§ç»­æ’入文本。 该ä½ç½®è®°åœ¨ |'^| ä½ç½®æ ‡è®°é‡Œã€‚如果标记在行末之åŽï¼Œå’Œ "`^i" 有所差异。 该ä½ç½®åœ¨æ’å…¥/删除行时会自动修正。但_ä¸_在æ’å…¥/删除字符 时被修正。 使用 |:keepjumps| å‘½ä»¤ä¿®é¥°ç¬¦æ—¶ï¼Œä¸æ”¹å˜ |'^| ä½ç½®æ ‡è®°ã€‚ {Vi 无此功能} *o* o åœ¨å…‰æ ‡ä¸‹æ–¹å¼€å¯æ–°è¡Œï¼Œå¹¶æ’入文本,é‡å¤ [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 无此功能} {仅当编译时带 +ex_extra 特性时æ‰å¯ç”¨} *:stopi* *:stopinsert* :stopi[nsert] å°½å¿«åœæ­¢æ’入模å¼ã€‚和在æ’å…¥æ¨¡å¼æ—¶è¾“å…¥ <Esc> 类似。å¯ä»¥ 用在自动命令里。示例: :au BufEnter scratch stopinsert *replacing-ex* *:startreplace* :startr[eplace][!] 在执行完本命令åŽï¼Œå¯åŠ¨æ›¿æ¢æ¨¡å¼ã€‚和普通模å¼ä¸‹è¾“å…¥ "R" ç±»ä¼¼ã€‚å¦‚æžœåŒ…å« !,和 "$R" 类似 (ä¹Ÿå°±æ˜¯ï¼Œä»Žè¡Œå°¾å¼€å§‹æ›¿æ¢ æ¨¡å¼)。å¦åˆ™ï¼Œä»Žå…‰æ ‡å½“å‰ä½ç½®å¼€å§‹æ›¿æ¢ã€‚ æ³¨æ„ åœ¨å‡½æ•°æˆ–è€…è„šæœ¬é‡Œä½¿ç”¨æœ¬å‘½ä»¤æ—¶ï¼Œæ›¿æ¢åªä¼šåœ¨å‡½æ•°å’Œè„š æœ¬ç»“æŸçš„æ—¶å€™æ‰ä¼šå¼€å§‹ã€‚ {Vi 无此功能} {仅当编译时带 +ex_extra 特性时æ‰å¯ç”¨} *:startgreplace* :startg[replace][!] å’Œ |:startreplace| å®Œå…¨ç±»ä¼¼ï¼Œç”¨è™šæ‹Ÿæ›¿æ¢æ¨¡å¼ï¼Œå’Œä½¿ç”¨ |gR| 类似。 {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