VI - 从入门到精通之二

作者:Wilbur Lang

正式开始

vi 的模式

vi 是在很久以前就写的程序。在那个时候,键盘上没有现在熟悉的那么多功能键。所以,vi 设计成通过输入字符和 ESC 来控制输入和修改文本。

可能这对于一些人来说是个遗憾,但是你会发现你不需要改变手在键盘上的位置就可以完成所有的功能。结果是你的输入将快速起来。

为了完成交互的全屏幕编辑工作, vi 有三种模式。插入模式 (insert) 用于输入文本。在插入模式下,你输入的任何字符都将显示在屏幕并存于文件。命令 (command) 模式用于大多数编辑功能。在命令模式下,所有的输入都将产生一定的响应而不是 直接到文本中,例如移动光标、删除一块文本、拷贝文本等。第三个模式是执行另 外的功能,例如查找、全局替换、处理多个文件等。这种模式是基于 ex 编辑器的。

启动 vi

vi 启动后,默认的模式是命令模式。按照下面的步骤试一试:输入程序名称启动 vi

$ vi

你将看到类似下面的东西:

~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
Empty buffer

i--插入

现在我们输入 "i" 进入插入模式。字符 "i" 将不会回显。此后你输入的任何东西都将显示在缓存中。现在我们来输入一段文字。 例子中的话来自英文版的孙子兵法。注意光标的位置在例子中是个下划 线。

    If wise, a commander is able to recognize changing circumstances and to
act expediently.  If sincere, his men will have no doubt of the certainty of
rewards and punishments.  If humane, he loves mankind, sympathizes with others,
and appreciates their industry and toil.  If courageous, he gains victory by
seizing opportunity without hesitation.  If strict, his troops are disciplined
because they are in awe of him and are afraid of punishment.
    Shen Pao-hsu ... said: 'If a general is not courageous he will be unable
to conquer doubts or to create great plans.'
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~

Esc--Cancel

当你输入完了,按下 Esc 键返回到命令模式。 (如果你已经处于命令模式下,按 Esc 时会听到喇叭的声音。) Esc 可以撤消未完成的命令和终止插入模式。按 Esc 后,光标将停留在你最后输入的字符的下面。

很不幸,没有一个明显的标志表明你现在处于什么模式下。但是有简单的方 法来告诉你现在你所处的模式。如果你按下键,相应的字符出现在屏幕上,那么 你是在插入模式下,否则是命令模式下。如果你不能确定你现在所处的模式,那么 按 Esc 两次以听到喇叭声来确信你在命令模式下。

移动光标和简单的编辑

是看一看基本的移动光标命令的时候了。训练训练你的手指,让他们以后自动 的执行你所想的命令吧。

最重要的移动命令

让我们来看看有多少影响光标移动的命令。

hh--光标左移

首先,按 5 下 h 让光标左移动 5 个 (如果你看到 h 跑到屏幕上了的话,一定是你忘记了按 Esc )。光标现在应该在 "plans" 中的 "p" 下面 (看下面的例子):

    If wise, a commander is able to recognize changing circumstances and to
act expediently.  If sincere, his men will have no doubt of the certainty of
rewards and punishments.  If humane, he loves mankind, sympathizes with others,
and appreciates their industry and toil.  If courageous, he gains victory by
seizing opportunity without hesitation.  If strict, his troops are disciplined
because they are in awe of him and are afraid of punishment.
    Shen Pao-hsu ... said: 'If a general is not courageous he will be unable
to conquer doubts or to create great plans.'
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~

kk--光标上移

现在我们来按 5 次 k 让光标上移 5 行。也许你该认为应该有快捷方式了。好,现在就有个简单的方法:在你要采取的 行动前加上数字。按下 5k 你可以和按 5 下 k 有相同的结 果了。光标现在该在 "he" 的"e"下了。

    If wise, a commander is able to recognize changing circumstances and to
act expediently.  If sincere, his men will have no doubt of the certainty of
rewards and punishments.  If humane, he loves mankind, sympathizes with others,
and appreciates their industry and toil.  If courageous, he gains victory by
seizing opportunity without hesitation.  If strict, his troops are disciplined
because they are in awe of him and are afraid of punishment.
    Shen Pao-hsu ... said: 'If a general is not courageous he will be unable
to conquer doubts or to create great plans.'
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~

在使用这些功能的时候有些限制的。例如使用 h 或 l 移动光标超过了一行文字的头或尾,光标将停留在头或尾部,喇叭鸣叫提醒 你。

还有其他的类似 h 和 k 的吗?看一看表3.2。最好的熟悉他们 的的方法是多用他们。

表 3.2. 常见的方向键

命令 移动
h 左一个字符
j 下一行
k 上一行
l 右一个字符
w, W 前一个单词 (W 忽略标点)
b, B 后一个单词 (B 忽略标点)
$ 到行尾
^ 到行首第一个非空字符
0 行首
G 到缓冲首
nG 到第 n

大小写的命令是有一些区别的。小写字母一般以标点区分 "words.",而大写则忽略他们。

最重要的编辑程序

让我们看看最简单也是最常用的编辑过程:

修改 没有人不犯错误。所以迟早 你会碰到修改你输入的文本的时候。实际上花在字处理上的大多数时间是 修改而不是输入新的东西。因此,你要知道如何方便地修改就很重要。

x--删除一个字符 删除文字的最简单的方式是用 x。这个命令的结果是光标所处 的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符, 那么光标将向左移动一个,这样光标就不会停留在不存在的字符的下面了。假如 没有任何文字了,喇叭就叫。

d--删除对象 这个命令的右边还要有一定的文字对象。文字对象就是一块文字。他右边接的 就是在控制光标移动的那些字符。例如 w 表示向前一个单词,那么 dw 将删除下一个单词。5w 表示前进 5 个单词,那么 d5w 将删除他们。

dd--删除一行 最常用的 d 系列命令之一。和前面一样, 5dd 将删除 5 行

D--整个删除 大写形式的 D 用来删除从光标到行尾。和 d$ 一样效果。

u--恢复 要后悔吗?他不仅仅撤消删除,还撤消你所有的编辑工作。

.--重复 重复编辑工作。