X11剪贴板如何处理多种数据格式?

时间:2010-08-26 00:08:16

标签: text clipboard x11 xorg

它可能也发生在您身上 - 有时当您将某个网页中的文本复制到您喜爱的网络邮件客户端中的富文本电子邮件草稿时,您不喜欢粘贴的片段有不同的字体/大小/重量..它以某种方式记住风格(通常是图像,选中时)。如果将它粘贴到你最喜欢的文本编辑器(如Vim)中,没有HTML,只有纯文本,那该怎么办?

alt text

剪贴板似乎以各种格式维护所选数据。如何以任何一种格式(以编程方式或使用某些实用程序)访问数据? X11剪贴板是如何工作的?

2 个答案:

答案 0 :(得分:27)

您从广告格式(通常由MIME类型标识)中复制的应用程序可以提供。您粘贴的应用必须选择其首选格式,并从源应用中请求该格式。

您可能看不到所有传送的样式信息的原因是应用程序不支持包含样式信息的通用格式。

您还可以看到问题,因为应用可能会尝试粘贴HTML,但实际上无法处理所有HTML。或者应用程序可能有问题,或者可能不同意特定MIME类型的真正含义。

当然,几乎所有应用都可以复制和粘贴纯文本,但除此之外,它还可以触摸和移动。如果你没有得到似乎有意义的东西,你可以提交一个错误与其中一个应用程序。

您可能会注意到,如果您退出要复制的应用,则无法再粘贴。 (除非您正在运行“剪贴板管理器”或其他东西。)这是因为在目标应用程序要求格式粘贴之前,没有数据实际离开源应用程序。 有“剪贴板管理器”可以在您复制和存储数据时立即请求数据,因此您可以在源应用程序退出后粘贴,但它们有缺点(如果数据很大,或者以10种格式提供,等等)。 )

如果安装了pygtk,以下python代码将显示当前复制数据的可用格式。这个应用程序显示ctrl + c复制的数据,而不是中间点击复活节彩蛋。 (见http://freedesktop.org/wiki/Specifications/ClipboardsWiki

#!/usr/bin/python

import gtk;
clipboard = gtk.clipboard_get()
print("Current clipboard offers formats: " + str(clipboard.wait_for_targets()))

答案 1 :(得分:0)

由于PyGTK中的API更改,Havoc P的答案中显示当前剪贴板格式的代码遗憾地不再起作用。这是一个单行的更新版本:

python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk, Gdk; print(*Gtk.Clipboard.get(Gdk.atom_intern("CLIPBOARD", True)).wait_for_targets()[1], sep = "\n")'

在Arch Linux中,您可以使用sudo pacman -S pygtk安装PyGTK。

下面是一些示例。

Chrome中的文字:

TIMESTAMP
TARGETS
SAVE_TARGETS
MULTIPLE
STRING
UTF8_STRING
TEXT
text/html
text/plain

来自Gnome终端的文本:

TIMESTAMP
TARGETS
MULTIPLE
SAVE_TARGETS
UTF8_STRING
COMPOUND_TEXT
TEXT
STRING
text/plain;charset=utf-8
text/plain