web-dev-qa-db-ja.com

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

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

これまでのところ、C-yを使用してテキストを貼り付け、Emacsのようなキーボードバインディングを使用してcopy-mode内を移動することができましたが、まだテキストをコピーできません tmuxからバッファ(例:copy-mode

私はバッファ全体をクリップボードにコピーするために this thread を見つけました(そしてその逆も同様です)が、私にとっては機能していないようです。

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

の1つのコマンドは、引数copy-pipeを受け入れます。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"の部分は適切に機能します。I canコマンドラインでクリップボードにコピーするため、次のようになります。

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

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

15

次を使用してくださいtmux.confcopy-pipe tmuxの新しいバージョン(1.8以降):

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-y tmux内に貼り付けますC-v Webブラウザのような他の通常のアプリケーション内に貼り付けます。
20
Josh

Tmux 2.4では( this commit 以降)、バインディング構文が変更されていることに注意してください。私は言い換えます この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'

changelog から:

キーテーブルに大きな変更が加えられました。モードキーテーブルは、メインキーテーブルから分離されなくなりました。 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

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

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

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

6
starfry

-temacs-copyはタイプミスではありません。先頭のダッシュは、これがbind-keysコマンドのオプションであることを示します(オプションの引数も含まれます)。よければ、-t emacs-copyと同じです。

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

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

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


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

2
Chris Johnsen

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

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