作为Emacs 和 苹果的用户,日常会使用 iPhone 编辑提醒事项,但是在 MacOS 上更习惯用 Emacs org 编辑 Todo。一直希望能否方便的在 Org mode 和 macOS Reminders 之间同步。
调研后发现,目前最好用的操作 Reminders 的工具是 reminders-cli, 因此编写了一个新的插件 org-reminders ,通过 Emacs 来管理 macOS Reminders(提醒事项),并且可以提供 Reminders 与 org mode todo 的同步。
功能:
- 添加提醒事项:轻松地将新的提醒事项添加到 macOS Reminders 中的特定列表。
- 编辑提醒事项:更新现有提醒事项的标题、备注
- 完成和取消完成提醒事项:切换提醒事项的完成状态。
- 删除提醒事项:从列表中删除提醒事项。
- 显示提醒事项:使用 Org mode 结构以有组织的方式呈现提醒事项。
- 同步功能:在 macOS Reminders 和 Org mode 之间同步提醒事项。

11 个赞
很赞!我来试试,这个项目真的是killer级别的。
感谢!很好用。
有个问题:我的 Reminders 中有 2000+ 个已完成的提醒事项,是多年使用积累下来的。由于数量多,导致运行 org-reminders
时会卡住很久,要 10+ 秒才能显示结果。很影响体验。
如果能只同步尚未完成的提醒事项就好了,这样我就不用删除那几千条历史——谁知道哪天也许会用得上。
找了一圈,没有找到如何自定义「只同步未完成事项」,所以来问问。
我发现 org-reminders-commands
变量中的 :show
和 :show-all
两个 property 中都包含 --include-completed
,感觉只要去掉应该就可以。但无论是通过 (setq org-reminders-commands ...)
修改,还是直接在 org-reminders.el
源码中修改,最终运行 org-reminders
命令时,使用的命令仍然都包含 --include-completed
参数。
目前这个是写死的。容我添加一个变量来指定 是否「只同步未完成事项」
目前 org-reminders 同步功能还不够智能,需要用户手动运行两个相关命令:
- 从 macOS Reminders 获取信息展示为org todos,
- org todos 同步到 Reminders
jdtsmith 提供了一个很好的自动同步思路。但目前的 reminder-cli 还不支持其中的一些功能。
因此当前的开发逻辑是:
- 主基于当前的手动同步逻辑,尽量提供更好的用户体验;
- 另一个分支逐步实现自动同步方案。
ginqi7
10
已经在 f17869d
提交里新增了变量:org-reminders-include-completed 来指定是否【展示已经完成的提醒】。默认值为 t, 设置为 nil,则不展示已经完成的提醒。
后续再考虑如何优化【展示已完成提醒】的情况下性能问题。
1 个赞
striaght 安装有个报错
Error (use-package): org-reminders/:catch: Symbol’s value as variable is void: org-reminders-prefix
我复制了包,使用时会提示找不到find-if
函数,我改成了 cl-find-if
。
GNU Emacs 31.0.50 (build 1, aarch64-apple-darwin23.6.0, NS appkit-2487.70 Version 14.6.1 (Build 23G93)) of 2025-01-05
ginqi7
14
我不是很熟悉 striaght ,但 org-reminders-prefix 我只在
(transient-define-prefix org-reminders-prefix ()
"Prefix for Org Reminders."
["Org Reminders Commands"
["Global"
("r" "Show Reminders" org-reminders)
("a" "Add Element" org-reminders-add-element)
("d" "Delete Reminder" org-reminders-delete-reminder)]
["Org mode"
("s" "Synchronizing Buffer" org-reminders-sync-buffer)
("d" "Delete at pointer" org-reminders-delete-element-at-pointer)
("e" "Synchronizing at pointer" org-reminders-sync-element-at-pointer)]])
用到了。手动 (require 'transient) 试试。
find-if 应该是在新版本里废弃了,我之后改成 cl-find-if。
ginqi7
16
看来需要加一个参数指定 list 的 source。
你这边是怎么在备忘录创建 list 时指定 source 的?我没看到哪里有选择的地方。
我也没找到哪里可以创建这个source,我是同步不了,用终端才发现有多个source。 