如 果您曾和 IBM® AIX®(UNIX® 的一个版本)或 Linux® 打过交道,使用的很可能是 vi 编辑器。自 1976 年提出 vi 的概念开始,它已经成为编辑文件的主要工具。您可能会问:“有比 vi 功能更强大的编辑工具吗?”当然有,那就是 Vim,本文将详细介绍 Vim 增强功能,这些增强功能使 Vim 成为 UNIX 和 Linux 领域中广泛使用的编辑器。
vi 程序是一个功能强大的文本编辑器。Sun Microsystems 的共同创始人 William Joy 最初在 1976 年编写了针对 Berkeley Software Distribution(BSD)UNIX 早期版本的 vi 编辑器。据说 Bill 一个周末就编写了 vi,不过他说这纯属谣言。该程序以 UNIX 扩展行编辑器中的 visual 命令命名 — 简称为 ex。
vi 编辑器是一个功能很强的编辑器,它有几个许多人都没有发觉的功能。Vi 是一个模型编辑器,因此不同的设置会产生不同的结果。vi 中有三种不同的模式:命令、插入(或 输入)和行。在插入模式下操作时,文本被写入临时编辑文件;在一般模式下,相同的键击会触发嵌入在编辑器中的命令。要进入插入模式,按 I 键即可;要退出命令模式,按 Escape(我将在本文后面更详细地介绍行模式)。
例如,在插入模式中,如果输入字符串 10dd,该字符串会写入临时文件,如图 1 所示。
图 1. 在插入模式下输入 dd

但是,如果处于命令模式,字符串 10dd 将从临时文件的当前光标所在位置开始删除 10 行,如图 2 所示。
图 2. 在命令模式下输入 dd

另一个例子是光标移动。在命令模式下,键 H、J、K 和 L 分别将光标向左、下、上和右移动,如图 3 所示。而在插入模式下,则显示这些字母。
图 3. vi 中的光标移动

通常,UNIX 用户使用 vi,或称为 Editor Macros(Emacs)的编辑器,它由 Richard Stallman 在 1976 年编写。但是许多人选择 vi,因为它是轻量级的,启动更快,占用的内存也更少。
Vim 是什么?
Vim,即改进的 Vi,是由 Bram Moolenaar 在 1991 年编写的 vi 的扩展版本。该版本最初是为 Amiga 计算机设计的,但 1992 年时在 UNIX 中迅速传播开来。与 vi 一样,Vim 基于命令模式和插入模式,它是一个文本用户界面(TUI)— 如图 4 所示。
图 4. Vim TUI

但是它提供了一种命名为 gVim 的图形用户界面(GUI)— 如图 5 所示。
图 5. Vim GUI

Vim 命令
Vim 中的内部命令与 vi 编辑器中的内部命令类似。表 1 提供了 Vim 中的光标移动命令。
表 1. 用于移动光标的 Vim 命令
命令 | 动作 |
h | 将光标向左移动 |
j、加号 (+)、Enter 或 Return | 将光标向下移动 |
k、减号 (-) | 将光标向上移动 |
l | 将光标向右移动 |
} | 将光标移动到当前段落的末尾 |
{ | 将光标移动到当前段落的开头 |
) | 将光标移动到当前句子的末尾 |
( | 将光标移动到当前句子的开头 |
^ | 移动到当前行的第一个非空字符 |
$ | 移动到当前行末尾 |
0 (zero) | 移动到当前行开头 |
w or W | 移动到下一单词的开头 |
b or B | 移动到上一单词的开头 |
e | 移动到下一单词的末尾 |
H | 移动到屏幕的第一行 |
M | 移动到屏幕的中间一行 |
L | 移动到屏幕的最后一行 |
G | 移动到文件末尾 |
gg | 移动到文件开头 |
:n | 移动到行 n |
表 2 显示了用于删除文本的 Vim 命令。
表 2. 用于删除文本的 Vim 命令
命令 | 动作 |
d | 删除选中的区域 |
dd | 删除整个当前行 |
10dd | 删除从当前行开始的 10 行, |
dw | 从当前位置向前删除单词 |
db | 从当前光标位置左边开始向后删除单词 |
dl | 删除当前光标位置的字符 |
dh | 删除当前光标位置左边的字符 |
d0 (zero) | 删除当前光标位置到行开头之间的单词 |
D | d$ | 删除从当前光标位置开始的整个行 |
x | 删除光标当前位置的字符 |
X | 删除光标当前位置之前的字符 |
表 3 提供了其他几个有用的 Vim 命令。
表 3. 常用 Vim 命令
命令 | 动作 |
ih | 进入插入模式并在当前光标处插入 |
I | 进入插入模式并在当前行的开始处插入 |
a | 进入插入模式并追加到光标后面 |
A | 进入插入模式并追加到当前行末尾 |
c | 更改选中的区域 |
C | 更改从光标当前位置开始的整个行 |
o | 在光标当前所在行下方创建一个新空行,并将光标移动到这一新空行的开头 |
O | 在光标当前所在行的上方创建一个新空行,并将光标移动到这一新空行的开头 |
r | 替换光标当前位置的单个字符 |
R | 替换从光标当前位置开始的多个字符,并在退出插入模式时结束 |
| 退出插入或可视模式 |
> or | 向选中区域右边缩进 |
< | 向选中区域左边缩进 |
v | 启动时突出显示字符 |
V | 启动时突出显示的整个行 |
yy | 将当前行移动/复制到内存 |
10yy | 将从当前行开始的 10 行移动/复制到内存 |
p | 粘贴复制或剪切的文本;如果字符被复制(yw dw 或 D),就在光标当前位置之后粘贴这些字符。如果复制的是行,就在光标当前所在的行下面粘贴这些行 |
P | 作用和 p 一样,但是它在光标当前位置的前面粘贴字符,在光标当前所在行上面粘贴行 |
u | 撤消最后的更改 |
R | 重做 |
/ | 搜索已找到的下一个模式,并将光标放在已找到的模式的开头 |
? | 搜索已找到的上一个模式,并将光标放在已找到的模式的开头 |
n | 重复上一次的搜索 |
N | 重复上一次的搜索,但搜索的方向相反 |
! | 在 Vim 会话外执行 |
行模式
尽管广泛使用的是命令和插入模式,但行模式同样重要,只是有时候没有被充分理解和使用。行模式进入行编辑器,使您可以在一行或多行上处理命令。考虑到 vi 以 ex 编辑器命名,所以它只适合进入 ex 编辑器的行模式。
要从命令模式进入行模式,输入冒号(:)即可。然后将光标移动到窗口左下角。继续输入时,所有文本都会出现在窗口底部的冒号后面。单击 Enter,开始计算和执行行模式命令。如果确定不执行在行模式下输入的行,则单击 Escape 返回到命令模式。
使用编辑器的行模式时,请记住两种命令样式。首先,在输入命令时,vi 或 Vim 按原样执行命令。如果执行的命令与修改数据有关,当前行就是目标。但是,使用第二种方法可以提供行数以处理指定的行。要输入行,请在冒号后面输入要处理的 行数或行范围,并用逗号(,)分隔开始和结束范围。
例如,如果只处理行 23,那么命令以 :23 开始。如果要修改 2319 到 3819 之间的行,则输入 :2319,3819。要处理从行 45 开始到文件结尾之间的一个命令,需要将最后行的参数替换为美元符号($)— 即 :45,$。
以下命令只是可以在行模式下执行的最基本命令:
vi 与 Vim 之间的差异
尽管 vi 与 Vim 的外观相同,但它们确实存在区别。以下只是这两个功能强大的文本编辑器之间的几点区别:

 |
如何获得 Vim?
了解 vi 与 Vim 之间的一些增强与区别后,您可能会说:“我需要 Vim!从哪里获得它呢?”告诉您一个好消息:Vim 已经出现在几个不同的操作系统中。
以下是几个移植了 Vim 的平台:
- Amiga
- AIX
- BSD
- Cygwin
- IBM OS/2®
- Linux
- Apple Mac OS 和 Mac OS X
- Microsoft® MS-DOS®
- Microsoft Windows® 95 到 Windows Vista®
- Microsoft Windows CE
- OpenVMS
Windows 中的 Vim
在上一小节,您已经知道可以在 Windows 使用 Vim,您现在会说:“我真的可以在 Windows 中使用 Vim 吗?真是太好了!”是的,确实可以!
只需下载最新版的 Vim(当前版本是 7.1),将它移植到 Windows 即可,下载地址是 Vim Web 站点。最简单的方法是下载自动安装的可执行文件并执行它,然后按步骤操作。安装后,右键单击一个文件,单击 Edit with Vim(如下面的图 11 所示),便可以在 Windows 的 Vim 中编辑文件了。
图 11. 在 Windows 中使用 Vim 编辑文件

在 Windows 计算机中安装 Vim 后,就可以享受 Vim 提供的好处了,同时可以考虑抛弃 Windows 中的其他文本编辑器了。
结束语
vi 编辑器是 UNIX 中的文本编辑器的前身,Vim 是它的延续。阅读本文后,希望您能学到有关 Vim 编辑器的一些新知识,并通过它的功能使您的工作更轻松。Vim 作为一种简单的编辑器,已经成为一个稳定和健壮的应用程序,广泛用于 UNIX 以及大多数其他操作系统中。如果您不经常使用 Vim,在了解它的详细功能之后,您肯定会认为 Vim 是最好的编辑器。