Vim documentation: vi_diff
VIM 参考手册 by Bram Moolenaar
译者: Willis
http://vimcdoc.sf.net
Vim 和 Vi 的差异 *vi-differences*
在各个帮助文件里,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 位系统上可能更大)
标签文件行的最大长度: 512 字节。
撤销信息和寄存器内的文本保存在内存里,因为做 (大的) 改变时,可用的 (虚拟) 内存
限制了撤销的层数和能保存在寄存器里的文本。其它在内存里的信息包括: 命令行历史、
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|
如果置位 'undofile' 选项,在文件里保存撤销信息。这就是说,你可以退出
Vim,启动 Vim 打开以前编辑过的文件,然后撤销在退出 Vim 之前做出的改
动。
图形用户界面 (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 会高亮拼写错误。现在支持大约 50 种语言,用
'spelllang' 选项选择。源代码中,只检查注释和字符串的拼写。
折叠。 |folding|
一个范围内的行可以显示为单个 "折叠" 行。这样允许概览文件并快速移过大段
文字。折叠可以手动创建,也可以基于语法、缩进等等创立。
diff 模式。 |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|
可视模式可以用来先高亮选择一段文本并执行一个命令在其上。这是一个代替先
给出操作符,然后移动到待操作文本的尾部的 (容易使用的) 替代方法。
|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|、|Lua|、|Perl| 和
|MzScheme| 的接口。
Viminfo。 |viminfo-file|
命令行历史,位置标记,和寄存器可以存在一个在启动时读入的文件里。这可以
用来在退出和重启 Vim 时重复上次的搜索或命令行命令。也可以用 |'0|
跳转回最近一次的编辑。'viminfo' 选项可以设置选项什么内容存储在
.viminfo 文件里。缺省该功能是关闭的。
打印。 |printing|
|:hardcopy| 命令发送文本给打印机。可以包含语法高亮。
鼠标支持。 |mouse-using|
支持鼠标的环境包括 GUI 版本、Unix 的 xterm、支持 sysmouse 的 BSD、支持
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' 选项,光标可以移动到屏幕的任何位置,包括没有文
本的地方。可以用于很方便地编辑表格和图表。
==============================================================================
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" 列出标
签栈。
'tags' 选项可以设置标签文件名字的列表。可以指定多个标签文件。"./" 开始的文件名
里,"./" 被当前文件所在的路径所代替。这样可以指定编辑中的文件的相同目录下的标
签文件。
以前用过的文件名被记在轮换文件名列表里。
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"
删除所有的空白)。
"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) 命令插入文本的最后。"'[" 和
"`[" 这跳转到相应的开始处。
'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' 选项。在替换模式下,'revins' 没有效果。必须在编译时打开这
一功能。
退格键和 CTRL-D 一样可以用来删除自动的缩进。
如果 'backspace' (bs) 选项包含 "eol",你可以在换行符上退格、CTRL-U 和 CTRL-W。
如果 'backspace' 选项包含了 "start",你可以在插入的开始处退格。
如果置位了 'paste' 选项,一些选项被复位,而且插入模式和缩写的映射被禁止。这允
许在窗口系统里粘贴文本不会产生以外的效果。如果复位 'paste' 选项,旧的选项值重
新恢复。
CTRL-T/CTRL-D 总是插入/删除当前行的一个缩进,不管光标处于何列。
CTRL-@ (插入上次输入过的文本) 总能工作 (Vi: 只有在作为第一个字符输入时)。
CTRL-A 和 CTRL-@ 类似,但不离开插入模式。
CTRL-R {0-9a-z..} 可以用来插入寄存器的内容。
如果置位了 'smartindent' 选项,C 程序会更好的自动缩进,'cindent' 则做得更多。
CTRL-Y 和 CTRL-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> 以后回到这一模式。
撤销的信息保存在内存里。可用的内存限制了可以撤销的改变的数目和大小。这可能对
MS-DOS 是一个问题,但在 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" 消息是一个普通的消息,而不是错误信息。因为后者会使得映射
被非正常终止。
Amiga 上支持 AUX: 设备。
==============================================================================
6. 命令行参数 *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 版本里存在)。
-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: 使用 quickfix 错误文件 {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} 作为启动文件。
==============================================================================
7. POSIX 相容性 *posix* *posix-compliance*
2005 年,运行了 POSIX 测试包以对 Vim 的相容性进行了检查。大多数测试都能正确执
行。有一些行为 Vim 和 POSIX 不相容,即使运行于 Vi 兼容模式也是如此。
*$VIM_POSIX*
Vim 启动时设置 $VIM_POSIX 环境变量会使得 'cpoptions' 包含 POSIX 的标志位。这使
Vim 尽可能地照 POSIX 方式运行。这和 Vi 兼容模式稍有不同。
这里是 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。