Vim按顺序猛拉/替换

时间:2012-09-22 20:15:12

标签: vim

目的

  • 划线并用它来覆盖“某些”后面的行。

假设

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

类比

将此过程视为从文本行创建“标记”并浏览项目列表,每个项目都是“标记”行后面的一行文本,并决定是否应使用该行覆盖该行“邮票”的内容与否。如果是这样,请用“标记”替换该行。

最后一步,即用光标内容触发删除/替换光标下的行应该尽可能简单,最好像按 . 一样简单(重复上次更改) @@ (执行宏注册@的内容)

问题

简单的工作流程:

  • 将光标定位在要复制的行(使用移动命令)
  • V (按行方式启动可视模式)
  • y (将文字拖入未指定的注册表)
  • 手动将光标定位到要替换的行(使用移动命令)
  • V (按行方式启动可视模式)(选择要替换的文字)
  • p (将文字放在光标后的未指定寄存器中)
如果多次应用,

不起作用。

具体来说,替换文本会覆盖包含最初复制的行的寄存器,并打算用作“戳记”。

我尝试了什么

我尝试将 "_y 用于yankdelete到命名寄存器“下划线”,避免丢失邮票内容,但我正在寻找能够快速舒适地输入的东西,因为我手动浏览列表并在我认为合适的地方应用替换。

我更喜欢使用

如果我可以提供帮助,我宁愿不使用宏或“重映射”。

说明性示例文件

为了进一步明确,请参阅下面的示例起始文件,然后是所需的最终阶段。

示例文件,开始条件

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

blueberry

apple
banana
coconut
apple
banana
coconut
apple
banana
coconut

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

在浏览列表后,我已经应用了一些替换,使用某些行的“stamp”“on”,使它们与“stamp”行相同。

blueberry

apple
banana
blueberry
apple
banana
coconut
apple
banana
blueberry

4 个答案:

答案 0 :(得分:1)

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

我一直在使用这个“很长一段时间”:

vnoremap <leader>p "_dP

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

另外,您知道替换的c标志吗?

:%s/coconut/blueberry/c

会要求您确认每场比赛。

答案 1 :(得分:0)

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

  1. y$猛拉整条线(不包括换行符)。
  2. jk前进到下一行要替换(根据需要重复)
  3. 用您的拉动文字替换该行
    • C<c-r>0<esc>0 (第一次)
    • . (后续时间)
  4. 如果有更多行要更换,请转到2。
  5. 每一步后光标将保持在零列。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

在这种模式下,您的工作流程现在可以完全按照您的描述运行:无论您喜欢什么,都可以自由反复地选择,粘贴和删除 - 您的缓冲区始终保持不变。如果您希望恢复vim正常的缓冲区更改行为,请再次键入,,

脚本是接受的答案:

vim toggling buffer overwrite behavior when deleting