Vim:替换另一条线之前的线路

时间:2010-12-26 10:44:36

标签: vim

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

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

我相信我没有有效地执行这项任务。

我的所作所为:

  • 转到第A行: AG
  • Yank line A: yy
  • 转到第X行: XG
  • 粘贴线A: P
  • 转到旧行: j
  • 删除旧行: dd

这有一个额外的缺点,就是X行现在在默认寄存器中,如果我发现另一行应该用A替换,那就太烦人了。从另一个寄存器中缓冲并粘贴(“ayy “aP ”使这项简单的任务效率更低。

我的问题:

  • 我是否错过了内置的Vim命令来替换之前被猛拉的线路?
  • 如果没有,我如何绑定自己的命令,将默认寄存器中的拉线留下(或恢复)?

17 个答案:

答案 0 :(得分:90)

Vp:选择行,粘贴被拽的内容

答案 1 :(得分:80)

我会做什么:

  1. aG
  2. Y
  3. xG
  4. Vp
  5. 您不必离开普通模式,但 拉线。但是,您可以使用V"0p,这将始终将行拉入第2步。

答案 2 :(得分:43)

  

这有另外的缺点   该行X现在是默认值   注册,如果我发现这很烦人   另一条应该被替换的线   与A。

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

"_dd

答案 3 :(得分:9)

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

:XmA
:Ad

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

例如

:7m3
:3d

答案 4 :(得分:9)

  1. YY
  2. j(移至要替换的行),然后
  3. Vp(大写v然后p,将替换为被拉动的内容)

答案 5 :(得分:6)

  1. 移至第一行的开头。

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

  3. 移至目标线的起点。

    1. V p - 只替换一个目标线

    2. c c Ctrl r 0 Esc - 用原始的抽屉替换目标线

  4. 移至下一个目标行的开头。

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

  6. 注意:

    • 4.1是 y $ 因为如果你做 y y 您将复制换行符, Ctrl r 0 实际上会在目标行下方添加换行符。

    • 4.2替换 V p ,这对重复不起作用,因为从技术上讲,最后一个动作是删除,所以会只需删除一行。

    • 如果有人知道如何从EX模式(命令行)发出“用寄存器替换当前行”,我想听听您的意见(并知道您在哪里找到了文档)。可能存在可重复的EX命令,该命令比4.2更快和/或没有断行警告。

答案 6 :(得分:4)

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

  • 转到第A行:A G
  • 选择具有可视模式的行: V ESC
  • 转到第X行:X G
  • 输入行的替代模式: S
  • 粘贴您复制的行: shift + insert (或您从剪贴板粘贴的其他任何映射)。

答案 7 :(得分:3)

这就是我要做的事情

  • 移动A行的开头, A G (其中A显然是行号)
  • Yank line to some register,例如a(没有新行)。输入 a y $
  • 移至插入行, X G
  • 替代行, S
  • 从寄存器a插入, Ctrl-R a

答案 8 :(得分:3)

根据建议使用VpVP粘贴一行的答案 - 为了避免更改yank寄存器的内容,我发现最符合人体工程学的命令就是:

VPY

答案 9 :(得分:2)

您可以在普通模式下使用此命令:

:AmX | Xd

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

您可以使用

移动(使用co复制)一系列行
:start,end m X

答案 10 :(得分:2)

鉴于cicld最近的评论(谢谢!),我发现我没有完全理解原始问题。移动该行是不合适的,但是复制是可行的(因为该行被取消了。)所以我将其修改为:

var str = 'fooBar/{thing:hi}{thing:hello}'

console.log( str.split('{thing:').slice(1).map(s => s.split('}')[0]) );
  1. 在第20行之后复制第一行(:1t20:20d_ :t的别名)(将其放置在第21行)

  2. 删除第20行,将已删除的行放入“黑洞”寄存器(:copy)(即不影响当前的yank缓冲区)

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

答案 11 :(得分:2)

您也可以这样做:

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)

答案 12 :(得分:1)

  1. :ay(其中a是行号。例如:20y)。这猛拉了一条线(双关语)。
  2. Vp

答案 13 :(得分:1)

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

 :46|9m.|-1d

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

或使用标记,使用标记'a':

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

答案 14 :(得分:1)

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

Y 以拉出所需的原始线

然后在你想要替换的每一行上, V p 0 Y

答案 15 :(得分:0)

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

下式给出:

nnoremap< C-d> " _dd

解决方案是:

< C-d> yy

答案 16 :(得分:0)

如果您只想更改部分行,您可以这样做:

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

y,$ - 从光标移动到 EndOfLine

移动到要替换的位置

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