【问题标题】:Add linked org-files to org-agenda-files将链接的 org-files 添加到 org-agenda-files
【发布时间】:2016-06-27 19:29:12
【问题描述】:

在 .emacs 我有

(org-agenda-files (quote ("d:/GTD/a.org" "d:/GTD/b.org" "d:/GTD/c.org")))

在这三个文件中,我可以链接到其他组织文件。是否可以(即时使用当前缓冲区)扫描 a.org、b.org、c.org 并添加指向 org-agenda-files 的链接?

更新 1。

只有一种可能。链接文件位于几个定义明确的文件夹中。在How to add .org files under org-directory to agenda 上是关于如何添加所有文件的说明。有没有办法只将那些在 a.org、b.org、c.org 中链接的文件添加到 org-agenda-files?。

更新 2。

我不知道为什么,但是在添加 (interactive) 之后,功能在 emacs 中变得可见。该函数的完整代码:

    (defun add-links-to-org-agenda-files ()
       (interactive)
       (org-element-map  
           (org-element-parse-buffer)
           'link
           (lambda (x) 
             (if (equal (org-element-property :type x) "file")
                (add-to-list 'org-agenda-files (org-element-property :path x))))))

问候

克日谢克

【问题讨论】:

  • Re: 交互式 - 可以使用 M-x command 执行交互式函数(也称为“命令”),而只能使用 M-: (function) 执行非交互式函数 - 请参阅 Emacs Lisp 手册了解更多详情,尤其是this sectionthis SO question

标签: emacs org-mode


【解决方案1】:

org AFAIK 中没有这样的内置功能。但是,您应该能够编写一个 lisp 函数来执行此操作。最低限度应该是这样的:

    (org-element-map
        (org-element-parse-buffer)
        'link
        (lambda (x) (message (org-element-property :path x))))

从当前缓冲区的解析树中选择所有链接元素,并对每个元素应用一个函数。该函数选择每个链接的路径属性并在回显区域中打印出来。您只想添加代码以选择“文件”类型的链接,并且您希望该函数将它们添加到 org-agenda-list(如果它们尚不存在)。这是一个功能如此强大的函数 - 请注意,您必须将此函数应用于 org-agenda-files 列表中的每个文件,这留作练习:

    (defun add-links-to-org-agenda-files ()
       (org-element-map  
           (org-element-parse-buffer)
           'link
           (lambda (x) 
             (if (equal (org-element-property :type x) "file")
                (add-to-list 'org-agenda-files (org-element-property :path x))))))

请参阅org-element API page 了解更多信息。

【讨论】: