如何粘贴而不覆盖寄存器

有没有人知道一种方法粘贴在视觉上select的区域,而没有select放置在默认的注册?

我知道我可以通过总是从一个明确的寄存器粘贴来解决这个问题。 但是,键入 x p而不是p 是一件痛苦的事情

"{register}p将不会像你所描述的那样工作,它会将selectreplace为寄存器的内容,而是会执行如下操作:

 " I haven't found how to hide this function (yet) function! RestoreRegister() let @" = s:restore_reg return '' endfunction function! s:Repl() let s:restore_reg = @" return "p@=RestoreRegister()\<cr>" endfunction " NB: this supports "rp that replaces the selection by the contents of @r vnoremap <silent> <expr> p <sid>Repl() 

只要你没有使用一个非nore vmap的插件,并且期望一个寄存器被覆盖,那应该没问题。

这个代码在那里是一个脚本。 Ingo Karkat还定义了一个解决同一问题的插件 。

我不喜欢把用dDcC删除的所有文本复制到默认寄存器的默认vim行为。

我通过将d映射到"_dc"_c等来解决这个问题。

从我的.vimrc:

 "These are to cancel the default behavior of d, D, c, C " to put the text they delete in the default register. " Note that this means eg "ad won't copy the text into " register a anymore. You have to explicitly yank it. nnoremap d "_d vnoremap d "_d nnoremap D "_D vnoremap D "_D nnoremap c "_c vnoremap c "_c nnoremap C "_C vnoremap C "_C 

使用以下内容:

 xnoremap p pgvy 

这将重新select并重新粘贴以视觉模式粘贴的任何文本。

编辑:为了这个工作与"xp你可以做:

 xnoremap p pgv"@=v:register.'y'<cr> 

v:register展开为正常模式命令中使用的最后一个寄存器名称。

在你的.vimrc

 xnoremap p "_dP 

我从类似的线程上的响应中find了这个,但是最初的源代码是http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text 。 它提到了一些缺点,但它对我来说工作正常。

Luc Hermitte的解决scheme就像一个魅力。 我使用了大约一个星期左右。 然后我发现了Steve Losh的.vimrc的一个解决scheme,如果YankRing是你的插件/捆绑产品阵容的一部分,

 function! YRRunAfterMaps() " From Steve Losh, Preserve the yank post selection/put. vnoremap p :<cu>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> endfunction 

在我做了一个改变,以支持事实,我有剪贴板=未命名的设置后,吕克的function为我工作得很好:

 function! RestoreRegister() let @" = s:restore_reg if &clipboard == "unnamed" let @* = s:restore_reg endif return '' endfunction 

Luc Hermitte做的诡计! 真的很好。 这里是他的解决scheme放在一个切换function,所以你可以切换正常行为和无replace寄存器放。

该命令,你切换的行为

 let s:putSwap = 1 function TogglePutSwap() if s:putSwap vnoremap <silent> <expr> p <sid>Repl() let s:putSwap = 0 echo 'noreplace put' else vnoremap <silent> <expr> pp let s:putSwap = 1 echo 'replace put' endif return endfunction noremap ,p :call TogglePutSwap()<cr> 

在你的~/.vimrc试试这个:

 xnoremap <expr> p 'pgv"'.v:register.'y' 
  • xnoremap意味着这只适用于Visual模式,而不适用于Visual + Select模式。

  • <expr>意味着xnoremap {lhs} {rhs}设置的xnoremap {lhs} {rhs}被评估为一个expression式。

  • 在这种情况下,我们对'pgv"'.v:register.'y'的expression使用.进行连接。

  • v:register在执行映射期间, v:register被评估为正在使用的寄存器。

"xp的结果将评估为pgv"xy ,其中x是寄存器。

我被这个stackoverflow问题的一个答案帮助: Vim – 映射一个可选的寄存器前缀与Benoit 在本页的答案

尝试 –

 :set guioptions-=a :set guioptions-=A