1

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

hello 
world 
!

hello     hello 
world     world 
!         !
4

2 回答 2

2

处理列中的文本是Visual-Block 模式的用途!

您可以使用以下命令为所有文本创建块状视觉选择:

  • gg去顶端;然后
  • Ctrl+V启动可视块模式。(您可能会-- VISUAL BLOCK --在屏幕的最后一行看到。)
  • G转到缓冲区的最后一行。
  • $选择直到每行的末尾。这很重要!由于行可能有不同数量的字符,它的$行为方式很特殊,它不会强制选择矩形格式,而是将其扩展到最长的行,无论它有多少列。

在 Visual Block 中选择完所有内容后,您可以使用y将其拉入未命名的寄存器中。

那时,当你把它放进去时,它会作为一个块,作为一个柱子回来。

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

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

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

于 2021-12-23T16:57:04.980 回答
0

:%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

于 2021-12-23T15:46:09.007 回答