article_image

编注:古代西方知识分子曾将拉丁文这种“死语言”作为学术专用语言,以期免于世俗语言的干扰。不料随着学科发展,拉丁语也演化出了多个分支,林奈所用的植物学拉丁语便是其中一派。方言难以避免,巴别塔必然倒塌,太阳底下毫无新鲜事。Markdown 语法亦然。貌似简洁的语法,在各个开发商手里变得千奇百怪,以图片语法为例,各家的默认写法往往不同,插入图片的方式亦不统一。翻译工作又落到了自动化玩家们身上。

前段时间,我把Markdown编辑器从 Typora 换到了iA Writer。不太习惯的是,iA Writer不支持直接粘贴剪贴板中的图片。遂有此文。

思路

⌘+V 粘贴剪贴板中的图片”,是一个很普遍的需求,但或许与开发者的设想的使用场景不符。iA Writer官网的使用示例中宣传的插入图片方式是将已有的图片文件拖放到文档中,生成一个iA Writer私有格式的图片链接(其实就是一个带扩展名的文件名,当然,用户也可以手动输入这个文件名)。这就意味着,如果现成的图片是在剪贴板中,用户需要先打开Preview,⌘+N 以剪贴板内容新建图片文件(这还是macOS提供的功能),保存完毕后,才能在iA Writer中实现插入操作。

不过想到Markdown的本质是纯文本,似乎也无怪于开发者会满足于拖放已有图片文件——毕竟,纯文本不包含图片而只包含引用图片的链接,如果没有图片可引用何谈插入——在手动输入的基础上,拖放似乎已经是更先进的交互了。然而,此等思考似是而非——期房买卖合同尚有效力,引用尚未创建的图片又有何不可?所需保证的,只是创建链接后,确保图片会如期存在而已。

如此一来,实现“⌘V粘贴剪贴板中的图片”的思路,就呼之欲出了。无非两部分:在md文档中插入图片链接,在链接对应的路径以剪贴板内容创建图片文件。而这两步的顺序,实际上也没有严格要求。

说到这里,有能力的读者其实已经可以上手制作自己的方案了。如果想在已有的轮子上稍加修改,以适合自己的工作流,可以下载以下Keyboard Maestro动作:

Paste img 动作下载(GitHub)

实现方案——以Keyboard Maestro为例

知识点:图片链接语法及其通用性

Markdown的通用语法![图片alt](图片地址 "图片title"),所有Markdown编辑器(甚至代码编辑器)均对这一通用语法提供基础的支持1。此外,有些Markdown编辑器有其私有语法,如Obsidian的 ![[img.png]]、iA Writer的 img.png,各家之间互不通用。在这之间,我宁愿牺牲一些(实际上可以用自动化弥补的)便捷性,转而拥抱通用语法。软件潮流易逝,笔记内容长存。

区分图片/非图片内容

直觉上粘贴图片和粘贴其他内容并无区别,不必给“粘贴图片”这一场景另设一个快捷键。因此,首先要让Keyboard Maestro区分出剪贴板中的内容是否为图片:如果不是,执行一般的 ⌘+V 操作即可;如果是,则运行图片粘贴的专属动作。

Alt text
if img

设置图片保存路径

在这一步,要提请各位读者注意的是,在我的用例中,iA Writer主要是用于工作记录。我的项目文件夹典型结构如下:

231217项目xx
├── 项目记录.md
├── mdAssets       # 项目记录.md的附件文件夹
│   ├── img1.jpg
│   ├── img2.jpg
│   └── img3.jpg
├── 资料1.md
├── 资料2.md
├── 资料3.md
└── 资料4.md

其中 mdAssets 文件夹容纳了 项目记录.md 中要引用的图片等。因此,我制作的动作中,图片保存位置为“本md文档同级目录下的 mdAssets 文件夹下的 xx.jpg”。由于大家需求不同,具体的动作上可能需要稍作调整,但整体方法是通用的。

Alt text
获取当前窗口文件路径并设置图片保存的相对位置

如图,变量 localPath 是md文档所在的文件夹的路径,如果你的图片保存路径是固定的,可以直接写死,不必采用上图做法。变量 localName 为图片名称,由用户输入,默认值是一串时间戳。

保存剪贴板中的图片至设置的路径

Keyboard Maestro无法在不存在的文件夹下写入文件,因此要先判断文件夹是否则存在,若不存在,先生成一个。

我设置的图片保存格式为jpeg。如果偏好png等其他格式,可以自行改动,但要记得修改把动作中的其他处 .jpg 相应替换。

Alt text
保存图片

url Encode

经@Minja提醒,为最大程度上实现通用性,图片地址 最好进行url编码。由于我的路径写法中只有图片文件名可能出现中文或空格等不支持的字符,我只对该变量进行了编码,如下图。编码步骤调用了Python脚本,使用前请注意电脑是否已安装Python环境。

Alt text
url编码

插入图片链接

![图片alt](图片地址 "图片title") 的语法依次写入即可。

Alt text
插入图片链接

知识点:绝对路径和相对路径

要引用本地图片,路径的写法有绝对路径和相对路径两种方式。由于项目文件夹很可能因归档等原因而变动位置,但md文档与图片等附件的相对位置往往不会改变,这里选择采用的是相对路径。.表示当前目录,如果需要使用上级目录,可以使用..

小结

对于个人偏好,软件设计往往难以面面俱到,粘贴图片的需求就是其中一例。但为此放弃一个应用未免又有些可惜。此时,与其等待开发者做适配,不如捡起Keyboard Maestro这样的扳手试着拧一拧,有些功能的本质并没有那么神秘。

这种“拧一拧”的可能性越多,被锁死在某个应用中的可能性就越小。


  1. 通用格式中的图片alt是图片无法显示时的替代文本描述;图片地址是图片的url或本地路径;图片title在解析后会作为图片的title属性添加到生成的HTML标签中,当鼠标悬停在图片上时,会显示标题文本。之所以说“基础的”,是因为在各家编辑器上,正常显示图片均不是问题。但是:a.图片alt在有些编辑器中(如iA Writer)可以在图片下方作为图片标题显示,有些编辑器则不支持(如Obsidian,不过Obsidian的第三方插件image captions可以实现此功能);b.图片title的悬停显示在有些软件中无法生效(如Obsidian)。