Bagaimana cara menyalin dari / ke 'clipboard' tmux dengan pipa shell?

17

Ketika bekerja di lingkungan shell, saya sering menjalankan kebutuhan untuk menyalin 'output pipa menengah' di sekitar (mis. Dari / ke editor yang sudah berjalan, ke shell lain, mesin lain, dll).

Ketika berada di lingkungan windowing, metode yang mudah (dan generik) untuk menyelesaikan ini sering melalui clipboard sistem, misalnya .:

  • X11: ... | xsel -i/xsel -o | ...
  • OS X: ... | pbcopy/pbpaste | ...

Bagaimana saya bisa mendapatkan perilaku yang sama nyamannya dengan menggunakan fasilitas tmux copy / paste?

tidak terpikirkan
sumber

Jawaban:

20

tl; dr

  • ... | tmux loadb -
  • tmux saveb - | ...

Penjelasan & Latar Belakang

Dalam tmux, semua aktivitas salin / tempel melewati tumpukan buffer di mana bagian atas (indeks 0) adalah teks yang paling baru disalin dan akan digunakan untuk menempel ketika tidak ada indeks buffer yang secara eksplisit disediakan -b. Anda dapat memeriksa buffer saat ini dengantmux list-buffers atau cara pintas default tmux-prefix+ #.

Ada dua cara untuk menyalurkan ke buffer tmux baru di bagian atas stack, set-buffermengambil argumen string, dan load-buffermengambil argumen file. Untuk menyalurkan ke buffer yang biasanya ingin Anda gunakanload-buffer dengan stdin, mis .:

print -l **/* | tmux loadb -

Menempelkan ini kembali ke editor dan itu cukup jelas ( tmux-prefix+] atau apa pun yang Anda terikat paste-buffer), namun, mengakses pasta dari dalam shell tidak, karena memohon paste-bufferakan menulis paste ke stdin, yang berakhir di sunting terminal Anda buffer, dan baris baru apa pun dalam tempel akan menyebabkan shell mengeksekusi apa pun yang telah ditempel sejauh ini (berpotensi cara yang bagus untuk merusak hari Anda).

Ada beberapa cara untuk mendekati ini:

  1. tmux pasteb -s ' ' : -s mengganti semua ujung garis (pemisah) dengan pemisah apa pun yang Anda berikan. Namun Anda masih mendapatkan perilaku paste-bufferyang berarti bahwa pasta berakhir di buffer edit terminal Anda, yang mungkin sesuai dengan yang Anda inginkan, tetapi biasanya tidak.
  2. tmux showb | ...: show-buffermencetak buffer ke stdout, dan hampir apa yang diperlukan, tetapi seperti yang disebutkan dalam komentar ,show-buffer melakukan pengkodean oktal dari karakter ASCII yang tidak dapat dicetak dan karakter non-ASCII. Sayangnya, istirahat ini cukup sering menjengkelkan, bahkan dengan hal-hal sederhana seperti string yang diakhiri nol atau karakter latin beraksen (mis. (Dalam zsh) print -N á | tmux loadb - ; tmux showbcetakan \303\241\000).
  3. tmux saveb - | ...: save-buffertidak hanya kebalikan dari load-bufferdan menulis byte mentah yang tidak dimodifikasi menjadi stdin, yang merupakan apa yang diinginkan dalam banyak kasus. Anda kemudian dapat terus merakit pipa lain, dan misalnya. melewati | xargs -n1 -I{} ...garis proses bijaksana, dll.
tidak terpikirkan
sumber
1
tmux show-bufferakan melakukan pengkodean oktal dari karakter kontrol C0 dan byte non-ASCII (mis. karakter Latin beraksen, dll.). Anda dapat menggunakan tmux save-buffer -jika Anda menginginkan byte mentah (ini biasanya yang Anda inginkan).
Chris Johnsen
@ ChrisJohnsen Terima kasih banyak untuk mengetahui hal itu, saya memperbarui jawabannya.
terpikirkan