是否可以向列表添加元素,并让列表在关闭 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 的练习”;-)。那里有很多例子。
我有一个名为 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 的练习”;-)。那里有很多例子。