Salin / rekatkan pilihan teks antara tmux dan clipboard

15

Saya menjalankan versi terbaru tmux (dari repositori git) dan xclip (0.12), dan saya ingin dapat menggunakan binding keyboard seperti Emacs untuk bergerak di sekitar teks copy-mode, menyalin ( M-w) pilihan ke clipboard, dan tempel ( C-y) dari / ke buffer salinan ke clipboard.

Sejauh ini saya telah dapat menempelkan teks C-y, dan bergerak copy-modedengan binding keyboard seperti Emacs, tetapi saya masih tidak dapat menyalin teks dari buffer tmux (mis. Dalam copy-mode)

Saya menemukan utas ini untuk menyalin seluruh buffer ke clipboard (dan sebaliknya), tetapi sepertinya tidak berfungsi untuk saya.

Juga, dalam tmux-usersdaftar mail saya diberitahu bahwa versi terbaru dari tmux (hanya di git repo) menyediakan perintah yang disebut copy-pipe. Halaman manual mengatakan yang berikut tentang perintah ini:

Satu perintah dalam menerima argumen, salin-pipa, yang menyalin seleksi dan pipa itu ke perintah. Sebagai contoh, yang berikut ini akan mengikat 'C-q' untuk menyalin pilihan ke / tmp serta buffer tempel:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Sepertinya copy-pipedimaksudkan untuk digunakan sebagian untuk menyalurkan seleksi ke perintah lain. Tampaknya ada beberapa kesalahan ketik dalam deskripsi ini dan pada perintah (apa itu temacs-copy?)

Apa pun yang ingin saya lakukan adalah:

Penyalinan:

  1. Masuk ke mode salin
  2. Pindah ke teks saya ingin menyalin menggunakan Emacs perintah navigasi (yaitu C-f, C-b, M-f, M-b, C-a, C-edll untuk memindahkan kursor). Tidak ada awalan untuk semua ini.
  3. Salin teks yang dipilih ke clipboard dengan: M-w( tidak ada awalan juga)

Menempel:

  1. Saya ingin dapat mengetik C-y( tanpa harus masuk copy-mode) untuk menempelkan teks di terminal ( tidak ada awalan juga)

Saya telah mencoba yang berikut untuk menyalin tanpa keberuntungan:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Namun, menempel sangat berhasil:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Yang aneh adalah saya tahu bahwa " xclip -i -selection clipboard" bagian dari perintah salin di atas berfungsi dengan baik, karena saya dapat menyalin sesuatu ke clipboard di baris perintah, misalnya:

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

Dengan semua ini, bagaimana saya bisa menyalin pilihan dari mode salin ke clipboard?

Amelio Vazquez-Reina
sumber

Jawaban:

19

Gunakan yang berikut tmux.confdengan copy-pipedalam versi baru 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+[ dalam mode salin
  2. pilih konten dengan mouse (tahan)
  3. M-w untuk menyalin bagian itu ke clipboard sistem
  4. C-yrekatkan di dalam tmux, C-vuntuk menempelkannya di dalam aplikasi reguler lainnya seperti browser web.
Josh
sumber
Jawaban ini layak mendapat lebih banyak upvotes, ini yang terbaik untuk pengaturan berbasis Linux.
Louis Kottmann
Di tmux 2.0 itu run-shellbukannyarun
roign
@LouisKottmann: mengapa hanya berbasis Linux?
schaiba
Saya tidak dapat mengomentari sistem lain, tapi saya percaya mac menggunakan bpaste daripada xclip biasanya
Louis Kottmann
Pada tmux 2.8 saya harus mengubahnya menjadi bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" menurut komit ini disarankan oleh starfry
azzamsa
5

Harap perhatikan bahwa, dengan Tmux 2.4 (karena komit ini ), sintaks yang mengikat telah berubah. Saya memparafrasekan komentar Github ini untuk merangkum perubahan secara singkat:

  1. ganti -tdengan-T
  2. menggantikan vi-<name>dengan<name>-mode-vi
  3. awali perintah dengan send-keys -X

Saya punya:

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'

yang perlu saya ubah menjadi:

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'

Dari changelog :

Tabel kunci telah mengalami perubahan besar. Tabel kunci mode tidak lagi terpisah dari tabel kunci utama. Semua tabel kunci mode telah dihapus, bersama dengan tanda -t untuk mengikat dan melepaskan kunci.

Tabel emacs-edit, vi-edit, emacs-pilih dan vi-pilih telah digantikan oleh binding kunci tetap pada prompt perintah dan pilih mode. Opsi mode-key dan key-status tetap ada.

Tabel emacs-copy dan vi-copy telah digantikan oleh tabel mode copy dan mode copy-vi. Perintah dikirim menggunakan flag -X dan -N untuk mengirim-kunci. Jadi yang berikut ini:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Menjadi:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Perubahan ini memungkinkan parser perintah penuh (termasuk urutan perintah) dan set perintah untuk digunakan - misalnya, prompt perintah normal dengan pengeditan dan riwayat sekarang digunakan untuk mencari, melompat, dan sebagainya, bukan yang kustom. Penjilidan Cr default sekarang:

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

Ada juga beberapa perintah baru yang tersedia dengan send -X, seperti copy-pipe-and-cancel.

starfry
sumber
2

Ini -temacs-copybukan kesalahan ketik. Dasbor terdepan berarti bahwa ini adalah opsi untuk bind-keysperintah (bersama dengan argumen untuk opsi). Ini setara dengan -t emacs-copy, jika Anda suka itu lebih baik.

Mode salin menggunakan set binding dan perintah 1 berbeda dari "mode normal". The copy-pipePerintah ini hanya tersedia dalam alternatif “mode” binding tabel. Saat mode-keysini emacs, mode salin akan menggunakan emacs-copytabel, jadi Anda harus mengikat Mw ke copy-pipedalam tabel itu.

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

Hati-hati membuat terlalu banyak ikatan "tanpa awalan". Mereka akan menyulitkan untuk mengetikkan kunci terikat ke program yang berjalan di dalam tmux (misalnya ketika Anda ingin mengetikkan Cy ke instance tty-mode dari Emacs yang berjalan di dalam tmux ). Anda selalu dapat (awalan) mengikat beberapa tombol yang tidaksend-keys C-y , tetapi itu mungkin membuatnya lebih sulit untuk mengetik jika Anda cukup sering membutuhkannya.


1 Hanya perintah pergerakan dan pengeditan yang tersedia. Dengan pengecualian copy-pipe, perintah-perintah ini tidak mengambil argumen apa pun (ini yang dimaksud dengan halaman manual dengan mengatakan "Satu perintah dalam menerima argumen"; "dalam" mungkin salah ketik atau kesalahan pengeditan).

Chris Johnsen
sumber
2

Sementara jawaban lain mungkin membantu, inilah cara saya melakukan hal yang sama:

  • Shift + pilih teks dengan kursor.
  • Ctrl + Shift + C untuk menyalin teks ke clipboard.
Rishabh Agrahari
sumber
Ini adalah jawaban yang adil tetapi masalahnya dimulai ketika Anda memiliki dua panel atau lebih yang disusun secara horizontal.
cjauvin
Saya mengerti, beri tahu saya jika Anda menemukan sesuatu yang berguna untuk itu.
Rishabh Agrahari