【问题标题】:How to get org mode file "Title" and other file-level properties from an arbitrary file?如何从任意文件中获取组织模式文件“标题”和其他文件级属性?
【发布时间】:2021-03-11 00:11:36
【问题描述】:

我有这种格式的文件

#+TITLE: Magit Cheatsheet
:PROPERTIES:
:Status: Open
:Tags: tools, emacs, org, magit
:Creation: [2021-03-03 Wed]
:END:

我希望能够使用 elisp 读取给定文件名(不是当前打开的文件)的标题和这些属性。我找到了this,但它对我不起作用,而且对于像这样简单的事情来说似乎太复杂了。

【问题讨论】:

  • 您上面显示的内容不是合法的组织模式文件。做M-x org-lint 看看为什么。有两个问题::PROPERTIES:抽屉只在标题下是合法的(有other ways to define properties at the top level);并且有一个名为 TAGSspecial property 是 Org 模式在内部使用的(大小写无关紧要),它与您的 Tags 属性冲突。
  • @NickD 这改变了吗?我似乎记得看到了一些关于文件级属性抽屉的东西,该抽屉应该被释放..?
  • 是的,这进入了 9.4:请参阅 ORG-NEWS - 目前位于文件的第 594 行,但这可能会改变。并且org-lint 需要更新以识别这种可能性。

标签: emacs org-mode


【解决方案1】:

在您修复文件之前,我无法回答有关属性的问题(修复方式会影响建议的解决方案)。

但是,对于标题,以下代码有效(问:计算中最短的谎言是什么?答:有效!):

#+begin_src elisp :results drawer
  (defun ndk/get-keyword-key-value (kwd)
     (let ((data (cadr kwd)))
       (list (plist-get data :key)
             (plist-get data :value))))

  (defun ndk/org-current-buffer-get-title ()
      (nth 1
       (assoc "TITLE"
        (org-element-map (org-element-parse-buffer 'greater-element)
            '(keyword)
            #'ndk/get-keyword-key-value))))

  (defun ndk/org-file-get-title (file)
    (with-current-buffer (find-file-noselect file)
         (ndk/org-current-buffer-get-title)))

  (ndk/org-file-get-title "/tmp/foo86.org")
  #+end_src

主函数是最后一个ndk/org-file-get-title,它负责打开文件并在结果缓冲区上运行ndk/org-current-buffer-get-title 函数。后面的函数在解析器返回的数据子集上使用全能的org-element-map 函数(这只是为了提高效率):我们将ndk/get-keyword-key-value 函数映射到所有关键字元素上。此函数为调用它的每个关键字返回一个(key value) 列表,映射器将这些对累积到一个列表中。然后我们选择包含字符串“TITLE”的对作为键,(nth 1 ...) 调用获取对的值部分(键部分为(nth 0 ...))。

这也适用于处理#+PROPERTY 关键字,但处理标题下的属性抽屉会更复杂(我认为 - 我还没有尝试过)。

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2021-06-16
    • 2012-10-08
    • 2021-09-27
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多