如何粘贴而不覆盖寄存器

时间:2008-11-14 15:40:58

标签: vim vi

有没有人知道如何粘贴视觉选择的区域而不将选区放在默认寄存器中?

我知道我总是可以通过明确的寄存器来解决问题。但是输入 x p 而不是 p

是痛苦的。

10 个答案:

答案 0 :(得分:35)

我不喜欢将使用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 e.g. "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

答案 1 :(得分:29)

"{register}p无法按照您的描述运作。它将用寄存器的内容替换选择。你将改为做以下事情:

" 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()

只要您不使用对p具有非nore vmap的插件,并且希望覆盖寄存器,那么这应该没问题。

此代码以脚本there的形式提供。 Ingo Karkat还定义了plugin来解决同样的问题。

答案 2 :(得分:27)

使用以下内容:

xnoremap p pgvy

这将重新选择并重新扫描以可视模式粘贴的任何文本。

编辑:为了使用"xp,您可以执行以下操作:

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

v:register扩展为普通模式命令中使用的最后一个寄存器名称。

答案 3 :(得分:16)

.vimrc

xnoremap p "_dP

我是从类似线程的回复中找到的,但原始来源是http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text。它提到了一些缺点,但它适用于我。

答案 4 :(得分:6)

Luc Hermitte的解决方案就像一个魅力。我用了大约一个星期左右。然后我发现了一个来自Steve Losh's .vimrc的解决方案,如果YankRing是你的插件/包的一部分,它可以很好地工作:

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

答案 5 :(得分:5)

~/.vimrc

中试试这个
xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremap表示这仅适用于Visual模式,而不适用于Visual + Select模式。

  • <expr>表示{rhs}设置的xnoremap {lhs} {rhs}被评估为表达式。

  • 在这种情况下,'pgv"'.v:register.'y'的表达式使用.进行连接。

  • v:register被评估为在映射完成期间使用的寄存器。

"xp的结果将评估为pgv"xy,其中x是注册。

我对这个stackoverflow问题的回答得到了帮助:Vim - mapping with an optional register prefix 结合Benoit的回答on this page

答案 6 :(得分:3)

在我做出改变以支持我有剪贴板=未命名设置的事实后,Luc的功能对我很有用:

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

答案 7 :(得分:2)

Luc Hermitte的伎俩!真的很好。这是他的解决方案放入切换功能,因此您可以在正常行为和无替换寄存器之间切换。

命令,你切换行为

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> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>

答案 8 :(得分:0)

磁带编程,但对我有用:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

答案 9 :(得分:-4)

尝试 -

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