Debugging 组织模式:Symbol';s函数定义无效:\,

Debugging 组织模式:Symbol';s函数定义无效:\,,debugging,emacs,org-mode,Debugging,Emacs,Org Mode,我正在尝试创建一个组织模式捕获模板,将每个条目写入基于时间的文件名 首先,有一个在暂存缓冲区中工作的助手函数: ;; 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 da

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

首先,有一个在暂存缓冲区中工作的助手函数:

;; 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) ))
我得到一个错误:
符号的函数定义无效:\,


在谷歌很难找到答案,因为有逗号字符。我已经查看了文档,我不确定我做错了什么。

逗号表示您希望评估对
捕获基于日期的文件的调用,但是周围的表单是引用的,而不是反引用的,所以这不起作用

i、 e.这是两件完全不同的事情:

'(foo ,(bar) baz)
`(foo ,(bar) baz)
参见C-hig
(elisp)后引号

在后引形式中,逗号使后面的形式立即求值,然后将求值结果替换为后引形式。在引用的形式中,
,(bar)
仅保留为文字
,(bar)

您看到的特定错误的原因是lisp读取器产生以下结果:

ELISP> (read ",(bar)")
(\, (bar))
因此,任何对
,(bar)
求值的尝试实际上都在调用不存在的函数

(您将遇到的一个不太明显的错误是FWIW。)


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

谢谢,我在问题中添加了更多的代码。它以
(引号)字符开头。如果我使用反勾号或删除逗号,我会得到一个错误(
错误的类型参数:stringp,nil
),但它不会告诉我错误在哪里。我是一个新手,即使在阅读了几次文档页面之后,也无法完全理解正在发生的事情。哦——根据
C-hv组织捕获模板
,您缺少一个参数。它指定
(文件+标题“path/to/file”“node headline”)
,您只提供一个参数(调用
捕获基于日期的文件的返回值),该参数将是
的“path/to/file”
参数。您没有提供
“node headline”
参数。如果您解决了这个问题,那么根据更新的代码,我希望将
'
更改为
`
会产生预期效果,删除逗号(而不是反引号)可能会也可能不会起作用。如果它确实有效,并且如果您希望在使用
org capture templates
时日期可能会发生变化,那么删除逗号将是一个不错的选择。谢谢。你写的和我写的只是关于工作的。出于某种原因,它会对路径的另一部分进行降级,这不应该被降级,但我想我能弄明白。在LISP中backtick是什么意思