¿Cómo hacer que vim pegue (y copie) en el portapapeles del sistema?

772

A diferencia de otros editores, vim almacena el texto copiado en su propio portapapeles. Por lo tanto, es muy difícil para mí copiar texto de una página web y pegarlo en el archivo de trabajo actual. Sucede que tengo que abrir gedit o escribirlo manualmente.

¿Puedo hacer vim paste desde y hacia el portapapeles del sistema?

Santosh Kumar
fuente
77
Posible duplicado de ¿Cómo copiar al portapapeles usando vim?
BuZZ-dEE
77
Copiar "+ y Pegar" + p Funciona igual que tirar y pegar, excepto que especifique el registro antes.
Banjocat
2
Para usar los siguientes comandos, asegúrese de haber hecho sudo apt-get install vim-gnome lo que agregará esa funcionalidad al vim incorporado del uso del portapapeles del sistema.
Harnirvair Singh
2
@Harnirvair Para muchos conjuntos de lectores aquí, vim-gnomees probable que sea excesivo o simplemente no esté disponible en su sistema operativo / distribución, mientras que sospecho vim-gtky vim-gtk3es más probable que exista y obtenga menos dependencias, al tiempo que proporciona la integración del portapapeles (al menos para aquellos que todavía están en X11; No estoy seguro de cómo todo esto interactúa con Wayland).
underscore_d
3
Por defecto en Fedora - no hay acceso portapapeles (se necesita gVim), superuser.com/questions/194747/...
icc97

Respuestas:

881

Los registros "*y "+son para el portapapeles del sistema ( :help registers). Dependiendo de su sistema, pueden hacer cosas diferentes. Por ejemplo, en sistemas que no usan X11 como OSX o Windows, el "*registro se usa para leer y escribir en el portapapeles del sistema. En los sistemas X11 se pueden usar ambos registros. Consulte :help x11-selectionpara obtener más detalles, pero básicamente "*es análogo a la selección PRIMARIA de X11 (que generalmente copia las cosas que selecciona con el mouse y pega con el botón central del mouse) y "+es análogo a la selección CLIPBOARD de X11 (que es el portapapeles propiamente dicho).

Si todo eso pasó por alto, intente usar "*yyo "+yycopiar una línea al portapapeles de su sistema. Suponiendo que tiene las opciones de compilación apropiadas, una u otra debería funcionar. Es posible que desee reasignar esto a algo más conveniente para usted. Por ejemplo, podría poner vnoremap <C-c> "*ysu ~ / .vimrc para que pueda seleccionar visualmente y presionar Ctrl+ cpara tirar al portapapeles de su sistema.

Tenga en cuenta que copiar / pegar desde el portapapeles del sistema no funcionará si :echo has('clipboard')devuelve 0. En este caso, vim no se compila con la +clipboardfunción y tendrá que instalar una versión diferente o volver a compilarla. Algunas distribuciones de Linux proporcionan una instalación mínima de vim de forma predeterminada, pero generalmente si instala el paquete vim-gtkovim-gtk3 puede obtener las características adicionales.

También es posible que desee echar un vistazo a la 'clipboard'opción descrita en :help cb. En este caso, puede :set clipboard=unnamedo :set clipboard=unnamedplushacer que toda YanKing / eliminación de las operaciones de copia automáticamente al portapapeles del sistema. Esto podría ser un inconveniente en algunos casos donde está almacenando algo más en el portapapeles, ya que lo anulará.

Para pegar puede usar "+po "*p(nuevamente, dependiendo de su sistema y / o selección deseada) o puede asignarlos a otra cosa. Los escribo explícitamente, pero a menudo me encuentro en modo de inserción. Si está en modo de inserción, aún puede pegarlos con la sangría adecuada usando <C-r><C-p>*o <C-r><C-p>+. Ver :help i_CTRL-R_CTRL-P.

También vale la pena mencionar la pasteopción de vim ( :help paste). Esto pone a vim en un "modo de pegado" especial que deshabilita varias otras opciones, lo que le permite pegar fácilmente en vim usando su emulador de terminal o el acceso directo de pegado familiar del multiplexor. Simplemente escriba :set pastepara habilitarlo, pegue su contenido y luego escriba :set nopastepara deshabilitarlo. Alternativamente, puede usar la pastetoggleopción para establecer un código clave que alterna el modo ( :help pastetoggle). Recomiendo usar registros en lugar de estas opciones, pero si todavía dan demasiado miedo, esta puede ser una solución conveniente mientras perfeccionas tus chuletas vim.

Consulte :help clipboardpara obtener información más detallada.

Conner
fuente
104
Esto es muy informativo, pero ¿puede resumir las pulsaciones de teclas que necesita hacer para pegar desde el portapapeles del sistema ... por ejemplo, qué está haciendo "*p? ¿Presiono Shift- ', luego Shift-8, luego p, etc.?
T. Brian Jones
11
Sí, escriba esos tres caracteres en secuencia. Muchos comandos en vim utilizan lo que se conoce como "modo de operador pendiente" donde se presiona una tecla y luego vim espera más teclas. Toma ddpor ejemplo. El primero dingresa al modo pendiente del operador, luego el segundo dfinaliza el comando y elimina la línea. dGSin embargo, si escribe , Ghace que se elimine al final del archivo en lugar de simplemente eliminar la línea. Los registros usan este mismo principal para permitir que varios comandos los usen.
Conner
44
¡Pobre de mí! ¡Si hubiera visto esta publicación antes de hoy! Esto es todo lo que quería saber sobre copiar y pegar desde el portapapeles del sistema. El "<Cr> <Cp> * o <Cr> <Cp> +" es oro puro.
Keith Pinson
56
Un énfasis: necesita instalar el vim-gtkpaquete (al menos en Debian) para obtener el vim que se compila +xterm_clipboard. Me tomó 40mn descubrirlo, y solo unos segundos para hacerlo sudo apt-get install vim-gtk.
Dominykas Mostauskis
3
@DominykasMostauskis vim-gnometambién funciona y ha +xterm_clipboardhabilitado.
Chev
155

Puede copiar en vim mediante el acceso directo de gnome-terminal para pegar. Haga el archivo en modo de inserción y use

Ctrl+ Shift+ v.

Recuerda de antemano a

 :set paste 

para evitar jugar con la sangría.

Neel
fuente
20
esto arruina la sangría si hay varias líneas como python para loop
Moj
11
Use una palanca de pegar para el modo de inserción. Por ejemplo, configure pastetoggle = <F2> Luego, en modo de inserción, presione <F2> y luego inserte su código de Python.
Jan Weitz
Sí, copie con Ctrl + Shift + c y péguelo en otro archivo r
neel
1
Si se muestran pestañas / espacios en blanco, anguilas, etc. como un carácter visible (a través de la opción listchars), esos caracteres sustitutos se copiarán en lugar de los ocultos.
user907860
2
Esta debería ser la respuesta seleccionada dada su respuesta concisa
Aidin
41

Linux

En mi sistema Linux, los registros +y se *asignan a una selección X11, que se puede pegar con el botón central del mouse. Cuando :set clipboard=unnamedy :set clipboard=unnamedplusse usan, los registros se asignan al portapapeles y se pueden pegar con CTRL-V.

Los detalles parecen depender un poco de la configuración y del sistema, por lo que su kilometraje definitivamente variará. Sin embargo, definitivamente debería hacerte apuntar en la dirección correcta.

Ver también

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Todd A. Jacobs
fuente
2
Solo se *asigna al registro primario X11 (que normalmente se pega con el mouse). +mapas al registro del portapapeles X11 normalmente pegados por accesos directos.
ZyX
@ZyX No en mi sistema, pero su kilometraje ciertamente puede variar. Es mejor configurar el comportamiento que desea explícitamente si desea una experiencia consistente en todas las plataformas y versiones de software.
Todd A. Jacobs
Creo que significa que tienes un administrador de portapapeles como klipper / glipper, que pueden sincronizar dos buffers. Esto no cambia el hecho de que vim usos *para primaria y +para portapapeles registros X11, se puede ver esto en la fuente vim: estos valores se establecen allí y nunca modificadas, y clip_star, y clip_plussiempre se utilizan para *y +registros, respectivamente.
ZyX
41

Para mi esa configuración funciona para copiar y pegar

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
lis2
fuente
en lo que pegaste?
StarWind0
Este en mi humilde opinión es una mejor solución que establecer clibboard en sin nombre, para no meterse con el portapapeles del sistema operativo con cada acción x / dd / y etc. Y en una Mac puede ser una mejor idea cambiar el modificador C (ctrl) a D para mapear combinaciones cmd + c / x / v.
mindex
34

Estas serían las líneas que necesita en su vimrc para este propósito:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard
Danniel Little
fuente
2
Me gusta tu solución Me gustaría una mejor explicación.
zhon
excelente. Usar registros siempre me hace dudar y tener que pensar. Esto es mucho mejor
JonnyRaa
Mi versión vim tiene + portapapeles y esta opción no funciona para mí. Estoy usando Byobu (que usa Tmux debajo del capó).
GGhe
Tuve que agregar set portapapeles + = unnamedplus para Fedora
hakunin
30

Creo que esta pregunta merece una respuesta más objetiva y gráfica:

Entrar en modo pegar

  • ESC
  • : establecer pegar
  • prensa i
  • SHIFT+ Insert(con un texto copiado en su portapapeles)


Salir del modo pegar

  • ESC
  • : establecer nopaste
  • prensa i

Pegaste el texto y puedes volver a escribir.

ivanleoncz
fuente
1
Tengo esto para trabajar, pero :set nopasteno hace nada. ¿Qué se supone que haga? ¿Por qué lo necesito?
Marko Avlijaš
1
Bueno, en realidad lo hace. Cuando actúas :set nopaste, le estás diciendo al editor que ya no quieres pegar. Y cuando golpeas i, estás volviendo al modo de edición :).
ivanleoncz
2
Para ser honesto contigo, Marko, no lo sé.
ivanleoncz
1
SHIFT + Insert lo hizo para mí, ¡gracias!
Melissa Loos
1
Esto funcionó como un encanto para mí. Cada vez que vuelvo a VIM siempre termino teniendo que mirar algo así.
benjaminadk
17

portapapeles

Hay un registro especial para almacenar esta selección, es el registro "*. Nada se coloca aquí a menos que la información sobre el texto seleccionado esté a punto de cambiar (por ejemplo, con un clic izquierdo del mouse en algún lugar), o cuando otra aplicación quiera pegue el texto seleccionado. Luego el texto se coloca en el registro "*". Por ejemplo, para cortar una línea y convertirla en la selección actual / ponerla en el CLIPBOARD:

    "*dd

De manera similar, cuando desea pegar una selección desde otra aplicación, por ejemplo, al hacer clic en el botón central del mouse, la selección se coloca primero en el registro "* y luego" poner "como cualquier otro registro. Por ejemplo, para colocar la selección (contenido del CLIPBOARD):

    "*p

registra E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

Pegar desde el portapapeles

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

Verifique el soporte del portapapeles X11 en la terminal

Cuando desee ejecutar Vim en un terminal, debe buscar una versión de Vim que se haya compilado con soporte para portapapeles. Verifique el soporte del portapapeles X11, desde la consola, escriba:

% vim --version

Si ve "+ xterm_clipboard", está listo para comenzar.

http://vim.wikia.com/wiki/Accessing_the_system_clipboard

El servidor X mantiene tres selecciones, llamadas:

PRIMARIO, SECUNDARIO y CLIPBOARD

La selección PRIMARIA se usa convencionalmente para implementar copiar y pegar mediante el botón central del mouse. Las selecciones SECUNDARIA y CLIPBOARD son menos utilizadas por los programas de aplicación.

http://linux.die.net/man/1/xsel

El demz
fuente
12

Intenté las sugerencias anteriores y ninguna de ellas funcionó en mi entorno. (Windows PuTTY clon sobre ssh)

Aparecieron algunos google adicionales: /unix/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

Uno de los comentarios sugirió usar SHIFT+INSERTcuál fue el truco para pegar desde el portapapeles de mi escritorio en el búfer de Vim. Ctrl-Cya estaba trabajando para copiar al portapapeles del escritorio desde Vim.

Comunidad
fuente
2
Estoy trabajando en vim dentro de la herramienta cmder [Windows 8.1]. cuando ingresa a la configuración de cmder> teclas y macros> pegar, obtuve el comando shift + insert para pegar multilínea y ctrl + v para pegar una sola línea.
Zubair Alam
1
¡Para mí, un simple clic derecho funciona como un encanto! ¡Solo un clic derecho!
Fr0zenFyr
2
Debido a que está utilizando un terminal y ssh vim no puede alcanzar el portapapeles de su sistema nativo a través de SSL. SHIFT+INSERTfunciona porque es la opción de pegar para su terminal (o en su caso PuTTY); sin embargo, la sangría probablemente estará mal. Consulte el último párrafo de mi respuesta sobre la pasteopción de corregir esto.
Conner
1
@jinksPadlock. gracias ... sí ... puedo copiar / pegar con el mouse ... estaba tratando de descubrir cómo hacerlo "solo con el teclado". La copia de Windows a VIM es posible solo con Teclado usando Putty, pero no en la dirección inversa. En bash para windows ... no es posible hacerlo en ninguna dirección ATM. Compiló una lista de recursos para orientar a las personas en las direcciones correctas y también para nosotros ... si tiene algo que agregar ... tal vez pueda agregarlos aquí: stackoverflow.com/questions/45271895/…
alpha_989
1
@ alpha_989 más tarde-mejor-que-nunca;) No puedo agregar a jinksPadlock 'ya que actualmente no tengo un sistema operativo Windows bajo mis dedos. SHIFT+INSfunciona desde un host de Linux a ssh vim, así como el tercer clic del mouse.
tuk0z
10

No tenía + portapapeles, así que se me ocurrió esta solución alternativa usando xsel:

Agregue a su ~ / .vimrc:

vnoremap <C-C> :w !xsel -b<CR><CR>

Rotestein
fuente
1
Gracias por esta gran idea! Terminé usando:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
Andy
6

Una nota rápida para las personas cuya instalación de vim no admite los registros * y +. No es necesario descargar una nueva instalación de vim para pegar desde el portapapeles. Aquí hay un método alternativo:

1) Instalar parcellite (un administrador de portapapeles con poca huella de memoria);

2) En su archivo .vimrc, agregue lo siguiente:

command Clip r !parcellite -c

3) Reiniciar vim.

Ahora, cuando escriba: Clip como un comando ex, el contenido del portapapeles se pegará en el cursor. También puede asignar el nuevo comando a una tecla de función para poder hacerlo con solo presionar una tecla.

lovecraftian
fuente
4

Esto funciona para mí: Ctrl+ Shift+V

Boseam
fuente
3
La respuesta de @neel ya lo dijo. Esto solo debería ser un comentario, o mejor un voto positivo, si quieres decir que también funcionó para ti.
ericbn
3

La solución más simple para esto, que también funciona entre diferentes máquinas Linux a través de ssh:

  1. Comprobar si los soportes vim X-11 portapapeles: vim --version | grep clipboard. Si informa -clipboardy -xterm_clipboarddebe instalar uno vim-gtko vim-gnome(gvim en arch linux)

  2. Agregue las siguientes líneas a su .vimrc:

set clipboard=unnamedplus
set paste
  1. Si inicia sesión en una máquina diferente a través de ssh, use la opción -Y: ssh -Y machine

Ahora, copiar y pegar debería funcionar exactamente como se espera en una sola máquina y en diferentes máquinas utilizando solo ypara tirar y ppegar. NB modifique .vimrcen todas las máquinas donde desee usar esta función.

chao
fuente
Creo que el servidor X también debería estar disponible en el servidor para que esto funcione. ¡Si! puede ser instalado por vim-gtk. Creo que xvfb será una opción alternativa para ejecutar el servidor X.
Ajeeb.KP
3

Me encontré con este problema en un mediados de 2017 MacBook Pro que se ejecuta vimdentro iTerm2como mi entorno de desarrollo principal.

Como han sugerido otras respuestas, corrí vim --versiony noté que regresa -clipboard, lo que significa que la versión de la vimque se envió con mi máquina no se ha compilado con la opción del portapapeles.

El homebrewpaquete para vimparece compilarse con la clipboardopción, por lo que la solución para mí fue:

  1. correr brew install vim
  2. Agregar set clipboard+=unnameda mi ~/.vimrcarchivo
  3. Cerrar y reabrir iTerm2
NM Pennypacker
fuente
3

Copiar al portapapeles del sistema operativo

Seleccione texto en modo visual, presione "*y

Pegar desde el portapapeles del sistema operativo

prensa "*p

Muhammed Ozdogan
fuente
2

Siguiendo la respuesta de Conner, que fue genial, pero C-R C-p + y C-R C-p *en modo de inserción es un poco incómodo. Lo mismo "*py "+pdesde el modo de comando.

un gurú de VIM sugirió lo siguiente para mapear C-vlo que C-r C-p +hace.

Podría tener solo :inoremap <C-v> <C-o>"+ppara el modo de inserción

si realmente quisiera anular el modo visual en bloque (no recomendado por él ya que el modo visual es bueno) podría tener map <C-v> "+p

barlop
fuente
2

Si está utilizando vim en MAC OSX, desafortunadamente viene con una versión anterior y no cumple con las opciones del portapapeles. Afortunadamente, homebrew puede resolver fácilmente este problema.

instalar vim:

brew install vim --with-lua --with-override-system-vim

instalar gui verion de vim:

brew install macvim --with-lua --with-override-system-vim

reinicie el terminal para que surta efecto.


agregue la siguiente línea a ~/.vimrc
set clipboard=unnamed

ahora puede copiar la línea en vim con yyy pegarla en todo el sistema.

anónimo
fuente
2

Si está utilizando un mouse primero, haga

 :set paste 

Luego right click mousey los contenidos en el buffer serán pegados

Mohammed Rafeeq
fuente
1

Además de la configuración :set clipboard=unnamed, debe usar con mvim -vqué puede obtener brew install macvimsi está usando vim en Terminal.app en Mac OS X 10.9. Vim predeterminado no admite la opción del portapapeles.

Nobu
fuente
1

También vale la pena mencionar que, en OSX con Vim, puede seleccionar texto con el mouse, Cmd-C para copiar en el portapapeles del sistema OSX, y el texto copiado estará disponible en el portapapeles fuera de Vim.

En otras palabras, OSX lo trata como si fuera una ventana normal, y aquí es donde resulta útil el muy difamado botón de "Comando" de Apple.

B-30

B-30
fuente
1
Esto también es cierto para cualquier emulador de terminal medio decente en cualquier otro sistema operativo. Apple no tiene ninguna ventaja aquí.
underscore_d
1

Basado en la respuesta @ lis2, uso una configuración más simple que no forzará el modo Insertar al final:

" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c> "+y
  vnoremap <C-x> "+d
  vnoremap <C-v> "+p
  inoremap <C-v> <C-r><C-o>+
endif

Tenga en cuenta que todas estas asignaciones de Vim predeterminadas:

  • v_CTRL-C: detener el modo Visual
  • v_CTRL-X: restar [cuenta] del número
  • v_CTRL-V: modo visual en bloque
  • i_CTRL-V: inserte literalmente el siguiente no dígito, que también se asigna a i_CTRL-Q

Como alternativa, se puede utilizar las teclas inspirados en el "tirón", "Borrar" y "put" verbos: Vim <C-y>, <C-d>y <C-p>respectivamente. Estos solo anularían una asignación predeterminada:

  • i_CTRL-P: palabra clave de búsqueda hacia atrás para completar
ericbn
fuente
1

Las otras soluciones son buenas si desea cambiar su vimrc, etc. Sin embargo, quería una forma simple de copiar desde vim al teclado de mi sistema. Esto es lo que se me ocurrió.

  • Seleccione el texto que desea copiar con el modo visual v
  • Presione :(se expandirá automáticamente para mostrar :'<,'>)
  • Escriba y * o y + (según su sistema) para tirar el texto seleccionado al portapapeles del sistema
NateW
fuente
1

Lo que realmente necesitas es EasyClip . Hará exactamente eso y mucho más ...

Scott Wade
fuente
1

Desde vim 8, el clic derecho habilita el modo visual de forma predeterminada. Esto evita el copiar y pegar "normal" (llámelo "defecto por diseño" https://github.com/vim/vim/issues/1326 ). Arregla haciendo:

echo "set mouse-=a" >> ~/.vimrc .

Salga y reinicie vim.

dr0i
fuente
1

Con Vim 8+ en Linux o Mac, ahora puede simplemente usar la pasta nativa del sistema operativo ( ctrl+shift+Ven Linux, cmd+Ven Mac). No presione ipara 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 nopastemétodo.

Ya ni siquiera necesita instalar las funciones +clipboardo +xterm_clipboardvim. Esta característica se llama "pasta entre corchetes". Para obtener más detalles, consulte Desactivar la sangría automática al pegar texto en vim

wisbucky
fuente
0

Cuando uso mi Debian vim que no está integrado con Gnome (vim --version | grep clip # no muestra soporte para el portapapeles), puedo copiar al portapapeles después de mantener presionada la tecla Mayús y seleccionar el texto con el mouse, como con cualquier programa de otras maldiciones. Como deduje de un comentario de @Conner, es el terminal (gnome-terminal en mi caso) el que apaga el informe de eventos del mouse cuando detecta que presiono Shift. Supongo que los programas basados ​​en maldiciones pueden recibir eventos del mouse después de enviar una cierta secuencia de escape al terminal.

anguila ghEEz
fuente
1
Esto está usando su terminal, no vim.
Conner
0

Si está en Windows y desea pegar el contenido del portapapeles del sistema p, escriba este comando.

:set clipboard = unnamed

Esto resolvió mi problema.

vincent mathew
fuente
0

Hay dos formas simples de hacer esto. Haga su archivo en modo de inserción y 1) presione el botón central (la rueda de desplazamiento) en su mouse, o 2) Ctrl + Shift + V

usuario1898814
fuente
0

Para algunos teclados internacionales, es posible que deba presionar "+ Spacepara obtener a ".

Entonces, en ese caso, tendría que presionar "Space+yo "Space*ycopiar.

Y "Space+po " Space*ppegar.

Arthur F
fuente
0

Utilicé la respuesta de NM Pennypacker e instalé vim a través de homebrew para una MacBook Pro de principios de 2011:

brew install vim

Ahora también puedo usar el registro "* para copiar y pegar texto dentro de vim. Incluso no tuve que cambiar algo dentro de mi archivo ~ / .vimrc o $ PATH. Homebrew agregó enlaces simbólicos en / usr / local / bin, por ejemplo vim -> ../Cellar/vim/8.1.2350/bin/vim.

La alternativa, que funcionaba antes, es copiar algunas líneas de texto dentro de vim marcándolo con el mouse y usando copiar y pegar (cmd + c, cmd + v) en una Mac. Esta opción solo funciona si el texto que desea copiar y pegar tiene un tamaño menor que el tamaño de la ventana de vim. Si desea copiar todo el texto dentro de vim marcando toda la ventana o usando cmd + a, esto copiará otras partes de la consola, escritas antes de iniciar vim, lo cual es muy molesto.

Entonces, estoy feliz de haber encontrado el nuevo método usando el registro del portapapeles.

feli_x
fuente