INTRO

*intro.txt*     for Vim version 6.4.  最后更新:2005年05月13日


                  VIM 参 考 手 册       作者:Bram Moolenaar
                                        译者:Dasn
                                        http://vimcdoc.sf.net


介绍 Vim                                                *ref* *reference*

1. 简介                         |intro|
2. 互联网上的 Vim               |internet|
3. 制作群                       |credits|
4. 标识符                       |notation|
5. 了解一下模式                 |vim-modes-intro|
6. 从一种模式切换到另一种模式   |mode-switching|
7. 窗口里的东东                 |window-contents|
8. 术语                         |definitions|


1. 简介 *intro*

Vim 的意思是 Vi IMproved(Vi 改进版)。以前它是 Vi IMitation(Vi 模仿版)的缩 写, 但是由于做了许多改进,改一下名字还是合适的。 Vim 文本编辑器包含了 unix "Vi" 编辑器的几乎所有的命令并且还加入了许多新的命令。这对于编写程序和编辑普通 的文本文件是非常有用的。 所有的命令都可以通过键盘来输入。这样的优点在于:你可以通过键盘来完成所有的 操作,把精力集中在你正在编辑的东西上。Vim 提供对鼠标的支持,并且还有一个图形界 面版本,可以使用"滚动条"和"菜单"(参见:|gui.txt|)。 本手册的概述性信息可以参见 "help.txt" 文件,|help.txt| 。可以在 Vim 里按 <help><f1> 键访问该文件,或直接使用 |:help| 命令也可以(只键入 ":help" 即可,没有竖线和引号)。 如果帮助文件不在默认的位置,可以使用选项 'helpfile' 来指定。你可以通过标签 跳转到相应的主题:用 CTRL-] 跳转至当前光标下的主题,用 CTRL-T 跳回来。 这本手册会在花括号里提及 Vi 与 Vim 的不同之处,就像这样: {Vi 没有在线帮助} 。 欲知 Vim 与 Vi 有何不同,请参考 |vi_diff.txt| 。 本手册所指的是各种计算机上的 Vim 。不同的计算机和不同的终端之间可能有一点儿不 同。 除了本文给出的一些建议,还有单独的一系列文字来讨论每一个支持 Vim 的系统。 见 |sys-file-list| 。 这是一本包含 Vim 所有命令和选项的参考手册。它不是一本介绍如何使用 Vi 或 Vim 的 书,从某种意义上讲,它有些复杂了。对于初学者,有一个可供实地演练的 |tutor| 可 以试试。 想要学习怎样使用 Vim ,请阅读用户手册 |usr_toc.txt| 。 *book* 许多介绍 Vi 的书都会有一个专门为初学者准备的章节。我推荐两本这样的书: "Vim - Vi Improved" 作者是 Steve Oualline 这是最早的一本完全介绍 Vim 的书。非常适合初学者。一些最常用的命令用图片和实例 来讲解。不太常用的命令也有介绍,一些高级功能有重点地罗列出来。还有一个非常详尽 的索引和一个快速查找。书的部分内容已经包含在用户手册里了 |frombook| 。 本书由新骑士出版社 (new riders publishing) 出版。 ISBN: 0735710015 更多信息请访问如下链接之一: http://iccf-holland.org/click5.html http://www.vim.org/iccf/click5.html "Learning the Vi editor" 作者是 Linda Lamb 和 Arnold Robbins 这是一本关于 Vi 的书(第六版),里面有一章是讲 Vim 的。Vi 的入门部分讲解地很精 彩。一些 Vim 的特有命令只寥寥数笔代过。这本书有德译版(也有中文版 -- 译者注)。 由 O'Reilly 出版。 ISBN: 1-56592-426-6.

2. 互联网上的 Vim *internet*

*www* *faq* *FAQ* *distribution* *download* Vim 的最新消息可以通过访问其网站页面得到。网站上同样包含指向最新版本的 Vim 的 链接。FAQ 是一系列常见问题的解答。如果有问题请先读一下 FAQ 。 VIM 主页: http://www.vim.org/ VIM FAQ: http://vimdoc.sf.net/ 下载: ftp://ftp.vim.org/pub/vim/MIRRORS 讨论 Vim 的新闻组: *news* *usenet* comp.editors 这个新闻组也讨论其它编辑器。如果你写的是有关 Vim 的话题,要记得讲清楚。 *mail-list* *maillist* Vim 有许多邮件列表: <vim@vim.org> 讨论现存版本的 Vim: 有用的映射,提问、回答,以及到哪里得到特定的版本,等等。 <vim-dev@vim.org> *vim-dev* *vimdev* 讨论改进 Vim :新功能,移植,补丁,测试版本等等。 <vim-announce@vim.org> *vim-announce* 通告 Vim 的新版本;也包括测试版和不同系统的移植版。 <vim-multibyte@vim.org> *vim-multibyte* 讨论如何使用和改进 Vim 的处理多字节文本的功能。 <vim-mac@vim.org> *vim-mac* 讨论如何使用和改进 Macintosh 系统里的 Vim 。 访问 http://www.vim.org/maillist.php 以获取更多的信息。 NOTE: - 你只有在订阅了这些邮件列表之后,才能在上面发布信息。 - 为了避免垃圾邮件,你需要用与你订阅该邮件列表相同的邮件地址发送信息。 - 信件的大小最多是 40000 个英文字符。 *subscribe-maillist* 如果你想加入邮件列表,发 e-mail 至: <vim-help@vim.org> 确保你的发件人的地址 "From:" 是正确的。邮件列表服务器会回信告诉你如何订阅。 你可以从邮件列表软件那里获取以前的邮件和邮件的索引。至于怎样操作,还是给 vim-help 发邮件,问问它吧。 邮件列表的存档保存在: *maillist-archive* http://groups.yahoo.com/group/vim http://groups.yahoo.com/group/vimdev http://groups.yahoo.com/group/vimannounce http://groups.yahoo.com/group/vim-multibyte http://groups.yahoo.com/group/vim-mac 其它邮件列表: <vim-fr@club.voila.fr> *french-maillist* Vim 的法语论坛。如果要订阅,发送 e-mail 至 <vim-fr-subscribe@club.voila.fr> 或者访问 http://groups.yahoo.com/group/vim-fr 。 报告 bug: *bugs* *bug-reports* *bugreport.vim* 发送 bug 报告至:Vim Bugs <bugs@vim.org> 这不是一个邮件列表,但是发送到这个地址的邮件会被转发到 Vim 维护者那里。请尽量 使用精练的语言描述;回答邮件里的问题势必会占用维护者开发 Vim 的时间!要给出导 致 bug 的可重复的例子,并且尽可能找出哪个选项影响该 bug 。如果可能的话,换一台 机器试试;如果你能解决这个问题,把补丁发给我。 如果你不是很确定,请使用下面的命令: :so $vimruntime/bugreport.vim 这条命令会在当前目录下创建一个名为 "bugreport.txt" 的新文件,里面包含了许多与 你当前环境有关的信息。在发送之前,检查一下以免泄漏了你的机密。 *debug-vim* 如果 Vim 在处理测试文件的时候崩溃了,并且你用的编译器是 gcc ,那么你可以通过下 面的步骤找出问题的所在: 1. 编译 Vim 时加入 "-g" 选项(在 Makefile 里把这一行反注释掉即可)。 2. 使用下面的命令(用导致崩溃的测试文件代替 "11" ) cd testdir gdb ../vim run -u unix.vim -u nonE -s dotest.in test11.in 3. 看看 Vim 在哪里崩溃,gdb 应该给出这些信息。 4. 在 gdb 里使用下面的命令获取堆栈信息: where 你可以查看不同位置的堆栈信息: frame 3 用堆栈的位置代替数字 "3" *year-2000* *Y2K* 因为 Vim 在编辑时没有用到日期,所以不必担心 2000 年问题。Vim 使用的时间格式是 从 1970 年 1 月 1 日至今的秒数。它被用做被编辑文件和交换文件的时间戳,不是太重 要,应该只能引起一些警告。 当一个 32 位的整型数容不下这些秒数的时候,可能会有 2038 年的问题。这取决于你的 编译器、连接库以及操作系统。特别是用到 time_t 和 ctime() 函数的时候。 time_t 以 4 字节大小存储在交换文件中。但是它只是用来在恢复时打印文件的日期/时间,不 会影响到正常的编辑。 Vim 中的 strftime() 函数直接调用系统函数 strftime() 。localtime() 调用系统函 数 time() 。getftime() 使用系统函数 stat() 返回的时间。如果你的系统库函数兼容 2000 年问题,Vim 也就没问题。 用户可能在创建 Vim 脚本时用到了外部命令。这样做可能会引入 2000 年问题,但这不 是 Vim 的问题。

3. 制作群 *credits* *author*

Vim 的大部分是由 Bram Moolenaar <Bram@vim.org> 编写的。 部分文档来自于由: W.N. Joy Alan P.W. Hewett Mark Horton 编写的多种 Vi 手册。 Vim 编辑器是在 Stevie 的基础上并汲取了其它软件的思想开发出来的。这里提一下为这 些软件工作的人。还有许多朋友通过发补丁以及对 Vim 的建议和反馈的方式,给予我很 大的帮助,在这里就不一一提及了。 如果没有这些人的帮助,Vim 永远不可能成为现在这个样子。 Ron Aaron 修改 Win32 GUI 版本 Zoltan Arpadffy VMS 版本的移植工作 Tony Andrews Stevie 的作者 Gert van Antwerpen 对 DJGPP 的 MS-DOS 版本修改 Berkeley DB(3) 交换文件实现的想法 Keith Bostic Nvi 作者 Walter Briscoe Makefile 的更新和各种补丁 Ralf Brown MS-DOS 里的 SPAWNO 库 Robert Colon 提供了许多有用的建议 Marcin Dalecki GTK+ 图形界面的移植,工具栏的图标,gettext() Kayhan Demirel 给我发送乌干达的信息 Chris & John Downey xvi (多窗口的思想) Henk Elbers 最先移植到 VMS Eric Fischer 移植到 Mac 系统,'cindent',其它的改进 Benji Fisher 解答用户问题。 Bill Foster 雅典娜图形界面移植 Loic Grenie xvim (多窗口思想) Sven Guckes Vim 促进者和前网站维护者 Darren Hiebert 强大的 ctags Bruce Hunsaker 改进了 VMS 移植版本 Andy Kahn 加入了 Cscope 支持, GTK+ 的图形界面移植 Oezguer Kesim Vim 邮件列表的维护者 Axel Kielhorn Macintosh 移植 Steve Kirkendall Elvis 作者 Roger Knobbe Windows NT 移植 Sergey Laskavy 来自莫斯科的帮助 Felix von Leitner Vim 邮件列表的维护者 David Leonard 将 Python 扩展移植到 Unix Avner Lottem 在窗口里从左向右编辑。 Flemming Madsen X11 客户端-服务器,许多功能和补丁。 MicroSoft 给我一份 DevStudio 的拷贝来编译 Vim Paul Moore Python 接口的扩展,许多补丁。 Katsuhito Nagano 多字节版本 Sung-Hyun Nam 多字节版本 Vince Negri 加强了 Win32 图形界面和控制台版本 Steve Oualline 第一本介绍 Vim 的书的作者 |frombook| George V. Reilly 最先从事 Win32 及其 GUI 版本的移植工作 Stephen Riehm bug 收集者 Stefan Roemer 各种补丁以及为用户提供帮助 Ralf Schandl IBM OS/390 移植 Olaf Seibert DICE 和 BeBox 版本,强化了正则表达式 Mortaza Shiran Farsi 补丁 Peter da Silva termlib Paul Slootman OS/2 移植 Henry Spencer 正则表达式 Dany St-Amant Macintosh 移植 Tim Thompson Stevie G. R. (Fred) Walter Stevie Sven Verdoolaege Perl 接口 Robert Webb 命令行补全,GUI 和许多补丁 Ingo Wilken Tcl 接口 Mike Williams PostScript 打印 Juergen Weigert Lattice 版本, AUX 改进,UNIX 和 MS-DOS 移植, 及 autoconf Stefan 'Sec' Zehl vim.org 的维护者 我希望感谢所有向我报告 bug 和给我建议的人,但是人太多在这里不能一一提及。如果 没有他们的帮助,Vim 不可能成为现在这个样子:他们是 Vim 的生命之源。 在这篇文档里,有些地方还会提到其它版本的 Vi : *Vi* Vi "原始版本"。这个版本的 Vi 出现在 Sun OS 4.x 里,没有更多的注释。 ":version" 返回结果 "version 3.7, 6/7/85"。有时也指别的版本的 Vi 。 只在 unix 里运行。只有在遵循许可证的条件下才能得到源代码。Vi 的更多 信息: http://vi-editor.org [现在不好用了……] *Posix* Posix 来自 IEEE 1003.2 PART 2: Shell and utilities 。通常叫做 "Posix" 。 这篇文本描述了 Vi 应该怎样工作。使用的是 1996 年起草的那个版本,所 有的与此相关的内容"应该遵循该标准"。虽然可以改动其中的任何部 分…… *Nvi* Nvi "new" vi 的缩写。这个版本的 Vi 是 4.4 BSD 和 FreeBSD 带的。很好 地兼容了原始版本的 Vi,并且增加了一些功能。这里所指的版本是 1.79 。 "version" 返回信息是 "version 1.79 (10/23/96)" 。虽然有一个 1.81 版正在开发,但是最近几年一直没有新版本放出。源代码自由发放。 *Elvis* Elvis 另一个 Vi 的克隆,作者是 Steve Kirkendall 。非常简洁但是不及 Vim 灵 活。这里的版本是 2.1 ,正在开发中。源代码自由发放。

4. 标识符 *notation*

如果你在阅读本文时使用了语法加亮功能,那些不是用来直接输入的文字通常会用特殊的 颜色显示。例如在 () ,{}<> 里的内容,以及 CTRL-X注意 Vim 的命令包括所有可能的字符。有时候 [] ,{}<> 也需要输入,这些文中应 该有清楚地说明。 [] 方括号里的字符是可选的。 *count* *[count]* *E489* [count] 可选的数值,可用在命令前以重复该命令。在没有特殊说明的情况下, 如果省略该数值,会认为该数值是 1 。注意,在本手册里 [count] 没有出现在命令的描述中,只在解释中有提及。这样做可以使查找命令 更简单。如果打开了 'showcmd' 选项,输入的数值(部分数值)会显 示在窗口底部。你可以用 <Del> 键删除最近输入的数值 (|N<Del>|) 。 *[quotex]* ["x] 可选的用于存储文本的目的寄存器。参见 |registers| 。x 代表从 'a' 到 'z' 或从 'A' 到 'Z' (大小写英文字母)中的一个字符,或 '"' ,在某些情况下(比如在 put 命令)还可以是 '0' 到 '9' , '%','#' 或其它字符。大写和小写字母指的是同一个目的寄存器,但 是使用小写字母会覆盖原先寄存器中的内容,而使用大写字母会将新的 内容追加在原内容之后。若省略 ""x" 或使用 """" ,则把文本存储到 未命名的寄存器中。 *{}* {} 命令中花括号里的内容是必须出现的,但是可以取不同的值。Vim 与 Vi 的不同之处也同样在花括号里给出(这可以通过上下文清楚地分辨 出来)。 *{char1-char2}* {char1-char2} 在 char1 到 char2 区间内地一个字符,例如:{a-z} 是一个小写字 母。多个区间可以串连,例如:{a-zA-Z0-9} 代表任一数字或字母。 *{motion}* {motion} 移动光标的命令。这些在 |motion.txt| 里有解释。例如: w 移动至下一个单词的首部 b 移动至当前单词的首部 4j 下移四行 /the<cR> 移动至下一个 "The" 这些命令可以跟在一个操作符 |operator| 后面,以指定操作符所作用 的范围。 - 如果移动命令中包含一个数值,并且操作符中也包含一个数值,那么 最后的效果是两个数值的乘积。例如:"2d3w" 删除六个单词。 - 可以使用向后移动的命令,例如:"db" 删除至当前单词首部。 - 移动命令也可以是鼠标点击。但不是所有的终端都支持鼠标。 - 命令 ":omap" 可以对操作符后的字符进行映射。 - ex 模式里的命令可以用来移动光标。可以调用函数做一些复杂的移 动。无论你使用什么 ":" 命令,移动总是面向字符的。意思是你不 可能把光标放在一个没有字符的地方(比如换行符的后面),除非设 置了 'virtualedit' 属性。 如果 ex 命令在操作符开始或者跳转到别的缓存之前改动了文本,那 么结果不可预测。继续改动文本是可能的。如果当前的缓存没有卸载 跳转到别的缓存是可以的。 *{Visual}* {visual} 选中的文本区域。用 "v" ,"V",或者 CTRL-V 激活该模式,接着使用 移动光标的命令选择文本。该操作在操作符 |operator| 之前使用,被 加亮的文本是操作符的作用范围。参见 |visual-mode| 。 *<character>* <character> 下面表格中的特殊字符,组合键+特殊字符,或组合键+单个 ASCII 字符。 *'character'* 'c' 单个 ascii 字符。 *CTRL-{char}* ctrl-{char} {char} 作为控制字符输入;也就是说,按住 CTRL 键再按 {char}{char} 是大写字母还是小写字母都没关系;就是说 CTRL-ACTRL-a 是一样的。但是在有些终端里,用 SHIFT 键会生成别的编码,如果是 这样,就别这么用。 *'option'* 'option' 用单引号括起来的是选项,或参数。可以被赋值。参见 |options| 。 *quotecommandquote* "command" 用双引号括起来的是可以输入的命令。 *key-notation* *key-codes* *keycodes* 下面这些按键的名称文档里会用到。它们也可以用在 ":map" 命令里(按下 CTRL-K 再按 下你想输入的键就可以输入该键的键名)。 标识符 含义 等价于 十进制数值

<nul>CTRL-@    0 (stored as 10) *<Nul>*
<bs>            退格键                  CTRL-H    8     *backspace*
<tab>           制表符                  CTRL-I    9     *tab* *Tab*
                                                        *linefeed*
<nl>            换行符                  CTRL-J   10 (used for <Nul>)
<ff>            换页符                  CTRL-L   12     *formfeed*
<cr>            回车符                  CTRL-M   13     *carriage-return*
<return><cr>                                 *<Return>*
<enter><cr>                                 *<Enter>*
<esc>           换码                    CTRL-[   27     *escape* *<Esc>*
<space>         空格                             32     *space*
<lt>            小于号                  <        60     *<lt>*
<bslash>        反斜杠                  \        92     *backslash* *<Bslash>*
<bar>           竖杠                    |       124     *<Bar>*
<del>           删除                            127
<csi>           命令序列引入            aLT-Esc 155     *<CSI>*
<xcsi>          图形界面的              csi             *<xCSI>*

<eol>           行尾 (可以是 <CR>, <LF><CR><LF>,
                根据不同的系统和 'fileformat') *<EOL>*

<up>            光标上移键                      *cursor-up* *cursor_up*
<down>          光标下移键                      *cursor-down* *cursor_down*
<left>          光标左移键                      *cursor-left* *cursor_left*
<right>         光标右移键                      *cursor-right* *cursor_right*
<s-up>          Shift+光标上移键
<s-down>        Shift+光标下移键
<s-left>        Shift+光标左移键
<s-right>       Shift+光标右移键
<c-left>        Control+光标左移键
<c-right>       Control+光标右移键
<f1> - <f12>    功能键 1 到 12                  *function_key* *function-key*
<s-f1> - <s-f12> Shift+功能键 1 到 12          *<S-F1>*
<help>          帮助键
<undo>          撤销键
<insert>        Insert 键
<home>          Home                            *home*
<end>           End                             *end*
<pageup>        Page-up                         *page_up* *page-up*
<pagedown>      Page-down                       *page_down* *page-down*
<khome>         小键盘 Home (左上)              *keypad-home*
<kend>          小键盘 End (左下)               *keypad-end*
<kpageup>       小键盘 Page-up (右上)           *keypad-page-up*
<kpagedown>     小键盘 Page-down (右下)         *keypad-page-down*
<kplus>         小键盘 +                        *keypad-plus*
<kminus>        小键盘 -                        *keypad-minus*
<kmultiply>     小键盘 *                        *keypad-multiply*
<kdivide>       小键盘 /                        *keypad-divide*
<kenter>        小键盘 enter                    *keypad-enter*
<kpoint>        小键盘 小数点                   *keypad-point*
<k0> - <k9>     小键盘 0 到 9                   *keypad-0* *keypad-9*
<s-...>         Shift+键                       *shift* *<S-*
<c-...>         Control+键                     *control* *ctrl* *<C-*
<m-...>         Alt+键 或 meta+键             *meta* *alt* *<M-*
<a-...><m-...>                      *<A-*
<d-...>         Command+键 (只用于苹果机)      *<D-*
<t_xx>          termcap 里的 "xx" 入口键


Note: Shift+方向键,帮助键和撤销键只在少数终端里有效。在 Amiga 机器上,Shift
+功能键 10 生成命令序列引入码 (CSI)。只有再按一个键,该代码才能被识别出来。

Note: Delete 键有两个键码。一般是十进制的 ASCII 码 127,这个总能认出来。但有些
delete 键会发送 termcap 入口里 "kD" 的值。这两个值有同样的效果。
参见 |:fixdel| 。

Note: 小键盘上的按键与其对应的"正常"按键一样。例如,<kHome><Home> 有同样
的效果。如果小键盘上的键发送的原始键码与"正常"键相同,那么将被认为是按下
了"正常"键。例如,如果 <kHome> 发送的键码与 <Home> 相同,当按下 <khome> 的时
候,Vim 会认为你按下了 <Home><kHome> 的映射也会失效。

                                                                *<>*
例子中经常使用 <> 标识符。有时这只是用来说明你需要输入什么,但一般来说只要照样
键入就可以了,例如,在 ":map" 命令里。规则是:
 1.  任何可打印的字符都可以直接键入,反斜杠和 '<' 除外。
 2.  反斜杠用两个反斜杠表示 "\\" ,或者用 "<Bslash>" 。
 3.  真正的 '<' 用 "\<" 或 "<lt>" 表示。只有在没有歧义的时候才可以直接用 '<'
     表示。
 4.  "<key>" 的意思是特殊键。其含义上面的表格都有介绍,下面是一些例子:
           <esc>                Escape 键
           <c-g>                CTRL-G
           <up>                 光标上移键
           <c-leftmouse>        Control+鼠标左键
           <s-f11>              Shift+功能键 11
           <m-a>                Meta- a  (第 8 位置位的 'a')
           <m-a>                Meta- A  (第 8 位置位的 'A')
           <t_kd>               termcap 的 "kd" 入口 (光标下移键)

如果你想在 Vim 里使用 <> 的标识功能,你必须确定 'cpoptions' 里不包括 '<' (如
果没有设置 'compatible' ,它的默认值就是这样)。
        :set cpo-=<

<lt> 可以抵消 <> 对特殊键名的标识功能。使用反斜杠也可以,但是需要把
'cpoptions' 里的 'b' 去掉。
下面的例子是把 ctrl-h 映射成六个字符 "<Home>":
        :imap <c-h> \<home>
        :imap <c-h> <lt>home>
第一种方法只有在 'cpoptions' 里没有 'B' 才好用。第二种总成立。
要在映射中得到 "<lt>" 这几个字符:
        :map <c-l> <lt>lt>

对于映射,缩写和菜单命令你可以直接使用这些例子。或者手动键入它们,包括 '<' 和
'>' 。但是在其它命令里,比如 ":set" 和 "autocmd" 却不好用。


5. 了解一下模式 *vim-modes-intro* *vim-modes*

Vim 有六种基本模式: *Normal* *Normal-mode* *command-mode* Normal 模式 在 Normal 模式里你可以输入所有的编辑命令。启动编辑 器之后就处于该模式(除非你设置了 'insertmode' 选项, 下面会有说明)。 Visual 模式 该模式与 Normal 模式相似,但是移动光标的指令会扩展加亮 的区域。非移动指令作用于加亮的区域。见 |Visual-mode| 。 如果设置了 'showmode' 选项,窗口底部会出现 "--Visual--" 字样。 Select 模式 该模式看起来与 MS-Windows 的选择模式很像。键入一个字 符会删掉所有被选择的字符并且进入 Insert 模式。见 |select-mode| 。 如果设置了 'showmode' 选项,窗口底部会出现 "--Select--" 字样。 insert 模式 在 Insert 模式下你键入的内容会插入到缓冲区。见 |insert-mode| 如果设置了 'showmode' 选项,窗口底部会出现 "--Insert--" 字样。 Command-line 模式 Cmdline 模式 "!". |Cmdline-mode| 在 command-line 模式(也叫 Cmdline 模式)里你可以在窗 口底部输入一行命令。执行 Ex 命令使用 ":",查找使用 "?" 和 "/" ,调用外部命令使用 "!" 。|cmdline-mode| ex 模式 与 Command-line 模式类似,但是执行完一条命令后,你会继 续停留在 Ex 模式。提供非常有限的命令行编辑。|Ex-mode| 还有五种附加模式。这些都是在基本模式的基础上变化而来的: *Operator-pending* *Operator-pending-mode* Operator-pending 模式 该模式与 Normal 模式类似,但是在操作符之后,Vim 等待 一个 {motion} 以确定操作符的作用范围。 Replace 模式 Replace 模式是 Insert 模式的特殊情况。你可以做和 Insert 模式里相同的事情,但是你输入的字符会覆盖原先的 字符。见 |Replace-mode| 。 如果设置了 'showmode' 选项,窗口底部会出现 "-- Replace --" 字样。 Insert normal 模式 在 Insert 模式里输入 CTRL-O 可进入该模式。与 Normal 模式类似,但是只能执行一条命令然后返回到 Insert 模式。 如果设置了 'showmode' 选项,窗口底部会出现 "-- (insert) --" 字样。 Insert Visual 模式 在 insert 模式里进行 Visual 模式的选择。在 Insert 模式 里键入 CTRL-O 然后键入 "v" 或 "V" 或 CTRL-V,可进入该 模式。Visual 选择结束时,返回到 Insert 模式。 如果设置了 'showmode' 选项,窗口底部会出现 "-- (insert) VISUAL --" 字样。 Insert Select 模式 在 Insert 模式里启动 Select 模式可进入该模式。例如,用 鼠标拖拽或 <S-Right> 。 如果 Select 模式结束,Vim 返回 Insert 模式。 如果设置了 'showmode' 选项,窗口底部会出现 "-- (insert) SELECT --" 字样。

6. 从一种模式切换到另一种模式 *mode-switching*

如果因为某种原因你不知道处于哪种模式,你总是可以通过按两下 <Esc> 返回 Normal 模式。虽然在 Ex 模式里不能这样,但是可以用 ":visual" 返回 Normal 模式。 如果在你按下 <Esc> 后发现屏幕闪烁或者听到响声,这证明你已经回到 Normal 模式。 然而,虽然在 Insert 模式里按下 CTRL-O 后再按下 <Esc> 也会听到喇叭的响声,但是 你仍然处于 Insert 模式,再按一下 <Esc> 即可。 *i_esc* 切换 至 模式 Normal Visual Select Insert Replace Cmd-line Ex 从 模式 Normal v V ^V *4 *1 R : / ? ! Q Visual *2 ^G c C -- : -- Select *5 ^O ^G *6 -- -- -- Insert <Esc> -- -- <Insert> -- -- Replace <Esc> -- -- <Insert> -- -- Command-line *3 -- -- :start -- -- Ex :vi -- -- -- -- -- - 不可用 -- 不可能 *1 从 Normal 模式切换到 Insert 模式可以用这些命令:"i", "I", "a", "A", "o", "O", "c", "C", "s" 或 S" 。 *2 从 Visual 模式切换到 Normal 模式可以使用一个不移动光标的命令,这样命令执行 后就会返回 Normal 模式。也可以使用 <Esc> "v", "V" 或 "CTRL-V" (见 |v_v|),这几个命令可以没有副作用地终止 Visual 模式。 *3 从 Command-line 模式切换至 Normal 模式: - 敲 <CR><NL>,使得键入的命令得以执行。 - 删除整行(例如,用 CTRL-U)最后再按一下 <BS> 。 - 敲 CTRL-C<Esc> 可以退出 command-line 模式而不执行已经键入的命令。 在最后一种情况里 <Esc> 可能被 'wildchar' 定义,这样 <Esc> 就会作为 command-line 模式里的命令补全键。你可以再按一下 <Esc> 忽略补全的命令。{Vi: 当敲 <Esc> 的时候 command-line 会被执行。大多数人对此感觉不爽;因此 Vim 进 行了改动。但是如果 <Esc> 是映射的一部分,command-line 就会被执行。如果你想 使用 Vi 的特性包括输入的 <Esc> 的这种反应,那么可以使用 ":cmap ^V<Esc> ^V^M" } *4 从 Normal 模式切换到 Select 模式: - 如果 'selectmode' 里 包含 "mouse" ,当使用鼠标选择文本时即可切换。 - 如果 'selectmode' 里包含 "key",那么按住 Shift 键然后用光标键移动光标。 - 如果 'selectmode' 包含 "cmd",那么用 "v", "V" 或 "CTRL-V" - 使用 "gh", "gH" 或 "g CTRL-H" *5 只移动光标键(不要按 Shift)可以从 Select 模式转到 Normal 模式。 *6 输入一个可打印字符可以从 Select 模式切换到 Insert 模式。插入该字符的同时删 除被选择的部分。 如果打开了 'insertmode' 选项,编辑文件时将直接进入 Insert 模式。 *CTRL-\_CTRL-N* *i_CTRL-\_CTRL-N* *c_CTRL-\_CTRL-N* *v_CTRL-\_CTRL-N* 另外,CTRL-\ CTRL-N<C-\><C-N> 可以用来从其它模式切换到 Normal 模式。这样可 以确保 Vim 处于 Normal 模式而不会像 <Esc> 那样产生响声。然而,它不能用在 Ex 模 式。当用在一个需要参数的命令之后时,诸如 |f| 、|m|,之类,等待时间由 'ttimeoutlen' 决定。 *CTRL-\_CTRL-G* *i_CTRL-\_CTRL-G* *c_CTRL-\_CTRL-G* *v_CTRL-\_CTRL-G* 如果设置了 'insertmode' ,则 CTRL-\ CTRL-G<C-\><C-G> 切换到 Insert 模式, 否则切换至 Normal 模式。这可以让 Vim 处于 'insertmode' 所指定的模式,而不必关 心当前的模式。 *Q* *mode-Ex* *Ex-mode* *Ex* *EX* *E501* Q 切换至 "Ex" 模式。有点像一个接一个的 ":" 命令,除了: - 你不需要输入 ":" 。 - 命令执行完屏幕不更新。 - 没有正常的命令行编辑。 - 映射和缩写无效。 实际上,你正在使用一个标准的行编辑器。(<Del><BS> 删除一个字符,CTRL-U 删除整行)。 如果使用 "ex" 调用 Vim,则会直接进入该模式。 用 ":vi" 命令 |:visual| 退出 "Ex" 模式。 Note: 老版本 的 Vim 里,"Q" 用来格式化文本,现在使用 |gq|。但是如果 你使用 |vimrc_example.vim|,那么 "Q" 和 "gq" 一样。 *gQ* gQ 切换到 "Ex" 模式,与一条接一条的 ":" 命令类似。所有的 行编辑、补全等等,都可用。用 ":vi" 命令 |:visual| 退出 "Ex" 模式。 {Vi 没有该功能}

7. 窗口里的东东 *window-contents*

在 Normal 模式和 Insert/Replace 模式里屏幕窗口显示当前缓冲区里的内容:所见即所 得。但有两个例外: - 如果 'cpoptions' 选项里包含 '$',并且在一行上做改动,被改动的文本没有直接删 除,而是在被删除的最后一个字符放上 '$' 。 - 当在一个窗口输入文本的时候,监视该文本的另一个窗口不会立即更新,直到插 入结束。 {Vi: 在慢速终端上屏幕有时不会更新} 除非关闭了 'wrap' 选项,否则长度大于窗口宽度的文本会被卷起(见下面)。设置 'linebreak' 选项可以使文本在空白字符处被卷起。 如果已经到达了缓冲区的最后一行,但是当前窗口还有显示空间,Vim 会在最后一行的下 面的第一列显示一个 '~',像这样: +-----------------------+ |some line | |last line | |~ | |~ | +-----------------------+ 也就是说 '~' 意味着到达了缓冲区的末尾。 如果当前窗口不能完整的显示最后一行,Vim 会在窗口的最后一行的第一列用 '@' 字符 表示这一点,就像这样: +-----------------------+ |first line | |second line | |@ | |@ | +-----------------------+ '@' 表示这一行窗口里放不下。 如果标志 "lastline" 出现在 'display' 选项里,你就不会看到窗口最左边的 '@' 字 符。如果最后一行不能完全放到窗口里,就只显示能放下的部分,并且该行的最后三个 字符用 "@@@" 代替,像这样: +-----------------------+ |first line | |second line | |a very long line that d| |oesn't fit in the wi@@@| +-----------------------+ 如果文本中只包含一行,窗口里放不下,这是很特殊的情况。Vim 只会显示光标所在位置 周围的部分字符。不会显示特殊字符,这样你可以编辑该行的任何部分。 {Vi: 行的长度不能适应窗口的宽度时,给出"内部错误"} 在 'highlight' 选项里出现的 '@' 可以被用来为 '@' 和 '~' 设置特殊的加亮。这使它 们与缓冲区里的真实字符得以区分成为可能。 选项 'showbreak' 包含的字符串放在被卷起的行的前面。 *wrap-off* 如果关闭了 'wrap' 选项,长行不会被卷起。只显示能放到窗口里的那一部分。如果光标 移动到没有显示的部分,屏幕会水平方向滚动。这样做的好处是"列数"可以正常显示, 并且不能放到窗口里的部分也可编辑。缺点是你不能一次看见该行的所有字符。选项 'sidescroll' 可以设定滚动列数的最小值。{Vi: 没有 'wrap' 选项} 所有正常的 ASCII 字符直接显示在屏幕上。<Tab> 用相应数量的空格代替。其余不可打 印的字符用 "^{char}" 代替。{char} 不可打印的字符的值加 64 。比如,响铃字符 (7) 显示为 "^G" 。ASCII 值在 127 至 160 的字符用 "~{char}" 代替,{char} 是该字符的 数值减去 64 。这些字符在屏幕上要多占一个位置,光标只能放在第一个位置上。 如果你设置了 'number' 选项,所有的行前面会加行号。提示:如果你不喜欢卷起的行混 淆了行号,可以把 'showbreak' 选项设置成八个空格: :set showbreak=\ \ \ \ \ \ \ \ 如果你设置了 'list' 选项,<Tab> 字符不会显示成多个空格,而是 "^I" 。'$' 字符会 出现在每一行的末尾,这样你可以发现尾部的空白字符。 在 Command-line 模式里,只有命令行自己可以正确显示。一返回 Normal 模式显示的缓 冲区的内容就会更新。 窗口的最后一行是用来显示状态和其它信息的。状态信息只有在选项打开的时候才可用: status message option default Unix default 当前模式 'showmode' 开 开 命令字符 'showcmd' 开 关 光标位置 'ruler' 关 关 当前模式是 "-- INSERT --" 或 "-- REPLACE --", 见 |'showmode'| 。命令字符是你 输入的但还没执行的命令。{Vi: 不显示按下的字符,不显示光标的位置} 如果你用一个慢速终端,你可以关闭状态信息以加速编辑: :set nosc noru nosm 如果出错,错误信息会保持至少一秒钟(使用反色显示)。{Vi: 在你阅读之前,错误 信息可能已经被其它信息覆盖掉了} 有些命令会显示有多少行受影响。信息行数的上限可以用 'report' 控制(默认是 2)。 在 Amiga 系统里,Vim 在一个 CLI 窗口里运行。Vim 的名字和当前文件的全名在标题栏 里显示。窗口大小改变的时候,Vim 自动重画窗口。你可以把窗口搞的很小,但是如果太 小了就连一行文本也装不下了。尽量让窗口保持至少 40 个字符的宽度,这样可以阅读最 后一行(状态行)的大多数信息。 在大多数 Unix 系统里,窗口大小的调整可以正确地被 Vim 识别和处理。{Vi: 处理得不 好}

8. 术语 *definitions*

屏幕 Vim 所用的整个工作区域。可以是一个虚拟终端窗口。也被叫 做 "Vim 窗口"。 窗口 缓冲区视图。 一个屏幕包含一个或多个窗口,被状态栏屏幕底部的命令行分割。 +-------------------------------+ 屏幕 | 窗口 1 | 窗口 2 | | | | | | | |=== 状态栏 ===|==== 状态栏 ===| | 窗口 3 | | | | | |========== 状态栏 =============| |命令行 | +-------------------------------+ 命令行也用来输出信息。如果命令行没有足够的空间来显示信息,屏幕会上滚。 四种不同类型的"行": 缓冲 行 缓冲区里的行。与读出/写入文件里的行一样。每一行可以包 含成千上万个字符。 逻辑 行 折叠过的缓冲行。许多缓冲行被折叠成一个逻辑行: "+-- 99 行 "。可以包含成千上万个字符。 窗口 行 窗口里显示的行:被卷起的逻辑行,换行符,等等,都是。这 些行的长度只能与窗口的宽度相同,多出的部分会被卷起或截 断。 屏幕 行 Vim 使用的屏幕中的行。包括所有窗口的窗口行、状态栏以及 命令行。它们的长度受屏幕的宽度的限制。如果命令行里命令 的长度大于屏幕的宽度,则自动换行,并且屏幕上滚。 缓冲 行 逻辑 行 窗口 行 屏幕 行 1. 一 1. 一 1. +-- 折叠 1. +-- 折叠 2. 二 2. +-- 折叠 2. 五 2. 五 3. 三 3. 五 3. 六 3. 六 4. 四 4. 六 4. 七 4. 七 5. 五 5. 七 5. === 状态栏 === 6. 六 6. aaa 7. 七 7. bbb 8. ccc ccc c 1. aaa 1. aaa 1. aaa 9. cc 2. bbb 2. bbb 2. bbb 10. ddd 3. ccc ccc ccc 3. ccc ccc ccc 3. ccc ccc c 11. 4. ddd 4. ddd 4. cc 12. === 状态栏 === 5. ddd 13. (命令行) 6.

vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on 2006年 07月 02日 星期日 22:43:25 UTC