Pegar en modo insertar?

385

¿Es posible pegar en modo insertar en Vim?

Amir Rachum
fuente

Respuestas:

465

Mientras está en el modo de inserción, presione CTRL-R {register}

Ejemplos:

  • CTRL-R * se insertará en el contenido del portapapeles
  • CTRL-R " (el registro sin nombre) inserta la última eliminación o extracción.

Para encontrar esto en el tipo de ayuda de vim :h i_ctrl-r

david
fuente
13
Sí, recientemente supe de CTRL-R y es extremadamente útil.
Dan
16
CTRL-R *solo funciona en GVIM o versiones compiladas para interactuar con x. Escribe vim --versiony busca +xterm_clipboard. Si no tiene eso, necesita una versión diferente de vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean
10
En realidad solo lo necesitas +clipboard, pero si lo tienes +xterm_clipboard, deberías tener eso de todos modos. En algunos sistemas operativos xterm_clipboardno es aplicable.
Andrew Marshall
1
Hmm, ¿uso C-r + para pegar desde el portapapeles del sistema en Windows (usando GVim portable)? Nunca he oído hablar de * registrarse.
kitsu.eb
66
@ kitsu.eb El *registro de sistemas en X se puede pegar con un clic del mouse mientras +que el tradicional copiar / pegar. standards.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc
235

Si no desea que Vim mangle formato en texto pegado entrante, también puede ser que desee considerar el uso: :set paste. Esto evitará que Vim vuelva a etiquetar su código. Cuando termine de pegar, :set nopastevolverá al comportamiento normal.

También es posible alternar el modo con una sola tecla, agregando algo como set pastetoggle=<F2>a su .vimrc. Más detalles sobre el cambio automático de sangría están aquí .

James Snyder
fuente
47
:set nopastedesactivará el modo pegar
James Snyder
24
@JamesSnyder Una mejor manera es :set paste!probablemente establecer pegar está muy cerca en su historial de comandos, por lo que simplemente puede presionar ':', luego flecha arriba y agregar un '!'.
Rafael Barbosa
66
Simplemente curioso: ¿qué es mejor o diferente sobre :set paste! Gracias :)
Michael Durrant
33
el !al final del comando en vimactiva y desactiva el comando. De esta manera, no tiene que escribir, :set nopastesino que puede desplazarse hacia arriba por su historial y ejecutar el mismo comando ( :set paste!) nuevamente.
에이 바
3
@blockloop Se supone que debes habilitarlo mientras lo pegas y deshabilitarlo inmediatamente después.
NieDzejkob
125

No, no directamente. Sin embargo, lo que puede hacer es salir rápidamente del modo de inserción para una sola operación en modo normal Ctrl-Oy luego pegar desde allí, lo que terminará volviendo a ponerlo en modo de inserción.

Combo clave: Ctrl-O p

EDITAR: Interesante. Parece que hay una manera que otras personas han enumerado.

JaredPar
fuente
2
ctrl-r "no funciona para mí (os x, vi en una terminal). ctrl-o p sí.
Bob
44
Esta es la forma más rápida y fácil de recordar.
pinpox
¿Qué hay de esc + p?
sitilge
2
Definitivamente más rápido esc + p + iy definitivamente más fácil de escribir queCTRL-R + "
lucidbrot
En realidad, esto a veces se comporta de manera diferente CTRL-R ". Por ejemplo, aunque la configuración de vimrc puede cambiar esto, pegar algo en una nueva línea usando CTRL-O phace que su sangría desaparezca.
noname
30

Mientras está en modo de inserción, puede usar Ctrl-R {register}, donde el registro puede ser:

  • + para el portapapeles
  • * para el portapapeles X (último texto seleccionado en X),
  • " para el registro sin nombre (última eliminación o extracción en Vim),
  • o una serie de otros (ver :h registers).

Ctrl-R {register} inserta el texto como si estuviera escrito.

Ctrl-R Ctrl-O {register} inserta el texto con la sangría original.

Ctrl-R Ctrl-P {register} inserta el texto y lo sangra automáticamente.

Ctrl-Ose puede usar para ejecutar cualquier comando de modo normal antes de volver al modo de inserción, por
Ctrl-O "+plo que también se puede usar, por ejemplo.

Para obtener más información, vea la documentación con :h i_ctrl-r

Zaz
fuente
44
Esta respuesta parece ser la más completa. Es muy claro, y en mi opinión, el más útil. Responde a la pregunta del OP y luego, de manera concisa.
Devvyn
26

Puede usar esto para pegar desde el portapapeles con Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

Y esto para extraer la selección visual en el portapapeles con Ctrlc:

vnoremap <C-c> "+y

Si también desea usar el portapapeles de forma predeterminada para el vim yanking / pegado clásico ( y/ p) en modo normal, aquí hay una opción de configuración que lo hace:

set clipboard=unnamedplus

Con esta configuración, por ejemplo, puede tirar primero en modo normal y luego pegar con el Ctrlvmodo de inserción. Además, puede pegar texto de diferentes instancias vim y diferentes aplicaciones.

Otra opción es:

set clipboard=unnamed

Luego podrá seleccionar algo arrastrando el mouse en su entorno X y luego pegarlo en vim. Pero (por alguna razón) no podrá tirar algo ( y) en Vim y shiftinsertluego en otro lugar, lo que probablemente sea bastante limitante.

Vim documenta sobre esto: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Para pegar desde registros personalizados, puede seguir las otras respuestas :). Esta respuesta se trata principalmente de integrar Vim con el portapapeles de su sistema.


Tenga en cuenta que para set clipboard=unnamedplusy set clipboard=unnamedpara trabajar, debe usar gvim o vimx ( vim-X11): se compilan con ellos +xterm_clipboard. Opcionalmente, puede poner esto en su .bashrcalias vimcon vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Puede averiguar si su vim tiene o no +xterm_clipboardla información proporcionada por vim --version.

clima
fuente
77
Esto es exactamente lo que estaba buscando. También es la única respuesta razonable aquí. Así es como uno espera que las cosas funcionen. ¿Alguien sabe por qué el comportamiento predeterminado de :set pastey el bizantino <leader><leader> * yes incluso remotamente deseable? Para no parecer demasiado comprometido, tengo una curiosidad genuina sobre qué filosofía refleja esto, o si es solo una desgracia histórica.
Esquilo
Su respuesta me permitió usar Shift + Insert en Gvim también con inoremap <S-Insert> <F12><C-r>+<F12>(uso F12 como pastetoggle). Gracias.
sromero
20

Si configura Vim para usar el portapapeles del sistema ( :set clipboard=unnamed), cualquier texto que copie en Vim se puede pegar con Shift+ Insert. Shift+ Insertes simplemente una combinación de teclas para pegar en todo el sistema operativo ( Ctrl+ Insertes la 'copia' correspondiente).

Será
fuente
1
No sabía sobre S-Insert :)
BandGap
¿Funciona esto a la inversa? ¿ pPegará el texto en el portapapeles?
Zaz
Antes de usar Shift + Insertpara pegar el texto, necesitamos estar en el modo de inserción.
jdhao
18

También puede usar el botón central del mouse para pegar en modo de inserción (solo Linux).

lcltj
fuente
106
¿De qué ratón estás hablando?
Jim Mitchener
19
¿De qué sistemas operativos no linux hablas?
Bruno Bronosky
-1: esta respuesta depende en gran medida de la configuración de hardware y terminal. En última instancia, los botones del mouse envían cadenas predeterminadas a la terminal, y la terminal analiza esa cadena para ejecutar un determinado comando. El problema es que esto puede variar mucho, dependiendo de la configuración del terminal. Para mejorar esta respuesta, proporciónenos, al menos, la versión del terminal, el sistema operativo y la versión y modelo del mouse que está utilizando.
melvynkim
Pegar el botón central del mouse es bastante común en todas las aplicaciones de Linux, no está limitado por las versiones de terminal o SO.
lcltj
No funciona en Arch Linux + urxvt. Agrega solo una nueva línea.
zygimantus
5

Puede ingresar al -- INSERT (past) --modo a través de:

  • Combo de teclado: y p

o

  • :set pastee ingresar al modo de inserción ( :set nopastepara deshabilitar)

una vez en -- INSERT (past) --modo, simplemente use la función de pegar de sus sistemas (por ejemplo, CtrlShiftven Linux, Cmdven Mac OS)

Esta estrategia es muy útil cuando se usa vim sobre ssh.

rudolph9
fuente
4

Si. En Windows Ctrl+ Vy en Linux presionando ambos botones del mouse casi simultáneamente.

En Windows, creo que esta línea en mi _vimrc probablemente lo hace:

source $VIMRUNTIME/mswin.vim

En Linux no recuerdo cómo lo hice. Parece que probablemente eliminé alguna línea del archivo .vimrc predeterminado.

Programador de Windows
fuente
¿Puedo votar más de una vez? Solo quiero pegar cuando vengo de otra ventana, así que siempre estoy en el mouse. ¡Brillante!
Dave
En Linux se pega presionando el botón central del mouse. Si tiene un mouse de dos botones y presiona el botón izquierdo y el derecho, entonces necesita "Emulate3Buttons" o similar para funcionar de esta manera.
Cougar
0

Pegar en modo Insertar

Un mapa personalizado parece apropiado en este caso. Esto es lo que uso para pegar elementos arrancados en modo de inserción:

inoremap <Leader>p <ESC>pa

Mi Leaderclave aquí es \; esto significa que presionar \pen modo de inserción pegaría los elementos / líneas previamente extraídos.

Sheharyar
fuente
0

Solo agrega el mapa:

" ~/.vimrc
inoremap <c-p> <c-r>*

reinicie vim y cuando presione Crtl+pen modo insertar, se pegará el texto copiado

itsnikolay
fuente