129

有谁知道在不将选择放置在默认寄存器中的情况下粘贴视觉选择区域的方法?

我知道我可以通过始终从显式寄存器粘贴来解决问题。但是打字是一件很痛苦的事情,"xp而不仅仅是p

4

10 回答 10

43

使用以下内容:

xnoremap p pgvy

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

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

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

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

于 2011-02-23T15:52:05.583 回答
41

我不喜欢将使用d, D,c或删除的所有文本复制C到默认寄存器中的默认 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
于 2009-05-01T16:33:46.963 回答
35

"{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 并且期望寄存器被覆盖的插件,这应该没问题。

此代码在此处作为脚本提供。Ingo Karkat 还定义了一个插件来解决同样的问题。

于 2008-11-14T17:00:32.260 回答
20

在你的.vimrc

xnoremap p "_dP

我从类似线程的回复中找到了这一点,但原始来源是http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text。它提到了一些缺点,但是对我来说效果很好。

于 2015-07-14T16:10:14.447 回答
6

Luc Hermitte 的解决方案很有魅力。我使用它大约一个星期左右。然后,我从Steve Losh 的 .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  
于 2012-11-21T12:05:34.587 回答
6

在你的试试这个~/.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 and Benoit 's answer on this page

于 2013-03-07T09:00:09.630 回答
5

在我进行更改以支持我设置了剪贴板=未命名的事实后,Luc 的功能对我来说效果很好:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction
于 2010-12-15T04:10:42.427 回答
2

Luc Hermitte 成功了!真的很好。这是他的解决方案,它带有一个切换功能,因此您可以在正常行为和无替换寄存器放置之间切换。

命令 ,u 切换行为

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>
于 2009-10-07T09:29:05.933 回答
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<
于 2020-02-03T03:28:34.473 回答
-4

尝试 -

:set guioptions-=a
:set guioptions-=A
于 2008-11-14T15:58:48.763 回答