回答:
両方でxclip
、3つの異なる選択にxsel
テキストを保存できます(デフォルトでは、プライマリ選択です)。経験から、基本選択は基本的に、ハイライト表示され、マウスの中央クリックでリリースされます(これはラップトップの左右のタッチパッドキーを押すことに相当します)。クリップボードは伝統的なものです。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選択、つまりハイライトをリダイレクトしたいときに便利です)。 xsel
標準出力への出力のみを提供します
xsel
STDIN / STDOUTを介してのみ操作できることと、そこでxclip
実際のファイルを使用できることを除いて、違いはありませんか?なんてつまらない!さて、私はxsel
少し前に友達を作り、ファイルへのシェルリダイレクトを使用して生きることができるので、それを使い続けます。
xclip
今日インストールし、それが正しい選択かどうか疑問に思いました。あなたの答えは、diff
コマンドで使用するクリップボードからファイルを作成しているためだと確認しました。+1ありがとう:)
@Sergの答えに加えて、特定の場合に役立つ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
screenshostなどのクリップボードからバイナリデータを抽出できない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-screenshotの[クリップボードにコピー]ボタンを使用すると、出力がまったく表示されません。LibreOfficeドキュメントなどからCtrl + Cで画像をコピーする場合、のようなターゲットタイプを手動で指定した場合にのみ機能しますxclip -o -t image/png -selection clipboard
。
gnome-screenshot
、それは別の問題です-gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
xsel上でxclipを使用する理由はもう1つあります。xclipは-selection buffer-cut
、xselができないを渡すことにより、カットバッファー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);