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.
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"
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
.
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-mode
, y 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.
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.
Voici une tentative de réponse globale.
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.
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"
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"
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:
> /dev/null
, La copie du tampon tmux dans le presse-papiers empêchera tmux de répondre aux raccourcisAprè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.
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.
Une solution pour Mac OS X. Suivez ces 2 étapes:
Utilisez la solution de contournement de Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
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'"
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):
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.
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.
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'
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"
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"
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:
-sel clip -i
. Cette ligne combine le tampon yank to tmux et l'envoie à xclip.-sel clip -o
Cela fonctionne à merveille maintenant pour ma configuration vim/zsh/tmux.
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"
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.
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"
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"