如何在org capture时根据输入的todo标题新建目录

如何在org capture时根据输入的todo标题新建目录?

org capture template例子并没看到类似的说明

能描述的更清楚一些吗?

是创建时创建 TODO 标题,这个意思吗?

还是说在 Capture 过程中输入标题来新建标题

创建todo时

按照todo输入的描述任务xxx

在某一路径新建目录,目录名xxx

我可不可以理解为:

在创建标题时,在标题上使用 org 提供的 attach 功能来创建一个与标题关联的文件夹。

还是说根据标题中的信息来指定文件和文件目录创建文件夹。

不管是前者还是后者,都可以使用 %(exp) 来完成,也就是在模板中调用 org 函数来执行对应操作。

如果需要例子的话,我可以写一个。

是前者的意思,attach功能没用过,可以给个例子最好

这个问题我想的简单了点,按我的理解的话,帖子想要实现的功能是在 capture 过程中完成 attach,但是capture 的求值环境并不是目标 buffer(好像是空环境,但是我没太注意)。换言之,在创建使用 capture 模板创建 capture 中的内容时,目标 buffer 中还不存在新 capture 的标题。所以处理起来需要用一点小 trik。

最简单的方法应该是在捕获完成后创建 attach,即在新捕获的标题上按 C-c C-a f,这样就可以创建标题的 attach 目录了,而且 emacs 默认会使用 dired 打开它。如果想使用系统的文件管理器(Windows 上就是资源管理器),可以修改 org-file-apps 中的 directory 项为 default ,我是这样改的:

(setq org-file-apps
      (cl-substitute-if '(directory . default) 
                         (lambda (x) (eq (car x) 'directory)) org-file-apps))

如果想要实现 capture 时创建 attach,需要用到其他的一些函数。原先我打算调用 org-attach-dir-get-create ,但是 capture buffer 和 target buffer 并不是同一 buffer,对应文件不同,所以不成功。如果使用 with-current-buffer 也不行,添加的 attach 会错位,因为模板中代码求值时新标题还不存在,attach 会附加到其他已存在的标题上。

我这里抄了一下 org-attach-dir-get-create 的实现,现在就不需要必须在 org 文件中了:

(defun yygen-cap-headline (filename)
  (with-current-buffer (get-file-buffer filename)
    (let* ((id (org-id-new))
	   (dir (org-attach-dir-from-id id)))
      (make-directory dir t)
      id)))

具体的模板如下:

("q" "try it" entry (file+headline "d:/1.org" "TRY") "* Hello
:PROPERTIES:
:ID: %(yygen-cap-headline \"%F\")
:END:")

实现原理就是生成一个 org id 和对应文件夹,非常简单。

16

1 个赞