【问题标题】:In Vim, replace all occurrences of current term under cursor在 Vim 中,替换光标下所有出现的当前术语
【发布时间】:2011-04-04 16:12:04
【问题描述】:

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

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

【问题讨论】:

  • 您也可以使用 n 进行 next 匹配,使用 b 进行 back (上一个)匹配。
  • @Orwellophile only n 为我工作 b 恢复默认(单词开头)# 按预期为我工作,这可以追溯到上一学期。
  • @JohnnyQ 对不起约翰尼,我一定是胶水太高了。下一个是n,上一个是N。它写在我的键盘上,所以我不知道我是怎么弄错的。

标签: vim


【解决方案1】:

只需使用 * 然后:

:%s//new value/

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

【讨论】:

  • 如果 new value 包含 & 或 /,只需使用 `\` 将其转义。
  • @sjas :se gd 是做什么的?
  • :se gd 或 :set gdefault 告诉 vim 将每个模式视为其末尾有一个 /g 修饰符(更准确地说,它反转了 /g 标志的含义,所以如果你使用gdefault 激活它会禁用效果)
  • 如果我可以在要替换的字符串中使用搜索到的单词怎么办。例如如果我光标下的单词是 function_with_a_long_name 并且我必须用 self.function_with_a_long_name 替换它的所有实例?
【解决方案2】:

你可以使用:

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

&lt;c-r&gt;&lt;c-w&gt; 的意思是按字面意思输入 CTRL-rCTRL-w 以在下面插入单词光标。

【讨论】:

  • 在这里解释每个命令的含义会很好:)
【解决方案3】:

除了其他答案之外,您还可以通过在 .vimrc 文件中添加以下 sn-p 来进行全局搜索和替换,从而减少一些击键。

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

【讨论】:

  • 我喜欢它,到目前为止对我来说是整个互联网上的最佳答案;)
【解决方案4】:

我继续开发了一个插件,您只需输入以下内容:

:Dr REPLACEVALUE

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

【讨论】:

    【解决方案5】:

    另一种选择是使用gn:

    向前搜索最后使用的搜索模式,例如 n,然后启动可视模式以选择匹配项。
    如果光标位于匹配项上,则直观地选择它。
    如果运算符处于未决状态,则对匹配进行运算。
    例如,“dgn”删除下一个匹配的文本。
    如果可视模式处于活动状态,则将选择范围扩展到 下一场比赛。
    注意:与n不同,搜索方向不依赖于之前的搜索命令。

    因此,如果您将 FOO 作为最后一个搜索表达式,您可以将其下一个匹配替换为 BAR 输入 cgnBAR&lt;Esc&gt;,并使用 . 重复以下匹配。

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

    例如,如果您的光标位于此行中的第一个 FOO 下方:

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

    然后你输入*NcgnBAR&lt;Esc&gt;...,你会得到这个:

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

    【讨论】:

      【解决方案6】:

      这也是我想要的功能!但不仅适用于光标下的单词,也适用于视觉选择或动作。

      因此(并根据您的答案),我将其添加到我的 .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 相同的提示...)

      【讨论】:

        猜你喜欢
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 2014-11-08
        相关资源
        最近更新 更多