Vim 最快的单词替换方法

Vim fastest way to replace words

有时我发现自己只想替换程序中的 2-3 个长单词,但我发现这样做有点痛苦,只是想知道是否有任何 Vim 向导可以给我一个更快的方法:

var_wanted = {}
some_other_var = {}

def function1():
  ....
  ....
  some_other_var.append(...)
  ....
  some_other_var.append(...)
  some_other_var.append(...)
  ....

现在假设我想用 var_wanted 替换 some_other_var,现在通常我这样做的方式是我会去 var_wanted 使用 yiw 复制要注册的单词,然后移动到 some_other_var 的第一个实例,对 select 单词执行 viw,然后执行 p 将其粘贴并替换单词。但是这个过程是不可重复的,我不能去 some_other_var 的下一个实例并输入 . 因为出于某种原因现在 some_other_var 在我的寄存器中而不是 var_wanted,我经常这样做,以至于我觉得自己正在失去多年的生命。是的,我知道使用搜索和替换 :%s/some_other_var/var_watned/gc,但我觉得这个实例用于替换的内容太少了,不值得将整个内容都输入出来。请帮忙

想要的最终产品:

var_wanted = {}
some_other_var = {}

def function1():
  ....
  ....
  var_wanted.append(...)
  ....
  var_wanted.append(...)
  var_wanted.append(...)
  ....

TL;DR:
var_wanted 上的光标:"ayiw(拉入寄存器 a)。
光标在some_old_var上:ciwCtrlraEsc(改变字,插入寄存器a的内容) .
将光标放在下一个 some_old_var: . 将再次执行上一个操作。


找到比 %s/some_old_var/var_wanted/g 更短 的击键系列将很困难。

because for some reason now some_other_var is in my register

viwp 隐式删除所选单词。 vim 中删除的文本进入寄存器。您可以使用 viw"_dP 来避免这种情况,它明确地删除到空寄存器中,这样它就不会被复制,然后再放入。键入此 3 次似乎比 %s/ 版本更糟糕。


如果打字 var_wantedsome_other_var 打扰了您,您可以通过"fyiw"ryiw 当您的光标位于正确的位置时。然后你可以 %s:<C-r>f:<C-r>r:g 做所有的替换(<C-R> 意味着 Ctrlr)。这里的问题是四处移动光标然后猛拉似乎并不比输入单词快多少。


还有c挂东西。如果你有 some_old_var.,你可以将光标放在单词上,然后是 ciwvar_wanted,这将删除 some_old_var 并进入插入模式,你将在其中键入 var_wanted。这样做的好处是在离开插入模式后,当光标位于 some_old_var 的下一个实例上时,您可以使用 . 并且它会重复整个操作,将 some_old_var 替换为 var_wanted.

另一个有用的注意事项是,如果 var_wanted 超长(并且已经存在于此文件中),您可以在键入单词的几个字符后使用 C-n 自动完成。完成插入后,这仍然适用于 .

如果你真的想避免输入任何数量的 var_wanted,你可以在插入模式下使用 Ctrlr同样,这意味着您可以通过将光标放在 var_wanted 上并使用 "ayiw (拉入寄存器 a)然后将光标放在 some_old_var 上并执行 ciw<C-R>a 来拉动 var_wanted替换它。

只要你要的寄存器是yank寄存器即可:

:%s/some_other_var/\=@0/g

如果您尝试更改大量出现的“some_other_var”

,则上述解决方案很好

您也可以使用“gn”方法,参见:h gn,在我的例子中我有:

:nnoremap c* *<c-o>cgn

复制“var_wanted”移动到第一个“some_other_var”然后按:

c* ...................... triggers our mapping
<Ctrl-r>0 ................ paste the yank register
<Esc> .................... leave insert mode
.  ....................... now press dot as much as you want

要了解有关 gn 技巧的更多信息,请观看这​​个精彩视频: http://vimcasts.org/episodes/operating-on-search-matches-using-gn/