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

cri*_*spy 105 vim

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

A: This line should also replace line X
...
X: This is line should be replaced
Run Code Online (Sandbox Code Playgroud)

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

我所做的:

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

这具有额外的缺点,现在该行X是在默认的寄存器,它是烦人,如果我觉得应该A.唬弄并粘贴从一个额外的寄存器来代替另一条线("AYY," AP)使得即使这个简单的任务效率低下.

我的问题:

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

Dor*_*ian 97

Vp:选择行,粘贴被猛拉的东西

  • 非常好的技巧,虽然值得注意一个(也许)重要的警告:这会导致yank寄存器更新被覆盖的行的内容,因此它可能无法很好地处理某些任务 - 例如,如果你想覆盖同一行到多个目的地. (22认同)
  • @underscore_d,如果你做'V"0p`,它可以很好地播放,它从最后一个被拉动的寄存器中粘贴. (6认同)
  • 好的解决方案 谢谢.学到的东西:) (3认同)
  • VP也一样有效,这很方便,因为您可以在整个序列中保持Shift不变。 (2认同)
  • @theprogrammer `"` 代表寄存器,而 `0` 是复制寄存器。因此 `"0` 告诉 `p` 从复制寄存器粘贴。该寄存器与默认寄存器是分开的,这就是“Vp”将删除的内容(猛拉填充默认寄存器和它自己的寄存器)。 (2认同)

ice*_*ime 85

我会怎么做:

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

您不必离开正常模式,但它确实会拉扯该线.但是V"0p,您可以使用哪一条始终将线条放入第2步.

  • @duddle:是的,`Y`是`yy`的同义词 (11认同)
  • 步骤1和2可以组合使用:ay [例如:20y]随后Vp应该做的伎俩.你不必去划线就可以了. (8认同)
  • Y是yy的别名吗? (5认同)
  • 如果用ccCTRL + r0ESC而不是V"0p覆盖其他行,那么所有后续行都可以用.替换.(转发器) (2认同)
  • 我不明白什么是“aG”?`a` 将在光标后一个字符进入插入模式,而 `G` 将仅插入大写 G 字母。 (2认同)

Eug*_*ash 43

这有一个额外的缺点,就是X行现在在默认寄存器中,如果我发现另一行应该用A代替,这很烦人.

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

"_dd
Run Code Online (Sandbox Code Playgroud)

  • 我在.vimrc中添加了一些映射,使`d`和`dd`始终使用黑洞,而`x`和`xx`执行大多数编辑器称之为"剪切"(删除并保存到默认寄存器): `noremap xd``noremap xx dd``noremap d"_d``noremap dd"_dd` (10认同)
  • 我对在 VIM 中重新映射事物持谨慎态度,因为这在其他计算机上或在 IDE 的 VIM 样式插件中可能并不容易。此外,如果您真的深入挖掘,VIM 的设计者往往已经解决了默认映射的问题。 (2认同)

小智 11

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


小智 9

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

:XmA
:Ad
Run Code Online (Sandbox Code Playgroud)

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

例如

:7m3
:3d
Run Code Online (Sandbox Code Playgroud)


Ric*_*rdW 9

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

VPY


Jor*_*ris 6

  1. 移动到第一行的开头.

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

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

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

    2. c,c,Ctrlr,0, Esc-替换原来的猛拉目标线

  4. 移动到下一个目标线的开头.

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

笔记:

  • 4.1 y,$因为如果你这样做y,y或者Y你会复制断行,并且Ctrlr0实际上增加了你的目标线以下的换行符.

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

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


小智 6

你也可以这样做:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
Run Code Online (Sandbox Code Playgroud)
  • 不创建空格或行尾。
  • 光标位于复制文本的开头。

相同的键可用于拉出/粘贴多于一行。

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)
Run Code Online (Sandbox Code Playgroud)


Nat*_*man 5

您可以将其与视觉模式一起使用。

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


Bri*_*sen 5

这就是我要做的

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