Salin pilihan ke clipboard di tmux

24

Jika saya memilih teks dengan mouse di tmux di iTerm2 pada macOS saya mendapatkan teks yang dipilih disalin ke clipboard saya. Saya tidak perlu mengklik tombol tambahan - cukup pilih teks yang Anda inginkan dan Anda selesai.

Saya telah menguji tmux di terminal.app pada macOS tetapi tidak berfungsi di sana - saya harus menekan yuntuk menyalin pilihan ke clipboard saya.

Saya pikir ada ikatan mouse ( MouseOnSelectionmirip dengan yang serupa MouseDown1Pane) tetapi saya tidak dapat menemukan sesuatu yang berguna di web dan man tmux.

Saya ingin tahu apakah ada cara untuk memiliki perilaku serupa di Ubuntu 16.10 - lebih disukai di terminal Gnome.

Dotfile tmux saya tersedia di sini (tautan) .

Mateusz Piotrowski
sumber

Jawaban:

46

Tmux 2.4+ dengan binding mode copy dan xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

Untuk versi tmux yang lebih lama, binding mode copy emacs (default), atau platform non-X (yaitu, tanpa xclip), lihat penjelasan di bawah ini.


Penjelasan: Pertama-tama kita perlu mengaktifkan opsi mouse sehingga tmux akan menangkap mouse dan mari kita ikat acara mouse:

set-option -g mouse on

Gnome-terminal tidak mendukung pengaturan clipboard menggunakan urutan escape xterm jadi kami harus memastikan set-clipboardopsi tidak aktif:

set-option -s set-clipboard off

Opsi ini mungkin didukung dan diaktifkan secara default di iTerm2 (lihat set-clipboarddi manual tmux), yang akan menjelaskan perilaku di sana.

Kita kemudian dapat mengikat MouseDragEnd1Pane"tombol" mode salin , yaitu, ketika tombol mouse pertama dilepaskan setelah mengklik dan menyeret dalam sebuah pane, ke perintah tmux yang mengambil pemilihan mode salin saat ini (dibuat oleh pengikatan default untuk MouseDrag1Pane) dan mengirimkannya ke pipa. ke perintah shell. Perintah tmux ini copy-pipesebelum tmux 2.4, dan sejak itu berubah menjadi send-keys -X copy-pipe[-and-cancel]. Adapun perintah shell, kita hanya perlu sesuatu yang akan mengatur isi clipboard sistem untuk apa pun yang disalurkan ke sana; xclip digunakan untuk melakukan ini dalam perintah berikut. Beberapa penggantian setara untuk di "xclip -selection clipboard -i"bawah ini pada platform non-X adalah "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL), dan "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2 hingga 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

Sebelum tmux 2.2:

Salin setelah dukungan seret mouse awalnya ditambahkan di Tmux 1.3 melalui pengaturan mode-mouseopsi baru untuk on. Tmux 2.1 mengubah dukungan mouse ke binding kunci mouse yang sudah dikenal, tetapi tidak memiliki DragEndbinding, yang diperkenalkan pada 2.2. Jadi, sebelum 2.2 saya percaya satu-satunya metode pengaturan clipboard sistem pada drag mouse adalah melalui penggunaan built-in sekuens melarikan diri xterm ( set-clipboardopsi). Ini berarti bahwa perlu memperbarui setidaknya tmux 2.2 untuk mendapatkan perilaku seret dan salin untuk terminal yang tidak mendukung set-clipboard, seperti Terminal GNOME.

Josh Brobst
sumber
3
Jawaban berkualitas tinggi inilah yang akhirnya membuat semuanya klik untuk saya .. terima kasih!
cjauvin
2
Bagi siapa pun yang mencoba melakukan ini pada mac karena mereka telah mengubah fungsionalitas terminal mereka dan metode default seperti yang dinyatakan oleh OP tidak lagi berfungsi (Saya menggunakan Byobu yang memiliki buffer salinan sendiri): mengganti xclip...pernyataan dengan sederhana pbcopytidak Trik-nya.
Darrel Holt
Tidak ada solusi di utas ini yang berfungsi untuk saya.
Yankee
1
Hai Josh, ketika saya source-file ~ / .tmux.conf, ternyata:Unknown key: MouseDragEnd1Pane
Xifeng Li
@XifengLi Versi tmux dan OS apa yang Anda gunakan? Saya percaya Anda membutuhkan setidaknya tmux 2.2 untuk DragEndkunci.
Josh Brobst
8

Sebagai perpanjangan dari jawaban yang diterima, orang-orang sering merasa terganggu ketika melepaskan tombol mouse keluar dari mode salin (inilah yang terjadi dengan copy-pipe-and-cancel). Lihat: https://github.com/tmux/tmux/issues/140 . Oleh karena itu, di tmux yang lebih baru (saya menggunakan 2.6) dapat kita gunakan copy-pipebersama clear selectionuntuk menyalin ke pilihan tetapi jangan keluar dari mode salin:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection
Gabor Marton
sumber
2

Memperluas kedua jawaban untuk menyalin dari msys2 ke papan klip Windows (dan menghapus pilihan):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
Shawn Hoover
sumber
Poin bagus. Saya menggunakan mode salin sendiri (gaya emacs) dan telah menyisipkan konfigurasi saya sendiri setelah pengujian. Saya telah memperbarui jawaban untuk memasukkan keduanya seperti dalam jawaban yang diterima.
Shawn Hoover
0

Ekstensi lain adalah tentang menggunakan Shift kunci.

Tahan Shiftsambil memilih teks dengan mouse. Sekarang Anda mendapatkan menu klik kanan standar (tahan terus atau tekan Shiftlagi) dan Anda dapat menggunakan Ctrl+Shift+Cdan Ctrl+Shift+Vuntuk menyalin dan menempel. Teks yang disalin juga akan tersedia di clipboard sistem .

Diuji Ubuntu 18.04.1dengan tmux 2.6.

Sumber: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

Dušan Maďar
sumber