with-org-gtd-context

这段代码是一个宏定义,名为 with-org-gtd-context。它的作用是将 BODY 中的代码放在一个特定的上下文环境中运行,这个上下文环境包括了一些 org-gtd 的设置。

这个宏定义中包含了一些变量的设置,比如:

等等。这些变量的值都是从 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* 作用如下:

let* 介绍

Emacs Lisp 中,let* 函数是一种非常重要的特殊形式(special form),它用于创建一个新的作用域,并在这个作用域内定义一系列的局部变量。与 let 不同的是,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-nextorg-gtd-todoorg-gtd-waitorg-gtd-done 和 org-gtd-canceled 等等。这些状态可以用于跟踪任务的进度和状态。

为什么 ((sequence 前面也有一个撇?最终结果是字符串还是字符串数组?

在这个列表中,使用了 ((sequence 这个表达式来定义一个任务状态序列。这个表达式被包含在一个反引号表达式中,因此它会被解析为一个字符串。这个字符串包含了多个子字符串,它们之间用逗号分隔。这些子字符串包括了一些变量和字符串,用于定义任务状态的不同阶段。

03

测试,在 Scratch 中编写如下代码:


本文作者:Maeiee

本文链接:with-org-gtd-context

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!