【发布时间】:2012-12-19 00:53:58
【问题描述】:
我正在使用 org-mode 并尝试设置捕获模板以将 TODO 放在当前日期命名的标题下。例如,对于今天(2012 年 12 月 12 日),我的标题是:
*** Dec 12
所以我在我的模板中尝试了这个:
'(org-capture-templates (quote
(
;;; note: this template works
("d" "Defect" entry (file+headline "~/doc/org/defects.org" "Open") "** TODO %^{Defect}")
;;; this template does not
("t" "Todo" entry (file+headline "~/doc/org/timesheet.org" (format-time-string "%h %e")) "**** TODO %i%?"))))
但是,我得到了 wrong-type-argument stringp 异常。这是堆栈跟踪的一些内容:
Debugger entered--Lisp error: (wrong-type-argument stringp (format-time-string "%h %e"))
regexp-quote((format-time-string "%h %e"))
(format org-complex-heading-regexp-format (regexp-quote hd))
(re-search-forward (format org-complex-heading-regexp-format (regexp-quote hd)) nil t)
(if (re-search-forward (format org-complex-heading-regexp-format ...) nil t) (goto-char (point-at-bol)) (goto-char (point-max)) (or (bolp) (insert "\n")) (insert "* " hd "\n") (beginning-of-line 0))
... snip ...
我感觉这更像是一个通用的 Emacs Lisp 问题,而不是 org-mode 问题,但我不确定它可能是什么。我遇到了一篇帖子(我再也找不到它了),上面说通过将 format-time-string 放入括号中,Lisp 没有将其视为字符串。这似乎是正确的,因为如果我评估它,除非我进行插入,否则不会打印任何内容。但我不想插入它 - 我希望表达式被评估并用作字符串。 Another question 让我有类似的想法,我必须做一些事情才能让格式化的字符串显示为字符串。
【问题讨论】:
-
模板的定义确实有问题 - 您尝试将函数调用放入 format-time-string 的部分没有被评估,而是被视为字符串,但是你给了它一个包含两个对象的列表,一个是符号,另一个是字符串。不过,目前我对 org-mode 模板的了解还不够,无法真正为您提供更好的帮助。
-
我认为你对那个符号和字符串是正确的。如果我用一个简单的字符串(例如,“Dec 12”)替换 (format-time-string "%h %e") 表达式,它就可以工作。如果我通过插入缓冲区来评估格式时间字符串,它也会返回“Dec 12”。但由于某种原因,模板不喜欢看到它。感谢您的想法。
-
那一定是它。我想令人困惑的部分是文件+标题放在模板中的方式似乎是一个函数调用,所以通过在其中嵌套另一个调用来执行您所做的事情似乎是合乎逻辑的。 Org-mode 已经对时间戳提供了一些支持——它对你有用吗?
-
我不这么认为,在这种情况下。我对文件+标题捕获模板所做的是将 TODO 归档在带有嵌入日期的标题下,这是我自己的自定义过程。一种更规范的方式会涉及到议程,但我认为没有办法使用时间戳将新的 TODO 归档到我想要的地方。不过,好主意。
-
Mmm... 当您引用所有列表时,似乎未评估对
format-time-string的函数调用。此外,format-time-string每天只会产生一个值,因此它是一个常数。您可以尝试用准引号替换引号并用逗号评估表达式。我会回答这个问题。