全部博文(930)
分类: LINUX
2008-11-02 12:39:45
vi 程序是一个功能强大的文本编辑器。Sun Microsystems 的共同创始人 William Joy 最初在 1976
年编写了针对 Berkeley Software Distribution(BSD)UNIX 早期版本的 vi 编辑器。据说 Bill
一个周末就编写了 vi,不过他说这纯属谣言。该程序以 UNIX 扩展行编辑器中的 visual 命令命名 — 简称为 ex。
vi 编辑器是一个功能很强的编辑器,它有几个许多人都没有发觉的功能。Vi 是一个模型编辑器,因此不同的设置会产生不同的结果。vi 中有三种不同的模式:命令、插入(或 输入)和行。在插入模式下操作时,文本被写入临时编辑文件;在一般模式下,相同的键击会触发嵌入在编辑器中的命令。要进入插入模式,按 I 键即可;要退出命令模式,按 Escape(我将在本文后面更详细地介绍行模式)。
例如,在插入模式中,如果输入字符串 10dd,该字符串会写入临时文件,如图 1 所示。
但是,如果处于命令模式,字符串 10dd 将从临时文件的当前光标所在位置开始删除 10 行,如图 2 所示。
另一个例子是光标移动。在命令模式下,键 H、J、K 和 L 分别将光标向左、下、上和右移动,如图 3 所示。而在插入模式下,则显示这些字母。
通常,UNIX 用户使用 vi,或称为 Editor Macros(Emacs)的编辑器,它由 Richard Stallman 在 1976 年编写。但是许多人选择 vi,因为它是轻量级的,启动更快,占用的内存也更少。
Vim,即改进的 Vi, 是由 Bram Moolenaar 在 1991 年编写的 vi 的扩展版本。该版本最初是为 Amiga 计算机设计的,但 1992 年时在 UNIX 中迅速传播开来。与 vi 一样,Vim 基于命令模式和插入模式,它是一个文本用户界面(TUI)— 如图 4 所示。
但是它提供了一种命名为 gVim 的图形用户界面(GUI)— 如图 5 所示。
|
Vim 中的内部命令与 vi 编辑器中的内部命令类似。表 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 命令。
| 命令 | 动作 |
|---|---|
| d | 删除选中的区域 |
| dd | 删除整个当前行 |
| 10dd | 删除从当前行开始的 10 行, |
| dw | 从当前位置向前删除单词 |
| db | 从当前光标位置左边开始向后删除单词 |
| dl | 删除当前光标位置的字符 |
| dh | 删除当前光标位置左边的字符 |
| d0 (zero) | 删除当前光标位置到行开头之间的单词 |
| D | d$ | 删除从当前光标位置开始的整个行 |
| x | 删除光标当前位置的字符 |
| X | 删除光标当前位置之前的字符 |
表 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 | 撤消最后的更改 |
| 重做 | |
| / | 搜索已找到的下一个模式,并将光标放在已找到的模式的开头 |
| ? | 搜索已找到的上一个模式,并将光标放在已找到的模式的开头 |
| n | 重复上一次的搜索 |
| N | 重复上一次的搜索,但搜索的方向相反 |
| ! | 在 Vim 会话外执行 |
|
尽管广泛使用的是命令和插入模式,但行模式同样重要,只是有时候没有被充分理解和使用。行模式进入行编辑器,使您可以在一行或多行上处理命令。考虑到 vi 以 ex 编辑器命名,所以它只适合进入 ex 编辑器的行模式。
要从命令模式进入行模式,输入冒号(:)即可。然后将光标移动到窗口左下角。继续输入时,所有文本都会出现在窗口底部的冒号后面。单击 Enter,开始计算和执行行模式命令。如果确定不执行在行模式下输入的行,则单击 Escape 返回到命令模式。
使用编辑器的行模式时,请记住两种命令样式。首先,在输入命令时,vi 或 Vim 按原样执行命令。如果执行的命令与修改数据有关,当前行就是目标。但是,使用第二种方法可以提供行数以处理指定的行。要输入行,请在冒号后面输入要处理的行数或行范围,并用逗号(,)分隔开始和结束范围。
例如,如果只处理行 23,那么命令以 :23 开始。如果要修改 2319 到 3819 之间的行,则输入 :2319,3819。要处理从行 45 开始到文件结尾之间的一个命令,需要将最后行的参数替换为美元符号($)— 即 :45,$。
以下命令只是可以在行模式下执行的最基本命令:
:w :将文件写入磁盘。如果提供一个参数,编辑器会试图将数据写入 注意:如果提供一个参数,而且存在
:w! :将文件写入磁盘并覆盖文件中的所有数据。:, w :将从 :q:试图在不保存的情况下退出编辑器。
注意:如果数据已修改,则需要先保存文件再退出编辑器,否则将导致文件未被保存。
:q!:退出编辑器,不将文件写入磁盘。:n:如果编辑多个文件,首先编辑编辑列表中的下一个文件。:e :编辑 :e#:如果编辑两个文件,则在两个文件之间切换。:s/// :用当前行中的 :1,$ s///g :从行 1 开始,在整个文件中执行,用 :r :将 :, d :删除从 :, y :复制从
|
尽管 vi 与 Vim 的外观相同,但它们确实存在区别。以下只是这两个功能强大的文本编辑器之间的几点区别:
vimdiff 的有用命令与 Vim 包捆绑在一起。使用 vimdiff 可以显示相互邻近的多个文件,类似于 sdiff,如图 6 所示。
tar 压缩的文件。编辑 .tar 文件时,Vim 显示一个简洁屏幕,让您选择编辑存档中的哪个文件,如 图 7 所示。编辑完文件后,正常保存并退出文件(:wq),然后 Vim 会返回到显示屏幕,允许您在存档中选择另一个要编辑的文件。您也可以从选择窗口中退出(:q)。
在图 8 所示的例子中,使用 tar 命令存档 4 个 ASCII 文本文件,然后使用 Vim 选择存档中的第二个文件进行编辑。
v 进入可视化模式,用光标选中要修改的文本,然后输入 d 删除突出显示的文本即可。