Copie texto de un panel tmux a otro (usando vim)

133

Tengo dos archivos abiertos en vim, cada uno en un panel tmux. Me gustaría copiar, digamos 10 líneas de un archivo a otro.

¿Cómo puedo lograr esto sin usar el mouse Copy-> Paste?

Patryk
fuente
2
Podría involucrar a tmux , pero generalmente hay formas más simples. ¿Ambas instancias de Vim están en la misma máquina (local)? Por lo general, solo usaría un archivo temporal para eso (es decir, seleccionar visualmente las líneas :w /tmp/lines, luego :r /tmp/linesen la otra instancia). O, si su Vim sabe cómo hablar con el portapapeles de su sistema, puede usar los registros +o *para evitar el archivo temporal.
Chris Johnsen

Respuestas:

194

Tendrás que usar atajos de tmux. Asumiendo que su atajo de comando tmux es el predeterminado: Ctrl+ b, entonces:

  1. Ctrl+ b, [Ingrese al modo de copia (?).

  2. Mover al inicio / final del texto para resaltar.

  3. Ctrlspace

    Comience a resaltar texto (en Arch Linux). Cuando he compilado tmux desde la fuente en OSX y otros Linux, Spacepor lo general solo funciona. El texto seleccionado cambia los colores, por lo que sabrá si el comando funcionó.

  4. Mover al extremo opuesto del texto para copiar.

  5. Alt+ wCopia el texto seleccionado en el portapapeles tmux. (En Mac use Esc+ w.)

  6. Mueva el cursor al panel tmux opuesto, o una ventana tmux completamente diferente. Coloque el cursor donde desea pegar el texto que acaba de copiar.

  7. Ctrl+ b, ]Pegar el texto copiado del portapapeles tmux.

tmux es bastante bueno para asignar comandos a atajos de teclado personalizados.

Vea Ctrl+ b, ?para la lista completa de atajos de teclado establecidos.

Alex Leach
fuente
44
Gracias. Solo un nodo secundario: Alt + w no funcionaba en Mac. Alt se asignó a Esc de forma predeterminada. Por lo tanto, es Esc + w.
Karan
11
si usa screenaccesos directos: Ctrl + A [(ingrese al modo de copia), Space(comience a resaltar), Enter(termine de resaltar), Ctrl + A ](pegue).
jfs
11
Vale la pena señalar que "enter" funciona para mí, mientras que alt + w no.
Elijah Lynn
3
Como se señaló en awhan.wordpress.com/2010/06/20/copy-paste-in-tmux , si tiene enlaces de teclas vi, el paso 5 debe reemplazarse con la Entertecla.
Ying Xiong
3
¿Qué sucede si necesito copiar y pegar en un editor de texto? Por alguna razón, no parece recoger ese texto seleccionado incluso después de presionar 'enter' después de seleccionar el texto.
uday
34

Desafortunadamente, todavía no puedo agregar un comentario a la respuesta de Alex Leach, así que voy a incluir un apéndice aquí para los usuarios de Mac OS X:

  1. Enter Copia el texto seleccionado
Mieczysław Daniel Dyba
fuente
1
¡Gracias! Estoy en Ubuntu Xenial, usando byobu/ tmuxcon todas las configuraciones predeterminadas, esto funcionó, Alt + w no.
Andrea Zonca
1
Esto no funciona en OS X Yosemite con tmux 2.0, ni alt + w, ni esc + w :(
weberc2
También funciona para mí en Windows usando un terminal Zoc.
jdhao
15

Si está utilizando vim y tmux en macOS (Probado en macOS 10.12.2, tmux 2.3):

(Suponga que la combinación de teclas de prefijo de tmux es prefix. El prefijo es ctrl+ ben los valores predeterminados).

  • Copiar:
    1. Presione prefix+ [para ingresar al modo de copia.
    2. Use las teclas de flecha para ir al inicio / final de la selección de texto.
    3. Presione ctrl+ space(si ha establecido ctrl+ spacecomo prefijo, presione ctrl+ space+ en su spacelugar)
    4. Use las teclas de flecha para moverse al otro lado de la selección.
    5. Presione ctrl+ w.
  • Pegar:
    1. Presione prefix+ ]en modo de inserción.
Hamid Rohani
fuente
9

Me estoy conectando a mi servidor CentOS en una máquina Windows usando el cliente ssh de terminal ZOC . Esto es lo que funciona para mí:

  • Ingrese al modo de copia: <prefix>+[
  • Iniciar copia: <Space>
  • Copiar texto: <Enter>
  • Pegar texto: <prefix>+]
jdhao
fuente
2

Puede utilizar el portapapeles del sistema con "* y" y "p" en lugar de los y y p normales.

Johan
fuente
1
Para usar el portapapeles del sistema, debe usar "+2yy: copie dos líneas en el portapapeles X11 "+dd- corte la línea en el portapapeles X11 "+p- pegue el portapapeles X11
Patryk el
¿Necesito escribir algo antes de usar estos comandos?
Thomas Ahle
@ThomasAhle, no ... son literalmente las comillas dobles ("), seguidas de más (+) seguidas de 2ys (y). Asegúrese de estar en modo normal. Si está en modo normal, debería poder usar h,j,k,lpara mover. También he visto a veces en mi ubuntu VM, el registro "+" desaparece, por razones desconocidas. Para verificar que tiene el +registro, puede escribir :regy verificar si hay una cadena "+en la primera columna.
alpha_989
Sí, esto es, esta es la respuesta. Mucho más simple que las otras sugeridas (usando tmux copy / paste) y esto no ensucia los números de línea. ¿Causaría algún problema si reasigna el estándar yy phacia "+yy "+p?
Ryan
1

Si tiene vimabierto, es mejor usar el vim copy pegar para copiar texto.

Tmux copy paste funcionará, sin embargo, existen varias desventajas.

Primero, cuando copie varias líneas de texto, deberá seleccionar varias líneas. Tmux copy paste generalmente no entiende que vimtiene números de línea o hay marcas en el canal vim (como números relativos / números absolutos). Como resultado, los copiará también.

En segundo lugar, descubrí que si el texto tiene un formato específico de idioma específico, e intenta copiar y pegar directamente usando tmux a vim, arruinará el formato. Esto se puede evitar mediante el uso set paste!. Sin embargo, esto requiere mucho más trabajo.

Use "+ypara copiar y "+ppegar

Vimproporciona de forma nativa un método para copiar y pegar entre el búfer vim y el portapapeles del sistema, usando "+yo "*y. Luego pegar usando "+po "*p. Esto evitará copiar los números relativos en la canaleta u otras marcas aleatorias que no son relevantes para vim

alpha_989
fuente
0

Un par de opciones para el uso de vim, ya que la secuencia de acceso directo de tmux es un poco larga y me resulta difícil recordar

Al igual que las respuestas anteriores, puedes usar "+yy "*ypara copiar y luego "+py "*prespectivamente para pegar. Si desea que vim use el portapapeles de forma predeterminada, puede usarlo y/pdirectamente.

set clipboard=unamed "sets the default copy register to be *
set clipboard=unamedplus "sets the default copy register to be +

fuente para el comando del portapapeles: https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim

Avi Areman
fuente