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


118

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を分割したいので、デフォルトで分割を含むバインディングになります。


2
以下の2014年の回答をご覧ください。これは他の回答よりも新しいものです。非常にうまく機能するtmux yankプラグインを推奨します。
dmonopoly

Tmux 2.4(2017年4月リリース)および2.6で最新の回答
ジェイソンアクセルソン

回答:


26

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

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

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

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

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

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


おかげで完璧に動作します。競合状態は私にとっては問題ではなく、1つのセッションしか使用しません。
デジタルパワーズ

競合状態を回避するために、mktemp広く利用可能なものを使用することをお勧めします
悲嘆

@Grief良いアイデア。この場合、tmuxプロセスのPIDを使用しても同様に機能し、おそらく($PPIDtmuxによって起動されたシェルで)簡単に配置できます。しかし、変数ファイル名(どのように構築されたものでも)を引数に取得するにはどうすればよいですsave-bufferか?私は推測save-buffer - | …のようにGrauwolfの答え完全に一時ファイルを廃止し、?
ジル

あなたは正しい、私のせいだ、これは不可能だろう。
悲嘆

93

これは動作するはずです:

# 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"

1
そうです。これは、一時ファイルを使用するよりもはるかに優れています、ありがとう。TMUX環境変数のおかげで、複数の同時セッションにも自動的に対応します。
ジル

22
以下のためのより良い指示がC-pないだろう:bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"-何の問題や、コマンドラインの制限の問題を引用します。
-docwhat

8
tmuxには、選択範囲をクリップボードにコピーするためのフックがありますcopy-modeか?
Ehteshチョードリー

1
xclip -oオプションが機能しなかったため、次のように変更しましたbind C-c run "tmux save-buffer - | xclip -selection c"\; display-message "Buffer copied to clipboard"
Pawka

6
この方法でコピーを行うたびに、tmuxはキーボードショートカットへの応答を停止します。それに対する解決策はありますか?
-skrat

41

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

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

あなたが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"

コピーするには、バッファをマックペーストボードにtmuxは(既にtmuxのを使って何かをコピーしているはずです)、使用から<tmux-key> Control-cCommand-vまたはで利用可能になりますpbpaste

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


2
この答えは素晴らしいです。私はそれを使用しtmux show-bufferて行折り返しの問題をtmux save-buffer -解決しました。
event_jr

何をしない-の終わりtmux save-buffer -でしょうか?
ヘケビントラン

発するsave-bufferstdoutに。を-ファイル名に置き換えると、そこに保存されます。これにより、ファイルの作成(およびクリーンアップ)ができなくなります。
docwhat

1
OS X 10.10の時点では、ユーザー名前空間への再接続は必要なくなりました。tmuxとOS Xに関するほとんどすべてのチュートリアルとドキュメントで言及されています。コピーアンドペーストは数年前には簡単にできなかったからです。最近では(ほとんど)箱から出して動作します。
ラファエルブガジュスキー

40

この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バッファーにテキストを取得する場合は役に立ちません。


1
完全に動作し、束の最も簡単なソリューションです。
ナセル14年

2
Linuxでは私には動作しませんが、これは動作します:unix.stackexchange.com/a/131074/13601
Sebastian Blask

1
OS X 10.10の時点でreattach-to-user-namespaceは、必要ではないようです。
クリス


2
これは、もはやあなたが使用する必要がある代わりに4月20日、2017年にリリースされたtmuxは2.4で動作していないbind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip"とOS Xのために:bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"
ジェイソンAxelson

16

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


7
これは優れた、クリーンなソリューションであり、他のソリューションよりもはるかに最近の回答であるため、より考慮すべきです。共有してくれてありがとう!
dmonopoly

9

別のソリューションを試した後、ここに私の最終的なセットアップがあります:

# 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

ここに包括的な答えの試みがあります。

最初に少し歴史

この質問が最初に聞かれたとき(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"

マック

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"

マック

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 -pxclip -oxsel -o -p

  • -r中には、xclip -rそれが最後の改行を削除し、オプションです。コマンドをコピーするのに便利で、貼り付けてもすぐには実行されません。

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

参照:


このコマンドbind-key C-p run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"はまだ有効ですか?fortmux>2.4
alpha_989

7

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

また、tmuxはラップする式に改行を含めることを好みます(そして奇妙なことに、それらの改行は間違った場所にあります!それらは式が画面上で折り返される場所ではありません)。だから、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-]は、それらを次に使用するときは面白いが、一度だけ)動作します。これは、私が想像するより多くのバインディングで修正できますが、これは私がたいてい望むことをします。



4

以下を使用した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


2
tmux save-bufferは共有ディレクトリにファイルを安全に作成しますか?それ以外の場合/tmpは、セキュリティホールです。の無駄な使用がcatあり、一時ファイルの削除が欠落しています。それはここで同等であるxselvsの問題でxclipあり、あなたは私の(独立して書かれた)ソリューションを持っています。
ジル

1
ありがとう、ジル。Wikiを更新して、あなたのポイントを反映させます。
-jasonwryan

4

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

受け入れられた答えを少し修正したもので、私が作成しました。

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

更新: tmux 1.8とopenSUSE 12.2の2つのインストールで、パイプを介してstdinからの読み取りtmux run-shellで呼び出されるとハングしますxclip。代わりに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

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

1.応答しないxclip

私にとって、@ Grauwolfの答えxclipうまくいきませんでした(tmuxペインが完全に無反応になります)。Arch wikiのTmuxページでその理由を見つけました:

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 -Xtmuxを使用している場合、これ直接機能ない可能性があります。

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

完全なソリューション

だから、私にとって、完全な実用的なソリューションは、次の行をmyに入れること~/.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-envandで抽出する必要があり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'

/home/linux/.tmux.conf:11: invalid or unknown command: bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's[0/0] PLAY=//p'` >/dev/null
ユーザー

@user表示するsedコマンドは、私が書いたものと同じではありません...これはあなたが書いたものです.tmux.confか?
プラズマビントゥロン

コードをコピーして貼り付けました。
ユーザー

@ユーザー、奇妙な。エラーの原因は多数ある可能性があります。最初に、引用が正常であることを確認してください。次に、あなたは知っていsedますか?コマンドは次のとおりsed -n s/^DISPLAY=//pです。また、あなたが使用することができますcuttmux show-env DISPLAY | cut -d'=' -f2。tmuxのバージョンを確認する価値もあります。
プラズマビントゥロン

3

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

emacsスタイルのバインディングには、いくつかの異なるオプションがあります。(Viスタイルも同様ですか?)emacsで「コピー選択」を行うための一般的なバインディングはMwであるため、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に異なるキーバインディングを使用して受け入れます。たとえばCMwを使用します。(このバインディングは「グローバルに」定義されます-コピーモードだけでなく、コピーモードでのみ有用です)

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

3

これらの回答の多くは、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。その行はyankをtmuxバッファーに結合し、xclipに送信します。
  • 実際に貼り付けるには、クリップボードを指定する必要があります -sel clip -o

これは、vim / zsh / tmuxのセットアップで今ではうまく機能します。


ありがとうございました!-sel clip -i問題を解決します。ただし、クリップボードを貼り付けて再度指定する必要がある理由はわかりません(]私にとっては標準的な動作です)
melekes 2014年

1

そして、@ 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でラップされます。およびLinux。


1

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

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"

1

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

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

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

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.