Copier / coller des sélections de texte entre tmux et le presse-papiers

15

J'utilise la dernière version de tmux (à partir du référentiel git) et xclip (0.12), et je voudrais pouvoir utiliser des liaisons de clavier de type Emacs pour se déplacer dans le texte copy-mode, copier ( M-w) les sélections dans le presse-papiers, et coller ( C-y) de / vers le tampon de copie dans le presse-papiers.

Jusqu'à présent, j'ai pu coller du texte avec C-yet me déplacer copy-modeavec des liaisons de clavier de type Emacs, mais je ne suis toujours pas en mesure de copier du texte à partir d'un tampon tmux (par exemple dans copy-mode)

J'ai trouvé ce fil pour copier la totalité du tampon dans le presse-papiers (et vice versa), mais il ne semble pas fonctionner pour moi.

De plus, dans la tmux-usersliste de diffusion, on m'a dit que les versions récentes de tmux (uniquement dans le dépôt git) fournissent une commande appelée copy-pipe. La page de manuel indique ce qui suit à propos de cette commande:

Une commande dans accepte un argument, copy-pipe, qui copie la sélection et la redirige vers une commande. Par exemple, ce qui suit liera 'C-q' pour copier la sélection dans / tmp ainsi que le tampon de collage:

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

Il semble qu'il copy-pipesoit destiné à être utilisé en partie pour diriger la sélection vers une autre commande. Il semble également y avoir des fautes de frappe dans cette description et dans la commande (qu'est-ce que c'est temacs-copy?)

Quoi qu'il en soit, ce que je voudrais faire, c'est:

Copier:

  1. Entrer en mode copie
  2. Déplacer vers le texte que je veux copier à l' aide des commandes de navigation Emacs (c. -à C-f, C-b, M-f, M-b, C-a, C-eetc. pour déplacer le curseur). Aucun préfixe pour aucun d'entre eux.
  3. Copiez le texte sélectionné dans le presse-papiers avec: M-w( pas de préfixe non plus)

Collage:

  1. J'aimerais pouvoir taper C-y( sans avoir à entrer copy-mode) pour coller du texte dans le terminal ( pas de préfixe non plus)

J'ai essayé ce qui suit pour copier sans chance:

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

Cependant, le collage fonctionne très bien:

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

La chose étrange est que je sais que la xclip -i -selection clipboardpartie " " de la commande de copie ci-dessus fonctionne bien, car je peux copier des choses dans le presse-papiers dans la ligne de commande, par exemple:

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

Avec tout cela, comment puis-je copier une sélection du mode copie dans le presse-papiers?

Amelio Vazquez-Reina
la source

Réponses:

19

Utilisez ce qui suit tmux.confavec copy-pipedans les nouvelles versions 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 mode copie
  2. sélectionner le contenu avec la souris (maintenir)
  3. M-w pour copier cette partie dans le presse-papiers du système
  4. C-yle coller dans tmux, C-vpour le coller dans une autre application régulière comme un navigateur Web.
Josh
la source
Cette réponse mérite plus de votes positifs, c'est la meilleure pour les configurations basées sur Linux.
Louis Kottmann
Dans tmux 2.0 c'est au run-shelllieu derun
roign
@LouisKottmann: pourquoi seulement basé sur Linux?
schaiba
Je ne peux pas commenter d'autres systèmes, mais je crois que mac utilise habituellement bpaste au lieu de xclip
Louis Kottmann
Dans tmux 2.8, je devais les changer 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" selon cet engagement suggéré par starfry
azzamsa
5

Veuillez noter qu'avec Tmux 2.4 (depuis ce commit ), la syntaxe de liaison a changé. Je paraphrase ce commentaire Github pour résumer brièvement le changement:

  1. remplacer -tpar-T
  2. remplacer vi-<name>par<name>-mode-vi
  3. préfixez la commande avec send-keys -X

J'ai eu:

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 je devais changer pour:

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'

Depuis le journal des modifications :

Les tableaux clés ont subi des changements majeurs. Les tables de touches de mode ne sont plus séparées des tables de touches principales. Toutes les tables de clés de mode ont été supprimées, ainsi que l'indicateur -t pour bind-key et unbind-key.

Les tables emacs-edit, vi-edit, emacs-choose et vi-choose ont été remplacées par des liaisons de touches fixes dans l'invite de commande et choisissent les modes. Les options touches de mode et touches d'état restent.

Les tables emacs-copy et vi-copy ont été remplacées par les tables copy-mode et copy-mode-vi. Les commandes sont envoyées en utilisant les drapeaux -X et -N pour envoyer des clés. Donc, ce qui suit:

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

Devient:

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

Ces modifications permettent d'utiliser l'analyseur de commandes complet (y compris les séquences de commandes) et le jeu de commandes - par exemple, l'invite de commande normale avec modification et historique est désormais utilisée pour la recherche, le saut, etc. au lieu d'une invite personnalisée. La liaison Cr par défaut est maintenant:

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

Il existe également de nouvelles commandes disponibles avec send -X, telles que copy-pipe-and-cancel.

étoilé
la source
2

Ce -temacs-copyn'est pas une faute de frappe. Le tiret de tête signifie qu'il s'agit d'une option pour la bind-keyscommande (avec un argument pour l'option). C'est équivalent à -t emacs-copy, si vous préférez ça.

Le mode copie utilise un ensemble de liaisons et de commandes 1 différent du «mode normal». La copy-pipecommande n'est disponible que dans les autres tables de liaisons «mode». Quand mode-keysest emacs, le mode copie utilisera la emacs-copytable, vous devez donc lier Mw à copy-pipedans cette table.

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

Soyez prudent en faisant trop de liaisons «sans préfixe». Ils rendront difficile la saisie de ces clés liées à un programme exécuté à l'intérieur de tmux (par exemple, lorsque vous voulez taper Cy dans une instance en mode tty d' Emacs s'exécutant à l'intérieur de tmux ). Vous pouvez toujours (préfixer) lier une clé qui le fait send-keys C-y, mais cela pourrait rendre la saisie plus difficile si vous en avez besoin assez souvent.


1 Seules les commandes de mouvement et d'édition sont disponibles. À l'exception de copy-pipe, ces commandes ne prennent aucun argument (c'est ce que la page de manuel signifie avec elle "Une commande in accepte un argument"; le "in" est probablement une faute de frappe ou une erreur d'édition).

Chris Johnsen
la source
2

Alors que d'autres réponses peuvent aider, voici comment je fais de même:

  • Maj + sélectionner le texte avec le curseur.
  • Ctrl + Maj + C pour copier le texte dans le presse-papiers.
Rishabh Agrahari
la source
C'est une bonne réponse, mais les problèmes commencent lorsque vous avez deux volets ou plus disposés horizontalement.
cjauvin
Je vois, faites-moi savoir si vous trouvez quelque chose d'utile pour cela.
Rishabh Agrahari