使用 Marked 2 为 CotEditor 增加 markdown 预览功能
CotEditor 虽然各种好,但毕竟功能比较轻量,用来编辑 markdown 甚至没有一个预览功能。不过好在它还支持脚本拓展,可以自己动手,丰衣足食。
coteditor_markdown_set Public这个仓库里有一系列预览脚本。不过它的预览能力依赖 Safari 实现,而且颇有一些年久失修,很多 Markdown 特性都不支持。
最近突然想起来,我不是还买过 Marked 这个预览专用 app 嘛!GFW 和 MultiMarkdown 语法它也都支持,正好拿来给 CotEditor 使用。
不过我一般也是只在临时编辑,确定语法没啥问题的场景下才会用 CotEditor 来写 markdown。而官方仓库中的示例大部分都是通过open file.md
的方式来预览的。考虑到只是临时预览,却还要专门保存一个临时文件,似乎并不是很优雅。
官方文档提到也可以直接预览剪贴板的内容。想了想也可以用复制到剪贴板的办法来实现。写一个 shell 脚本,使用pbcopy
和pbpaste
命令就行了。这个方法的缺点是会污染剪贴板。如果是在电脑上用,有更加无副作用的处理方式会更好一些。
研究了一番官方文档,我感觉使用这个 url schema 就可以满足需要了:
x-marked://preview?text=Some%20text%20to%20%2A%2Apreview%2A%2A%0A
唯一的问题是需要对文本内容进行 url encode 才能正确发送到 Marked。考虑到这一点,用 python 来写这个脚本会比较简单。脚本内容分为以下几步:
- 读取所有输入
- url encode 编码
- 拼接成 url,并打开
具体内容如下,也可以直接在这里浏览。
#!/usr/bin/env python3
# %%%{CotEditorXInput=AllText}%%%
# %%%{CotEditorXOutput=Discard}%%%
import sys
import urllib.parse
import webbrowser
content = sys.stdin.read()
content = urllib.parse.quote(content)
webbrowser.open('x-marked://preview?text='+content)
然后把脚本文件保存到~/Library/Application Scripts/com.coteditor.CotEditor
目录下,CotEditor 的脚本菜单下就会自动出现这个命令。
使用这个方案之前,我还担心过完全通过链接传参,文本内容过大会不会卡顿。不过拿一段 1 万多字的文章试了下,基本是秒开。
这个方案的主要问题是没办法实时更新编辑器里的内容,每次预览都会生成一个新的预览窗口。如果要实时更新内容的话,还是得使用open file.md
的方案。不过这个可以直接使用官方脚本,就不必自己手搓了。