在截止日期前选择 org-mode 中的条目

selecting entries in org-mode with a deadline

出于多种原因,我有一个文件 org-mode 文件,其中包含很长的待办事项列表,其中优先任务有截止日期,而 non-priority 没有截止日期。
该文件现在太大,减慢了我的快捷方式。我的目标是将有截止日期和没有截止日期的任务分成两个单独的文件。
我尝试在日历上显示任务并复制最近的任务(org-mode 最多显示 14 天) ,但这只允许我复制他们的标题,而不是任务 body.

有没有办法 select 仅具有截止日期的条目(标有“*”),而忽略其他所有内容?

我相信您可以轻松地按截止日期(C-c ^ 然后 d)对文件进行排序,然后找到包含截止日期的最后一个标题,用 C-Space 标记所有截止日期任务并剪切和粘贴这些标题放入一个新文件中。

这有帮助吗?

上一个答案中的 sort/cut/paste 方法应该可以正常工作。如果您想更深入地研究 org-mode,可能会对以下替代方法感兴趣,但它需要一些 lisp 知识以及一些 org-mode 函数。

想法是使用 org-refile 重新归档条目。但这只会重新归档一个条目,因此我们使用 org-map-entries.

将其映射到所有条目

想法很简单,但实现起来有点乱。首先,我们需要通过设置变量org-refile-targets来告诉org-refile在哪里重新归档,但是由于可能有一个全局设置,我们需要使用let在本地重新定义这个变量。

其次,我们需要 select 正确的条目:org-map-entries 需要一个 matching 参数,可用于此;特别是,"DEADLINE<>\"\""(测试条目的 DEADLINE 特殊 属性 不等于空字符串)可用于此目的。然后几乎有效:

(let ((org-refile-targets '(("refiled.org" :level . 1))))
  (org-map-entries #'org-refile "DEADLINE<>\"\"" 'file))

几乎,但不完全是:每次调用 org-refile 时,它都会在下一行的开头留下点,然后 org-map-entries 将它移到行尾,然后再尝试下一行匹配;因此,如果您有两个 DEADLINE 条目,一个接一个,第二个条目将被遗漏。解决方法是确保将 org-map-continue-from 设置为缓冲区中不会错过下一个标题的位置。将所有这些放在一起,您可以定义以下两个函数:

(defun ndk-refile ()
  (org-refile)
  (beginning-of-line)
  (setq org-map-continue-from (point)))

(defun ndk-refile-all ()
  (interactive)
  (let ((org-refile-targets '(("refiled.org" :level . 1))))
    (org-map-entries #'ndk-refile "DEADLINE<>\"\"" 'file)))

创建带有 * Tasks first-level 标题的 refiled.org 文件,然后使用 M-x ndk-refile-all 调用后一个函数。不幸的是,您将在 org-refileeach 调用中询问重新归档目的地,但我没有深入研究如何驯服它所遭受的交互适应性。欢迎为此提出建议。

顺便说一句,请务必备份原始文件。