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

时间:2011-04-04 16:12:05

标签: vim

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

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

6 个答案:

答案 0 :(得分:98)

只需使用 * 然后:

:%s//new value/

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

答案 1 :(得分:64)

您可以使用:

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

其中<c-r><c-w>表示字面输入 CTRL - r CTRL - w 以插入光标下的字。

答案 2 :(得分:12)

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

答案 3 :(得分:5)

我继续前进并制作了一个插件,让您只需输入以下内容:

css()

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

答案 4 :(得分:1)

另一种选择是使用gn

  

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

因此,如果您将FOO作为最后一个搜索表达式,则可以用BAR键入cgnBAR<Esc>替换其下一个匹配项,并用.重复以下匹配项。 / p>

如果要将光标下方的单词设置为搜索表达式,可以键入*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>

答案 5 :(得分:0)

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

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

    private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
    private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
    private static final String NUMBER = "0123456789";

    private static final String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER;
    private static SecureRandom random = new SecureRandom();

    public static void main(String[] args) {

        for (int i = 0; i < 1; i++) {
            System.out.println(generateRandomString(10));
        }

    }

    public static String generateRandomString(int length) {
        if (length < 1) throw new IllegalArgumentException();

        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            
            int rndCharAt = random.nextInt(DATA_FOR_RANDOM_STRING.length());
            char rndChar = DATA_FOR_RANDOM_STRING.charAt(rndCharAt);

            sb.append(rndChar);

        }

        return sb.toString();

}

我现在可以按普通模式按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(之类的内容,并迅速询问我是否要替换我的选择

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