org-capture 模版的 function 有文档资料吗?有传参吗

我在阅读使用 Template elements (The Org Manual)

然后有一个需求就是我要在当前计时任务的entry下面进行org-capture,

那么 org-capture提供了一个 (clock) target

‘(clock)’
File to the entry that is currently being clocked.

然后我是这么写的

	("r" "Task Map Reduce" entry (clock) "%?\n %T\n %a" :clock-in t :clock-resume t)

因为我看到

entry
An Org mode node, with a headline. Will be filed as the child of the target entry or as a top-level entry. The target file should be an Org file.

可以成为target的child节点

但是测试后,发现插入template中需要明确表示headline 不然的话报错

org-capture: Capture template ‘r’: Template is not a valid Org entry or tree

需要写成

	("r" "Task Map Reduce" entry (clock) "* %?\n %T\n %a" :clock-in t :clock-resume t)

就是template中要加上 *

但是这样就有一个问题,就是不明确要几个*

那么我看到Template elements (The Org Manual) 这里提供了 function来获取template, 那么好像可以通过获取 当前 clock计时的entry是哪个层级的 headline,然后再加上一个 * 就可以了。

那现在问题是 function怎么写? 有传参吗?

这个是通过 org-capture--run-template-functions 来执行的。看代码能知道,是无参的函数。然后文档虽然不在 function 这一节,前两个小节里有提到 function 是无参的。

要怎么写的话,你可能得使用 org-get-heading 来当前层级。然后我不太清楚 capture 时你的 point 是哪里,可能还得移动一下。或者先用 capture 的 location 写个函数定位到位置,然后在这里再用这类函数获取信息来生成。

1 个赞

这个只需要在模板里面写一个 * 就行,org-capture 会根据目标 headline 的层级帮你加上一级

1 个赞

勉勉强强写成了一个功能

(defun org-capture/does-have-statistic (checklist-or-not)
  (save-excursion
  (let ((cookie-re "\\(\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)\\)"))
    (org-clock-goto)
    ;(previous-line)
    (if (re-search-forward cookie-re (save-excursion (next-line) (point)) t)
	(message "find it")
      (org-clock-goto)
      (end-of-line)
      (if checklist-or-not
	  (insert " [/]")
	(insert "[%]"))))))

(defun org-capture/task-map-reduce-checkitem-template ()
  (org-capture/does-have-statistic t)
  "- [ ] %? %U\n")

(defun org-capture/task-map-reduce-entry-template ()
  (org-capture/does-have-statistic nil)
  "* %? %U\n")

(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "" "Tasks") "* TODO %^{任务内容}\n %?\n %U\n %a")
	("j" "Journal" entry (file+datetree (concat org-directory "/journal.org")) "* %?\nEntered on %U\n %i\n %a")
	("r" "Clocked Task Map Reduce")
	("rc" "Checklist form" checkitem (clock) (function org-capture/task-map-reduce-checkitem-template) )
	("ri" "Item form" entry (clock) (function org-capture/task-map-reduce-entry-template) :clock-in t :clock-resume t)))

实现的功能,比方说你正在focus一个任务,一般focus的任务打开了clock,然后任务中发现要拆解任务,使用 org-capture, 可以将任务添加成当前计时任务的子任务,并在heading处添加 statistic [%] [/]