
Sé acerca de u
y Ctrl-r
para deshacer y rehacer. Pero u
me lleva de regreso al último estado guardado. Quiero saber como deshacer un pegado cmd-v
.
Por ejemplo,
I am typing here bla bla bla, [link to website](here I paste a wrong http link
with cmd-v)
Entonces quiero volver a,
I am typing here bla bla bla, [link to website](
¿Hay alguna manera de hacerlo en vim?
Gracias de antemano.
Respuesta1
Descargo de responsabilidad: ignoro por completo cómo los teclados Apple con cmd en lugar de ctrl interactúan con vim, por lo que es posible que deba cambiar o ajustar algo de esto.
La forma correcta de pegar en vim es usar el p
comando. Para pegar desde el portapapeles del sistema, usaría "*p
. Entonces, la forma estándar de hacer las cosas sería salir del modo de inserción y "*pa
( a
por supuesto, vuelve a ingresar al modo de inserción).
Si desea tener un atajo de teclado para usar en el modo de inserción, parecería natural hacer algo como:
inoremap <c-v> <esc>"*pa
(Es decir: escriba lo que hay allí en lugar de presionar ctrl+v y escapar).
A primera vista parecería asídeberíaproporcione el comportamiento que desea: simplemente está automatizando el proceso de pegado estándar que describí anteriormente. Pero no es así. Vim trata todas las partes de un comando como parte del mismo bloque de deshacer, y para vim el modo de inserción en sí es una especie de comando.
Sin embargo, puedes iniciar manualmente un nuevo bloque de deshacer mientras estás en el modo de inserción usando Ctrl+g seguido de u
(sí, lo sé, esta combinación de teclas parece bastante poco parecida a Vim, pero ahí lo tienes). Entonces, puedes modificar la reasignación de claves de esta manera:
inoremap <c-v> <c-g>u<esc>"*pa
Todo esto funcionará con ctrl+v (lo acabo de probar en Windows y funciona allí, al menos), es posible que necesites usar algo diferente (que no sea <c-v>
) para los accesos directos basados en cmd dentro de vim. Si estás usando un teclado Apple, eso implica OSX; si cmd+v es un atajo del sistema, no estoy seguro de qué tendría prioridad. Algunas búsquedas superficiales en Google sugieren que es posible que deba modificar alguna configuración a nivel del sistema operativo para que cmd funcione correctamente con vim.
Respuesta2
En MacVim, debe desasignar el Edit > Paste
elemento del menú para anular el acceso directo, luego puede reasignar Cmd-V ( D-v
en el lenguaje de MacVim) al comando apropiado en cada modo. Agregué esto a mi ~/.gvimrc
y ahora todo funciona de maravilla:
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>*
Sólo es <C-g>u
necesario en el modo de inserción para corregir el historial de deshacer; y noremap
son cnoremap
simplemente para restaurar el comportamiento de pegado predeterminado en los modos normal y de comando.
Gracias a evilsoup por indicarme la dirección correcta aquí.