Quiero tener una forma rápida de configurar la 'paste'
opción Vim , insertar texto y volver al valor anterior de 'paste'
.
Un caso de uso típico inserta el contenido del portapapeles del sistema operativo literalmente, independientemente de cualquier reescritura del modo de inserción que pueda estar activa, como la sangría automática, y sin cambiar el estado de Vim. Otro caso de uso sería permitir que una función de macro del sistema operativo inyecte pulsaciones de teclas en Vim y las interprete como texto literal.
Obviamente, esto se generaliza a otras opciones: la idea general es establecer algunas opciones, pero solo durante la duración de un viaje a través del modo de inserción.
Básicamente quiero vincular una secuencia de teclas (por ejemplo _i
) a una macro que hace esto
:set paste
i…<Esc>
:set nopaste
donde i…<Esc>
quiero decir cambiar al modo de inserción (como con el i
comando) y reanudar la macro al regresar al modo de comando, excepto que quiero terminar con el 'paste'
todavía activo si estaba activo de antemano. ¿Cómo puedo hacer esto?
Nota: El contenido del portapapeles del sistema operativo se asigna al "*
registro . Cuando eso funciona, la 'paste'
opción no es muy útil. El escenario motivador para esta pregunta es para aquellos momentos en que "*
no se cumplen las condiciones para el soporte de registro: Vim no se compila con la +xterm_clipboard
función, o se ejecuta en un terminal como Screen o sobre SSH que lo aísla del servidor ambiente X.
fuente
+
o*
registrarse?Respuestas:
Prueba esto:
Almacena su estado de pegado actual en la variable inPaste y establece pegar si aún no está configurado. Luego configura un autocmd para cuando abandonas el modo de inserción, y luego te pone en modo de inserción.
Cuando abandona el modo de inserción, ejecuta el autocmd, que primero elimina el autocmd (para que no se ejecute cuando abandona el modo de inserción de otra manera), y finalmente establece nopaste si originalmente no estaba en modo de pegado.
Además, si está utilizando vim en un terminal, puede echar un vistazo a vim-bracketed-paste , que utiliza la función de modo de pegado entre corchetes proporcionada por varios emuladores de terminal para detectar si está pegando y configurar el modo automáticamente.
Editar: reparó el guión
fuente
_i
, lapaste
opción está desactivada, incluso si estaba activa antes.'paste'
debe estar activo por el menor tiempo posible. Inhabilita muchas funciones (incluidos los mapas), porque su único propósito es evitar malinterpretar el texto que se está pegando. Como tal, creo que el requisito citado no debería ser realmente necesario.Dicho esto, en realidad es bastante fácil de pegar sin necesidad de configurarlo
'paste'
. Si está ejecutando gvim o tiene+xterm_clipboard
en la consola vim, simplemente puede usar"+p
para pegar desde el portapapeles del sistema operativo.El problema de la sangría automática mientras se pega realmente solo ocurre en dos escenarios. Insertar el contenido de un registro mientras está en modo de inserción (
<C-r>+
) o pegar con el botón central con el mouse.En lugar de insertar el contenido de un registro mientras está en modo de inserción, pegar desde el registro en modo normal evitará el problema de formateo.
Si desea hacer clic con el botón central pegar con el mouse, use la
'mouse'
opción para permitir que Vim, en lugar del terminal, maneje el clic central. Luego, Vim insertará el contenido literalmente en lugar de interpretar el texto entrante como si estuviera escrito.fuente
'paste'
lo general, de hecho no está activo de antemano, pero no quiero tener que pensar en esto. A menudo trabajo en un Vim que no tiene acceso al portapapeles o mouse X, ya sea porque mi compilación de Vim no tiene laxterm_clipboard
función o porque estoy trabajando, por ejemplo, en una sesión de pantalla que actualmente está conectada a un X terminal.i
, no estoy preguntando cómo parametrizar esto) y restaurar el valor de la opción al regresar del modo de inserción."*p
o"+p
pegar desde los portapapeles, pero no quiero usar las capacidades de pegado del sistema") y luego esta respuesta es innecesaria. O no, y creo que esta respuesta tiene su lugar aquí.Personalmente, utilizo la yocombinación de teclas del excelente complemento vim-intacto de Tim Pope exactamente por esta razón. De su documentación:
Puede ser excesivo instalar el complemento simplemente por su pregunta, pero creo que también proporciona una gran cantidad de otras combinaciones de teclas útiles (más información en el archivo README ).
fuente
Con Vim 8+ en Linux o Mac, ahora puede simplemente usar la pasta nativa del terminal (por ejemplo, el botón central del mouse,
ctrl+shift+V
en Gnome,cmd+V
en Mac) si el terminal admite pegado entre corchetes. No presionei
para el Modo Insertar.Pegará el contenido del portapapeles de su sistema operativo, conservando los espacios y las pestañas sin agregar autoindenting. Es equivalente a la antigua
:set paste
,i
,ctrl+shift+V
,esc
,:set nopaste
método.Ya ni siquiera necesita instalar las funciones
+clipboard
o+xterm_clipboard
vim. Esta característica se llama "pasta entre corchetes". Para obtener más detalles, consulte /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763fuente