脚注作为 Markdown 语法中的外来者,在多数编辑器中都很难输入。本文提出一种基于 Keyboard Maestro 的方案,并借用 %TriggerValue% 将原本一大套动作简化为一个。
当今文章,脚注(footnote)颇为常见,以至于有人要反过来主张少用脚注。当然,这不是本文讨论的方向。
对于喜用 Markdown 的人来说,脚注并不容易输入。盖原始 Markdown 语法就不支持脚注1,设计者 John Gruber 提到脚注时也只是将其与链接相提并论,而没有设计脚注语法。后来的编辑器,大多也在脚注问题上含含糊糊,最后还是要在不同位置手动输入两遍 [^1]
形式的脚注,很误工夫。
有过之前用 Keyboard Maestro 输入其他 Markdown 符号的经验(见前文和 GitHub),稍作推广,也就有了本文的脚注输入方案。不过,脚注毕竟远比一般的 Markdown 符号复杂,绝非炒冷饭;如果人造物在这里还有延续性可言,那就不得不同时考察 Keyboard Maestro 中的特殊变量:%TriggerValue%。
使用速览
相对正规的脚注语法由一组符号组成:在正文中的 [^脚注序号]
加上文末的 [^脚注序号]: 脚注内容
。也有一种相对简单的写法,直接的正文中插入一段 [^脚注内容]
,但这种写法并不标准,很多编辑器并不兼容——包括早期的 Obsidian(我几乎不用 Obsidian 了,不清楚后来的情况)。后一种情况与输入超链接或图片链接无异,无需单独撰文;而前者,却并不简单(为避免网页渲染错误,以下代码中,我用粗括号代替了脚注标记中的原始符号)。
这里是正文。【^1】
【^1】: 这里是脚注。
我设计的 Keyboard Maestro Macro 可达到如下效果:
- 在文稿任何一处,以此输入两次
数字
再加上一个f
(f 表示 footnote),即可运行 Macro; - 根据刚刚输入的具体数字,Keyboard Maestro 会在先在当前位置插入
[^数字]
; - 接着,Keyboard Maestro 会把光标移到文稿末尾并新增一行,接着插入
[^数字]:
并将光标移到此处,以便继续输入脚注内容。
您可以自行修改触发方式(Trigger)——相应的,需要阅读后文,以修改 Macro 步骤——我选用两个数字加上 f
,是为了好记且好按,直接换成快捷键固然无妨,而数字和字母的组合也可以。惟需注意,Typed String 应当是先数字、后字母的顺序,盖以 Typed String 为触发方式时,Keyboard Maestro 会先删掉输入的字符,再运行 Macro;而在中文输入法下,苟先英文、后数字,输入的多个字符会被当成一个,从而导致 Keyboard Maestro 多删一两个字符,破坏原有文本。而换作先数字、后字母,则无此虞。2
用正则表达式简化 Trigger
异于一般的 Macro,本方案只需要设置一次 Trigger,就可以覆盖 11f
到 99f
九种触发方式,其中机关就是正则表达式。
稍微有一点自动化基础的读者,大概知道 Shortcuts 也有正则表达式相关步骤,我也写过一些文章。规则表达式是一种模式匹配,写一次表达式,射程就包括一类情况,而不用逐个记载;比如,若想对 JPG 和 PNG 文件执行同样的压缩操作,就可以写 jpg|png
这个表达式,表示遇到任意一种格式,都照常压缩图片。Keyboard Maestro 的特殊之处在于,其触发方式也可以带正则表达式,原本要写九次,有了正则表达式,写一次就足够。
图中的表达式 \d\df
表示两个数字加上一个字母 f
,可以囊括 11f
到 99f
——其实,真正的范围是一百种情况,只是两个数字加一个字母的组合极为罕见,日常使用时不太可能按错(要求输入两次数字,也是为了降低误触概率)。
用 %TriggerValue% 减少动作数量
除去大大简化脚注输入过程,此 Macro 还可以照顾到从 [^1]
到 [^9]
的不同脚注,一以贯之;而通常的方案可能要为不同序号的脚注各创建专用动作,较难维护。而本方案之所以只需要一个动作,token 居功甚伟。
和正经的编程语言一样,Keyboard Maestro 中也拥有许多变量,而 Token 则是一类特殊变量,和用户自己预设的不同,token 会随着当前系统或软件的状态而不断变化;涉及 Keyboard Maestro 自身状态的 token 则更加特殊,可以实施监控 Macro 的运行状态,并反过来调整 Macro。换言之,token 就像 Keyboard Maestro 自动制导导弹中的控制器,四两可拨千斤。
本方案用到了 %TriggerValue%
,它表示当前触发条件的值(value)。上一节已经提到,我们的触发方式是 \d\df
,而 %TriggerValue%
可以捕获到具体按下的键。例如按下 11f
,这串字符就会成为 %TriggerValue%
的值,并可以进一步调用。
理想的脚注插入方式是:
- 按下
11f
,输入一对[^1]
; - 按下
22f
,输入一对[^2]
; - 按下
33f
,输入一对[^3]
; - ……(以此类推)
稍加观察,可以看出,按下的字符决定了最终文本中的数字,那么只需将 %TriggerValue%
抓到的数字插入文稿,就大功告成。
其中的思维跳跃在于,我们不再预设一系列的动作、并为之设置专用的触发方式,而是将类似动作合并为一个,通过侦测触发方式的细微差异,调整最终插入的文本。关于 %TriggerValue%
的更多讨论。可见 Keyboard Maestro 论坛。
小结
做一个复杂的 Keyboard Maestro Macro 是一件相对简单的事情,但做一个简单的 Macro,很可能是一件复杂的事情。此前介绍过的 Palette 也旨在简化 Keyboard Maestro Macro,不过只是停留在 Macros 层面,而 %TriggerValue%
则直接修改了 Macro 本身,简化程度更加彻底。
插入脚注,当然可以用传统思路,用得着几个序号就做多少个动作;可惜这样制作 Macro,水平很可能只是原地踏步——虽然也不耽误干活。而设计工具的乐趣,大概就在这些“只有上帝会看见”的内部细节上。
🛍 我撰写的付费栏目《Keyboard Maestro 进阶指引》正在 UNTAG 售卖,详解 Keyboard Maestro Macro 高级设计思路,欢迎选购:付费内容链接