Vim: 用之前拉过的另一条线替换一条线

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

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

我认为我没有有效地完成那项任务。

我的工作:

  • 转到行 A: AG(用行号替换 A)
  • 美国航空 A: yy
  • 转到行 X: XG(用行号替换 X)
  • 粘贴行 A: P
  • 移到旧线: j
  • 删除旧行: dd

这有一个额外的缺点,那就是 X 行现在处于默认寄存器中,如果我发现另一行应该被 A 代替,这会很恼人,从另一个寄存器("ayy"aP)中拉出并粘贴,使得这个简单的任务效率更低。

我的问题:

  • 我是否错过了一个内置的 Vim 命令来替换之前被猛拉的一行?
  • 如果没有,我如何绑定我自己的命令,离开(或恢复)在默认寄存器中的拉线?
50001 次浏览

您可以在视觉模式下使用它。

  • 转到 A 行: AG
  • 选择视觉模式的行: VESC
  • 转到行 X: XG
  • 输入该行的替代模式: S
  • 粘贴您复制的行: shift + insert(或任何其他您从剪贴板粘贴映射)。

我会这么做

  • 移动行 A,AG的开头(其中 A 显然是行号)
  • 将行拖到某个寄存器上,例如 a (没有新行)。键入 "ay$
  • 移动到插入行 XG
  • 替代线路 S
  • 从寄存器 a 插入,Ctrl-Ra

我会怎么做:

  1. 36G(用您要转到的行号替换 36)
  2. Y
  3. 70G(用您要转到的行号替换 70)
  4. Vp

你不必离开正常模式,但它 是的猛拉线。然而,您可以使用 V"0p,它总是将行猛拉在第2步。

这还有一个额外的缺点 X 行现在是默认值 收银机,如果我发现 另一条应该被替换的线 A.

要在不影响正常寄存器的情况下删除文本,可以使用黑洞寄存器 "_:

"_dd

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

:XmA
:Ad

这只是将 X 行移动到刚好在 A 下面,然后删除 A,移动该行

比如说

:7m3
:3d
  1. 广州欢聚时代
  2. J (移动到要替换的行) ,然后
  3. Vp (大写的 v,然后是 p,将替换为被拉的内容)

你可以在普通模式下使用这个命令:

:AmX | Xd

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

您可以移动(使用 co复制)一系列行,使用

:start,end m X
  1. : ay (其中 a 是行号。例如: 20y)。
  2. 副总裁
  1. 移动到第一行的开始。

  2. y$-复制结尾没有分行符的那一行

  3. 移动到目标线的起点。

    1. Vp-只替换一个目标线

    2. ccCtrlr0Esc-用原来的扬克替换目标线

  4. 移动到下一个目标线的起点。

  5. .-重复在4.2时发出的命令。

备注:

  • 4.1是 y$,因为如果你做 yy或者 Y,你将复制换行符,而 Ctrlr0实际上在你的目标线下面添加了换行符。

  • 4.2代替了 V p,后者不适用于 repeat,因为从技术上讲,最后一个操作是 delete,所以 .只会删除一行。

  • 如果有人知道如何从 EX 模式(命令行)发出“用 register 替换当前行”,我想听听您的意见(并且想知道您在哪里找到这些文档)。可能有一个可重复的 EX 命令,其速度比4.2快,并且/或者没有换行符警告。

Vp: 选择行,粘贴什么是猛拉

我发现使用 Ex 命令更容易; 例如,将第9行移动到46行:

 :46|9m.|-1d

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

或使用标记(s) ,使用标记‘ a’:

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

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

给定:

Nnoremap < C-d >”_ dd

解决办法是:

< C-d > 广州欢聚时代

我经常需要 Y 一行并在多个位置替换它,每个位置都有不同的值(这意味着我不能执行正则表达式)。

Y拉动所需的原始线

然后在你想要替换的每一行上,VpzeroY

基于建议使用 VpVP粘贴在一行上的答案——为了避免更改 yank 寄存器的内容,我发现最符合人体工程学的命令很简单:

VPY

根据 冷冻最近的评论(谢谢!),我看到我没有抓住原来的问题完全。移动这条线是不合适的,但是复制是合适的(因为这条线被拉住了)所以我会修改成:

:1t20:20d_
  1. 复制第20行后的第1行(:t命令是 :copy的别名)(将其放置在第21行)

  2. 删除第20行,将删除的行放入‘ blackhole’寄存器(_)(即不影响当前的 yank 缓冲区)

正如最近的评论中提到的,这不会影响当前的光标位置。

你也可以这样做:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • 不会创建空格或行结束。
  • 光标放在复制文本的开头。

同样的键可以用来拖拽/粘贴多行。

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

如果你只想改变一部分行,你可以这样做:

移动到要复制的文本部分的位置

y$-从光标拉到 EndOfLine

移动到你想要替换的位置

v$p-用寄存器内容从游标替换到 EndOfLine