在Vim中,替换所有当前项在光标下


74

如果*在Vim中按,编辑器将在同一文件中搜索该术语的下一个出现。它使您不必键入术语。

有没有一种快速的方法可以用新的术语替换当前光标下的术语?发出命令的一个字符,然后输入新术语Enter


您也可以将n用于下一个匹配,将b用于后向(先前)匹配。
Orwellophile 2015年

@Orwellophile仅对n我有用,它b会恢复默认值(单词的开头)#对我有用,这可以回溯到上一个学期。
JohnnyQ

@JohnnyQ对不起,Johnny,我一定很喜欢胶水。这是n下一个和N上一个。它写在我的键盘上,所以我不知道我怎么弄错了。
Orwellophile

Answers:


79

您可以使用:

:%s/<c-r><c-w>/new value/g

其中<c-r><c-w>装置字面上键入CTRL- rCTRL-w插入光标下的单词。


120

只需使用*,然后:

:%s//new value/

如果您未指定模式,则replace命令将使用最后搜索的模式。根据gdefault配置中的值,您可能需要/g向该命令添加修饰符。


3
如果new value包含&/,只需用\进行转义。
Benoit

@sjas:se gd有什么作用?
2013年

:se gd:set gdefault告诉vim对待每个模式,好像它在结尾都有一个/ g修饰符(更确切地说,它会反转/ g标志的含义,因此,如果将它与gdefaultactive一起使用,它将禁用该效果)
Matteo Riva

如果必须在要替换的字符串中使用搜索到的单词怎么办。例如,如果光标下的单词是,function_with_a_long_name并且我必须将所有实例替换为self.function_with_a_long_name
Parth Sharma

14

除了其他答案,您还可以通过在.vimrc文件中添加以下代码段来进行全局搜索和替换,从而省去一些按键操作。

" Search and replace word under cursor using F4
nnoremap <F4> :%s/<c-r><c-w>/<c-r><c-w>/gc<c-f>$F/i

1
我喜欢它,到目前为止,这对我来说是整个互联网上最好的答案;)
Andrzej Rehmann 2015年


1

另一种选择是使用gn

向前搜索最后使用的搜索模式,例如使用 n,然后启动可视模式以选择匹配项。
如果光标位于匹配项上,则可视地选择它。
如果操作员未决,请进行比赛。
例如,“ dgn”删除下一个匹配项的文本。
如果激活了可视模式,则将选择范围扩展到下一个匹配项的末尾。
注意:与n搜索方向不同,它不取决于先前的搜索命令。

因此,如果您拥有FOO最后一个搜索表达式,则可以通过BAR键入替换其下一个匹配项cgnBAR<Esc>,并使用来重复以下匹配项.

如果要将光标下方的单词设置为搜索表达式,可以键入*N(或*#)搜索下一个匹配项,然后返回。

例如,如果您的光标FOO在该行的第一行下方:

<div class="FOO"><span id="FOO"><b>FOO:</b> FOO</span></div>

然后输入*NcgnBAR<Esc>...,结果就是这样:

<div class="BAR"><span id="BAR"><b>BAR:</b> BAR</span></div>

0

这也是我也想要的功能!但是,不仅针对光标下方的单词,还针对视觉选择或动作。

结果(并在您的答案基础上),我将此添加到了.vimrc中:

nnoremap <leader>g :set operatorfunc=SubstituteOperator<cr>g@
vnoremap <leader>g :<c-u>call SubstituteOperator(visualmode())<cr>

function! SubstituteOperator(type)
    if a:type ==# 'v'
        execute 'normal! `<v`>"my'
    elseif a:type ==# 'char'
        execute 'normal! `[v`]"my'
    else
        return
    endif

    let sub = input("substitute '".getreg("m")."' with ... : ")
    execute "%s/".getreg("m")."/".sub."/gc"
endfunction

我现在可以按喜欢的东西\sw\sf;\si(在正常模式下还是\s在可视化模式,并得到提示,询问是否有什么我想替换我的选择有。

(到目前为止,我不知道我是否想要与@Lieven相同的提示...)

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.