如何正确使用org-capture的function选项?

时间:2019-05-23 11:18:01

标签: emacs org-mode

我想使用function选项在orgmode捕获模板中动态打开正确的文件:

("a" "foo" plain
    (function my-visit-timestamped-file)
    "<some content>")

函数my-visit-timestamped-file定义为

(defun my-visit-timestamped-file ()
  (interactive)
  (let
      ((theDate (format-time-string "%Y%m%d-%H%M.org")))
  (find-file (concat "<some_path>" theDate))))

如果我运行捕获模板a,则emacs将在缓冲区中打开文件<some_path>theDate,并使用该文件打开捕获缓冲区。 因此,我的窗口分为两个显示相同内容的缓冲区。

函数my-visit-timestamped-file是否可以以某种方式更改,以使缓冲区没有打开但组织捕获仍然获得正确的文件指针/文件句柄?

2 个答案:

答案 0 :(得分:1)

您可能希望使用find-file-noselect而不是find-file。请注意,org-capture-templates的文档是这样说的:

         (function function-finding-location)
            Most general way: write your own function which both visits
            the file and moves point to the right location

,因此您可能需要添加一些代码以转到文件中的正确位置(我猜是(point-min)(point-max))。可能看起来像这样:

(defun my-visit-timestamped-file ()
  (interactive)
  (let* ((the-date (format-time-string "%Y%m%d-%H%M.org"))
         (the-buffer (find-file-noselect (expand-file-name the-date "/some/path/"))))
    (with-current-buffer the-buffer
      (goto-char (point-min)))
    the-buffer))

答案 1 :(得分:0)

@jpkotta的回答为我指明了正确的方向。 该错误已消失,但捕获缓冲区的内容始终粘贴到我当前正在编辑的缓冲区中。

在组织模式邮件列表上的旧线程中,我找到了问题的答案。该功能应为:

batch.rabbitmq.host=[HOST_NAME OR IP Address]

链接到邮件列表线程:https://lists.gnu.org/archive/html/emacs-orgmode/2013-11/msg00676.html