Copiar / pegar selecciones de texto entre tmux y el portapapeles


15

Estoy ejecutando la última versión de tmux (desde el repositorio de git) y xclip (0.12), y me gustaría poder usar los enlaces de teclado tipo Emacs para mover el texto copy-mode, copiar ( M-w) selecciones en el portapapeles, y pegar ( C-y) desde / al búfer de copia en el portapapeles.

Hasta ahora he sido capaz de pegar texto C-yy moverme copy-modecon enlaces de teclado tipo Emacs, pero aún no puedo copiar texto de un búfer tmux (por ejemplo, en copy-mode)

Encontré este hilo para copiar todo el búfer en el portapapeles (y viceversa), pero no parece estar funcionando para mí.

Además, en la tmux-userslista de correo me dijeron que las versiones recientes de tmux (solo en el repositorio de git) proporcionan un comando llamado copy-pipe. La página del manual dice lo siguiente sobre este comando:

Un comando en acepta un argumento, copy-pipe, que copia la selección y la canaliza a un comando. Por ejemplo, lo siguiente enlazará 'C-q' para copiar la selección en / tmp y también en el búfer de pegado:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Parece copy-pipeque debe usarse en parte para canalizar la selección a otro comando. También parece haber algunos errores tipográficos en esta descripción y en el comando (¿qué es temacs-copy?)

De cualquier manera, lo que me gustaría hacer es:

Proceso de copiar:

  1. Ingrese al modo de copia
  2. Mover el texto que desea copiar utilizando los comandos de navegación de Emacs (es decir C-f, C-b, M-f, M-b, C-a, C-eetc, para mover el cursor). No hay prefijo para ninguno de estos.
  3. Copie el texto seleccionado en el portapapeles con: M-w( sin prefijo tampoco)

Pegado:

  1. Me gustaría poder escribir C-y( sin tener que ingresar copy-mode) para pegar texto en el terminal ( sin prefijo tampoco)

He intentado lo siguiente para copiar sin suerte:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Sin embargo, pegar funciona muy bien:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Lo extraño es que sé que la " xclip -i -selection clipboard" parte del comando de copia anterior funciona bien, ya que puedo copiar cosas al portapapeles en la línea de comandos, por ejemplo:

echo "Hello world. How are you?" | xclip -i -selection clipboard

Con todo esto, ¿cómo puedo copiar una selección del modo de copia al portapapeles?

Respuestas:


19

Use lo siguiente tmux.confcon copy-pipeen las nuevas versiones de tmux (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ en modo copia
  2. seleccionar contenido con el mouse (mantener)
  3. M-w copiar esa parte en el portapapeles del sistema
  4. C-ypegarlo dentro de tmux, C-vpegarlo dentro de otra aplicación normal como el navegador web.

Esta respuesta merece más votos a favor, es la mejor para las configuraciones basadas en Linux.
Louis Kottmann

En tmux 2.0 es en run-shelllugar derun
roign

@LouisKottmann: ¿por qué solo basado en Linux?
schaiba

No puedo comentar sobre otros sistemas, pero creo que Mac usa bpaste en lugar de xclip generalmente
Louis Kottmann

En tmux 2.8 tuve que cambiarlos a bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" de acuerdo con este compromiso sugerido por starfry
azzamsa

5

Tenga en cuenta que, con Tmux 2.4 (desde esta confirmación ), la sintaxis de enlace ha cambiado. Parafraseo este comentario de Github para resumir el cambio brevemente:

  1. reemplazar -tcon-T
  2. reemplazar vi-<name>con<name>-mode-vi
  3. prefijo el comando con send-keys -X

Yo tenía:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

que necesitaba cambiar a:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

Desde el registro de cambios :

Las tablas clave han sufrido grandes cambios. Las tablas de teclas de modo ya no están separadas de las tablas de teclas principales. Se han eliminado todas las tablas de teclas de modo, junto con el indicador -t para vincular-clave y desvincular-clave.

Las tablas emacs-edit, vi-edit, emacs-choose y vi-choose han sido reemplazadas por enlaces de teclas fijas en el símbolo del sistema y modos de elección. Las opciones de teclas de modo y de estado permanecen.

Las tablas emacs-copy y vi-copy han sido reemplazadas por las tablas copy-mode y copy-mode-vi. Los comandos se envían utilizando los indicadores -X y -N para enviar claves. Entonces lo siguiente:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Se convierte en:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Estos cambios permiten utilizar el analizador de comandos completo (incluidas las secuencias de comandos) y el conjunto de comandos; por ejemplo, el símbolo del sistema normal con edición e historial ahora se usa para buscar, saltar, etc. en lugar de uno personalizado. El enlace Cr predeterminado es ahora:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

También hay algunos comandos nuevos disponibles con send -X, como copy-pipe-and-cancel.


2

El -temacs-copyno es un error tipográfico. El guión inicial significa que esta es una opción para el bind-keyscomando (junto con un argumento para la opción). Es equivalente a -t emacs-copy, si te gusta más.

El modo de copia utiliza un conjunto diferente de enlaces y comandos 1 que el "modo normal". El copy-pipecomando solo está disponible en las tablas alternativas de enlaces de "modo". Cuando mode-keyses así emacs, el modo de copia utilizará la emacs-copytabla, por lo que debe vincular Mw copy-pipeen esa tabla.

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Tenga cuidado al hacer demasiados enlaces "sin prefijo". Harán que sea difícil escribir esas teclas enlazadas en un programa que se ejecute dentro de tmux (por ejemplo, cuando desee escribir Cy en una instancia en modo tty de Emacs que se ejecute dentro de tmux ). Siempre puede (prefijar) vincular alguna tecla que lo haga send-keys C-y, pero eso podría hacer que sea más engorroso escribir si lo necesita con la suficiente frecuencia.


1 Solo están disponibles los comandos de movimiento y edición. Con la excepción de copy-pipe, estos comandos no toman ningún argumento (esto es lo que la página del manual significa que dice "Un comando en acepta un argumento"; el "en" es probablemente un error tipográfico o un error de edición).


2

Si bien otras respuestas pueden ayudar, así es como hago lo mismo:

  • Shift + selecciona el texto con el cursor.
  • Ctrl + Shift + C para copiar el texto al portapapeles.

Esta es una respuesta justa, pero los problemas comienzan cuando tiene dos o más paneles dispuestos horizontalmente.
cjauvin

Ya veo, avíseme si encuentra algo útil para eso.
Rishabh Agrahari
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.