10

客观的

拉出一行并用它来覆盖它后面的一些行。

假设

在这种情况下,最好手动选择要应用替换的行。换句话说,不需要自动查找和替换。

比喻

将此过程视为从一行文本创建一个“标记”并遍历项目列表(每个项目是“标记”行之后的一行文本)并决定是否应使用该行的内容覆盖该行“邮票”与否(在前一种情况下,当然用“邮票”代替该行)。

触发用戳记内容替换光标下的行的最后一步应该尽可能简单;最好像按 .重复上次更改)或 @@执行宏寄存器的内容 @)一样简单。

问题

当然,简单的工作流程如下。

  1. 将光标定位在要复制的行上(使用移动命令)。
  2. 进入逐行可视模式(通过V 命令)。
  3. 复制选定的文本(使用y 命令)。
  4. 手动将光标定位到要替换的行上(使用移动命令)。
  5. 再次进入可视模式以选择要替换的文本(使用V 命令)。
  6. 粘贴在选择上(使用p 命令)。

但是,当必须多次更换时,这种方法不起作用。具体来说,替换步骤 6 中的文本会覆盖(未命名的)寄存器,该寄存器包含最初复制并打算用作“标记”的行。

我试过的

我曾尝试使用"_y拉动或删除到_ 寄存器中,以避免丢失邮票的内容,但我正在寻找最终可以快速舒适地键入的东西,因为我手动浏览列表并在我的位置应用替换觉得合适。

我不想使用的东西

如果可以的话,我宁愿为此使用宏或“重映射”。

说明性示例文件

请参阅下面的示例起始文件,然后是所需的最终阶段,以获得进一步的清晰度。

样本文件,起始条件

在这个阶段,我选择blueberry并使其成为我的“印章”。

blueberry

apple
banana
coconut
apple
banana
coconut
apple
banana
coconut

示例文件,所需的最终状态

在列表中移动之后,我应用了一些替换,在一些行上“加盖”,使它们与“印记”blueberry行相同。

blueberry

apple
banana
blueberry
apple
banana
coconut
apple
banana
blueberry
4

6 回答 6

2

为了使您的工作流程按预期工作,您需要从以前的 yank register 粘贴"0,而不是从默认 register 粘贴。

因此,使用Vy(或yy,相同)像以前一样拉出第一行,然后将光标放在要替换的行上,然后执行

V"0p

这会将当前行替换为先前被拉出的文本,但不会覆盖被拉出的文本。我希望我理解正确!

编辑 1:使用宏重复

我很惊讶这个操作使用 是不可重复的.,但这大概是由于使用了可视模式。要使用宏重复操作,请执行以下操作:

qqV"0pq

然后可以按@q或重复宏@@

编辑2:重复使用.

.这是通过不使用视觉模式使其可重复使用的尝试。拉动印章线并移动光标后,执行以下操作:

"_S<c-r>0<delete>

它使用插入模式<c-r>命令插入寄存器的内容0。请注意,这<delete>是必要的,因为戳记行包含回车符。如果没有(即使用y$而不是猛拉yy<delete>可以省略。

于 2012-09-22T20:31:27.983 回答
1

一个非常简单的解决方案:只需将此脚本放在您的 .vimrc 中,然后通过键入 ,,(两个逗号)来关闭删除键的“缓冲区覆盖”副作用行为以进入“无副作用”模式。

在这种模式下,您的工作流程现在与您描述的完全一样:拉出您喜欢的任何内容,然后自由重复地选择、粘贴和删除——您的缓冲区始终保持不变。如果您希望恢复 vim 的正常缓冲区更改行为,然后再次键入 ,。

该脚本是这里接受的答案:

删除时vim切换缓冲区覆盖行为

于 2012-10-03T14:48:11.320 回答
1

如果没有至少一点点“重新映射”,我认为你不会达到你的目标。

我已经使用这个“很长时间”了:

vnoremap <leader>p "_dP

p并且P仍然像往常一样工作,,p当我想稍后重复相同的粘贴时,我只是简单地点击了一个视觉选择。您还可以映射单个功能键以使整个操作更快。

另外,你知道c换人的标志吗?

:%s/coconut/blueberry/c

将要求您确认每场比赛。

于 2012-09-22T21:22:16.317 回答
1

这里的许多答案概述了一般键或命令。我已经将它们变成了我的ReplaceWithRegister 插件,它还可以处理许多极端情况,并允许通过.命令快速重复。我也经常使用您描述的创建标记和替换技术,并且发现我的脚本不可或缺。如果您不喜欢它,插件页面还包含指向替代插件的链接。

于 2012-09-23T09:24:56.810 回答
1

可以借助 Ex 命令来实现上述工作流程。

对于单个替换,拉出“stamp”行(使用yyVy:y或其他方式),然后重复使用 :putand:delete命令的组合:

:pu|-d_

与任何其他 Ex 命令一样,可以使用 @:快捷方式轻松重复此命令(请参阅 参考资料:help @:) — 除非同时发出另一个 Ex 命令(在这种情况下,将重复该命令)。

当然,您也可以将上述 Ex 命令记录为宏并以这种方式调用它。

于 2012-09-23T05:57:12.860 回答
0

从要复制的行开头的光标开始:

  1. y$拉整行(不包括换行符)。
  2. jk前进到要替换的下一行(根据需要重复)
  3. 用您抽出的文本替换该行
    • C<c-r>0<esc>0 (第一次)
    • . (随后的时间)
  4. 如果有更多行需要替换,请转到 2。

在每一步之后,光标将保持在第 0 列。

于 2012-09-23T00:24:29.773 回答