从 org-capture 中获取当前缓冲区目录

Getting current buffer directory from within org-capture

我目前正在使用这个模板

(setq org-capture-templates
      `(("e" "ethz studies tasks"
         entry (file+function ,(concat org-directory "/ethz-tasks.org") (lambda ()
                                                                          (print (f-filename default-directory))
                                                                          (search-forward (f-filename default-directory))
                                                                          (move-end-of-line)
                                                                          (newline)))
         "** TODO %t [[file:%F][%f]]\n%?\n")))

试图让模板在文件名称的标题下归档关于当前文件的一点待办事项注释 parent 目录

* directory
** TODO <date> [[file:...][file]]
some extra info

我当前代码段的问题在于它使用了 default-directory,在捕获的上下文中,它似乎是“org”。我想获取在调用捕获之前我所在的目录的名称。

我应该为此使用哪个函数? 在 org capture 中,是否有比我正在做的更简单的方法来做到这一点?

org-capture 将点点滴滴的信息存储在一个 dynamically-scoped 变量 org-capture-plist 中。一旦捕获进程开始并创建捕获缓冲区,全局值将被复制到本地缓冲区变量 org-capture-current-plist。这是模板中所有格式的值的存储位置和从 (%f%F 等) 中获取的位置。

我没有测试过这些,所以你可能需要根据你发现的内容进行调整,但我相信你需要查询局部变量(尽管如果你发现它是nil,那么你可以尝试查询全局的)。在任何一种情况下,原始路径名都存储在 属性 :original-file 下,您可以使用

(org-capture-get :original-file t)    ; query the local plist

(org-capture-get :original-file)      ; query the global plist

取决于你想查询哪个plist。然后,您可以通过对结果调用 file-name-directory 来获取目录名称。

其中一个应该为您提供目录,然后您可以将其用作标题。我不确定标题是否已经存在:如果它必须事先存在,那么你必须做额外的工作,这个答案没有涵盖的工作。

完全未经测试,如果还不清楚的话。

编辑:这是对全局和本地 plist 的更详细的解释。

当您调用 org-capture 时,各种值被保存在全局 plist 中,然后最终创建一个捕获缓冲区并将这些值复制到 buffer-local plist 中。那时,捕获缓冲区正在等待输入,因此您可以启动一个 不同 捕获:经历相同的过程,所以现在全局 plist 具有第二次捕获的信息(直到它的缓冲区被创建等等)。

所以这真的取决于你在序列中的什么时候尝试访问你想要的值:如果它发生在创建捕获缓冲区之前(就像你的情况一样),那么你就可以从全局列表;但如果之后发生,你必须将它从本地 plist 中删除,因为全局 plist 可能指的是 不同 捕获。

所以你可能应该这样做:

   (let ((path (file-name-directory 
                  (or (org-capture-get :original-file t)
                      (org-capture-get :original-file)))))
      ...

即尝试首先将其从本地 plist 中取出,只有当本地 plist 为 nil 时才回退到全局 plist。这样,您就可以避免从错误的捕获上下文中获取值的问题。

我希望澄清情况。