vi_diff

vi_diff.txt 适用于 Vim 9.2 版本。 最近更新: 2026年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 9. 支持的操作系统 os-support

1. 模拟命令 simulated-command

该命令原生存在于 Vi,Vim 仅模拟实现: :o :op :open :[range]o[pen] 类似 :visual : 退出 Ex 模式。 {Vi: 在打开模式开始编辑} :[range]o[pen] /pattern/ 同上,另移动光标到当前行 "pattern" 的匹配列。 Vim 不支持 Vi 的 "打开" (open) 模式,因为并无实用价值。对比原 Vi 中 ":open" 进 入打开模式的场景,Vim 会退出 Ex 模式并回到普通模式,此时仍可执行相同编辑命令, 但会刷新整屏,而非仅刷新一行。 (译者注: Vi 的打开模式主要用于只有单行显示的硬拷贝终端,移动光标时会重绘整行)

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 无法动态修改终端能力项,必须退出 Vi,编辑终端能力项后再重新进入。Vim 则有 terminal-options 终端相关选项。

3. 限制 limits

Vim 对可编辑的文件的限制很少,见下 {Vi: 无法处理 <Nul> 字符和值超过 128 的字符,单行长度受限,还有众多其他限制}。 最大行长 2147483647 个字符。更长的行会被拆分。 最大行数 2147483647 行。 最大文件大小 长整型为 32 位时,2147483647 字节 (2 千兆)。64 位的 长整型的上限更大。同时也受 swap-file 可用磁盘可用 空间限制。 E75 文件路径长度 Unix 和 Win32: 1024 字符,其余系统 256 字符 (或系统 支持上限)。 展开后字符选项长度 Unix 和 Win32: 1024 字符,其余系统 256 字符 最大显示宽度 Unix 和 Win32: 1024 字符,其余系统 255 字符 映射左侧序列最大长度 50 个字符。 不同高亮类型数量: 超过 30000 数值类型范围: -2147483648 到 2147483647 (64 位系统范围更大) 另见 v:numbermax 、 v:numbermin 和 v:numbersize 标签文件单行最大长度: 512 字节。 E1541 /\U 和 /\%U 上限: 2147483647 (32 位整数)。 撤销信息和寄存器内文本要在内存保存,执行大规模修改时,可用 (虚拟) 内存量会限制 撤销层数寄存器文本可保存量。命令行历史、快修模式错误信息等也会占用内存。 内存使用限制

'maxmem' ('mm') 选项设置单个缓冲区可用的最大内存 (以千字节为单位)。'maxmemtot' 设置所有缓冲区可用的最大内存 (以千字节为单位)。两者缺省值视系统而定。Amiga 上 'maxmemtot' 会根据可用内存自动设置。这些选项并非硬性限制,仅用于控制 Vim 何时 将文本写入交换文件。如果不想在内存紧张时使用交换文件,可将 'maxmem' 和 'maxmemtot' 设为极大值。此时交换文件仍用于崩溃恢复。要完全关闭交换文件,可将 'updatecount' 设为 0,或在启动 Vim 时加上 -n 参数。

4. 特色新增功能 vim-additions

Vi 兼容性。 'compatible' Vim 虽有 99% 兼容 Vi,但 Vi 的部分行为可看作缺陷,至少存在优化空间。 Vim 启动时缺省会尽可能贴近原生 Vi 的行为。想要启用 Vim 增强特性,需要 关闭兼容模式: :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)。设为 0 时,和 Vi 保持兼容,仅一级撤销。设 为 -1 时,完全关闭撤销。 缓冲区全部更改都撤销完毕后,缓冲区不再标记为已修改,可直接 :q 退出, 无需加 <!>。 撤销若干更改后再做新更改,Vim 会生成撤销树分支。可回溯到文本任意历史状 态,不会因为新更改永久丢失旧文本。 undo-tree 开启 'undofile' 选项后,撤销信息会保存到文件。退出 Vim 后再次打开同一 文件,依然可以撤销上次退出前的修改。 图形界面 (GUI)。 gui 内置 GUI 支持: 菜单、鼠标、滚动条等。可自定义菜单。对 Ctrl/Shift/Alt 加特殊键与鼠标支持更完善。支持 X11 (Motif、GTK)、Win32 (Windows XP 及 以上)、Amiga、Macintosh。 多窗口与多缓冲区。 windows.txt Vim 可分割屏幕为多个窗口,每个窗口编辑不同缓冲区或同一缓冲区的不同位 置。缓冲区可被加载并修改但不在窗口显示,称为隐藏缓冲区。多窗口与多缓冲 区机制配套大量相关命令与选项。 tab-page Vim 还支持多标签页,每个标签页可包含一个或多个窗口,标签栏可用于快速切 换标签页。 终端窗口。 :terminal Vim 可创建内置终端模拟器窗口,用于运行任意命令、外壳、调试器。 语法高亮。 :syntax Vim 可对关键字、匹配模式等进行高亮。通过一系列 :syntax 命令定义,支 持绝大多数编程语言与文件类型。自带 C、C++、Java、Pascal、Makefile、 外壳脚本等常用文件的高亮规则。高亮配色可通过 :highlight 命令,分别为 普通终端、彩色终端、GUI 设定。也可用 :colorscheme 配色方案一键切换。 高亮文本可导出到 HTML。 convert-to-HTML 其他高亮功能包括,搜索结果高亮 'hlsearch'、匹配括号高亮 'matchparen'、 光标行或光标列高亮 'cursorline'、'cursorcolumn'。 文本属性。 textprop.txt Vim 支持插件添加文本高亮。通过 prop_type_add() 定义属性类型, prop_add() 放置文本属性。 拼写检查。 spell 开启 'spell' 选项后,Vim 会高亮拼写错误。通过 'spelllang' 选择语言,目 前支持约 50 种语言。源码文件中仅注释和字符串会进行拼写检查。 代码折叠。 folding 多行文本可显示为单个 "折叠" 行,方便总览文件、快速移动代码块。折叠方式 支持手动创建、语法解析、缩进等。 比较模式。 diff Vim 展示两个文件版本,并高亮两者的差异。相同文本被折叠隐藏。支持命令在 两个版本之间搬运文本。 插件。 add-plugin 将插件文件放到对应目录即可扩展功能,方便使用他人编写的 Vim 脚本。插件 可全局生效,也可限定特定文件类型。 插件包机制 (packages) 进一步简化插件管理。 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 可视模式先高亮选中一段文本,再执行命令处理选中内容。这是一种更易用的方 式,替代先输入操作符,再移动光标选定操作终点的做法。 v 与 V 用于进入可视模式: v 按字符选择, V 按行选择。移动光标扩 展选区,屏幕上高亮显示。按 "o" 可切换并移动选区的另一端。可作用于可视 选区的操作符: d 删除 c 修改 y 抽出 > 或 < 插入和删除缩进 ! 通过外部程序过滤 = 使用排版机制过滤 : 对选中行执行 : 命令。 gq 按 'textwidth' 宽度排版文本 J 合并多行 ~ 大小写互换 u 切换为小写 U 切换为大写 {Vi 不包含可视模式。Vi的 "visual" 一词专指普通模式,用于区分 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-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 全能补全: 针对特定文件类型的智能补全 i_CTRL-X_CTRL-R 寄存器中的内容 等。 长行支持。 'wrap' 'linebreak' 关闭 'wrap' 选项时,长行不会自动回绕,仅显示局部内容。光标移至未显示区 域时,屏幕将水平滚动。最小水平滚动列数由 'sidescroll' 设定。 zh 、 zl 命令左右水平滚动。 另一种方式是开启 'linebreak' 选项,长行会在单词之间断行。便于编辑单行 段落 (例如后续交由排版软件 DTP 处理)。 gk 、 gj 命令上下移动光标。 文本格式化 (排版)。 formatting 'textwidth' 选项可自动限制行长度。它是 Vi 旧选项 'wrapmargin' 的改良替 代,后者实用性较差。 gq 操作符用于格式化文本块 (例如 gqap 格式化当 前段落)。文本对齐命令有: :center 、 :left 、 :right 。 扩展搜索模式。 pattern 搜索模式内,提供大量新增元字符,匹配各类文本项目。示例: - "\n" 匹配换行符。 - "x\{2,4}" 匹配连续 2 至 4 个 x。 - "\s" 匹配单个空白字符。 目录、远程与压缩包浏览。 netrw Vim 可浏览文件系统,直接编辑目录即可进入。可用常规命令在列表项间移动, <Enter> 打开光标下目录或文件。 也支持通过 ftp、http、ssh 等协议访问远程文件。 还可直接浏览 zip、tar 压缩包。 tar zip 加快编辑-编译-编辑循环。 quickfix :make 命令执行编译,并跳转至首个错误。Vim 解析编译器报错文件,自动定 位首条错误。 Vim 逐行扫描错误文件,提取文件名、行号与错误信息。'errorformat' 选项可 配置一组类似 scanf 的字符串模板,适配多种编译器输出。 :cn 跳转至下一处错误。 :cl 列出全部报错信息,另有其他配套命令。 'makeef' 选项存放报错日志文件名。 'makeprg' 存放 :make 所调用的外部程序名。 'shellpipe' 存放把编译器输出写入错误文件所用的字符串。 在多文件内查找匹配项。 :vimgrep Vim 可跨文件搜索正则模式。使用 Vim 原生高级正则,全平台可用,也支持在 压缩文件内搜索。 程序增强缩进。 'cindent' 开启 'cindent' 选项时,自动调整每行缩进,可识别大部分 C 语言语法。 'cinoptions' 设置各类缩进风格。'cinkeys' 设置触发自动缩进的按键。 注释可自动格式化。'comments' 选项配置注释起止标识。对 C 代码效果最佳, 也适用于邮件 (行首 '>') 与其他文本。 = 操作符可重新缩进多行。 很多其他语言配套缩进插件,提供自动缩进。 30.3 在头文件中搜索单词。 include-search [i 命令可在当前文件及所有头文件中,搜索光标下单词的匹配项。'include' 选项配置描述文件包含指令的匹配模式 (缺省适配 C 语言)。 [I 列出全部匹配结果; [_CTRL-I 跳转到匹配位置。 [d 、 [D 、 [_CTRL-D 功能类似,但仅匹配 'define' 选项所指定模式对应 的行 (常用于查找 C 语言中的宏),而非任意单词。 自动命令。 autocommand 可在读取文件、写入文件、切换缓冲区等事件,依据文件名自动执行命令。 适合为 C 程序、文档、纯文本、邮件等单独配置选项与映射;也由此实现压缩 文件直接编辑。 脚本与表达式。 expression 新增命令构成一套功能完备的脚本语言。 :if 条件执行,例如可依据 $TERM 值设置选项。 :while 循环执行多条命令。 :for 遍历列表循环。 :echo 输出表达式求值结果。 :let 为内部变量、选项等赋值。支持数值、字符串、列表、字典等 变量类型。 :execute 执行由表达式构造生成的命令。 :try 捕获异常。 诸如此类,详见 eval 。 支持脚本调试与性能分析。 debug-scripts profile 如果原生脚本仍不符合要求,可对接 Python 、 Ruby 、 Tcl 、 Lua 、 Perl 、 MzScheme 等语言脚本。 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" 打开 4 个窗口。 Vi 需要多条终端能力项才能全屏工作。Vim 仅需 "cm" (光标移动) 项。 命令模式 (普通模式) 下: 开启 'showcmd' 时,命令字符会显示在屏幕末行;命令结束后自动清除。 开启 'ruler' 时,屏幕末行显示光标当前位置。 离开最近更改行或执行 u 撤销后, U 命令依旧可用。 可显示第 8 位置位的字符。'~' 到 0xa0 之间的字符 (除非被纳入 'isprint' 选项) 缺 省显示为 "~?"、"~@"、"~A" 等形式。 ][ 跳转至下一个 C 函数结束处 (出现在首列的 '}')。 [] 跳转至上一个 C 函数结束处 (出现在首列的 '}')。 ]f 、 [f 、 gf 打开光标下文件名对应的文件。'CTRL-W f' 先分割窗口再打开。 * 正向搜索光标下关键字; # 反向搜索。 K 调用 'keywordprg' 选项指定的程序,以光标下标识符作为参数。 % 前面可附加计数 N% 。光标将跳转到文件内对应百分比的行。 % (无计数) 原有的 匹配括号跳转功能会跳过引号内部的括号。 使用 CTRL-] 时,光标可处于标识符中间。 访问过的标签会被记录。标签栈相关命令: CTRL-T 、 :pop 、 :tag 。 :tags 列出标 签栈。 Vi 搜索标签时会使用 'wrapscan'。跳转到另一文件的标签时,Vi 从该文件第 2 行开始 检索。如果关闭 'wrapscan',就无法找到该文件第 1 行的标签。 'tags' 选项为标签文件名列表,因此支持多个标签文件。文件名以 "./" 开头时,"./" 会被替换为当前文件所在路径。可直接使用和正在编辑文件同目录下的 tags 文件。 {Vi: 部分版本始终采用二分查找} {Vi 没有对标签文件内命令做安全防护} 已访问文件名保存在轮换文件列表。 CTRL-^ 可带计数,指定列表索引。 :files 命令展示轮换文件列表。 "#<N>" 会被替换为列表中第 N 个轮换文件名。 "#<" 会被替换为不带扩展名的当前文件名。 搜索模式能力更强。<NL> 可作为 :s 的搜索模式与替代串的一部分。Vi 将其视作命令 结束符。 搜索模式可将光标置于匹配文本末尾,并支持字符偏移。 ~ 、 :next 、 :Next 、 n 、 N 都支持附加计数。 开启 'autowrite' 时, :next! 不会写入文件。Vi 会写入文件,这被认定为漏洞: 不 符合用户预期,且 :rewind! 也不会触发写盘。 Vi 替换模式中,仅开启 '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 列出全部位置标记。 '] 和 `] 跳至上一次 操作或放置命令插入文本的末尾; '[ 和 `[ 则跳至相应起始位置。 {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-W、CTRL-U 操作方向同样反转。CTRL-B 切换 'revins' 开关;替换模式下该选项无效。此功能需要编译时启用。 退格键可像 CTRL-D 一样删除自动缩进。 如果 'backspace' (简写 'bs') 选项包含 "eol",退格、CTRL-U、CTRL-W 可跨换行符执 行删除;如果包含 "start",可退格越过本次插入的起始位置。 开启 'paste' 选项时,复位若干选项,并禁用插入模式映射与缩写。方便在窗口系统粘 贴文本,避免异常。关闭 'paste' 时,恢复原有选项值。 CTRL-T / CTRL-D 始终在当前行增 / 删缩进,不受光标所在列影响。 CTRL-@ (插入上一次录入文本) 随时可用 (Vi: 仅作为首字符输入才生效) 。 CTRL-A 作用类似 CTRL-@,但执行后不退出插入模式。 CTRL-R {寄存器} 插入指定寄存器内容。 开启 'smartindent' 时,C 代码自动缩进效果更佳;启用 'cindent' 缩进支持更强大。 CTRL-Y、CTRL-E 分别复制光标上方、下方的单个字符。 按下 CTRL-V 后输入三位十进制数,会将对应字节值作为单个字符插入文本。适合录入键 盘无对应的多语种字符。 开启 'expandtab' (简写 'et') 时,<Tab> 自动扩展为对应数量的空格。 窗口内容与缓冲区始终保持同步 (Vi 在文本修改等场景无法做到) 。 编译时启用 DIGRAPHS 后,支持二合字母。内置一组标准二合字母,可用 :digraph 查 看。可用 `:digraph {字符1}{字符2} {数值}` 自定义新二合字母。二合字母输入可用 `CTRL-K {字符1}{字符2}` 或 `{字符1} 退格 {字符2}` (后者需要 'digraph' 开启)。 重复插入时 (如 `10atest <Esc>`),Vi 仅对第一次插入应用回绕边界 'wrapmargin', Vim 则对整体处理。 i 或 a 命令附带计数时,计数作用于全部文本。Vi 仅作用于单行。 示例: 3iabc<NL>def<Esc> Vi 插入结果是 "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' 选项设定行尾符: "dos" <CR><NL>,"unix" <NL>,或 "mac" <CR>。 'fileformats' 非空时,Vim 自动检测行尾类型并设置 'fileformat'。 无作业控制的系统 (旧版 Unix 以及非 Unix 系统) , CTRL-Z 、 :stop 、 :suspend 命令会新建外壳。 Amiga 平台上,Vim 启动时如果无交互式输出窗口,会自动新建窗口 (并且 :sh 仍可 用) 。可通过 -d 参数指定编辑设备,例如 "-d con:20/20/600/150"。 'columns'、'lines' 选项读写显示区域的宽高。 Vim 会从文件首尾若干行读取 Vim 选项配置。'modelines' 选项设定检查行数,缺省 5 行。注意不同于某些 Vi 版本,Vim 不允许模式行直接执行任意 Ex 命令 (规避重大安全 风险)。 trojan-horse 开启 'insertmode' (例如在 .exrc 中设置) 时,Vim 启动直接进入插入模式;按下 <Esc> 后再次回到插入模式。 撤销信息在内存保存。可用内存决定可撤销修改的数量与大小。Amiga 上基本无压力, Unix 与 Win32 几乎不受限。 开启 'backup' 或 'writebackup' 时: 覆盖文件前,生成 ".bak" 备份。开启 'backup' 则覆盖后备份文件仍会保留。 Vim 生成 ".swp" 交换文件,存放已修改或放不下内存的数据。可使用 "vim -r 文件" 从异常中断会话恢复。将 'updatecount' 设为 0,或用 -n 参数启动 Vim 可关闭交换 文件。'directory' 选项指定交换文件存放目录。 Vim 可正常处理 8.3 短文件名的文件系统,包括 Amiga 的 messydos/crossdos 文件系 统,或 Unix 下挂载的任意 8.3 文件系统。参见 'shortname'。 错误消息至少停留 1 秒 (Vi 会被后续消息立即覆盖)。 出现 hit-enter 提示时,可按任意键。除 <CR>、<NL>、<Space> 以外的字符都会识别 为命令 (的起始)。 {Vi: 仅识别以 ':' 开头的命令} 切换文件时,编号寄存器与无名寄存器内容仍被保留。 "缓冲区无内容" 为普通提示而非报错,防止映射被中断执行。 {Vi: 报错消息可能在阅读前被覆盖} 支持 Amiga 的 AUX: 设备。

6. 支持的 Vi 特性 vi-features

Vim 几乎支持全部 Vi 命令,行为大体一致。前提是开启 'compatible' 选项,并且 'cpoptions' 包含全部标志位。关闭 'compatible'、移除 'cpoptions' 中的标志位所带 来的效果,可查阅对应命令的帮助文档。 帮助文档过去会用 {Vi 无此功能} 标记 Vim 独有特性。但这类标记太多会干扰阅读,现 已改为反向标注: 以下列出 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 开启 Open 模式 (Vim 未实现) :pop 跳转到标签栈较旧的项目上 (仅部分 Vi 版本支持) :preserve 将所有文本写入交换文件 {Vi: 执行后可能直接退出} :previous 同 :Next {Vi: 仅部分版本支持} :print 显示行 :put 将寄存器内容插入文本 :quit 退出编辑器 :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 保存文件并退出编辑器 :write 保存文件 :xit 缓冲区有修改时保存。然后退出编辑器 :yank 抽出行到寄存器 :z 显示若干行 {Vi: 并非所有版本都支持} :! 过滤行,可通过外部命令执行 :" 注释 :# 同 ":number" :* 执行寄存器内容 :& 重复上次的 :substitute :< 将行左移一个 'shiftwidth' := 显示当前行号 :> 将行右移一个 'shiftwidth' :@ 执行寄存器内容;但不支持 :@ (译者注: 原文如此,或指 :@: ); :@@ 仅部分 Vi 版本支持 :edit 和其他打开文件的命令的共同点是在 Vi 中,不支持 ++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 取代 / 正向搜索 {pattern} 的第 N 次匹配 0 光标移动到本行首个字符 : 开始输入 Ex 命令 ; 重复最近的 "f"、"t"、"F" 或 "T" N 次 < 将 Nmove 文本行左移一个 'shiftwidth' 单位 << 将 N 行左移一个 'shiftwidth' 单位 = 通过 "indent" 过滤 Nmove 文本行 == 通过 "indent" 过滤 N 行 > 将 Nmove 文本行右移一个 'shiftwidth' 单位 >> 将 N 行右移一个 'shiftwidth' 单位 ? 反向搜索 {pattern} 倒数第 N 次匹配 @ 执行 {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: 仅当开启 'autoindent' 后才生效} <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> 删除缩进后,上 下移动会将光标落在已删除缩进区域;Vim 则会移到已删 除缩进之后} '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 编辑文件时自动开 启本选项} 'remap' 允许映射递归解析 'report' 改动行数超过此值时,命令会输出提示 'scroll' 'scr' CTRL-U 和 CTRL-O 滚动行数 'sections' 'sect' 用于分隔小节的 nroff 宏 'shell' 'sh' 外部命令使用的外壳程序名 'shiftwidth' 'sw' (自动) 缩进使用的步进单位,以空格数目计 'showmatch' 'sm' 插入括号时短暂跳转到配对括号 'showmode' 'smd' 状态行显示当前编辑模式 'tabstop' 'ts' 两个制表位间相隔列数 '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-F 和 CTRL-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: 向 Vim 服务器发送键序列 {keys} 并退出 --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: 在指定的 GTK 套接字窗口内运行 Vim --windowid {id} Vim: 在指定 Win32 窗口 ID 的窗口内运行 Vim --version Vim: 显示版本信息并退出。 -? Vile: 显示用法摘要并退出。 -a Elvis: 将每个文件分别加载到一个独立窗口中 (Vim 使用 -o)。 -A Vim: 以阿拉伯语模式启动 (仅当编译时加入阿拉伯语特性才可用)。 -b {blksize} Elvis: 会话文件使用 {blksize} 块大小。 -b Vim: 开启 'binary' 模式。 -C Vim: Vi 兼容模式。 -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 仅部分版本支持: "列出可恢复编辑会话"}。 -l Nvi、Vi、Vim: 开启 'lisp' 和 'showmatch' 选项。 -m Vim: 禁止写入修改,复位 'write' 选项。 -M Vim: 完全禁止修改,复位 'modifiable' 和 'write' 选项。 -N Vim: 非 Vi 兼容模式。 -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: 指定级别为 {nr} 的详细输出模式。 -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 的兼容性。大多数测试都正常通过。但仍有 少数场景,即使开启 Vi 兼容模式,Vim 也不符合 POSIX 规范。 $VIM_POSIX Vim 启动时,如果 $VIM_POSIX 环境变量已设置,'cpoptions' 会包含 POSIX 标志位。 使 Vim 尽可能遵循 POSIX 规范。这和 Vi 兼容模式略有区别。 Vi 的 Posix 规范文档: 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 规范应当停止。 为此,在 'cpoptions' 里包含 '{' 标志位,强制 POSIX 行为。 "D"、"o" 和 "O" 命令支持计数,重复执行时同样生效。 为此,在 'cpoptions' 里包含 '#' 标志位,忽略计数。 在 'cpoptions' 里包含 '.' 标志位,当前缓冲区一旦修改会导致 ":cd" 命令 执行失败。 在 'shortmess' 里包含 "A" 标志位,不显示 注意 (ATTENTION) 提示消息。 POSIX 测试套件运行备注: - vi 测试 33 偶发失败,原因不明 - vi 测试 250 失败;新版修订会修改行为 (死链) 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 失败,因为 "30z" 未使用 'window' 选项。 - ex 测试 368 失败,因为静默模式下不回显外壳命令。 - ex 测试 394 失败,因为静默模式下 "=" 命令输出不可见。 - ex 测试 411 失败,测试文件有误,存在多余 ':'。 - ex 测试 475 和 476 失败,因为静默模式下重打印输出不可见。 - ex 测试 480 和 481 失败,因为标签文件用空格代替了制表。 - ex 测试 502 失败,因为静默模式下不读取 .exrc。 - ex 测试 509 失败,因为静默模式下不读取 .exrc。且退出码为 1 而不是 2。 - ex 测试 534 失败,因为静默模式下不读取 .exrc。

9. 支持的操作系统 os-support

Vim 尽量保留对部分老旧操作系统的支持,但如果维护负担过重或无法验证,旧系统支持 可能被移除。 下表为各操作系统支持状态。注意完全支持代表该平台纳入 CI (持续集成) 测试套件验 证。 系统 | 状态: --------------------------------+----------------------------------------- Amiga (OS4、AROS & MorphOS): | 支持 Haiku: | 支持 Linux: | 完全支持 (维护版本) macOS: | 完全支持到 v10.6 (?) MS-Windows 7、8、10、11: | 完全支持 OpenVMS: | 支持 QNX: | 仍支持 (?) Solaris: | 支持 (维护版本) UNIX: | 支持 (维护版本) zOS/OS390: | 仍支持 (?) 以下操作系统不再提供支持: 系统 | 状态: --------------------------------+----------------------------------------- Atari MiNT: | v8.2.1215 起删除支持 BeOS: | v8.2.0849 起删除支持 MS-DOS: | v7.4.1399 起删除支持 MS-Windows XP 和 Vista: | v9.0.0496 起删除支持 OS/2: | v7.4.1008 起删除支持 RISC OS: | v7.3.0187 起删除支持 NeXTSTEP: | v9.2.0122 起删除支持 vim:tw=78:ts=8:noet:ft=help:norl: