tmux xclip copy funktioniert nicht mehr


8

Bei mu Ubuntu 12.04-Setups sind meine Befehle zum Kopieren und Einfügen der tmux-Zwischenablage wie folgt eingerichtet:

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"

Dies funktionierte am längsten bis vor ungefähr einem Monat, als ich vermutete, dass eine Konfigurations- oder Paketänderung vorgenommen wurde, die das oben Genannte gebrochen hat. Im GNOME-Terminal funktioniert das Einfügen mit prefix+ ctrl-vund weiterhin einwandfrei ctrl-shift-v.

Der xclipKopierbefehl funktioniert jedoch nicht mehr, egal was ich tue, und ich habe versucht, die oben genannte benutzerdefinierte Präfixbindung zu entfernen, -selectanstatt sie zu -selverwenden clipboardusw. Dies ist für einen GVim-Benutzer wie mich so ziemlich ein Show-Stopper, da ich es nicht tue. Es gibt nicht einmal die ctrl-shift-cProblemumgehung für das GNOME-Terminal, bei der tmux die Shell übernimmt. Ich gehe in den Kopiermodus, wähle Text mit space+ aus movementund wenn ich prefix+ ausführe ctrl-c, passiert absolut nichts. Bevor dies fehlschlug, zeigte tmux im Benachrichtigungsbereich unten eine Bestätigungsmeldung an.

Hat jemand Vorschläge, wie man dies debuggen könnte? Dies ist ein ziemlich großer Produktivitätsverlust. Ich kann wahrscheinlich den Trick zur vorübergehenden Umgehung von Dateien verwenden , aber es wäre großartig zu wissen, was genau passiert ist xclip.


Ist xclip tatsächlich verfügbar? Was ist die Ausgabe von type xclip?
Chris Down

Die Ausgabe lautet: "xclip ist / usr / bin / xclip". Wie ich bereits erwähnt habe, funktioniert das Einfügen von xclip aus irgendeinem Grund einwandfrei.
Alexandr Kurilin

1
Haben Sie das gleiche Problem mit xsel -b?
Gilles 'SO - hör auf böse zu sein'

@ Gilles, xsel -i -bscheint den Trick zu tun!
Alexandr Kurilin

Heh. Ich habe keine Ahnung warum es funktioniert, dachte ich xsel -bund xclip -selection clipboardwürde das Gleiche tun!
Gilles 'SO - hör auf böse zu sein'

Antworten:


9

Das xselDienstprogramm ähnelt dem xclip, ist jedoch etwas anders implementiert. Normalerweise würde ich erwarten, dass sie sich auf die gleiche Weise verhalten, aber sie führen nicht genau den gleichen X-Bibliotheksaufruf durch, sodass es in einigen Eckfällen möglich ist, xselaber nicht zu funktionieren xclip, oder umgekehrt. Versuchen:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

Das gleiche Ergebnis - funktioniert bei mir nicht - funktioniert als eigenständiger Befehl, gibt jedoch eine leere Zeichenfolge von einer solchen Bindung zurück. Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly Zdanevich

5

Das Hinzufügen -bzum Befehl run-shell(oder run) hat das Problem behoben. Mit -bdem Shell-Befehl wird im Hintergrund ausgeführt.

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


2

Ich kann es zwar nicht mehr reproduzieren, aber hier ist die technische Antwort, was in Ihrem Fall passiert sein könnte.

Zunächst müssen Sie verstehen, wie die X11-Zwischenablage funktioniert. Sie können den Aufsatz von jwz dazu lesen: http://www.jwz.org/doc/x-cut-and-paste.html

Kurz gesagt, die Anwendung, die den Inhalt der Zwischenablage enthält, muss ausgeführt werden, bis eine andere Anwendung den Besitz bestätigt. Wenn Sie also ausführen, wird xclip -i <<< testxclip im Hintergrund ausgeführt, bis Sie eine weitere Auswahl treffen:

$ 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

Nun ist das alles in Ordnung, aber wenn Sie diese Shell verlassen, werden alle zu dieser Sitzung gehörenden Prozesse standardmäßig beendet, indem ihnen ein HUP-Signal gesendet wird. Dies bedeutet, dass xclip beendet wird und Sie nicht mehr auf den Inhalt Ihrer Zwischenablage zugreifen können.

Die vorgeschlagene Problemumgehung (falls Sie kein xsel haben) besteht darin, das HUP-Signal mithilfe der folgenden Bindung zu ignorieren:

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

xselist von diesem Problem nicht betroffen, da das erste, was es nach dem fork () tut, darin besteht, sich vom steuernden Terminal zu trennen, damit es das HUP-Signal nicht empfängt, wenn seine Shell beendet wird (Sie werden es nicht einmal in den obigen ps sehen Ausgabe aber nur, wenn Sie a ps -e | grep xsel) tun .


1

Ich habe ein ähnliches Problem und die temporäre Datei wird in diesem speziellen Fall leider nicht helfen. Dies liegt daran xclip, dass es sich anders zu verhalten scheint, wenn es von tmux erzeugt wird, als wenn es "interaktiv" ausgeführt wird, und darauf wartet, dass eine andere Anwendung den Besitz des Zwischenablagebereichs übernimmt. Versuchen Sie es mit xclip -l 1, um es sofort zu beenden (siehe Manpage für Details).


Kann nicht scheinen, diese Arbeit Arbeit zu bekommen. Sollte diese Bindung so aussehen: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel clipboard"?
Alexandr Kurilin

Könnten Sie vielleicht posten, welche Problemumgehung für Sie funktioniert hat? Das wäre auch ziemlich hilfreich!
Alexandr Kurilin

Ich benutze bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
Peterph

Ja, leider immer noch nichts. Tmux meldet nichts und xclip auch nicht.
Alexandr Kurilin

Für mich meldet es auch nichts, aber es funktioniert. Überprüfen Sie, was xclippassiert, wenn Sie versuchen, den Puffer zu kopieren. Wenn es dort hängen bleibt und auf etwas wartet, hilft es dann, es zu töten? Außerdem müssen Sie den Auswahlmodus verlassen, indem Sie die Eingabetaste drücken (und ihn daher im Puffer speichern), bevor Sie versuchen, den Puffer in die X-Zwischenablage zu kopieren.
Peterph

1

Dies ist eine alte Frage, aber ich vermute, ich habe die Lösung von der Tmux-Seite des Arch-Wikis :

xclip kann auch für diesen Zweck verwendet werden. Im Gegensatz zu xsel funktioniert es besser beim Drucken von Rohbitstreams, die nicht zum aktuellen Gebietsschema passen. Trotzdem ist es ordentlicher, xsel anstelle von xclip zu verwenden, da xclip STDOUT nicht schließt, nachdem es aus dem Puffer von tmux gelesen hat. Daher weiß tmux nicht, dass die Kopieraufgabe abgeschlossen wurde, und wartet weiterhin auf die Beendigung von xclip, wodurch tmux nicht mehr reagiert. Eine Problemumgehung besteht darin, STDOUT von xclip nach / dev / null umzuleiten

Ihr Befehl sollte also werden:

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

0

Dies ist eine funktionierende Konfiguration, die ich verwende:

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.