Vim:用另一个之前的replace线

每天至less有一次我有以下情况:

A: This line should also replace line X ... X: This is line should be replaced 

我相信我不会有效地执行这个任务。

我做的事:

  • 去A线: AG
  • Yank线A: YY
  • 转到X: XG
  • 粘贴行A: P
  • 移到老线: j
  • 删除旧行: dd

这还有另一个缺点,就是X行现在在默认的寄存器中,如果我find另外一行应该被replace为A,那么这很麻烦。Yanking和附加寄存器( “ayy”aP )的粘贴使得这个简单的任务变得简单效率较低。

我的问题:

  • 我错过了一个内置的Vim命令来replace之前被抽出的一行吗?
  • 如果没有,我怎样才能绑定我自己的命令离开(或恢复)在默认寄存器中被抽出的行?

我会做什么:

  1. aG
  2. Y
  3. xG
  4. Vp

你不必离开正常的模式,但它不会放弃线路。 然而,你可以使用V"0p ,它将总是把第2步中的行抽出。

Vp :select行,粘贴被抽出的东西

这有另外的缺点,现在行X是在默认的注册,这是讨厌的,如果我find另一行应该被replaceA.

要删除文本而不影响正常的寄存器,可以使用黑洞寄存器"_

 "_dd 

我会使用命令行(Ex)模式并执行以下两个命令

 :XmA :Ad 

这只是简单地将X线移动到A之下,然后删除A就移动了

例如

 :7m3 :3d 
  1. YY
  2. j(移动到要replace的行),然后
  3. Vp(大写v,然后p,将replace为被抽出的内容)
  1. 移到第一行的开头。

  2. y$ – 复制最后没有换行符的行

  3. 移到目标行的开始处。

    1. Vp – 只replace一个目标行

    2. ccCtrl r0Esc – 用原来的yankreplace目标行

  4. 移到下一个目标行的开始处。

  5. – 重复4.2发出的命令。

笔记:

  • 4.1是y$,因为如果您执行yyY,您将复制换行符,而Ctrl r0实际上会将换行符添加到目标行的下方。

  • 4.2代替V p ,因为从技术上来说最后一个操作是删除,所以不能重复使用 只会删除一行。

  • 如果有人知道如何从EX模式(命令行)发出'用寄存器replace当前行',我想听到你的消息(并知道你在哪里find文档)。 可能有一个可重复的EX命令,它比4.2快,并且没有换行符警告。

你可以在可视模式下使用它。

  • 去A线: A
  • select具有可视模式的行: V ESC
  • 去X行: X G
  • input行的替代模式: S
  • 粘贴你复制的行: shift + insert (或其他任何你映射的剪贴板粘贴)。

这是我会做的

  • 移动A行的开始, A G (其中A是明显的行号)
  • 将某行向某个寄存器跳过,例如a(不带新行)。 input a y $”
  • 移动到插入行X G
  • 替补线S
  • 从寄存器a插入, Ctrl-R a

您可以在正常模式下使用此命令:

 :AmX | Xd 

m命令用于m[ove] ,它将行号X后面的行号A移动,如果要复制而不是移动行,请使用co[py]d命令是d[elete]

你可以移动(使用co复制)一系列的行使用

 :start,end m X 

build立在build议使用VpVP粘贴在一行上的答案 – 为了避免改变Yank寄存器的内容,我发现最符合人体工程学的命令是:

VPY

  1. :ay(其中a是行号,例如:20y)。 这一行(双关语打算)。
  2. VP

我经常需要一行代替多个地方,每个地方都有不同的值(这意味着我不能做一个正则expression式)。

要抽出所需的原始线

然后在你想要replace的每一行上, V p zero Y

我发现使用Ex命令更容易。 恩。 将第9行移动到46:

  :46|9m.|-1d 

这会将光标移动到第46行,将第9行移到当前的下方,然后删除前一行(因为移动的行是当前行)。

或使用标记,使用标记“a”:

 :46ma a|9m'a|'ad 

我会简单地使用“黑洞”寄存器:

给定:

nnoremap <Cd>“_dd

解决scheme将是:

<Cd> yy