关于持久化数据的请教。

我是使用readprin1函数,读取和储存数据;同时创建了一个modelocal变量,mode开启时读数据到变量中,并将数据储存函数加入kill-buffer-hook中,关闭buffer时自动保存数据。

问题在于,在关闭bufferlocal变量数据应该就没了,导致储存到本地文件的数据为nil,有什么办法能避免这个问题吗?

请问有示例代码吗?看文档描述这个 hook 在 buffer 关闭之前被调用,应该没问题

我没有具体去研究这个机制,用defvar定义的变量就没问题,而用defvar-local定义或setq-local转化的local变量就有这个问题。我再测试下。

所以有代码吗 :joy:,最简单的那种

setq-local改为setq就可以

with-temp-file 的锅

with-temp-file 会创建一个临时 buffer 并进入,这样位于当前 buffer 中的 buffer-local 变量 data 就读不到了,最简单的修改是这样:

(defun ttt-hello ()
  (when (derived-mode-p 'ttt-mode)
    (let ((tmp data))
      (with-temp-file ".ttt"
	(prin1 tmp (current-buffer))))))

(add-hook 'kill-buffer-hook 'ttt-hello)

在 with-temp-file 外面创建一个保存 data 的变量,这样在 with-temp-file 内部就可见了

1 个赞

非常感谢,确实是这样!

另外,等 emacs 29 正式发布了就有数据库用了 :innocent: