本文拖稿数年,盖鄙人私下里独爱 Markdown,但在公务上又不得不使用 Microsoft Word,因而在几年时间里一直精神分裂(估计还会持续几年),结果自制列表格式转换工具——丰富的列表格式设置,乃 Word 的强项——也像是 Markdown 用户给自己打的布丁,似乎并不名正言顺。
写作软件 iA Writer 曾发文讨伐 Word。碰巧我的 Word 时常卡死,文书写作工作也先挪至 Markdown 编辑器,最后用 Word 调整排版而已。在意之下,自然又觉列表转换工具顺手好用,遂作本文。
所谓列表格式转换,无非几类,或无中生有创建列表,或改变列表形式(例如从有序列表转换为无序,但我暂时用不到,所以没做),或在调整顺序及增删内容后重新编排序号。如有用 Markdown 编辑器的读者,估计心里有数,绝大部分编辑器都依靠手动输入列表符号,鲜有像 Word 那样自动补完或更新者。于是,我自行便携了一组转换小工具,覆盖我常用的几种格式。实际上,列表转换无非是符号变换,Microsoft Word 中那些丰富的格式,大多可在本文基础上演绎而来。
生成 Markdown 列表
在 Markdown 中,最基础的两种列表格式便是无序列表和有序列表,它们形如下:
- 项目 1
- 项目 2
- 项目 3
1. 项目 1
2. 项目 2
3. 项目 3
正如 PPT 一样,这两种列表都暗含了强烈的意识形态,教导一代又一代的使用者掌握分点表述的写作习惯。在技术上,部分 Markdown 编辑器确有补完机制,一旦你以 - 或 1. 打头写了东西,在换行之际,编辑器有可能自动帮你补齐下一行开头的符号。
很不巧,我最喜欢的两代笔记软件 nvALT 和 FSNotes 都与此无缘,所以我自己写了一个小工具。选中多行文本,然后运行 Keyboard Maestro 动作,即可将其转换为对应的 Markdown 列表格式。
生成带数字序号的单行文本
就原理而言,无非是借用正则表达式机制,查找每一行开头并加上标记符号。这一原理的用途不限于 Markdown 列表,我在工作中更常在同一行文本中使用连续序号,而不是分行成列。这并不奇怪,Markdown 诞生于网页语言,而网页几乎完全是滚动范式的天下,不在意多分几行、多滚几下,但纸质件统治的法律文书工作则不然,比较稀罕版面空间。
无论如何,只需删去换行符号,我就得到了更符合法律文书排版管理的列表(如果这还算是列表的话)。
生成带中文序号的单行文本
Markdown 虽然已经逐渐成为标准语言,几乎已经可以被数字原住民的大脑自动渲染,但在实际工作中,我依然会遇到比较老派的法官,在他们看来,Markdown 符号纯属标点滥用,因为在没有使用中文序号的情况下,你不应该直接跳到阿拉伯数字。
那也很简单,再进行一次文本替换,把阿拉伯数字换成中文数字即可。本例依然是单行文本,故采带括号的中文序号,至于不带括号的中文需要,照例多用于多行(多段)文本。
更新列表序号
相较创建列表,真正痛苦的是修改。设想你刚刚插入了一项,或者删除一行,又或者更换了其中两项的位置——在罗列辩论要点或草拟杂文大纲时,我经常这么做——你就得为列表重新编号。
不得不承认,Word 在编号方面做得不错。我不止一次在别人发来的合同中发现序号丢失或者重复,此时,只要双击一下序号,基本会发现它们只是普通文本,即对方没有开启 Word 的自动编号功能——但凡开启,一般就可免去手工劳动(但很可惜,吊诡的格式继承问题随之而来,毕竟 Word 隐藏了绝大多数东西,完全不是一个所见即所得的编辑器)。
在 Word 之外,我也常常需要调整列表,我还写过一个快速移动文本行的小工具。只要是无序列表或根本没有列表,一切都很顺利;可一旦遇上有序号的列表,编号问题便随之出现。在 Word 之外,我切换到另一种低技术的重编号思路:清除现有列表符号,然后重新编号即可。如此一来,就不必在意增改的是哪几行,问题又被解构为简单的文本替换。
与 Markdown 列表类似,几类带序号的单行文本也可能需要调整项目顺序或增删内容,我也制作了对应的编号更新工具。
在简单的文本替换之上,本方案尚有不少改进空间,例如可通过文本匹配,判断当前所选文本是哪一种格式的列表,再调用对应的编号更新动作,免去手动选择。我已经十分熟悉 Keyboard Maestro 的纯键盘操作,继续优化的收益并不明显,有兴趣的读者不妨自行尝试。

