Files
@ 3edbfb87fe7d
Branch filter:
Location: workgroups2/src/workgroups-support-macro.el - annotation
3edbfb87fe7d
2.6 KiB
text/x-elisp
Save/restore frames (#11)
Probably works (for me) with usual file buffers
Probably works (for me) with usual file buffers
6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f ee27475b139d ee27475b139d ee27475b139d ee27475b139d 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 3d9be9be9bd8 3d9be9be9bd8 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f ee27475b139d ee27475b139d 6a7bf65ee60f 6a7bf65ee60f ee27475b139d ee27475b139d 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f 6a7bf65ee60f | ;;; workgroups-support-macro.el --- Generates (de)serialize functions
;;; Commentary:
;; Copyright (C) Sergey Pashinin
;; Author: Sergey Pashinin <sergey@pashinin.com>
;;; Code:
(defun wg-get-value (arg)
"Get a value of ARG if it exists."
(if (boundp `,arg) (eval arg)))
(defmacro wg-support (mode pkg params)
"Macro to create (de)serialization functions for a buffer.
You need to save/restore a specific MODE which is loaded from a
package PKG. In PARAMS you give local variables to save and a
deserialization function."
`(let ((mode-str (symbol-name ,mode))
(args ,params))
(eval `(defun ,(intern (format "wg-deserialize-%s-buffer" mode-str)) (buffer)
"DeSerialization function created with `wg-support'.
Gets saved variables and runs code to restore a BUFFER."
(when (require ',,pkg nil 'noerror)
(wg-dbind (this-function variables) (wg-buf-special-data buffer)
(let ((default-directory (car variables))
(df (cdr (assoc 'deserialize ',,params)))
(user-vars (car (cdr variables))))
(if df (funcall df buffer user-vars))
(current-buffer)
)))))
(eval `(defun ,(intern (format "wg-serialize-%s-buffer" mode-str)) (buffer)
"Serialization function created with `wg-support'.
Saves some variables to restore a BUFFER later."
(when (get-buffer buffer)
(with-current-buffer buffer
(when (eq major-mode ',,mode)
(let ((sf (cdr (assoc 'serialize ',,params)))
(save (cdr (assoc 'save ',,params))))
(list ',(intern (format "wg-deserialize-%s-buffer" mode-str))
(wg-take-until-unreadable (list default-directory
(if sf (funcall sf buffer)
(if save (mapcar 'wg-get-value save)))
)))))))))
;; Maybe change a docstring for functions
;;(put (intern (format "wg-serialize-%s-buffer" (symbol-name mode)))
;; 'function-documentation
;; (format "A function created by `wg-support'."))
;; Add function to `wg-special-buffer-serdes-functions' variable
(eval `(add-to-list 'wg-special-buffer-serdes-functions
',(intern (format "wg-serialize-%s-buffer" mode-str)) t))
))
(provide 'workgroups-support-macro)
;;; workgroups-support-macro.el ends here
|