快速更改 vim 中的接下来几行?

快速更改 vim 中的接下来几行?

我有当前文件(当前位置为 [n])

The [p]hilosophical chicken saw the street
The red dog saw the street
The red dog crossed the street
The apple was red
The red dog crossed the street
The red dog was sleeping

我想更改接下来的 4 行,其中包含红色的狗哲学鸡

这是我经常遇到的情况并最终使用鼠标。


以最少的击键次数实现此目的的最快方法是什么?

到目前为止我已经尝试过

  • 通过按 Ctrl+g 计算行数,计算下一行并执行 :2,5s:red dog:philosophical chicken:g
    • 大量的时间、思考和打字
  • 宏->qu /red dog Enter c2W philosophical chicken Esc /red dog Enter q 2@u
    • 完成后,大约与使用替换 (:s) 一样快
  • 2yW j P 2dE- 拉出两个单词(忽略标点符号),向下移动 1 行,在光标前粘贴并删除两个单词
    • 快速完成一行,但现在我的缓冲区包含红色的狗,所以我必须返回并重新捕获缓冲区。
  • 强调哲学鸡用鼠标在终端中,点击Ctrl+Shift+C, j 2cW+ Ctrl+ Shift+ V, Esc- 复制文本,向下一行,更改两个单词并进入插入模式并粘贴,Esc 退出插入模式
    • vim 中的鼠标? :(
  • c2W philosophical chicken Esc ?red dog Enter .N.N.- 更改两个单词,输入“哲学鸡”逃脱,反向搜索“红狗”,执行最后一个动作(将2个单词更改为哲学鸡),重复
    • 必须再次输入两个完整的单词

到目前为止,使用鼠标、复制和粘贴更改对我来说是最快的方法。这不可能是正确的方法。

我应该怎么做?

理想情况下,我想拉出 2 个单词,导航到red dog并用拉出的缓冲区替换 2 个单词。

答案1

优化@MattObert所说的:

  • y3iw
  • /red dogEnter
  • c3iwCtrl-r0Esc
  • n.ETC。

详细地:

  • y3iw猛拉philosophical chicken;这比y2W后者包含尾随空格要好一些;该iw部分还确保当您将光标放在第一个单词的中间而不是开头时,猛拉仍然有效
  • /red dogEnter找到第一个red dog
  • c3iw删除red dog(再次,不带尾随空格)并切换到插入模式
  • Ctrl-r0从寄存器粘贴0(参见:h i_CTRL-R:h quote0
  • Esc切换到正常模式
  • n.查找下一个red dog并重播上一个操作(即将其替换为philosophical chicken
  • n.根据需要重复。

第一个技巧是 yank 会自动保存到 register 0。第二个技巧是您可以在插入模式下使用 粘贴寄存器Ctrl-r

其他对您有帮助的事情:

  • 打开行号:(:setlocal relativenumber! number!再次运行将其关闭)
  • 与宏相同:nnoremap <silent> <Leader>, :setlocal relativenumber! number!<CR>
  • 使用相对于光标行的行偏移::.,+6 s/.../.../
  • 替换为确认::%s/red dog/philosophical chicken/gc

看看德鲁·尼尔的维姆卡斯特对于其他类似的技巧。还可以考虑将 Vim 相关问题发布到访问网站

答案2

当然有不止一种方法可以做到这一点。但我认为最简单的方法是搜索 reddog:

/red dog

然后改两个词:

c2w

这将使您进入插入模式,您只需键入:

philosophical chicken

然后按Esc键切换回命令模式,然后键入:

n.n.

直到您将 的所有实例替换red dogphilosophical chicken。 (n将向前搜索 的下一个实例red dog.并将重复上一个命令。)

更少的思考,没有太多的打字,甚至不需要使用缓冲区。(尽管缓冲区很酷!)

也许我误解了这个问题,但这种方法看起来非常简单,我想知道为什么其他人都想得太多了。

编辑:

更仔细地阅读问题后,我发现上面的选项之一是这个的变体,但OP拒绝了它,因为“必须再次输入两个完整的单词”。对于那个很抱歉。但这仍然是我的首选方法。

答案3

我通常会使用第一种方法。但是,如果您不喜欢这样,我建议对第三种方法稍作修改。

  1. "a2yW,猛拉“哲学鸡”进入缓冲区A
  2. 通过您选择的方法移动到“红狗”;例如,j/red dog
  3. 2dWand "aP(或"aPand 2dE)粘贴“哲学鸡” 来自缓冲区 A并删除“红狗”。
  4. 重复步骤 2 和 3(因为缓冲区 A仍含有“哲学鸡”)。如果您之前搜索过“红狗”,只需使用n重复搜索即可。如果您j之前使用过,请使用2Bj (或从第 3 行移动到第 5 行等)2B2j

答案4

首先,我会猛拉philosophical chicken,因为这比重新输入要短。然后,我将使用我的插件之一:

替代方案A

和我的更改全局插件gc{motion}替换red dog为键入的文本(此处:粘贴的寄存器),并将其重新应用于所有/[count]个以下出现的情况。

"ay2ejgc2e<C-R>a<Esc>

替代方案B

不过,这更适合编辑,而不是粘贴。对于很少(或不是随后)发生的情况,我更喜欢我的ReplaceWithRegister 插件,它允许您通过寄存器覆盖文本gr{motion}。对于您的示例,我通常+w会移动到下一个事件;还可以使用搜索 / n

y2ejgr2e+w.2+w.+w.

相关内容