UP | HOME

▼ 本文更新于 [2025-06-17 周二 15:46]

emacs-org-mode中同步滴答清单内容

GitHub下载链接

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 ,不区分 SCHEDULEDDEADLINE ,因此我在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)

© Published by Emacs 31.0.50 (Org mode 9.8-pre) | RSS 评论