답변:
두 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
또한 클립 보드의 내용을 파일로 출력 할 수 있다는 사실에서 승리합니다 (이는 PRIMARY selection, 즉 하이라이트를 리디렉션 할 때 유용 할 수 있습니다). xsel
표준 출력으로 만 출력 제공
xsel
STDIN / STDOUT을 통해서만 작동 xclip
할 수 있고 실제 파일도 사용할 수 있다는 점을 제외하고는 차이가 없습니다 . 지루 해요! 글쎄, 나는 xsel
얼마 전에 친구를 사귀 었고 파일에 대한 쉘 리디렉션을 사용하여 살 수 있기 때문에 계속 사용할 것입니다.
xclip
오늘 설치 했고 그것이 올바른 선택인지 궁금했다. 귀하의 답변은 클립 보드에서 diff
명령 과 함께 사용할 파일을 만들고 있기 때문임을 확인했습니다 . +1 감사합니다 :)
@Serg answer 외에도 Arch Wiki 의 Tmux 페이지에는 특정 경우에 유용한 정보가 있습니다 .
xsel과 달리 [xclip]은 현재 로케일에 맞지 않는 원시 비트 스트림을 인쇄 할 때 더 잘 작동합니다. 그럼에도 불구하고 xclip은 tmux의 버퍼에서 읽은 후에 STDOUT 을 닫지 않기 때문에 xclip 대신 xsel을 사용하는 것이 더 좋습니다 . 따라서 tmux는 복사 작업이 완료되었음을 알지 못하고 xclip이 종료 될 때까지 계속 기다리므로 tmux가 응답하지 않습니다. 해결 방법은 xclip의 STDOUT을 / 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
캔 등 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
는 항상 gnome-screenshot에서 "클립 보드로 복사"버튼을 사용할 때 이진 데이터를 처리 할 수있는 것은 아닙니다. 출력이 전혀 없습니다. 예를 들어 LibreOffice Document에서 Ctrl + C를 사용하여 이미지를 복사 할 때 대상 유형을 수동으로 지정하는 경우에만 작동합니다 xclip -o -t image/png -selection clipboard
.
gnome-screenshot
못하지만 그것은 또 다른 문제입니다 -gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
xsel 대신 xclip을 사용해야하는 또 다른 이유가 있습니다. xclip은 xsel -selection buffer-cut
이 수행 할 수없는 을 전달하여 컷 버퍼 0을 조작 할 수 있습니다.
다른 컷 버퍼도 조작하는 것이 비교적 쉽습니다. 여기에 내 패치가 있지만 잘 테스트되지 않았으며 보장되지 않습니다.
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);