vim - comandos - Cómo pegar sin sobreescribir el registro
editor vi comandos (9)
¿Alguien sabe de una manera de pegar sobre un área seleccionada visualmente sin tener la selección colocada en el registro predeterminado?
Sé que puedo resolver el problema pegando siempre desde un registro explícito. Pero es un dolor de cabeza escribir " x p" en lugar de simplemente p
En tu .vimrc
xnoremap p "_dP
Encontré esto a partir de una respuesta en un hilo similar, pero la fuente original era http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text . Menciona algunos inconvenientes, sin embargo, funciona bien para mí.
La función de Luc funcionó bien después de que hice un cambio para apoyar el hecho de que tengo el portapapeles = conjunto sin nombre:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''''
endfunction
La solución de Luc Hermitte funciona como un encanto. Lo estaba usando durante aproximadamente una semana más o menos. Luego descubrí una solución de .vimrc de Steve Losh que funciona bien si YankRing es parte de su línea de plugins / paquetes:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste ''p'', ''v''<cr>gv:YRYankRange ''v''<cr>
endfunction
Luc Hermitte hizo el truco! Realmente bueno. Aquí está su solución puesta en una función de alternar, por lo que puede cambiar entre el comportamiento normal y no poner el registro de reemplazo.
el comando, cambias el comportamiento
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>
No me gusta el comportamiento vim predeterminado de copiar todo el texto eliminado con d
, D
, c
o C
en el registro predeterminado.
Lo he "_d
asignando d
a "_d
, c
a "_c
, y así sucesivamente.
De mi .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
Prueba esto en tu ~/.vimrc
:
xnoremap <expr> p ''pgv"''.v:register.''y''
xnoremap
significa que esto es solo para el modoVisual
, no para los modosVisual + Select
.<expr>
significa que{rhs}
de laxnoremap {lhs} {rhs}
se evalúa como una expresión.En este caso, nuestra expresión de
''pgv"''.v:register.''y''
está usando.
Para concatenación.v:register
se evalúa en el registro que se usa durante el cumplimiento del mapeo.
El resultado de "xp
evaluaría a pgv"xy
, donde x
es el registro.
Me ayudó una respuesta a esta pregunta de : Vim - mapeo con un prefijo de registro opcional junto con la respuesta de Benoit en esta página
Use lo siguiente:
xnoremap p pgvy
esto volverá a seleccionar y volver a jalar cualquier texto que esté pegado en modo visual.
Editar: para que esto funcione con "xp
puedes hacer:
xnoremap p pgv"@=v:register.''y''<cr>
v:register
expande al último nombre de registro utilizado en un comando de modo normal.
tratar -
:set guioptions-=a
:set guioptions-=A
"{register}p
no funcionará como usted describe. Reemplazará la selección con el contenido del registro. En su lugar, tendrá que hacer 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()
Lo cual debería estar bien siempre que no use un complemento que tenga un vmap non-nore p, y que espere que se sobrescriba un registro.
Este código está disponible como un script there . Ingo Karkat también definió un plugin resolver el mismo problema.