Elisp:如何在文件中保存数据?

Enf*_*ors 14 persistence elisp

我想将数据保存到我的elisp程序中的文件中.我有一个多维列表,我想保存到文件,所以我可以在下次程序运行时恢复它.最简单/最好的方法是什么?

当然,我意识到我可以简单地将数据写入自定义格式的缓冲区然后保存缓冲区,但是当我想要恢复它时,我必须编写一个函数来解析该数据格式.我宁愿不必那样做.

在Python中,有一个Pickle模块,它允许您将对象"转储"到磁盘并非常容易地恢复它们.elisp有类似的东西吗?

Tre*_*son 14

这个' dump-vars-to-file例程将创建一些表达式,可以通过稍后简单地评估表达式(通过'load命令或'read)来读取:

(defun dump-vars-to-file (varlist filename)
  "simplistic dumping of variables in VARLIST to a file FILENAME"
  (save-excursion
    (let ((buf (find-file-noselect filename)))
      (set-buffer buf)
      (erase-buffer)
      (dump varlist buf)
      (save-buffer)
      (kill-buffer))))

(defun dump (varlist buffer)
  "insert into buffer the setq statement to recreate the variables in VARLIST"
  (loop for var in varlist do
        (print (list 'setq var (list 'quote (symbol-value var)))
               buffer)))
Run Code Online (Sandbox Code Playgroud)

我确信我错过了一些内置的例程,可以做得更好,也更灵活.

我用这个小例程测试了它:

(defun checkit ()
  (let ((a '(1 2 3 (4 5)))
        (b '(a b c))
        (c (make-vector 3 'a)))
    (dump-vars-to-file '(a b c) "/some/path/to/file.el")))
Run Code Online (Sandbox Code Playgroud)

哪个产生了输出:

(setq a (quote (1 2 3 (4 5))))
(setq b (quote (a b c)))
(setq c (quote [a a a]))
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅有关读取和打印lisp对象的信息页面

  • 奇怪的是,这没有标准的例行程序.检查了desktop.el和savehist.el两者都使用他们自己的手动例程...... (3认同)

Eri*_*rik 7

另一个提议。而不是序列化setq调用,这个基本上允许您将文件用作变量。

(defun print-to-file (filename data)
  (with-temp-file filename
    (prin1 data (current-buffer))))

(defun read-from-file (filename)
  (with-temp-buffer
    (insert-file-contents filename)
    (cl-assert (eq (point) (point-min)))
    (read (current-buffer))))
Run Code Online (Sandbox Code Playgroud)

用法:

(print-to-file "bla.el" '(1 2 "foo" 'bar))
(1 2 "foo" (quote bar))

(read-from-file "bla.el")
(1 2 "foo" (quote bar))
Run Code Online (Sandbox Code Playgroud)