如何将当前行内容复制到整个文件的每行末尾?例如:
来自
hello
world
!
至
hello hello
world world
! !
处理列中的文本就是Visual Block模式的用途!
您可以使用为所有文本创建分块视觉选择
gg
进入顶部;那么-
Ctrl+V以启动视觉块模式。(您可能会在屏幕的最后一行看到
-- VISUAL BLOCK --
。( - CCD_ 3转到缓冲区的最后一行
$
选择,直到每行结束。这非常重要!由于行可能有不同数量的字符,$
的行为有一种特殊的方式,即它不强制选择矩形格式,而是将其扩展到最长的行,无论它有多少列
一旦在Visual Block中选择了所有内容,就可以使用y
将其拉入未命名的寄存器。
在这一点上,当你把它放进去的时候,它会变成一个块,一列。
返回到第一行,使用 Esc在这一点上,您可以使用gg
,然后附加一定数量的空格,将您带到希望第二个副本出现的列。例如,对于20个空格,可以使用20A
,然后使用空格和$
转到该行的末尾,然后简单地使用p
。在Visual Block模式下猛拉寄存器后,Vim会记住这一点,并将内容作为一列。需要用空格扩展以允许粘贴的文本在后面的列中开始的行将自动扩展。'virtualedit'
选项(对于"视觉块"模式(也很有用,它使您可以将光标导航到行的末尾。如果您使用:set virtualedit=all
启用它,那么您可以跳过关于向第一行添加足够空格的部分,因为您可以简单地导航到适当的列,并且使用p
粘贴视觉块内容的操作也会用空格扩展第一行。
:%s/^(.*)$/1 1
%
-整个文件s/^(.*)$
-从开始到结束的匹配线/1 1
-将其替换为匹配的文本两次
格式化列中的这些行可能有问题。这里有一个例子:
hello hello
hello hello
world world
! !
这可以通过添加尾部空间来解决,即较短的行,如下所示:(.
-表示尾部空间(
hello hello
hello hello
world world
!.... !....
正如@mattb在评论中提到的,列格式问题可以通过column
命令解决(但它必须在您的PATH上(::%s/^(.*)$/1 1/ | %!column -t