组织模式导出过滤所有标题匹配模式并推广子标题

时间:2017-10-30 06:43:03

标签: emacs elisp org-mode

我有一个大型组织文件,其中包含本学期我大学课程中的所有笔记。每个部分包含两个三级标题,称为“放映”和“读数”。在调用org-export-to-pdf时,我想过滤掉所有这些标题并递归地推广这些部分的子标题(可能是对org-do-promote的递归调用)。

虽然组织模式手册通常是这种事情的优秀资源,但我发现Advanced Configuration部分对于年轻,蓬勃发展的组织模式用户(又名我)来说有点简短。要充分掌握。如果经验丰富的Emacs用户可以指导我正确的方向来构建这个功能,那将非常感激。

1 个答案:

答案 0 :(得分:2)

我使用org-map-entriesUsing the mapping API)上的文档以及手册Advanced Configuration部分中的摘要示例一起攻击了某些内容。

(defun promote-screenings-and-readings (&optional backend)
  (org-map-entries
   (lambda ()
     (let ((point (point))
           (heading
            (buffer-substring-no-properties
             (point)
             (save-excursion
               (forward-line)
               (point)))))
       (when
           (or
            (string= heading "*** Screenings\n")
            (string= heading "*** Readings\n"))
         (org-map-entries
          (lambda ()
            (unless (= (point) point)
              (org-promote)))
          nil
          'tree)
         (forward-line)
         (delete-region point (point)))))))


(add-hook 'org-export-before-parsing-hook 'promote-screenings-and-readings)

promote-screenings-and-readings提升子树中的所有条目,除子树的根目录外,然后删除标题。例如,在文件上运行它

* Foo
** Bar
*** Screenings
**** A
***** D
**** B
**** C

产生

* Foo
** Bar
*** A
**** D
*** B
*** C

警告:promote-screenings-and-readings仅删除标题,而不是在第一次放映或阅读之前删除的内容。如果您需要,只需从lambda返回(point),而不是转发该行,使用最小点(如果存在)。