Es gibt zwei Befehlszeilentools (in zwei verschiedenen Paketen), um auf die X-Zwischenablage zuzugreifen:
xclip
xsel
Ich würde gerne den Unterschied zwischen diesen beiden kennen und eine Empfehlung hören, welche in welchen Fällen zu verwenden ist.
Es gibt zwei Befehlszeilentools (in zwei verschiedenen Paketen), um auf die X-Zwischenablage zuzugreifen:
xclip
xsel
Ich würde gerne den Unterschied zwischen diesen beiden kennen und eine Empfehlung hören, welche in welchen Fällen zu verwenden ist.
Antworten:
Beide xclip
und xsel
können Text in 3 verschiedenen Auswahlen speichern (standardmäßig ist dies die primäre Auswahl). Aus Erfahrung weiß ich, dass die primäre Auswahl im Grunde das ist, was Sie hervorheben und mit dem mittleren Mausklick freigeben (was dem Drücken der rechten und linken Touchpad-Taste auf einem Laptop entspricht). Die Zwischenablage ist die traditionelle CtrlV.
Beim Durchsuchen der man
Seiten für beide habe ich jedoch festgestellt, dass xclip
ein Aspekt von Vorteil ist: das Lesen aus einer Eingabedatei:
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)
Natürlich können Sie die Shell-Umleitung mit verwenden xsel
, um das zu umgehen
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclip
Es gewinnt auch daran, dass Sie den Inhalt der Zwischenablage in eine Datei ausgeben können (was möglicherweise nützlich ist, wenn Sie die PRIMARY-Auswahl umleiten möchten, dh Markierungen). xsel
bietet nur die Ausgabe auf stdout an
xsel
das nur über STDIN / STDOUT funktioniert, während dort xclip
auch echte Dateien verwendet werden können? Wie langweilig! Nun, ich habe mich mit vor xsel
einiger Zeit angefreundet und kann mit der Verwendung von Shell-Umleitungen zu Dateien leben, also werde ich das auch weiterhin verwenden.
xclip
heute installiert und mich gefragt, ob es die richtige Wahl war. Ihre Antwort wurde bestätigt, da ich eine Datei aus der Zwischenablage erstelle, die mit dem diff
Befehl verwendet werden soll. +1 Danke :)
Zusätzlich zur @ Serg- Antwort gibt es eine Information von der Tmux-Seite im Arch-Wiki , die in bestimmten Fällen nützlich sein kann :
Im Gegensatz zu xsel funktioniert [xclip] besser beim Drucken von unformatiertem Bitstream, der nicht zum aktuellen Gebietsschema passt. Trotzdem ist es sinnvoller, xsel anstelle von xclip zu verwenden, da xclip STDOUT nicht schließt, nachdem es aus dem Puffer von tmux gelesen hat. Daher weiß tmux nicht, dass der Kopiervorgang abgeschlossen ist, und wartet weiterhin auf die Beendigung von xclip, wodurch tmux nicht mehr reagiert. Eine Problemumgehung besteht darin, STDOUT von xclip nach / dev / null umzuleiten
xclip
ist ein großes Problem, wenn Sie darauf stoßen. Ich habe 2 Stunden mit dem Debuggen verbracht. Ich habe endlich zu xsel -bi
und gewechselt xsel -bo
.
Etwas anderes zu beachten, xsel
hat weniger Abhängigkeiten als 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
Verwenden Sie xclip
, weil xsel
nicht binäre Daten aus der Zwischenablage extrahiert werden können, z. B. Bildschirmhost. Speichern Sie beispielsweise den Screenshot in der Zwischenablage:
$ maim -s | xclip -selection clipboard -t image/png
Dann in Datei speichern und Ausgabe vergleichen:
$ 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
das auch nicht immer mit Binärdaten umgehen kann, zB wenn ich den "In Zwischenablage kopieren" -Button von gnome-screenshot benutze, bekomme ich überhaupt keine Ausgabe. Wenn Sie ein Bild mit Strg + C aus einem LibreOffice-Dokument kopieren, funktioniert dies nur, wenn Sie den Zieltyp wie manuell angeben xclip -o -t image/png -selection clipboard
.
gnome-screenshot
, aber das ist ein weiteres Problem - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Es gibt noch einen weiteren Grund, xclip anstelle von xsel zu verwenden: xclip kann den Schnittpuffer 0 durch Übergabe manipulieren -selection buffer-cut
, was xsel nicht kann.
Es ist relativ einfach zuzulassen, dass es auch die anderen Schnittpuffer manipuliert. Hier ist mein Patch, obwohl er nicht gut getestet ist und keine Garantie bietet.
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);