org-persist-write:elisp: Allow buffer-local/global elisp container scope

* lisp/org-persist.el (org-persist-read:index): Allow setting where
the elisp container value is taken from: locally, from buffer, or from
a global variable.
This commit is contained in:
Ihor Radchenko 2022-12-28 15:51:49 +03:00
parent f8428d0f3e
commit ffec2db731
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 23 additions and 10 deletions

View File

@ -632,16 +632,29 @@ COLLECTION is the plist holding data collection."
(defun org-persist-write:elisp (container collection)
"Write elisp CONTAINER according to COLLECTION."
(if (and (plist-get (plist-get collection :associated) :file)
(get-file-buffer (plist-get (plist-get collection :associated) :file)))
(let ((buf (get-file-buffer (plist-get (plist-get collection :associated) :file))))
;; FIXME: There is `buffer-local-boundp' introduced in Emacs 28.
;; Not using it yet to keep backward compatibility.
(condition-case nil
(buffer-local-value (cadr container) buf)
(void-variable nil)))
(when (boundp (cadr container))
(symbol-value (cadr container)))))
(let ((scope (nth 2 container)))
(pcase scope
((pred stringp)
(when-let ((buf (or (get-buffer scope)
(get-file-buffer scope))))
;; FIXME: There is `buffer-local-boundp' introduced in Emacs 28.
;; Not using it yet to keep backward compatibility.
(condition-case nil
(buffer-local-value (cadr container) buf)
(void-variable nil))))
(`local
(when (boundp (cadr container))
(symbol-value (cadr container))))
(`nil
(if-let ((buf (and (plist-get (plist-get collection :associated) :file)
(get-file-buffer (plist-get (plist-get collection :associated) :file)))))
;; FIXME: There is `buffer-local-boundp' introduced in Emacs 28.
;; Not using it yet to keep backward compatibility.
(condition-case nil
(buffer-local-value (cadr container) buf)
(void-variable nil))
(when (boundp (cadr container))
(symbol-value (cadr container))))))))
(defalias 'org-persist-write:version #'ignore)