tmux xclip コピーは機能しなくなりました。

tmux xclip コピーは機能しなくなりました。

mu Ubuntu 12.04設定では、マイtmuxクリップボードのコピーと貼り付けコマンドは次のように設定されます。

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"

上記に違反する構成変更やパッケージの変更があったと思われる約1ヶ月前までは、長い間うまくいきました。 GNOME端末では、prefix+ctrl-vと貼り付けを使用しても機能しますctrl-shift-v

しかし、私が何をしても、コピーコマンドはもはや機能しなくなりましたxclip。私のようなGVimユーザーには、シェルを引き継ぐためにtmuxを使用するGNOMEターミナルの解決策もないので、これはほとんど驚くべきことです。コピーモードに入り、+でテキストを選択し、+をしても何も起こりません。それまで、tmuxは下部の通知セクションに確認メッセージを表示します。-select-selclipboardctrl-shift-cspacemovementprefixctrl-c

誰でもこれをデバッグする方法についての提案はありますか?これは生産性にかなりの打撃を与えます。使用することもできます。現在の一時ファイルソリューションしかし、何が起こっているのかを知ることができてうれしいですxclip

答え1

これxselこのユーティリティはと似ていますxclipが、少し異なる方法で実装されています。一般的に、私は彼らが同じ方法で動作したいのですが、まったく同じXライブラリ呼び出しを実行しないので、場合によっては動作しますが、xsel動作しないか、xclipその逆もあります。努力する:

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

答え2

-bto run-shell(または)コマンドを追加するとrun問題が解決しました。シェル-bコマンドはバックグラウンドで実行されます。

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

答え3

これ以上再現することはできませんが、あなたの場合に発生する可能性のある状況に対する技術的な答えは次のとおりです。

まず、X11クリップボードの仕組みを理解する必要があります。 jwzの記事を読んでください:http://www.jwz.org/doc/x-cut-and-paste.html

つまり、クリップボードの内容を保持するアプリケーションは、他のアプリケーションが所有権を主張するまで実行する必要があります。したがって、を実行すると、xclip -i <<< test他の項目が選択されるまでxclipがバックグラウンドで実行されることがわかります。

$ 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

これですべてが正常ですが、このシェルを終了すると、デフォルトでこのセッションに属するすべてのプロセスがHUP信号を送信して終了します。これは、xclipが終了し、クリップボードのコンテンツにアクセスできなくなることを意味します。

したがって、推奨される回避策(xselがない場合)は、次のバインディングを使用してHUP信号を無視することです。

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

xselこの問題の影響を受けません。なぜなら、fork()の後で最初に行うことは、制御端末から自分自身を切り離し、シェルがシャットダウンしたときにHUP信号を受信しないからです(上記のpsでも見えません)。出力されますが)を行う場合にのみ該当しますps -e | grep xsel

答え4

これは古い質問ですが、次のような解決策があると思います。Arch wikiのTmuxページ:

xclipはこの目的にも使用でき、xselとは異なり、現在のロケールに適していない生のビットストリームを印刷するのに最適です。それでも、xclipはtmuxバッファからデータを読み込んだ後にSTDOUTを閉じないので、xclipの代わりにxselを使用する方がきれいです。したがって、tmuxはコピー操作が完了したことを知りませんが、xclipが終了するのを待ち続けるため、tmuxが応答しなくなります。解決策はxclipのSTDOUTを/dev/nullにリダイレクトする

したがって、コマンドは次のようにする必要があります。

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

関連情報