如何粘贴而不覆盖寄存器
有没有人知道一种方法粘贴在视觉上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还定义了一个解决同一问题的插件 。
我不喜欢把用d
, D
, c
或C
删除的所有文本复制到默认寄存器的默认vim行为。
我通过将d
映射到"_d
, c
到"_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