我有当前文件(当前位置为 [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 dog
Enter - c3iwCtrl-r0Esc
- n.ETC。
详细地:
- y3iw猛拉
philosophical chicken
;这比y2W后者包含尾随空格要好一些;该iw部分还确保当您将光标放在第一个单词的中间而不是开头时,猛拉仍然有效 - /
red dog
Enter找到第一个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
答案2
当然有不止一种方法可以做到这一点。但我认为最简单的方法是搜索 reddog:
/red dog
然后改两个词:
c2w
这将使您进入插入模式,您只需键入:
philosophical chicken
然后按Esc键切换回命令模式,然后键入:
n.n.
直到您将 的所有实例替换red dog
为philosophical chicken
。 (n
将向前搜索 的下一个实例red dog
,.
并将重复上一个命令。)
更少的思考,没有太多的打字,甚至不需要使用缓冲区。(尽管缓冲区很酷!)
也许我误解了这个问题,但这种方法看起来非常简单,我想知道为什么其他人都想得太多了。
编辑:
更仔细地阅读问题后,我发现上面的选项之一是这个的变体,但OP拒绝了它,因为“必须再次输入两个完整的单词”。对于那个很抱歉。但这仍然是我的首选方法。
答案3
我通常会使用第一种方法。但是,如果您不喜欢这样,我建议对第三种方法稍作修改。
"a2yW
,猛拉“哲学鸡”进入缓冲区A。- 通过您选择的方法移动到“红狗”;例如,
j
或/red dog
。 2dW
and"aP
(或"aP
and2dE
)粘贴“哲学鸡” 来自缓冲区 A并删除“红狗”。- 重复步骤 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.