vi_diff

vi_diff.txt 适用于 Vim 9.0 版本。 最近更新: 2022年7月 VIM 参考手册 by Bram Moolenaar 译者: Willis Vim 和 Vi 的差异 vi-differences 此文件列出 Vim 和 Vi/Ex 的差异,并给出 Vim 有而 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. 支持的 Vi 特性 vi-features 7. 命令行参数 cmdline-arguments 8. 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' Vi 不支持改变 termcap 项目,需要退出 Vi,编辑 termcap 项目然后再试。Vim 有 terminal-options

3. 限制 limits

Vim 有一些关于能够编辑的文件的限制 {Vi: 不能处理 <Nul> 和超过 128 的字符,行长有限制,还有其它的限制}。 最大行长 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 位系统上可能更大) 标签文件行的最大长度: 512 字节。 撤销信息和寄存器内的文本保存在内存里,因为做 (大的) 改变时,可用的 (虚拟) 内存 限制了撤销的层数和能保存在寄存器里的文本。其它在内存里的信息包括: 命令行历史、 快速修复模式的错误信息,等等。 内存使用限制

'maxmem' ('mm') 选项用来设置单个缓冲区可用的最大内存 (以千字节计)。'maxmemtot' 用来设置所有缓冲区可用的最大内存 (以千字节计)。它们的缺省值视系统而定。在 Amiga 上,'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-Windows - VMS - Macintosh - IBM OS/390 注意 在有的系统上需要关闭一些特性来节省资源的使用。有的老旧的系统上你 需要使用旧一点的 Vim 版本。 多层持久撤销。 undo 'u' 在时间点上往后退。'CTRL-R' 则往前走。'undolevels' 选项可以设置能记 住的改变数目 (缺省为 1000)。如果 'undolevels' 设为 0,就能得到 Vi-兼容 的单次撤销行为。设为 -1 则完全关闭撤销功能。 如果缓冲区所有的改变都被撤销,缓冲区不再被认为改变过。这时,你可以用 :q 退出,不用 <!>。 撤销一些改变然后又做了新的改编后,Vim 在撤销树上建立一个分支。这意味着 你可以回到文本过去的任何状态,任何改变都不会有丢失文本的风险。 undo-tree 如果置位 'undofile' 选项,在文件里保存撤销信息。这就是说,你可以退出 Vim,启动 Vim 打开以前编辑过的文件,然后撤销在退出 Vim 之前做出的改 动。 图形用户界面 (GUI)。 gui 包括对 GUI 的支持: 菜单、鼠标、滚动条,等等。你可以定义自己的菜单。更 好支持供对 CTRL/SHIFT/ALT 键加特殊键/鼠标键的组合。支持多种平台,比如 带 Motif 的 X11、GTK、Win32 (Windows XP 和其后版本)、Amiga 和 Macintosh。 多重窗口和缓冲区。 windows.txt Vim 可以把屏幕分割为多个窗口,每个编辑一个不同的缓冲区,或者在不同位置 的同一缓冲区。缓冲区可以被载入 (和改变),但是不一定在窗口里显示。这被 称为隐藏缓冲区。为了支持这个机制,增加了许多命令和选项。 Vim 也可以使用多重标签页。每个标签页由一个或多个窗口。使用包含所有标签 页标签的一行可以快速在这些页面之间切换。 tab-page 终端窗口。 :terminal Vim 可以创建窗口,其中运行终端模拟器。可用于执行任意命令、外壳或调试 器。 语法高亮。 :syntax Vim 可以高亮关键字、模式和其它。这由若干 :syntax 命令定义,而能实现 大多数语言和文件类型的高亮。Vim 包含了诸多文件提供大多数语言的高亮,比 如 C、C++、Java、Pascal、Makefile、外壳脚本等等。高亮所用的颜色可以为 普通终端、色彩终端和 GUI 用 :highlight 分别定义。一个方便的方式是使 用 :colorscheme 命令。 高亮的文本可以汇出为 HTML 格式。 convert-to-HTML 其它可以高亮的项目包括搜索字符串的匹配 'hlsearch' ,匹配的括号 matchparen 和光标所在的行和列 'cursorline' 'cursorcolumn' 。 文本属性 textprop.txt Vim 支持插件进行文本高亮。可用 prop_type_add() 指定属性类型,而用 prop_add() 放置属性。 拼写检查。 spell 如果置位 'spell' 选项,Vim 会高亮拼写错误。现在支持大约 50 种语言,用 'spelllang' 选项选择。源代码中,只检查注释和字符串的拼写。 折叠。 folding 一个范围内的行可以显示为单个 "折叠" 行。这样允许概览文件并快速移过大段 文字。折叠可以手动创建,也可以基于语法、缩进等等创立。 比较模式。 diff Vim 可以显示文件的两个版本并高亮两者的差异。相同的文本部分用折叠关掉。 相关命令可以用来从一个版本把文本移到另一个版本。 插件。 add-plugin 把插件文件放在合适的目录下就可以对基本功能扩展。这是一个启动 Vim 时执 行别人写的 Vim 脚本的简便方法。插件可以应用在所有文件上,或者为某个文 件类型特别编写。 软件包使这项功能更加简便。 packages 异步通信和定时器。 channel job timer Vim 可以在后台和其它进程交换信息。这样可以让服务器完成工作,并发送结果 给 Vim。 channel Vim 可以启动作业,与之通信,并结束作业。 job 可以一次或重复激活定时器,并调用函数完成任何功能。 timer 重复命令序列。 q "q{c}" 开始记录输入的字符,并保存在命名寄存器 {c} 里。另一个 "q" 停止 记录。该寄存器可以通过 "@{c}" 命令执行。这对重复一个复杂的序列十分有 用。 灵活的插入模式。 ins-special-special 插入模式下,光标键可以用来在文件移动。就撤销/重做而言,这使得插入内容 分成不同的部分。 CTRL-O 可以用来执行单个普通模式的命令。这和按 <Esc> 输入命令,再按 a 几乎相同。 可视模式。 Visual-mode 可视模式可以用来先高亮选择一段文本并执行一个命令在其上。这是一个代替先 给出操作符,然后移动到待操作文本的尾部的 (容易使用的) 替代方法。 vV 用来开始可视模式, v 作用于字符上, V 作用于行上。移动光 标可以扩展可视的部分。屏幕上以高亮显示该部分。输入 "o",可视文本的另一 端也可移动。可视文本可以被一个操作符影响: d 删除 c 修改 y 抽出 > 或 < 插入和删除缩进 ! 通过外部程序过滤 = 使用排版机制过滤 : 对可视行开始 : 命令。 gq 'textwidth' 列内的文本进行排版 J 连接行 ~ 交换大小写 u 改变为小写 U 改变为大写 {Vi 不包含可视模式。"可视" 这个名称专指普通模式,以区别于 Ex 模式} 列块操作符。 visual-block 可以用可视模式选择一个文本列块。用 CTRL-V 开始可视模式。该列块可以被删 除 ("d"),抽出 ("y") 和改变大小写 ("~"、"u" 和 "U")。被删除和抽出的列 块可以用 "p" 和 "P" 命令放回文本中。 帮助系统。 :help 帮助显示在一个窗口中。可以使用常见的命令移动,搜索,等等。标签可以用来 在帮助文件间跳转,就像超链接一样。 :help 命令需要一个参数,可以快速跳 到某主题的信息。<F1> 能快速访问到帮助系统。帮助索引文件名可以用 "helpfile" 选项设置。 命令行编辑和历史。 cmdline-editing 使用光标,你可以在命令行的任何位置插入或者删除。右/左光标键可以用来前 移/后移一个字符。Shift + 右/左光标键可以用来前移/后移一个单词。 CTRL-B/CTRL-E 可以用来跳转到命令行的开始和结束位置。 {Vi: 只能改变每一行的最后一个字符} {Vi: 当敲 <Esc> 的时候命令行会被执行。大多数人对此感觉不爽;因此 Vim 进行了改动。但是如果 <Esc> 是映射的一部分,命令行仍然会执行。如果你想 使用 Vi 的特性包括输入的 <Esc> 的这种反应,那么可以使用 ":cmap ^V<Esc> ^V^M"} 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-NCTRL-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' 选项决 定。 zhzl 命令可用来向边框滚动。 另一种方法是,长行可以在 'linebreak' 选项置位时,在单词间断开。这使得 单行段落的编辑较为便利 (例如,后来把文本读到 DTP 程序时)。用 gkgj 命令上下移动光标。 文本排版。 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 如果还不够,提供了到 PythonRubyTclLuaPerlMzScheme 的接口。 Viminfo。 viminfo-file 命令行历史,位置标记,和寄存器可以存在一个在启动时读入的文件里。这可以 用来在退出和重启 Vim 时重复上次的搜索或命令行命令。也可以用 '0 跳转回最近一次的编辑。'viminfo' 选项可以设置选项什么内容存储在 .viminfo 文件里。缺省该功能是关闭的。 打印。 printing :hardcopy 命令发送文本给打印机。可以包含语法高亮。 鼠标支持。 mouse-using 支持鼠标的环境包括 GUI 版本、Unix 的 xterm、支持 sysmouse 的 BSD、支持 gpm 的 Linux 和 Win32。它也可用于定位光标,选择可视区域、粘贴寄存器, 等等。 键名的使用。 <> key-notation 特殊键现在都有名字,类似于 <Up><End>,等等。名字可以用来映射,使编 辑变得方便。 编辑二进制文件。 edit-binary Vim 可以编辑二进制文件。你可以修改可执行文件的若干字符,而不会破坏其它 内容。 Vim 不会删除 NUL 字符 (内部,它们被表示成 <NL>)。 -b 开始编辑二进制文件的命令行参数 'binary' -b 设置的选项。防止在文件最后一行增加 <EOL>。 多语言支持。 multi-lang 可以编辑双字节或者多字节编码的文件。使用 UTF-8 支持可以同时编辑各种语 言,而无须切换字体。 UTF-8 消息和菜单可以用多种语言提供。 移到光标到行外。 如果设置 'virtualedit' 选项,光标可以移动到屏幕的任何位置,包括没有文 本的地方。可以用于很方便地编辑表格和图表。

5. 其它 Vim 特色 other-features

随机选取的一些其他的优美特色的列表。 Vim 以 "-s scriptfile" 启动时,"scriptfile" 读取的字符就像你输入的那样。如果在 编辑器还没退出时文件结束,多余的字符从控制台读入。 "-w" 选项用来把所有的输入字符记录在脚本文件里。该文件可以用来重做编辑的操作, 甚至可以作用在通过修改脚本文件里的一些命令后作用在别的文件上。 "-o" 选项为每个参数打开一个窗口。"-o4" 则打开四个窗口。 要能在全屏工作,Vi 需要几项 termcap 项目。Vim 只要 "cm" 项目 (光标移动)。 命令模式下: 'showcmd' 选项置位时,命令字符在屏幕末行上显示。命令结束时它们被删除。 如果置位了 'ruler' 选项,当前的光标位置显示在屏幕末行。 "U" 在离开最近修改的行和 "u" 之后都还能工作。 能显示设置了第 8 位的字符。'~' 和 0xa0 之间的字符显示为 "~?"、"~@"、"~A",等 等。除非它们包含在 'isprint' 选项里。 "][" 跳到 C 函数的下一个结束处 (首列的 '}')。 "[]" 转到 C 函数的前一个结束处 (首列的 '}')。 "]f"、"[f" 和 "gf" 开始编辑光标所在的文件名。 CTRL-W f 分割窗口,并开始编辑光标所在的文件名。 "*" 正向搜索光标所在的标识符,"#" 反向搜索之。 "K" 运行 'keywordprg' 选项定义的程序,使用光标所在的标识符作为参数。 "%" 可以在前面加一个计数。光标跳转到文件该百分比所处的行。普通的 "%" 功能则跳 转到匹配的括号上,引号里的括号跳过。 CTRL-] 命令可以在光标位于标识符中间时使用。 记住用过的标签。使用标签栈的命令包括 CTRL-T、":pop" 和 ":tag"。":tags" 列出标 签栈。 Vi 使用 'wrapscan' 来搜索标签。跳转到标签时 Vi 从别的文件的第二行开始搜索。如 果没有置位 'wrapscan',它不会去找别的文件的首行的标签。 'tags' 选项可以设置标签文件名字的列表。可以指定多个标签文件。"./" 开始的文件名 里,"./" 被当前文件所在的路径所代替。这样可以指定编辑中的文件的相同目录下的标 签文件。 {Vi: 有的版本总是使用二分法查找} {Vi 没有针对标签文件命令的安全保护措施} 以前用过的文件名被记在轮换文件名列表里。 CTRL-^ 接受一个计数,指定列表的一个索引。 ":files" 命令显示轮换文件名列表。 "#<N>" 被替换成列表中第 <N> 个轮换文件名。 "#<" 被替换成不带扩展名的当前文件名。 搜索模式可以使用更多特性。<NL> 字符被看成搜索模式和 ":s" 的替换字符串的一部 分。Vi 把它看成命令的结束。 搜索可以把光标放在匹配的结束处,还可以包括一个字符位移。 计数可以应用于 "~"、":next"、":Next"、"n" 和 "N"。 ":next!" 命令在置位 'autowrite' 时,不写入文件。过去,vi 写入文件,但这被认为 是一个漏洞,因为用户不期待该行为,而且 ":rewind!" 也不写入文件。 Vi 在替换模式下输入 <CR> 时,只有置位 'ai' 以后才删除一个字符 (但直到你按 <Esc> 时才看到)。Vim 在任何情况下都删除一个字符 (并立即显示)。 增加了 :wnext 命令。和 ":write" 接着 ":next" 相同。 ":w!" 命令总是写入,即使文件写保护时也是如此。Vi 里你需要先执行 ":!chmod +w %:S" 和 ":set noro"。 置位 'tildeop' 以后,"~" 是操作符 (一定要跟在移动命令之后使用)。 "J" (连接) 命令里,你可以复位 'joinspaces' 选项,使得句号之后只有一个空格 (Vi 插入两个空格)。 "cw" 可以用来改变多个字符组成的空白 (Vi 则不明确: "cw" 只改变一个空格,而 "dw" 删除所有的空白)。 {Vi: 在多个空白的某一个空白之上做 "cw" 只会改动单个空白字符;这可能不太对,因 为 "dw" 是删除所有后面的空白的} "o" 和 "O" 接受计数,以便重复插入的部分 (Vi 清除部分的显示)。 不支持 Ex 命令之后的标志位 (也无实现它的计划)。 非 UNIX 系统上,":cd" 命令显示当前的目录,而不是转到主目录 (因为没有)。":pwd" 在所有的系统上显示当前目录。 ":cd" 命令之后,文件名 (参数列表和打开的文件) 仍然指向原来的文件。Vi 里,改动 过的文件里不允许执行 ":cd",否则文件名的含义就改变了。 ":source!" 命令从文件里读取 Vi 命令。 ":mkexrc" 命令写入当前修改过的选项和映射到 ".exrc" 文件里。":mkvimrc" 写入到 ".vimrc" 文件。 映射不检查所谓的 "尾递归"。这样可以允许 ":map! foo ^]foo" 类似的形式。 映射以数字开始时,vi 丢失了之前输入的计数 (例如,如果使用映射 ":map g 4G",命 令 "7g" 转到第 4 行)。这被认为是一个 vi 的漏洞。Vim 连接计数 (这个例子里,它成 为了 "74G"),符合多数人的期待。 :put! 命令把寄存器的内容插到当前行之前。 如果放置的文本少于一行,vi 的 "p" 和 "P" 命令不能用 "." 重复。Vim 它们总是可以 重复的。 ":noremap" 命令可以用来输入不会被重映射的映射。这可以用来交换两个键的含义。 ":cmap"、":cunmap" 和 ":cnoremap" 可以用来只在命令行编辑时映射。":imap"、 ":iunmap" 和 ":inoremap" 则可用作插入模式的映射。类似的命令对缩写也存在: ":noreabbrev"、":iabbrev"、":cabbrev"、":iunabbrev"、":cunabbrev"、 ":inoreabbrev"、":cnoreabbrev"。 Vi 里命令 ":map foo bar" 会删除以前定义过的映射 ":map bug foo"。这被认为是一个 漏洞。所以 Vim 没有这一特性。 ":unmap! foo" 倒是会删除 ":map! bug foo"。如果不这样,撤销映射很难实现 (这和 vi 兼容)。 ':' 寄存器包含最近的命令行。 '%' 寄存器包含当前的文件名。 '.' 寄存器包含最近插入的文本。 ":dis" 命令显示抽出的寄存器的内容。 CTRL-O/CTRL-I 可用作跳转到较旧的/较新的位置。这和 '' 命令所用到的位置相同,但 是可以到别的文件里。":jumps" 命令列出较老的所有位置。 如果置位了 'shiftround' 选项,">" 和 "<" 命令的缩进被取整到 'shiftwidth' 的倍 数。 'scrolljump' 选项可以设置为光标离开屏幕时最少滚动的行数。可用在滚动缓慢的场 合。 'scrolloff' 选项可以设置光标上面和光标下面最少保留的行数。这样,你在编辑时,总 能看到一些上下文。如果设为了一个大值,光标总保持在窗口的中间。 大写位置标记用来在文件间跳转。":marks" 命令列出当前设置的所有位置标记。"']" 和 "`]" 命令跳转到前一个操作符的最后,或者放置 (put) 命令插入文本的最后。"'[" 和 "`[" 这跳转到相应的开始处。{Vi: 没有大写位置标记} 'shelltype' 选项的设置反映了 Amiga 使用的外壳类型。 'highlight' 选项可以设置若干命令使用的高亮模式。 CTRL-A (加) 和 CTRL-X (减) 命令是新增的。命令的计数 (缺省为 1) 被从光标所在或 其后的数字加上/减去。该数字可以是十进制、八进制 ('0' 开始),或者十六进制 ('0x' 开始)。对宏很有用。 :set 命令可以使用 "inv" 前缀来反转布尔型选项的值。 Vi 和 Vim 上你都可以用 ":substitute" 命令的 CTRL-M 增加换行符。Vi 里,这意味着 你不能在文本里插入一个真正的 CTRL-M。Vim 里,你可以用前导 CTRL-V 的方式在文本 里输入一个真正的 CTRL-M。 插入模式下: 如果打开 'revins' 选项,则进行反方向插入。这可以用来输入希伯来文。插入普通字符 时,光标不会移动,而文字会往右移动。退格、CTRL-WCTRL-U 同样反向工作。 CTRL-B 切换 'revins' 选项。在替换模式下,'revins' 没有效果。必须在编译时打开这 一功能。 退格键和 CTRL-D 一样可以用来删除自动的缩进。 如果 'backspace' (bs) 选项包含 "eol",你可以在换行符上退格、CTRL-UCTRL-W。 如果 'backspace' 选项包含了 "start",你可以在插入的开始处退格。 如果置位了 'paste' 选项,一些选项被复位,而且插入模式和缩写的映射被禁止。这允 许在窗口系统里粘贴文本不会产生以外的效果。如果复位 'paste' 选项,旧的选项值重 新恢复。 CTRL-T/CTRL-D 总是插入/删除当前行的一个缩进,不管光标处于何列。 CTRL-@ (插入上次输入过的文本) 总能工作 (Vi: 只有在作为首个字符输入时)。 CTRL-ACTRL-@ 类似,但不离开插入模式。 CTRL-R {register} 可以用来插入寄存器的内容。 如果置位了 'smartindent' 选项,C 程序会更好的自动缩进,'cindent' 则做得更多。 CTRL-YCTRL-E 可以用来从当前光标位置的上/下复制字符。 CTRL-V 之后,你可以输入三个十进制数字。该字节作为单个字符插入在文本里。这可以 用来输入你的键盘上没有的国际字符。 打开 'expandtab' (et) 选项,使得 <Tab> 被扩展为合适数量的空格。 窗口总是反映缓冲区的内容 (Vi 在改变文本和其他一些情况下并不如此)。 如果 Vim 编译时定义了 DIGRAPHS,就能支持二合字母。已经包含了一组常用的二合字 母。它们可以用 ":digraph" 显示。用 ":digraph {char1}{char2} {number}" 可以定义 更多。二合字母本身以 "CTRL-K {char1} {char2}" 或 "{char1} BS {char2}" 输入 (后 者只有在打开 'digraph' 选项时)。 在重复插入时,例如 "10atest <Esc>",vi 只会处理首个插入的回绕边界 ('wrapmargin')。Vim 则对整体处理。 "i" 或 "a" 命令的计数用于所有文本。Vi 只针对首行。在 Vi 里, "3iabc<NL>def<Esc>" 会插入 "abcabcabc<NL>def",但 Vim 会给出 "abc<NL>defabc<NL>defabc<NL>def"。 命令行模式下: <Esc> 退出命令行但不执行之。vi 里,命令行还是会执行,这和大多数人的期待不符 (按 <Esc> 应该总是让你退回到普通模式)。要避免一些古老的宏的问题,宏中的 <Esc> 仍然执行命令行命令。如果期待 <Esc> 的输入像 vi 那样执行命令行命令,你可以如此 修正 ":cmap ^V<Esc> ^V<CR>" 通用: 'ttimeout' 选项和 'timeout' 类似,但只对光标和功能键有效,而不是普通的经过映射 的字符。'timeoutlen' 选项给出等待的毫秒数。如果 'esckeys' 选项没有置位,<Esc> 开始的光标和功能键在插入模式下不会识别。 每个终端字符串有一个选项。这可以用在 termcap 不支持或者要改变单独的字符串的场 合。 'fileformat' 选项可以设置 <EOL> 的选择: "dos" <CR><NL>、"unix" <NL> 或 "mac" <CR>。如果 'fileformats' 选项非空,Vim 试图自动检测 <EOL> 的类型,并据此设置 'fileformat' 选项。 有的系统没有任务 (job) 控制 (旧 Unix 系统和非 Unix 系统)。CTRL-Z、":stop" 或 ":suspend" 命令启动一个新的外壳。 如果 Vim 在 Amiga 上启动时没有交互窗口作为输出,则打开一个窗口 (并且 :sh 仍然 工作)。你可以用 -d 参数给出编辑的设备,例如 "-d con:20/20/600/150"。 'columns''lines' 选项可以用来设置或者取得显示的宽度和高度。 从文件的首行或者最后数行里读取选项的设置。'modelines' 选项决定尝试的行数 (缺省 为 5)。注意: 这和 Vi 版本不同,后者会执行模式行里的任何 Ex 命令 (严重的安全问 题)。 trojan-horse 如果置位了 'insertmode' 选项 (例如在 .exec 里),Vim 以插入模式启动。并且在 按了 <Esc> 以后回到这一模式。 撤销的信息保存在内存里。可用的内存限制了可以撤销的改变的数目和大小。在 Amiga 上这很少是个问题,而 Unix 和 Win32 上几乎不会。 如果置位了 'backup''writebackup' 选项: 在文件覆盖前,备份文件 (.bak) 被创 建。如果使用 "backup" 选项,覆盖后该文件得以保留。 Vim 创建 ".swp" 结尾的文件,用以存储文件的改动部分和内存放不下的内容。该文件用 于 "vim -r file",即从强行终止的编辑会话恢复。交换文件的使用可以用把 updatecount' 选项设为 0,或者以 "-n" 选项启动 Vim 来关闭。使用 'directory' 选 项把 .swp 文件放到其它地方。 Vim 在 8.3 文件名的文件系统下能正常工作。这也包括 Amiga 的 messydos 或者 crossdos 文件系统,或者 Unix 上装载 (mount) 的任何 8.3 文件系统。见 'shortname' 。 错误信息显示至少一秒钟 (Vi 的错误信息会相互覆盖)。 如果 Vim 给出 hit-enter 提示,你可以输入任何键。除了 <CR><NL><Space> 的字符都被认为是命令 (的开始)。 {Vi 只执行 ":" 开始的命令} 计数和无名寄存器的内容在改变文件后仍然记住。 "No lines in buffer" 消息是一个普通的消息,而不是错误信息。因为后者会使得映射 被非正常终止。 {Vi: 在你有机会读到之前,错误信息可能会相互覆盖} Amiga 上支持 AUX: 设备。

6. 支持的 Vi 特性 vi-features

Vim 支持几乎所有的 Vi 命令且方法基本一致。也就是置位 'compatible' 选项且 'cpoptions' 包含所有标志位。复位 'compatible' 和从 'cpoptions' 中删除标志位的 效果可在特定命令的帮助上找到。 帮助文件过去用 {Vi 无此功能} 标出 Vim 有而 Vi 没有的特性。不过,这些说明使得帮 助文件显得杂乱,我们现在反其道而行之: 以下列出 Vi 已经支持的功能。其余的均是 Vim 新加的。 Vi 支持以下的 Ex 命令: :abbreviate 输入缩写 :append 附加文本 :args 显示参数列表 :cd 改变目录;Vi: 没有 "cd -" :change 替换一行或若干行 :chdir 改变当前目录 :copy 复制行 :delete 删除行 :edit 编辑文件 :exit 同 ":xit" :file 显示或者设置当前文件名;Vi: 没有列号 :global 对匹配的行执行命令 :insert 插入文本 :join 连接行;Vi: 没有 :join, :k 设置位置标记 :list 显示行 :map 显示或者输入映射 :mark 设置位置标记 :move 移动行 :Next 转到参数列表的上一个文件 {Vi: 没有计数} :next 跳转到参数列表的下一个文件 {Vi: 没有计数} :number 显示文本行时给出行号 :open 启动打开模式 (Vim 没有实现) :pop 跳转到标签栈较旧的项目上 (仅在某些版本有) :preserve 写入所有文本到交换文件 {Vi: 也可能退出} :previous 跳转到参数列表里的上一个文件 {Vi: 仅在某此版本有} :print 显示行 :put 插入寄存器的内容到文本 :quit 退出 Vi :read 读入文件到文本 :recover 从交换文件里恢复文件 {Vi: 在有可以恢复的内容时,用另一种方式恢 复并且发送邮件} :rewind 转到参数列表的首个文件;没有 ++opt :set 显示或设置选项;但没有 `:set inv{option} :set option&`、 `:set all& :set option+=value :set option^=value` `:set option-=value` `:set option<` :shell 退到外壳程序 :source 从文件里读取 Vi 或 Ex 命令 :stop 暂停编辑器并退回外壳 :substitute 查找和替代文本;Vi: 没有 '&'、'i'、's'、'r' 或 'I' 标志位,确 认提示只支持 'y' 和 'n',没有高亮 :suspend 同 ":stop" :t 同 ":copy" :tag 跳转到标签上 :unabbreviate 删除缩写 :undo 撤销最近的改变 {Vi: 只有一层} :unmap 删除映射 :vglobal 对不匹配的行,执行命令 :version 显示版本号和其它信息 :visual 同 ":edit",但关掉 "Ex" 模式 :wq 写回文件,然后退出 Vi :write 写回文件 :xit 如果缓冲区被改动,写入之。然后退出 Vi :yank 抽出行到寄存器 :z 显示一些行 {Vi: 不是所有版本都有} :! 过滤行,或可通过外部命令执行之 :" 注释 :# 同 ":number" :* 执行寄存器的内容 :& 重复上次的 ":substitute" :< 将行左移一个 'shiftwidth' := 显示光标所在的行号 :> 将行右移一个 'shiftwidth' :@ 执行寄存器的内容;但没有 :@ (译者注: 原文如此,或指 :@: ); :@@ 只有某些版本有 这些命令的共同点是 Vi 不支持 :edit 和其它打开文件的命令的 ++opt 参数。 Vi 支持以下的普通模式命令: 备注: 参见 normal-index 的开始处说明描述文本中的 WORD,N,Nmove 等的含义。 CTRL-B 反向 (Back) 滚动 N 屏 CTRL-C 终止当前的 (搜索) 命令 CTRL-D 向下 (Down) 滚动 N 行 (缺省: 半屏);Vim 滚动 'scroll' 屏幕行, Vi 滚动文件行;有行回绕时两者会有差异 CTRL-E 向上滚动 N 行 (附加 (Extra) N 行) CTRL-F 向前 (Forward) 滚动 N 屏 CTRL-G 显示当前文件名和位置 <BS> 同 "h" CTRL-H 同 "h" <NL> 同 "j" CTRL-J 同 "j" CTRL-L 重画屏幕 <CR> 光标移到 N 行下面的首个 CHAR 上 CTRL-M<CR> CTRL-N 同 "j" CTRL-P 同 "k" CTRL-R 在有些 Vi 版本中: 同 CTRL-L CTRL-T 跳转到标签列表的第 N 个较老的标签 (Tag) CTRL-U 上滚 (Upwards) N 行 (缺省: 半屏) {Vi 使用文件行而 Vim 滚动 'scroll' 屏幕行;有行回绕时两者会有差异} CTRL-Y 下滚 N 行 CTRL-Z 暂停程序 (或者启动新的外壳) CTRL-] :ta 到光标所在的标识符 {Vi: 光标之后的标识符} CTRL-^ 编辑轮换文件 {Vi: 没有计数} <Space> 同 "l" ! 通过 {filter} 命令过滤 Nmove 文本 !! 通过 {filter} 命令过滤 N 行 " 指定下次删除、抽出或放置使用的寄存器 {a-zA-Z0-9.%#:-"} (大写用 于添加) ({.%#:} 只能用于放置) $ 光标移动到往下第 N 行的行尾之后 % 查找本行后一个 (花/方) 括号,并转到其匹配的括号上,或者转到匹 配的注释配对上,或者转到匹配的预处理命令上 (Vi: 不支持计数) & 重复前次 :s ' 跳转到位置标记 (Vi: 只有小写位置标记) ( 光标回退 N 个句子 ) 光标前移 N 个句子 +<CR> , 反方向重复最近的 f、t、F 或 T N 次 - 光标移动到上方 N 行的首个 CHAR 上 . 重复最近的改变,其计数被 N 取代 / 正向搜索第 N 次出现的 {pattern} 0 光标移动到本行的首个字符上 : 开始进入 Ex 命令 ; 重复最近的 f、t、F 或 T N 次 < 左移 Nmove 文本行一个 'shiftwidth' << 左移 N 行一个 'shiftwidth' = 通过 "indent" 过滤 Nmove 文本行 == 通过 "indent" 过滤 N 行 > 右移 Nmove 文本行一个 'shiftwidth' >> 右移 N 行一个 'shiftwidth' ? 反向搜索第 N 次出现的 {pattern} @ 执行 {a-z} 寄存器的内容 N 次 {Vi: 只有命名寄存器} @@ 重复上次的 @{a-z} N 次 A 在行尾附加文本 N 次 B 光标回退 N 个 WORD (字串) C 从光标位置到行尾部分进行修改 D 删除位置到行尾部分,再加上 N-1 行的字符 [到寄存器 x];同 "d$" E 光标前移到第 N 个 WORD 的结束处 F 光标左移到第 N 次出现的 {char}G 光标移动到第 N 行,缺省是末行 H 光标移动到屏幕顶部开始算的第 N 行 I 在本行首个 CHAR 之前插入文本 N 次 J 连接 (Join) N 行;缺省为 2 L 光标移动到屏幕底部开始算的第 N 行 M 光标移动到屏幕的中间一行 N 反方向重复最近的 '/' 或 '?' N 次 O 在光标上方开始一个新行,并插入文本,重复 N 次 {Vi: 清空 [count] 个屏幕行} P 在光标放置文本 [到寄存器 x] N 次 {Vi: 没有计数} Q 切换到 "Ex" 模式 R 进入替换模式: 覆盖存在的字符,重复输入文本 N-1 次 S 删除 N 行 [到寄存器 x] 并开始输入;同 "cc" T 光标移动到左侧第 N 次出现的 {char} 之前 U 撤销一行内所有最近的改变 {Vi: 仅当这些修改不超出最近作改变那行的范围} W 光标前移 N 个 WORD X 删除光标前的 N 个字符 [到寄存器 x] Y 抽出 N 行 [到寄存器 x];同 "yy" ZZ 如果修改过,保存当前文件,然后退出 [[ 光标后退 N 个小节 [] 光标后退 N 个 SECTION ^ 光标移动到本行的首个 CHAR 上 _ 光标移动到下方第 N - 1 行的首个 CHAR 上 ` 光标移动到位置标记 {a-zA-Z0-9} a 在光标处附加文本 N 次 b 光标回退 N 个单词 c 删除 Nmove 文本 [到寄存器 x] 并开始插入 cc 删除 N 行 [到寄存器 x] 并开始插入 d 删除 Nmove 文本 [到寄存器 x] dd 删除 N 行 [到寄存器 x] e 光标前移到第 N 个单词的结束处 f 光标右移到第 N 次出现的 {char}h 光标左移 N 个字符 i 在光标前插入文本 N 次 j 光标下移 N 行 k 光标上移 N 行 l 光标右移 N 个字符 m 在光标位置处设置位置标记 {A-Za-z} n 重复最近的 '/' 或 '?' N 次 o 在光标下方开始一个新行,并插入文本 {Vi: 清空 [count] 个屏幕行} p 在光标后放置文本 [从寄存器 x] N 次 {Vi: 没有计数} r{char} 替换 N 个字符 {Vi: CTRL-V <CR> 还是换成换行符。没有 办法换成 <CR>} s (替换) 删除 N 个字符 [到寄存器 x] 并开始插入 t 光标移动到右侧第 N 次出现的 {char} 之前 u 撤销改变 {Vi: 只有一层} w 光标前移 N 个单词 x 删除光标开始的 N 个字符 [到寄存器 x] y 抽出 Nmove 文本 [到寄存器 x] yy 抽出 N 行 [到寄存器 x] z<CR> 光标移动到窗口的顶行 z- 光标移动到窗口末行 z+ 光标移动到第 N 行 z^ 光标移动到第 N 行 { 光标回退 N 个段落 | 光标移到第 N 列 } 光标前移 N 个段落 ~ 切换光标所在处开始的 N 个字符的大小写;Vim: 取决于 'tildeop' {Vi: 没有计数,没有 'tildeop'} <Del> 同 "x" Vi 的插入模式支持以下的命令: CTRL-@ 插入最近插入的文本并停止插入 {Vi: 仅当敲入首个字符时,而且只限于前 128 个字符} CTRL-C 退出插入模式,不检查缩写,除非置位了 'insertmode'CTRL-D 在当前行删除一个 shiftwidth 的缩进 {Vi: CTRL-D 只有在使用自动缩进之后才有效} <BS> 删除光标前的字符 {Vi: 不删除自动的缩进,不会跨行,不会删除插入 开始位置之前的内容} CTRL-H<BS> <Tab> 插入 <Tab> 字符 CTRL-I<Tab> <NL><CR> CTRL-J<CR> <CR> 开始新行 CTRL-M<CR> CTRL-T 在当前行插入一个 shiftwidth 的缩进 {Vi: 只有在缩进内部才能用} CTRL-V {char} 按本义插入下一个非数字字符 {Vi: 没有十进制字节输入} CTRL-W 删除光标前的单词 CTRL-Z 'insertmode' 打开时: 暂停 Vi <Esc> 结束插入模式 (除非打开了 'insertmode') CTRL-[<Esc> 0 CTRL-D 删除当前行的所有缩进 ^ CTRL-D 删除当前行的所有缩进,在下一行恢复删除的缩进 <Del> 删除光标所在的字符 Vi 支持以下的选项: 'autoindent' 'ai' 根据上一行决定新行的缩进 {Vi 稍有不同: 输入 <Esc><CR> 删除缩进后,上下 移动把光标放在删除的缩进之后;Vi 则把光标放在已删 除的缩进的某处} 'autowrite' 'aw' 有改动时自动写回文件 'directory' 'dir' 交换文件所用的目录名列表 {Vi: 放置临时文件的目录,缺省为 "/tmp"} 'edcompatible' 'ed' 切换 ":substitute" 命令的标志位 'errorbells' 'eb' 有错误信息时响铃 'ignorecase' 'ic' 搜索模式时忽略大小写 'lines' 显示屏幕的行数 'lisp' 自动 lisp 缩进 {Vi: 行为略有不同} 'list' 显示 <Tab><EOL> 'magic' 改变搜索模式所用的特殊字符 'modeline' 'ml' 在文件开头或结尾识别模式行 {Vi: 部分版本称为 modelines} 'number' 'nu' 行前显示行号 'paragraphs' 'para' 分隔段落的 nroff 宏 'prompt' 'prompt' Ex 模式打开提示 'readonly' 'ro' 禁止写入缓冲区 {Vim 用 :view 编辑文件时置位 'readonly'} 'remap' 允许映射可以递归调用 'report' 报告行改变的行数下限 'scroll' 'scr'CTRL-UCTRL-O 滚动的行数 'sections' 'sect' 分隔小节的 nroff 宏 'shell' 'sh' 使用外部命令的外壳程序名字 'shiftwidth' 'sw' (自动) 缩进使用的步进单位,以空白数目计 'showmatch' 'sm' 插入括号时短暂跳转到匹配的括号 'showmode' 'smd' 在状态行上显示当前模式的消息 'tabstop' 'ts' <Tab> 在文件里使用的空格数 'taglength' 'tl' 标签里的有效字符数 'tags' 'tag' 标签命令使用的文件名列表 {Vi: 缺省是 "tags /usr/lib/tags"} 'tagstack' 'tgst' 把标签推入标签栈 {仅有部分 Vi 版本支持} 'term' 终端名 'terse' 简化部分消息 'timeout' 'to' 映射和键盘代码等待超时 'timeoutlen' 'tm' 超时时间 (以毫秒计) {Vi: 仅在某些版本上有} 'ttytype' 'tty' 'term' 的别名 'verbose' 'vbs' 给出详细信息 {Vi 仅在有些版本会有布尔型的选项} 'warn' 当缓冲区改变时,对外壳命令给出警告 'window' 'wi' CTRL-FCTRL-B 滚动的行数 {Vi 也用此选项指定显示的行数} 'wrapmargin' 'wm' 使 (硬) 回绕开始的从右侧起算的字符数 {Vi: 行为不同,可用性也差} 'wrapscan' 'ws' 搜索在文件尾折回文件头 'writeany' 'wa' 写入文件不需 "!" 强制 另见 missing-options

7. 命令行参数 cmdline-arguments

不同版本的 Vi 有不同的命令行参数。这会引起混乱。为了帮助你,本节给出这些差别的 概述。 这里考虑五个 Vi 的不同版本: Elvis Elvis 2.1b 版本 Nvi Nvi 1.79 版本 Posix Posix 1003.2 Vi Vi 3.7 版本 (Sun 4.1.x 版本) Vile Vile 7.4 版本 (不完整) Vim Vim 5.2 版本 只有 Vim 支持在文件名之间和之后接受选项。 +{command} Elvis、Nvi、Posix、Vi、Vim: 和 "-c {command}" 相同。 - Nvi、Posix、Vi: 在批处理模式下运行 Ex。 Vim: 从标准输入读取文件 (批处理模式用 -s)。 -- Vim: 选项结束,其后的全被解释为文件名。 --cmd {command} Vim: 在执行 vimrc 文件前执行 {command} 命令。 --echo-wid Vim: GTK+ 在标准输出回显窗口 ID。 --help Vim: 显示帮助信息并退出。 --literal Vim: 按本义接受文件名,不扩展通配符。 --nofork Vim: 和 -f 相同。 --noplugin[s] Vim: 跳过插件的载入。 --remote Vim: 在另外一个 Vim 服务器编辑文件 --remote-expr {expr} Vim: 在另外一个 Vim 服务器执行 {expr} --remote-send {keys} Vim: 发送键序列 {keys} 到 Vim 服务器并退出 --remote-silent {file} Vim: 如有可能,在另外一个 Vim 服务器编辑文件 --remote-wait Vim: 在另外一个 Vim 服务器编辑文件,并等待之 --remote-wait-silent Vim: 和 --remote-wait 类似,但如果不可能不会抱怨 --role {role} Vim: GTK+ 2: 设置主窗口的角色 --serverlist Vim: 输出 Vim 服务器的列表并退出 --servername {name} Vim: 指定 Vim 服务器名 --socketid {id} Vim: 运行 Vim 的 GTK 窗口套接字 --windowid {id} Vim: 运行 Vim 的 Win32 窗口号 --version Vim: 显示版本信息并退出。 -? Vile: 显示使用小结并退出。 -a Elvis: 同一个窗口载入所有指定的文件 (Vim 使用 -o)。 -A Vim: 以阿拉伯语模式启动 (如果编译时加入阿拉伯语功能)。 -b {blksize} Elvis: 会话文件使用 {blksize} 块大小。 -b Vim: 置位 'binary' 模式。 -C Vim: 兼容模式。 -c {command} Elvis、Nvi、Posix、Vim: 在载入编辑缓冲区后,运行 Ex 命令 {command}。 Vim: 允许至多 10 个 "-c" 参数 -d {device} Vim: 使用 {device} 作为 I/O (仅限于 Amiga) {仅当编译时加入 +diff 特性才有效} -d Vim: 开始时置位 'diff'vimdiff -dev {device} Vim: 使用 {device} 作为 I/O (仅限于 Amiga)。 -D Vim: 调试模式。 -e Elvis、Nvi、Vim: 以 Ex 模式启动,就像可执行程序叫 "ex" 那样。 -E Vim: 以改进的 Ex 模式启动 gQ ,就像 "exim" 那样。 -f Vim: 在前台运行 GUI (Amiga: 不打开新窗口)。 -f {session} Elvis: 使用 {session} 作为会话文件。 -F Vim: 以波斯语模式启动 (如果编译时加入波斯语功能)。 Nvi: 快速启动,编辑开始时不读入整个文件。 -G {gui} Elvis: 使用 {gui} 作为用户界面。 -g Vim: 启动 GUI。 -g N Vile: 开始编辑第 N 行 -h Vim: 给出帮助消息。 Vile: 编辑帮助文件 -H Vim: 以希伯来语模式启动 (如果编译时加入该功能的话)。 -i Elvis: 以插入模式开始编辑每个窗口。 -i {viminfo} Vim: 使用 {viminfo} 作为 viminfo 文件。 -L Vim: 和 "-r" 相同 {Vi: 只在某些版本里存在: "List recoverable edit sessions"}。 -l Nvi、Vi、Vim: 置位 'lisp''showmatch' 选项。 -m Vim: 修改不允许被写入,复位 'write' 选项。 -M Vim: 不允许修改,复位 'modifiable''write' 选项。 -N Vim: 非兼容模式。 -n Vim: 不用交换文件。 -nb[args] Vim: 打开一个 NetBeans 接口连接 -O[N] Vim: 和 -o 类似,但使用垂直分割的窗口。 -o[N] Vim: 打开 [N] 个窗口,或者每个文件一个。 -p[N] Vim: 打开 [N] 个标签页,或者每个文件一个。 -P {parent-title} Win32 Vim: 在父应用窗口内部打开 Vim -q {name} Vim: 使用快速修复错误文件 {name}。 -q{name} Vim: 同上。 -R Elvis、Nvi、Posix、Vile、Vim: 置位 'readonly' 选项。 -r Elvis、Nvi、Posix、Vi、Vim: 恢复模式。 -S Nvi: 置位 'secure' 选项。 -S {script} Vim: 在启动后执行 script 脚本。 -s Nvi、Posix、Vim: 在 Ex 模式时,和 "-" 相同 (安静模式)。 Elvis: 置位 'safer' 选项。 -s {scriptin} Vim: 读入 {scriptin} 脚本文件;只有在非 Ex 模式下才有效。 -s {pattern} Vile: 搜索 {pattern} -t {tag} Elvis、Nvi、Posix、Vi、Vim: 编辑包含 {tag} 的文件。 -t{tag} Vim: 同上。 -T {term} Vim: 设置终端名为 {term}。 -u {vimrc} Vim: 从 {vimrc} 文件读入初始化设置。 -U {gvimrc} Vim: 从 {gvimrc} 文件读入 GUI 初始化设置。 -v Nvi、Posix、Vi、Vim: 以普通模式启动 (Vi 的术语是可视模式 (Visual))。 Vile: 阅读模式,不允许修改。 -V Elvis、Vim: 详细模式。 -V{nr} Vim: 指定特定级别的详细模式。 -w {size} Elvis、Posix、Nvi、Vi、Vim: 设置 'window' 的值为 {size}。 -w{size} Nvi、Vi: 和 "-w {size}" 相同。 -w {name} Vim: 写入脚本文件 {name} (必须以非数值字符启动)。 -W {name} Vim: 附加到脚本文件 {name} 里。 -x Vi、Vim: 要求输入加密密钥。见 encryption 。 -X Vim: 不连接到 X 服务器。 -y Vim: 以简易模式启动,类似于 evim 。 -Z Vim: 受限模式 @{cmdfile} Vile: 使用 {cmdfile} 作为启动文件。

8. POSIX 相容性 posix posix-compliance

2005 年,运行了 POSIX 测试包以对 Vim 的相容性进行了检查。大多数测试都能正确执 行。有一些行为 Vim 和 POSIX 不相容,即使运行于 Vi 兼容模式也是如此。 $VIM_POSIX Vim 启动时设置 $VIM_POSIX 环境变量会使得 'cpoptions' 包含 POSIX 的标志位。这使 Vim 尽可能地照 POSIX 方式运行。这和 Vi 兼容模式稍有不同。 这里可以找到 Posix 的 Vi 规格: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html 还有相关的 Ex 规格: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html 这里是 Vim 和 POSIX 指定行为不同之处以及原因: posix-screen-size 如果终端获得的屏幕大小信息更加可靠,Vim 忽略 $COLUMNS 和 $LINES 环境变 量。在 'cpoptions' 里加入 '|' 标志位使 $COLUMNS 和 $LINES 可以否决另一 种方式获得的大小。 在原来的 Vi 上,"{" 和 "}" 命令不停在 "{" 上,但 POSIX 指定应该如此。 如果你希望 POSIX 方式,在 'cpoptions' 里加入 '{' 标志位。 "D"、"o" 和 "O" 命令接受计数,它们被重复时也是如此。 如果你希望忽略计数,在 'cpoptions' 里加入 '#' 标志位。 如果 'cpoptions' 里加入 '.' 标志位,那么当前缓冲区被修改时 ":cd" 命令 失败。 如果 'shortmess' 里加入 "A" 标志位,没有 ATTENTION 消息。 以下是运行 POSIX 测试包相关的评注: - vi 测试 33 有时因为不明原因失败 - vi 测试 250 失败;新版本的行为会有改变 http://www.opengroup.org/austin/mailarchives/ag-review/msg01710.html (链接不再有效,或许现在应是: https://www.opengroup.org/sophocles/show_mail.tpl?CALLER=show_archive.tpl&source=L&listname=austin-review-l&id=1711) - vi 测试 310 失败;任何错误出现时返回代码必须非零? - ex 测试 24 失败,因为测试有问题。SUSv2 和 SUSv3 之间已修改。 - ex 测试 47、48、49、72、73 失败,因为安静模式下不读入 .exrc 文件也不使用 $EXINIT。 - ex 测试 76、78 失败,因为使用 echo 代替了 printf。(已修正) 另: \s 没有被换成空格的问题。 - ex 测试 355 失败,因为 'window' 不在 "30z" 里应用。 - ex 测试 368 失败,因为外壳命令在安静模式下不回显。 - ex 测试 394 失败,因为 "=" 命令输出在安静模式下不可见。 - ex 测试 411 失败,因为测试文件不正确,包含了多余的 ':'。 - ex 测试 475 和 476 失败,因为 reprint 输出在安静模式下不可见。 - ex 测试 480 和 481 失败,因为标签文件使用空格而不是制表。 - ex 测试 502 失败,因为安静模式下不读入 .exrc。 - ex 测试 509 失败,因为安静模式下不读入 .exrc。而且退出代码是 1 而不是 2。 - ex 测试 534 失败,因为安静模式下不读入 .exrc。 vim:tw=78:ts=8:noet:ft=help:norl: