Il existe deux outils de ligne de commande (dans deux packages différents) pour accéder au presse-papiers X:
xclip
xsel
J'aimerais connaître la différence entre les deux et entendre une recommandation à utiliser dans quels cas.
Il existe deux outils de ligne de commande (dans deux packages différents) pour accéder au presse-papiers X:
xclip
xsel
J'aimerais connaître la différence entre les deux et entendre une recommandation à utiliser dans quels cas.
Réponses:
Les deux xclip
et xsel
peuvent stocker du texte dans 3 sélections différentes (par défaut, c'est la sélection principale). Par expérience, je sais que la sélection principale est essentiellement ce que vous mettez en surbrillance et que vous relâchez avec le clic du milieu de la souris (ce qui correspond à la pression des touches droite et gauche du pavé tactile sur un ordinateur portable). Le presse-papiers est le traditionnel CtrlV.
En examinant les man
pages pour les deux, cependant, j'ai découvert que cela xclip
gagnait un aspect - lire à partir d'un fichier d'entrée:
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)
Bien sûr, vous pouvez utiliser la redirection de shell avec xsel
pour contourner ce problème.
xieerqi:
$ xsel --clipboard < testfile.txt
xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found
xclip
gagne également dans le fait que vous pouvez exporter le contenu du presse-papier dans un fichier (ce qui est peut-être utile lorsque vous souhaitez rediriger la sélection PRIMARY, à savoir les surbrillances). xsel
offre uniquement la sortie sur stdout
xsel
vous ne pouvez utiliser que via STDIN / STDOUT, tout en xclip
utilisant des fichiers réels? Quel ennui! Eh bien, je me suis lié d’amitié xsel
il ya un certain temps et je peux vivre avec l’utilisation de redirections dans les fichiers, alors je vais continuer à l’utiliser.
xclip
aujourd'hui et je me suis demandé si c'était le bon choix. Votre réponse a confirmé que c’est parce que je crée un fichier à partir du presse-papiers à utiliser avec la diff
commande. +1 merci :)
En plus de la réponse @Serg , il existe une information de la page Tmux dans Arch Wiki qui peut être utile dans certains cas spécifiques :
contrairement à xsel, il [xclip] fonctionne mieux pour imprimer un flux de données brut qui ne correspond pas aux paramètres régionaux actuels. Néanmoins, il est préférable d'utiliser xsel au lieu de xclip, car xclip ne ferme pas STDOUT une fois qu'il a lu le tampon de tmux. En tant que tel, tmux ne sait pas que la tâche de copie est terminée et continue d'attendre la fin de xclip, rendant ainsi tmux inactif. Une solution de contournement consiste à rediriger STDOUT de xclip vers / dev / null
xclip
est un problème majeur si vous le rencontrez. J'ai perdu 2 heures à le déboguer. Je suis finalement passé à xsel -bi
et xsel -bo
.
Quelque chose d'autre à garder à l'esprit, xsel
a moins de dépendances que 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
Utilisez xclip
, car xsel
ne peut pas extraire des données binaires du presse-papiers, tels que screenshost. Par exemple, enregistrez la capture d'écran dans le presse-papiers:
$ maim -s | xclip -selection clipboard -t image/png
Puis sauvegarder dans un fichier et comparer le résultat:
$ 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
n'est pas nécessairement toujours capable de gérer des données binaires non plus, par exemple lorsque j'utilise le bouton "Copier dans le presse-papier" de gnome-screenshot, je ne reçois aucune sortie du tout. Lorsque vous copiez une image avec Ctrl + C à partir d'un document LibreOffice, par exemple, cela ne fonctionne que si je spécifie manuellement le type de cible, par exemple xclip -o -t image/png -selection clipboard
.
gnome-screenshot
tout, mais c'est un autre problème - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Il y a une autre raison d'utiliser xclip sur xsel - xclip peut manipuler le tampon de coupe 0, en passant -selection buffer-cut
, ce que xsel ne peut pas faire.
Il est relativement facile de lui permettre de manipuler également les autres tampons de coupe; Voici mon patch, bien que ce n’est pas bien testé et qu’il n’ya aucune garantie.
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);