emacs lisp中的惯用方式序列化

时间:2016-03-24 05:34:26

标签: emacs lisp elisp

目前我正在研究一种在会话中使用哈希表的elisp主模式。因此,每次初始化主模式时,表都会加载到内存中。在会话期间和会话结束时,它们将被写入文件。我当前的实现以下列方式写入数据:

(with-temp-buffer
  (prin1 hash-table (current-buffer))
  (write-file ("path/to/file.el"))))

在会话开始时加载数据是通过读取完成的,如下所示:

(setq name-of-table (car
        (read-from-string
         (with-temp-buffer
           (insert-file-contents path-of-file)
           (buffer-substring-no-properties
        (point-min)
        (point-max))))))))

它有效,但我觉得这不是最美妙的方式。我的目标是:我希望这个主要模式变成一个漂亮的干净包,将它自己的数据存储在存储包的其他数据的文件夹中。

3 个答案:

答案 0 :(得分:3)

这是我实施的方式

写入文件:

(defun my-write (file data)
  (with-temp-file file
    (prin1 data (current-buffer))))

从文件中读取:

(defun my-read (file symbol)
  (when (boundp symbol)
    (with-temp-buffer
      (insert-file-contents file)
      (goto-char (point-min))
      (set symbol (read (current-buffer))))))

致电:

(my-write "~/test.txt" emacs-version)

致电阅读

(my-read "~/test.txt" 'my-emacs-version)

答案 1 :(得分:2)

我想出了以下解决方案,灵感来自第一个答案:

(with-temp-buffer
   (insert "(setq hash-table ")
   (prin1 hash-table (current-buffer)
   (insert ")")
   (write-file (locate-library "my-data-lib"))

在主要模式的初始阶段,我只是这样做:

(load "my-data-lib")

不需要和读取操作,并且优点是我也不需要提供任何文件路径,只是在加载路径上某处有这样的文件就足够了。 Emacs会找到它。 elisp岩石。 :)

答案 2 :(得分:2)

gCoin = prefs.getInteger("goldCoin", 0);可以为您完成:

desktop