web-dev-qa-db-ja.com

tmuxでバッファをクリップボードにコピーする

私はtmuxバッファーにあるものをクリップボードにコピーするための適切な方法を見つけようとしています。私はいくつかの異なるものを試しました

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

これは私にかなり近づきます、私がしなければならないすべては、prefix-pを実行した後にcontrol-dを押すことです。

私はそれを修正してみました

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

しかし、それはうまくいきません。実際、これをペアにすると、

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

それは何もしないので、分割ウィンドウはシェルコマンドで<<が好きではないと想定しています。

何か案は?

編集:select-pane -t 2必要な場合は、それほど重要ではありません。私は特定のレイアウトを使用するだけで、ペイン2は他のことをするときに分割したいもので、デフォルトで分割を含むバインディングに使用されます。

121
Digital Powers

ここでドキュメントには改行が必要です。たとえば、シェルスクリプトでは、次のように記述できます。

cat <<EOF >somefile; echo  done
file contents
EOF

私はtmuxで改行を入れることができないと思います。たとえそうしたとしても、これは良いアプローチではありません。データ自体にHEREが1行に含まれている場合(たとえば、.tmux.confをコピーしているため)

バッファの内容を一時ファイルに書き込むことをお勧めします。未テスト:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

このコマンドを2つの別々のtmuxインスタンスで使用すると、競合状態が発生します。これを解決する方法がわかりません。

これはうまくいくはずです:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Mac OS-X向けのよりシンプルなソリューション

これはアレックスの答えに基づいており、当時存在しなかったものを使用しています。

homebrew を使用している場合(および使用していない場合は、なぜそうでないのでしょうか?)、次のようにします。

brew install reattach-to-user-namespace

次に、~/.tmux.confで:

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

bufferをtmuxから(tmuxを使用してすでにコピーしてあるはずですが)Macのペーストボードにコピーするには、<tmux-key> Control-cを使用します。 Command-vまたはpbpasteで利用できるようになります

Macのペーストボードから何かを貼り付けるには、<tmux-key> Control-vを使用します。

41
docwhat

copy-pipeコマンドは、バージョン1.8で追加されました。選択範囲をtmuxバッファーにコピーし、それをコマンドにパイプします。これで、プレフィックスバインディングの必要がなくなりました。次に例を示します。

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

copy-modeでテキストを選択すると、 y そのテキストをtmuxバッファとOSクリップボードにコピーします。ただし、クリップボードからtmuxバッファーにテキストを取得する場合は役に立ちません。

40
Tyler Holien

tmux-yank plugin を試してみてください。システムクリップボード(OS XおよびLinux)や、現在のシェル行をヤンクするなどのその他の便利な機能に直接コピーできます。

16
user80379

これが包括的な答えの試みです。

まず少し歴史

この質問が最初に尋ねられたとき(2011年6月)、Tmuxからクリップボードへのテキストのコピーは2段階のプロセスである必要があり、最初に選択したテキストをTmuxのバッファーにコピーしてから、Tmuxのバッファーからシステムクリップボードにテキストをコピーしました。

1.8(2013年3月)では、copy-pipeコマンドが追加され、選択したテキストをシステムのクリップボード(または他の宛先)に直接コピーできるようになりました。

その後、2.4(2017年4月)でキーテーブルが大幅に変更され、このページの回答の多くは廃止されました。

元の質問に答える

Linux

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac

homebrew を使用している場合は、ターミナルで次のコマンドを実行してreattach-to-user-namespaceをインストールする必要があります。

brew install reattach-to-user-namespace

次に〜/ .tmux.confに:

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

短い方法(選択範囲をtmux> 2.4のクリップボードから直接コピーして貼り付けます)

注:Linuxにはプライマリとセカンダリのクリップボード(選択とも呼ばれます)があるため、Linuxには2つのバージョンがあります。

Linux

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

これらのコマンドのカスタマイズ

  • コマンドがステータス行で何をしたかを伝えたくない場合は、display-message(およびその前にある\;)を削除してください。

  • Viの代わりにEmacsスタイルのコピーモードを使用している場合は、copy-mode-viのインスタンスをcopy-modeだけで置き換えます。

  • Linuxを実行していて、xselの代わりにxclipを使用する場合は、xclip -rxsel -i -pに、xclip -oxsel -o -pに置き換えます。

  • -rxclip -rはオプションであり、最後の改行を削除します。コマンドをコピーする場合に役立ちます。コマンドを貼り付けても、すぐには実行されません。

  • SSHでトンネリングしている場合は、以下を参照してください https://unix.stackexchange.com/a/354581/14252

参照:

10
Jason Axelson

別の解決策を試した後、ここに私の最終的なセットアップがあります:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

show-bufferの代わりにsave-bufferを使用すると、分割されているときに改行で示されるように、データのない実際のデータが得られます。

これを使用して、tmuxコピーモードで選択/コピーを開始します。

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

コピー選択を「y」キーとマージして、xクリップボードに移動することは可能だと思います。

9
Ownatik

余計にキーを押すのが嫌いなので、もっと野心的なものが欲しかった。 [でコピーモードに入り、右側のテキストをハイライト表示してから]を押して、テキストをクリップボードにコピーします。

また、tmuxは、折り返す式に改行を含めることを好みます(奇妙なことに、それらの改行はwrongの場所にあります!式は画面上で折り返されていません)。だから私はC-]に改行を削除して表現をコピーして欲しかった。

Tmux 1.6で私はこれを試しました:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

しかし、tmuxが複雑なものをvi-copyテーブルにバインドすることに満足していないように見えるため、これは機能しませんでした。だから私は代わりにこれをやった:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

これは、]またはC-]以外の方法でコピーモードを終了した場合、奇妙なことにつながります(]またはC-]は次に使用するときに奇妙に動作しますが、1回だけです)。これは私が想像するいくつかのより多くのバインディングで修正することができますが、これはほとんどの場合私が欲しいことを行います。

7
Leif

Mac OS X向けのソリューション。次の2つのステップに従ってください。

  1. Chris Johnsenの回避策を使用してください: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. このコードをtmux設定(〜/ .tmux.conf)に追加します

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

これは、かなり長い回答です。これは、xclipを使用してリモート(ssh)tmuxセッションからバッファーをコピーする際の2つの主要な問題を修正するものです。

1.応答しないxclip

私にとっては、@ Grauwolfの answer with xclipは機能しませんでした(tmuxペインを完全に応答しません)。 Arch wikiのTmuxページ で理由を見つけました:

xselとは異なり、xclipもその目的に使用できます。xselは、現在のロケールに適合しない生のビットストリームを出力するのに適しています。それでも、xclipはtmuxのバッファーから読み取った後はSTDOUTを閉じないため、xclipの代わりにxselを使用する方が適切です。そのため、tmuxはコピータスクが完了したことを認識せず、xclipの終了を待ち続けるため、tmuxが応答しなくなります。回避策は、xclipのSTDOUTを/ dev/nullにリダイレクトすることです

したがって、バインディングは次のようになります。

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

これで、これはtmuxセッションがローカルの場合に機能します。

2. XclipがXに接続できない

ssh -Xでtmuxを使用している場合、これが機能しない可能性が高いです直接。

これは、シェル変数$DISPLAYを適切に設定する必要があるためです。

完全なソリューション

したがって、私にとっては、完全な作業ソリューションは次の行を私の~/.tmux.confに入れることです:

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

プライマリから貼り付ける場合:

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

$DISPLAYのソーシング中に.tmux.confが正しく設定されない理由が完全に理解できないため、tmux show-envおよびsedで抽出する必要があります。

Tmuxが1.8以上の場合、copy-pipeを使用してこのコマンドを変更できます。

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

受け入れられた回答のわずかに変更されたバリアント。

また、xclipのprimaryデフォルトクリップボード(マウスを選択してマウスの中ボタンでクリックしたもの)に加えて、システムクリップボード(Ctrl-C、Ctrl-V)を使用することも好みます。システムクリップボードを選択するには、-selection clipboard引数をxclipに渡す必要があります。

また、バッファーをクリップボードにコピーする際に、コピーするバッファーを選択できることも気に入っています。これは、choose-bufferを使用して行われ、save-bufferを使用してバッファに引数を-b %%に渡します。

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

PDATE:どういうわけかtmux 1.8と2つのopenSUSE 12.2インストールで、tmux run-Shellxclipで呼び出されたときに、パイプを介してstdinから読み取られるとハングします。代わりにxselを試してみることにしましたが、うまくいくようです。これらは、xselを使用した同等のキーバインディングです。また、&&を使用して、コマンドを貼り付けてチェーン化し、堅牢性を高めました。

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

Arch Wikiにはxclipを使用した解決策があります:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

これらの回答の多くは、zshをそのまま使用したUbuntu 14.04では機能しませんでした。私のシェルがそれと何か関係があるかどうかはわかりませんが、コピーに この戦略 を使用し、貼り付けに この戦略 を使用する作業バージョンを次に示します。

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

いくつかのメモ:

  • コピーパイプの場合、-sel clip -iを使用してクリップボードを指定する必要がありました。その行は、ヤンクをtmuxバッファーに結合し、xclipに送信します。
  • 実際に貼り付けるには、-sel clip -oでどのクリップボードを指定するかを再度指定する必要がありました。

これは私のvim/zsh/tmux設定で問題なく動作します。

3
brianclements

私はtmuxバッファーにあるものをクリップボードにコピーするための適切な方法を見つけようとしています。私はいくつかの異なるものを試しました

Emacsスタイルのバインディングの場合、いくつかの異なるオプションがあります。 (Viスタイルは似ている必要がありますか?)emacsで「コピー選択」を行うための一般的なバインディングはM-wなので、tmuxで同じバインディングを使用すると非常に便利です。

1-理想的ですが、機能しません(tmuxの制限のため?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2-私にとってうまく機能する妥協:tmuxでemacs-copyに別のキーバインディングを使用して受け入れます。たとえばC-M-wを使用します。 (このバインディングは「グローバルに」定義されます-コピーモードだけでなく-コピーモードでのみ有用です)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

そして、@ Leif回答の改良版は次のようになります:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

このように、コピーモードを]以外の方法で終了した場合、影響はありません。上記のコードは、システムクリップボードにtmuxテキストをコピーするためのtmuxプラグイン tundle/tmux-yank にラップされています。 OS XおよびLinuxのtmux> = 1.6。

1
Javier López

Tmuxバージョン2.2以降がインストールされたOS-Xでは、以下が機能します。

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

私は copyq 複数行のクリップボードマネージャーを使用しています。 (Windows、OSX、Linuxで動作します。)

  • ~/.tmux.confに次の行を追加します。

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwincopyq.exe内の~/.bashrc場所を要求します:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1