有谁知道一种将选择粘贴到视觉选择区域而不将其放置在默认寄存器中的方法吗?
我知道我可以通过始终从显式寄存器粘贴来解决问题。但是打字"xp而不是仅仅在脖子上很痛苦p
有谁知道一种将选择粘贴到视觉选择区域而不将其放置在默认寄存器中的方法吗?
我知道我可以通过始终从显式寄存器粘贴来解决问题。但是打字"xp而不是仅仅在脖子上很痛苦p
Answers:
"{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具有非虚拟vmap且希望寄存器被覆盖的插件,那应该没问题。
regtype
(逐行显示吗?),并且将p重新映射pgvy
就足够了。
"xp
,这不会覆盖@"
内容与@x
不同pgvy
:xnoremap p pgv@=v:register.'y'<cr>
呢?
我不喜欢用删除复制所有文本的默认VIM行为d
,D
,c
,或者C
到默认寄存器。
我周围得到通过映射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
使用以下内容:
xnoremap p pgvy
这将重新选择并重新粘贴以可视模式粘贴的所有文本。
编辑:为了与"xp
您一起工作,您可以执行以下操作:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
扩展为普通模式命令中使用的最后一个寄存器名称。
"xp
,这种做法覆盖@"
有@x
。
xnoremap p pgv"@=v:register.'y'<cr>
对我没有用。但是,这样做是:xnoremap <expr> p 'pgv"'.v:register.'y'
g
吗?我以前没看过
g
一个人什么都不做。它提供了扩展的多键命令,例如z
。例如,go
转到缓冲区的第n个字节,gj
然后gk
转到下一个和上一个显示的行(与换行时不同jk
),ga
在光标下方显示有关字符的信息,gJ
连接没有空格的行,并在此处gv
恢复最后的视觉选择。您可以使用:help gv
。
:xnoremap <expr> p 'pgv"'.v:register.'y`>'
,我添加```>``要恢复光标位置
在你的 .vimrc
xnoremap p "_dP
我是从类似线程的响应中找到的,但是原始来源是http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text。它提到了一些缺点,但是对我来说很好用。
.vimrc.local
也可以
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
寄存器。
我被一个答案帮助这个计算器的问题:Vim的-有一个可选的寄存器前缀映射 结合贝努瓦的回答这个网页上
在进行更改以支持我设置了剪贴板=未命名的事实之后,Luc的功能对我来说运作良好:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplus
这个必须是@+
代替@*
。
卢克·赫米特(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>
silent! vunmap
而不是vnoremap <silent> <expr> p p