web-dev-qa-db-ja.com

TMUXでviコピーモードでシステムクリップボードを使用する

私はtmux 1.6を実行していますが、インタラクティブモードでコピーするときにシステムクリップボードを使用するだけでなく、viスタイルのキーバインドを使用するように構成しようとしています。

set-window-option -g mode-keys vi

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' "copy-selection && run \"tmux save-buffer | xclip -selection clipboard\""

簡単に言えば、できるようになりたい C+[ 次に使用します v コピーするテキストの選択を開始し、その後 y がプッシュされたら、選択範囲をtmux選択範囲にコピーし、xclipを使用してシステムクリップボードにエクスポートします。

残念ながら、これを行おうとすると、次のようになります。

.tmux.conf: 14: unknown command: copy-selection && run "tmux save-buffer | xclip -selection clipboard"

Tmux構成でこれを行う方法はありますか?

57
Naftuli Kay

こちら も回答しましたが、使い方を理解するのに少し時間がかかったので、混乱している人のために説明します。

これは基本的にあなたが行っている設定です:

(tmuxの場合バージョン<2.5

bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'

(tmuxの場合バージョン> = 2.5

bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'

次にCtrl+b[を押して、コピーモードに入ります。次に、Spaceに続いて任意のvi移動キーを押して、選択を行います。次に、Enterを押す代わりにyを押すと、選択範囲がクリップボードにコピーされます。

注:これは、viキーでtmuxのデフォルトのバインディングを使用していることを前提としています。

Tmuxには、モードごとに異なるキーバインディングテーブルがあります。したがって、bind-key -t vi-copy yは、コピーモードでyキーのアクションを設定します。最初は、選択を行った後でEnterを押すことに慣れていたので混乱しました。 Enterは、実際にはcopy-selectionコマンドのデフォルトのキーバインディングです(コピーモードの場合)。 copy-pipeコマンドを使用すると、選択範囲をコマンド(この場合はxclip)にパイプするために新しいキーをバインドできます。

list-keys -t vi-copyを実行すると、コピーモードのすべてのキーバインディングを確認できます。

96
Ben Davis

Ben Davisへの更新バージョンの回答

tmux 2.4と互換性があります

bind -T copy-mode-vi y send -X copy-pipe "xclip -selection c"
12
jruz

いくつかの技術的な問題が発生しています。
「特殊モード」バインディング(例:vi-copy)…

  1. 別のコマンドセットを使用する(つまり、run-Shell a.k.a. runは使用できません)。
  2. 複数のコマンドをバインドする機能はありません(通常、;で区切ることができます。シェルの&&コマンドセパレーターは使用できません)。

tmux1.8にはcopy-pipeがあります。

bind-key -t vi-copy y copy-pipe 'xclip -selection clipboard >/dev/null'

(このようなバインディングが the FAQ にリストされています。)

6
Chris Johnsen

Tmuxのtmux-yankプラグインを見てください。 https://github.com/tmux-plugins/tmux-yank

Tmuxからシス​​テムクリップボードにコピー/貼り付けする自動化された方法を提供します。 OSX/Linux/Cygwinシステムで動作します。

6
bergercookie

MacOSの場合、この行を.tmux.confに追加できます

bind -t vi-copy y copy-pipe 'pbcopy'

2
bumaociyuan

これが、tmux 2.2を使用してxclipをインストールした結果です。 Vimスタイルのコピーの場合、.tmux.confに以下を追加します

bind Escape copy-mode
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
# Vim style copy to clipboard
bind-key -t vi-copy y copy-pipe "xclip -selection c > /dev/null"
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

ここで、コピーモードの場合、PREFIX vは選択を開始し、PREFIX yはクリップボードにコピーします。 PREFIX pを使用して、ターミナルに貼り付けることができます。

1
OrigamiEye

Waylandでは、xclipの代わりに、wl-clipboardパッケージのwl-copy/wl-pasteを使用することをお勧めします。これは私にとってはうまくいきます:

set-window-option -g mode-keys vi
bind-key -T copy-mode-vi 'v' send-keys -X begin-selection
bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "wl-copy"
bind C-p run "wl-paste --no-newline | tmux load-buffer - ; tmux paste-buffer"

update:X11、Wayland、およびCygwinで同じ tmux.conf を使用しているため、次の構成になります。

bind-key -T copy-mode-vi v send -X begin-selection

if-Shell -b 'echo $XDG_SESSION_TYPE | grep -q x11' "\
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \
    bind-key C-p run 'xclip -out -selection clipboard | tmux load-buffer - ; tmux paste-buffer'"

if-Shell -b 'echo $XDG_SESSION_TYPE | grep -q wayland' "\
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'wl-copy'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'wl-copy'; \
    bind-key C-p run 'wl-paste --no-newline | tmux load-buffer - ; tmux paste-buffer'" "\
    \
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \
    bind-key C-p run 'cat /dev/clipboard | tmux load-buffer - ; tmux paste-buffer'"
1
Felix