是否可以向列表添加元素,并让列表在关闭 Emacs 会话后保存这些值?

Is it possible to add elements to a list, and have the list save these values even after closing an Emacs session?

我有一个名为 my-projects 的变量,它指向我当前项目的字符串列表(例如,"chores""lectures" 等)。每当我调用一个函数时,比如说 (completing-read ...),并且我碰巧在运行中创建了一个新项目,我希望有一个函数可以将这个新项目永远添加到项目列表中。我想不通的是如何“保存”更新的列表 my-projects 以便即使在当前 Emacs 会话结束后它也能保留新添加的值。我只能想出复杂的解决方案,涉及替换定义变量 my-projects 的文件中的字符串,但我推测必须有更有效的方法来执行此操作。

您可以使用 defcustom 创建用户可自定义的变量。 Emacs 已经有内置的方法来保存自定义变量的值。当您开始一个新项目时,使用 customize-var 以交互方式更新它的值。

您可以先开发一个将数据结构保存到文件的函数。

(defvar my-projects
  '("chores"
    "lectures"))

(defun my-save-my-projects ()
  "Saves my projects in my home folder."
  (interactive)
  (with-temp-buffer
    (insert (prin1-to-string my-projects))
    (write-region (point-min)
                  (point-max)
                  "~/.my-projects.eld")))

接下来您可能想要找到一个合适的事件,您可以将保存功能挂接到该事件上。例如,您可以在 Emacs 关闭时保存您的项目列表:

(when (not (memq 'my-save-my-projects kill-emacs-hook))
  (add-hook 'kill-emacs-hook
            'my-save-my-projects)))

您的用例可能有更好的挂钩。

最终,您将希望在 Emacs 启动时通过读取该文件来重新填充您的变量。我会把它留在这里(或作为“reader 的练习”;-)。那里有很多例子。