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

Comentarios

  • Esto ya se ha preguntado y respondido en SO. Puede encontrar más información diferente allí.
  • He estado usando este complemento en macvim christoomey / vim-system-copy y realmente me encanta. Funciona muy bien con movimientos cpip, cpi{.
  • Lo que realmente necesitas es EasyClip . Hará precisamente eso y mucho más …
  • No puedo agregar una respuesta sino un comentario. Si solo desea copiar un texto, también puede usar sed :). sed -n 5p file; solo quinta línea. sed -n -e 5p -e 8p file; solo 5ª y 6ª líneas. sed -n 5,8p file; líneas entre la 5ª y la 8ª. Imprimirá las líneas en la consola. Puede copiar fácilmente seleccionando texto.

Responder

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

  • PRIMARIO – Esto es copiar al seleccionar y se puede pegar con el botón central del mouse.
  • PORTAPAPELES – Esto se copia (generalmente) con ^C y se pega con ^V (es como MS Windows).

OS X y Los sistemas Windows solo tienen un portapapeles.

Para X11 También hay una serie de herramientas que sincronizan estos portapapeles por usted; por lo tanto, si parecen ser iguales, es posible que tenga una de ellas en ejecución.

Vim tiene dos registros especiales ters correspondientes a estos portapapeles:

  • * usa PRIMARY; mnemónico: S tar es S elect (para copiar en s elect)
  • + usa el CLIP; mnemónico: CTRL PLUS C (para la combinación de teclas común)

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

Puede usar estos registros como cualquier registro. Por ejemplo, usando el portapapeles PRIMARIO * con los comandos y y 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 » automáticamente » interactuar con el sistema «s portapapeles en lugar de consultarlo manualmente todo el tiempo, puede configurar la clipboard variable:

  • Configúrelo en unnamed para usar * (PRIMARY, on select)
  • Configúrelo en unnamedplus para usar + (CLIPBOARD, ^C)

Ahora, con solo usar yy irá al portapapeles del sistema, en lugar del registro sin nombre de Vim, y p pegará el sistema «s portapapeles.

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

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

El clipboard la configuración tiene algunas opciones más (como excluir filtros); pero estos son los básicos. Consulte :help "clipboard" para conocer la historia completa 😉

gVim

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

No +clipboard?

Vim requiere el +clipboard marca de función para que funcione; puede verificar si su Vim tiene esto usando :echo has("clipboard") desde dentro de Vim (si la salida es 0, «s no presente, si «es 1, lo está), o verificando la salida de vim --version para +clipboard.

La mayoría de las distribuciones de Linux se envían con una » mínima » compilación Vim por defecto, que no tiene +clipboard, pero normalmente puede instalarlo:

  • Debian & Ubuntu: Instale vim-gtk3.
  • Fedora: instale vim-X11 y ejecute vimx en lugar de vim ( más información ).
  • Arch Linux: instala gvim (esto habilitará +clipboard para vim normales también).

También puede use xclip, xcopy o xsel para copiar texto al portapapeles; consulte lo siguiente preguntas para encontrar 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 luego puede usar xclip para acceder al portapapeles de su escritorio. El Vim en la máquina a la que «re ssh-ing» todavía necesitará el +clipboard función.

Esto requiere la configuración ForwardX11Trusted y debe solo se puede hacer 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 (por lo que no es necesario que agregue -XY cada 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 se eliminó y se reemplazó con un sistema que llama una utilidad externa como xclip, xsel o pbcopy / pbpaste.

Debería autom recoja estas utilidades y utilícelas. En OS X, pbcopy y pbpaste deberían estar disponibles de forma predeterminada, en Linux probablemente desee instalar xclip, ya que es el más ampliamente disponible (en realidad, hay dos versiones de xsel con indicadores incompatibles . es realmente estúpido).

Consulte también :help clipboard en Neovim.

Comentarios

  • ssh -Y implica -X, por lo que se puede omitir -X.
  • Un efecto secundario muy interesante de aprender esto (unos años hace) para mí ha sido darme cuenta de que " puede seleccionar muchos registros con nombre. "+ no es mágico, es ‘ s simplemente registre +. Por ejemplo, si desea copiar tres cosas al mismo tiempo y pegarlas una por una, puede "1y, "2y y "3y y l ater "1p, "2p y "3p. Esto es realmente poderoso y no existe en casi ningún 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, corregir it, y "qd.
  • 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 de emacs Ctrl-K y Ctrl-Y.
  • @shahbaz – probablemente sea mejor usar los registros de letras para tal propósito, ya que los numerados se cambian cada vez que se elimina el texto.
  • Copiar & pegar como se describe en la pregunta es para escritorio. Es cierto que instalar el paquete gvim junto con vim le brinda funcionalidades de portapapeles. ¡pero en los navegadores de archivos se le ofrecen dos editores de texto para abrir archivos! Y esto se ve feo. Por eso es mejor instalar solo los paquetes vim y vim-gui-common. Posteriormente se proporcionan las funcionalidades del portapapeles sin necesidad de instalar gvim. Esto es en Linux Debian 10.

Respuesta

De 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") 

Comentarios

  • ¿Por qué esto no me funciona cuando yank & pega entre instancias de vim (cada una en una terminal de terminador separada)?
  • Si está en Linux, y Vim se ha compilado con la función + X11, y tiene clipboard = unnamedplus configurado, 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 :version dentro de Vim para ver si + X11 aparece en la lista de funciones incluidas. También puede comprobar si la función ‘ unnamedplus ‘ está disponible con :if has('unnamedplus')⏎ echo 'yes'⏎ endif Si es no en Linux, entonces debería usar unnamed en lugar de unnamedplus.

Respuesta

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 un poco de texto en " (el registro predeterminado), es posible que desee cargar ese registro en el portapapeles.

Puede haz esto con :let:

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

Tenga en cuenta que esto funciona para los registros en general: let @a=@b copias del registro b para registrar a.

Responder

Activado compilaciones que lo admiten, el registro llamado * es el portapapeles del sistema. Para copiar texto de Vim al portapapeles del sistema, puede seleccione el texto usando el modo visual, luego presione "* y para copiarlo al portapapeles del sistema.

A la inversa, use "* p para pegar texto desde el portapapeles del sistema en Vim.

Responder

Si no puede «averiguar cómo hacer que +clipboard funcione, lo cual no pude» por alguna razón, entonces puede hacerlo esto.

Suponiendo que solo desea copiar una sección del archivo, hago shift + v para ir en modo visual y solo resaltar las líneas que quiero copiar. Luego hago esto.

# Linux Wayland :"<,">w !wl-copy # Linux Xorg :"<,">w !xclip -selection clipboard 

Explicación

  • "<,"> – significa usted usó el modo visual para seleccionar un rango (no escribe esto)
  • w !{cmd} – escriba el rango en el stdin de cmd, ver más en :help w_c
  • wl-copy y xclip son programas a los que puede canalizar texto y lo agregarán al portapapeles de su sistema

Además, una vez que esté en su historial, no tendrá que escribir todo de nuevo. Simplemente seleccione con modo visual, escriba w, luego presione hacia arriba y el comando debería autocompletarse. Además, tampoco tiene que usar el modo visual. Puede establecer el rango que desee.

Comentarios

  • Votando esto (sobre la otra respuesta similar) porque esta da una explicación. Por cierto, una nota para mí o para otros lectores: cuando usas xclip, NO tienes que agregar ese parámetro -selection clipboard, que es demasiado largo para escribir. El :'<,'>w !xclip predeterminado copiaría el contenido en el » primario «, es decir, copiar en seleccione el portapapeles, que se puede pegar con el botón central del mouse.

Responder

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

source $VIMRUNTIME/mswin.vim behave mswin 

Esto habilita la compatibilidad con Ctrl C , Ctrl X , Ctrl V como el bloc de notas en Windows.

Tenga en cuenta que esto también agregará algunos otros atajos de Windows comunes, como Ctrl S para :w, Ctrl A para seleccionar todo, etc.

Responder

Estaba luchando con el portapapeles del sistema y vim dentro de tmux.

Se resolvió usando xsel o xclip, como en este ejemplo:

1.) visu Seleccione un bloque de texto en modo normal: V<motionkey>

2.a) con xsel ejecute ex: :"<,">w !xsel -b

2.b) con xclip ejecutar ex: :"<,">w !xclip -selection clipboard

3.) pegar en otro programa

… y ahora nmap esto como preferido.

Estas opciones (-b o -selection clipboard) básicamente significan que el programa (xsel o xclip) se envía al fondo y espera a que otro programa pegue el contenido para que pueda «interferir».

(en manjaro con i3, xfce4-terminal, tmux)

Respuesta

Este es el comportamiento Quería cuando se trataba del portapapeles del sistema:

  • Tirar de una línea con nueva línea funciona
  • Tirar de una línea sin nueva línea funciona
  • Tirar de lo que sea visualmente obras seleccionadas
  • Cortar obras
  • Cortar una línea con obras de nueva línea
  • Cortar una línea sin obras de nueva línea

Por obras Quiero decir: todavía puedo usar p para pegar mientras estoy en vim y también puedo usar el portapapeles del sistema. Básicamente, quiero que copiar y pegar funcione como se esperaba y no lo hice » No quiero saturar el portapapeles de mi sistema más de lo necesario.

Mi técnica fue mapear los comandos comunes de tirar, cortar y borrar para usar el portapapeles del sistema agregando estas líneas a mi ~/.vimrc:

" use system clipboard " https://anuragpeshne.github.io/essays/vim/7.html noremap y "*y noremap yy "*yy noremap Y "*y$ noremap x "*x noremap dd "*dd noremap D "*D 

La información clave de https://anuragpeshne.github.io/essays/vim/7.html la entrada del blog es:

El mapeo recursivo es malo. Utilice siempre el mapeo no recursivo. (noremap)

Comentarios

  • ¿Qué significa " hacer? La primera respuesta ya explicaba para qué es * (en referencia al portapapeles principal), pero no ‘ veo ninguna explicación en ninguna parte para para qué es " y por qué hace que el comando funcione.
  • No es ‘ inmediatamente obvio porque ‘ probablemente esté acostumbrado a que la cita se use para rodear palabras, como "foo"; sin embargo, para vim "* es en realidad el nombre del » registro » (un vim concepto) que se conecta al portapapeles del sistema. Si abre vim y escribe :registers, puede ver los nombres de otros registros como: "", "0, "1, etc. Encontré este artículo útil para aprender sobre registros: brianstorti.com/vim-registers

Responder

Si su vim no es compatible con +clipboard, puede usar el fakeclip complemento para Linux, Mac, Windows, tmux, screen, …

Respuesta

Todas las demás respuestas han 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 seleccionado visualmente texto en el portapapeles. Simplemente coloque esto en su archivo vimrc :

set guioptions+=a 

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

Por cierto, esto es solo para gVim.

Comentarios

  • guioptions+=a también se menciona en la respuesta de Carpetsmoker ‘.
  • @muru Sí, lo siento . No ‘ vi eso antes. Lo acabo de ver.

Respuesta

También puede usar un comando global para poner un patrón específico en el portapapeles. Puede ser útil en situaciones en las que tiene información dispersa en un archivo y el manejo manual es propenso a errores y cansado.

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 transfiriendo (copiando) la información al portapapeles del sistema

:let @+=@a 

si intenta copiar todas las líneas que contienen un «patrón» directamente al portapapeles, no funcionará porque el portapapeles no tiene la capacidad de agregar nuevas contenido, por lo que aquí estamos usando 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 clicar el registro antes de usarlo, y el el uso de la versión en MAYÚSCULAS del registro nos permite agregar contenido, de lo contrario tampoco funcionará.

Respuesta

MacVim Cmd + x/c/v para cortar / copiar / pegar

Si usa MacVim, los Cmd+x/c/v habituales se definen en $ VIMRUNTIME / macmap.vim que se obtiene de forma predeterminada y, por lo tanto, están disponibles sin configuración:

vnoremap <special> <D-x> "+x vnoremap <special> <D-c> "+y cnoremap <special> <D-c> <C-Y> nnoremap <special> <D-v> "+gP cnoremap <special> <D-v> <C-R>+ execute "vnoremap <script> <special> <D-v>" paste#paste_cmd["v"] execute "inoremap <script> <special> <D-v>" paste#paste_cmd["i"] 

Sin embargo, usarlos puede llevar a un usuario de vim que no conoce el vim y se pierden en una computadora / entorno ajeno.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *