【问题标题】:Org Mode: Symbol's function definition is void: \,组织模式:Symbol 的函数定义为 void:\,
【发布时间】:2017-11-27 09:51:17
【问题描述】:

我正在尝试创建一个将每个条目写入基于时间的文件名的 Org 模式捕获模板。

首先,在暂存缓冲区中有一个辅助函数:

;; Example input: (capture-date-based-file "~/path/to/logs/" "log")
;; Expected output: "~/path/to/logs/2017-11-27-monday-log.org"
(defun capture-date-based-file (path entry-type)
  "Create a date-based file name based on the given type."
  (downcase (concat path (format-time-string "%Y-%m-%d-%A-") entry-type ".org")))

然后,在捕获模板列表中使用它:

(setq org-capture-templates
      '(("l" "Log" entry (file+headline ,(capture-date-based-file "~/path/to/logs/" "log"))
         "* %?\n%U\n" :clock-in t :clock-resume t) ))

我收到一个错误:Symbol's function definition is void: \,

由于逗号字符,很难在 Google 中找到答案。我查看了文档,但我不确定我做错了什么。

【问题讨论】:

标签: debugging emacs org-mode


【解决方案1】:

逗号表示您想要评估capture-date-based-file 的调用,但周围的形式是引用而不是反引用 ,所以这行不通。

即这是两个完全不同的东西:

'(foo ,(bar) baz)
`(foo ,(bar) baz)

C-hig (elisp)Backquote RET

在反引号形式中,逗号使后面的形式立即被计算,然后将该计算的结果代入反引号形式。在引用的形式中,,(bar) 仅保留为文字 ,(bar)

您看到的特定错误的原因是 lisp 阅读器产生以下内容:

ELISP> (read ",(bar)")
(\, (bar))

因此,任何评估 ,(bar) 的尝试实际上都是在调用不存在的函数 \,

(您会遇到的不太明显的错误之一,FWIW。)

在您的场景中,我假设 org 将该特定表单从模板结构中提取出来并对其进行评估。 M-x toggle-debug-on-error 很可能会准确地告诉您发生这种情况的地点和时间。

【讨论】:

  • 谢谢,我在我的问题中添加了更多代码。它以'(引号)字符开头。如果我使用反引号或删除逗号,我会收到一个错误 (Wrong type argument: stringp, nil),但它不会告诉我错误在哪里。我太新了,即使在阅读了几次文档页面之后,也无法完全理解发生了什么。
  • 哦——根据C-h v org-capture-templates,您缺少一个参数。它指定了(file+headline "path/to/file" "node headline"),您只提供了一个参数(对capture-date-based-file 的调用的返回值),这将是"path/to/file" 参数。您没有提供 "node headline" 参数。
  • 如果你解决了这个问题,根据更新的代码,我希望将 ' 更改为 ` 会产生预期的效果,并且删除逗号(而不是反引号)可能会也可能不会。如果它确实有效,并且如果您希望在使用 org-capture-templates 时可能会改变日期,那么删除逗号将是可行的方法。
  • 谢谢。在你写的和this之间,我只是在工作。出于某种原因,它缩小了路径的另一部分不应该被缩小的部分,但我想我可以弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多