对话 UNIX: 新改进的 Vim 编辑器

可以在任何平台上编辑代码

如果您曾和 IBM® AIX®(UNIX® 的一个版本)或 Linux® 打过交道,使用的很可能是 vi 编辑器。自 1976 年提出 vi 的概念开始,它已经成为编辑文件的主要工具。您可能会问:“有比 vi 功能更强大的编辑工具吗?”当然有,那就是 Vim,本文将详细介绍 Vim 增强功能,这些增强功能使 Vim 成为 UNIX 和 Linux 领域中广泛使用的编辑器。

Adam Cormany, 国家数据中心经理, Scientific Games Corporation

Adam Cormany 是一位 UNIX 系统工程师,从事 AIX、Solari 和 Red Hat Linux 管理已有 10 多年。他是一位 pSeries® AIX 系统管理方面的 IBM eServer® 认证专家。除管理外,Adam 还在 BASH、CSH 和 KSH 的 Shell 脚本编写以及 C、PHP 和 Perl 编程方面具有渊博的知识。



2008 年 10 月 30 日

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
在插入模式下输入 dd

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

图 2. 在命令模式下输入 dd
在命令模式下输入 dd

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

图 3. vi 中的光标移动
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
Vim TUI

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

图 5. Vim GUI
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替换从光标当前位置开始的多个字符,并在退出插入模式时结束
<Esc>退出插入或可视模式
> or <Tab>向选中区域右边缩进
<向选中区域左边缩进
v启动时突出显示字符
V启动时突出显示的整个行
yy将当前行移动/复制到内存
10yy将从当前行开始的 10 行移动/复制到内存
p粘贴复制或剪切的文本;如果字符被复制(ywdwD),就在光标当前位置之后粘贴这些字符。如果复制的是行,就在光标当前所在的行下面粘贴这些行
P作用和 p 一样,但是它在光标当前位置的前面粘贴字符,在光标当前所在行上面粘贴行
u撤消最后的更改
<Ctrl> R重做
/<pattern>搜索已找到的下一个模式,并将光标放在已找到的模式的开头
?<pattern>搜索已找到的上一个模式,并将光标放在已找到的模式的开头
n重复上一次的搜索
N重复上一次的搜索,但搜索的方向相反
!<cmd>在 Vim 会话外执行 <cmd>

行模式

尽管广泛使用的是命令和插入模式,但行模式同样重要,只是有时候没有被充分理解和使用。行模式进入行编辑器,使您可以在一行或多行上处理命令。考虑到 vi 以 ex 编辑器命名,所以它只适合进入 ex 编辑器的行模式。

要从命令模式进入行模式,输入冒号(:)即可。然后将光标移动到窗口左下角。继续输入时,所有文本都会出现在窗口底部的冒号后面。单击 Enter,开始计算和执行行模式命令。如果确定不执行在行模式下输入的行,则单击 Escape 返回到命令模式。

使用编辑器的行模式时,请记住两种命令样式。首先,在输入命令时,vi 或 Vim 按原样执行命令。如果执行的命令与修改数据有关,当前行就是目标。但是,使用第二种方法可以提供行数以处理指定的行。要输入行,请在冒号后面输入要处理的行数或行范围,并用逗号(,)分隔开始和结束范围。

例如,如果只处理行 23,那么命令以 :23 开始。如果要修改 2319 到 3819 之间的行,则输入 :2319,3819。要处理从行 45 开始到文件结尾之间的一个命令,需要将最后行的参数替换为美元符号($)— 即 :45,$

以下命令只是可以在行模式下执行的最基本命令:

  • :w <file name>将文件写入磁盘。如果提供一个参数,编辑器会试图将数据写入 <file name>。

    注意:如果提供一个参数,而且存在 <file name>,编辑器不会覆盖现有文件的数据。

  • :w! <file name>将文件写入磁盘并覆盖文件中的所有数据。
  • :<x>,<y> w <file name>将从 <x> 到 <y> 之间的行写入 <file name>。
  • :q试图在不保存的情况下退出编辑器。

    注意:如果数据已修改,则需要先保存文件再退出编辑器,否则将导致文件未被保存。

  • :q!退出编辑器,不将文件写入磁盘。
  • :n如果编辑多个文件,首先编辑编辑列表中的下一个文件。
  • :e <file name>编辑 <file name>。
  • :e#如果编辑两个文件,则在两个文件之间切换。
  • :s/<str1>/<str2>/用当前行中的 <str2> 替换第一次出现的 <str1>。
  • :1,$ s/<str1>/<str2>/g从行 1 开始,在整个文件中执行,用 <str2> 替换所有的 <str1>。
  • :r <file name>将 <file name> 读入当前编辑器会话中。
  • :<x>,<y> d删除从 <x> 到 <y> 之间的行。
  • :<x>,<y> y复制从 <x> 到 <y> 之间的行。

vi 与 Vim 之间的差异

尽管 vi 与 Vim 的外观相同,但它们确实存在区别。以下只是这两个功能强大的文本编辑器之间的几点区别:

  • vimscript:Vim 使用内部脚本语言 vimscript,允许复杂脚本将扩展功能添加到编辑器中。除了 vimscript,Vim 还支持 Perl、Python、Ruby、Tcl 和其他语言。
  • vimdiff:将一个称为 vimdiff 的有用命令与 Vim 包捆绑在一起。使用 vimdiff 可以显示相互邻近的多个文件,类似于 sdiff,如图 6 所示。
    图 6. vimdiff 示例
    vimdiff 示例
  • 编辑压缩文件:要保留系统上的空间,管理员通常会压缩日志文件或其它大型文件。经常出现这样的情况:在压缩了一个文件之后,总是会有人问:“请问,可以看看该日志两个月之前的情况吗?”以前需要解压文件,然后再使用 vi 编辑它。现在使用 Vim 就可以编辑压缩文件。Vim 可以处理使用 bzip2、gzip 和 zip 压缩的文件。
  • 编辑存档文件:Vim 还能编辑由 tar 压缩的文件。编辑 .tar 文件时,Vim 显示一个简洁屏幕,让您选择编辑存档中的哪个文件,如 图 7 所示。编辑完文件后,正常保存并退出文件(:wq),然后 Vim 会返回到显示屏幕,允许您在存档中选择另一个要编辑的文件。您也可以从选择窗口中退出(:q)。
    图 7. 使用 Vim 在存档文件中选择要编辑的文件
    选择一个存档文件

    在图 8 所示的例子中,使用 tar 命令存档 4 个 ASCII 文本文件,然后使用 Vim 选择存档中的第二个文件进行编辑。

    图 8. 在存档中通过 Vim 编辑文件
    编辑存档文件
  • 拆分窗口:使用 gVim,在编辑多个文件时无需在窗口之间来回切换,可以在现有文件中打开几个窗口,并动态创建一些新文件,如图 9 所示。
    图 9. 在 Vim 中拆分窗口
    在 Vim 中拆分窗口
  • 语法要点:调试别人的 shell 脚本或不是由同一个编辑器编写的代码是一项艰巨的任务。幸运的是,Vim 能减轻使用别人的代码带来的痛苦。使用 Vim,可以突出显示代码块,使得在 shell 脚本和其他编程语言中的调试更简单,如图 10 所示。
    图 10. 语法要点
    语法要点
  • 光标的最后位置:编辑文件时,有时需要退出文件来执行其他任务。但是当准备返回文件时,已经忘记了是在何处离开的!不要担心,Vim 会记住退出文件时光标的最后位置。在修改有好几千行的文件时,这特别有用。
  • 多个撤消/重做操作:过去,vi 只允许在编辑文件时撤消最后一次更改。这是一个了不起的开始,但是需要改进。有时,编辑脚本或其他代码时,看起来似乎很好的想法并不是处理问题的最佳方式,所以必须能够回溯到在文件中进行的最后 10 次更改。Vim 允许您这样做。
  • 可视化模式:Vim 允许使用 “可视化” 模式选择某些文本块。使用这种模式可以在编辑的文件中选择任意量的文本,然后使用一个命令更改突出显示的文本。例如,如果必须删除文本中间一段,只需输入 v 进入可视化模式,用光标选中要修改的文本,然后输入 d 删除突出显示的文本即可。

如何获得 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 编辑文件

在 Windows 计算机中安装 Vim 后,就可以享受 Vim 提供的好处了,同时可以考虑抛弃 Windows 中的其他文本编辑器了。


结束语

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

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • 对话 UNIX:查看这个系列的其他部分。
  • Wikipedia's AIX entry:阅读 Wikipedia 有关 AIX 操作系统的解释,了解有关其背景和发展的更多信息。
  • Wikipedia's vi editor entry:阅读 Wikipedia,了解有关 vi 编辑器的更多信息。
  • Wikipedia's VIM editor entry:阅读 Wikipedia 关于 Vim 编辑器的优秀条目。
  • Vim 编辑器:了解有关 Vim 编辑器的更多信息。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播。
  • AIX Wiki:访问此协作环境,了解与 AIX 相关的技术信息。
  • Podcast:收听 IBM 技术专家的访谈录。

获得产品和技术

  • IBM 试用软件:使用可直接从 developerWorks 下载的软件构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX, Linux
ArticleID=348652
ArticleTitle=对话 UNIX: 新改进的 Vim 编辑器
publish-date=10302008