在各个帮助文件里,Vim 和 Vi/Ex 的差异在花括号里给出,如 "{Vi 无此功能}"。本文件只列出其余各处未列出之处,并给出一个总览。
Vim 基本上遵守 POSIX 1003.2-1。唯一只知缺少的命令是 ": open"。还有众多小的差异(或者因为 Vim 的缺失,或者因为此处并不涉及 Posix)。
1. 模拟的命令 |simulated-command|
2. 缺失的选项 |missing-options|
3. 限制 |limits|
4. 最有意思的新增功能 |vim-additions|
5. 其它 Vim 特色 |other-features|
6. 命令行参数 |cmdline-arguments|
7. POSIX 相容性 |posix-compliance|
1. 模拟的命令 *simulated-command*
该命令在 Vi 存在,但 Vim 只是对它进行模拟:
*: o* *: op* *: open*
: [range]o[pen] 类似于 |:visual|: 结束 Ex 模式。
{Vi: 在打开模式开始编辑}
: [range]o[pen] /pattern/ 同上,另外移动光标到光标行上匹配 "pattern" 的
列。
Vim 不支持 open 模式,因为它其实没什么用。对于那些 ": open" 会启动 open 模式的情形,Vim 会离开 Ex 模式,你可以执行相同的命令,但刷新的是整个屏幕而不是只有一行。
2. 缺失的选项 *missing-options*
这些选项只有在 Unix Vi 里存在,但 Vim 没有。如果你试图设置这些选项,你不会得到
错误消息。但你给出的值不会使用和显示。
autoprint (ap) 布尔型 (缺省打开) *'autoprint'* *'ap'*
beautify (bf) 布尔型 (缺省关闭) *'beautify'* *'bf'*
flash (fl) 布尔型 (缺省未知) *'flash'* *'fl'*
graphic (gr) 布尔型 (缺省关闭) *'graphic'* *'gr'*
hardtabs (ht) 数值型 (缺省 8) *'hardtabs'* *'ht'*
<Tab> 显示时移动的空白的数目
mesg 布尔型 (缺省打开) *'mesg'*
novice 布尔型 (缺省关闭) *'novice'*
open 布尔型 (缺省打开) *'open'*
optimize (op) 布尔型 (缺省关闭) *'optimize'* *'op'*
redraw 布尔型 (缺省关闭) *'redraw'*
slowopen (slow) 布尔型 (缺省关闭) *'slowopen'* *'slow'*
sourceany 布尔型 (缺省关闭) *'sourceany'*
w300 数值型 (缺省 23) *'w300'*
w1200 数值型 (缺省 23) *'w1200'*
w9600 数值型 (缺省 23) *'w9600'*
3. 限制 *limits*
Vim 有一些关于能够编辑的文件的限制 {Vi: 不能处理 <Nul> 和超过 128 的字符,行长
有限制,还有其它的限制}。
*E340*
最大行长 在 16 位整数的机器上,(Amiga 和 MS-DOS 实模式):
32767,否则 2147483647 个字符。更长的行被分割。
最大行数 2147483647 行。
最大文件大小 2147483647 字节 (2 千兆) 如果长整数是 32 位。对于64
位的长整型,则 更多。另外对于 |swap-file| 而言,
也受限于磁盘可用空间。
*E75*
文件路径长度 Unix 和 Win32: 1024 字符,否则 256 字符 (或系统能支持的最大值)。
扩展后字符选项的长度 Unix 和 Win32: 1024 字符,否则 256 字符
最大显示宽度 Unix 和 Win32: 1024 字符,否则 255 字符
最大映射左手边序列 50 个字符。
不同高亮类型数目: 超过 30000
数值类型的范围: -2147483648 到 2147483647 (64 位系统上更大)
撤销信息和寄存器内的文本保存在内存里,因为做 (大的) 改变时,可用的 (虚拟) 内存
限制了撤销的层数和能保存在寄存器里的文本。其它在内存里的信息包括: 命令行历史、
QuickFix 模式的错误信息,等等。
内存使用限制
'maxmem' ('mm') 选项用来设置单个缓冲区可用的最大内存 (以千字节计)。'maxmemtot'
用来设置所有缓冲区可用的最大内存 (以千字节计)。它们的缺省值视系统而定。在
Amiga 和 MS-DOS 上,'maxmemtot' 的设置根据可用的内存决定。
这不是硬性限制,只是用来告诉 Vim 什么时候把文本移到交换文件。
如果你不喜欢 Vim 交换到文件上,设置 'maxmem' 和 'maxmemtot' 为非常大的值。交换
文件这时只会作恢复用。如果你完全不想要交换文件,设置 'updatecount' 为 0,或者
在启动 Vim 时加上 "-n" 参数。
4. 最有意思的新增功能 *vim-additions*
Vi 兼容性。 |'compatible'|
尽管 Vim 99% 和 Vi 兼容,有些 Vi 的特性被认为是漏洞,或至少需要改进。
不过,Vim 启动时尽量和 "真正的" Vi 行为相似。要使得 Vim 行为有所改进,
试试复位 'compatible' 选项:
:set nocompatible
或者启动 Vim 时带上 "-N" 参数:
vim -N
如果你有 .vimrc 文件,Vim 启动时自动置位 'nocompatible'。见
|startup|。
'cpoptions' 选项可以设置若干专门项目的 Vi 兼容性。
支持不同的系统。
Vim 可以用在:
- 所有的 Unix 系统 (所有测试过的系统都没有问题。不过,GUI 和 Perl 接口
不一定哪里都可以用)。
- Amiga (500、1000、1200、2000、3000、4000、...)。
- 实模式下 MS-DOS (无需附加驱动)。
- 保护模式下的 Windows 3.1 和 MS-DOS (需要 DPMI 驱动)。
- Windows 95 和 Windows NT,支持长文件名。
- OS/2 (需要 emx.dll)
- Atari MiNT
- VMS
- BeOS
- Macintosh
- Risc OS
- IBM OS/390
注意 在有的系统上需要关闭一些特性来节省资源的使用,尤其是 MS-DOS。有的
老旧的系统上你需要使用旧一点的 Vim 版本。
多次撤销。 |undo|
'u' 在时间点上往后退。'CTRL-R' 则往前走。'undolevels' 选项可以设置能记
住的改变数目 (缺省为 1000)。如果 'undolevels' 设为 0,就能得到 vi-兼容
的单次撤销行为。设为 -1 则完全关闭撤销功能。
如果缓冲区所有的改变都被撤销,缓冲区不再被认为改变过。这时,你可以用
:q 退出,不用 <!>。
撤销一些改变然后又做了新的改编后,Vim 在撤销树上建立一个分支。这意味着
你可以回到文本过去的任何状态,任何改变都不会有丢失文本的风险。
|undo-tree|
图形用户界面 (GUI)。 |gui|
包括对 GUI 的支持: 菜单、鼠标、滚动条,等等。你可以定义自己的菜单。更
好支持供对 CTRL/SHIFT/ALT 键加特殊键/鼠标键的组合。支持多种平台,比如
X11 (Motif 和 Athena 界面)、GTK、Win32 (Windows 95 和其后版本)、BeOS、
Amiga 和 Macintosh。
多重窗口和缓冲区。 |windows.txt|
Vim 可以把屏幕分割为多个窗口,每个编辑一个不同的缓冲区,或者在不同位置
的同一缓冲区。缓冲区可以被载入 (和改变),但是不一定在窗口里显示。这被
称为隐藏缓冲区。为了支持这个机制,增加了许多命令和选项。
Vim 也可以使用多重标签页。每个标签页由一个或多个窗口。使用包含所有标签
页标签的一行可以快速在这些页面之间切换。|tab-page|
语法高亮。 |:syntax|
Vim 可以高亮关键字、模式和其它。这由若干 |:syntax| 命令定义,而能实现
大多数语言和文件类型的高亮。Vim 包含了诸多文件提供大多数语言的高亮,比
如 C、C++、Java、Pascal、Makefile、外壳脚本等等。高亮所用的颜色可以为
普通终端、色彩终端和 GUI 用 |:highlight| 分别定义。一个方便的方式是使
用 |:colorscheme| 命令。
高亮的文本可以汇出为 HTML 格式。|convert-to-HTML|
其它可以高亮的项目包括搜索字符串的匹配 |'hlsearch'|,匹配的括号
|matchparen| 和光标所在的行和列 |'cursorline'| |'cursorcolumn'|。
拼写检查。 |spell|
如果置位 'spell' 选项,Vim 会高亮拼写错误。现在支持大约 40 种语言,用
'spellang' 选项选择。源代码中,只检查注释和字符串的拼写。
折叠。 |folding|
一个范围内的行可以显示为单个 "折叠" 行。这样允许概览文件并快速移过大段
文字。折叠可以手动创建,也可以基于语法、缩进等等创立。
diff 模式。 |diff|
Vim 可以显示文件的两个版本并高亮两者的差异。相同的文本部分用折叠关掉。
相关命令可以用来从一个版本把文本移到另一个版本。
插件。 |add-plugin|
把插件文件放在合适的目录下就可以对基本功能扩展。这是一个启动 Vim 时执
行别人写的 Vim 脚本的简便方法。插件可以应用在所有文件上,或者为某个文
件类型特别编写。
重复命令序列。 |q|
"q{c}" 开始记录输入的字符,并保存在命名寄存器 {c} 里。另一个 "q" 停止
记录。该寄存器可以通过 "@{c}" 命令执行。这对重复一个复杂的序列十分有
用。
灵活的插入模式。 |ins-special-special|
插入模式下,光标键可以用来在文件移动。就撤销/重做而言,这使得插入内容
分成不同的部分。
CTRL-O 可以用来执行单个普通模式的命令。这和按 <Esc> 输入命令,再按 |a|
几乎相同。
可视模式。 |Visual-mode|
可视模式可以用来先高亮选择一段文本并执行一个命令在其上。这是一个代替先
给出操作符,然后移动到待操作文本的尾部的 (容易使用的) 替代方法。
|v| 和 |V| 用来开始可视模式,|v| 作用于字符上,|V| 作用于行上。移动光
标可以扩展可视的部分。屏幕上以高亮显示该部分。输入 "o",可视文本的另一
端也可移动。可视文本可以被一个操作符影响:
d 删除
c 修改
y 抽出
> 或 < 插入和删除缩进
! 通过外部程序过滤
= 使用排版机制过滤
: 对可视行开始 |:| 命令。
gq 'textwidth' 列内的文本进行排版
J 连接行
~ 交换大小写
u 改变为小写
U 改变为大写
列块操作符。 |visual-block|
可以用可视模式选择一个文本列块。用 CTRL-V 开始可视模式。该列块可以被删
除 ("d"),抽出 ("y") 和改变大小写 ("~"、"u" 和 "U")。被删除和抽出的列
块可以用 "p" 和 "P" 命令放回文本中。
帮助系统。 |:help|
帮助显示在一个窗口中。可以使用常见的命令移动,搜索,等等。标签可以用来
在帮助文件间跳转,就像超链接一样。|:help| 命令需要一个参数,可以快速跳
到某主题的信息。<F1> 能快速访问到帮助系统。帮助索引文件名可以用
"helpfile" 选项设置。
命令行编辑和历史。 |cmdline-editing|
使用光标,你可以在命令行的任何位置插入或者删除。右/左光标键可以用来前
移/后移一个字符。Shift + 右/左光标键可以用来前移/后移一个单词。
CTRL-B/CTRL-E 可以用来跳转到命令行的开始和结束位置。
|cmdline-history|
会记住命令行。上/下光标键可以用来记起以前的命令行。'history' 选项可以
设置能记住的行数。命令行和搜索模式的历史分别记忆。
命令行补全。 |cmdline-completion|
输入一个命令行 (在屏幕的最底行) 时,<Tab> 可以用来补全
什么 例子
- 命令 :e<Tab>
- 标签 :ta scr<Tab>
- 选项 :set sc<Tab>
- 选项值 :set hf=<Tab>
- 文件名 :e ve<Tab>
- 等等
如果有多个匹配,CTRL-N (下一个) 和 CTRL-P (前一个) 会遍历各个匹配。
<Tab> 和 CTRL-N 类似,但会回绕到第一个匹配。
'wildchar' 选项可以设置进行命令行补全的字符。<Tab> 是缺省值。CTRL-D 可
以在 (不完全) 通配符后输入;所有的匹配都会被列出。CTRL-A 会插入所有的
匹配,CTRL-L 会插入所有匹配的最长的共同部分。
插入模式补全。 |ins-completion|
在插入模式下,CTRL-N 和 CTRL-P 键可以用来补全别的地方出现过的单词。
|i_CTRL-N|
CTRL-X 进入另外一个模式,完成一些补全:
|i_CTRL-X_CTRL-F| 文件名
|i_CTRL-X_CTRL-K| 'dictionary' 文件的单词
|i_CTRL-X_CTRL-T| 'thesaurus' 文件的单词
|i_CTRL-X_CTRL-I| 头文件的单词
|i_CTRL-X_CTRL-L| 整行
|i_CTRL-X_CTRL-]| 标签文件的单词
|i_CTRL-X_CTRL-D| 定义或者宏
|i_CTRL-X_CTRL-O| 全能补全: 为不同文件类型分别定制的智能补全
等等
长行支持。 |'wrap'| |'linebreak'|
如果 'wrap' 选项关闭,长行不会回绕,只有部分的内容会被显示。如果光标移
动到未显示的部分,屏幕会水平滚动。最少滚动的列数由 'sidescroll' 选项决
定。|zh| 和 |zl| 命令可用来向边框滚动。
另一种方法是,长行可以在 'linebreak' 选项置位时,在单词间断开。这使得
单行段落的编辑较为便利 (例如,后来把文本读到 DTP 程序时)。用 |gk| 和
|gj| 命令上下移动光标。
文本排版。 |formatting|
'textwidth' 选项可以用来自动限制行的长度。这可以补充 Vi 的
'wrapmargin' 选项,后者并不十分有用。|gq| 操作符可以用来排版一段文本
(例如,|gqap| 排版整个段落) 。文本对齐的命令: |:center|、|:left| 和
|:right|。
扩展的搜索模式。 |pattern|
为了匹配各种文本项目,提供了很多附加的模式。例如: "\n"
可以用来在模式中匹配换行符。
"x\{2,4}" 匹配 "x" 2 到 4 次。
"\s" 匹配单个空白字符。
目录、远程和归档浏览。 |netrw|
Vim 可以浏览文件系统。简单编辑一个目录。在列表里用通常的命令移动,然后
按 <Enter> 进入光标所在的目录或文件。
也能用于通过 ftp、http、ssh 等连接的远程文件。
也能浏览 zip 和 tar 归档。|tar| |zip|
加快编辑-编译-编辑循环。 |quickfix|
|:make| 命令可以用来执行编译,并跳转到第一个错误。然后对编译器错误信息
构成的文件进行解释。这时,Vim 开始编辑第一个错误。
错误文件的每一行被检索一个文件名,行号,和错误信息。'errorformat' 选项
可以设置类似于 scanf 格式的字符串列表,从可以处理很多编译器的输出。
|:cn| 命令可以用来跳转到下一个错误。
|:cl| 列出所有的错误信息。还有其他的命令。
'makeef' 选项指出错误信息的文件名。
'makeprg' 选项包含 |:make| 命令要执行的程序名。
'shellpipe' 选项包含用来把编译器的结果输出到错误信息的命令字符串。
在文件中寻找匹配。 |:vimgrep|
Vim 可以在多个文件中搜索模式。可以使用先进的 Vim 正规表达式模式,适用
于所有系统,同时也能在压缩文件里搜索。
改进的程序缩进。 |'cindent'|
'cindent' 选项打开时,每行的缩进被自动调整。大部分的 C 语法能够识别。
各种风格的缩进可以用 'cinoptions' 设置。切换缩进的键可以用 'cinkeys'
来设置。
注释可以自动排版。'comments' 选项设置开始和结束注释的字符。这对 C 代码
最有效,但是对 e-mail 也适用 (行首的 ">") 和其他类型的文本。|=| 操作符
可以用来重新排版行。
许多其他的语言包含了缩进插件,支持自动缩进。|30.3|
搜索头文件里的单词。 |include-search|
|[i| 命令可以用来搜索光标下的单词在当前和包含的头文件里的匹配。
'include' 选项可以设置描述包含文件的命令的模式 (缺省是为 C 程序设计)。
|[I| 命令列出所有的匹配。|[_CTRL-I| 命令跳转到一个匹配。
|[d|、|[D| 和 |[_CTRL-D| 命令做相同的事情,不过只查找用 'define'
选项给出的模式匹配的行。
自动命令。 |autocommand|
在读写文件,跳转到别的缓冲区等等时候,可以根据文件名,自动执行命令。这
对设置 C 程序、文档、普通文本、e-mail 等等的选项和映射有用。这也使得编
辑压缩文件成为可能。
脚本和表达式。 |expression|
增加了命令,可以组成强大的脚本语言。
|:if| 条件执行,比如可以用来根据 $TERM 的值设置不同选项。
|:while| 重复一系列命令。
|:for| 遍历列表。
|:echo| 显示表达式的结果。
|:let| 给一个内部变量、选项等赋值。
变量类型包括数值、字符串、列表和字典。
|:execute| 执行表达式构造的命令。
|:try| 捕获例外。
等等,等等。见 |eval|。
支持调试和刨视。|debug-scripts| |profile|
如果还不够,提供了到 |Python|、|Ruby|、|Tcl|、|Perl| 和 |MzScheme| 的
接口。
Viminfo。 |viminfo-file|
命令行历史,位置标记,和寄存器可以存在一个在启动时读入的文件里。这可以
用来在退出和重启 Vim 时重复上次的搜索或命令行命令。也可以用 |'0|
跳转回最近一次的编辑。'viminfo' 选项可以设置选项什么内容存储在
.viminfo 文件里。缺省该功能是关闭的。
打印。 |printing|
|:hardcopy| 命令发送文本给打印机。可以包含语法高亮。
鼠标支持。 |mouse-using|
支持鼠标的环境包括 GUI 版本、Unix 的 xterm、支持 gpm 的 Linux、MS-DOS
和 Win32。它也可用于定位光标,选择可视区域、粘贴寄存器,等等。
键名的使用。 |<>| |key-notation|
特殊键现在都有名字,类似于 <Up>、<End>,等等。名字可以用来映射,使编
辑变得方便。
编辑二进制文件。 |edit-binary|
Vim 可以编辑二进制文件。你可以修改可执行文件的若干字符,而不会破坏其它
内容。 Vim 不会删除 NUL 字符 (内部,它们被表示成 <NL>)。
|-b| 开始编辑二进制文件的命令行参数
|'binary'| |-b| 设置的选项。防止在文件最后一行增加 <EOL>。
多语言支持。 |multi-lang|
可以编辑双字节或者多字节编码的文件。使用 UTF-8 支持可以同时编辑各种语
言,而无须切换字体。|UTF-8|
消息和菜单可以用多种语言提供。
移到光标到行外。
如果设置 'virtualedit' 选项,光标可以移动到屏幕的任何位置,包括没有文
本的地方。可以用于很方便地编辑表格和图表。
编者TOM:大家可以参阅Ubuntu Linux实务操作(十) - vim编辑器安装与使用