How does it work?


The most important part to understand is Data structures. After that it’s easy to write code in other parts.

Serialization / Deserialization of objects

In Emacs we have many types of objects like:

  • #<buffer tests.el>
  • #<marker at 3427 in tests.el>
  • simple "string"
  • integers 123
  • ... and other

And we have to represent them as text to save. This is done using wg-pickel and functions defined in this var:

(defvar wg-pickel-object-serializers
  '((integer    . identity)
    (float      . identity)
    (string     . identity)
    (symbol     . wg-pickel-symbol-serializer)
    (cons       . wg-pickel-cons-serializer)
    (vector     . wg-pickel-vector-serializer)
    (hash-table . wg-pickel-hash-table-serializer)
    (buffer     . wg-pickel-buffer-serializer)
    (marker     . wg-pickel-marker-serializer))
  "Alist mapping types to object serialization functions.")

So when you meet an object that cannot be represented as text - you:

  1. Add it’s type in this variable
  2. Write mentioned “serializer” function itself

For example for “buffer” objects:

(defun wg-pickel-buffer-serializer (buffer)
  "Return BUFFER's UID in workgroups buffer list."
  (list 'b (wg-add-buffer-to-buf-list buffer)))

‘b - is just a marker that will tell to run wg-pickel-deserialize-buffer when restoring a buffer.

Last element is buffer UID and it is enough to restore the buffer with (wg-restore-buffer (wg-find-buf-by-uid uid))

Loading a session file

It is done in wg-open-session. First you read a Session object from file in this line:

(let ((session (read (f-read-text filename))))

Then you just switch to 1 of the saved workgroups in this object according to settings.

Saving session

Writing objects to file is done in... (function stack):

wg-pickel <– main function

So the main function to transform Lisp objects to strings is wg-pickel.

Switching workgroups