tmux xclip copy ne fonctionne plus

8

Sur les configurations mu Ubuntu 12.04, mes commandes de copie et de collage du presse-papiers tmux sont configurées comme suit:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Cela a très bien fonctionné pendant la plus longue période jusqu'à il y a environ un mois, lorsque je soupçonne qu'un changement de configuration ou un changement de package a été fait qui a cassé ce qui précède. Dans le terminal GNOME, le collage fonctionne toujours correctement avec prefix+ ctrl-vet ctrl-shift-v.

Cependant, la xclipcommande de copie ne fonctionne plus, peu importe ce que je fais, et j'ai essayé de supprimer la liaison de préfixe personnalisé ci-dessus, en utilisant -selectau lieu de -sel, pas en utilisant clipboardetc. t même avoir la solution de contournement du terminal GNOME ctrl-shift-cavec tmux prenant en charge le shell. Je passe en mode copie, sélectionne le texte avec space+ movement, et quand j'exécute prefix+ ctrl-cabsolument rien ne se passe. Avant cette rupture, tmux afficherait un message de confirmation dans la section de notification en bas.

Quelqu'un at-il des suggestions quant à la façon de déboguer cela? C'est un très gros coup de productivité. Je peux probablement utiliser l' astuce de contournement des fichiers temporaires pour l'instant , mais ce serait génial de savoir exactement ce qui est arrivé xclip.

Alexandr Kurilin
la source
Xclip est-il réellement disponible? Quelle est la sortie de type xclip?
Chris Down
Le résultat est: "xclip est / usr / bin / xclip". Comme je l'ai mentionné, le collage via xclip fonctionne très bien pour une raison quelconque.
Alexandr Kurilin
1
Avez-vous le même problème xsel -b?
Gilles 'SO- arrête d'être méchant'
@ Gilles, xsel -i -bsemble faire l'affaire!
Alexandr Kurilin
Il h. Je ne sais pas pourquoi ça marche, je pensais xsel -bet xclip -selection clipboardferais la même chose!
Gilles 'SO- arrête d'être méchant'

Réponses:

9

L' xselutilitaire est similaire à xclip, mais implémenté un peu différemment. Normalement, je m'attendrais à ce qu'ils se comportent de la même manière, mais ils ne font pas exactement le même appel à la bibliothèque X, il est donc possible que dans certains cas, xselcela fonctionne mais pas xclip, ou vice versa. Essayer:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"
Gilles 'SO- arrête d'être méchant'
la source
Le même résultat - ne fonctionne pas pour moi - fonctionne comme une commande autonome mais renvoie une chaîne vide à partir d'une telle liaison; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly
6

L'ajout -bde la commande run-shell(ou run) a résolu le problème. Avec -bla commande shell est exécutée en arrière-plan.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"

Pawka
la source
2

Bien que je ne puisse plus le reproduire, voici la réponse technique de ce qui aurait pu arriver dans votre cas.

Tout d'abord, vous devez comprendre le fonctionnement du presse-papiers X11. Vous pouvez lire l'essai de jwz à ce sujet: http://www.jwz.org/doc/x-cut-and-paste.html

En bref, l'application qui contient le contenu du presse-papiers doit s'exécuter jusqu'à ce qu'une autre application en revendique la propriété. Ainsi, lorsque vous exécutez, xclip -i <<< testvous pouvez voir xclip s'exécuter en arrière-plan jusqu'à ce que vous fassiez une autre sélection:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Maintenant, tout va bien, mais lorsque vous quittez ce shell, tous les processus appartenant à cette session sont tués par défaut en leur envoyant un signal HUP. Cela signifie que xclip sera tué et que vous ne pourrez plus accéder au contenu de votre presse-papiers.

Donc, la solution de contournement suggérée (au cas où vous n'avez pas xsel) est d'ignorer le signal HUP en utilisant la liaison suivante:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xseln'est pas affecté par ce problème car la première chose qu'il fait après le fork () est de se dissocier du terminal de contrôle afin qu'il ne reçoive pas le signal HUP lorsque son shell se termine (vous ne le verrez même pas dans le ps ci-dessus) sortie mais uniquement lorsque vous faites a ps -e | grep xsel).

ypsu
la source
1

Je rencontre un problème similaire et le fichier temporaire n'aidera pas dans ce cas particulier, je le crains. En effet, il xclipsemble se comporter différemment lorsqu'il est généré par tmux que lorsqu'il est exécuté "interactivement" et attend qu'une autre application s'approprie la zone du presse-papiers. Essayez d'utiliser xclip -l 1pour le faire quitter immédiatement (voir la page de manuel pour plus de détails).

peterph
la source
Je n'arrive pas à obtenir ce travail. Est-ce à cela que devrait ressembler cette liaison: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel clipboard"?
Alexandr Kurilin,
Pourriez-vous peut-être publier quelle solution de contournement a fonctionné pour vous? Ce serait également très utile!
Alexandr Kurilin
J'utilise bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
peterph
Ouais, toujours rien malheureusement. Tmux ne rapporte rien, pas plus que xclip.
Alexandr Kurilin
Pour moi, ça ne rapporte rien non plus, mais ça marche. Vérifiez ce qui xclipse passe lorsque vous essayez de copier le tampon. S'il reste accroché là en attendant quelque chose, est-ce que le tuer aide En outre, vous devez quitter le mode de sélection en appuyant sur Entrée (et donc en le stockant dans le tampon) avant d'essayer de copier le tampon dans le presse-papiers X.
peterph
1

C'est une vieille question, mais je pense avoir la solution, tirée de la page Tmux du wiki Arch :

xclip pourrait également être utilisé à cette fin, contrairement à xsel, il fonctionne mieux pour imprimer 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

Votre commande devrait donc devenir:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"
PlasmaBinturong
la source
0

Ceci est une configuration de travail que j'utilise:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
Mateusz Piotrowski
la source