with-org-gtd-context
这段代码是一个宏定义,名为 with-org-gtd-context
。它的作用是将 BODY
中的代码放在一个特定的上下文环境中运行,这个上下文环境包括了一些 org-gtd
的设置。
这个宏定义中包含了一些变量的设置,比如:
org-use-property-inheritance
org-todo-keywords
org-archive-location
等等。这些变量的值都是从 org-gtd
中获取的。
在宏定义的最后,使用了 unwind-protect
来确保在 BODY
中的代码执行完毕后,会执行一些清理工作。
(defmacro with-org-gtd-context (&rest body)
"Wrap BODY... in this macro to inherit the org-gtd settings for your logic."
(declare (debug t) (indent 2))
`(let* ((org-use-property-inheritance "ORG_GTD")
(org-todo-keywords `((sequence ,(string-join `(,org-gtd-next ,org-gtd-next-suffix))
,(string-join `(,org-gtd-todo ,org-gtd-todo-suffix))
,(string-join `(,org-gtd-wait ,org-gtd-wait-suffix))
"|"
,(string-join `(,org-gtd-done ,org-gtd-done-suffix))
,(string-join `(,org-gtd-canceled ,org-gtd-canceled-suffix)))))
;; (org-log-done 'time)
;; (org-log-done-with-time t)
;; (org-log-refile 'time)
(org-archive-location (funcall org-gtd-archive-location))
;(org-refile-use-outline-path nil)
(org-stuck-projects org-gtd-stuck-projects)
(org-odd-levels-only nil)
(org-agenda-files (org-gtd-core--agenda-files))
(org-agenda-property-list `(,org-gtd-delegate-property)))
(unwind-protect
(progn
(advice-add 'org-agenda-files :filter-return #'org-gtd-core--uniq)
,@body)
(progn
(advice-remove 'org-agenda-files #'org-gtd-core--uniq)))))
逐行解读:
01
(declare (debug t) (indent 2))
这段代码是 Emacs Lisp 中的一个函数声明,包含了两个声明:(debug t)
和 (indent 2)
。
(debug t)
声明用于启用函数的调试模式。当调试模式启用时,Emacs Lisp 会打印出关于函数执行的额外信息,例如传递给函数的参数和函数返回的值。这对于调试复杂的函数或理解函数的工作原理非常有用。
(indent 2)
声明用于指定函数的缩进级别。在 Emacs Lisp 中,缩进用于使代码更易读和理解。通过指定函数的缩进级别,Emacs Lisp 可以在编辑器中自动缩进代码。这使得代码更易于阅读和理解。
02
let* 作用如下:
前面为什么有一个撇?
这个符号是 Emacs Lisp 中的一种语法,用于创建一个字符串。在这个例子中,符号后面跟着的是一个 let*
表达式,这个表达式会被解析为一个字符串。这个字符串可以被用于一些特殊的操作,例如将它传递给一个函数或者将它插入到一个缓冲区中。
在 Emacs Lisp 中,使用该符号创建字符串的语法被称为“反引号表达式”或者“quasiquote”。它允许程序员在字符串中插入变量或者表达式,从而使字符串更加灵活和动态。
let* 内容:
这段代码是 Emacs Lisp 中的一个 let*
表达式,用于定义一些变量。在这个表达式中,定义了两个变量:org-use-property-inheritance
和 org-todo-keywords
。
org-use-property-inheritance
变量的值被设置为字符串 "ORG_GTD"
。这个变量的作用是告诉 Emacs Lisp 在处理 org-mode
文件时,使用 ORG_GTD
这个属性来继承上级节点的属性。
org-todo-keywords
变量的值是一个列表,包含了一些字符串和变量。这个变量的作用是定义 org-mode
文件中的任务状态。在这个列表中,使用了 string-join
函数将一些字符串和变量拼接成了一个字符串。这些字符串和变量定义了任务的不同状态,例如 org-gtd-next
、org-gtd-todo
、org-gtd-wait
、org-gtd-done
和 org-gtd-canceled
等等。这些状态可以用于跟踪任务的进度和状态。
为什么 ((sequence
前面也有一个撇?最终结果是字符串还是字符串数组?
在这个列表中,使用了 ((sequence
这个表达式来定义一个任务状态序列。这个表达式被包含在一个反引号表达式中,因此它会被解析为一个字符串。这个字符串包含了多个子字符串,它们之间用逗号分隔。这些子字符串包括了一些变量和字符串,用于定义任务状态的不同阶段。
03
测试,在 Scratch 中编写如下代码:
本文作者:Maeiee
本文链接:with-org-gtd-context
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!