¿Cómo solo deshago el texto pegado en vim?

10

TL; DR; versión - ¿Cómo deshago el texto que se pegó desde el búfer de copia de mi sistema operativo sin deshacer otro texto que se escribió desde que entré en modo de inserción?

Descripción más larga:

  1. Coloque algo en el búfer de copia de su sistema operativo (por ejemplo, resalte algo de texto y haga Command-cen Mac)
  2. Entra en modo insertar en vim ( i)
  3. Escribe algo (por ejemplo asdf)
  4. Sin salir del modo de inserción, pegue desde su búfer de copia en vim ( Command-ven Mac)
  5. Golpear escape
  6. Intenta deshacer la pasta ( u)

Deshace todo desde la última vez que entró en modo de inserción. En otras palabras, se borra asdfmás todo el texto que pegué.

¿Cómo me acaba de deshacer el texto que pega en? ¿Tengo que salir siempre del modo de inserción y volver a ingresar antes de pegar texto solo para tener la opción de deshacer el texto pegado?

Javid Jamae
fuente

Respuestas:

4

Una forma es abandonar y volver explícitamente al modo de inserción antes del pegado. Si extiende los comandos de pegado, también puede establecer automáticamente un punto de deshacer antes del pegado:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Lo anterior es para el i_CTRL-Rcomando incorporado . No sé cómo Command-vse implementa en MacVim, pero anteponer <C-G>ual :imapcomando debería lograr el mismo efecto.

Ingo Karkat
fuente
1
Funciona como un encanto, gracias! Probablemente debería seguir con los métodos vim estándar para pegar de todos modos.
Javid Jamae
Simplemente agregue esto: :h i_CTRL-G_u(es decir, "romper secuencia de deshacer, comenzar nuevo cambio" en modo de inserción).
toraritte
2

En MacVim, debe desasignar el Edit > Pasteelemento del menú para anular el acceso directo, luego puede reasignar Cmd-V ( D-ven el lenguaje MacVim) al comando apropiado en cada modo. Agregué esto a mi ~/.gvimrcy ahora todo funciona maravillosamente:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

El <C-g>ues necesaria sólo en el modo de inserción para fijar el historial de deshacer; la noremapy cnoremapson simplemente para restaurar el comportamiento de pegado predeterminada en los modos normal y de mando.

Gracias a Ingo Karkat por señalarme en la dirección correcta aquí.

Sophie Alpert
fuente
1

En realidad, la solución es que Escprimero tiene que ir al modo de comando (por ejemplo ) y volver a ingresar al modo de inserción, pero solo funciona si escribo manualmente, pero parece que "aleatoriamente" deja de funcionar si lo pruebo ~/.vimrc. Google no ayuda en absoluto.

Paso mucho tiempo tratando de solucionar este problema y descubro la razón en mi caso:

No asigne la misma clave de pegado con la clave de pegado existente del terminal

por ejemplo, Ctrl+Shift+Vva a pegar en mi terminal Konsole, pero si le asigno esta clave <C-S-v>en ~/.vimrcel "deshacer por sólo una sola pasta en lugar de varias pastas" no va a trabajar.

En mi caso, tengo que usar en <C-v>lugar de <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Su caso puede ser diferente, pero el punto es el mismo: no asigne los mismos conflictos de clave de pegado con la clave de emulador de terminal existente.

He demostrado al 100% esta conclusión configurando mi clave de pegado de terminal Ctrl+Vy ahora <C-v>dejo de funcionar pero <C-S-v>funciona.

Tenga en cuenta también que el vim es demasiado sensible y extraño. Me doy cuenta de que tengo que usar iy luego 2 teclas de derecha manualmente para que funcione en la posición correcta del cursor, eso significa que tengo que poner iy 2 teclas de derecha ~/.vimrctambién. Su caso puede ser diferente, pero el punto es el mismo, asegúrese de que las teclas + el orden en ~ / .vimrc coincidan al 100% con lo que escribe manualmente.

林果 皞
fuente