vim - 用拉出的文本多次替换多个单词

vim - 用拉出的文本多次替换多个单词

在下面的文本中,如果我想用 替换book1and book2pen我可以pen跳到第 2 行和第 3 行的开头,然后点击 。 (点)来替换单词。

pen;
book1;
book2;
book3;

但是,如何用拉出的文本替换多个单词?例如,我想将book 1and替换book 2pen

前:

pen;
book 1;
book 2;
book 3;

后:

pen;
pen;
pen;
book 3;

是否可以替换book 1andbook 2而不将这个词拉动pen两次?也许您认为不错的按键绑定?

答案1

我经常需要这个,我编写了一个插件来简化并允许最大速度:替换为寄存器

该插件提供了一个二合一gr命令,可以用寄存器的内容替换 {motion} / 文本对象、整行或当前选择覆盖的文本;旧文本被删除到黑洞寄存器中,即它消失了。它透明地处理许多极端情况,并允许通过标准.命令快速重复。如果您不喜欢它,它的页面上有替代品的链接。 (它的工作方式就像@s1n7az 的代码片段,但作为插件更加复杂和强大。)

答案2

这条 Reddit 评论是我得到的最好的解决方案。很简约。

我定义了一个命令来替换文本而不更改默认寄存器。也许这也会为你服务。它可能基于这个或这个,我真的不记得我从哪里得到这个想法,但我在实现之前在某个地方看到过它。

nnoremap <silent> cp :let g:substitutemotion_reg = v:register
            \ <bar> set opfunc=SubstituteMotion<CR>g@

" substitute {motion} text with contents of a register function!
SubstituteMotion(type, ...)
    let l:reg = g:substitutemotion_reg
    if a:0
        " visual mode, use '< and '> marks
        silent exe "normal! `<" . a:type . "`>\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'line'
        " linewise
        silent exe "normal! '[V']\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'block'
        " blockwise-visual
        silent exe "normal! `[\<C-V>`]\"_c\<c-r>" . l:reg . "\<esc>"
    else
        " characterwise
        silent exe "normal! `[v`]\"_c\<c-r>" . l:reg . "\<esc>"
    endif endfunction 

要使用它,请输入类似 cpi( 的内容,这将导致用默认寄存器的内容替换最接近的一对括号内的文本。

相关内容