Gunakan clipboard sistem dalam mode vi-copy di tmux

51

Saya sedang menjalankan tmux 1.6 dan saya mencoba mengkonfigurasinya untuk menggunakan keybindings vi-style serta menggunakan clipboard sistem saat menyalin dalam mode interaktif:

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

Sederhananya, saya ingin dapat melakukan C+ [dan kemudian gunakan vuntuk mulai memilih teks untuk disalin, lalu ketika ydidorong, salin pilihan ke pemilihan tmux dan kemudian ekspor ke clipboard sistem menggunakan xclip.

Sayangnya, ketika saya mencoba melakukan ini, saya melihat yang berikut:

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

Apakah ada cara untuk melakukan ini dalam konfigurasi tmux?

Naftuli Kay
sumber

Jawaban:

87

Ini juga dijawab di sini , tetapi butuh beberapa saat untuk mengerti bagaimana menggunakannya, jadi saya akan menjelaskan kepada orang lain yang bingung.

Ini pada dasarnya adalah pengaturan yang Anda tuju:

(untuk versi tmux <2.5 )

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

(untuk versi tmux > = 2.5 )

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

Kemudian tekan Ctrl+b [untuk masuk ke mode salin. Kemudian tekan Spacediikuti oleh tombol gerakan apa saja untuk membuat pilihan. Kemudian, alih-alih memukul Enter, tekan ydan pilihan akan disalin ke clipboard.

Catatan: ini mengasumsikan Anda menggunakan binding default tmux dengan kunci vi.

Tmux memiliki tabel pengikatan kunci yang berbeda untuk mode yang berbeda. Jadi, bind-key -t vi-copy yatur aksi untuk ykunci dalam mode salin. Awalnya, saya bingung karena saya terbiasa memukul Entersetelah menentukan pilihan. Entersebenarnya hanya kunci standar yang mengikat untuk copy-selectionperintah (ketika dalam mode salin). The copy-pipeperintah memungkinkan kita untuk mengikat kunci baru untuk pipa seleksi untuk perintah, yang dalam hal ini adalah xclip.

Anda dapat melihat semua binding kunci untuk mode salin dengan menjalankan list-keys -t vi-copy.

Ben Davis
sumber
Terima kasih banyak, saya harus mengunduh dan mengkompilasi tmux 1.9a, tetapi itu tidak terlalu sulit dan sekarang hanya berfungsi ™!
Naftuli Kay
3
Jika tidak bekerja, cukup periksa ulang yang xclipsebenarnya terinstal di sistem Anda (tidak terinstal secara default di Ubuntu, Anda harus sudo apt-get install xclipmendapatkannya)
ecerulm
3
Untuk OSX, ganti xclipdengan pbcopy. Untuk Cygwin di Windows, ganti dengan putclip(dari cygutils-extrapaket).
SnoringFrog
5
Ikatan berikut dari entri blog ini berfungsi sangat baik pada Tmux 2.6 dan tidak memiliki kelemahan menempatkan karakter acak di layar saat menyalin:bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard"
Matthias Braun
1
Ini tidak bekerja untuk saya sampai saya dihapus baris ini dari .tmux.conf: set -g mouse on. Ini seharusnya mengaktifkan "mode mouse" tetapi bahkan setelah menghapusnya semuanya mengenai mouse saya berfungsi dengan baik (roda gulir berfungsi, pemilihan mouse berfungsi) ...
ndemou
11

Versi terbaru untuk jawaban Ben Davis

kompatibel dengan tmux 2.4

bind -T copy-mode-vi y send -X copy-pipe "xclip -selection c"
jruz
sumber
4
Saya menemukan ini bekerja sedikit lebih baik copy-pipe-and-canceldaripada copy-pipe. Ini ada di tmux 2.5
wreckgar23
6

Anda mengalami beberapa masalah teknis:
binding "mode khusus" (misalnya vi-copy) ...

  1. menggunakan seperangkat perintah yang berbeda (yaitu run-shellalias runtidak tersedia), dan
  2. tidak memiliki kemampuan untuk mengikat banyak perintah (yang biasanya dapat dipisahkan dengan ;&&pemisah perintah shell tidak tersedia).

tmux 1.8 memiliki copy-pipe, yang dapat membantu:

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

(Ada yang mengikat seperti ini tercantum di FAQ .)

Chris Johnsen
sumber
1
Saya memiliki tmux 1.8 dan ini sepertinya tidak berhasil. (edit) Ugh, saya benci input teks yang dikirimkan pada Enter. Lagi pula, saya menambahkan ikatan ini, tetapi ketika saya melakukan <prefix> -y, dan menekan [spasi], isinya tidak disalin ke clipboard.
Ben Davis
Baru saja menemukan jawabannya. Saya tidak mengerti bagaimana tabel penjilidan kunci "vi-copy" bekerja.
Ben Davis
5

Lihatlah plugin tmux-yank untuk tmux. https://github.com/tmux-plugins/tmux-yank

Ini memberikan cara otomatis untuk menyalin / menempel dari tmux ke clipboard sistem. Ini bekerja pada sistem OSX / Linux / Cygwin.

bergercookie
sumber
Ini bekerja dengan baik untuk saya, terima kasih untuk tautannya!
Bryan Henry
2

Untuk macOS Anda dapat menambahkan baris ini .tmux.conf

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

bumaociyuan
sumber
pengguna macOS, untuk tmux> = 2.5:bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'pbcopy'
Dai
1

Inilah yang akhirnya bekerja untuk saya menggunakan tmux 2.2 dan menginstal xclip. Untuk menyalin gaya Vim tambahkan yang berikut ke .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"

Di sini, ketika dalam mode salin, PREFIX v memulai pemilihan dan PREFIX menyalin ke clipboard. PREFIX p dapat digunakan untuk menempel di terminal.

Origamiye
sumber