如果您在 Vim 中按 *,编辑器将搜索同一文件中该术语的下一个出现位置。它使您无需键入该术语。
是否有一种快速方法可以用新术语替换当前光标下的术语?发出命令的一个字符,输入新术语,然后 Enter。
只需使用 * 搜索光标下的单词,然后:
:%s//new value/g
这将 (s) 用
new value
替换光标下单词的所有实例。
当您未在
//
字符之间指定搜索模式时,替换命令将使用最后搜索的模式。
末尾的
g
将替换每行中的所有匹配实例(默认情况下,没有 g
则仅替换第一个匹配)。如果您不想每次都指定 g
,您可以配置 gdefault
(但请注意警告,它可能会破坏不考虑它的插件)。
您可以使用:
:%s/<c-r><c-w>/new value/g
其中
<c-r><c-w>
表示按字面意思键入 CTRL-rCTRL-w 以在光标下插入单词。
除了其他答案之外,您还可以通过将以下代码片段添加到 .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
另一种选择是使用
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>
这也是我想要的功能!但不仅适用于光标下的单词,还适用于视觉选择或动作。
因此(并根据您的答案),我将其添加到我的 .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相同的提示......)