vim,将整行复制到每行的末尾?

vim, duplicate whole line to the end of each line?

如何将当前行内容复制到整个文件的每行末尾? 例如:

来自

hello 
world 
!

hello     hello 
world     world 
!         !

:%s/^\(.*\)$/

  • % - 整个文件
  • s/^\(.*\)$ - 从头到尾匹配行
  • / - 用匹配的文本替换它两次。

列中的这些行的格式设置可能有问题。 这是一个例子:

hello           hello
hello           hello
world           world
!           !

这可以通过添加尾随 spaces 来解决,较短的行,如下所示:(. - 表示尾随 space)

hello           hello
hello           hello
world           world
!....           !....    

正如@mattb 在评论中提到的,可以使用 column 命令修复列格式问题(尽管它必须在您的 PATH 中): :%s/^\(.*\)$/ / | %!column -t

处理列中的文本是 Visual-Block mode 的目的!

您可以使用以下方法为所有文本创建块状视觉 selection:

  • gg 登上顶峰;然后
  • Ctrl+V 启动可视块模式。 (您可能会在屏幕的最后一行看到 -- VISUAL BLOCK --。)
  • G 转到缓冲区的最后一行。
  • $ 到 select 直到每行结束。这非常重要!由于行可能有不同数量的字符,$ 以一种特殊的方式表现,而不是强制矩形格式到 selection,它将它扩展到最长的行,无论列数是多少它有。

将所有内容 select 编辑到可视块后,您可以使用 y 将其拉入未命名的寄存器。

到那时,当你把它放回去时,它会以块状、柱状返回。

返回第一行,使用 gg,然后附加一定数量的空格,将您带到您希望第二个副本出现的列。例如,对于 20 个空格,您可以使用 20A 然后 SpaceEsc.

此时,您可以使用 $ 转到该行的末尾,然后简单地使用 p。由于寄存器在可视块模式下被抽出,Vim 会记住这一点并将内容作为一列。需要用空格扩展以允许粘贴的文本在后面的列中开始的行将自动扩展。

'virtualedit' 选项(在可视块模式下)也很有用,它允许您将光标导航到行尾。如果您使用 :set virtualedit=all 启用它,那么您可以跳过关于在第一行添加足够空格的部分,因为您可以简单地导航到适当的列并使用 p 粘贴可视块内容的操作也会用空格扩展第一行。