*map.txt* For Vim version 7.1. æœ€åŽæ›´æ–°: 2007å¹´5月
VIM å‚考手册 作者: Bram Moolenaar
译者: con<con@netease.com>
http://vimcdoc.sf.net
é”®æ˜ å°„ã€ç¼©å†™å’Œç”¨æˆ·å®šä¹‰çš„命令。
本主题在用户手册 |05.3|,|24.7| å’Œ |40.1| 䏿œ‰è¿‡ä»‹ç»ã€‚
1. é”®æ˜ å°„ |key-mapping|
1.1 æ˜ å°„ 命 令 |:map-commands|
1.2 ç‰¹æ®Šå‚æ•° |:map-arguments|
1.3 æ˜ å°„ä¸Žè¿è¡Œæ¨¡å¼ |:map-modes|
1.4 åˆ—å‡ºæ˜ å°„ |map-listing|
1.5 æ˜ å°„ç‰¹æ®Šé”® |:map-special-keys|
1.6 特殊å—符 |:map-special-chars|
1.7 æ˜ å°„å“ªäº›é”® |map-which-keys|
1.8 示例 |map-examples|
1.9 ä½¿ç”¨æ˜ å°„ |map-typing|
1.10 æ˜ å°„ ALT é”® |:map-alt-keys|
1.11 æ˜ å°„æ“作符 |:map-operator|
2. 缩写 |abbreviations|
3. å±€éƒ¨æ˜ å°„å’Œå‡½æ•° |script-local|
4. 用户定义的命令 |user-commands|
1. é”®æ˜ å°„ *key-mapping* *mapping* *macro*
é”®æ˜ å°„ç”¨äºŽæ”¹å˜è¾“入键的å«ä¹‰ã€‚最常è§çš„用途是把功能键定义为一系列的命令。比如::map<F2>a<C-R>=strftime("%c")<CR><Esc>è¿™ä¸ªæ˜ å°„ä¼šåœ¨å…‰æ ‡ä¹‹åŽè¿½åР当å‰çš„æ—¥æœŸå’Œæ—¶é—´ (用<>记法 |<>|)。 1.1 æ˜ å°„ 命 令 *:map-commands* æœ‰å¾ˆå¤šå‘½ä»¤ç”¨äºŽå®šä¹‰æ–°çš„æ˜ å°„ï¼Œåˆ é™¤æ˜ å°„å’Œåˆ—å‡ºå½“å‰çš„æ˜ 射。å¯ä»¥ä»Ž |map-overview| å‚ è€ƒ "æ˜ å°„" 命令的ä¸åŒå½¢å¼åŠå…¶ä¸Žæ¨¡å¼çš„关系。{lhs}表示左手边 *{lhs}">{lhs}*{rhs}è¡¨ç¤ºå³æ‰‹è¾¹ *{rhs}">{rhs}* :map{lhs}{rhs}|mapmode-nvo| *:map* :nm[ap]{lhs}{rhs}|mapmode-n| *:nm* *:nmap* :vm[ap]{lhs}{rhs}|mapmode-v| *:vm* *:vmap* :xm[ap]{lhs}{rhs}|mapmode-x| *:xm* *:xmap* :smap{lhs}{rhs}|mapmode-s| *:smap* :om[ap]{lhs}{rhs}|mapmode-o| *:om* *:omap* :map!{lhs}{rhs}|mapmode-ic| *:map!* :im[ap]{lhs}{rhs}|mapmode-i| *:im* *:imap* :lm[ap]{lhs}{rhs}|mapmode-l| *:lm* *:lmap* :cm[ap]{lhs}{rhs}|mapmode-c| *:cm* *:cmap* åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸æŠŠé”®ç³»åˆ—{lhs}æ˜ å°„ä¸º{rhs}。并 ä¸”æ˜ å°„åŽçš„{rhs}ä¹Ÿè¢«è¿›è¡Œæ˜ å°„æ‰«æã€‚这个特性å¯ä»¥ç”¨æ¥è¿› è¡Œæ˜ å°„çš„åµŒå¥—å’Œé€’å½’ã€‚ :no[remap]{lhs}{rhs}|mapmode-nvo| *:no* *:noremap* :nn[oremap]{lhs}{rhs}|mapmode-n| *:nn* *:nnoremap* :vn[oremap]{lhs}{rhs}|mapmode-v| *:vn* *:vnoremap* :xn[oremap]{lhs}{rhs}|mapmode-x| *:xn* *:xnoremap* :snor[emap]{lhs}{rhs}|mapmode-s| *:snor* *:snoremap* :ono[remap]{lhs}{rhs}|mapmode-o| *:ono* *:onoremap* :no[remap]!{lhs}{rhs}|mapmode-ic| *:no!* *:noremap!* :ino[remap]{lhs}{rhs}|mapmode-i| *:ino* *:inoremap* :ln[oremap]{lhs}{rhs}|mapmode-l| *:ln* *:lnoremap* :cno[remap]{lhs}{rhs}|mapmode-c| *:cno* *:cnoremap* åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸æŠŠé”®åºåˆ—{lhs}æ˜ å°„ä¸º{rhs}ã€‚ç¦ æ¢å¯¹æ˜ å°„åŽçš„{rhs}è¿›è¡Œæ˜ å°„æ‰«æã€‚这个特性å¯ä»¥é¿å…æ˜ å°„ 的嵌套和递归。通常用于é‡å®šä¹‰ä¸€ä¸ªå‘½ä»¤ã€‚:unm[ap]{Vi æ— æ¤åŠŸèƒ½}{lhs}|mapmode-nvo| *:unm* *:unmap* :nun[map]{lhs}|mapmode-n| *:nun* *:nunmap* :vu[nmap]{lhs}|mapmode-v| *:vu* *:vunmap* :xu[nmap]{lhs}|mapmode-x| *:xu* *:xunmap* :sunm[ap]{lhs}|mapmode-s| *:sunm* *:sunmap* :ou[nmap]{lhs}|mapmode-o| *:ou* *:ounmap* :unm[ap]!{lhs}|mapmode-ic| *:unm!* *:unmap!* :iu[nmap]{lhs}|mapmode-i| *:iu* *:iunmap* :lu[nmap]{lhs}|mapmode-l| *:lu* *:lunmap* :cu[nmap]{lhs}|mapmode-c| *:cu* *:cunmap* åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸åˆ 除{lhs}çš„æ˜ å°„ã€‚è¯¥æ˜ å°„ä»ç„¶å¯ 以在其它模å¼ä¸ä¿ç•™å…¶å®šä¹‰ã€‚备注:{lhs}åŒ…å«æœ«å°¾çš„ç©ºæ ¼ã€‚è¯¥æ˜ å°„å–æ¶ˆæ“作_ä¸ä¼š_生效: :map @@ foo :unmap @@ | print :mapc[lear] |mapmode-nvo| *:mapc* *:mapclear* :nmapc[lear] |mapmode-n| *:nmapc* *:nmapclear* :vmapc[lear] |mapmode-v| *:vmapc* *:vmapclear* :xmapc[lear] |mapmode-x| *:xmapc* *:xmapclear* :smapc[lear] |mapmode-s| *:smapc* *:smapclear* :omapc[lear] |mapmode-o| *:omapc* *:omapclear* :mapc[lear]! |mapmode-ic| *:mapc!* *:mapclear!* :imapc[lear] |mapmode-i| *:imapc* *:imapclear* :lmapc[lear] |mapmode-l| *:lmapc* *:lmapclear* :cmapc[lear] |mapmode-c| *:cmapc* *:cmapclear* åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸åˆ 除_所有_çš„æ˜ å°„ã€‚è¦å‘Š: åŒæ—¶ä¹Ÿä¼šåˆ 除缺çœçš„æ˜ 射。 :map |mapmode-nvo| :nm[ap] |mapmode-n| :vm[ap] |mapmode-v| :xm[ap] |mapmode-x| :sm[ap] |mapmode-s| :om[ap] |mapmode-o| :map! |mapmode-ic| :im[ap] |mapmode-i| :lm[ap] |mapmode-l| :cm[ap] |mapmode-c| åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸åˆ—å‡ºæ‰€æœ‰çš„é”®æ˜ å°„ã€‚{Vi æ— æ¤åŠŸèƒ½}注æ„":map" å’Œ ":map!" æ˜¯æœ€å¸¸ç”¨çš„ï¼Œå› ä¸ºå®ƒä»¬åŒ…æ‹¬å…¶å®ƒæ¨¡å¼ã€‚ :map{lhs}|mapmode-nvo| *:map_l* :nm[ap]{lhs}|mapmode-n| *:nmap_l* :vm[ap]{lhs}|mapmode-v| *:vmap_l* :xm[ap]{lhs}|mapmode-x| *:xmap_l* :sm[ap]{lhs}|mapmode-s| *:smap_l* :om[ap]{lhs}|mapmode-o| *:omap_l* :map!{lhs}|mapmode-ic| *:map_l!* :im[ap]{lhs}|mapmode-i| *:imap_l* :lm[ap]{lhs}|mapmode-l| *:lmap_l* :cm[ap]{lhs}|mapmode-c| *:cmap_l* åœ¨æ˜ å°„å‘½ä»¤ä½œç”¨çš„æ¨¡å¼ä¸åˆ—出以{lhs}å¼€å¤´çš„é”®æ˜ å°„çš„é”®ç³» åˆ—ã€‚è¿™äº›å‘½ä»¤ç”¨äºŽæŠŠä¸€ä¸ªé”®æˆ–é”®ç³»åˆ—æ˜ å°„æˆä¸€ä¸ªå—符串。å¯ä»¥ç”¨æ¥åœ¨åŠŸèƒ½é”®é‡Œæ”¾ç½®ä¸€ç³»åˆ—å‘½ ä»¤ï¼ŒæŠŠä¸€ä¸ªé”®è½¬æ¢æˆå¦ä¸€ä¸ªï¼Œç‰ç‰ã€‚如何ä¿å˜å’Œæ¢å¤å½“剿˜ å°„å¯ä»¥å‚考 |:mkexrc|。 *map-ambiguous* å½“ä¸¤ä¸ªæ˜ å°„ä»¥ç›¸åŒçš„å—符顺åºå¼€å§‹ï¼Œå®ƒä»¬æ˜¯æœ‰äºŒä¹‰æ€§çš„。例如:{Vi æ— æ¤åŠŸèƒ½}:imap aa foo:imap aaa bar当 Vim 读入 "aa" åŽï¼Œå®ƒéœ€è¦å–å¾—å¦å¤–一个å—符æ‰èƒ½å†³å®šåº”è¯¥æ˜ å°„ "aa" 还是 "aaa"。 è¿™æ„味ç€è¾“å…¥ "aa" åŽæ˜ 射还ä¸ä¼šå±•开,Vim 还在ç‰å¾…å¦ä¸€ä¸ªå—ç¬¦ã€‚å¦‚æžœä½ æŽ¥ç€è¾“入一个 ç©ºæ ¼ï¼Œé‚£ä¹ˆå°†æ’å…¥ "foo" åŠ ä¸Šç©ºæ ¼ã€‚å¦‚æžœä½ è¾“å…¥ä¸€ä¸ª "a",那么将æ’å…¥ "bar"。1.2 特 殊 å‚ æ•° *:map-arguments* "{Vi ä¸å…è®¸æœ‰äºŒä¹‰æ€§çš„æ˜ å°„}<buffer>","<silent>","<special>"ã€"<script>"ã€"<expr>" å’Œ "<unique>" å¯ä»¥æŒ‰ ä»»æ„顺åºä½¿ç”¨ã€‚它们必须紧跟在命令的åŽè¾¹ï¼Œè€Œåœ¨å…¶å®ƒä»»ä½•傿•°çš„å‰è¾¹ã€‚ *:map-local* *:map-<buffer>* *E224* *E225* å¦‚æžœè¿™äº›å‘½ä»¤çš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ "<buffer>"ï¼Œæ˜ å°„å°†åªå±€é™äºŽå½“å‰çš„缓冲区内。例如::mapç„¶åŽä½ å¯ä»¥åœ¨å¦ä¸€ä¸ªç¼“冲区内把 ",w" 作å¦å¤–çš„æ˜ å°„:<buffer>,w /[.,;]<CR>:mapå±€éƒ¨ç¼“å†²åŒºæ˜ å°„åœ¨å…¨å±€æ˜ å°„ä¹‹å‰è¢«åº”用。 "<buffer>,w /[#&!]<CR><buffer>" 傿•°ä¹Ÿå¯ä»¥ç”¨äºŽæ¸…é™¤æ˜ å°„::unmap<buffer>,w:mapclearå½“ä¸€ä¸ªç¼“å†²åŒºè¢«åˆ é™¤æ—¶å±€éƒ¨æ˜ å°„ä¹Ÿä¼šè¢«æ¸…é™¤ï¼Œä½†æ˜¯åœ¨å®ƒè¢«å¸è½½æ—¶ä¸ä¼šã€‚就象局部选项值的 æƒ…å†µä¸€æ ·ã€‚ *:map-<silent>* *:map-silent* è¦åœ¨å®šä¹‰ä¸€ä¸ªæ˜ å°„æ—¶ä¸åœ¨å‘½ä»¤è¡Œä¸Šå›žæ˜¾è¯¥æ˜ 射,å¯ä»¥ä½¿ç”¨ "<buffer><silent>" ä½œä¸ºç¬¬ä¸€ä¸ªå‚æ•°ï¼Œ 例如::mapåœ¨ä½¿ç”¨è¿™ä¸ªæ˜ å°„æ—¶æœç´¢å—串将ä¸å›žæ˜¾ã€‚ä¸è¿‡è¢«æ‰§è¡Œå‘½ä»¤çš„ä¿¡æ¯ä»ç„¶ä¼šã€‚è¦æŠŠå®ƒä¹Ÿå…³æŽ‰ï¼Œå¯ ä»¥åœ¨æ‰§è¡Œçš„å‘½ä»¤é‡ŒåŠ å…¥ä¸€ä¸ª ":silent":<silent>,h /Header<CR>:mapä»ç„¶ä¼šç»™å‡ºæç¤ºï¼Œæ¯”如使用 inputdialog() 的时候。 在缩写上使用 "<silent>,h :exe ":silent normal /Header\r"<CR><silent>" 是å¯ä»¥çš„,但它的作用是使命令行ä¸è¿›è¡Œé‡ç»˜ã€‚ *:map-<special>* *:map-special* å®šä¹‰æ˜ å°„æ—¶ï¼Œç‰¹æ®Šé”®å¯ç”¨<>记法,å³ä½¿ 'cpoptions' 包å«äº† "<" æ ‡å¿—ä½ä¹Ÿæ²¡é—®é¢˜ã€‚è¿™ å¯ç”¨äºŽä¸å¸Œæœ›çœ‹åˆ°è®¾ç½® 'cpoptions' 时出现的副作用的场åˆã€‚例如::map*:map-<script>* *:map-script* å¦‚æžœç»™ç”¨äºŽå®šä¹‰æ–°æ˜ å°„æˆ–ç¼©å†™çš„å‘½ä»¤çš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ "<special><F12>/Header<CR><script>"ï¼Œè¯¥æ˜ å°„åªä½¿ç”¨é€šè¿‡ä»¥ "<SID>" 开头æ¥å®šä¹‰çš„çš„è„šæœ¬å±€éƒ¨æ˜ å°„æ¥é‡æ˜ å°„{rhs}ä¸çš„å—符。这å¯ä»¥ç”¨äºŽé¿å…æ¥è‡ª 外部的脚本的干扰 (举例æ¥è¯´ï¼Œåœ¨ mswin.vim ä¸CTRL-Vè¢«é‡æ–°æ˜ 射的时候就是如æ¤), 但是åˆéœ€è¦ä½¿ç”¨è¯¥è„šæœ¬ä¸å®šä¹‰çš„å…¶å®ƒæ˜ å°„çš„æƒ…å½¢ã€‚å¤‡æ³¨: ":map<script>" å’Œ ":noremap<script>" åšåŒæ ·çš„事情。这里 "<script>" è¶… 越命令å。ä¸è¿‡ï¼Œæ›´æŽ¨è使用 ":noremap<script>"ï¼Œå› ä¸ºå®ƒæ›´æ¸…æ™°åœ°è¡¨ç¤ºäº†é‡æ˜ 射已被 (大多数时候) ç¦æ¢ã€‚ *:map-<unique>* *E226* *E227* å¦‚æžœç»™ç”¨äºŽå®šä¹‰æ–°æ˜ å°„æˆ–ç¼©å†™çš„å‘½ä»¤çš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ "<unique>" å¹¶ä¸”å®ƒè¯¥æ˜ å°„æˆ–ç¼©å†™å·² ç»å˜åœ¨ï¼Œåˆ™è¯¥å‘½ä»¤ä¼šå¤±è´¥ã€‚例如::mapå®šä¹‰ä¸€ä¸ªå±€éƒ¨æ˜ å°„æ—¶ï¼ŒåŒæ—¶ä¹Ÿä¼šæ£€æŸ¥æ˜¯å¦å·²å˜åœ¨äº†ä¸€ä¸ªç›¸åŒçš„å…¨å±€æ˜ å°„ã€‚ 这个例å将失败:<unique>,w /[#&!]<CR>:map ,w /[#&!]<CR>:mapå¦‚æžœä½ æƒ³ç»™é”®è¿›è¡Œæ˜ å°„ï¼Œä½†åŒæ—¶åˆæƒ³æ‰§è¡ŒåŽŸæ¥æ˜ 射的内容,å‚è§ |maparg()|。 *:map-<expr>* *:map-expression* å¦‚æžœç»™ç”¨äºŽå®šä¹‰æ–°æ˜ å°„æˆ–ç¼©å†™çš„å‘½ä»¤çš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ "<buffer><unique>,w /[.,;]<CR><expr>"ï¼Œé‚£ä¹ˆå‚æ•°ä¼šä½œä¸ºè¡¨è¾¾å¼ æ¥è¿›è¡Œè®¡ç®—,结果作为实际使用的{rhs}。例如::inoremap会æ’å…¥ InsertDot() 函数的返回值。这å¯ä»¥ç”¨æ¥æ£€æŸ¥å…‰æ ‡ä¹‹å‰çš„æ–‡æœ¬å¹¶åœ¨ä¸€å®šæ¡ä»¶ä¸‹å¯ 动全能 (omni) 补全。 è¦éžå¸¸å°å¿ƒå‰¯ä½œç”¨ï¼è®¡ç®—表达å¼çš„åŒæ—¶æ£åœ¨èŽ·å–å—ç¬¦ï¼Œå› æ¤å¾ˆæœ‰å¯èƒ½ä½ 使得该命令ä¸å†å¯ 用。为æ¤åŽŸå› ç¦æ¢ä»¥ä¸‹è¡Œä¸º: - 改å˜ç¼“冲区文本 |textlock| - 编辑其它缓冲区 - |:normal| 命令 - å¯ä»¥ç§»åŠ¨å…‰æ ‡ï¼Œä½†äº‹åŽå…‰æ ‡ä¼šè¢«æ¢å¤ - ä½ å¯ä»¥ä½¿ç”¨ getchar(),但ä¸èƒ½çœ‹åˆ°å·²æœ‰çš„预输入,而新的预输入也会被丢弃。 å¦‚æžœä½ å¸Œæœ›é€šè¿‡æ˜ å°„æ¥å®Œæˆè¿™äº›æ“作,让返回的å—符åšè¿™äº›äº‹æƒ…。 这里是æ’入递增的列表编å·çš„例å:<expr>. InsertDot()let counter = 0inoremap<expr><C-L>ListItem()inoremap<expr><C-R>ListReset()func ListItem()let g:counter += 1return g:counter . '. 'endfuncfunc ListReset()let g:counter = 0return ''endfuncCTRL-Læ’入下一个数值,CTRL-Rå¤ä½è®¡æ•°ä¸”返回空å—ç¬¦ä¸²ï¼Œè¿™æ ·å°±ä¸ä¼šæ’入任何内容。注æ„è¦ä½¿ç‰¹æ®Šé”®å·¥ä½œå¹¶è½¬ä¹‰æ–‡æœ¬ä¸çš„ CSI å—节需è¦ä¸€äº›ç‰¹æ®Šå¤„ç†ã€‚|:map| 命令已ç»åš å¥½äº†ï¼Œæ‰€ä»¥ä½ åº”è¯¥é¿å…åšé‡å¤çš„æ“ä½œã€‚è¿™æ ·ä¸è¡Œ::imapå› ä¸º <Char- åºåˆ—作为 |:imap| çš„å‚æ•°è¢«è½¬ä¹‰ï¼Œè€Œ<expr><F3>"<Char-0x611B>"<expr>åˆåšä¸€æ¬¡ã€‚è¿™æ ·å°±å¯ä»¥::imap在其它文本之å‰ä½¿ç”¨å•个å—节出现的 0x80 是ä¸è¡Œçš„。它会被看作一个特殊键。 1.3 æ˜ å°„ 与 è¿ è¡Œ 模 å¼ *:map-modes* æœ‰äº”ç§æ˜ å°„å˜åœ¨ - 用于普通模å¼: 输入命令时。 - 用于å¯è§†æ¨¡å¼: å¯è§†åŒºåŸŸé«˜äº®å¹¶è¾“入命令时。 - 用于æ“作符ç‰å¾…模å¼: æ“作符ç‰å¾…ä¸ ("d","y","c" ç‰ç‰ä¹‹åŽ)。 例如: ":omap { w" 会使 "y{" ç‰åŒäºŽ "yw","d{" 也ç‰åŒäºŽ "dw"。 - 用于æ’入模å¼: ä¹Ÿç”¨äºŽæ›¿æ¢æ¨¡å¼ã€‚ - 用于命令行模å¼: 输入 ":" 或 "/" 命令时。 特殊情况:当在普通模å¼é‡Œä¸ºä¸€ä¸ªå‘½ä»¤è¾“入一个计数时,对 0 çš„æ˜ å°„ä¼šè¢«ç¦ç”¨ã€‚è¿™æ ·åœ¨ 输入一个带有 0 的计数时ä¸ä¼šå—到对 0 é”®æ˜ å°„çš„å¹²æ‰°ã€‚ *map-overview* *map-modes* 关于æ¯ä¸ªæ˜ 射命令对应的工作模å¼çš„æ¦‚况: *mapmode-nvo* *mapmode-n* *mapmode-v* *mapmode-o*<expr><F3>"\u611B"命令: 模å¼:普通 å¯è§†+选择 æ“作符ç‰å¾…:map :noremap :unmap :mapclear 是 是 是 :nmap :nnoremap :nunmap :nmapclear 是 - - :vmap :vnoremap :vunmap :vmapclear - 是 - :omap :onoremap :ounmap :omapclear - - 是 ä¿®é“院之外也有 :nunmap (译者注: nun,修女)。 *mapmode-x* *mapmode-s* æœ‰çš„å‘½ä»¤èƒ½åŒæ—¶ç”¨äºŽå¯è§†å’Œé€‰æ‹©æ¨¡å¼ï¼Œæœ‰çš„åªèƒ½ç”¨äºŽå…¶ä¸ä¸€ä¸ªã€‚注æ„很常è§çš„æƒ…况是æ 到 "å¯è§†" çš„æ—¶å€™å®žé™…åŒæ—¶é€‚用å¯è§†å’Œé€‰æ‹©ä¸¤ç§æ¨¡å¼ã€‚|Select-mode-mapping|命令: 模å¼:å¯è§† 选择:vmap :vnoremap :vunmap :vmapclear 是 是 :xmap :xnoremap :xunmap :xmapclear 是 - :smap :snoremap :sunmap :smapclear - 是 *mapmode-ic* *mapmode-i* *mapmode-c* *mapmode-l* æœ‰çš„å‘½ä»¤åŒæ—¶æ”¯æŒæ’入模å¼å’Œå‘½ä»¤è¡Œæ¨¡å¼ï¼Œæœ‰çš„䏿˜¯:命令: 模å¼:æ’å…¥ 命令行 Lang-Arg:map! :noremap! :unmap! :mapclear! 是 是 - :imap :inoremap :iunmap :imapclear 是 - - :cmap :cnoremap :cunmap :cmapclear - 是 - :lmap :lnoremap :lunmap :lmapclear 是* 是* 是* 原æ¥çš„ Vi 没有针对普通/å¯è§†/æ“作符ç‰å¾…模å¼å’Œé’ˆå¯¹æ’å…¥/命令行模å¼çš„ç‹¬ç«‹æ˜ å°„ã€‚å› æ¤ ":map" å’Œ ":map!" 命令为多个模å¼å®šä¹‰å’Œå›žæ˜¾æ˜ 射。在 Vim ä¸ä½ å¯ä»¥ä½¿ç”¨ ":nmap"ã€":vmap"ã€:omap"ã€":cmap" å’Œ ":imap" 命令æ¥å¯¹æ¯ä¸ªä¸åŒçš„æ¨¡å¼åˆ†åˆ«å®šä¹‰æ˜ 射。 è¦ä¸ºæ™®é€šå’Œå¯è§†æ¨¡å¼ä½†ä¸åŒ…括æ“作符ç‰å¾…模å¼è¾“å…¥ä¸€ä¸ªæ˜ å°„ï¼Œé¦–å…ˆåœ¨æ‰€æœ‰çš„ä¸‰ä¸ªæ¨¡å¼ä¸å®š ä¹‰è¯¥æ˜ å°„ï¼Œç„¶åŽåœ¨æ“作符ç‰å¾…模å¼ä¸å–æ¶ˆè¯¥æ˜ å°„::map xx something-difficult:ounmap xxå¯¹äºŽä¸€ä¸ªåŒæ—¶ç”¨äºŽå¯è§†å’Œæ“作符ç‰å¾…模å¼ã€æˆ–åŒæ—¶ç”¨äºŽæ™®é€šå’Œæ“作符ç‰å¾…模å¼çš„æ˜ å°„ä¹Ÿå¯ ç…§æ¤åŠžç†ã€‚ *language-mapping* ":lmap" å®šä¹‰ä¸€ä¸ªåº”ç”¨äºŽä»¥ä¸‹æƒ…å†µçš„æ˜ å°„: - æ’å…¥æ¨¡å¼ - å‘½ä»¤è¡Œæ¨¡å¼ - 输入一个æœç´¢æ¨¡å¼æ—¶ - 接å—一个文本å—ç¬¦ä½œä¸ºå‚æ•°çš„命令,比如 "r" å’Œ "f" - 对于 input() 行 更一般地: 任何输入的å—符是缓冲区文本的一部分而éžä¸€ä¸ª Vim 命令å—符的时候。 "Lang-Arg" 䏿˜¯çœŸæ£çš„å¦å¤–一个模å¼ï¼Œå®ƒä»…用æ¥è¡¨ç¤ºè¿™äº›æƒ…况的å˜åœ¨ã€‚ 载入一个相关è¯è¨€æ˜ 射集åˆçš„æœ€ç®€å•的方法是通过使用 'keymap' 选项。 å‚考 |45.5|。 在æ’入模å¼å’Œå‘½ä»¤è¡Œæ¨¡å¼ä¸å¯ç”¨CTRL-^命令æ¥å…³é—æ˜ å°„ |i_CTRL-^| |c_CTRL-^|。 普通命令行 (éžæ¨¡å¼æœç´¢) å¼€å§‹è¾“å…¥æ—¶ï¼Œæ˜ å°„è¢«å…³é—直到输入CTRL-^为æ¢ã€‚而æ’å…¥æ¨¡å¼ å’Œæ¨¡å¼æœç´¢å´ä¼šåˆ†åˆ«è®°ä½ä¸Šæ¬¡ä½¿ç”¨çš„状æ€ã€‚需è¦è¾“入一个å—ç¬¦ä½œä¸ºå‚æ•°çš„命令,如 "f" 或 "t" 之类,也使用æ’入模å¼çš„状æ€ã€‚ è¯è¨€æ˜ 射永远ä¸èƒ½åº”ç”¨äºŽå·²ç»æ˜ å°„çš„å—符上。它们仅用于键入的å—符上。这æ„味ç€è¾“ å…¥æ˜ å°„æ—¶ï¼Œè¯è¨€æ˜ å°„å·²ç»å®Œæˆã€‚ 1.4 列 出 æ˜ å°„ *map-listing* å½“åˆ—å‡ºæ˜ å°„æ—¶ï¼Œå‰é¢ä¸¤æ çš„å—符表示 (坿œ‰å¤šä¸ª):å— ç¬¦ 模 å¼<Space>普通ã€å¯è§†ã€é€‰æ‹©å’Œæ“作符ç‰å¾… n 普通 v å¯è§†å’Œé€‰æ‹© s 选择 x å¯è§† o æ“作符ç‰å¾… ! æ’入和命令行 i æ’å…¥ l æ’å…¥ã€å‘½ä»¤è¡Œå’Œ Lang-Arg 模å¼çš„ ":lmap" æ˜ å°„ c 命令行{rhs}之å‰å¯èƒ½æ˜¾ç¤ºä¸€ä¸ªç‰¹æ®Šå—符: * 表示它ä¸å¯é‡æ˜ å°„ & è¡¨ç¤ºä»…è„šæœ¬çš„å±€éƒ¨æ˜ å°„å¯ä»¥è¢«é‡æ˜ å°„ @ è¡¨ç¤ºç¼“å†²åŒºçš„å±€éƒ¨æ˜ å°„ 从{lhs}以åŽçš„第一个éžç©ºå—符到行的末尾 (或 '|') 都被认为是{rhs}的一部分。这 å…许{rhs}ä»¥ä¸€ä¸ªç©ºæ ¼ç»“å°¾ã€‚æ³¨æ„: 在å¯è§†æ¨¡å¼é‡Œä½¿ç”¨æ˜ å°„æ—¶ï¼Œä½ å¯ä»¥ä½¿ç”¨ "'<" ä½ç½®æ ‡è®°ï¼Œå®ƒè¡¨ç¤ºå½“å‰ç¼“å†²åŒºä¸æœ€åŽ è¢«é€‰ä¸çš„å¯è§†åŒºåŸŸçš„开始 |'<|。 *:map-verbose* 如果 'verbose' éžé›¶ï¼Œåˆ—å‡ºé”®æ˜ å°„çš„åŒæ—¶å¯ä»¥æ˜¾ç¤ºå®ƒåœ¨å“ªé‡Œå®šä¹‰ã€‚例如::verbose map<C-W>*n<C-W>* *<C-W><C-S>*Last set from /home/abcd/.vimrc|:verbose-cmd| 说明详情。 1.5 æ˜ å°„ 特 殊 é”® *:map-special-keys* æœ‰ä¸‰ç§æ–¹æ³•æ¥æ˜ 射一个特殊键: 1. Vi 兼容的方法: 对键ç è¿›è¡Œæ˜ å°„ã€‚é€šå¸¸è¿™æ˜¯ä¸€ä¸ªä»¥<Esc>开头的åºåˆ—。è¦è¾“入一个 è¿™æ ·çš„æ˜ å°„å…ˆè¾“å…¥ ":map " ç„¶åŽå†æ•²å…¥åŠŸèƒ½é”®ä¹‹å‰å¾—先输入一个CTRL-V。注æ„如果 é”®ç 在 termcap (t_ 开头的选项) 里,它会被自动转æ¢åˆ°å†…ç å¹¶å˜æˆæ˜ å°„çš„ç¬¬äºŒç§æ–¹ 法 (é™¤éž 'cpoptions' 里包括了 'k' æ ‡å¿—ä½)。 2. ç¬¬äºŒç§æ–¹æ³•是使用功能键的内ç 。è¦è¾“å…¥è¿™æ ·çš„æ˜ å°„è¾“å…¥CTRL-Kå¹¶æ•²è¦æ˜ 射的功能 键,或者使用 "#1","#2",.. "#9","#0","<Up>","<S-Down>","<S-F7>" ç‰ç‰çš„ å½¢å¼ (å‚考键表 |key-notation|,所有从<Up>开始的键都å¯ä»¥ä½¿ç”¨)。头å个功能 é”®èƒ½ä»¥ä¸¤ç§æ–¹å¼è¢«å®šä¹‰: 仅用数å—,比如 "#2";或者使用 "<F>",如 "<F2>"ã€‚ä¸¤ç§ éƒ½ä»£è¡¨åŠŸèƒ½é”® F2。"#0" 表示功能键 F10,由选项 't_f10' 定义,它在æŸäº›é”®ç›˜ä¸Šå¯ 能是 F0。<>的形å¼åœ¨ 'cpoptions' åŒ…å« '<' æ ‡å¿—ä½æ—¶ä¸èƒ½ä½¿ç”¨ã€‚ 3. 使用 termcap æ¡ç›®ï¼Œä»¥<t_xx>的形å¼å‡ºçŽ°ï¼Œè¿™é‡Œ "xx" 是 termcap æ¡ç›®çš„åå—。 å¯ä»¥ä½¿ç”¨ä»»ä½•å—符串æ¡ç›®ã€‚例如::map把功能键 13 æ˜ å°„æˆ "G"。'cpoptions' 包括 '<' æ ‡å¿—ä½æ—¶ä¸èƒ½ä½¿ç”¨è¿™ç§æ–¹å¼ã€‚ 第二ç§å’Œç¬¬ä¸‰ç§æ–¹æ³•的优点是ä¸åŠ ä¿®æ”¹å°±å¯ä»¥åœ¨ä¸åŒçš„终端上使用 (åŠŸèƒ½é”®ä¼šè¢«è½¬æ¢æˆç›¸ åŒçš„å†…ç æˆ–实际的键ç ,ä¸è®ºä½¿ç”¨ä½•ç§ç»ˆç«¯éƒ½æ˜¯å¦‚æ¤ã€‚termcap å¿…é¡»æ£ç¡®æ‰èƒ½æ£å¸¸å·¥ä½œï¼Œ 并且必须使用相åŒçš„æ˜ å°„)。 细 节: Vim 首先检查是å¦ä»Žé”®ç›˜è¾“入的åºåˆ—是å¦å·²è¢«æ˜ 射。å¦çš„è¯å°†è¯•图使用终端键ç (å‚考 |terminal-options|)。如果找到终端编ç ï¼Œå®ƒä¼šè¢«æ›¿æ¢æˆå†…ç 。然åŽå†æ¬¡æ£€æŸ¥ä¸€ ä¸ªæ˜ å°„æ˜¯å¦å·²å®Œæˆ (å› æ¤ä½ ä¹Ÿèƒ½æŠŠä¸€ä¸ªå†…ç æ˜ å°„æˆå…¶å®ƒä¸œè¥¿)。在脚本文件ä¸å†™å…¥ä»€ä¹ˆä¸œ 西å–决于何者被识别。如果终端键ç è¢«è¯†åˆ«ä¸ºæ˜ å°„ï¼Œå†™å…¥é”®ç æœ¬èº«ï¼›å¦‚果它被识别为一个 终端编ç ,则在脚本ä¸å†™å…¥å†…ç 。 1.6 特 殊 å— ç¬¦ *:map-special-chars* *map_backslash*<t_F3>G注æ„这里仅æåŠCTRL-Vå¯ä»¥ä½œä¸ºç”¨äºŽæ˜ 射和缩写的特殊å—符。当 'cpoptions' ä¸åŒ…å« 'B' æ—¶ï¼Œåæ–œæ 也å¯èµ·åˆ°CTRL-Vä¸€æ ·çš„ä½œç”¨ï¼Œè¿™æ—¶å¯ä»¥å®Œå…¨åœ°ä½¿ç”¨<>记法 |<>|。但 ä½ ä¸èƒ½æœŸæœ› "<C-V>" åƒCTRL-Vé‚£æ ·è½¬æ¢åŽæ¥è€…的特殊å«ä¹‰ã€‚ è¦æ˜ å°„ä¸€ä¸ªåæ–œæ ,或者在{rhs}ä¸ä½¿ç”¨ä¸€ä¸ªå—颿„ä¹‰çš„åæ–œæ ,å¯ä»¥ä½¿ç”¨ç‰¹æ®Šå—ç¬¦åº åˆ— "<Bslash>" 。这å¯ä»¥é¿å…åœ¨ä½¿ç”¨åµŒå¥—æ˜ å°„æ—¶ä½¿ç”¨åŒåæ–œæ 的需è¦ã€‚ *map_CTRL-C*{lhs}里å¯ä»¥ä½¿ç”¨CTRL-Cï¼Œä½†åªæœ‰åœ¨ Vim ç‰å¾…输入键时æ‰å¯ä»¥ï¼ŒVim å¿™ç€åšåˆ«çš„事情的 时候ä¸è¡Œã€‚如果 Vim 在忙,CTRL-Cæ€»æ˜¯ä¸æ–/打æ–该命令。 使用 MS-Windows 上的 GUI 版本时CTRL-Cèƒ½è¢«æ˜ å°„ä»¥å…许å¤åˆ¶åˆ°å‰ªè´´æ¿çš„命令。使用CTRL-Breakæ¥ä¸æ– Vim。 *map_space_in_lhs* è¦åœ¨{lhs}ä¸åŒ…å«ä¸€ä¸ªç©ºæ ¼ï¼Œåœ¨å‰é¢è¾“入一个CTRL-V(æ¯ä¸ªç©ºæ ¼ä¹‹å‰å®žé™…è¦è¾“入两个CTRL-V)。 *map_space_in_rhs* å¦‚æžœä½ éœ€è¦{rhs}ä»¥ç©ºæ ¼å¼€å¤´ï¼Œä½¿ç”¨ "<Space>"。è¦ä¸Ž Vi 完全兼容 (但ä¸å¯è¯»),ä¸è¦ 使用 |<>| 记法,在{rhs}å‰é¢å…ˆè¾“入一个å•独的CTRL-V(ä½ å¿…é¡»è¾“å…¥CTRL-V两 次)。 *map_empty_rhs* ä½ å¯ä»¥é€šè¿‡åœ¨ä¸€ä¸ªå•独的CTRL-V(ä½ å¿…é¡»è¾“å…¥CTRL-V两次) åŽé¢ä»€ä¹ˆä¹Ÿä¸è¾“å…¥æ¥å»ºç«‹ 一个空的{rhs}。ä¸å¹¸çš„æ˜¯åœ¨ vimrc 文件ä¸ä½ ä¸èƒ½ä½¿ç”¨è¿™ç§æ–¹å¼ã€‚ *<Nop>* 得到什么都ä¸åšçš„æ˜ 射的更容易的方法是在{rhs}ä¸ä½¿ç”¨ "<Nop>"。仅当 |<>| è®°æ³•å… è®¸æ—¶è¿™ç§æ–¹æ³•æ‰ç”Ÿæ•ˆã€‚例如确ä¿åŠŸèƒ½é”® F8 什么事情都ä¸åš: :map<F8><Nop>:map!<F8><Nop>*map-multibyte* å¯ä»¥å¯¹å¤šå—节å—ç¬¦æ˜ å°„ï¼Œä½†åªèƒ½æ˜¯æ•´ä¸ªå—符。ä¸èƒ½ä»…æ˜ å°„ç¬¬ä¸€ä¸ªå—节。这是为了é¿å…ä¸‹é¢ åœºæ™¯ä¸çš„问题: :set encoding=latin1 :imap<M-C>foo :set encoding=utf-8<M-C>çš„æ˜ å°„æ˜¯åœ¨ latin1 ç¼–ç ä¸è¢«å®šä¹‰çš„,结果是一个 0xc3 å—èŠ‚ã€‚å¦‚æžœä½ åœ¨ UTF-8 è§£ç ä¸è¾“å…¥ á (0xea<M-a>) 它是åŒå—节 0xc3 0xa1ã€‚è¿™ä¸ªæ—¶å€™ä½ ä¸å¸Œæœ› 0xc3 å—èŠ‚è¢«æ˜ å°„ï¼Œå¦åˆ™çš„è¯å°†ä¸èƒ½è¾“å…¥ á å—符了。 *<Leader>* *mapleader* è¦å®šä¹‰ä¸€ä¸ªä½¿ç”¨ "mapleader" å˜é‡çš„æ˜ 射,å¯ä»¥ä½¿ç”¨ç‰¹æ®Šå—串 "<Leader>"。它会被 "mapleader" çš„å—串值所替æ¢ã€‚如果 "mapleader" æœªè®¾ç½®æˆ–ä¸ºç©ºï¼Œåˆ™ç”¨åæ–œæ 代替,例 如: :map<Leader>A oanother line<Esc>和下é¢ä¸€æ ·::map \A oanother line但是当:<Esc>:let mapleader = ","时,åˆç›¸å½“于::map ,A oanother line<Esc>注æ„"mapleader" çš„å€¼ä»…å½“å®šä¹‰æ˜ å°„æ—¶è¢«ä½¿ç”¨ã€‚åŽæ¥æ”¹å˜çš„ "mapleader" ä¸ä¼šå½±å“已定 ä¹‰çš„æ˜ å°„ã€‚ *<LocalLeader>* *maplocalleader* å’Œ<Leader>类似,除了它使用 "maplocalleader" è€Œéž "mapleader"。<LocalLeader>ç”¨äºŽå±€éƒ¨äºŽç¼“å†²åŒºçš„æ˜ å°„ï¼Œä¾‹å¦‚::map在一个全局æ’件里应该使用<LocalLeader>q \DoItNow<Leader>而在一个文件类型æ’件里应该用<LocalLeader>。 "mapleader" å’Œ "maplocalleader" å¯ä»¥æ˜¯ç›¸åŒçš„。尽管如æ¤ï¼Œå¦‚æžœä½ æŠŠå®ƒä»¬è®¾ä¸ºä¸åŒï¼Œ 全局æ’件和文件类型æ’ä»¶çš„æ˜ å°„å†²çªçš„æœºä¼šæ˜¯ä¸æ˜¯ä¼šå°ä¸€ç‚¹å‘¢ï¼Ÿä¾‹å¦‚ï¼Œä½ å¯ä»¥ä¿æŒæŠŠ "mapleader" 设置为缺çœçš„åæ–œæ ,而设置 "maplocalleader" 为下划线。 *map-<SID>* åœ¨ä¸€ä¸ªè„šæœ¬ä¸æœ‰ä¸€ä¸ªç‰¹æ®Šå…³é”®å—å« "<SID>" 能被用æ¥å®šä¹‰ä¸€ä¸ªå±€éƒ¨äºŽè„šæœ¬ä¸çš„æ˜ 射。 具体细节请å‚考 |<SID>|。 *<Plug>* å«åš "<Plug>" 的特殊关键å—å¯ä»¥ç”¨äºŽä¸€ä¸ªå†…éƒ¨æ˜ å°„ï¼Œå®ƒä¸ä¸Žä»»ä½•键的åºåˆ—匹é…ã€‚è¿™åœ¨æ’ ä»¶ä¸æœ‰ç”¨ |using-<Plug>|。 *<Char>* *<Char->* è¦æ ¹æ®ä¸€ä¸ªå—符的å进制,八进制或åå…进制数å—å½¢å¼è¿›è¡Œæ˜ 射,å¯ä»¥ä½¿ç”¨<Char>æ¥æž„ é€ :<Char-123>å—符 123<Char-033>å—符 27<Char-0x7f>å—符 127 它å¯ä»¥ç”¨æ¥åœ¨ä¸€ä¸ª 'keymap' 文件里指定一个 (多å—节) å—符。大å°å†™çš„区别æ¤å¤„ä¸è®¡ã€‚ *map-comments* 在这些命令的åŽé¢ä¸å¯èƒ½æ”¾ç½®æ³¨é‡Šï¼Œå› 为 '"' å—符被认为是{lhs}或{rhs}的一部 分。 *map_bar* å› ä¸ºå—符 '|' 用æ¥åˆ†éš”æ˜ 射命令和åŽé¢çš„命令,所以包括 '|' çš„{rhs}è¦åšä¸€äº›ç‰¹æ®Š 的处ç†ï¼Œæœ‰ä¸‰ç§æ–¹æ³•:使用 å¯ç”¨äºŽ 示例<Bar>'<' ä¸åœ¨ 'cpoptions' 里 :map _l :!ls <Bar>more^M \| 'b' ä¸åœ¨ 'cpoptions' 里 :map _l :!ls \| more^M ^V| 总å¯ä»¥ï¼ŒVim å’Œ Vi 都行 :map _l :!ls ^V| more^M (这里 ^V 表示CTRL-Vï¼›è¦è¾“入一个CTRL-Vä½ å¿…é¡»æŒ‰é”®ä¸¤æ¬¡ï¼›åœ¨è¿™é‡Œä¸èƒ½ä½¿ç”¨<>记法 "<C-V>")。 å½“ä½ ä½¿ç”¨ 'cpoptions' 的缺çœè®¾ç½®æ—¶ä¸‰ç§æ–¹å¼éƒ½å¯ä»¥æ£å¸¸å·¥ä½œã€‚ 当 'b' 出现在 'cpoptions' 䏿—¶ï¼Œ"\|" ä¼šè¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªæ˜ å°„çš„ç»“æŸï¼ŒåŽé¢çš„æ˜¯å¦ä¸€ä¸ª 命令。这是为了和 Vi 兼容,但是和其它命令比较时有点ä¸åˆå¸¸ç†ã€‚ *map_return* å½“ä½ çš„æ˜ å°„åŒ…å« Ex å‘½ä»¤æ—¶ï¼Œä½ éœ€è¦åœ¨å…¶åŽæ”¾ç½®è¡Œç»ˆç»“符æ‰èƒ½è®©å®ƒæ‰§è¡Œã€‚在这里推è使用<CR>(å‚考 |<>|)。例如::map _ls :!ls -l %<CR>:echo "the end"<CR>在æ’入或命令行模å¼ä¸è¾“入时è¦é¿å…å—ç¬¦è¢«æ˜ å°„ï¼Œå¯ä»¥å…ˆè¾“入一个CTRL-V。在æ’å…¥æ¨¡å¼ ä¸å¦‚æžœ 'paste' 选项被打开的è¯ï¼Œæ˜ å°„ä¹Ÿä¼šè¢«ç¦æ¢ã€‚注æ„当é‡åˆ°é”™è¯¯æ—¶ (ä¼šå¯¼è‡´ä¸€ä¸ªé”™è¯¯ä¿¡æ¯æˆ–蜂鸣) å‰©ä¸‹çš„æ˜ å°„å°†ä¸ä¼šè¢«æ‰§è¡Œã€‚这是为了 ä¿æŒå’Œ Vi 兼容。注æ„@zZtTfF[]rm'`"v å’ŒCTRL-X命令的第二个å—符 (傿•°) ä¸è¢«æ˜ å°„ã€‚è¿™æ ·åšæ˜¯ä¸ºäº† 能够使用所有的命å寄å˜å™¨å’Œä½ç½®æ ‡è®°ï¼Œå³ä½¿åŒåçš„å‘½ä»¤è¢«æ˜ å°„æ—¶ä¹Ÿæ˜¯å¦‚æ¤ã€‚ 1.7 æ˜ å°„ 哪 些 é”® *map-which-keys* å¦‚æžœä½ è¦åšä¸€äº›æ˜ å°„ï¼Œä½ å¾—é€‰æ‹©åœ¨{lhs}ä¸è¦ç”¨å“ªäº›é”®ã€‚ä½ åº”è¯¥é¿å…使用 Vim 命令所使 用的那些键。å¦åˆ™ä½ å°†ä¸èƒ½å†ä½¿ç”¨è¿™äº›å‘½ä»¤äº†ã€‚䏋颿˜¯ä¸€äº›å»ºè®®: - 功能键<F2>ã€<F3>ç‰ï¼›Shift åŠ åŠŸèƒ½é”®<S-F1>ã€<S-F2>ç‰ç‰ã€‚注æ„<F1>å·²ç»ç”¨ä½œ 帮助命令。 - 带 Meta 的键 (å’Œ ALT 键一起按下)。|:map-alt-keys| - 使用 '_' 或 ',' å—符然åŽåŠ ä¸Šä»»ä½•å…¶å®ƒçš„å—符。"_" å’Œ "," 命令在 Vim 䏿˜¯å˜åœ¨ çš„ (å‚考 |_| å’Œ |,|)ï¼Œä½†ä½ ä¹Ÿè®¸æ°¸è¿œä¸ä¼šç”¨åˆ°å®ƒä»¬ã€‚ - 使用和其它命令的åŒä¹‰çš„çƒé”®ã€‚例如:CTRL-På’ŒCTRL-Nã€‚ä½¿ç”¨ä¸€ä¸ªé™„åŠ çš„å—符å¯ä»¥å®š ä¹‰æ›´å¤šçš„æ˜ å°„ã€‚ å‚考文件 "index" å¯ä»¥çŸ¥é“å“ªäº›é”®æ²¡æœ‰è¢«ä½¿ç”¨ï¼Œä»Žè€Œä½¿æ˜ å°„ä¸ä¼šè¦†ç›–任何内建的功能。 也å¯ä½¿ç”¨ ":help{key}^D" æ¥æ‰¾å‡ºæ˜¯å¦ä¸€ä¸ªé”®å·²ç»ç”¨äºŽæŸäº›å‘½ä»¤ã€‚ ({key}ç”¨äºŽæŒ‡å®šä½ è¦å¯»æ‰¾çš„键,^D 是CTRL-D)。 1.8 示 例 *map-examples* 以下是一些例å (ç…§å—é¢è¾“入它们,对于 "<CR>" ä½ è¾“å…¥å››ä¸ªå—ç¬¦ï¼›ä¸ºæ¤ '<' æ ‡å¿—ä½ä¸ 应出现在 'cpoptions' ä¸)。:map<F3>o#include:map<M-g>/foo<CR>cwbar<Esc>:map _x d/END/e<CR>:map! qq quadrillion questions计数相乘 å¦‚æžœä½ åœ¨æ¿€æ´»æ˜ å°„å‰è¾“å…¥è®¡æ•°ï¼Œå®žé™…æ•ˆæžœå°±åƒæ˜¯è¯¥è®¡æ•°åœ¨{lhs}(译者注: 疑为{rhs}) 之å‰è¾“å…¥ä¸€æ ·ã€‚ä¾‹å¦‚ï¼Œå¯¹ä¸‹é¢çš„æ˜ å°„::map输入 2<F4>3w<F4>会得到 "23w"ã€‚ä¸æ˜¯ç§»åЍ 2 * 3 个å•è¯ï¼Œè€Œæ˜¯ 23 个å•è¯ã€‚ å¦‚æžœä½ å¸Œæœ›å¾—åˆ°è®¡æ•°ç›¸ä¹˜çš„æ•ˆæžœï¼Œå¯ä½¿ç”¨è¡¨è¾¾å¼å¯„å˜å™¨::map引å·ä¹‹é—´çš„部分是待执行的表达å¼ã€‚ |@=| 1.9 使 用 æ˜ å°„ *map-typing* å½“ä½ è¾“å…¥ä¸€ä¸ªè¢«æ˜ å°„åºåˆ—的头部时 Vim å¼€å§‹æ¯”è¾ƒä½ çš„è¾“å…¥ã€‚å¦‚æžœåŒ¹é…å°šä¸å®Œå…¨ï¼Œå®ƒä¼šç‰ 待更多的å—符输入直到å¯ä»¥ç¡®å®šæ˜¯å¦åŒ¹é…。例如: å¦‚æžœä½ æ˜ å°„äº† map! "qq",然åŽä½ 输入 的第一个 'q' å°†ä¸ä¼šæ˜¾ç¤ºåœ¨å±å¹•ä¸Šï¼Œç›´åˆ°ä½ è¾“å…¥å¦ä¸€ä¸ª 'q' 或其它å—符。如果打开了 'timeout' 选项 (这是缺çœé€‰é¡¹) Vim 仅会ç‰å¾…一秒钟 (或任何 'timeoutlen' 指定的时 é—´)。之åŽï¼Œå®ƒå‡å®š 'q' å·²ç»ä¸ä¼šå†è¢«è¾“å…¥ã€‚å¦‚æžœä½ çš„è¾“å…¥å¾ˆæ…¢ï¼Œæˆ–è€…ä½ çš„ç³»ç»Ÿå¾ˆæ…¢ï¼Œå¤ ä½ 'timeout' é€‰é¡¹ã€‚è¿™æ—¶ï¼Œä½ å¯èƒ½è¿˜éœ€è¦æ˜¯å¦ç½®ä½ 'ttimeout' 选项。 *map-keys-fails* 有若干情况键ç å¯èƒ½ä¸è¢«è¯†åˆ«: - Vim 仅能读å–部分的键ç 。通常仅仅是第一个å—符。在æŸäº› Unix 版本的 xterm 上有 è¿™ç§æƒ…况。 - é”®ç åœ¨å·²ç»æ˜ å°„çš„å—符之åŽã€‚举例æ¥è¯´ï¼Œ"<F4>@='3w'<CR><F1><F1>" 或 "g<F1>"。 å…¶ç»“æžœæ˜¯åœ¨è¿™ç§æƒ…况下键ç ä¸ä¼šè¢«è¯†åˆ«ï¼Œæ‰€ä»¥æ˜ å°„å¤±è´¥ã€‚æœ‰ä¸¤ç§æ–¹æ³•å¯ä»¥é¿å…æ¤é—®é¢˜: - 从 'cpoptions' ä¸åˆ 除 'K' æ ‡å¿—ä½ã€‚这会使 Vim ç‰å¾…功能键的其余部分。 - 使用<F1>到<F4>时,实际产生的键ç å¯èƒ½æ˜¯<xF1>到<xF4>。å˜åœ¨<xF1>到<F1>,<xF2>到<F2>çš„æ˜ å°„ç‰ï¼Œä½†æ˜¯åœ¨æ˜ å°„çš„åŽä¸€åŠçš„那些ä¾ç„¶ä¸ä¼šè¢«è¯†åˆ«ã€‚确认从<F1>到<F4>çš„é”®ç æ˜¯æ£ç¡®çš„::set以四个å—符输入<F1>=<typeCTRL-V><type F1><F1>。"=" å·åŽé¢çš„部分必需以实际的å—ç¬¦è¾“å…¥ï¼Œè€Œä¸æ˜¯å—é¢çš„æ–‡ 本。 å¦ä¸€ç§è§£å†³æ–¹æ³•æ˜¯åœ¨æ˜ å°„ä¸ä¸ºç¬¬äºŒä¸ªç‰¹æ®Šé”®ä½¿ç”¨å®žé™…的键ç ::mapä¸è¦è¾“入一个真æ£çš„<F1><Esc>OP :echo "yes"<CR><Esc>,总之 Vim 将识别键ç 并把它替æ¢ä¸º<F1>。 å¦ä¸€ä¸ªé—®é¢˜å¯èƒ½æ˜¯ä¿æŒ ALT 或 Meta 的时候,终端在å‰é¢é™„åŠ ESC è€Œä¸æ˜¯ç»™ç¬¬ 8 ä½ç½® ä½ã€‚è§ |:map-alt-keys|。 *recursive_mapping* 如果{rhs}ä¸åŒ…括了{lhs}ï¼Œé‚£ä¹ˆä½ å®šä¹‰äº†ä¸€ä¸ªé€’å½’æ˜ å°„ã€‚å½“{lhs}被输入,它会被替 æ¢æˆ{rhs}。当é‡åˆ°{rhs}ä¸åŒ…å«çš„{lhs}åˆä¼šè¢«æ›¿æ¢æˆ{rhs}ï¼Œä¾æ¤ç±»æŽ¨ã€‚ è¿™å¯ç”¨æ¥ä½¿ä¸€ä¸ªå‘½ä»¤é‡å¤æ— æ•°æ¬¡ã€‚è¿™ç§æƒ…å†µå”¯ä¸€çš„é—®é¢˜æ˜¯å‡ºé”™æ˜¯åœæ¢å®ƒçš„唯一方法。解决 迷宫的å®ä¼šç”¨åˆ°è¿™ä¸ªï¼ŒåŽ»é‚£é‡Œæ‰¾æ‰¾ä¾‹åå§ã€‚有一个例外: 如果{rhs}以{lhs}开始,第 一个å—符ä¸ä¼šè¢«å†æ¬¡æ˜ å°„ (这与 Vi 兼容)。 例如::map ab abcd将执行 "a" å‘½ä»¤å¹¶ä¸”åœ¨æ–‡æœ¬ä¸æ’å…¥ "bcd"。{rhs}ä¸çš„ "ab" ä¸ä¼šè¢«å†æ¬¡æ˜ 射。 å¦‚æžœä½ è¦äº¤æ¢ä¸¤ä¸ªé”®çš„å«ä¹‰ï¼Œåº”该使用 :noremap 命令。例如::noremap k j:noremap j k这会交æ¢å…‰æ ‡ä¸Šç§»å’Œå…‰æ ‡ä¸‹ç§»å‘½ä»¤ã€‚ 如果使用普通 :map 命令,并且 'remap' é€‰é¡¹è¢«æ‰“å¼€ï¼Œæ˜ å°„ä¸€ç›´è¿›è¡Œç›´åˆ°æ–‡æœ¬ä¸å†æ˜¯æŸ 个{lhs}çš„ä¸€éƒ¨åˆ†ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ ç”¨::map x y:map y xVim 将把 x æ›¿æ¢æˆ y,并把 y æ›¿æ¢æˆ x,ç‰ç‰ã€‚è¿™ç§æƒ…况会å‘生 'maxmapdepth' 次 (缺çœä¸º 1000)ï¼Œç„¶åŽ Vim ä¼šç»™å‡ºé”™è¯¯ä¿¡æ¯ "recursive mapping" (é€’å½’æ˜ å°„)。 *:map-undo* å¦‚æžœä½ åœ¨ä¸€ä¸ªè¢«æ˜ å°„çš„åºåˆ—ä¸åŒ…å«äº†ä¸€ä¸ª undo å‘½ä»¤ï¼Œå°†ä¼šæŠŠæ–‡æœ¬å¸¦å›žå®æ‰§è¡Œå‰çš„状æ€ã€‚ 这和原始的 Vi 是兼容的,åªè¦è¢«æ˜ å°„çš„åºåˆ—仅包å«ä¸€ä¸ª undo 命令 (原始的 Vi ä¸è¢«æ˜ å°„çš„åºåˆ—有两个 undo å‘½ä»¤æ˜¯æ— æ„ä¹‰çš„ï¼Œä½ ä¼šå¾—åˆ°ç¬¬ä¸€ä¸ª undo 之å‰çš„æ–‡æœ¬)。 1.10 æ˜ å°„ ALT é”® *:map-alt-keys* GUI 上,Vim è‡ªå·±å¤„ç† Alt 键,所以用 ALT é”®çš„æ˜ å°„åº”è¯¥æ€»æ²¡æœ‰é—®é¢˜ã€‚ä½†åœ¨ç»ˆç«¯ä¸Šï¼Œ Vim 得到å—节的åºåˆ—ï¼Œå®ƒå¿…é¡»è‡ªå·±åˆ¤æ–æ˜¯ä¸æ˜¯æŒ‰äº† ALT 键。 Vim 缺çœå‡è®¾æŒ‰ä¸‹ ALT é”®ç‰äºŽç½®ä½è¾“å…¥å—符的第 8 ä½ã€‚多数æ£å¸¸çš„终端如æ¤å·¥ä½œï¼ŒåŒ…括 xtermã€aterm å’Œ rxvt。å‡å¦‚ä½ çš„<A-k>æ˜ å°„ä¸èƒ½å·¥ä½œï¼Œå¯èƒ½çš„åŽŸå› æ˜¯ä½ çš„ç»ˆç«¯ç”¨åœ¨å— ç¬¦å‰åŠ ä¸Š ESC å‰ç¼€çš„æ–¹æ³•ã€‚ä½†æ˜¯ä½ æœ¬æ¥ä¹Ÿå¯èƒ½åœ¨å—符å‰è¾“å…¥ ESC,这时 Vim å°±ä¸çŸ¥é“到 底å‘生了什么 (åªèƒ½æ£€æŸ¥å—符间的延迟,但这并ä¸å¯é )。 åœ¨æ¤æ–‡å†™ä½œæ—¶ï¼Œæœ‰äº›ä¸»æµçš„终端,如 gnome-terminal å’Œ konsole,使用 ESC å‰ç¼€ã€‚没 有办法让它们用置ä½ç¬¬ 8 使¥ä»£æ›¿ã€‚Xterm 缺çœåº”该没有问题。Aterm å’Œ rxvt å¯åŠ¨æ—¶ 如果使用 "--meta8" 傿•°ä¹Ÿå¯ä»¥å¦‚æ¤ã€‚ä½ ä¹Ÿå¯ä»¥ä¿®æ”¹èµ„æºæ¥è¾¾åˆ°ç›®çš„: "metaSendsEscape"ã€"eightBitInput" å’Œ "eightBitOutput"。 Linux 控制å°ä¸Šï¼Œå¯ä»¥ç”¨ "setmetamode" å‘½ä»¤åˆ‡æ¢æ¤è¡Œä¸ºã€‚è®°ä½ä¸ä½¿ç”¨ ESC å‰ç¼€å¯èƒ½å’Œ 其它程åºå‘生冲çªã€‚ç¡®ä¿ä½ çš„ bash 把 "convert-meta" 选项设为 "on"ï¼Œç¡®ä¿ Meta é”® 盘绑定ä»ç„¶å·¥ä½œ (这是缺çœçš„ readline 行为,除éžä½ 的系统é…置专门作了改å˜)。为 æ¤ï¼Œä½ 需è¦åŠ å…¥è¿™è¡Œ:set convert-meta onåˆ°ä½ çš„ ~/.inputrc æ–‡ä»¶ã€‚å¦‚æžœä½ æ–°å»ºæ¤æ–‡ä»¶ï¼Œå¯èƒ½æƒ³æŠŠ:$include /etc/inputrcæ”¾åœ¨ç¬¬ä¸€è¡Œï¼Œå¦‚æžœæ¤æ–‡ä»¶åœ¨ä½ 的系统ä¸å˜åœ¨çš„è¯ã€‚è¿™æ ·å¯ä»¥ä¿æŒå…¨å±€çš„选项设置。ä¸è¿‡ï¼Œ è¿™å¯èƒ½ä¼šä½¿ umlaut è¿™æ ·çš„ç‰¹æ®Šå—符的输入有问题。这时,输入å—符å‰ç”¨CTRL-Vå‰å¯¼ã€‚ è¦çŸ¥é“有报告说 convert-meta 使得 UTF-8 locale 的使用有问题。在 xterm è¿™æ ·çš„ç»ˆ 端里,å¯ä»¥åœ¨ "Main Options" èœå•é‡Œéšæ—¶åˆ‡æ¢ "metaSendsEscape" 资æºï¼Œæˆ–者终端上 按 Ctrl-LeftClick 也å¯ä»¥ï¼›å¦‚æžœä½ éœ€è¦ç»™ Vim 之外的其它应用程åºå‘é€ ESC,这是最 åŽåº”急的方法。 1.11 æ˜ å°„ æ“ ä½œ 符 *:map-operator* æ“作符应用于{motion}命令之å‰ã€‚è¦å®šä¹‰ä½ 自己的æ“ä½œç¬¦ï¼Œä½ éœ€è¦å…ˆåˆ›å»ºæ˜ å°„æ¥è®¾ç½® 'operatorfunc' 选项,然åŽè°ƒç”¨ |g@| æ“ä½œç¬¦ã€‚è¿™æ ·ç”¨æˆ·è¾“å…¥{motion}命令åŽï¼Œä¼šè°ƒ 用指定的函数。 *g@* *E774* *E775* g@{motion}调用 'operatorfunc' 选项设置的函数。 '[ ä½ç½®æ ‡è®°å®šä½åœ¨{motino}跨越的文本的开始处,而 '] ä½ç½®æ ‡è®°åœ¨æ¤æ–‡æœ¬çš„结æŸå¤„。 函数调用时,带一个å—ç¬¦ä¸²å‚æ•°: 傿•° 如果 "line"{motion}本是 |linewise| "char"{motion}本是 |characterwise| "block"{motion}本是 |blockwise-visual|| ä¸è¿‡ï¼Œ"block" å¾ˆå°‘å‡ºçŽ°ï¼Œå› ä¸ºå®ƒåªèƒ½æ¥è‡ªå¯è§†æ¨¡å¼ï¼Œé‚£é‡Œ "g@" 䏿˜¯å¾ˆæœ‰ç”¨ã€‚这里是一例,{ä»…å½“ç¼–è¯‘æ—¶åŠ å…¥ +eval ç‰¹æ€§æ‰æœ‰æ•ˆ}<F4>æ¥è®¡ç®—ç©ºæ ¼æ•°ç›®:nmap<silent><F4>:set opfunc=CountSpaces<CR>g@vmap<silent><F4>:<C-U>call CountSpaces(visualmode(), 1)<CR>function! CountSpaces(type, ...)let sel_save = &selectionlet &selection = "inclusive"let reg_save = @@if a:0 " 在å¯è§†æ¨¡å¼é‡Œè°ƒç”¨ï¼Œä½¿ç”¨ '< å’Œ '>ä½ç½®æ ‡è®°ã€‚silent exe "normal! `<" . a:type . "`>y"elseif a:type == 'line'silent exe "normal! '[V']y"elseif a:type == 'block'silent exe "normal! `[\<C-V>`]y"elsesilent exe "normal! `[v`]y"endifechomsg strlen(substitute(@@, '[^ ]', '', 'g'))let &selection = sel_savelet @@ = reg_saveendfunction注æ„'selection' 选项暂时设为 "inclusive",以便å¯è§†æ¨¡å¼ä¸‹ç”¨ '[ 到 '] ä½ç½®æ ‡è®° å¯ä»¥æŠ½å‡ºæ£ç¡®çš„æ–‡æœ¬ã€‚ ä¹Ÿè¦æ³¨æ„这里为å¯è§†æ¨¡å¼æä¾›äº†ä¸“ç”¨çš„æ˜ å°„ã€‚å®ƒå…ˆåˆ é™¤ ":" 在å¯è§†æ¨¡å¼é‡Œæ’入的 "'<,'>" 范围,然åŽè°ƒç”¨å‡½æ•°ï¼Œè°ƒç”¨æ—¶ä½¿ç”¨äº† visualmode() 和一个é¢å¤–çš„å‚æ•°ã€‚
2. 缩写 *abbreviations* *Abbreviations*
缩写在æ’入,替æ¢å’Œå‘½ä»¤è¡Œæ¨¡å¼ä¸ä½¿ç”¨ã€‚å¦‚æžœä½ è¾“å…¥ä¸€ä¸ªæ˜¯ç¼©å†™çš„å•è¯ï¼Œå®ƒä¼šè¢«æ›¿æ¢æˆæ‰€ 表示的东西。这å¯ä»¥åœ¨ç»å¸¸è¾“入的长å•è¯æ—¶èŠ‚çœé”®å‡»ã€‚并且能用它æ¥è‡ªåŠ¨æ›´æ£ç»å¸¸çŠ¯çš„æ‹¼ 写错误。例如: :iab ms Microsoft :iab tihs this 有三ç§ç±»åž‹çš„缩写: full-id "full-id" 类型完全由关键å—å—ç¬¦ç»„æˆ (å—æ¯å’Œ 'iskeyword' 选项的å—符)。 这是最普通的缩写。 例如: "foo","g3","-1" end-id "end-id" 类型以一个关键å—å—符结尾,但所有其它å—ç¬¦éƒ½ä¸æ˜¯å…³é”®å—å—符。 例如: "#i","..f","$/7" non-id "non-id" 类型以一个éžå…³é”®å—å—符结尾,其它å—符å¯ä»¥æ˜¯ä»»æ„类型,除了空 æ ¼å’Œåˆ¶è¡¨ã€‚ä¾‹å¦‚: "def#","4/7$" ä¸èƒ½è¢«ç¼©å†™çš„å—串例å: "a.b","#def","a b","_$r" ä»…å½“ä½ è¾“å…¥ä¸€ä¸ªéžå…³é”®å—å—符时缩写æ‰ä¼šè¢«è¯†åˆ«ï¼Œè¿™ä¹ŸåŒ…括用{Vi 䏿”¯æŒè¿™ç§ç±»åž‹}<Esc>退出æ’å…¥æ¨¡å¼æˆ–用<CR>结æŸä¸€ä¸ªå‘½ä»¤çš„æƒ…形。结æŸç¼©å†™çš„éžå…³é”®å—å—符被æ’入到缩写的扩展åŽé¢ã€‚一个例 外是å—符<C-]>ï¼Œå®ƒç”¨æ¥æ‰©å±•ä¸€ä¸ªç¼©å†™ï¼Œä½†ä¸æ’å…¥ä»»ä½•é™„åŠ å—符。 例如::ab hh hello"hh<Space>" 被扩展为 "hello<Space>" "hh<C-]>" 被扩展为 "hello" å…‰æ ‡å‰çš„å—符必需和缩写匹é…。æ¯ç§ç±»åž‹è¿˜æœ‰é™„åŠ è§„åˆ™: full-id 匹é…çš„å‰é¢æ˜¯ä¸€ä¸ªéžå…³é”®å—å—符,或者是在行或æ’入的开始。例外: 当缩写仅 有一个å—符时,如果它å‰é¢æœ‰ä¸€ä¸ªéžå…³é”®å—å—符则ä¸ä¼šè¢«è¯†åˆ«ï¼Œé™¤éžé‚£æ˜¯ç©ºæ ¼ 和制表。 end-id 匹é…çš„å‰é¢æ˜¯ä¸€ä¸ªå…³é”®å—å—ç¬¦ï¼Œæˆ–è€…ç©ºæ ¼æˆ–åˆ¶è¡¨ï¼Œæˆ–è€…è¡Œæˆ–æ’入的开始。 non-id 匹é…çš„å‰é¢æ˜¯ä¸€ä¸ªç©ºæ ¼ã€åˆ¶è¡¨æˆ–者行或æ’入的开始。 例如: ({CURSOR}æ˜¯ä½ è¾“å…¥ä¸€ä¸ªéžå…³é”®å—å—符的地方):ab foo four old otters" foo{CURSOR}" 被扩展为 " four old otters" " foobar{CURSOR}" ä¸è¢«æ‰©å±• "barfoo{CURSOR}" ä¸è¢«æ‰©å±•:ab #i #include"#i{CURSOR}" 被扩展为 "#include" ">#i{CURSOR}" ä¸è¢«æ‰©å±•:ab ;;"test;;" ä¸è¢«æ‰©å±• "test ;;" 被扩展为 "test<endofline><endofline>" è¦åœ¨æ’入模å¼ä¸é¿å…缩写: 输入缩写的一部分,以<Esc>退出æ’入模å¼ï¼Œå†ç”¨ 'a' 釿–° 进入æ’入模å¼å¹¶è¾“入剩下的部分。或者在缩写之åŽçš„å—符å‰é¢è¾“å…¥CTRL-V。 è¦åœ¨å‘½ä»¤è¡Œæ¨¡å¼ä¸é¿å…缩写: 在缩写的æŸå¤„输入CTRL-V两次æ¥é¿å…它被替æ¢ã€‚ä¸ç„¶ï¼Œä¸€ 个普通å—符å‰é¢çš„CTRL-V通常会被忽略。 缩写进行之åŽç§»åŠ¨å…‰æ ‡æ˜¯å¯èƒ½çš„::iab if if ()如果 'cpoptions' 里é¢åŒ…å« '<' æ ‡å¿—ä½æ—¶ï¼Œè¿™ä¸èƒ½æ£å¸¸å·¥ä½œã€‚|<>| ä½ ç”šè‡³å¯ä»¥å𿛴夿‚çš„äº‹æƒ…ã€‚ä¾‹å¦‚ï¼Œè¦æ¶ˆç一个缩写åŽé¢è¾“å…¥çš„ç©ºæ ¼:<Left>func Eatchar(pat)let c = nr2char(getchar(0))return (c =~ a:pat) ? '' : cendfunciabbr<silent>if if ()<Left><C-R>=Eatchar('\s')<CR>没有缺çœçš„缩写。 缩写永远ä¸ä¼šé€’å½’ã€‚ä½ å¯ä»¥è®¾ç½® ":ab f f-o-o" 而ä¸ä¼šæœ‰ä»»ä½•é—®é¢˜ã€‚ä½†æ˜¯ç¼©å†™èƒ½è¢«æ˜ å°„ã€‚{一些版本的 Vi 支æŒé€’å½’ç¼©å†™ï¼Œè¿™æ¯«æ— é“ç†}'paste' é€‰é¡¹æ‰“å¼€æ—¶ï¼Œç¼©å†™è¢«ç¦æ¢ã€‚ *:abbreviate-local* *:abbreviate-<buffer>* å’Œæ˜ å°„ä¸€æ ·ï¼Œç¼©å†™å¯ä»¥è¢«å±€éƒ¨äºŽä¸€ä¸ªç¼“冲区之内。这ç»å¸¸ç”¨äºŽ |filetype-plugin| æ–‡ 件。一个 C æ’件文件的例å::abb*:ab* *:abbreviate* :ab[breviate] 列出所有的缩写。第一æ ä¸çš„å—符表示该缩写作用的模å¼: 'i' 指æ’入模å¼ï¼Œ'c' 指命令行模å¼ï¼Œ'!' æŒ‡ä¸¤ç§æ¨¡å¼éƒ½æœ‰ã€‚ è¿™å’Œæ˜ å°„çš„ç›¸åŒï¼Œå‚看 |map-listing| 。 *:abbreviate-verbose* 如果 'verbose' éžé›¶ï¼Œç¼©å†™åˆ—å‡ºçš„åŒæ—¶æ˜¾ç¤ºå®ƒæœ€è¿‘定义的ä½ç½®ã€‚例如:<buffer>FF for (i = 0; i < ; ++i):verbose abbreviate! teh theLast set from /home/abcd/vim/abbr.vim|:verbose-cmd| 说明详情。 :ab[breviate]{lhs}列出以{lhs}开头的缩写 :ab[breviate] [<expr>]{lhs}{rhs}å¢žåŠ ä¸€ä¸ªä»Ž{lhs}到{rhs}的缩写。如果{lhs}å·²ç»å˜åœ¨ åˆ™å®ƒä¼šè¢«æ›¿æ¢æˆæ–°çš„{rhs}。{rhs}å¯åŒ…å«ç©ºæ ¼ã€‚ |:map-<expr>| 说明å¯é€‰çš„<expr>傿•°ã€‚ *:una* *:unabbreviate* :una[bbreviate]{lhs}从列表ä¸åˆ 除{lhs}的缩写。如果找ä¸åˆ°ï¼Œåˆ 除{rhs}åŒ¹é… è¿™é‡Œçš„{lhs}傿•°çš„ç¼©å†™ã€‚è¿™æ˜¯ä¸ºäº†æ–¹ä¾¿ä½ åˆ é™¤æ‰©å±•åŽçš„缩 写。è¦é¿å…扩展,æ’å…¥CTRL-V(è®°ä½è¾“入两次)。 *:norea* *:noreabbrev* :norea[bbrev] [<expr>] [lhs] [rhs] 与 ":ab" ä¸€æ ·ï¼Œä½†{rhs}ä¸è¿›è¡Œé‡æ˜ 射。*:ca* *:cabbrev* :ca[bbrev] [{Vi æ— æ¤åŠŸèƒ½}<expr>] [lhs] [rhs] 与 ":ab" ä¸€æ ·ï¼Œä½†ä»…åœ¨å‘½ä»¤è¡Œæ¨¡å¼ä¸ä½¿ç”¨ã€‚*:cuna* *:cunabbrev* :cuna[bbrev]{Vi æ— æ¤åŠŸèƒ½}{lhs}与 ":una" ä¸€æ ·ï¼Œä½†ä»…åœ¨å‘½ä»¤è¡Œæ¨¡å¼ä¸ä½¿ç”¨ã€‚*:cnorea* *:cnoreabbrev* :cnorea[bbrev] [{Vi æ— æ¤åŠŸèƒ½}<expr>] [lhs] [rhs] 与 ":ab" ä¸€æ ·ï¼Œä½†ä»…åœ¨å‘½ä»¤è¡Œæ¨¡å¼ä¸ä½¿ç”¨å¹¶ä¸”{rhs}ä¸è¿›è¡Œ 釿˜ 射。*:ia* *:iabbrev* :ia[bbrev] [{Vi 䏿— æ¤åŠŸèƒ½}<expr>] [lhs] [rhs] 与 ":ab" ä¸€æ ·ï¼Œä½†ä»…åœ¨æ’入模å¼ä¸ä½¿ç”¨ã€‚*:iuna* *:iunabbrev* :iuna[bbrev]{Vi æ— æ¤åŠŸèƒ½}{lhs}与 ":una" ä¸€æ ·ï¼Œä½†ä»…åœ¨æ’入模å¼ä¸ä½¿ç”¨ã€‚*:inorea* *:inoreabbrev* :inorea[bbrev] [{Vi æ— æ¤åŠŸèƒ½}<expr>] [lhs] [rhs] 与 ":ab" ä¸€æ ·ï¼Œä½†ä»…åœ¨æ’入模å¼ä¸ä½¿ç”¨å¹¶ä¸”{rhs}ä¸è¿›è¡Œé‡ æ˜ å°„ã€‚*:abc* *:abclear* :abc[lear] åˆ é™¤æ‰€æœ‰çš„ç¼©å†™ã€‚{Vi æ— æ¤åŠŸèƒ½}*:iabc* *:iabclear* :iabc[lear] 为æ’入模å¼åˆ 除所有的缩写。{Vi æ— æ¤åŠŸèƒ½}*:cabc* *:cabclear* :cabc[lear] 为命令行模å¼åˆ 除所有的缩写。{Vi æ— æ¤åŠŸèƒ½}*using_CTRL-V* 在一个缩写的{Vi æ— æ¤åŠŸèƒ½}{rhs}ä¸ä½¿ç”¨ç‰¹æ®Šå—符是å¯èƒ½çš„。CTRL-Vå¯ä»¥ç”¨æ¥é¿å…多数ä¸å¯æ˜¾ç¤ºå—符 的特殊å«ä¹‰ã€‚需è¦è¾“入多少个CTRL-Vå–å†³äºŽä½ å¦‚ä½•è¾“å…¥ç¼©å†™ã€‚æ¤å¤„è®¨è®ºåŒæ ·é€‚ç”¨äºŽæ˜ å°„ã€‚è¿™é‡Œä½¿ç”¨ä¸€ä¸ªä¾‹å说明。 å‡è®¾ä½ éœ€è¦æŠŠ "esc" 缩写为输入一个<Esc>å—ç¬¦ã€‚å½“ä½ åœ¨ Vim ä¸è¾“å…¥ ":ab" å‘½ä»¤ï¼Œä½ å¿…éœ€è¿™æ ·è¾“å…¥: (这里 ^V 是一个CTRL-V并且 ^[ is<Esc>) ä½ è¾“å…¥: ab esc ^V^V^V^V^V^[ 所有的键盘输入都ç»è¿‡ ^V 引用解释,所以第一个,第三个,和第五个 ^V å—符 åªæ˜¯ä¸ºäº†æŠŠç¬¬äºŒä¸ªã€ç¬¬å››ä¸ª ^V å’Œ ^[ 输入到命令行里。 ä½ çœ‹åˆ°: ab esc ^V^V^[ 命令行里在 ^[ 之å‰åŒ…å«ä¸¤ä¸ªå®žé™…çš„ ^Vã€‚å¦‚æžœä½ é‡‡ç”¨è¿™ç§æ–¹æ³•ï¼Œè¿™æ˜¯è¯¥è¡Œåœ¨ä½ çš„ .exrc æ–‡ä»¶åº”è¯¥å‡ºçŽ°çš„æ ·å。第一个 ^V 作为引用第二个 ^V çš„å—符: 这是 å› ä¸º :ab 命令使用 ^V 作为它自己的引用å—ç¬¦ï¼Œä»¥ä¾¿ä½ èƒ½åœ¨ç¼©å†™ä¸åŒ…å«è¢«å¼•用 的空白å—符或 | å—符。:ab 命令对 ^[ å—符并ä¸åšç‰¹æ®Šçš„事情,所以它ä¸éœ€è¦ 被引用。(å°½ç®¡å¼•ç”¨ä¹Ÿæ²¡æœ‰å®³å¤„ï¼›å› è€Œè¾“å…¥ 7 个 [8 个ä¸è¡Œï¼] ^V 也会工 作。) 被ä¿å˜ä¸º: esc ^V^[ è§£æžåŽï¼Œè¯¥ç¼©å†™çš„简çŸå½¢å¼ ("esc") å’Œæ‰©å±•å½¢å¼ (两å—符 "^V^[") 被ä¿å˜åœ¨ç¼© 写表ä¸ã€‚如果输入ä¸å¸¦å‚æ•°çš„ :ab 命令,这是该缩写被显示的形å¼ã€‚ ç„¶åŽå½“用户输入å•è¯ "esc" è€Œæ‰©å±•è¯¥ç¼©å†™æ—¶ï¼Œæ‰©å±•å½¢å¼æœä»Žå’Œä¸€èˆ¬é”®ç›˜è¾“å…¥åŒ æ ·å½¢å¼çš„ ^V 解释。所以 ^V ä¿æŠ¤ ^[ å—符ä¸è¢«è§£é‡Šä¸º "退出æ’入模å¼" çš„å— ç¬¦ï¼Œè€ŒæŠŠ ^[ æ’入到文本里。 扩展为: ^[ [Steve Kirkendall æä¾›ç¤ºä¾‹]
3. å±€éƒ¨æ˜ å°„å’Œå‡½æ•° *script-local*
当使用多个 Vim 脚本文件时,一个脚本和å¦ä¸€ä¸ªè„šæœ¬ä½¿ç”¨åŒæ ·åå—çš„æ˜ å°„å’Œå‡½æ•°æ˜¯å±é™© 的。为了é¿å…è¿™ç§æƒ…况,它们å¯ä»¥å±€éƒ¨åœ¨è„šæœ¬ã€‚ *<SID>* *<SNR>* *E81* å—串 "<SID>" èƒ½ç”¨äºŽæ˜ å°„æˆ–èœå•ã€‚è¿™è¦æ±‚ 'cpoptions' 䏿²¡æœ‰ '<' æ ‡å¿—ä½ã€‚ å½“æ‰§è¡Œæ˜ å°„å‘½ä»¤æ—¶ï¼ŒVim 将把 "<SID>" æ›¿æ¢æˆç‰¹æ®Šé”®ç<SNR>,åŽè·Ÿä¸€ä¸ªæ¯ä¸ªè„šæœ¬å”¯ 一的数å—ç¼–å·ï¼Œå’Œä¸€ä¸ªä¸‹åˆ’线。例如::mapä¼šå®šä¹‰ä¸€ä¸ªæ˜ å°„ "<SID>Add<SNR>23_Add"。 当在一个脚本ä¸å®šä¹‰ä¸€ä¸ªå‡½æ•°çš„æ—¶å€™ï¼Œå¯ä»¥åœ¨åå—çš„å‰é¢ç”¨ä¸€ä¸ª "s:" æ¥ä½¿å®ƒå±€éƒ¨äºŽè„šæœ¬ ä¸ã€‚ä½†å½“ä¸€ä¸ªæ˜ å°„ (译者注: 似应为函数) 从脚本外é¢è¢«æ‰§è¡Œæ—¶ï¼Œå®ƒä¸çŸ¥é“该函数在哪个 脚本ä¸è¢«å®šä¹‰ã€‚为了é¿å…è¿™ç§æƒ…况,使用 "<SID>" æ¥ä»£æ›¿ "s:"ã€‚æ˜ å°„ä¹ŸåšåŒæ ·çš„å˜æ¢ã€‚ è¿™ä½¿å¾—åœ¨æ˜ å°„é‡Œå¯ä»¥å®šä¹‰ä¸€ä¸ªå‡½æ•°è°ƒç”¨ã€‚ 当一个局部函数被执行时,它在定义脚本的上下文ä¸è¿è¡Œã€‚è¿™æ„味ç€ï¼Œå®ƒå®šä¹‰çš„æ–°å‡½æ•°å’Œ æ˜ å°„ä¹Ÿå¯ä»¥ä½¿ç”¨ "s:" 或 "<SID>",并且使用和函数本身定义时相åŒçš„唯一数å—ç¼–å·ã€‚ æ¤å¤–,也能用 "s:var" 脚本局部å˜é‡ã€‚ 当执行一个自动命令或一个用户命令时,它将在定义脚本的上下文ä¸è¿è¡Œã€‚这使得该命令 å¯ä»¥è°ƒç”¨ä¸€ä¸ªå±€éƒ¨å‡½æ•°æˆ–è€…ä½¿ç”¨ä¸€ä¸ªå±€éƒ¨æ˜ å°„ã€‚ 除æ¤ä»¥å¤–,在脚本上下文之外使用 "<SID>" 是错误的。 å¦‚æžœä½ éœ€è¦åœ¨ä¸€ä¸ªå¤æ‚的脚本ä¸å–得脚本的数å—ç¼–å·ï¼Œä½¿ç”¨æ¤å‡½æ•°:function s:SID()return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')endfunåˆ—å‡ºå‡½æ•°å’Œæ˜ å°„æ—¶ä¼šæ˜¾ç¤º "<SNR>"。å¯ä»¥ç”¨æ¥å®ƒä»¬åœ¨å“ªé‡Œè¢«å®šä¹‰ã€‚ 命令 |:scriptnames| å¯ä»¥ç”¨æ¥æŸ¥çœ‹å“ªäº›è„šæœ¬å·²ç»è¢«è¯»å…¥ä»¥åŠå®ƒä»¬çš„<SNR>æ•°å—ç¼–å·ã€‚ 这些都是并且{Vi æ— æ¤åŠŸèƒ½}。{ä»…å½“ç¼–è¯‘æ—¶åŠ å…¥ +eval ç‰¹æ€§æ‰æœ‰æ•ˆ}
4. 用户定义的命令 *user-commands*
å¯ä»¥å®šä¹‰ä½ 自己的 Ex 命令。用户自定义命令å¯ä»¥å’Œå†…å»ºå‘½ä»¤ä¸€æ ·è¿è¡Œ (它å¯ä»¥æœ‰èŒƒå›´æˆ– 傿•°ï¼Œå‚æ•°å¯ä»¥æ˜¯è‡ªåŠ¨è¡¥å…¨çš„æ–‡ä»¶åæˆ–缓冲区å,ç‰ç‰),除了当该命令执行时,它会被 è½¬æ¢æˆä¸€ä¸ªæ™®é€šçš„ ex 命令然åŽå†è¢«æ‰§è¡Œä»¥å¤–。 对于åˆå¦è€…æ¥è¯´: å‚考用户手册ä¸çš„ |40.2| 。 *E183* *user-cmd-ambiguous* æ‰€æœ‰ç”¨æˆ·å®šä¹‰çš„å‘½ä»¤éƒ½å¿…é¡»ä»¥å¤§å†™å—æ¯å¼€å¤´ï¼Œæ¥é¿å…与内建命令的冲çªã€‚(è¦æ³¨æ„的是, 有少数内建命令比如 :Next,:Print and :Xï¼Œä¹Ÿä»¥å¤§å†™å—æ¯å¼€å¤´ã€‚在这些情况下内建的 命令总是优先执行的)。用户命令的其它å—符å¯ä»¥æ˜¯å¤§å†™å—æ¯ï¼Œå°å†™å—æ¯æˆ–æ•°å—。当使用 æ•°å—æ—¶ï¼Œå°å¿ƒä¼šå’Œå…¶å®ƒä»¥æ•°å—ä½œä¸ºå‚æ•°çš„命令混淆。例如,命令 ":Cc2" å¯èƒ½æ˜¯ä¸å¸¦å‚æ•° 的用户命令 ":Cc2",也å¯èƒ½æ˜¯å‚数为 "2" 的命令 "Cc"。建议在命令åå’Œå‚æ•°ä¹‹é—´æ”¾ç½® ä¸€ä¸ªç©ºæ ¼æ¥é¿å…这些问题。 当使用一个用户定义的命令时,该命令å¯ä»¥ç¼©å†™ã€‚但是,如果缩写ä¸å”¯ä¸€ï¼Œä¼šå‘生错误。 æ¤å¤–,内建命令总是优先执行。 例如::command Rename ..。:command Renumber ..。:Rena " æ„å‘³ç€ "Rename":Renu " æ„å‘³ç€ "Renumber":Ren " 错误 - 有二义性:command Paste ..。:P " 内建的 :Print建议在脚本ä¸ä½¿ç”¨ç”¨æˆ·è‡ªå®šä¹‰å‘½ä»¤çš„å…¨å。 :com[mand] *:com* *:command* 列出所有用户自定义命令。在列出命令时, å‰ä¸¤æ çš„å—符表示 ! 命令有 -bang 属性 " 命令有 -register 属性 b 命令局部于当å‰ç¼“冲区 (下é¢ç»™å‡ºå±žæ€§çš„详细æè¿°) :com[mand]{cmd}列出以{cmd}开头的用户命令 *:command-verbose* 如果 'verbose' éžé›¶ï¼Œå‘½ä»¤åˆ—å‡ºçš„åŒæ—¶æ˜¾ç¤ºå®ƒæœ€è¿‘定义的ä½ç½®ã€‚例如::verbose command TOhtmlName Args Range Complete DefinitionTOhtml 0 % :call Convert2HTML(<line1>,<line2>)Last set from /usr/share/vim/vim-7.0/plugin/tohtml.vim|:verbose-cmd| 介ç»è¯¦æƒ…。 *E174* *E182* :com[mand][!] [{attr}...]{cmd}{rep}定义一个用户命令。命令的åå—æ˜¯{cmd},而替æ¢çš„æ–‡æœ¬æ˜¯{rep}。该命令的属性 (å‚考下é¢) 是{attr}。如果该命令已 å˜åœ¨ï¼ŒæŠ¥é”™ï¼Œé™¤éžå·²ç»æŒ‡å®šäº†ä¸€ä¸ª !ï¼Œè¿™ç§æƒ…况下命令被é‡å®š 义。 :delc[ommand]{cmd}*:delc* *:delcommand* *E184* åˆ é™¤ç”¨æˆ·å®šä¹‰å‘½ä»¤{cmd}。 :comc[lear] *:comc* *:comclear* åˆ é™¤æ‰€æœ‰ç”¨æˆ·å®šä¹‰å‘½ä»¤ã€‚ 命令属性 Vim 和任何其它 ex å‘½ä»¤ä¸€æ ·å¯¹å¾…ç”¨æˆ·è‡ªå®šä¹‰å‘½ä»¤ã€‚å®ƒèƒ½æœ‰å‚æ•°ï¼Œä¹Ÿå¯ä»¥æŒ‡å®šèŒƒå›´ã€‚傿•° å¯ä»¥è¿›è¡Œæ–‡ä»¶å,缓冲区ç‰è¡¥å…¨ã€‚具体的工作方å¼å–决于命令的属性,属性在命令被定义 时被指定。 属性å¯åˆ†å››å¤§ç±»: 傿•°å¤„ç†ã€è¡¥å…¨è¡Œä¸ºã€èŒƒå›´å¤„ç†å’Œç‰¹æ®Šæƒ…况。下é¢åˆ†ç±»æè¿°ä¹‹ã€‚ 傿•°å¤„ç† *E175* *E176* *:command-nargs* ç¼ºçœæ—¶ï¼Œç”¨æˆ·è‡ªå®šä¹‰å‘½ä»¤ä¸æŽ¥å—傿•° (å¦‚æžœä½¿ç”¨äº†ä»»ä½•å‚æ•°ä¼šæŠ¥é”™)。但通过使用 -nargs 属性å¯ä»¥å…许命令接å—傿•°ã€‚有效的值为: -nargs=0 ä¸å…è®¸æœ‰å‚æ•° (ç¼ºçœæƒ…况) -nargs=1 è¦æ±‚ä¸€ä¸ªå‚æ•° -nargs=* å…è®¸ä»»ä½•æ•°ç›®çš„å‚æ•° (0,1 或更多) -nargs=? å…许 0 或 1 ä¸ªå‚æ•° -nargs=+ å¿…éœ€ç»™å‡ºå‚æ•°ï¼Œä½†æ˜¯æ•°ç›®ä»»æ„ 这个上下文ä¸è®¤ä¸º (未转义的) ç©ºæ ¼æˆ–åˆ¶è¡¨ç”¨æ¥åˆ†éš”傿•°ã€‚注æ„傿•°è¢«ä½œä¸ºæ–‡æœ¬ä½¿ç”¨ï¼Œä¸æ˜¯è¡¨è¾¾å¼ã€‚特别是,"s:var" 会使用定义命令的脚本的局 部å˜é‡ï¼Œä¸æ˜¯æ‰§è¡Œæ—¶çš„ï¼ä¾‹å¦‚: script1.vim::let s:error = "None":command -nargs=1 Error echoerrscript2.vim:<args>:source script1.vim:let s:error = "Wrong!":Error s:error执行 script2.vim 会回显 "None"ï¼Œä¸æ˜¯ä½ 想è¦çš„ï¼è§£å†³æ–¹æ³•å¯ä»¥é€šè¿‡è°ƒç”¨å‡½æ•°å®žçŽ°ã€‚ 自动补全行为 *:command-completion* *E179* *E180* *E181* *:command-complete* ç¼ºçœæ—¶ï¼Œç”¨æˆ·å®šä¹‰å‘½ä»¤çš„傿•°ä¸è¿›è¡Œè‡ªåŠ¨è¡¥å…¨ã€‚ä½†æ˜¯ï¼Œé€šè¿‡æŒ‡å®šä»¥ä¸‹çš„ä¸€ä¸ªæˆ–å¤šä¸ªå±žæ€§ åŽï¼Œå‚æ•°å¯ä»¥è¿›è¡Œè‡ªåŠ¨è¡¥å…¨: -complete=augroup 自动命令组 -complete=buffer 缓冲区å -complete=command Ex 命令 (åŠå…¶å‚æ•°) -complete=dir 目录å -complete=environment 环境å˜é‡å -complete=event 自动命令事件 -complete=expression Vim è¡¨è¾¾å¼ -complete=file 文件和目录å -complete=shellcmd 外壳命令 -complete=function 函数å -complete=help 帮助主题 -complete=highlight 高亮组 -complete=mapping æ˜ å°„å -complete=menu èœå• -complete=option 选项 -complete=tag æ ‡ç¾ -complete=tag_listfiles æ ‡ç¾ï¼Œä½†æ•²å…¥CTRL-D时显示文件å -complete=var 用户å˜é‡ -complete=custom,{func}用户定制的自动补全,通过{func}æ¥å®šä¹‰ -complete=customlist,{func}用户定制的自动补全,通过{func}æ¥å®šä¹‰ 用户定制的自动补全 *:command-completion-custom* *:command-completion-customlist* *E467* *E468* 通过 "custom,{func}" 或 "customlist,{func}" è‡ªåŠ¨è¡¥å…¨å‚æ•°å¯ä»¥å®šä¹‰å®šåˆ¶çš„自动补全 方案。其ä¸{func}是有如下原型的函数: :function{func}(ArgLead,CmdLine,CursorPos) 该函数ä¸éœ€è¦ä½¿ç”¨æ‰€æœ‰çš„è¿™äº›å‚æ•°ï¼Œå®ƒåº”该æä¾›è‡ªåŠ¨è¡¥å…¨å€™é€‰ä½œä¸ºè¿”å›žå€¼ï¼Œ 对于 "custom" 傿•°ï¼Œå‡½æ•°åº”该返回å—符串,æ¯è¡Œä¸€ä¸ªå€™é€‰ï¼Œç”¨æ¢è¡Œç¬¦åˆ†éš”。 对于 "customlist" 傿•°ï¼Œå‡½æ•°åº”该返回 Vim 列表形å¼çš„补全候选。忽略列表里的éžå— 符串项目。 è¯¥å‡½æ•°çš„å‚æ•°æ˜¯: ArgLead 当å‰è‡ªåŠ¨è¡¥å…¨çš„å‰å¯¼å‚æ•° CmdLine 完整的命令行 CursorPos 里é¢çš„å…‰æ ‡ä½ç½® (å—节ä½ç½®) 该函数å¯èƒ½è¦æ ¹æ®è¿™äº›æ¥åˆ¤åˆ«ä¸Šä¸‹æ–‡ã€‚对 "custom" 傿•°ï¼Œå®ƒæ— 须用 ArgLead (里é¢çš„éš å¼è§„则) æ¥è¿‡æ»¤å€™é€‰ã€‚在函数返回时 Vim 将用它的æ£åˆ™è¡¨è¾¾å¼å¼•擎æ¥è¿›è¡Œè¿‡æ»¤ï¼Œè¿™ç§æ–¹ å¼åœ¨å¤§å¤šæ•°æƒ…况下效率更高。对于 "customlist" 傿•°ï¼ŒVim ä¸ä¼šè¿‡æ»¤è¿”回的补全候选, 用户æä¾›çš„函数应该自己过滤候选。 以下的例å为列出 Finger 命令的用户å:com -complete=custom,ListUsers -nargs=1 Finger !finger<args>:fun ListUsers(A,L,P): return system("cut -d: -f1 /etc/passwd"):endfun下例从 'path' 选项指定的目录补全文件å::com -nargs=1 -bang -complete=customlist,EditFileComplete\ EditFile edit<bang><args>:fun EditFileComplete(A,L,P): return split(globpath(&path, a:ArgLead), "\n"):endfunèŒƒå›´å¤„ç† *E177* *E178* *:command-range* *:command-count* ç¼ºçœæ—¶ï¼Œç”¨æˆ·å®šä¹‰çš„命令䏿ޥå—一个行å·èŒƒå›´ã€‚ä¸è¿‡ï¼Œå¯ä»¥ä½¿å‘½ä»¤æŽ¥å—一个范围 (-range 属性),或者接å—一个任æ„的数é‡å€¼ï¼Œè¯¥æ•°é‡å¯ä»¥å‡ºçŽ°åœ¨æŒ‡å®šè¡Œå·çš„ä½ç½® (-range=N,类 似于 |:split| å‘½ä»¤çš„é£Žæ ¼),也å¯ä»¥æ¥è‡ªä¸€ä¸ª "count" 傿•° (-count=N,类似于 |:Next| å‘½ä»¤çš„é£Žæ ¼)ã€‚æ¤æ—¶è®¡æ•°å¯ä»¥ç”¨ |<count>| ä»Žå‚æ•°é‡Œå¾—到。 å¯èƒ½çš„属性有: -range å…许使用范围,缺çœä¸ºå½“å‰è¡Œ -range=% å…è®¸ä½¿ç”¨èŒƒå›´ï¼Œç¼ºçœæ˜¯æ•´ä¸ªæ–‡ä»¶ (1,$) -range=N 出现在行å·ä½ç½®çš„ä¸€ä¸ªæ•°é‡ (ç¼ºçœæ˜¯ N) (类似于 |:split|) -count=N 出现在行å·ä½ç½®æˆ–è€…ä½œä¸ºé¦–ä¸ªå‚æ•°çš„ä¸€ä¸ªæ•°é‡ (ç¼ºçœæ˜¯ N) (类似 于 |:Next|)。 指定 -count (ä¸è®¾ç¼ºçœå€¼) ç‰ä»·äºŽ -count=0。注æ„-range=N å’Œ -count=N 是互斥的,åªåº”该指定其ä¸çš„一个。 特殊情况 *:command-bang* *:command-bar* *:command-register* *:command-buffer* 有如下特殊情况: -bang 这些命令å¯ä»¥ä½¿ç”¨ä¸€ä¸ª ! 修饰符 (å’Œ :q 或 :w 类似) -bar 这些命令å¯ä»¥è·Ÿéšä¸€ä¸ª "|" å’Œå…¶å®ƒå‘½ä»¤ã€‚é‚£ä¹ˆå‘½ä»¤å‚æ•°ä¸å°± ä¸å…许有 "|" 。用一个 " å¯ä»¥å¼€å§‹ä¸€ä¸ªæ³¨é‡Šã€‚ -register ç»™è¿™äº›å‘½ä»¤çš„ç¬¬ä¸€ä¸ªå‚æ•°å¯ä»¥æ˜¯ä¸€ä¸ªå¯é€‰çš„寄å˜å™¨å (å’Œ :del,:put,:yank 类似)。 -buffer 这些命令仅在当å‰ç¼“冲区里有效。 -count å’Œ -register 属性的情况,如果æä¾›äº†å¯é€‰çš„傿•°ï¼Œå®ƒä¼šè¢«ä»Žå‚数列表ä¸åˆ 除, å¹¶ä¸”å’Œæ›¿æ¢æ–‡æœ¬åˆ†åˆ«å¤„ç†ã€‚ æ›¿æ¢æ–‡æœ¬ ç”¨æˆ·è‡ªå®šä¹‰å‘½ä»¤çš„æ›¿æ¢æ–‡æœ¬æ‰«æä½¿ç”¨<...>记法的特殊转义åºåˆ—。命令行输入的值ä¸ï¼Œ 转义åºåˆ—被替æ¢ï¼Œå…¶å®ƒæ–‡æœ¬ä¸å˜ã€‚最终å—符串被作为 Ex å‘½ä»¤æ¥æ‰§è¡Œã€‚è¦é¿å…替æ¢ï¼Œä½¿ç”¨<lt>代替åˆå§‹çš„<ã€‚è¿™æ ·ï¼Œè¦æŒ‰æœ¬ä¹‰åŒ…å« "<bang>",请使用 "<lt>bang>"。 有效的转义åºåˆ—有 *<line1>*<line1>命令处ç†èŒƒå›´çš„开始行。 *<line2>*<line2>命令处ç†èŒƒå›´çš„æœ«å°¾è¡Œã€‚ *<count>*<count>æä¾›çš„æ•°é‡ (在 '-range' å’Œ '-count' å±žæ€§ä¸æè¿°)。 *<bang>*<bang>(å‚考 '-bang' 属性) 如果命令执行时带了 ! 修饰符,扩展为 !ï¼Œå¦ åˆ™ä»€ä¹ˆä¹Ÿä¸æ‰©å±•。 *<reg>* *<register>*<reg>(å‚考 '-register' 属性) 如果命令行上指定,å¯é€‰çš„寄å˜å™¨å。å¦åˆ™ ä»€ä¹ˆä¹Ÿä¸æ‰©å±•。<register>是它的一个åŒä¹‰è¯ã€‚ *<args>*<args>å‘½ä»¤çš„å‚æ•°ï¼Œå’Œå®žé™…æä¾›çš„å®Œå…¨ç›¸åŒ (但æ£å¦‚ä¸Šé¢æåˆ°è¿‡çš„ï¼Œæ•°é‡æˆ–寄 å˜å™¨ä¼šæ¶ˆè€—è‹¥å¹²å‚æ•°ï¼Œå®ƒä»¬ä¸å†æ˜¯<args>的一部分)。<lt>一个å•独的 '<' (å°äºŽå·) å—符。扩展转义åºåˆ—时,如果需è¦ä»¥ä¸Šè½¬ä¹‰ åºåˆ—按å—颿„义出现的版本时有用。- 例如,è¦èŽ·å¾—<bang>,使用<lt>bang>。 *<q-args>* 如果一个转义åºåˆ—的最å‰ä¸¤ä¸ªå—符是 "q-" (例如,<q-args>) é‚£ä¹ˆè¯¥å€¼ç”¨å¼•å·æ‹¬èµ·ï¼Œä½¿ 之在表达å¼é‡Œä½¿ç”¨æ—¶æˆä¸ºåˆæ³•çš„å€¼ã€‚è¿™ç§æ–¹å¼æŠŠå‚数当åšå•ä¸ªå€¼ã€‚å¦‚æžœæ²¡æœ‰å‚æ•°ï¼Œ<q-args>是空å—符串。 *<f-args>* è¦å…è®¸å‘½ä»¤æŠŠå‚æ•°ä¼ é€ç»™ç”¨æˆ·å®šä¹‰çš„函数,有一ç§ç‰¹æ®Šçš„å½¢å¼<f-args>("function args"ï¼Œå‡½æ•°å‚æ•°)ã€‚å®ƒåœ¨ç©ºæ ¼å’Œåˆ¶è¡¨å¤„åˆ†å‰²å‘½ä»¤è¡Œå‚æ•°ï¼Œæ¯ä¸ªå‚æ•°åˆ†åˆ«ç”¨å¼•å·æ‹¬èµ·ï¼Œç„¶åŽ æŠŠ<f-args>åºåˆ—替æ¢ä¸ºæ‹¬èµ·å‚数用逗å·åˆ†éš”的列表。å‚考下é¢çš„ Mycmd ç¤ºä¾‹ã€‚æ²¡æœ‰å‚ æ•°æ—¶ï¼Œ<f-args>è¢«åˆ é™¤ã€‚ è¦åœ¨<f-args>çš„å‚æ•°ä¸åµŒå…¥ç©ºç™½å—符,在å‰é¢åŠ ä¸Šåæ–œæ 。<f-args>把æ¯å¯¹åæ–œæ (\\) 用å•ä¸ªåæ–œæ æ›¿ä»£ã€‚åæ–œæ åŽå¦‚è·Ÿéžç©ºç™½æˆ–åæ–œæ å—ç¬¦ï¼Œä¿æŒä¸å˜ã€‚总览如下:命令XX ab 'ab' XX a\b 'a\b' XX a\ b 'a b' XX a\ b 'a ', 'b' XX a\\b 'a\b' XX a\\ b 'a\', 'b' XX a\\\b 'a\\b' XX a\\\ b 'a\ b' XX a\\\\b 'a\\b' XX a\\\\ b 'a\\', 'b' 示例<f-args>" åˆ é™¤ä»Žè¿™é‡Œåˆ°æœ«å°¾çš„æ‰€æœ‰ä¸œè¥¿:com Ddel +,$d" 把当å‰ç¼“冲区改å:com -nargs=1 -bang -complete=file Ren f<args>|w<bang>" ç”¨ä¸€ä¸ªæ–‡ä»¶çš„å†…å®¹æ¥æ›¿æ¢æŸä¸ªèŒƒå›´å†…的内容" (请用一行输入本命令):com -range -nargs=1 -complete=fileReplace<line1>-pu_|<line1>,<line2>d|r<args>|<line1>d" 计算范围内的行数:com! -range -nargs=0 Lines echo<line2>-<line1>+ 1 "lines"" 调用一个用户函数 (<f-args>的示例):com -nargs=* Mycmd call Myfunc(<f-args>)当执行::Mycmd arg1 arg2时,它将调用::call Myfunc("arg1","arg2"):" 一个更实用的例å:function Allargs(command): let i = 0: while i < argc(): if filereadable(argv(i)): execute "e " . argv(i): execute a:command: endif: let i = i + 1: endwhile:endfunction:command -nargs=+ -complete=command Allargs call Allargs(<q-args>)命令 Allargs 接å—ä»»æ„ Vim å‘½ä»¤ä½œä¸ºå‚æ•°å¹¶åœ¨å‚数列表里的所有文件上执行。使用示例 (注æ„使用 "e" æ ‡å¿—ä½æ¥å¿½ç•¥é”™è¯¯ï¼Œä»¥åŠç”¨ "update" 命令æ¥åˆ·æ–°ä¿®æ”¹è¿‡çš„缓冲区): :Allargs %s/foo/bar/ge|update 它将调用::call Allargs("%s/foo/bar/ge|update")在脚本里定义用户命令时,它å¯ä»¥è°ƒç”¨å±€éƒ¨äºŽè„šæœ¬ä¸çš„å‡½æ•°å’Œä½¿ç”¨å±€éƒ¨äºŽè„šæœ¬çš„æ˜ å°„ã€‚ç”¨ 户调用用户命令时,该命令将è¿è¡Œåœ¨å®šä¹‰å®ƒçš„脚本的上下文里,如果一个命令ä¸ä½¿ç”¨äº† |<SID>|,这一点很é‡è¦ã€‚ vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on Thu Sep 20 19:25:31 UTC 2007