如何在不进入插入模式的情况下替换多个字符


12

我有一个带有以下内容的行的文件:

foofoo.xy.barbar

我想将更xy改为gh。我尝试做2r-> gh,但是显然不起作用,因为它替换为xygg然后将光标向左移动一个位置。

有没有一种方法可以在不进入插入模式或不使用更多击键的情况下进行此操作(例如:s/xy/gh/)?


2
R进入替换模式。:help replace-mode欲获得更多信息。
alxndr 2015年

我试过了vt.rgh。但是除了光标位置以外,结果与您的结果相同。
贡萨洛·里贝罗

2
您为什么不想进入插入模式?像cwgh<esc>这样的东西会很好。
Doorknob

1
@ durron597我不知道,如果minimize-keystrokes是一个很好的标签,它通常不是真正的问题是什么,因为这样的。(我拒绝了您建议的修改)...也许您应该在meta上讨论?
马丁·图尔诺伊

Answers:


19

如果新文本的长度与旧文本的长度相同,则可以选择Vim的替换模式。在正常模式下R(大写的“ r”)使您进入替换模式。这类似于某些其他文本编辑器中的“覆盖”:代替在插入模式下插入新字符,键入将替换光标下的字符,然后前进到下一个光标。(将其视为小写字母r,但一次只能输入一个字符。)使用来查找替换模式的文档:help replace-mode

在您的情况下:将光标放在.和之间x,按进入替换模式R。现在,当您键入时,g它将替换为“ x”并移至下一个字符,因此您可以键入h以替换为“ y”。您的编辑已完成,Escape请返回正常模式。

(当替换文本的长度与旧文本的长度相同时,此方法有效,但是如果替换文本的长度更长或更短,则c可能只需要这些替换:它将用移动的文本替换1个运动中的文本,然后键入文本。很多方法可以做到的使用c,例如:与光标之间的.xct.ABCEscape以表示ç焊割的文本(最多' 牛逼 IL下一.)与‘ABC’)。


1它将拉动机芯中的文本到未命名/ "寄存器中,然后切换到插入模式,以便您可以键入一些内容来替换它,然后Escape返回到普通模式。


2
这适用于这种情况。如果您想将3个字符替换为2个字符怎么办?
2015年

1
好问题; 修改为包括一种处理不同长度文本的方法。
alxndr

是的,我知道。但是您以这种方式进入了插入模式,我很想知道在这种情况下是否有不使用插入模式的方法。并不是说我认为它很有用(但是我可能是错的)。
贡萨洛·里贝罗

1
带数字的前缀,n最多替换n目标字符的-th次出现。这对于替换格式为w_x_y_z和的部分标签很有用a-b-c-d。也可以使用f而不是t删除限制字符。
pkfm

5

您可以通过几种方式执行此操作,但是我能想到的最简单的方法是:

TL; DR

fxcw<REPLACEMENT TEXT>

说明

  • fx使您跳到x(请参阅help *f*
  • cw表示要更改单词(请参见:h *c*:help *w*和,:help cw以获取更多信息),删除“ xy”文本并进入插入模式,然后将所需的内容放在此处。
  • 在您的示例中,要替换<替换文本>的任何内容都是-“ gh”。

这种方法的一个优点是它使用了非常常用的文本操作和导航命令。另一个是“ xy”可以是任何长度,并且仍然可以使用。

之所以cw有效,是因为您的文本对象被句点(.)包围,这些句点充当单词的边界。

如果光标已经在“ y”字符(或要替换的文本中的任何字符)上,则可以使用ciw<REPLACEMENT TEXT>。这告诉vim更改您所在的单词,即使您不在开头。有关:help text-objects更多信息ciw和文本对象,请参阅参考资料。


这不会让他处于插入模式吗?
elyashiv 2015年

1
啊-没听懂他那部分问题。在那种情况下,是的-R是最合适的解决方案。
科迪投票2015年

3

替换方式:

Rgh<Esc>

如果替换的长度与原始长度相同,则是最明显的解决方案,但您也可以这样做:

2sgh<Esc>

要么:

cegh<Esc>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.