跳转到我刚刚更改的单词的下一个出现


12

如果我有以下情况:

function foo(bar) {
    return bar + 1;
}

而且我cw习惯将第一个更改barbaz,如何跳转到下一个匹配项bar,以便可以.进行相同的更改?

我不能使用*,因为那样会在光标下搜索当前单词,而且我愚蠢地没有bar第一次搜索,因此n无法正常工作。

是否有一种简单的方法来搜索单词更改之前的下一个出现的单词?

希望做一个搜索和替换,因为无论有其他出现bar在我的文件,我不想改变,或因为有只有两个实例bar,我忘了:%s/bar/baz/之前,我开始和那太更改唯一剩余实例的工作量很大。


2
这并不完全符合您描述的工作流程,但vim-oblique可以改善*搜索。尤其是它可以*在不移动光标的情况下直观地选择当前单词。安装后,您可以*ciw将旧单词放入搜索寄存器并更改单词。然后,您可以使用n.
statox

按n将使您移至下一个出现的上一个搜索模式。你为什么不尝试呢?
SibiCoder

...因为我没有搜索到第一次出现的情况,所以n不会起作用。
罗杰·利普斯科姆

Answers:


14

您刚刚更改的文本cw被切入未命名的寄存器中,因此您可以将其重复使用:

/<C-r>"<CR>

跳到上一次更改所覆盖的文本的下一次出现。


5

要将romainl扩展为完整的工作流程...

如果您更想执行这种编辑,然后意识到需要对段落/函数进行相同的编辑,则可以使用".寄存器。

在您的示例中,您可以执行参数的初始编辑。如果您进入可视模式(我将使用Visual Line只是为了确保您正确选择了所有内容),然后应用查找并替换。

V]] -视线,到段落/功能的结尾。

  • : -由于您处于视觉模式,因此 :'<,'>
  • s/ - 找
  • CTRL+ "-最后取消/删除项目(示例中的栏)
  • / -并更换
  • CTRL+ .-最后插入(示例中为baz)

由于必须使用该模式,因此需要一段时间才能习惯。大多数情况下,您只想将查找和替换应用于包括参数在内的整个函数,但这是不执行反模式的好方法,“做工作,意识到您应该做得更好,撤消和重做正确地。”


2

如果您不介意按而不是组合键cw,那么我相信您可以通过定义快捷方式轻松获得所需的内容。您可以做的是放置以下内容

nmap <leader>a "1yiw:let @/=@1^Mciw

在您的.vimrc文件中。 请注意,这 ^M是返回键的捕获,而不是字符^M。您可以通过在插入模式下按Ctrl+ V,然后按来获得它Enter。现在,在定义好之后,按<leader>a将与执行相同的操作cw,但是现在单词(更改之前)将出现在“最后搜索寄存器”(即/寄存器)中,因此n在进行更改并返回后按到正常模式将使您再次出现。同样,按N可使您进入上一个事件。

快捷方式 当然,您可以选择不同于的快捷方式<leader>a,但是我只是发现这是一个非常易于访问的快捷方式。就我个人而言,我已经设置<leader>为,,所以我只需要按,,然后按a,但这是因为我不使用美式键盘,所以我\有些隐藏(我相信\是默认值<leader>)。

解释 这个想法真的很简单。将光标下方的单词移至搜索寄存器/,然后执行cw。这nmap <leader>a "/yciw就是我的目标,但是不幸的是,我不认为您可以将其拖到搜索寄存器中,因此解决方法是将光标下的单词拖到1寄存器中,然后将其设置为/等于该寄存器,然后再执行cw。所以"1yiw是洋基光标到寄存器下的内心世界的一部分1。如果您不了解内部单词,可以签出:help iw。然后,:let @/=@1通过捕获Enter1寄存器的内容放入/。在这一点上nN用作光标下该单词的下一个和上一个出现的位置,然后执行a ciw,以便删除光标下的单词并将Vim置于插入模式。

单词与内部单词的比较 我刚刚意识到,我认为您希望整个单词都在光标下,而不仅仅是从光标的角度出发。这就是为什么我使用iw而不是所有w地方的原因。如果不是这种情况,则应使用

nmap <leader>a "1yw:let @/=@1^Mcw

代替。如果光标位于单词的第一个字母上,则没有区别。

免责声明 如果你试图通过一个在一光标立场,用它的东西,包含字母的东西不同,例如,该解决方案将可能无法正常工作\或更换iwiWibisip什么的(虽然我不知道你为什么会想要整个句子都具有此功能)

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.