一键剪藏网页内容到 macOS 备忘录

从 OS X 10.11 和 iOS 9 开始,苹果更新了系统自带的备忘录应用,发展到今天,这个小巧的原生应用已经支持 iCloud 同步、多媒体内容和多级文件夹管理,具备了一个优秀笔记应用必备的功能。此外,Siri 和 Spotlight 系统级的接入甚至赋予了它更多场景使用的可能性。因此,很多人已经开始 使用备忘录作为自己的主力笔记应用

虽然备忘录作为原生 App 具备各种优势,但实际上它的操作过程却谈不上简单高效。来看普通的收集流程。当我们在某个应用里遇到认为值得保存的内容,步骤大概是:

  1. 选中文字,⌘Command - C 进行复制;
  2. 找到备忘录程序并打开;
  3. 新建一条备忘;
  4. ⌘Command - V 粘贴内容。

乍看之下,这些操作不算麻烦,更算不上复杂。但是,在阅读一篇文章的时候,往往需要十数次地重复这些步骤。仔细分析下来,其中除了「选中文字」之外,其他步骤都是机械重复。于是我动手做了个简化流程,能做到选中文字,按下快捷键,内容写入备忘录

一键保存文字内容到备忘录
一键保存文字内容到备忘录

安装和使用步骤

要做到这一点不需要安装什么新软件,只用自带的 Automator 就可以做到。不想了解原理的话,只看这个部分,下载动作设个快捷键就搞定啦~

第一步,下载 Automator 文件,因为要做到「保存到备忘录」和「追加到备忘录」,所以有两个文件:

第二步,解压下载过的文件,双击安装「保存到备忘录」和「追加到备忘录」。

第三步,设置快捷键。在「系统偏好设置–键盘–快捷键–服务」中找到我们刚刚保存的服务,点击它,即可为它设置快捷键,我这里设置为了 ⇧Shift - ⌥Option - ⌘Command - C

为服务设置快捷键
为服务设置快捷键

同样地,为「追加到备忘录」设置快捷键 ⇧Shift - ⌥Option - ⌘Command - A ,即可将选中的文字追加到备忘录中最近添加的一条备忘。

就 3 步,整个安装步骤就结束了。现在,你在任何应用程序中选中一段文字,就可以实现文章最初展示的效果,使用快捷键将文本快速保存到备忘录中了。

原理与引申

如果你只是想实现快速保存的功能,阅读以上内容已经足够。但如果你想进一步了解这个功能背后的原理,我们可以来试着探讨一下。

「服务」是 macOS 上的特色功能,它可以接受指定应用程序的输入,进而调动其他应用程序执行特定操作以形成整个工作流程。我们这里想要做的事情,就是以我们在其他应用程序中选中的文字作为输入,把它的内容快速地保存到备忘录中去。

为了实现这个目标,第一步,我们从 macOS 自带的自动操作(Automator)应用程序新建一个服务。在打开的窗口顶端,选择服务的对象是「位于任何应用程序」的「文本」。

使用自动操作(Automator)应用程序新建服务
使用自动操作(Automator)应用程序新建服务

从窗口的左侧,我们可以看到资源库已经包含了一些原生应用程序的预设操作,Automator 的自动化,实际上就是把这些操作根据我们的需要连接起来,让它自动且连续地完成我们设定好的任务。通观这些操作,可以发现里面没有包含我们需要的备忘录编辑功能。在这种时候,就需要调用更加强大的、更够与应用程序实现更多互动的 AppleScript 了。

扩展:AppleScript 是 macOS 自带的脚本语言,少数派上已经有一些关于 教学或讨论 AppleScript 的文章

AppleScript 的语法规则自成体系,初学时很容易让人摸不着头脑。幸运的是,2014年苹果推出了 JavaScript for Automation,从此我们可以使用 JavaScript 制作 macOS 上的自动化工具。JavaScript 的语法相对来说与其他流行的编程语言更为相近,网上的教程也更加丰富,因此我们能够比较容易地理解和运用。

第二步,从左侧「资源库–实用工具」中选中「运行 JavaScript」并拖放到右端窗口,粘贴以下代码:

function run(input, parameters) {
    var Notes = Application("Notes")
    var newNote = Notes.Note({name: input})
    Notes.folders[0].notes.push(newNote)
    Notes.folders[0].notes[0].show()
}

如果追求更流畅的阅读体验,可以删掉最后一行代码 Notes.folders[0].notes[0].show(),这样就不会在添加内容到备忘后打开备忘录。

将文本保存到备忘录
将文本保存到备忘录

现在你的窗口内容应该和上面的截图一样,其中右侧即是我们设定好的工作流程,首先当你调用「服务」时,它会接收你选中的文字;然后,它把文字作为 input 发送给相应的 JavaScript 函数,这个函数很简单,只有四行代码,它们的作用分别是:

  1. 获取备忘录应用程序实例(以便于我们对它进行操作);
  2. 新建一条备忘,用服务接收到的 input 值作为备忘的名字(也即备忘的第一行内容);
  3. 把刚才新建的备忘保存到备忘录的默认文件夹(中文系统下名为「备忘录」)中;
  4. 显示默认文件夹中的最新一条备忘(也即是我们刚刚保存的这条)。

如果具备基础的编程知识,很容易可以看出,我们其实只是新建了一个 Note 对象然后把它放进了备忘录的 notes 数组里去,是不是很简单?

同样地,由于我们常常需要把来自同一篇文章中的信息保存到同一条备忘中,所以可以按照上述的步骤再建立一个「将文本追加到备忘录」服务,只需要其中的代码替换为:

function run(input, parameters) {
    var Notes = Application("Notes")
    var body = Notes.folders[0].notes[0].body()
    Notes.folders[0].notes[0].body = body + "<br>" + input
    Notes.folders[0].notes[0].show()
}

代码的原理和之前大致相同,只是把备忘的内容从 input 变成了备忘中已有的内容 body + input

如果你还想了解更多关于用 JavaScript 写自动化脚本的内容,可以观看 WWDC 2014 的相关主题演讲。

扩展:WWDC 2014:JavaScript for Automation

第三步,保存文件,⌘Command - S,命名为「将文本保存到备忘录」,并前往系统偏好设置中为刚刚保存的服务设置一个快捷键(同上文安装步骤最后一步),就大功告成了。

为服务设置快捷键是一项系统功能,很简单,但是我想多说两句。设置快捷键,其实可能也算得上是一门学问,既要避免与系统快捷键冲突,又要突出快捷键的功能才能方便记忆。没有经过仔细思考的快捷键往往因为冲突在许多程序中无法使用,或是因为不具备语义而被遗忘在记忆的深处失去了价值。因此,这里我选择“保存到备忘录”的快捷键的理由是,利用它和普通复制的相似性,加上更多功能键,这样既避开了系统快捷键又能代表它本质是另一种更复杂的 Copy。这里使用了三个功能键,看起来操作复杂,其实这三个键的位置都在键盘的左下角或右下角,所以使用时大可一只手按住三个功能键,心理上进入「快捷键状态」,另一只手再根据 Copy 的目的从容地去按下 C 键。

三个功能键作为快捷键的布局
三个功能键作为快捷键的布局

而对于「追加到备忘录」,它的功能是把当前选中内容追加到最新一条备忘的末尾,因此快捷键设置为 ⇧Shift - ⌥Option - ⌘Command - A 功能键和上面一致,方便记忆,而 A 代表 Append。

这样,一个完全由自己制作的自动化流程就成型了。根据自己的需求,你还可以简单地对代码进行修改,例如,只需要对 input 变量进行字符串拼接,你就可以按照自己设定的模板保存内容了。

结语

曾经看到一篇文章说,自动化节省的不是时间,而是心理能量。

我常常觉得某个网页上某段话很有韵味,却懒得多花几步去保存下来,而宁愿在需要它的时候苦思冥想曾经是在何处相遇。这同生活何其相似,我们常常很明白哪些事情对我们是有价值的,却往往因为嫌麻烦懒得去做。那么既然如此,就一起探索用自动化的方式帮助我们更好更快地做有价值的事情吧!