web-dev-qa-db-fra.com

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

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 - je dois appuyer sur y pour copier la sélection dans mon presse-papiers.

Je pensais qu'il y avait une liaison de souris (quelque chose comme MouseOnSelection similaire à 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) .

26

Tmux 2.4+ avec les liaisons du mode de 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 de mode de copie emacs (par défaut) ou les plates-formes non X (c'est-à-dire sans xclip), voir l'explication ci-dessous.


Explication: Tout d'abord, nous devons activer l'option souris pour que tmux capture la souris et permette de lier les événements de la 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 le set-clipboard l'option 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-clipboard dans le manuel tmux), ce qui expliquerait le comportement là-bas.

On peut alors lier le mode copie MouseDragEnd1Pane "clé", c'est-à-dire lorsque le premier bouton de la souris est relâché après avoir cliqué et glissé dans un volet, vers une commande tmux qui prend la sélection de mode de copie actuelle (effectuée par la liaison par défaut pour MouseDrag1Pane) et le redirige vers une commande Shell. Cette commande tmux était copy-pipe avant 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. Quelques remplacements équivalents pour "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 le nouveau mode-mouse option pour 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 liaisons DragEnd, qui ont été introduites dans la version 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 (le set-clipboard option). 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, comme GNOME Terminal.

48
Josh Brobst

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/14 . Par conséquent, dans les nouveaux tmux (j'utilise 2.6), nous pouvons utiliser copy-pipe ensemble avec clear selection pour copier dans la sélection mais ne quittez pas le mode copie:

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

Une autre extension concerne l'utilisation de la clé Shift.

Maintenez Shift tout en sélectionnant du texte avec la souris. Vous obtenez maintenant un menu contextuel standard (maintenez la pression ou appuyez à nouveau sur Shift) et vous pouvez utiliser Ctrl+Shift+C et Ctrl+Shift+V pour copier et coller. Le texte copié sera également disponible dans le presse-papiers du système .

Testé sur Ubuntu 18.04.1 avec tmux 2.6.

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

2
Dušan Maďar

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
2
Shawn Hoover