有谁知道在不将选择放置在默认寄存器中的情况下粘贴视觉选择区域的方法?
我知道我可以通过始终从显式寄存器粘贴来解决问题。但是打字是一件很痛苦的事情,"xp而不仅仅是p
使用以下内容:
xnoremap p pgvy
这将重新选择并重新拉出以可视模式粘贴的任何文本。
编辑:为了与您一起使用,"xp
您可以执行以下操作:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
扩展为正常模式命令中使用的最后一个寄存器名称。
我不喜欢将使用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
"{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 并且期望寄存器被覆盖的插件,这应该没问题。
在你的.vimrc
xnoremap p "_dP
我从类似线程的回复中找到了这一点,但原始来源是http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text。它提到了一些缺点,但是对我来说效果很好。
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
在你的试试这个~/.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
在我进行更改以支持我设置了剪贴板=未命名的事实后,Luc 的功能对我来说效果很好:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
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>
胶带编程,但对我有用:
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<
尝试 -
:set guioptions-=a
:set guioptions-=A