代码之家  ›  专栏  ›  技术社区  ›  mykhal

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

  •  30
  • mykhal  · 技术社区  · 14 年前

    这可能也发生在你身上——有时,当你把某个网页上的文本复制到你最喜欢的webmail客户端中的富文本电子邮件草稿中时,你不喜欢粘贴 字体/大小/粗细不同。。它会以某种方式记住样式(通常是选中时的图像)。如果你把它粘贴到你最喜欢的文本编辑器中,比如Vim,没有HTML,只有纯文本,那会怎么样?

    alt text

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

    1 回复  |  直到 14 年前
        1
  •  35
  •   Havoc P    14 年前

    你从中复制的应用可以提供广告格式(主要由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()))
    
        2
  •  2
  •   ZimbiX    5 年前

    PyGTK . 以下是一个更新版本作为一行:

    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")'

    sudo pacman -S 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