article_image

作家 Jessica Sillers 曾谈到她在手机上写小说的经历,称那仿佛在雾中驾车,有别样滋味。

如果说用小小一块屏幕写作、不见全局,是在雾中缓缓行进,那么在电脑上铺好写作工具、配合目录工具,则是开启了导航,可说是另一种畅快的驾驶体验。

开车有路线规划,打游戏有全局地图,野外探险有 GPS,各种导航功能已经成为我们的外部感官。无论翻书、看 PDF 还是浏览网页,目录总是不可或缺;在多数阅读器和浏览器中,目录也是最基础的功能。然而,不少读者爱用的 Markdown 编辑器却往往没有目录,其中甚至包括 iA Writer 和 Byword 这样的著名工具。但凡你写过篇幅较长的文字,恐怕就无法接受一款没有目录导航的 Markdown 编辑器。从 Ulysses 逃难到 iA Writer 后1,我最怀念的也是目录。

为此,我用 Keyboard Maestro 做了一个 Markdown 编辑器目录跳转工具,多数基于 Markdown 文档的编辑器,几乎都可以用上目录功能。而且,我设计的目录还可以搜索标题,方便的结构复杂的文稿中迅速定位。

Alt text
iA Writer 编辑器也能拥有目录导航

如何使用

每个编辑器的情况都有所不同,本文只能以比较原生、比较开放的编辑器 iA Writer 为例。如果您正在使用 iA Writer,则下载动作之后即可拆箱使用,不需要另行修改;使用其他工具的读者,可以先在本节观看效果,再前往下一节查看原理。

目录最简单的功能就是点击后直接跳转,这也本文方案的基础用法。按下 ‌⌘Command-J 在 iA Writer 中运行 Keyboard Maestro Macro 后,Keyboard Maestro 会自动识别 Markdown 文稿中的全部标题,并按顺序列出,供您点击。

Alt text
点击目录,跳转到标题所在位置

Keyboard Maestro 弹出的目录支持键盘和鼠标两种操作,熟练使用快捷键的读者手不离开键盘就能轻松定位到文章的任一章节。

如果文章比较短或者分节比较稀,上述的普通目录功能大概够用;而遇上比较复杂的文稿,插满二三四级标题,可能还需要搜索。这也是我选用 Keyboard Maestro 的原因,它提供的“目录”实际上是一个动态搜索栏,可以实施检索文章中的标题。文稿毕竟是自己写的,没有人比作者更熟悉章节安排;当我想该动某一节时,一般会呼出目录、直接输入标题关键词再按下回车,想改的小节就落在眼前。

Alt text
搜索目录,跳转到标题所在位置

设计思路

注:本动作需要先获得 Markdown 文件中的全部数据,因此最好的选择是基于 Markdown 文件的编辑器,那些封闭数据库的软件需要另寻出路,比如直接通过 AppleScript 获取当前文件的全文。每个编辑器的情况都不同,如有疑问,可以直接联系我。

前段时间我写了一篇如何给网页加目录的文章,背后使用了一系列自己摸索出来的机关,而 Markdown 目录其实就魔改自网页目录。

Markdown 是一种标记语言,有着比较鲜明的语法特色,很容易检验出哪些文本是标题,进而可以在这一特性上作文章。先将整个动作的步骤列如下:2

  1. 运行 AppleScript 脚本,获得当前 Markdown 文档所在的路径,并提取其中的全部 # 开头的行,这些行在 Markdown 语法中就意味着各级标题;
  2. 显示一个列表,列出上一步中获取的所有标题,供你选择;
  3. 选中任意一个标题后,通过模拟键鼠操作跳转过去:先复制标题名称,旋即在文档中搜索标题,一般会立即高亮显示该位置,紧接着模拟按下 ‌⎋Esc 键、退出搜索栏。
Alt text
步骤一览

上述过程利用了 Markdown 标题的唯一性——通常而言——在搜索带 # 的标题时只会显示一个结果,即标题所在的位置,在效果上就相当于跳转。我测试了几份一两万字的文稿,基本瞬间跳转,不留意的话都看不到 Keyboard Maestro 的小动作。

乍看上去,本文方案只是一个利用了搜索功能的 hack,似乎不足挂齿;但放在更宽广的语境下,则可以揭示背后的重要思想:纯文本文档,可以借用通用的文本操作完成远超想象的功能。此前我两度对 HTML 文件——另一种纯文本文件——下手,最后设计出一套电子书双语翻译方案。不过,HTML 对普通读者而言毕竟有些诘屈聱牙,通篇的标记代码似乎也不是那么“纯文本”;而本文所挑选的 Markdown 格式则友善一些,介绍时遇到的藩篱也更稀疏。

至少在文本编辑器领域,许多奇妙的功能其实可以拆解为一系列通用文本操作,比如目录跳转,拆开来就是复制标题、搜索、粘贴、按下回车键、最后退出搜索,几乎可以在任何文本编辑器中动手重现。

当我们已经有了顺手的编辑器时,为了一两个小功能就举家搬迁,未免太过;而像 Drafts 这种提供现成 API、让你随意编写自动化动作的编辑器也终归不常见。此时,组合现有通用文本操作就是第三条道路,而且很可能是一条捷径。

小结

在没有目录的那段时间里之后,我甚至有意识地把文章写短或者分拆,这也应了 John Culkin 那句话:工具塑造了工具的使用者。相当一段时间里,我更喜欢写点技巧类的短文,而不是观点类的长篇大论。问题不在于风格改变,而是对这种变化习而不察,这就有些被工具牵着鼻子走的危险了。

同样,用 Keyboard Maestro 自制一个目录,也不是每次提笔都要把玩一下这个功能,只是多一个选择,方便写长文而已(写这篇小文章就用不上)。不管是在雾中驾车,还是打开导航工具,都各有意趣。


  1. 老玩家都知道 Ulysses 采取订阅制,把老用户不当人的光荣事迹。
  2. 步骤仅描述了橙色部分,前后未标出的部分则负责保护剪贴板。这个 Macro 会用到剪贴板,所以我在主要步骤前后各加了一些操作,运行时先把剪贴板的内容保存到别处,运行完毕后再放回去。一般涉及剪贴板的 Macro,我都有添加保护操作的习惯。

author_avatar

Lawyer, macOS/iOS Automation Amateur