web-dev-qa-db-fra.com

Obtenir que tmux copie un tampon dans le presse-papiers

J'essaie de trouver un moyen décent de copier ce que j'ai dans un tampon tmux dans mon presse-papiers. J'ai essayé deux ou trois choses différentes comme

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

ce qui me rapproche assez, tout ce que j'ai à faire est d'appuyer sur control-d après avoir fait le préfixe-p.

J'ai essayé de réparer ça en faisant

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

Mais cela ne fonctionne tout simplement pas. En fait, si j'associe cela à juste

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

cela ne fait rien donc je suppose que split-window n'aime pas << dans une commande Shell.

Des idées?

Modifier: vous pouvez ignorer le select-pane -t 2 si vous voulez, ce n'est pas vraiment important. J'utilise simplement une mise en page spécifique et le volet 2 est celui que je préfère fractionner lorsque je fais autre chose, ce qui va dans mes liaisons impliquant des fractionnements par défaut.

121
Digital Powers

Ici, les documents ont besoin de nouvelles lignes. Par exemple, dans un script Shell, vous pouvez écrire

cat <<EOF >somefile; echo  done
file contents
EOF

Je ne pense pas que tmux vous permette de mettre des nouvelles lignes là-bas, et même si c'était le cas, ce ne serait pas une bonne approche. Que faire si les données elles-mêmes contiennent HERE seules sur une ligne (par exemple, parce que vous copiez votre .tmux.conf)?

Je suggère d'écrire le contenu du tampon dans un fichier temporaire. Non testé:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

Il existe une condition de concurrence si vous utilisez cette commande dans deux instances tmux distinctes. Je ne sais pas comment résoudre ça.

Cela devrait fonctionner:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Une solution plus simple pour Mac OS-X

Cela s'appuie sur la réponse d'Alex et utilise des choses qui n'existaient pas à l'époque.

Si vous utilisez homebrew (et si vous ne l'êtes pas, pourquoi ne l'êtes-vous pas?), Vous pouvez simplement faire ceci:

brew install reattach-to-user-namespace

Ensuite, dans votre ~/.tmux.conf:

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Pour copier le tampon de tmux (vous devriez déjà avoir copié quelque chose à l'aide de tmux) dans la table de montage Mac, utilisez <tmux-key> Control-c. Il sera désormais disponible pour Command-v ou pbpaste

Pour coller quelque chose à partir de la table de montage Mac, utilisez <tmux-key> Control-v.

41
docwhat

La commande copy-pipe A été ajoutée à partir de la version 1.8. Il copie une sélection dans le tampon tmux et la redirige vers une commande. Désormais, il n'est plus nécessaire de fixer un préfixe. Voici un exemple:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Maintenant, lorsque vous avez du texte sélectionné dans copy-modey copiera ce texte dans le tampon tmux ainsi que dans le presse-papiers du système d'exploitation. Cependant, cela n'aide pas si vous voulez obtenir du texte du presse-papiers dans le tampon tmux.

40
Tyler Holien

Vous voudrez peut-être essayer plugin tmux-yank . Il permet de copier directement dans le presse-papiers du système (OS X et Linux) et d'autres goodies comme tirer la ligne Shell actuelle.

16
user80379

Voici une tentative de réponse globale.

D'abord un peu d'histoire

Lorsque cette question a été posée pour la première fois (juin 2011), la copie de texte de Tmux dans le presse-papiers devait être un processus en deux étapes, copiez d'abord le texte sélectionné dans le tampon de Tmux, puis copiez le texte du tampon de Tmux dans le presse-papiers du système.

Dans la version 1.8 (mars 2013), la commande copy-pipe A été ajoutée, ce qui vous permet de copier le texte sélectionné directement dans le presse-papiers du système (ou une autre destination).

Ensuite, en 2.4 (avril 2017), les tableaux de clés ont été considérablement modifiés, rendant la plupart des réponses sur cette page obsolètes.

Répondre à la question d'origine

Linux :

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

Si vous utilisez homebrew alors vous devez installer reattach-to-user-namespace En exécutant la commande suivante dans un terminal:

brew install reattach-to-user-namespace

Puis dans votre ~/.tmux.conf:

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

La méthode plus courte (copiez et collez une sélection directement depuis et vers le presse-papiers pour tmux> 2.4)

Remarque: il existe deux versions pour Linux car Linux a un presse-papiers principal et secondaire (également appelé sélection).

Linux :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

Personnalisation de ces commandes

  • Si vous ne voulez pas que la commande vous indique ce qu'elle a fait dans la ligne d'état, supprimez simplement le display-message (Ainsi que le \; Qui le précède).

  • Si vous utilisez le mode de copie de style Emacs au lieu de vi, remplacez toute instance de copy-mode-vi Par juste copy-mode

  • Si vous utilisez Linux et que vous souhaitez utiliser xsel au lieu de xclip remplacez xclip -r Par xsel -i -p Et xclip -o Par xsel -o -p

  • Le -r Dans xclip -r Est facultatif, il supprime la dernière nouvelle ligne. Il est utile pour copier des commandes, puis lorsque vous les collez, elles ne seront pas immédiatement exécutées.

  • Si vous tunnelez via SSH, vous devriez consulter https://unix.stackexchange.com/a/354581/14252

Références:

10
Jason Axelson

Après avoir essayé une solution différente, voici ma configuration finale:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

l'utilisation de save-buffer au lieu de show-buffer donne les données réelles sans les données comme indiqué avec les sauts de ligne lorsque vous êtes en fractionnement.

Je l'utilise également pour commencer la sélection/copie en mode copie tmux:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Je suppose qu'il pourrait être possible de fusionner la copie-sélection avec la touche "y" ET de la déplacer vers le presse-papiers x.

9
Ownatik

Je n'aime pas avoir à appuyer sur des touches supplémentaires, donc je voulais quelque chose de plus ambitieux. Passez en mode copie avec [ mettez en surbrillance le texte de droite, puis appuyez sur] pour copier le texte dans le presse-papiers.

De plus, tmux aime inclure les retours à la ligne dans les expressions qui se terminent (et étrangement, ces retours à la ligne sont à la place mauvais! Ils ne sont pas là où l'expression est enveloppée à l'écran). Je voulais donc que C-] copie l'expression en supprimant les sauts de ligne.

Sur tmux 1.6, j'ai essayé ceci:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

mais cela n'a pas fonctionné car tmux ne semble pas heureux de lier des choses complexes à la table vi-copy. J'ai donc fini par faire ça à la place:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

Cela conduit à des choses étranges (] ou C-] sera drôle la prochaine fois que vous les utiliserez, mais une seule fois) si vous quittez le mode copie d'une autre manière que] ou C-]. Cela pourrait être corrigé avec quelques liaisons supplémentaires, j'imagine, mais cela fait ce que je veux la plupart du temps.

7
Leif

Une solution pour Mac OS X. Suivez ces 2 étapes:

  1. Utilisez la solution de contournement de Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Ajoutez ce code à votre configuration tmux (~/.tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

C'est ma réponse assez longue qui devrait résoudre deux problèmes majeurs avec l'utilisation de xclip pour copier le tampon à partir d'une session tmux distante (ssh):

1. Xclip qui ne répond pas

Pour moi, @ Grauwolf's réponse avec xclip n'a pas fonctionné (rend le panneau tmux totalement irresponsable). J'ai découvert pourquoi dans la page Tmux du wiki Arch :

xclip pourrait également être utilisé à cette fin, contrairement à xsel, il fonctionne mieux lors de l'impression d'un flux binaire brut qui ne correspond pas aux paramètres régionaux actuels. Néanmoins, il est plus pratique d'utiliser xsel au lieu de xclip, car xclip ne ferme pas STDOUT après avoir lu à partir du tampon de tmux. En tant que tel, tmux ne sait pas que la tâche de copie est terminée et continue d'attendre la fin de xclip, ce qui rend tmux insensible. Une solution de contournement consiste à rediriger STDOUT de xclip vers/dev/null

La liaison devrait donc être:

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

Maintenant, cela fonctionnera si votre session tmux est locale.

2. xclip incapable de se connecter à X

Si vous utilisez tmux sur ssh -X , il y a de grandes chances que cela ne fonctionne pas directement.

C'est parce que la variable Shell $DISPLAY doit être défini correctement.

Solution complète

Donc pour moi, la solution de travail complète est de mettre les lignes suivantes dans mon ~/.tmux.conf:

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

Pour coller à partir du primaire:

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

Je ne comprends pas bien pourquoi $DISPLAY n'est pas correctement défini lors de l'approvisionnement .tmux.conf, c'est pourquoi je dois l'extraire avec tmux show-env et sed.

Si vous avez tmux> = 1.8, vous pouvez adapter cette commande avec copy-pipe:

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

Une variante légèrement modifiée de la réponse acceptée, que j'ai concoctée.

Je préfère également utiliser le presse-papiers du système (Ctrl-C, Ctrl-V) en plus du presse-papiers par défaut de xclip primary (celui que vous obtenez avec la sélection de la souris et les clics moyens de la souris). Pour choisir le presse-papiers du système, vous devez passer -selection clipboard argument à xclip.

De plus, lors de la copie d'un tampon dans un presse-papiers, j'aime pouvoir choisir le tampon que je veux copier. Cela se fait en utilisant choose-buffer puis en passant l'argument en mémoire tampon à save-buffer en utilisant -b %%.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

MISE À JOUR: D'une manière ou d'une autre avec tmux 1.8 et deux de mes installations openSUSE 12.2, je vois un blocage lorsque tmux run-Shell est invoqué avec xclip lisant depuis stdin sur un tube. J'ai plutôt décidé d'essayer xsel et cela semble fonctionner. Ce sont les raccourcis clavier équivalents utilisant xsel. J'ai aussi utilisé && pour enchaîner les commandes en pâte pour plus de robustesse.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

Il existe une solution sur Arch Wiki utilisant xclip:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

Beaucoup de ces réponses n'ont pas fonctionné pour mon Ubuntu 14.04 sur zsh tel quel. Je ne sais pas si mon Shell y est pour quelque chose, mais voici ma version de travail d'utiliser cette stratégie pour la copie, et cette stratégie pour le coller.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

Quelques notes:

  • pour le copy-pipe, je devais spécifier mon presse-papiers avec -sel clip -i. Cette ligne combine le tampon yank to tmux et l'envoie à xclip.
  • pour le coller, je devais spécifier à nouveau quel presse-papiers avec -sel clip -o

Cela fonctionne à merveille maintenant pour ma configuration vim/zsh/tmux.

3
brianclements

J'essaie de trouver un moyen décent de copier ce que j'ai dans un tampon tmux dans mon presse-papiers. J'ai essayé deux ou trois choses différentes comme

Pour les liaisons de style emacs, il existe différentes options. (Le style Vi devrait être similaire?) La liaison typique pour faire une "sélection de copie" dans emacs est M-w, il serait donc très pratique d'avoir la même liaison dans tmux.

1 - serait idéal, mais ne fonctionne pas (en raison de la limitation de tmux?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2 - Compromis qui fonctionne bien pour moi: Acceptez d'utiliser un raccourci clavier différent pour emacs-copy dans tmux. Utilisez par exemple C-M-w. (Cette liaison qui sera définie "globalement" - non seulement en mode copie - mais seulement utile en mode copie)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

Et la version améliorée de la réponse @Leif pourrait être:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

De cette façon, il n'y a pas de conséquences si vous quittez le mode copie d'une autre manière que]], le code ci-dessus est enveloppé dans tundle/tmux-yank un plugin tmux pour copier du texte tmux dans le presse-papiers du système, il cible tmux> = 1.6 sur OS X et Linux.

1
Javier López

Sur OS-X avec tmux version 2.2 ou ultérieure, les éléments suivants fonctionneront:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

J'utilise copyq un gestionnaire de presse-papiers multiligne. (Il fonctionne avec Windows, OSX, Linux.)

  • Ajoutez les lignes suivantes dans ~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin demande copyq.exe emplacement dans ~/.bashrc:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1
Oleg Svechkarenko