也许你也有过这样的经历——有时候,当你从某个网页复制文本到你最喜爱的网络邮件客户端的富文本电子邮件草稿中时,你不喜欢被粘贴的片段有不同的字体/大小/重量...它似乎记住了风格(通常是选中的图片)。那么,如果你将相同的东西粘贴到像Vim这样的文本编辑器中,为什么没有HTML,只有纯文本呢?
看起来剪贴板以各种格式维护所选数据。如何以任何一种格式访问数据(通过编程或某些实用程序)?X11剪贴板是如何工作的?
也许你也有过这样的经历——有时候,当你从某个网页复制文本到你最喜爱的网络邮件客户端的富文本电子邮件草稿中时,你不喜欢被粘贴的片段有不同的字体/大小/重量...它似乎记住了风格(通常是选中的图片)。那么,如果你将相同的东西粘贴到像Vim这样的文本编辑器中,为什么没有HTML,只有纯文本呢?
看起来剪贴板以各种格式维护所选数据。如何以任何一种格式访问数据(通过编程或某些实用程序)?X11剪贴板是如何工作的?
你从中复制的应用程序会展示它可以提供的格式(大多数由MIME类型标识)。你粘贴到的应用程序必须选择其首选格式并从源应用程序请求该格式。
你可能无法看到所有样式信息的原因是,应用程序不支持包含样式信息的常见格式。
你还可能遇到问题,因为应用程序可能尝试粘贴HTML,但实际上无法处理所有HTML。或者应用程序可能存在漏洞,或者可能无法达成对特定MIME类型的真正意义的共识。
当然,几乎所有应用程序都可以复制和粘贴纯文本,但除此之外就不确定了。如果你没有得到似乎有意义的内容,你可以向其中一个应用程序提交错误报告。
你可能会注意到,如果你退出正在复制的应用程序,你将无法再次粘贴。(除非你运行一个“剪贴板管理器”或类似工具。)这是因为在目标应用程序请求要粘贴的格式之前,没有数据实际离开源应用程序。
有“剪贴板管理器”会立即请求任何时候复制的数据并存储该数据,以便在源应用程序退出后粘贴,但它们也有缺点(如果数据很大或以10种格式提供怎么办等)。
以下Python代码将显示当前复制数据的可用格式,如果你安装了pygtk。该应用程序显示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()))
xclip
列出目标(格式)的一行代码:xclip -selection clipboard -target TARGETS -out
。 - Vladimir Panteleev由于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