36

如何从 X 剪贴板中获取富文本或 HTML 源代码?例如,如果您从网络浏览器复制一些文本并将其粘贴到 kompozer,它会粘贴为 HTML,并保留链接等。但是,相同选择的 xclip -o 仅输出纯文本,并以类似于elinks -dump. 我想将 HTML 拉出并放入文本编辑器(特别是vim)。

我在 superuser.com 上问了同样的问题,因为我希望有一个实用程序可以做到这一点,但我没有得到任何有用的回复。X 剪贴板 API 对我来说是一头神秘的野兽;任何关于破解某些东西以获取此信息的提示都非常受欢迎。这些天我选择的语言是 Python,但几乎任何东西都可以。

4

3 回答 3

56

为了补充@rkhayrov 的答案,已经有一个命令:xclip。或者更准确地说,有一个补丁xclip在 2010 年晚些时候添加到xclip其中,但尚未发布。因此,假设您的操作系统(如 Debian)附带xclip2019 年编辑:具有这些更改的0.13 版 最终于 2016 年发布(并于 2019 年 1 月进入 Debian )):

要列出 CLIPBOARD 选择的目标:

$ xclip -selection clipboard -o -t TARGETS
TIMESTAMP
TARGETS
MULTIPLE
SAVE_TARGETS
text/html
text/_moz_htmlcontext
text/_moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXT
STRING
text/x-moz-url-priv

要选择特定目标:

$ xclip -selection clipboard -o -t text/html
 <a href="https://stackoverflow.com/users/200540/rkhayrov" title="3017 reputation" class="comment-user">rkhayrov</a>
$ xclip -selection clipboard -o -t UTF8_STRING
 rkhayrov
$ xclip -selection clipboard -o -t TIMESTAMP
684176350

并且xclip还可以设置和拥有一个选择(-i而不是-o)。

于 2013-06-06T10:55:18.007 回答
25

在 X11 中,您必须与选择所有者沟通,询问支持的格式,然后请求特定格式的数据。我认为最简单的方法是使用现有的窗口工具包。例如。使用 Python 和 GTK:

#!/usr/bin/python

import glib, gtk

def test_clipboard():
    clipboard = gtk.Clipboard()
    targets = clipboard.wait_for_targets()
    print "Targets available:", ", ".join(map(str, targets))
    for target in targets:
        print "Trying '%s'..." % str(target)
        contents = clipboard.wait_for_contents(target)
        if contents:
            print contents.data

def main():
    mainloop = glib.MainLoop()
    def cb():
        test_clipboard()
        mainloop.quit()
    glib.idle_add(cb)
    mainloop.run()

if __name__ == "__main__":
    main()

输出将如下所示:

$ ./clipboard.py 
Targets available: TIMESTAMP, TARGETS, MULTIPLE, text/html, text/_moz_htmlcontext, text/_moz_htmlinfo, UTF8_STRING, COMPOUND_TEXT, TEXT, STRING, text/x-moz-url-priv
...
Trying 'text/html'...
I asked <a href="http://superuser.com/questions/144185/getting-html-source-or-rich-text-from-the-x-clipboard">the same question on superuser.com</a>, because I was hoping there was a utility to do this, but I didn't get any informative responses.
Trying 'text/_moz_htmlcontext'...
<html><body class="question-page"><div class="container"><div id="content"><div id="mainbar"><div id="question"><table><tbody><tr><td class="postcell"><div><div class="post-text"><p></p></div></div></td></tr></tbody></table></div></div></div></div></body></html>
...
Trying 'STRING'...
I asked the same question on superuser.com, because I was hoping there was a utility to do this, but I didn't get any informative responses.
Trying 'text/x-moz-url-priv'...
http://stackoverflow.com/questions/3261379/getting-html-source-or-rich-text-from-the-x-clipboard
于 2010-07-16T09:48:23.710 回答
3

扩展 Stephane Chazelas 的想法,您可以:

  • 从格式化的源复制。
  • 运行此命令以从剪贴板中提取,转换为 HTML,然后(使用管道|)将该 HTML 放回剪贴板,再次使用相同的xclip
xclip -selection clipboard -o -t text/html | xclip -selection clipboard
  • 接下来,当您使用Ctrl+粘贴时v,它将粘贴 HTML 源代码。

更进一步,您可以将其设为快捷方式,这样您就不必每次都打开终端并运行确切的命令。✨</p>

要做到这一点:

  • 打开您的操作系统的设置(在我的情况下是 Ubuntu)
  • 找到键盘部分
  • 然后找到快捷方式部分
  • 创建一个新的快捷方式
  • 设置名称,例如:Copy as HTML
  • 然后作为快捷方式的命令,输入:
bash -c "xclip -selection clipboard -o -t text/html | xclip -selection clipboard"

注意:请注意,它与上面的命令相同,但放在内联 Bash 脚本中。这是能够使用|(管道)将一个命令的输出作为输入发送到下一个命令所必需的。

  • 将快捷方式设置为您想要的任何组合,最好不要覆盖您使用的另一个快捷方式。就我而言,我将其设置为:Ctrl+ Shift+c

  • 在此之后,您可以像往常一样复制一些格式化的文本:Ctrl+c
  • 然后,在粘贴之前,将其转换为 HTML :Ctrl++Shiftc
  • 接下来,当您使用: Ctrl+粘贴它时v,它会将内容粘贴为 HTML。✨</li>

快捷方式编辑窗口

于 2021-01-02T14:46:48.023 回答