【问题标题】:How to add tags completion to org mode capture?如何将标签完成添加到组织模式捕获?
【发布时间】:2025-12-09 04:55:01
【问题描述】:

我使用 org 模式的捕获功能来制作我所有的待办事项。它干净实用,让我可以在所有待办事项中添加一致的内容,包括标题提示、标签提示和自动插入创建日期。这是我的代码:

(setq org-capture-templates '((
     "t"                ; key
     "Todo"             ; description
     entry              ; type
     (file+headline "C:/.../org/notes.org" "tasks")       ; target
     "* TODO [#B] %^{Todo} :%^{Tags}: \n:PROPERTIES:\n:Created: %U\n:END:\n\n%?"  ; template
     :prepend t        ; properties
     :empty-lines 1    ; properties
     :created t        ; properties
     )))

但是,我的标签提示迫使我从内存中输入标签。如何从以下代码设置的标签列表中添加标签:

(setq org-tag-alist `(
              ("OFFICE"   . ?o)
              ("HOME"     . ?h)
              ("ERRAND"   . ?e) ))

当我的意思是在一个已经创建的任务的标题中时,当我点击 C-c C-c 并让我通过它们的快捷单字母“o”、“h”或“e”选择标签时,会弹出这个列表。

所以我的问题是:是否可以在我的捕获代码中包含这个弹出的标签列表?

【问题讨论】:

    标签: org-mode


    【解决方案1】:

    内置解决方案是使用%^g。来自org-capture-templates的帮助:

    %^g 提示输入标签,完成目标文件中的标签。

    %^G 提示输入标签,完成所有议程文件中的所有标签。

    您也可以通过调用一些添加标签的函数来“手动”执行此操作。添加标签通常使用org-set-tags 完成(这就是C-c C-c 正在做的事情)。所以,我们所要做的就是在我们的模板中使用%(func) 语法调用它:

    (setq org-capture-templates '((
         "t"                ; key
         "Todo"             ; description
         entry              ; type
         (file+headline "C:/.../org/notes.org" "tasks")       ; target
         "* TODO [#B] %^{Todo} %(org-set-tags) \n:PROPERTIES:\n:Created: %U\n:END:\n\n%?"  ; template
         :prepend t        ; properties
         :empty-lines 1    ; properties
         :created t        ; properties
         )))
    

    如果您有要从中选择的特定标签列表(比如org-tag-alist),您可以使用completing-read 从中选择:

    (completing-read "Tag: " (mapcar #'first org-tag-persistent-alist) nil t)
    

    【讨论】:

    • 啊……漂亮!多么强大的工具组织模式啊!非常感谢您的彻底回答:) %(org-set-tags) 让我可以直接访问org-tag-alist,而无需使用completing-read。但是,您的代码会在提示输入 todo 之前提示输入标记,这有点不合逻辑。顺序可以颠倒吗?
    • 我认为不能更改顺序; elisp 表达式似乎是首先要评估的东西。可能您可以将org-set-tags 添加到org-capture-before-finalize-hook,这会在您完成捕获后(即使用C-c C-c 后)要求标签
    • 需要这样的东西。但是,当我使用此代码时,我会进入标题:“** test %![Error: (wrong-number-of-arguments (1 . 1) 0)]”
    • @EmmanuelGoldstein - 认为功能已经改变 - tryorg-set-tags-command?