在 Vim 中,替换光标下所有出现的当前术语

问题描述 投票:0回答:6

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

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

vim
6个回答
170
投票

只需使用 * 搜索光标下的单词,然后:

:%s//new value/g

这将 (s) 用

new value
替换光标下单词的所有实例。

当您未在

//
字符之间指定搜索模式时,替换命令将使用最后搜索的模式。

末尾的

g
将替换每行中的所有匹配实例(默认情况下,没有
g
则仅替换第一个匹配)。如果您不想每次都指定
g
您可以配置
gdefault
(但请注意警告,它可能会破坏不考虑它的插件)。


105
投票

您可以使用:

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

其中

<c-r><c-w>
表示按字面意思键入 CTRL-rCTRL-w 以在光标下插入单词。


22
投票

除了其他答案之外,您还可以通过将以下代码片段添加到 .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

5
投票

我继续创建了一个插件,让您只需输入以下内容:

:Dr REPLACEVALUE

https://github.com/chiedojohn/vim-dr-replace


2
投票

另一种选择是使用

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相同的提示......)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.