Ada dua alat baris perintah (dalam dua paket berbeda) untuk mengakses papan klip X:
xclip
xsel
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:
xclip
xsel
Saya akan senang mengetahui perbedaan antara keduanya dan mendengar rekomendasi mana yang harus digunakan dalam hal ini.
Jawaban:
Keduanya xclip
dan xsel
dapat 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 man
halaman untuk keduanya, saya telah menemukan bahwa xclip
menang 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 xsel
untuk menyiasatinya
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclip
juga menang dalam kenyataan bahwa Anda dapat menampilkan konten clipboard ke file (yang mungkin berguna ketika Anda ingin mengarahkan pemilihan PRIMARY, yaitu highlight). xsel
hanya menawarkan output ke stdout
xsel
hanya dapat beroperasi melalui STDIN / STDOUT, sementara xclip
juga dapat menggunakan file nyata di sana? Betapa membosankan! Yah, saya berteman dengan xsel
beberapa waktu lalu dan dapat hidup dengan menggunakan pengalihan shell ke file, jadi saya akan terus menggunakannya.
xclip
hari ini dan bertanya-tanya apakah itu pilihan yang tepat. Jawaban Anda mengonfirmasi itu karena saya membuat file dari clipboard untuk digunakan dengan diff
perintah. +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 -bi
dan xsel -bo
.
Hal lain yang perlu diingat, xsel
memiliki 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 xsel
tidak 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
xclip
tidak 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-screenshot
sama 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);