全部博文(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
删除突出显示的文本即可。