emacs-org-mode中同步滴答清单内容
1. 使用介绍
- 本地载入
(use-package plz)
(use-package dida
:load-path "path/to/dida.el/")
- 然后在dida apps界面申请APP,填入APP名称(随便填),生成,返回。
- 点击
Edit
,将网页上的OAuth redirect URL
设置为http://localhost:1145
。 - 将生成的
client-id
client-secret
对应填入本地变量dida-client-id
dida-client-secret
中
(setq dida-client-id "114514")
(setq dida-client-secret "1919810")
- 并设置同步到的本地文件路径
dida-sync-file
。
(setq dida-sync-file "path/to/your/org/file")
- 执行
dida-authorize
,自动打开授权网页,点击「同意」后跳转到本地网页,此时已将Code自动传递进了kill-ring
。 - 返回Emacs,按
C-y
直接粘贴到mini-buffer
中。这就完成了一次授权。 - 最后自定义同步策略。
(defun dida-sync ()
"先push再fetch,以云端为准"
(interactive)
(dida-push)
(dida-fetch))
;; 启动后fetch一次
(add-hook 'after-init-hook #'dida-fetch)
;; 闲置240秒后先push再fetch一次
(run-with-idle-timer 240 t #'dida-sync)
2. 细节说明
由于dida api只会返回 TODO
状态的task,且只有 dueDate
,不区分 SCHEDULED
和 DEADLINE
,因此我在push时做了如下处理:
- 如果本地任务有
SCHEDULED
则创建/更新一个dida task,记录SCHEDULED
提醒时间 - 如果本地任务有
DEADLINE
则创建/更新一个dida task,在title前加上[D]
,记录DEADLINE
提醒时间
同样地,fetch时做了对应操作:
- 如果title前有
[D]
,则先暂存并跳过。 - 然后逐一检查暂存内容,看buffer中有无去掉
[D]
后title的heading。
如果有,则在该heading上添加对应id和deadline信息
如果没有,则将暂存的heading信息插入到文件最尾端
3. 已知问题
- 滴答清单不支持 标签 ,故org-mode中的
tag
在上传后会被丢弃 - 对于隔日重复,滴答清单无法在api中区分
.+
和++
,反而对于周/月有指示区分。 滴答的.+
支持到日周月,而++
支持到日周月年。目前push时不做区分,统一转换为单纯的+
,代表++
- 滴答清单不支持
TODO-KEYWORDS
,上传后会丢失自定义的TODO-KEYWORDS
信息
临时解决方案:在处理org-mode heading前添加一次判断,将满足条件的heading移动到另一个本地org文件中
;; 以下函数在push前会自动将dida.org中标为HOLD或有.+重复项转移到timeline.org
(defun my/move-item-out-of-dida ()
(when (or (equal "HOLD" (nth 2 (org-heading-components)))
(and (org-get-repeat) (string-match ".+" (org-get-repeat))))
(org-reverse-datetree-refile-to-file my-org-timeline (current-time))))
(advice-add #'dida--heading-to-task :before #'my/move-item-out-of-dida)