Copiar selección a un portapapeles en tmux

24

Si selecciono texto con un mouse en tmux en iTerm2 en macOS, obtengo el texto seleccionado copiado en mi portapapeles. No tengo que hacer clic en ningún botón adicional, solo seleccione el texto que desee y listo.

He probado tmux en terminal.app en macOS pero no funciona allí, tengo que presionar ypara copiar la selección en mi portapapeles.

Pensé que hay un enlace del mouse (algo MouseOnSelectionsimilar a MouseDown1Pane) pero no pude encontrar nada útil en la web y man tmux.

Me pregunto si hay una manera de tener un comportamiento similar en Ubuntu 16.10, preferiblemente en el terminal Gnome.

Mis tmux dotfiles están disponibles aquí (enlace) .

Mateusz Piotrowski
fuente

Respuestas:

46

Tmux 2.4+ con enlaces de modo de copia vi y xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

Para versiones anteriores de tmux, enlaces de modo de copia emacs (el valor predeterminado) o plataformas que no son X (es decir, sin xclip), consulte la explicación a continuación.


Explicación: Primero debemos habilitar la opción del mouse para que tmux capture el mouse y nos permita vincular los eventos del mouse:

set-option -g mouse on

Gnome-terminal no admite la configuración del portapapeles utilizando secuencias de escape xterm, por lo que debemos asegurarnos de que la set-clipboardopción esté desactivada:

set-option -s set-clipboard off

Esta opción podría ser compatible y habilitada de forma predeterminada en iTerm2 (consulte set-clipboardel manual de tmux), lo que explicaría el comportamiento allí.

Luego podemos vincular la MouseDragEnd1Pane"clave" del modo de copia , es decir, cuando se suelta el primer botón del mouse después de hacer clic y arrastrar en un panel, a un comando tmux que toma la selección del modo de copia actual (realizada por el enlace predeterminado para MouseDrag1Pane) y la canaliza a un comando de shell. Este comando tmux era copy-pipeanterior a tmux 2.4 y desde entonces ha cambiado a send-keys -X copy-pipe[-and-cancel]. En cuanto al comando de shell, simplemente necesitamos algo que establezca el contenido del portapapeles del sistema a lo que se canaliza a él; xclip se usa para hacer esto en los siguientes comandos. Algunos reemplazos equivalentes para las "xclip -selection clipboard -i"siguientes en plataformas que no son X son "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) y "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2 a 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

Antes de tmux 2.2:

Copiar después de que el soporte de arrastre del mouse se agregó originalmente en Tmux 1.3 al configurar la nueva mode-mouseopción en on. Tmux 2.1 cambió el soporte del mouse a los enlaces de teclas familiares del mouse, pero no tenía DragEndenlaces, que se introdujeron en 2.2. Por lo tanto, antes de 2.2, creo que el único método para configurar el portapapeles del sistema al arrastrar el mouse fue a través del uso incorporado de secuencias de escape xterm (la set-clipboardopción). Esto significa que es necesario actualizar al menos a tmux 2.2 para obtener el comportamiento de arrastrar y copiar para terminales que no son compatibles set-clipboard, como el Terminal GNOME.

Josh Brobst
fuente
3
Esta respuesta de alta calidad es lo que finalmente hizo que todo fuera clic para mí ... ¡gracias!
cjauvin
2
Para cualquiera que trate de hacer esto en un Mac, ya que han cambiado su funcionalidad terminal y el método por defecto según lo declarado por el PO ya no funciona (estoy usando Byobu que tiene su propio búfer de copia): la sustitución de la xclip...declaración con un simple pbcopyhace el truco.
Darrel Holt
Ninguna de las soluciones en este hilo funciona para mí.
Yankee
1
Hola Josh, cuando hice el archivo fuente ~ / .tmux.conf, resultó:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi ¿Qué versión de tmux y sistema operativo está utilizando? Creo que necesita al menos tmux 2.2 para las DragEndclaves.
Josh Brobst
8

Como una extensión de la respuesta aceptada, las personas a menudo encuentran que molesto al soltar el botón del mouse sale del modo de copia (esto es lo que sucede con copy-pipe-and-cancel). Ver: https://github.com/tmux/tmux/issues/140 . Por lo tanto, en tmux más nuevo (uso 2.6) podemos usar copy-pipejunto con clear selectionpara copiar a la selección pero no salir del modo de copia:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Gabor Marton
fuente
2

Extender ambas respuestas para copiar desde msys2 al portapapeles de Windows (y borrar la selección):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
Shawn Hoover
fuente
Buen punto. Yo mismo uso el modo de copia (estilo emacs) y así pegué mi propia configuración después de la prueba. He actualizado la respuesta para incluir tanto como en la respuesta aceptada.
Shawn Hoover
0

Otra extensión es sobre el uso de la Shiftclave.

Sostenga Shiftmientras selecciona texto con el mouse. Ahora obtienes un menú estándar de clic derecho (mantén presionado o presiona Shiftnuevamente) y puedes usar Ctrl+Shift+Cy Ctrl+Shift+Vpara copiar y pegar. El texto copiado también estará disponible en el portapapeles del sistema .

Probado Ubuntu 18.04.1con tmux 2.6.

Fuente: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

Dušan Maďar
fuente