在下面的文本中,如果我想用 替换book1
and book2
,pen
我可以pen
跳到第 2 行和第 3 行的开头,然后点击 。 (点)来替换单词。
pen;
book1;
book2;
book3;
但是,如何用拉出的文本替换多个单词?例如,我想将book 1
and替换book 2
为pen
前:
pen;
book 1;
book 2;
book 3;
后:
pen;
pen;
pen;
book 3;
是否可以替换book 1
andbook 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( 的内容,这将导致用默认寄存器的内容替换最接近的一对括号内的文本。