Bagikan clipboard antara bash dan X11

12

Di utas ini , jawaban teratas menunjukkan cara menyalin teks yang sebelumnya dipilih dengan mouse di terminal gnome, ke clipboard di X11.

Pertanyaan saya adalah: Katakanlah saya menyalin sepotong teks dari terminal menggunakan tanda set bash dan salin pintasan keyboard (yaitu set-mark+ M-w). Apakah mungkin berbagi clipboard ini dengan X11?

EDIT : Dalam pertanyaan awal, saya berbicara tentang berbagi clipboard dengan GNOME, tetapi seperti yang ditunjukkan Gilles di bawah ini, GNOME tidak secara spesifik memiliki clipboard (umum untuk X), jadi saya telah memperbarui pertanyaan.

Amelio Vazquez-Reina
sumber
Di gnome-terminal, Anda juga dapat mengetikkan Ctrl + Shift + C dan Ctrl + Shift + V untuk menyalin dan menempel ke clipboard sistem.
Lie Ryan
2
Lihat posting ini stackoverflow.com/questions/994563/... Tetapi tidak berfungsi untuk saya.
hebat q

Jawaban:

10

Clipboard Bash bersifat internal untuk bash, bash tidak terhubung ke server X.

Apa yang bisa Anda lakukan adalah mengubah makna M-wuntuk menyalin pilihan ke papan klip X¹ selain papan klip internal bash. Namun integrasi bash cukup longgar, dan saya rasa tidak ada cara untuk mengakses informasi wilayah atau papan klip dari kode bash. Anda dapat membuat kunci yang mengikat untuk menyalin seluruh baris ke papan klip X.²

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xsel -ib
  }
  bind -x '"\eW": copy_line_to_x_clipboard'
fi

Jika Anda ingin melakukan hal-hal mewah di shell, beralihlah ke zsh, yang (di antara kelebihan lainnya) memiliki integrasi yang jauh lebih baik antara editor baris dan bahasa scripting.

if [[ -n $DISPLAY ]]; then
  x-copy-region-as-kill () {
    zle copy-region-as-kill
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  x-kill-region () {
    zle kill-region
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  zle -N x-copy-region-as-kill
  zle -N x-kill-region
  bindkey '\C-w' x-kill-region
  bindkey '\ew' x-copy-region-as-kill
fi

¹ Gnome tidak secara khusus memiliki clipboard, ini umum untuk X.
² Pada bash 4.1, ada bug dalam kode parsing kunci: urutan kunci yang diikat bind -xmungkin tidak boleh lebih dari dua karakter. Saya pikir bash 4.2 memperbaiki beberapa kasus dengan awalan yang lebih panjang tetapi tidak semuanya; Saya belum meneliti detailnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih atas idenya @Gilles! Saya pikir sudah waktunya bagi saya untuk belajar dan beralih ke zsh.
Amelio Vazquez-Reina
Akhirnya! Terima kasih banyak! Ini copy_line_to_x_clipboardadalah persis apa yang saya hilang untuk waktu yang sangat lama: salinan yang setara dengan shift + insert. Saya mengubah ke ctrl-x ( bind -x '"\C-x") karena Escterlalu jauh untuk seleraku (dan Cc akan menjadi pilihan paling bodoh).
pbarill
Terminal biasanya memiliki kunci meta, yang terikat ke tombol alt secara default. Mengetik karakter sambil menahannya diterjemahkan untuk escdiikuti oleh karakter itu, jadi Anda bisa mengetikkannya sebagai alt-w.
DoMiNeLa10
7

@Gilles sudah memberikan jawaban yang bagus. Saya hanya ingin menyebutkan keberadaannya xclip, yang juga merupakan cara yang sangat berguna untuk menyalin keluaran terminal ke clipboard X, dengan hanya memipiskan apa saja ke dalamnya:

$ cat /etc/passwd | xclip
ℝaphink
sumber
1
Hanya sebuah catatan yang xclipmenyalin ke buffer utama secara default. Untuk menggunakan clipboard, gunakan xclip -selection clipboard.
Sparhawk