一直以来都在寻找一种能够在聊天时快速使用表情的方式,在 windows 平台下 qq 和 wechat 都是支持自定义表情快捷键的,用起来十分舒爽,但是切换到 mac os 之后,两款软件均不支持表情快捷键,而对于重度键盘党的我来说,要挪动正在敲击键盘的手去用触控板选择表情,这无疑是浪费时间且操作起来十分麻烦的。
最初是寄希望于腾讯官方能够在 mac os 下开放这个功能,但数次反馈之后无果,当然也可以理解,毕竟这是一个十分小众的需求,开发团队不会特意抽出时间来填补特殊人群的口味,那只好在这条路上继续探寻。
紧接着想在输入法上下文章,因为改版之后的搜狗输入法是能够将表情作为选项内置在输入框中的,看起来应该是能够做到的,只不过只支持搜狗平台上的表情包,也就意味着你需要维护一个自己的表情包项目,时刻上传到搜狗平台,当然也少不了审核,所以这也是行不通的,就没进行太多的尝试
再后来思路转换到找一款 mac 下的软件,这样我的需求同样可以得到满足,变换了许多关键词进行 google,好在终于找到了一款,名字叫做 Rocket, 类似名字的软件数不胜数,为了防止混淆就把软件官网贴在下面:
下载了试用版,的确非常爽,但默认只有一些 emoji 表情,想要添加自己的表情包,自然需要向作者付费然后解锁自己导入表情包的功能,也想着如果再找不到其他途径的话就来买一款这个来玩好了。
最后把目标转向了 Alfred 的 workflow,相信使用 mac 的用户都不会不知道这款神器,的确极大程度了增加了我的工作效率。最开始倒是没想着自己开发,毕竟如果有现成的 workflow,直接拿来用就好了,懒是程序员的信条好吧,但各种 workflow 托管平台都找遍了,只知道了一款看似不错的,地址同样附在下面:
代码托管在 github 上,完全开源,这个就十分友好嘛。不过下载使用了之后,发现也只支持 emoji,也曾尝试着想要改一下代码逻辑来使他支持普通的图片文件,但看了源码之后发现,内部有个文件将所有的 emoji 表情全部映射了,但图片完全做不到这一点啊。
确实是走投无路了,剩下的唯一办法就是自己开发了。
仿照 alfred-emoji-workflow 的流程了解了 workflow 的开发过程,并且也实现了能够在 alfred 中显示所有符合条件的图片条目,最后就剩将选中的图片拷贝到剪切板的步骤了。
然后这正是困扰我很久的步骤。
Alfred 默认的拷贝组件,只是将选中的图片路径拷贝到了剪切板中,在聊天框或其他文档中进行粘贴下来的也只是文件路径,什么嘛,根本不行。
不过在编写程式的过程中,发现 Alfred 支持 AppleScript 这种语言,也就是苹果系统级别的编程语言,检索了下,语法十分有趣,简直就像命令一样,看了一些示例发现没准能够搞定。
就在 google 中检索如何使用 AppleScript 将图片内容粘贴到剪切板,而不只是文件路径,也确实找到了一个网站:
文章大意是用一般思路来拷贝文件内容是行不通的,pbcopy 命令也不行,所以就只能借助 AppleScript 来告诉 Preview 执行 command + c 进行拷贝,然后再把 Preview 关闭,整个过程都由脚本来完成,听起来不错,就代码拷贝下来调试了一下:
on run argv
tell application "Preview"
activate
open item 1 of argv
end tell
tell application "System Events"
tell process "Preview"
keystroke "c" using command down
end tell
end tell
tell application "Preview" to quit
end run
确实成功了!但美中不足有些问题:
- 其一是整个过程很晃眼,打开Preview,复制文件,再关闭,整个流程都是在眼底下发生的,前前后后大概有几秒钟的时间,当然相比较之前使用表情的方式确实是增速不少
- 就是在这个过程中最好不要进行其他操作,不然可能会导致文件复制不成功
- 就是不支持 gif,因为 Preview 打开 gif 后进行拷贝的操作结果只是拷贝其中的一帧
有了 Preview 解决的思路后,自然很好联想到直接在 Finder 中选中该文件,然后进行同样的逻辑,恩,所以就改了一版:
set thePath to POSIX file (item 1 of argv)
tell application "Finder"
reveal thePath
activate
end tell
tell application "System Events"
tell process "Finder"
keystroke "c" using command down
keystroke "w" using command down
end tell
end tell
好了,现在也支持 gif 文件的拷贝了,不仅仅是 jpg,png 这种静态文件了,能使用更丰富的东西啦。但遗憾的是,自测的时候发现前两个问题更加严重了,因为要在 Finder 中打开指定路径文件这个过程是一层层的,而且还可能会由于路径太长导致文件还没被选中时,就已经执行了复制操作,导致将错误的内容送进了剪切板,这对用户来说是十分讨厌的。
眼瞅着离最终想要的效果就差一丁点,当然不能放弃,就持续的在 google 里面查找解决方案,终于功夫不负有心人,找到了一种 AppleScript 的写法,使得整个拷贝流程不仅能够在后台进行,而且速度比之前又提高了不少,同样不管是什么样的文件类型都能成功复制,代码如下:
on run argv
set image to POSIX file (item 1 of argv)
tell app "Finder" to set the clipboard to image
end run
完工!使用体验很流畅,至少对我来说足够用了,回首自己在快速检索表情的探索道路上一路走来遇到的各种问题,有一次次的失望又有一次次的希望,遇到最大的问题就是将选中的图片弄进剪切板,若是对 AppleScript 这门语言足够熟悉,或者仔细看了官方文档,也不至于有这么多起起落落,不过最终结果是好的,很满足。
代码托管在了 github 上,这里是链接地址,之后如果还有其他需求能用 workflow 实现的话,也会进行尝试,应该会不断更新下去:
对了,最近 wechat for mac 更新了一个版本,支持根据内容识别自己收藏夹中的表情,用过体验很好,但需要使用表情的场景当然不止 wechat 一种,所以这款 Quick Face 在跨平台上占尽了优势。