Copier la sélection dans un presse-papiers dans tmux

24

Si je sélectionne du texte avec une souris dans tmux dans iTerm2 sur macOS, le texte sélectionné est copié dans mon presse-papiers. Je n'ai pas besoin de cliquer sur des boutons supplémentaires - sélectionnez simplement le texte que vous voulez et vous avez terminé.

J'ai testé tmux dans terminal.app sur macOS mais cela ne fonctionne pas là-bas - je dois appuyer sur ypour copier la sélection dans mon presse-papiers.

Je pensais qu'il y avait une liaison de souris (quelque chose comme MouseOnSelectionsimilaire à MouseDown1Pane) mais je n'ai rien trouvé d'utile sur le web et man tmux.

Je me demande s'il existe un moyen d'avoir un comportement similaire sur Ubuntu 16.10 - de préférence dans le terminal Gnome.

Mes fichiers dotm tmux sont disponibles ici (lien) .

Mateusz Piotrowski
la source

Réponses:

46

Tmux 2.4+ avec les liaisons en mode copie vi et 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"

Pour les anciennes versions de tmux, les liaisons en mode copie emacs (par défaut) ou les plates-formes non X (c'est-à-dire sans xclip), voir l'explication ci-dessous.


Explication: Nous devons d'abord activer l'option souris afin que tmux capture la souris et nous permette de lier les événements de souris:

set-option -g mouse on

Gnome-terminal ne prend pas en charge la définition du presse-papiers à l'aide de séquences d'échappement xterm, nous devons donc nous assurer que l' set-clipboardoption est désactivée:

set-option -s set-clipboard off

Cette option peut être prise en charge et activée par défaut sur iTerm2 (voir set-clipboarddans le manuel tmux), ce qui expliquerait le comportement là-bas.

Nous pouvons ensuite lier la MouseDragEnd1Pane"clé" du mode copie , c'est-à-dire, lorsque le premier bouton de la souris est relâché après avoir cliqué et fait glisser dans un volet, à une commande tmux qui prend la sélection actuelle du mode copie (faite par la liaison par défaut pour MouseDrag1Pane) et la redirige à une commande shell. Cette commande tmux était copy-pipeantérieure à tmux 2.4 et a depuis changé en send-keys -X copy-pipe[-and-cancel]. Quant à la commande shell, nous avons simplement besoin de quelque chose qui définira le contenu du presse-papiers du système sur ce qui lui est acheminé; xclip est utilisé pour ce faire dans les commandes suivantes. Certains remplacements équivalents "xclip -selection clipboard -i"ci-dessous sur les plates-formes non X sont "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) et "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 à 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"

Avant tmux 2.2:

La copie après la prise en charge de la souris a été initialement ajoutée dans Tmux 1.3 en définissant la nouvelle mode-mouseoption sur on. Tmux 2.1 a changé la prise en charge de la souris pour les liaisons de touches de souris habituelles, mais n'avait pas de DragEndliaisons, qui ont été introduites dans 2.2. Ainsi, avant la version 2.2, je crois que la seule méthode pour définir le presse-papiers du système sur la souris était par l'utilisation intégrée de séquences d'échappement xterm (l' set-clipboardoption). Cela signifie qu'il est nécessaire de mettre à jour au moins tmux 2.2 pour obtenir le comportement de glisser-copier pour les terminaux qui ne prennent pas en charge set-clipboard, tels que GNOME Terminal.

Josh Brobst
la source
3
Cette réponse de haute qualité est ce qui a finalement fait tout cliquer pour moi .. merci!
cjauvin
2
Pour tous ceux qui essaient de le faire sur un Mac parce qu'ils ont changé la fonctionnalité de leur terminal et la méthode par défaut comme indiqué par l'OP ne fonctionne plus (j'utilise Byobu qui a son propre tampon de copie): remplacer l' xclip...instruction par un simple pbcopydo l'astuce.
Darrel Holt le
Aucune des solutions de ce fil ne fonctionne pour moi.
Yankee
1
Salut Josh, quand j'ai le fichier source ~ / .tmux.conf, il s'est avéré:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi Quelle version de tmux et quel système d'exploitation utilisez-vous? Je crois que vous avez besoin d'au moins tmux 2.2 pour les DragEndclés.
Josh Brobst
8

En tant qu'extension de la réponse acceptée, les gens trouvent souvent que déranger lorsque vous relâchez le bouton de la souris quitte le mode copie (c'est ce qui se passe avec copy-pipe-and-cancel). Voir: https://github.com/tmux/tmux/issues/140 . Par conséquent, dans les nouveaux tmux (j'utilise 2.6), nous pouvons utiliser copy-pipeavec clear selectionpour copier dans la sélection mais ne pas quitter le mode copie:

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

Extension des deux réponses pour copier de msys2 dans le presse-papiers de Windows (et effacer la sélection):

# 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
la source
Bon point. J'utilise le mode copie moi-même (style emacs) et j'ai donc collé ma propre configuration après les tests. J'ai mis à jour la réponse pour inclure les deux comme dans la réponse acceptée.
Shawn Hoover
0

Une autre extension concerne l'utilisation de la Shiftclé.

Maintenez Shifttout en sélectionnant du texte avec la souris. Maintenant, vous obtenez un menu standard avec clic droit (maintenez enfoncé ou appuyez à Shiftnouveau) et vous pouvez utiliser Ctrl+Shift+Cet Ctrl+Shift+Vpour copier et coller. Le texte copié sera également disponible dans le presse-papiers du système .

Testé Ubuntu 18.04.1avec tmux 2.6.

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

Dušan Maďar
la source