如果我具有以下内容:

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


我使用cw将第一个bar更改为baz,如何跳转到下一个匹配的bar,以便可以使用

我不能使用.,因为它会在光标下搜索当前单词,而且我愚蠢地没有第一次搜索*,所以bar不会没用。

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

我不想进行搜索并替换,因为或者我的文件中还有其他不想更改的n出现,或者因为只有两个bar实例,并且在开始之前我忘记了bar,而要更改唯一的qq太多了剩余实例。

评论

这并不完全符合您描述的工作流程,但vim-oblique改进了*搜索。尤其是*无需移动光标即可直观地选择当前单词。安装完成后,您可以执行* ciw将旧单词放入搜索寄存器并更改单词。然后可以使用n和..

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

...因为我没有搜索到第一次出现的情况,所以n将无法工作。

#1 楼

您刚刚用cw更改的文本被剪切到未命名的寄存器中,因此您可以将其重用:
变化。

#2 楼

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

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

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




:-由于处于可视模式,因此变为:'<,'>


s /-查找

CTRL +“-最后一次取消/删除项目(示例中的栏)

/-并替换

CTRL +。-最后插入(示例中的baz)

由于需要使用该模式,因此需要花费一些时间,大多数情况下,您只想将find和replace应用于包括参数在内的整个函数,但这是一种不错的方法不要执行反模式“做吧,意识到您应该做得更好,正确地撤消和重做。”

#3 楼

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

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


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

快捷方式当然可以选择不同于<leader>a的快捷方式,但是我只是发现这是一个非常易于使用的快捷方式。我个人将<leader>设置为,,因此我只需要按,然后按a,但这是因为我不使用美式键盘,所以我的\被隐藏了一些(我相信\是默认的<leader>)。 br />
解释这个想法真的很简单。将光标下方的单词插入搜索寄存器/,然后执行cw。因此,nmap <leader>a "/yciw是我的目标,但是不幸的是,我认为您不能将其拉至搜索寄存器,因此解决方法是将光标下方的单词拉至1寄存器,然后将/寄存器设置为与之相等,并且然后做cw。因此,"1yiw是将光标下的内部单词移至寄存器1的部分。如果您不了解内部单词,可以查看:help iw。然后,:let @/=@1后面是Enter的捕获,将1寄存器的内容放入/中。此时,n和N充当光标下的单词的下一个和上一个出现,然后执行ciw以便删除光标下的单词并将Vim置于插入模式。

单词与内部单词之间的冲突我只是意识到,我认为您希望整个单词都在光标下,而不仅仅是从光标的角度出发。这就是为什么我到处都使用iw而不是w的原因。如果不是这种情况,则应改为使用

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


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

免责声明如果您尝试在包含字母以外内容的东西上使用它,则此解决方案可能无法很好地工作。通过将光标放在\上,或将iw替换为iWibisip或类似的东西(尽管我不知道为什么您希望整个句子都使用此功能)