¿Cómo puedo copiar texto al portapapeles del sistema desde Vim?

284

¿Hay alguna forma de copiar un bloque de texto en el portapapeles del sistema, para poder pegarlo en otro programa?

thameera
fuente
12
Esto ya se ha preguntado y respondido en SO. Puede encontrar más y diferente información allí.
bsmith89
1
He estado usando este complemento en macvim christoomey / vim-system-copy y realmente me encanta. Funciona muy bien con los movimientos cpip, cpi{.
Filype
2
Lo que realmente necesitas es EasyClip . Hará exactamente eso y mucho más ...
Scott Wade

Respuestas:

324

Para los sistemas basados ​​en X11 (es decir, Linux y la mayoría de los sistemas similares a UNIX ) hay dos portapapeles que son independientes entre sí:

  • PRIMARIO: se trata de copiar al seleccionar y se puede pegar con el botón central del mouse.
  • CLIPBOARD: se copia con (generalmente) ^Cy se pega con ^V(es como MS Windows).

Los sistemas OS X y Windows solo tienen un portapapeles.

Para los sistemas X11 también hay varias herramientas que sincronizan estos portapapeles por usted; así que si parecen ser iguales, puede tener uno de ellos ejecutándose.

Vim tiene dos registros especiales correspondientes a estos portapapeles:

  • *utiliza PRIMARIO; mnemónico: S tar es S elect (para copy-on- s elect)
  • +usa el CLIPBOARD; mnemónico: CTRL PLUS C (para la combinación de teclas común)

En Windows y OS X no hay diferencia entre +y *, ya que estos sistemas solo tienen un portapapeles único, y ambos registros se refieren a lo mismo (no importa cuál use).

Puede usar estos registros como cualquier registro. Por ejemplo, usando el portapapeles PRIMARIO *con los comandos yy p:

  • "*yy
  • "*p

Tal vez podría usar esto como combinaciones de teclas más convenientes:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Si desea interactuar "automáticamente" con el portapapeles del sistema en lugar de consultarlo manualmente todo el tiempo, puede configurar la clipboardvariable:

  • Configúrelo unnamedpara usar *(PRIMARIO, en seleccionar)
  • Configurarlo unnamedpluspara usar +(CLIPBOARD, ^C)

Ahora, solo usando yyirá al portapapeles del sistema, en lugar del registro sin nombre de Vim, y ppegará el portapapeles del sistema.

También puede asignar a estos registros como cualquier registro con let:

  • :let @+=42
  • :let @*=42

La clipboardconfiguración tiene algunas opciones más (como excluir filtros); Pero estos son los conceptos básicos. Ver :help 'clipboard'para la historia completa ;-)

gVim

Si usa gVim, puede obtener un comportamiento de copiar al seleccionar cuando lo usa :set guioptions+=a.
Esto está habilitado por defecto en los sistemas X11 (copias a PRIMARY), pero no en MS Windows y OSX (ya que seleccionar cualquier texto anularía su portapapeles).

No +clipboard?

Vim requiere el +clipboardindicador de función para que todo esto funcione; se puede comprobar si su Vim tiene esto mediante el uso :echo has('clipboard')de dentro de Vim (si la salida es 0, es que no está presente, si es 1, lo es), o control de la salida de vim --versionpara +clipboard.

La mayoría de las distribuciones de Linux se entregan con una compilación Vim "mínima" por defecto, que no tiene +clipboard, pero generalmente puede instalarla:

  • Debian y Ubuntu: Instalar vim-gtko vim-gnome.
  • Fedora: instalar vim-X11y ejecutar en vimxlugar de vim( más información ).
  • Arch Linux: instalar gvim(esto habilitará también +clipboardpara normal vim).

También puede usar xclip, xcopyo xselcopiar texto en el portapapeles; vea las siguientes preguntas para soluciones:

SSH

También puede usar un portapapeles en máquinas remotas si habilita el reenvío X11 a través de SSH. Esto es especialmente útil con el consejo anterior, ya que puede usarlo xclippara acceder al portapapeles de su escritorio. El Vim en la máquina a la que le estás enviando todavía necesitará la +clipboardfunción.

Esto requiere la ForwardX11Trustedconfiguración, y solo debe hacerse con servidores confiables , ya que esto le da al servidor un control casi completo sobre su sesión X11:

$ ssh -XY myhost

Para que esta configuración sea persistente (para que no necesite agregarla -XYcada vez), puede hacer algo como esto en su ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim renovó el soporte del portapapeles. La interfaz incorporada fue removido y reemplazado con un sistema que llamar una utilidad externa tal como xclip, xsel, o pbcopy/ pbpaste.

Debería recoger automáticamente estas utilidades y usarlas. En OS X pbcopy y pbpastedebería estar disponible de forma predeterminada, en Linux probablemente desee instalar xclip, ya que es el más ampliamente disponible (en realidad, hay dos versiones xselcon indicadores incompatibles . Esto es realmente estúpido).

Ver también :help clipboarden Neovim.

Martin Tournoij
fuente
66
ssh -Y implica -X, entonces -X puede omitirse.
hildred
Para algunos teclados internacionales, es posible que deba presionar "<Space>para obtener un ". Entonces, en ese caso, tendría que presionar "<Space>+yo "<Space>*ycopiar.
Arthur F
1
Un efecto secundario muy interesante de aprender esto (hace unos años) para mí ha sido la realización de que "puedo seleccionar muchos registros con nombre. "+No es magia, es solo registrarse +. Así por ejemplo, si desea copiar tres cosas al mismo tiempo y pegar cada uno de ellos uno por uno, se puede "1y, "2yy "3yy más tarde "1p, "2py "3p. Esto es realmente poderoso e inexistente en casi cualquier otro editor. Otro uso interesante es mirar las macros almacenadas. Por ejemplo, si graba con qq, pero se da cuenta de que necesita arreglarlo, puede: en una línea temporal "qp, arreglarlo y "qd.
Shahbaz
1
Solo una nota: OS X tiene dos portapapeles separados. Se accede a uno usando Cmd-C y Cmd-V y al otro usando las combinaciones de teclas emacs Ctrl-K y Ctrl-Y.
BallpointBen
3
@shahbaz: probablemente sea mejor usar los registros de letras para tal fin, ya que los numerados cambian cada vez que se elimina el texto.
evilsoup
18

Las otras respuestas cubren cómo copiar texto de su búfer en el portapapeles del sistema. Otra operación común es copiar texto de otro registro al portapapeles. Por ejemplo, si ya ha introducido algo de texto en "(el registro predeterminado), es posible que desee cargar ese registro en el portapapeles.

Puedes hacer esto con :let:

  • let @+=@" - copia el registro predeterminado en el portapapeles
  • let @*=@" - copia el registro predeterminado en la selección primaria X11 ("portapapeles del mouse")
  • let @+=@a- copiar desde el registro aal portapapeles
  • etc.

Tenga en cuenta que esto funciona para los registros en general: las let @a=@bcopias se registran bpara registrarse a.

wchargin
fuente
17

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

set clipboard=unnamedplus

Esto cambia el registro Vim predeterminado al +registro, que está vinculado al portapapeles del sistema. De :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')
Quincy Bowers
fuente
¿Por qué esto no funciona para mí cuando tirar y pegar entre instancias vim (cada una en un terminal terminador separado)?
thinwybk
Si está en Linux, y Vim ha sido compilado con la función + X11, y tiene el conjunto de portapapeles = unnamedplus, entonces debería poder tirar de una línea en una instancia de vim y pegarla en otra instancia de vim. También debería poder pegarlo en cualquier otra aplicación con CTRL + V o SHIFT + INSERT. Puede usar :versiondentro de Vim para ver si + X11 aparece en la lista de características incluidas. También puede verificar si la función 'unnamedplus' está disponible con :if has('unnamedplus')⏎ echo 'yes'⏎ endif Si no está en Linux, entonces debería usar unnamed en lugar de unnamedplus.
Quincy Bowers
10

En las compilaciones que lo admiten, el registro nombrado *es el portapapeles del sistema. Para copiar texto de Vim al portapapeles del sistema, puede seleccionar el texto usando el modo visual y luego presionar "*ypara copiarlo al portapapeles del sistema.

Por el contrario, use "*ppara pegar texto del portapapeles del sistema en Vim.

200_success
fuente
5

Le recomiendo que use Gvim y agregue esto a su .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Esto habilita el soporte para CtrlC, CtrlX, CtrlVcomo el bloc de notas de Windows.

Tenga en cuenta que esto también agregará algunos otros accesos directos comunes de Windows, como CtrlSfor :w, CtrlAfor select all, etc.

linrongbin
fuente
0

Si su vim no es compatible +clipboard, puede usar el complemento fakeclip para Linux, Mac, Windows, tmux, pantalla, ...

laktak
fuente
0

Cualquier otra respuesta ha cubierto todas las cosas importantes sobre los registros. Me gustaría agregar una cosa más que uso.

Hay una forma en Vim de copiar directamente el texto seleccionado visualmente en el portapapeles. Simplemente ponga esto en su archivo vimrc :

set guioptions+=a

Y, con esto, cada vez que seleccione visualmente algún texto, se copiará en su portapapeles. Para más información sobre esto,:help guioptions

Por cierto, esto es solo para gVim.

Durga Swaroop
fuente
2
guioptions+=aTambién se menciona en la respuesta de Carpetsmoker.
muru
@muru Sí, lo siento. No vi eso antes. Acabo de verlo.
Durga Swaroop
0

También puede usar un comando global para colocar algún patrón específico en el portapapeles. Puede ser útil en situaciones en las que tiene información dispersa en un archivo y la copia manual es propensa a errores y cansancio.

Primero limpie el registro que recibirá la información

:let @a=""

Luego copie todas las líneas que contienen el patrón

:g/pattern/yank A

Finalmente transferir (copiar) la información al portapapeles del sistema

:let @+=@a

si intenta copiar cada línea que contiene un "patrón" directamente en el portapapeles, no funcionará porque el portapapeles no tiene la capacidad de agregar contenido nuevo, por lo tanto, estamos utilizando aquí un registro vim normal para almacenar todas las líneas que contienen el patrón a la vez y luego ponerlo en el portapapeles.

OBS: es necesario clonar el registro antes de usarlo, y el uso de la versión MAYÚSCULAS del registro nos permite agregar contenido, de lo contrario tampoco funcionará.

SergioAraujo
fuente
0

Si no puede encontrar la manera de llegar +clipboardal trabajo, lo cual no pude por alguna razón, puede hacerlo.

Suponiendo que solo desea copiar una sección del archivo, hago shift+ vpara ir al modo visual y solo resaltar las líneas que quiero copiar. Entonces hago esto.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Explicación

  • '<,'> - significa que usaste el modo visual para seleccionar un rango (no escribes esto)
  • w !{cmd}- escriba el rango al stdin de cmd, vea más en:help w_c
  • wl-copyy xclipson programas a los que puedes canalizar texto y lo agregarán al portapapeles de tu sistema

Además, una vez que esté en su historial, no tiene que volver a escribir todo. Simplemente seleccione con el modo visual, escriba y wluego presione hacia arriba y el comando debería completarse automáticamente. Además, tampoco tiene que usar el modo visual. Puede establecer el rango que desee.

425nesp
fuente