tmuxとクリップボードの間でテキスト選択をコピー/貼り付け


15

最新バージョンのtmux(gitリポジトリから)とxclip(0.12)を実行しています。Emacsのようなキーボードバインドを使用して、テキストの周りを移動したり、選択範囲をクリップボードにcopy-modeコピーしM-wたり、C-yコピーバッファからクリップボードへ/に貼り付けます()。

これまでのところ私はでテキストを貼り付けることができたC-y、とに動き回るcopy-modeEmacsライクなキーボードバインディングで、しかし私はまだテキストをコピーすることができません(例でtmuxのバッファからcopy-mode

バッファー全体をクリップボードにコピーするためのスレッド(およびその逆)を見つけましたが私には機能していないようです。

また、tmux-usersメーリングリストで、最近のバージョンのtmux(gitリポジトリのみ)がというコマンドを提供していると言われましたcopy-pipe。マニュアルページには、このコマンドについて次のように記載されています。

の1つのコマンドは、引数copy-pipeを受け入れます。この引数は、選択範囲をコピーしてコマンドにパイプします。たとえば、次のコマンドは 'C-q'をバインドして、選択内容を/ tmpおよびペーストバッファにコピーします。

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

copy-pipe選択を別のコマンドにパイプするために部分的に使用することを意図しているようです。また、この説明とコマンドにはいくつかのタイプミスがあるようです(何temacs-copyですか?)

いずれにしても、私がやりたいことは:

コピー中:

  1. コピーモードに入る
  2. (つまり、私はEmacsのナビゲーションコマンドを使用してコピーしたいテキストに移動しC-fC-bM-fM-bC-aC-eカーソルを移動するなど)。これらのいずれにもプレフィックスありません
  3. でクリップボードに選択したテキストをコピーしますM-w接頭辞なしのいずれか)

貼り付け:

  1. 私は入力できるようにしたいと思いますC-yせずに入力することcopy-mode(端末内のテキストを貼り付けるために)接頭辞なしのいずれか)

私は運のないコピーのために以下を試しました:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

ただし、貼り付けはうまく機能します。

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

奇妙なことは、コマンドラインでクリップボードにコピーできるxclip -i -selection clipboardため、上記のコピーコマンドの「」部分が適切に機能することを知っていることです。たとえば:

echo "Hello world. How are you?" | xclip -i -selection clipboard

これで、選択をコピーモードからクリップボードにコピーするにどうすればよいですか?

回答:


19

tmux(1.8+)の新しいバージョンでは、次tmux.confを使用します copy-pipe

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ コピーモードへ
  2. マウスでコンテンツを選択(ホールド)
  3. M-w その部分をシステムのクリップボードにコピーします
  4. C-ytmux内C-vに貼り付けて、Webブラウザなどの他の通常のアプリケーション内に貼り付けます。

この答えは、より多くの賛成に値します。Linuxベースのセットアップに最適です。
ルイコットマン14年

tmuxは2.0で、それはだrun-shellの代わりにrun
roign

@LouisKottmann:なぜLinuxベースですか?
スカイバ

私は、他のシステムにコメントすることはできませんが、私は、Macの用途は通常XCLIPの代わりにbpaste信じる
ルイ・コットマン

tmux 2.8では、それらをに変更する必要がありました bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c "bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" よると、このコミットによって提案starfry
azzamsa

5

Tmux 2.4では(このコミット以降)、バインディング構文が変更されていることに注意してください。このGithubのコメントを言い換え、変更を簡単に要約します。

  1. 置き換える-t-T
  2. 置き換えるvi-<name><name>-mode-vi
  3. コマンドの前に send-keys -X

私が持っていた:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

に変更する必要がありました:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

変更ログから:

キーテーブルは大幅に変更されました。モードキーテーブルは、メインキーテーブルから分離されなくなりました。bind-keyおよびunbind-keyの-tフラグとともに、すべてのモードキーテーブルが削除されました。

emacs-edit、vi-edit、emacs-choose、およびvi-chooseテーブルは、コマンドプロンプトおよびモードの選択で固定キーバインドに置き換えられました。モードキーとステータスキーのオプションは残ります。

emacs-copyおよびvi-copyテーブルは、copy-modeおよびcopy-mode-viテーブルに置き換えられました。コマンドは、-Xおよび-Nフラグを使用して送信キーに送信されます。したがって、次のとおりです。

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

になる:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

これらの変更により、完全なコマンドパーサー(コマンドシーケンスを含む)とコマンドセットを使用できるようになりました。たとえば、カスタムの代わりに、編集や履歴のある通常のコマンドプロンプトが検索、ジャンプなどに使用されるようになりました。デフォルトのCrバインディングは次のとおりです。

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

copy-pipe-and-cancelなど、send -Xで使用できる新しいコマンドもいくつかあります。


2

これ-temacs-copyはタイプミスではありません。先頭のダッシュは、これがbind-keysコマンドのオプションであることを意味します(オプションの引数とともに)。-t emacs-copyあなたがそれを好むなら、それはと同等です。

コピーモードでは、「通常モード」とは異なるバインディングとコマンド1のセットが使用されます。このcopy-pipeコマンドは、代替の「モード」バインディングテーブルでのみ使用できます。mode-keysisの場合emacs、コピーモードではemacs-copyテーブルが使用されるため、そのテーブルでMwをバインドする必要がありcopy-pipeます。

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

「プレフィックスなし」バインディングの作成が多すぎることに注意してください。これらは、tmux内で実行されているプログラムにこれらのバインドされたキーを入力することを困難にします(たとえば、tmux内で実行されているEmacsの ttyモードインスタンスにCyを入力する場合)。キーをバインドするキーはいつでも(プレフィックス)バインドできますが、頻繁に入力する必要がある場合は、入力するのが面倒になる場合があります。send-keys C-y


1移動および編集コマンドのみが使用可能です。を除いてcopy-pipe、これらのコマンドは引数を取りません(これは、manページで「1つのコマンドが引数を受け入れる」という意味です。「in」はおそらくタイプミスまたは編集ミスです)。


2

他の答えが役立つかもしれませんが、ここで私が同じことをする方法があります:

  • Shiftキーを押しながらカーソルでテキストを選択します。
  • Ctrl + Shift + Cを押して、テキストをクリップボードにコピーします。

これは公平な答えですが、問題は、2つ以上のペインを水平に配置したときに始まります。
チャウビン

わかりました、あなたがそれに役立つ何かを見つけたら教えてください。
リシャブアグラハリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.