【发布时间】:2019-04-09 13:29:41
【问题描述】:
我正在寻找一种解决方案,将复制到剪贴板(粘贴板)的富文本自动转换为 Hammerspoon(lua 代码)中的纯文本。
我知道如何在 lua 中访问粘贴板,但不知道如何将此操作绑定到复制或粘贴事件以使其自动化(也不知道如何将内容转换为纯文本)。
local pasteboard = require("hs.pasteboard")
【问题讨论】:
标签: lua hammerspoon
我正在寻找一种解决方案,将复制到剪贴板(粘贴板)的富文本自动转换为 Hammerspoon(lua 代码)中的纯文本。
我知道如何在 lua 中访问粘贴板,但不知道如何将此操作绑定到复制或粘贴事件以使其自动化(也不知道如何将内容转换为纯文本)。
local pasteboard = require("hs.pasteboard")
【问题讨论】:
标签: lua hammerspoon
最简单的方法是使用here 描述的答案来获取粘贴板中的 RTF 数据并将数据通过管道传输到已经可用的
textutil 命令将其转换为纯文本到标准输出:
osascript -e 'the clipboard as «class RTF »' | \
perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' | \
textutil -stdin -stdout -convert txt
然后我们可以在 Hammerspoon 环境中使用 hs.execute 运行 shell 命令并返回转换后的值,所以在你的 Lua 代码中它很简单:
local text = hs.execute([[
osascript -e 'the clipboard as «class RTF »' | \
perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' | \
textutil -stdin -stdout -convert txt
]])
仅供参考,Hammerspoon API 确实允许您使用 hs.pasteboard.readDataForUTI 使用 "public.rtf" UTI 从粘贴板检索 RTF 数据,因此从技术上讲,您可以在 Lua 中完成所有这些操作,但您必须自己手动转换 RTF 数据。
【讨论】:
the clipboard as text,那么您肯定不需要 Perl 或 textutil。但是,正如您所说,您可能不需要 AppleScript。我想如果一个人复制一些富文本然后使用hs.pasteboard.contentTypes()查看可用的内容类型,如果"public.rtf"在其中,那么"public.plain-text"可能也是,所以你应该只阅读那个尿路感染。我认为整个解决方案就是hs.pasteboard.readDataForUTI("public.plain-text")。
hs.osascript 函数而不是 hs.execute。我们的目标不应该是使用尽可能多的不同程序和语言,因为它很容易变得非常昂贵,并且会减慢速度。