在另一行vim的末尾放置一个选中的行

时间:2018-08-22 03:33:02

标签: vim

如何在其他行的末尾放置一些拉线的行?

之前:

11 
1 
2 
3 
10 

0.0
0.045
0.09
0

之后:

11 
1 0.0
2 0.045
3 0.09
10 0

3 个答案:

答案 0 :(得分:3)

要在行尾之前进行块选择,即使对于不匹配的列数,也要首先垂直选择所有行中的第一列,然后按$

因此,在您的情况下,将光标移动到0.0的第一列,按ctrl-v,将光标向下移动到最后一行,按$,就可以选择块了。现在,您可以使用d进行剪切并将其粘贴到第二行。

编辑:由于您将10放在此处,因此粘贴部分变得更加复杂。我将首先越过最右边一列中不影响其他列的块。因此,转到第二行,在1之后添加两个空格,然后粘贴该块。结果将如下所示:

11
1  0.0
2  0.045
3  0.09
10 0

现在,您需要删除所有行中重复的空格(如果它们干扰您)。在像这样的简单示例中,您可以通过另一个块选择来实现。在更复杂的示例中,您可以使用搜索/替换模式来完成此操作。

答案 1 :(得分:3)

对于这种特定情况,您还可以使用:g:m对行进行重新排序并加入它们。将光标放在第一行,执行}dd删除空白行。光标应与0.0对齐。现在做一个简单的:

:,$g/./2m-1|j

Vim Demo

这与:g一起充当行上的迭代器。 :g命令选择与特定模式匹配的范围内的行,并以:[range]g{pattern}{command}的形式在这样的匹配行上运行命令。将其分成更小的部分:

  • ,$,该范围是.,$的缩写,表示从当前行到文件末尾。这就是光标位置很重要的原因。
  • /./匹配包含任何字符的行,实际上是一个占位符,表示匹配每行
  • 2m-1|j是“ tricky”部分,由两个命令组成:
    • 2m-1移动命令,格式为[range]m{address}。将行从 range 移到 address 下面。使用时,意味着将第二行移至地址-1,该地址本身就是另一段“棘手问题”。 -1.-1的缩写,表示当前行位置(.)减1。此时,光标向上移动以坐在刚移动的线上。
    • j连接命令,将当前行连接到下一行,并在其间留有空格。

您可以通过运行:2m-1然后在:j行开始的每一行中0.0来逐步模拟发生的情况。同样,这里的:g就像这些命令的最后4行的迭代器一样。

以(*代表光标位置)开头:

  11
  1
  2
  3
  10
* 0.0
  0.045
  0.09
  0

运行:2 move .-1会将其转换为:

  11
  2
  3
  10
* 1
  0.0
  0.045
  0.09
  0 

然后:join

  11
  2
  3
  10
* 1 0.0
  0.045
  0.09
  0

移至下一行并重复。

答案 2 :(得分:2)

@GeorgP。的答案已经概述了进行逐块删除的必要性,以便粘贴不会创建新行,而是将其添加到现有行中。更不用说逐块删除会留下空行,因此还有一个额外的步骤可以消除空行。

我经常需要将注册内容“广播”到某种(字符/行/块)模式,为此我写了UnconditionalPaste plugin。有了它,您可以使用4dd完全(即按行)删除第二个块,然后在第二个末尾使用插件的gbp(按逐行粘贴)映射线。就像@GeorgP。的答案一样,这将使最后一行包含100而不是10 0,并且有必要使用相同的解决方法来插入额外的填充空间。

但是,我的插件提供了许多其他的粘贴变体,而gBp粘贴为最小拟合(非矩形)块,带有锯齿状的右边缘。在行末粘贴gBp时,请在以下行的锯齿状末尾附加。这正是此处所需要的。因此,如果您愿意安装插件,则可以通过4dd2G$gBp完成整个操作。