如何capture模板,使之可以获得上一个Entry的数据。

问题描述在图片里面,我现在没有解决的办法,这里不自动化觉得很痛苦啊。

请大家给我一点建议,谢谢了!

Org-capture 模版里面的%(sexp) 可以实现这个功能,sexp为自定义函数,写个函数返回上一条entry和+1的数据就可以了。

至于函数的话,你可以参考org-element来实现。

谢谢给方向,刚才看到org-element.el,有点复杂,我慢慢消化学习吧。谢谢你!

不熟悉 org-mode 的代码,从 Lisp 操作 org-mode 实在费劲,几乎没什么文档。

好不容易想办法找出你所说的「上一个 Entry」,或许有帮助。

(defun chunyang-org-last-child (olp)
  "返回 OLP 下最后一个 Heading 的标题."
  (let ((m (ignore-errors (org-find-olp olp 'this-buffer))))
    (when m
      (goto-char m)
      ;; Goto last child
      (org-end-of-subtree 'invisible-ok)
      (org-back-to-heading 'invisible-ok)
      ;; If there is no child, the point is not changed
      (when (/= m (point))
        (org-entry-get (point) "ITEM")))))

(with-temp-buffer
  (insert "* 音乐教育实践\n"
          "** hxy\n"
          "*** 课堂记录\n"
          "**** 1课, 2018-08-12\n"
          "**** 2课, 2018-08-19\n"
          "* 其它内容")
  (org-mode)
  (chunyang-org-last-child '("音乐教育实践" "hxy" "课堂记录")))
;; => "2课, 2018-08-19"

谢谢你!

你的代码在单独的lisp文件中运行起来是有效的,不过我加入到capture的模板中调用出错,可能是我的调用方式有问题。我调用如下,

然后capture出来的首行是下面

感觉函数没有被解释执行,然后遇到语法错误就中断了。

是需要这个环境,所以不能直接用在 org-capture-templates,你需要再写个函数把你的 ~/org/gen.org 也传进去,可能像下面这样

(defun chunyang-org-last-child (file olp)
  "返回 FILE 中 OLP 下最后一个 Heading 的标题."
  (with-temp-buffer
    (insert-file-contents file)
    (org-mode)
    (let ((m (ignore-errors (org-find-olp olp 'this-buffer))))
      (when m
        (goto-char m)
        ;; Goto last child
        (org-end-of-subtree 'invisible-ok)
        (org-back-to-heading 'invisible-ok)
        ;; If there is no child, the point is not changed
        (when (/= m (point))
          (org-entry-get (point) "ITEM"))))))

而且你自己还要处理返回 nil 的情况。我不清楚 org-capture-templates 的高级用法,需要你自己摸索。

好的,你已经给我很多启发了,我正在试验,然后在各种领悟中去学习elisp吧,哈哈。

谢谢你!