tmux xclip copy tidak lagi berfungsi

8

Pada mu Ubuntu 12,04 setup perintah copy dan paste clipboard tmux saya adalah setup sebagai berikut:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Ini bekerja sangat baik untuk waktu paling lama hingga sebulan yang lalu, ketika saya menduga beberapa perubahan konfigurasi atau perubahan paket dibuat yang memecahkan hal di atas. Di terminal GNOME, menempel masih berfungsi dengan baik dengan prefix+ ctrl-vdan ctrl-shift-v.

Namun, xclipperintah salin tidak lagi berfungsi apa pun yang saya lakukan, dan saya telah mencoba menghapus prefiks pengikatan kustom di atas, menggunakan -selectalih-alih -sel, tidak menggunakan clipboarddll. Ini cukup banyak show stopper untuk pengguna GVim seperti saya, karena saya tidak tahu Bahkan tidak ada solusi terminal GNOME ctrl-shift-cdengan tmux mengambil alih shell. Saya masuk ke mode salin, pilih teks dengan space+ movement, dan ketika saya menjalankan prefix+ ctrl-csama sekali tidak ada yang terjadi. Sebelum ini pecah, tmux akan menampilkan pesan konfirmasi di bagian notifikasi di bagian bawah.

Adakah yang punya saran sejauh bagaimana orang bisa men-debug ini? Ini adalah hit produktivitas yang cukup besar. Saya mungkin dapat menggunakan trik penyelesaian sementara file untuk saat ini , tetapi akan sangat bagus untuk mengetahui apa yang terjadi xclip.

Alexandr Kurilin
sumber
Apakah xclip sebenarnya tersedia? Apa output dari type xclip?
Chris Down
Outputnya adalah: "xclip is / usr / bin / xclip". Seperti yang saya sebutkan, menempel melalui xclip berfungsi dengan baik untuk alasan apa pun.
Alexandr Kurilin
1
Apakah Anda memiliki masalah yang sama xsel -b?
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles, xsel -i -bsepertinya berhasil!
Alexandr Kurilin
Heh. Saya tidak tahu mengapa itu berhasil, saya pikir xsel -bdan xclip -selection clipboardakan melakukan hal yang sama!
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

9

The xselutilitas ini mirip dengan xclip, tapi diimplementasikan sedikit yang berbeda. Biasanya saya akan mengharapkan mereka untuk berperilaku dengan cara yang sama, tetapi mereka tidak membuat panggilan perpustakaan X yang sama persis, jadi ada kemungkinan bahwa dalam beberapa kasus sudut xselakan bekerja tetapi tidak xclip, atau sebaliknya. Mencoba:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Hasil yang sama - tidak bekerja untuk saya - berfungsi sebagai perintah mandiri tetapi mengembalikan string kosong dari ikatan tersebut; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly Zdanevich
6

Menambahkan -bke run-shell(atau run) perintah memperbaiki masalah. Dengan -bperintah shell dijalankan di latar belakang.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"

Pawka
sumber
2

Meskipun saya tidak dapat mereproduksi lagi, tetapi inilah jawaban teknis apa yang mungkin terjadi dalam kasus Anda.

Pertama, Anda perlu memahami cara kerja clipboard X11. Anda dapat membaca esai jwz tentang ini: http://www.jwz.org/doc/x-cut-and-paste.html

Singkatnya, aplikasi yang menyimpan konten clipboard perlu dijalankan hingga aplikasi lain menegaskan kepemilikannya. Jadi ketika Anda menjalankan xclip -i <<< testmaka Anda dapat melihat xclip berjalan di latar belakang sampai Anda membuat pilihan lain:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Sekarang ini semua baik-baik saja tetapi ketika Anda keluar dari shell ini maka semua proses milik sesi ini terbunuh secara default dengan mengirimkan mereka sinyal HUP. Ini berarti xclip akan terbunuh dan Anda tidak akan dapat lagi mengakses konten clipboard Anda.

Jadi solusi yang disarankan (jika Anda tidak memiliki xsel) adalah mengabaikan sinyal HUP dengan menggunakan bind berikut:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xseltidak terpengaruh oleh masalah ini karena hal pertama yang dilakukannya setelah fork () adalah melepaskan diri dari terminal pengendali sehingga tidak akan menerima sinyal HUP ketika shellnya keluar (Anda bahkan tidak akan melihatnya di ps di atas output tetapi hanya ketika Anda melakukan a ps -e | grep xsel).

ypsu
sumber
1

Saya mengalami masalah yang sama dan file sementara tidak akan membantu dalam kasus khusus ini, saya khawatir. Ini karena xcliptampaknya berperilaku berbeda ketika melahirkan oleh tmux daripada ketika dijalankan "secara interaktif" dan menunggu aplikasi lain untuk mengambil kepemilikan area clipboard. Coba gunakan xclip -l 1untuk segera keluar (lihat halaman manual untuk detail).

peterph
sumber
Sepertinya tidak bisa membuat pekerjaan itu berhasil. Apakah ini yang mengikat itu akan terlihat seperti: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel clipboard"?
Alexandr Kurilin
Bisakah Anda memposting solusi yang berhasil untuk Anda? Itu akan sangat membantu juga!
Alexandr Kurilin
Saya menggunakan bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
peterph
Ya, masih belum ada apa-apa. Tmux tidak melaporkan apa pun, juga xclip.
Alexandr Kurilin
Bagi saya itu juga tidak melaporkan apa-apa, tetapi berfungsi. Periksa apa xclipyang dilakukan ketika Anda mencoba menyalin buffer. Jika tetap tergantung di sana menunggu sesuatu, apakah membunuh itu membantu? Anda juga harus keluar dari mode pemilihan dengan menekan Enter (dan karenanya menyimpannya ke dalam buffer) sebelum Anda mencoba untuk menyalin buffer ke clipboard X.
peterph
1

Ini adalah pertanyaan lama, tapi saya kira saya punya solusinya, diambil dari halaman Tmux di wiki Arch :

xclip juga dapat digunakan untuk tujuan itu, tidak seperti xsel, ia berfungsi lebih baik untuk mencetak bitstream mentah yang tidak sesuai dengan lokal saat ini. Namun demikian, lebih baik menggunakan xsel daripada xclip, karena xclip tidak menutup STDOUT setelah membaca dari buffer tmux. Karena itu, tmux tidak tahu bahwa tugas penyalinan telah selesai, dan terus menunggu penghentian xclip, sehingga membuat tmux tidak responsif. Solusinya adalah mengarahkan STDOUT dari xclip ke / dev / null

Jadi perintah Anda harus menjadi:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"
PlasmaBinturong
sumber
0

Ini adalah konfigurasi yang berfungsi saya gunakan:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
Mateusz Piotrowski
sumber