X panosuna erişmek için iki komut satırı aracı (iki farklı pakette) vardır:
xclip
xsel
Bu ikisi arasındaki farkı bilmek isterdim ve hangisinin hangi durumlarda kullanılacağına dair bir öneri duydum.
X panosuna erişmek için iki komut satırı aracı (iki farklı pakette) vardır:
xclip
xsel
Bu ikisi arasındaki farkı bilmek isterdim ve hangisinin hangi durumlarda kullanılacağına dair bir öneri duydum.
Yanıtlar:
Her ikisi de xclip
ve xsel
metni 3 farklı seçime kaydedebilir (varsayılan olarak birincil seçimdir). Tecrübelerden, birincil seçimin temel olarak orta ışıkta klikleyeceğiniz ve bıraktığınız şey olduğunu biliyorum (bu, bir dizüstü bilgisayarda hem sağ hem de sol dokunmatik tuşa basmaya karşılık gelir). Pano gelenekseldir CtrlV.
man
Her ikisinin de sayfalarını inceleyerek, bunun xclip
bir yönden kazandığını keşfettim - bir girdi dosyasından okuma:
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)
Elbette xsel
bunun etrafında gezinmek için kabuk yönlendirme kullanabilirsiniz .
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclip
ayrıca, pano içeriğini dosyaya yazdırabileceğiniz gerçeğini de kazanır (bu da PRIMARY seçimini yönlendirmek istediğinizde faydalıdır, yani vurgulamalar yapar). xsel
sadece stdout'a çıktı sunar
xsel
sadece STDIN / STDOUT ile çalışabiliyorken xclip
gerçek dosyaları da kullanabiliyor olmanın dışında bir fark yok. Ne kadar sıkıcı! xsel
Bir süre önce arkadaş edindim ve dosyalara kabuk yönlendirmeleri kullanarak yaşayabilirim, o yüzden kullanmaya devam edeceğim.
xclip
Bugün kurdum ve doğru seçim olup olmadığını merak ettim. Cevabınız, diff
komutla kullanmak için panodan dosya oluşturduğumdu . +1 Thanks :)
@Serg cevabına ek olarak , Arch Wiki'deki Tmux sayfasından bazı özel durumlarda yararlı olabilecek bir bilgi parçası var :
xsel'den farklı olarak, [xclip] geçerli yerel ayara uymayan ham bit akışını yazdırmada daha iyi çalışır. Bununla birlikte, xclip yerine xsel kullanmak daha düzenlidir, çünkü xclip , tmux'un tampon belleğinden okuduktan sonra STDOUT'u kapatmaz . Bu nedenle, tmux kopyalama görevinin tamamlandığını bilmez ve xclip'in sonlandırılmasını beklemeye devam eder, bu nedenle tmux'u yanıt vermiyor. Bir çözüm, xclip'in STDOUT'unu / dev / null dizinine yönlendirmektir.
xclip
, karşılaşırsanız büyük bir sorundur. 2 saat boyunca hata ayıklamakla harcadım. Sonunda xsel -bi
ve geçti xsel -bo
.
Akılda tutulması gereken başka bir şey, xsel
şunlardan daha az bağımlılığa sahiptir 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
Kullan xclip
, çünkü xsel
ekran verileri gibi panodaki ikili verileri çıkaramazsınız. Örneğin, ekran görüntüsünü panoya kaydedin:
$ maim -s | xclip -selection clipboard -t image/png
Sonra dosyaya kaydedin ve çıktıyı karşılaştırın:
$ 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
her zaman ikili veriyi her zaman idare edemeyeceğini biliyorum , örneğin gnome-ekran görüntüsündeki "Panoya kopyala" düğmesini kullanırken hiçbir çıktı alamıyorum. Ctrl + C ile bir görüntüyü örneğin bir LibreOffice Belgesinden kopyalarken, hedef türünü elle belirtirsem çalışır xclip -o -t image/png -selection clipboard
.
gnome-screenshot
hiç, ama bu başka bir konu var - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Xsel üzerinden xclip kullanmak için başka bir neden daha var - xclip, -selection buffer-cut
xsel'in yapamayacağı şekilde geçerek 0 tamponunu değiştirebilir .
Diğer kesme tamponlarını da manipüle etmesine izin vermek nispeten kolaydır; işte benim yamam, ancak iyi bir şekilde test edilmemiş ve hiçbir garantisi olmadan geliyor.
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);