एक्स क्लिपबोर्ड तक पहुंचने के लिए दो कमांड-लाइन टूल (दो अलग-अलग पैकेजों में) हैं:
xclip
xsel
मैं उन दोनों के बीच अंतर जानना पसंद करूंगा और एक सिफारिश सुनूंगा कि कौन से मामलों में उपयोग करना है।
एक्स क्लिपबोर्ड तक पहुंचने के लिए दो कमांड-लाइन टूल (दो अलग-अलग पैकेजों में) हैं:
xclip
xsel
मैं उन दोनों के बीच अंतर जानना पसंद करूंगा और एक सिफारिश सुनूंगा कि कौन से मामलों में उपयोग करना है।
जवाबों:
दोनों xclip
और xsel
में पाठ स्टोर कर सकते हैं 3 अलग चयन (डिफ़ॉल्ट रूप से यह प्राथमिक चयन है)। अनुभव से मुझे पता है कि प्राथमिक चयन मूल रूप से आप उच्च-प्रकाश है और मध्य माउस क्लिक के साथ जारी किया गया है (जो लैपटॉप पर दाएं और बाएं टचपैड कुंजी को दबाने के लिए संगत है)। क्लिपबोर्ड पारंपरिक है CtrlV।
man
हालाँकि, दोनों के लिए पृष्ठों की जांच करके , मुझे पता चला है कि xclip
एक पहलू में जीतता है - एक इनपुट फ़ाइल से पढ़ना:
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)
बेशक आप शेल पुनर्निर्देशन का उपयोग xsel
उस के आसपास पाने के लिए कर सकते हैं
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclip
इस तथ्य में भी जीत है कि आप क्लिपबोर्ड की सामग्री को फाइल करने के लिए आउटपुट कर सकते हैं (जो कि संभवतः तब उपयोगी होता है जब आप प्राथमिक चयन, यानी हाइलाइट को पुनर्निर्देशित करना चाहते हैं)। xsel
stdout को केवल आउटपुट प्रदान करता है
xsel
केवल STDIN / STDOUT के माध्यम से काम कर सकते हैं, जबकि xclip
वहाँ भी असली फ़ाइलों का उपयोग कर सकते हैं? कितना उबाऊ है! ठीक है, मैंने xsel
कुछ समय पहले दोस्त बनाए थे और शेल पुनर्निर्देशन के साथ फ़ाइलों का उपयोग करके रह सकते हैं, इसलिए मैं इसका उपयोग करता रहूंगा।
xclip
आज स्थापित किया और सोचा कि क्या यह सही विकल्प है। आपके उत्तर की पुष्टि हुई क्योंकि मैं क्लिपबोर्ड से diff
कमांड के साथ उपयोग करने के लिए फाइल बना रहा था । +1 धन्यवाद :)
@ शेर के जवाब के अलावा , आर्क विकी में Tmux पेज से जानकारी का एक टुकड़ा है जो कुछ विशिष्ट कार्यों में उपयोगी हो सकता है :
xsel के विपरीत [xclip] कच्चे बिटस्ट्रीम को प्रिंट करने में बेहतर काम करता है जो वर्तमान लोकेल में फिट नहीं होता है। फिर भी, यह xclip के बजाय xsel का उपयोग करने के लिए neater है, क्योंकि tmux के बफर से पढ़े जाने के बाद xl STDOUT को बंद नहीं करता है । इस प्रकार, tmux को पता नहीं है कि प्रतिलिपि कार्य पूरा हो गया है, और xclip की समाप्ति की प्रतीक्षा करना जारी रखता है, जिससे tmux अप्रतिसादी हो जाता है। एक वर्कअराउंड STDOUT xclip को / dev / null में रीडायरेक्ट करना है
xclip
यदि आप इसे मुठभेड़ एक बड़ी समस्या है। मैंने इसे डीबग करने में 2 घंटे बर्बाद किए। मैं अंत में xsel -bi
और करने के लिए बंद कर दिया xsel -bo
।
ध्यान में रखने के लिए कुछ और, xsel
निर्भरता कम से कम है 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
उपयोग करें xclip
, क्योंकि xsel
क्लिपबोर्ड से बाइनरी डेटा को नहीं निकाला जा सकता है, जैसे कि स्क्रीनहोस्ट। उदाहरण के लिए, स्क्रीनशॉट को क्लिपबोर्ड पर सहेजें:
$ maim -s | xclip -selection clipboard -t image/png
फिर फ़ाइल को सहेजें और आउटपुट की तुलना करें:
$ 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
जरूरी नहीं कि हमेशा बाइनरी डेटा को संभालने में सक्षम हो, उदाहरण के लिए, जब gnome- स्क्रीनशॉट से "कॉपी टू क्लिपबोर्ड" बटन का उपयोग कर मुझे कोई आउटपुट नहीं मिलता है। जब एक लिब्रे ऑफिस डॉक्यूमेंट से Ctrl + C के साथ एक इमेज कॉपी करते हैं, तो यह केवल तभी काम करता है जब मैं मैन्युअल रूप से लक्ष्य प्रकार निर्दिष्ट करता हूं xclip -o -t image/png -selection clipboard
।
gnome-screenshot
, लेकिन यह एक और मुद्दा है - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Xsel पर xclip का उपयोग करने का एक अन्य कारण है - xclip कट बफर 0 में हेरफेर कर सकता है, पास करके -selection buffer-cut
, जो xsel नहीं कर सकता।
अन्य कट बफ़र्स को भी हेरफेर करने की अनुमति देना अपेक्षाकृत आसान है; यहाँ मेरा पैच है, हालांकि यह अच्छी तरह से परीक्षण नहीं है और बिना किसी गारंटी के साथ आता है।
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);