gpt4 book ai didi

emacs - 在具有指定标签的条目上的 org-after-todo-state-change-hook 上执行代码

转载 作者:行者123 更新时间:2023-12-01 23:11:49 25 4
gpt4 key购买 nike

我有一些内容如下的组织文件:

* HOLD Some todo heading             :project:
#+BEGIN_SRC shell
grunt watch
#+END_SRC
* TODO Some other heading :test:
#+BEGIN_SRC emacs-lisp
(message "TEST")
#+END_SRC

我想从 HOLD转至 INPROGRESS打卡时的状态。这很容易,我明白了。

然后在 org-after-todo-state-change-hook我想执行条目中包含的代码,但只针对特定的标签。

所以,我得到了:
(defun tester/after-change-hook()
"Test function on hook."
(when (string= org-state "INPROGRESS")

;; DO SOMETHING on entry with 'project' tag

;; DO SOMETHING on entry with 'test' tag

;; MAYBE TRY TO EXECUTE CODE ON entry with 'project' tag

;; MAYBE TRY TO EXECUTE CODE ON entry with 'test' tag

)
)
(add-hook 'org-after-todo-state-change-hook 'tester/after-change-hook)

不幸的是,我不知道如何编写一个函数来在特定标签上执行代码或在特定标签上执行内联代码。

我一直在尝试 org-scan-tags函数或 org-element-map .

我可以看到 other people can make use of them .

但不幸的是,所有这些 Lisp 的东西对我来说就像是一种黑魔法。
我不知道如何编写函数来测试当前计时任务上的标签。
有人可以帮我解决这个 lisp 语法吗?
理论上,我知道做我想做的事需要哪些功能。
在现实生活中,我不知道如何用 lisp 写这个。

最佳答案

匹配标签列表中的成员的一种方法是使用类似 (member "test" tags) 的内容。 -- 请参见下面的示例,其中存在名为 test 的标签如果标签名为 test,将产生一条祝贺消息,或一条 go-fish 消息。不存在。您还可以使用正则表达式来匹配整个单词或单词的一部分,但这超出了本示例的范围。

以下是测试以下示例的 4 步方法。 [该示例由@lawlist 使用 Org 版本 8.2.5c 进行了测试。]

  • (1) 将我的整个代码复制并粘贴到您的 .emacs 中文件;保存文件;并且,重新启动 Emacs。
  • (2) 打开一个新的缓冲区并输入:
    * This is a task. :test:lawlist:
  • (3) M-x org-mode
  • (4) 将光标放在您刚刚输入的行上的任意位置,然后: M-x example

  • 一旦您启动并运行示例(无需进行任何修改),您就可以慢慢进行自己的修改——在此过程中的各个阶段不断测试您的新代码,这样您的编码中的任何错误都不会走得太远失控(这会使调试变得更加困难)。
    (require 'org)

    (require 'org-element)

    (defun example ()
    (interactive)
    (save-excursion
    (org-back-to-heading t)
    (let* (
    (element (org-element-at-point))
    (title (org-element-property :title element))
    (tags (org-element-property :tags element)))
    (cond
    ((and
    (equal title "")
    (not (equal tags nil)))
    (error "The `title` cannot be blank."))
    ((and
    (equal tags nil)
    (not (equal title "")))
    (error "The `tags` cannot be blank."))
    ((and
    (equal title "")
    (equal tags nil))
    (error "The `title` and `tags` cannot be blank."))
    ((and
    (not (equal tags nil))
    (not (equal title "")))
    (message "TITLE: %s | TAG(S): %s" title tags)
    (if (member "test" tags)
    (message "Congratulations: You found a match.")
    (message "Uh-oh -- no match -- go fish!"))) ))))

    关于emacs - 在具有指定标签的条目上的 org-after-todo-state-change-hook 上执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284346/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com