有没有办法用当前时间戳插入 org-mode 模板?

Posted

技术标签:

【中文标题】有没有办法用当前时间戳插入 org-mode 模板?【英文标题】:Is there a way to insert org-mode template with current timestamp? 【发布时间】:2020-11-17 17:32:19 【问题描述】:

是否可以通过键入<e 并点击<TAB> 在组织模式下插入模板,这将导致:

:PROPERTIES:
:ERSTELLT: [2020-11-17 Di 21:18]
:END:

通过查看这些参考资料:

Org-mode template expansions for easy code block insertion

Creating Org Mode Structure Templates,

我能够定义自己的模板,但没有时间戳

:PROPERTIES:
:ERSTELLT:
:END:

插入时间戳的函数是:(org-time-stamp '(16) t),但是它会在 org-mode 开始时间进行评估并继续插入相同的时间戳:

(eval-after-load 'org
  '(progn
     (add-to-list 'org-structure-template-alist
          (list "r"
             (concat ":PROPERTIES:\n"
                     ":ERSTELLT: " (org-time-stamp '(16) t) "\n"
                     ":END:" )
             ))))

Emacs 版本:GNU Emacs 26.3 (build 1, i686-w64-mingw32) of 2020-04-03

组织模式版本:9.1.9 (release_9.1.9-65-g5e4542)

【问题讨论】:

org-structure-template-alist 的格式(和多功能性)在 Org 9.2 中发生了变化:上面的引用使用了现在已经过时的 old 版本。理由是还有其他模板扩展机制(例如 tempo 和 yasn-ps),因此 Org 模式不需要另一个。 使用org-structure-template-alist 可能会更好:即使您可以在当前版本中使用,但升级后将无法使用。但是请编辑您的问题并添加您正在使用的组织模式版本:这应该可以帮助人们找出建议的内容。 @NickD 谢谢,我想我需要更新我的 emacs 并改用 yasn-p =) 【参考方案1】:

您最好为此目的定义一个捕获模板。这真的取决于你想做什么。通常,如果您简要概述您想要的实际结果/功能,而不仅仅是您认为可能是解决方案的一部分,您会得到更好的答案。

Org 的捕获模板系统非常灵活和强大,可以轻松添加新条目、属性绘制、截止日期等。它还支持广泛的 %- 控制序列,用于设置属性、添加活动和非活动等操作时间戳、捕获链接、当前选择、剪贴板项目等。

下面是我的捕获模板定义的副本,供您参考。费用模板使用属性并设置属性,而其他一些模板则在各个地方的条目中添加时间戳。使用捕获模板还可以完成更多工作。

顺便说一句,我认为您对 org-time-stamp 函数的使用不符合您的要求。检查文档,但我认为您真正想要的当前时间戳是 (org-time-stamp t t)

(setq org-capture-templates
  (quote
   (("t" "todo" entry
     (file+headline "~/Documents/org-data/refile.org" "Tasks")
     "* TODO %?\n\n %a"
     :empty-lines-after 1)
    ("r" "respond" entry
     (file+headline "~/Documents/org-data/refile.org" "Tasks")
     "* NEXT Respond to %:from\n SCHEDULED: %t\n\n %:subject\n %i\n %? \n %a"
     :empty-lines-after 1)
    ("n" "note" entry
     (file "~/Documents/org-data/notes.org")
     "* %U %? :NOTE:\n\n %i\n %a"
     :empty-lines-after 1)
    ("p" "phone" entry
     (file+headline "~/Documents/org-data/refile.org" "Comms")
     "* Pone: %? :PHONE:\n\n"
     :empty-lines-after 1 :clock-in t :clock-resume t)
    ("e" "expense" entry
     (file+headline "~/Documents/org-data/refile.org" "Expenses")
     "* Expense: %^Description :EXPENSE:\n :PROPERTIES:\n :Description: %\\1\n :Date: %u\n :Amount: %^Amount\n :END:\n\n | Date | %u |\n | Description | %\\1 |\n | Amount | %\\2 |\n"
     :empty-line-after 1)
    ("m" "mail" entry
     (file+headline "~/Documents/org-data/refile.org" "Comms")
     "* %U Mail:%? %:subject \n\n From %:from\n\n %i\n %a"
     :empty-lines-after 1))))

【讨论】:

【参考方案2】:

您是否有理由将其视为模板?

您似乎只是想插入一个属性,您可以使用以下方法:

(org-entry-put (point) "ERSTELLT" (format-time-string "[%Y-%M-%d %a %H:%M]" (float-time)))

这将为当前点下的标题插入属性“ERSTELLT”(并在必要时创建一个新的:PROPERTIES: 抽屉),当前纪元时间格式化为组织模式时间戳。如果您想要不同的时间戳,可以将(float-time) 替换为您想要表示纪元时间的任何整数。

您无法像模板一样将属性抽屉插入到任何您想要的位置,但我不确定为什么您需要将属性抽屉仅作为标题的一部分才有意义。

【讨论】:

我之所以使用这些属性是因为 orgzly app for android 会自动创建它们,并且在同步到桌面时它们通常对搜索很有用。

以上是关于有没有办法用当前时间戳插入 org-mode 模板?的主要内容,如果未能解决你的问题,请参考以下文章

sql语句关于时间与时间戳

org-mode 缓冲区 Latex 语法高亮

将 UTC 时间戳(毫秒)插入 Oracle 时间戳列

有没有办法从时间戳类型列中获取 DateTime 值?

如何为 Org-mode 内联源代码 src_lang 语法高亮?

用Org-mode管理emacs配置