Ada dua alat baris perintah (dalam dua paket berbeda) untuk mengakses papan klip X:
xclipxsel
Saya akan senang mengetahui perbedaan antara keduanya dan mendengar rekomendasi mana yang harus digunakan dalam hal ini.
Ada dua alat baris perintah (dalam dua paket berbeda) untuk mengakses papan klip X:
xclipxselSaya akan senang mengetahui perbedaan antara keduanya dan mendengar rekomendasi mana yang harus digunakan dalam hal ini.
Jawaban:
Keduanya xclipdan xseldapat menyimpan teks ke dalam 3 pilihan berbeda (secara default itu adalah pemilihan utama). Dari pengalaman saya tahu bahwa pemilihan utama pada dasarnya adalah apa yang Anda soroti dan dirilis dengan klik tengah mouse (yang sesuai dengan menekan tombol touchpad kanan dan kiri pada laptop). Papan klip adalah tradisional CtrlV.
Dengan memeriksa manhalaman untuk keduanya, saya telah menemukan bahwa xclipmenang dalam satu aspek - membaca dari file input:
xieerqi:
$ cat testfile.txt
HELLOWORLD
xieerqi:
$ xclip -selection clipboard testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xieerqi:
$ xsel testfile.txt
Usage: xsel [options]
Manipulate the X sele . . . (usage page goes on)
Tentu saja Anda bisa menggunakan pengalihan shell dengan xseluntuk menyiasatinya
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclipjuga menang dalam kenyataan bahwa Anda dapat menampilkan konten clipboard ke file (yang mungkin berguna ketika Anda ingin mengarahkan pemilihan PRIMARY, yaitu highlight). xselhanya menawarkan output ke stdout
xselhanya dapat beroperasi melalui STDIN / STDOUT, sementara xclipjuga dapat menggunakan file nyata di sana? Betapa membosankan! Yah, saya berteman dengan xselbeberapa waktu lalu dan dapat hidup dengan menggunakan pengalihan shell ke file, jadi saya akan terus menggunakannya.
xcliphari ini dan bertanya-tanya apakah itu pilihan yang tepat. Jawaban Anda mengonfirmasi itu karena saya membuat file dari clipboard untuk digunakan dengan diffperintah. +1 Terima kasih :)
Selain jawaban @Serg , ada informasi dari halaman Tmux di Arch Wiki yang dapat berguna dalam beberapa kasus tertentu :
tidak seperti xsel, [xclip] 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 dengan mengarahkan STDOUT dari xclip ke / dev / null
xclip adalah masalah besar jika Anda menjumpainya. Saya membuang waktu 2 jam untuk men-debug-nya. Saya akhirnya beralih ke xsel -bidan xsel -bo.
Hal lain yang perlu diingat, xselmemiliki lebih sedikit ketergantungan daripada xclip:
# apt-cache depends xsel
xsel
Depends: libc6
Depends: libx11-6
Conflicts: xsel:i386
# apt-cache depends xclip
xclip
Depends: libc6
Depends: libx11-6
Depends: libxmu6
Conflicts: xclip:i386
Gunakan xclip, karena xseltidak bisa mengekstrak data biner dari clipboard, seperti screenshost. Misalnya, simpan tangkapan layar ke clipboard:
$ maim -s | xclip -selection clipboard -t image/png
Kemudian simpan ke file dan bandingkan output:
$ xclip -o -selection clipboard > 1xclip
$ xsel -o --clipboard > 1xsel
$ ls -go 1*
-rw-rw-r-- 1 11948 Sep 26 20:13 1xclip
-rw-rw-r-- 1 0 Sep 26 20:13 1xsel
xcliptidak selalu selalu dapat menangani data biner baik, misalnya ketika menggunakan tombol "Salin ke clipboard" dari gnome-tangkapan layar saya tidak mendapatkan hasil sama sekali. Saat menyalin gambar dengan Ctrl + C dari mis. Dokumen LibreOffice, itu hanya berfungsi jika saya secara manual menentukan jenis target seperti xclip -o -t image/png -selection clipboard.
gnome-screenshotsama sekali, tapi itu masalah lain - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Ada satu alasan lain untuk menggunakan xclip over xsel - xclip dapat memanipulasi cut buffer 0, dengan melewati -selection buffer-cut, yang tidak bisa dilakukan xsel.
Relatif mudah untuk memungkinkannya memanipulasi buffer cut lainnya juga; ini patch saya, meskipun tidak teruji dengan baik dan tidak ada jaminan.
diff --git a/xclip.c b/xclip.c
index 5fc760cb7..eeb05f662 100644
--- a/xclip.c
+++ b/xclip.c
@@ -35,11 +35,12 @@
#include "xclib.h"
/* command line option table for XrmParseCommand() */
-XrmOptionDescRec opt_tab[14];
+XrmOptionDescRec opt_tab[15];
/* Options that get set on the command line */
int sloop = 0; /* number of loops */
char *sdisp = NULL; /* X display to connect to */
+int bufnum = 0; /* Cut buffer number to use */
Atom sseln = XA_PRIMARY; /* X selection to work with */
Atom target = XA_STRING;
@@ -165,6 +166,9 @@ doOptSel(void)
break;
case 'b':
sseln = XA_STRING;
+ if (XrmGetResource(opt_db, "xclip.buffer", "Xclip.Buffer", &rec_typ, &rec_val)) {
+ bufnum = atoi(&rec_val.addr[0]);
+ }
break;
}
@@ -177,8 +181,10 @@ doOptSel(void)
fprintf(stderr, "XA_SECONDARY");
if (sseln == XA_CLIPBOARD(dpy))
fprintf(stderr, "XA_CLIPBOARD");
- if (sseln == XA_STRING)
+ if (sseln == XA_STRING) {
fprintf(stderr, "XA_STRING");
+ fprintf(stderr, "\nUsing buffer number %d", bufnum);
+ }
fprintf(stderr, "\n");
}
@@ -276,7 +282,7 @@ doIn(Window win, const char *progname)
/* Handle cut buffer if needed */
if (sseln == XA_STRING) {
- XStoreBuffer(dpy, (char *) sel_buf, (int) sel_len, 0);
+ XStoreBuffer(dpy, (char *) sel_buf, (int) sel_len, bufnum);
return EXIT_SUCCESS;
}
@@ -445,7 +451,7 @@ doOut(Window win)
unsigned int context = XCLIB_XCOUT_NONE;
if (sseln == XA_STRING)
- sel_buf = (unsigned char *) XFetchBuffer(dpy, (int *) &sel_len, 0);
+ sel_buf = (unsigned char *) XFetchBuffer(dpy, (int *) &sel_len, bufnum);
else {
while (1) {
/* only get an event if xcout() is doing something */
@@ -595,6 +601,11 @@ main(int argc, char *argv[])
opt_tab[13].argKind = XrmoptionNoArg;
opt_tab[13].value = (XPointer) xcstrdup(ST);
+ opt_tab[14].option = xcstrdup("-buffer");
+ opt_tab[14].specifier = xcstrdup(".buffer");
+ opt_tab[14].argKind = XrmoptionSepArg;
+ opt_tab[14].value = (XPointer) NULL;
+
/* parse command line options */
doOptMain(argc, argv);