tmux xclipコピーが機能しなくなった


8

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コピーコマンドは何をしても機能しなくなり、上記のカスタムプレフィックスバインディングを削除しようとしました。-select代わりに-selを使用しclipboardたり、使用したりしていません。ctrl-shift-ctmuxがシェルを引き継ぐというGNOME端末の回避策さえあります。私は、コピーモード、と選択したテキストに入りspace+ movement、と私は実行時にprefix+ ctrl-c絶対に何も起こりません。これが破綻する前に、tmuxは下部の通知セクションに確認メッセージを表示していました。

これをどのようにデバッグするかに関する提案はありますか?これはかなり大きな生産性の打撃です。今のところ、一時ファイルの回避策を使うことができるでしょうが、何が起こったのかを知るのは素晴らしいことxclipです。


xclipは実際に利用できますか?の出力はtype xclip何ですか?
クリスダウン

出力は「xclip is / usr / bin / xclip」です。先に述べたように、xclipを使用した貼り付けは、何らかの理由で問題なく機能します。
Alexandr Kurilin 2013年

1
同じ問題がありxsel -bますか?
Gilles「SO-邪悪なことをやめる」

@ギレス、xsel -i -bトリックをするようです!
Alexandr Kurilin 2013年

へえ。私は、私は思った、それが動作する理由は分からないxsel -bxclip -selection clipboard同じことをするだろう!
Gilles 'SO-邪悪なことをやめなさい'

回答:


9

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"

同じ結果-私には機能しません-スタンドアロンコマンドとして機能しますが、そのようなバインドから空の文字列を返します。Ubuntu 14.04、xsel 1.2.0、tmux 1.8-5
Vitaly Zdanevich

6

(または)コマンドに追加する-bと、問題が修正されました。でシェルコマンドバックグラウンドで実行されます。run-shellrun-b

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


2

私はそれをもう再現することはできませんが、あなたのケースで何が起こったのか、技術的な答えがここにあります。

まず、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"

xselfork()の後に最初に行うことは、シェルが終了するときにHUPシグナルを受信しないように制御端末からそれ自体を分離することです(上記のpsでも表示されません)。出力しますが、ps -e | grep xsel)を実行した場合のみです。


1

同様の問題が発生しており、この特定のケースでは一時ファイルは役に立ちません。これはxclip、tmuxによって起動されたときと「対話式」に実行されたときの動作が異なり、別のアプリケーションがクリップボード領域の所有権を取得するまで待機するためです。を使用xclip -l 1して、すぐに終了するようにしてください(詳細については、manページを参照してください)。


その仕事はうまくいかないようです。これはそのバインディングがどのように見えるかです:bind Cc run "tmux save-buffer-| xclip -l 1 -i -sel clipboard"?
Alexandr Kurilin 2013年

あなたはおそらくあなたにどのような回避策がうまくいったかを投稿できますか?それもかなり役に立ちます!
Alexandr Kurilin 2013年

私は使用していbind C-y run-shell "tmux save-buffer - | xclip -l 1 -i"ます。
peterph 2013年

ええ、残念ながらまだ何もありません。Tmuxは何も報告せず、xclipも報告しません。
Alexandr Kurilin 2013年

私にとっては何も報告していませんが、機能します。xclipバッファをコピーしようとしたときに何が行われているかを確認してください。それが何かを待ってそこにぶら下がったままの場合、それを殺すことは助けになりますか?また、バッファをXクリップボードにコピーする前に、Enterキーを押して(したがって、バッファに格納して)選択モードを終了する必要があります。
peterph 2013年

1

これは古い質問ですが、Arch wikiのTmuxページから取得した解決策があると思います

xselとは異なり、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"

0

これは私が使用する動作構成です:

# 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.