Como colar sobre sem registo substituição
Pergunta
Alguém sabe de uma maneira de colar sobre uma área visualmente selecionada sem ter a seleção colocada no registo padrão?
Eu sei que posso resolver o problema sempre colando a partir de um registo explícito. Mas é uma dor no pescoço para digitar " x p em vez de apenas p
Solução
"{register}p
não vai funcionar como você descreve. Ele irá substituir a seleção com o conteúdo do registo. Você terá, em vez de fazer algo como:
" 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()
O que deve ser muito bem contanto que você não usar um plugin que tem uma VMAP não nore para p, e que espera um registo para ser substituído.
Este código está disponível como um script há . Ingo Karkat também definiu um plug-in resolver o mesmo problema.
Outras dicas
Eu não gosto do comportamento vim padrão de copiar todo o texto eliminado com d
, D
, c
, ou C
no registo padrão.
Eu comecei em torno dele por mapeamento d
para "_d
, c
para "_c
, e assim por diante.
Do meu .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
Use o seguinte:
xnoremap p pgvy
isso irá selecionar novamente e re-arrancar qualquer texto que é colado no modo visual.
Editar: para que isso funcione com "xp
você pode fazer:
xnoremap p pgv"@=v:register.'y'<cr>
expande v:register
para o último nome registo utilizado em um comando modo normal.
Em seu .vimrc
xnoremap p "_dP
Eu encontrei este a partir de uma resposta em um segmento semelhante, mas a fonte original http: // vim. wikia.com/wiki/Replace_a_word_with_yanked_text. Ele menciona algumas desvantagens, no entanto, ele funciona bem para mim.
A solução de Luc Hermitte funciona como um encanto. Eu estava usando-o para cerca de uma semana ou assim. Então eu descobri uma solução de Steve Vimrc Losh que funciona muito bem se YankRing faz parte do seu plugin lineup / pacote:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Tente isto em seu ~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
-
meios
xnoremap
que este é apenas para o modoVisual
, não modosVisual + Select
. -
meios
<expr>
que{rhs}
da configuraçãoxnoremap {lhs} {rhs}
é avaliado como uma expressão. -
Neste caso, a nossa expressão de
'pgv"'.v:register.'y'
está usando.
para concatenação. -
v:register
é avaliada para o registo a ser utilizada durante a realização do mapeamento.
O resultado da "xp
iria avaliar a pgv"xy
, onde x
é o registro.
fui ajudado por uma resposta a esta pergunta stackoverflow: Vim - mapeamento com um registo opcional prefixo em conjunto com Benoit 's resposta desta página
função de Luc funcionou bem para mim depois que eu fiz uma mudança para apoiar o fato de que eu tenho clipboard = set Sem nome:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
Luc Hermitte do fez o truque! Muito bom. Aqui está a sua solução colocados em uma função de alternância, para que possa alternar entre o comportamento normal e sem substituir a registar colocar.
o comando, u alterna o comportamento
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>
tentar -
:set guioptions-=a
:set guioptions-=A