There пахал two command-line tools (in two different packages) to access the X clipboard:
xclip
xsel
I would love to know the difference between those two and hear в recommendation which one to использовал in which вступи в брак.
И xclip
и xsel
может сохранить текст в 3 различных выбора (по умолчанию, это - основной выбор). На основе опыта я знаю, что основной выбор в основном, что Вы выделяете и выпущенный средним щелчком мышью (который соответствует нажатию обеих правых и левых сенсорных панелей, включают ноутбук). Буфером обмена является традиционный Ctrl V .
Путем исследования эти 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
В дополнение к ответу @Serg , существует информация от страница Tmux в дуге Wiki , которая может быть полезной приблизительно в конкретные случаи :
в отличие от xsel это [xclip] работает лучше над печатью необработанного битового потока, который не соответствует текущей локали. Тем не менее, это более опрятно для использования xsel вместо xclip, потому что xclip не закрывает STDOUT после того, как это читало из буфера tmux. По сути, tmux не знает, что задача копии завершилась и продолжает ожидать завершения xclip, таким образом, представляя tmux безразличный. Обходное решение должно перенаправить STDOUT xclip к/dev/null
Что-то еще для учета, 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
не может извлечь двоичные данные из буфера обмена, такие как screenshost. Например, сохраните снимок экрана к буферу обмена:
$ 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 по xsel – 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);
Для меня xclip
позволит zsh shell выйти
очень медленно при использовании guake
.
Как выполнить команду: $ pwd | xclip -выбор c
.
Затем запустите $ exit
, чтобы выйти из оболочки.
$ exit
нужно несколько секунд, чтобы выйти.
xsel
хорошо справляется с этой ситуацией.