Pregunta

¿Alguien sabe de una forma 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 "x p en lugar de solo p

¿Fue útil?

Solución

"{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()

Que debería estar bien siempre y cuando no use un complemento que tenga un vmap no nore a p, y que espere que se sobrescriba un registro.

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

Otros consejos

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 solucionado asignando "_d a "_c, <=> a <=>, 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

Use lo siguiente:

xnoremap p pgvy

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

Editar: para que esto funcione con "xp puedes hacer:

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

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

En tu .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í.

La solución de Luc Hermitte funciona de maravilla. Lo estuve usando durante aproximadamente una semana más o menos. Luego descubrí una solución de Steve Losh's .vimrc that works. 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  

Pruebe esto en su ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremap significa que esto es solo para el modo Visual, no para los modos Visual + Select.

  • <expr> significa que {rhs} de la configuración xnoremap {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 utiliza durante el cumplimiento de la asignación.

El resultado de "xp se evaluaría a pgv"xy, donde x es 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

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

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

¡Luc Hermitte hizo el truco! Realmente bueno. Aquí está su solución puesta en una función de alternar, para que pueda cambiar entre el comportamiento normal y la colocación sin registro de 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>

prueba -

:set guioptions-=a
:set guioptions-=A
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top