rehacer comandos vim vi

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



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 modo Visual , no para los modos Visual + Select .

  • <expr> significa que {rhs} de la 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 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.