Cómo pegar sin sobrescribir el registro

112

¿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 en el cuello escribir en "xplugar de solop

Starr Horne
fuente

Respuestas:

33

"{register}pno funcionará como lo 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 y cuando no use un complemento que tenga un vmap que no sea nore ap, y que espere que se sobrescriba un registro.

Este código está disponible como script allí . Ingo Karkat también definió un complemento que resuelve el mismo problema.

Luc Hermitte
fuente
En realidad, pensé que había una forma ordenada de buscar la caja registradora utilizada, pero no recordaba cómo. De ahí la complejidad de la función.
Luc Hermitte
1
Creo que esto es excesivo, no recordaré el regtype(¿linewise?) Y que reasignar p pgvyes suficiente.
Benoit
2
Puede ser exagerado, pero no tiene efectos secundarios. En a "xp, esto no sobrescribe el @"contenido con @xdiferenciapgvy
Luc Hermitte
1
entonces que pasa :xnoremap p pgv@=v:register.'y'<cr>?
Benoit
1
No funciona para mi. También intenté descargar el script. Aquí está la lista de comandos que hago: Primero presiono v, luego e para seleccionar hasta el final de la palabra, luego y para tirar de ella. Después de eso, voy a una palabra diferente que quiero reemplazar. Presiono v, e luego p para reemplazar ese. Luego lo vuelvo a hacer, pero esta vez la siguiente palabra es reemplazada por la que reemplacé antes.
Eddy
41

No me gusta el comportamiento por defecto vim de copiar todo el texto que ha de suprimirse d, D, c, o Cen el registro por defecto.

Lo he solucionado mapeando da "_d, ca "_c, y así sucesivamente.

Desde 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
Jeff Lake
fuente
Tan útiles como son estas asignaciones (yo mismo hago algo similar), no responden a la pregunta de OP, p aún sobrescribirá lo que pegó sobre el contenido seleccionado.
Magnus
32

Utilice lo siguiente:

xnoremap p pgvy

esto volverá a seleccionar y volver a tirar de cualquier texto que se pegue en modo visual.

Editar: para que esto funcione "xp, puede hacer:

xnoremap p pgv"@=v:register.'y'<cr>

v:register se expande al último nombre de registro utilizado en un comando de modo normal.

Benoit
fuente
En a "xp, este enfoque se sobrescribe @"con @x.
Luc Hermitte
3
Tu sugerencia de xnoremap p pgv"@=v:register.'y'<cr>no funcionó para mí. Esto, sin embargo, sí:xnoremap <expr> p 'pgv"'.v:register.'y'
mrak
Esto parece interesante. ¿Podría agregar una línea sobre lo que ghace? No lo había visto antes.
LondonRob
4
@LondonRob: gsolo no hace nada. Proporciona comandos extendidos de varias teclas, como z. Por ejemplo, gova al enésimo byte en el búfer, gjy gkva a la línea mostrada siguiente y anterior (difiere de jkcuando las líneas están ajustadas), gamuestra información sobre el carácter debajo del cursor, gJune líneas sin espacio y aquí gvrestaura la última selección visual. Puede utilizar :help gv.
Benoit
6
@mark :xnoremap <expr> p 'pgv"'.v:register.'y`>' , agregué `` ''> `` Para restaurar la posición del cursor
rox
19

En tus .vimrc

xnoremap p "_dP

Encontré esto en 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í.

Jason Denney
fuente
2
Esta parece la solución más sencilla.
rudolph9
1
Trabajó para mi. Y esta respuesta es clara. .vimrc.localtambién está bien.
BaiJiFeiLong
3
No funciona si su selección se extiende hasta el final de la línea.
John Freeman
6

La solución de Luc Hermitte funciona de maravilla. Lo estuve usando durante aproximadamente una semana. Luego descubrí una solución de .vimrc de Steve Losh que funciona muy bien si YankRing es parte de su línea de complementos / 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  
Taine
fuente
6

Prueba esto en tu ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapsignifica que esto es solo para el Visualmodo, no para los Visual + Selectmodos.

  • <expr>significa que {rhs}el xnoremap {lhs} {rhs}escenario se evalúa como una expresión.

  • En este caso, nuestra expresión de 'pgv"'.v:register.'y'se usa .para la concatenación.

  • v:register se evalúa al registro que se utiliza durante el cumplimiento del mapeo.

El resultado de "xpevaluaría a pgv"xy, donde xestá el registro.

Me ayudó una respuesta a esta pregunta de stackoverflow: Vim: mapeo con un prefijo de registro opcional junto con la respuesta de Benoit en esta página

mrak
fuente
4

La función de Luc funcionó bien para mí después de que hice un cambio para respaldar el hecho de que tengo portapapeles = conjunto sin nombre:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction
danprice
fuente
1
Como referencia: usar clipboard=unnamedplusesto tiene que ser en @+lugar de @*.
Sebastian Blask
2

¡Luc Hermitte hizo el truco! Realmente bueno. Aquí está su solución colocada en una función de alternancia, para que pueda cambiar entre el comportamiento normal y la colocación de registro sin reemplazo.

el comando, u alterna 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>
Joernsn
fuente
También puede cambiar s: Repl para que devuelva "p" en lugar de "p @ = RestoreRegister () \ <cr>" dependiendo del valor de s: putSwap.
Luc Hermitte
1
prefiero en silent! vunmaplugar devnoremap <silent> <expr> p p
Luc Hermitte
0

programación de cinta adhesiva, pero funciona para mí:

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<
steven_noble
fuente
-4

tratar -

:set guioptions-=a
:set guioptions-=A
Gowri
fuente
3
Éstos controlan si el texto seleccionado se agrega al portapapeles del sistema de ventanas (por ejemplo, X11 o Win32), no a los registros de copia internos de Vim.
Rob Kennedy