2020年3月8日 星期日

vi撤销或重复改变命令

一旦开始进行替换和删除,能够撤销改变就变得十分重要,所以要掌握vi撤销或重复改变命令。例如,假设您希望将单词“advertisement”的所有匹配项都改变为 “ad”。您决定输入:

:%s/advertisement/ad/g
但是,您不小心键入错误,忘记了键入第二个“d”:


:%s/advertisement/a/g
这就将所有的“advertisement”都替换为字母“a”。但是,您不能通过就所有的“a”改变为“ad”来解决这个问题,因为字母“a”到处都是。您可以使用:q!命令,不保存工作就推出vi,但是这样会丢失整个编辑期间的所有改变,前面的工作都白白浪费。那么,还有其他的方法?

下面与一个相似的案例。您希望删除10行,但是您键入的不是10dd,而是100dd,结果您删除了100行。有没有方法将这100行恢复呢?

两个问题的答案都是肯定的。vi中有两条命令可以用来撤销改变,另外还有一条重复上一次改变的命令:

u 撤销上一命令对编辑缓冲区的修改

U 恢复当前行

. 重复上一命令对编辑缓冲区的修改。


u(小写字母“u”)命令撤销上一命令对编辑缓冲区所做的改变:插入、替换、改变或删除。在两个例子中,只需键入u,所有的替换/删除都会被废除。如果在按了u键之后,您又决定保留原来的改变,则只需再次按下u键。u命令可以撤销自己。

U(大写字母“U”)命令将撤销自移动到当前行的那一刻起,对当前行所进行的所有改变。例如,假设您将光标移动到某一特定行,并进行了大量的改变,但是没有离开这一行。然而您将这一行搞乱了,因此您决定将这一行恢复到刚刚移动到这一行时的模式。这时只需键入U,这一行将恢复其原始内容。如果在按了U键之后,又不喜欢这种结果了,可以使用u(小写字母u)撤销该命令。

U命令可以撤销大量的改变,一次就将当前行的所有改变都恢复。但是,仅当还没有离开这一行时U命令才有效。一旦将光标移动到新行上去,U命令就只适用于这个新行,此时将无法找到简单的方法来恢复旧行上所做的改变。

除了u和U命令之外,还有另外一条重要的命令,该命令涉及到编辑缓冲区的上一次改变。这条命令就是.号命令。使用它可以重复上一条命令对编辑缓冲区所做的修改。该命令非常有用,因此洗面将举例说明:
假设您希望在编辑缓冲区的几个不同位置插入名称“Mxyzptlk”。这是一个比较难拼写的名称,而且每次插入都要重新键入也很烦人,但是有一种巧妙的方法可以实现这一目标。将光标移动到希望进行第一次插入的位置上,然后键入:

iMxyzptlk<Esc>
您已经将这一名称插入到编辑缓冲区。现在,将光标移动到下一个希望插入的位置上去,并键入:

.
这将执行完全相同的插入。您可以根据需要多次使用.命令,但是一定要小心:一旦进行了另一个改变,即便只是一个字符的删除,.命令的结果将会随之改变。

沒有留言:

張貼留言