私は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は他のことをするときに分割したいもので、デフォルトで分割を含むバインディングに使用されます。
ここでドキュメントには改行が必要です。たとえば、シェルスクリプトでは、次のように記述できます。
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"
これはアレックスの答えに基づいており、当時存在しなかったものを使用しています。
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
を使用します。
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バッファーにテキストを取得する場合は役に立ちません。
tmux-yank plugin を試してみてください。システムクリップボード(OS XおよびLinux)や、現在のシェル行をヤンクするなどのその他の便利な機能に直接コピーできます。
これが包括的な答えの試みです。
この質問が最初に尋ねられたとき(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"
注: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 -r
をxsel -i -p
に、xclip -o
をxsel -o -p
に置き換えます。
-r
のxclip -r
はオプションであり、最後の改行を削除します。コマンドをコピーする場合に役立ちます。コマンドを貼り付けても、すぐには実行されません。
SSHでトンネリングしている場合は、以下を参照してください https://unix.stackexchange.com/a/354581/14252
参照:
> /dev/null
がない場合、tmuxバッファをクリップボードにコピーすると、tmuxがショートカットに応答しなくなります別の解決策を試した後、ここに私の最終的なセットアップがあります:
# 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クリップボードに移動することは可能だと思います。
余計にキーを押すのが嫌いなので、もっと野心的なものが欲しかった。 [でコピーモードに入り、右側のテキストをハイライト表示してから]を押して、テキストをクリップボードにコピーします。
また、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回だけです)。これは私が想像するいくつかのより多くのバインディングで修正することができますが、これはほとんどの場合私が欲しいことを行います。
Mac OS X向けのソリューション。次の2つのステップに従ってください。
Chris Johnsenの回避策を使用してください: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
このコードを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'"
これは、かなり長い回答です。これは、xclipを使用してリモート(ssh)tmuxセッションからバッファーをコピーする際の2つの主要な問題を修正するものです。
私にとっては、@ 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セッションがローカルの場合に機能します。
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'
受け入れられた回答のわずかに変更されたバリアント。
また、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-Shell
がxclip
で呼び出されたときに、パイプを介して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"
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"
これらの回答の多くは、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設定で問題なく動作します。
私は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"
そして、@ 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。
Tmuxバージョン2.2以降がインストールされたOS-Xでは、以下が機能します。
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
私は 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"