有没有人知道如何粘贴视觉选择的区域而不将选区放在默认寄存器中?
我知道我总是可以通过明确的寄存器来解决问题。但是输入“ x p 而不是 p
是痛苦的。答案 0 :(得分:35)
我不喜欢将使用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 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的插件,并且希望覆盖寄存器,那么这应该没问题。
答案 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