2020年3月11日 星期三

vi移动文本命令

vi编辑器拥有一项特殊的功能,即将文本从一个位置移动或者复制到另一个位置,这就是vi移动文本命令。

vi总是在一个称为无名缓冲区(unnamed buffer)的存储区中为上一次删除保存一份副本。在任何时候,都是可以使用p和P(put,放入)命令将无名缓冲区的内容复制到编辑缓冲区(这块存储区被称为无名缓冲区的原因在于还有一些其它有名称的类似存储区)。


p(小写字母“p”)命令将无名缓冲区的内容插入到光标当前位置之后。例如,假设当前行包含:

This good is a sentence.
将光标移动到“g”上,并删除一个单词。

dw

在这样做时,删除的单词将被复制到无名缓冲区中。现在当前行变为:

This is a sentence.
下面,将光标移动到“a”之后的空格处,并键入:

p

无名缓冲区的内容将插入到光标的右边。现在当前行变为:

This is a good sentence.
下面举一个使用P(大写字母“P”)命令的例子。假设当前行包括:

This is right now.
将光标移动到单词“right”前面的空格处,并键入:

de

这将删除这个单词,结果如下所示:

This is now.
现在将光标移动到行尾的点号处,并键入:

P

被删除的单词将插入到光标的左边。现在当前行变为:

This is now right.
无名缓冲区每次只能存放一次删除的内容,理解这一点非常重要。例如,假设您刚删除了1000行文本。无名缓冲区存储了该文本的一份副本。如果希望,则可以将该文本插入到编辑缓冲区的任何位置上。现在,您又删除了一个字符。这时候,无名缓冲区的1000行文本将被移除。如果现在再使用p命令,那么得到的是最后一次删除的内容,也就是一个字符。

下面考虑命令组合xpx命令删除当前光标位置处的字符。p命令将删除的内容插入到光标的右边。该组合命令的最终结果就是调换两个字符的位置。例如,假设当前行为:

I ma never mixed up.
将光标移动到第一个“m”处并键入:

xp

现在当前行变为:

I am never mixed up.
另一个重要的组合命令是deep,该组合命令可以用来调换两个单词。下面举例说明,假设当前行包含:

I am mixed never up.
将光标移动到单词“mixed”前面的空格处(一定要注意将光标移动到这个单词前面的空格处,而不是这个单词的第一个字母上)。现在键入:

deep
de命令删除空格及后面的单词,这时当前行变为:

I am never up.
第二个e命令移动到下一个单词的尾部,然后p命令将删除内容插入到光标之后。最终结果是:

I am never mixed up.
通过这种方式,可以轻松地调换两个单词。考虑一下,并记住这条组合命令,1⃣️便需要时,可以快速的键入这条组合命令。

每当删除整行时,pP也将插入整行。不同的是,p命令将删除的行插入到当前行的下面,而P命令将删除的行插入到当前行的上面。例如,假设您希望从一个位置向另一个位置移动10行文本。首先,将光标移动到文本的第一行。然后使用一个带重复次数的dd命令删除10行:

10dd
这些行将从编辑缓冲区中被删除,并复制到无名缓冲区中。下面将光标移动至在其下面进行插入的那一行,并键入:

P

现在,考虑如果键入ddp会发生什么情况。dd命令删除当前行。下一行称为新的当前行。p命令将删除内容插入到新当前行的下面。最终结果是调换了两行。

概括起来:
p 复制上一次删除的内容,插入到光标后面/下面

P复制上一次删除的内容,插入到光标前面/上面

xp调换两个字符

deep调换两个单词(光标开始处于第一个单词的左边)

ddp 调换两行

沒有留言:

張貼留言