Ignore some local variables upon cloning

* lisp/org.el (org-unique-local-variables): New variable.
(org-get-local-variables):
(org-clone-local-variables): Use variable above.  Do not rely on an
obscure naming convention to determine if a local variable is meant to
be cloned or read.
This commit is contained in:
Nicolas Goaziou 2015-12-05 13:44:12 +01:00
parent dbaab40bda
commit d02f9d41af
1 changed files with 24 additions and 25 deletions

View File

@ -9410,30 +9410,31 @@ Possible values in the list of contexts are `table', `headline', and `item'."
(org-in-item-p)))
(goto-char pos))))
(defconst org-unique-local-variables
'(org-element--cache
org-element--cache-objects
org-element--cache-sync-keys
org-element--cache-sync-requests
org-element--cache-sync-timer)
"List of local variables that cannot be transferred to another buffer.")
(defun org-get-local-variables ()
"Return a list of all local variables in an Org mode buffer."
(let ((varlist
(prog1 (with-current-buffer (get-buffer-create "*Org tmp*")
(erase-buffer)
(org-mode)
(buffer-local-variables))
(kill-buffer "*Org tmp*"))))
(delq nil
(mapcar
(lambda (x)
(let* ((binding (if (symbolp x) (list x) (list (car x) (cdr x))))
(name (car binding)))
(and (not (get name 'org-state))
;; Ignore internal local variables, since those
;; are likely variables that are not meant to be
;; copied.
(not (string-match-p "--" (symbol-name name)))
(string-match-p
"\\`\\(org-\\|orgtbl-\\|outline-\\|comment-\\|\
paragraph-\\|auto-fill\\|normal-auto-fill\\|fill-paragraph\\|indent-\\)"
(symbol-name name))
x)))
varlist))))
(delq nil
(mapcar
(lambda (x)
(let* ((binding (if (symbolp x) (list x) (list (car x) (cdr x))))
(name (car binding)))
(and (not (get name 'org-state))
(not (memq name org-unique-local-variables))
(string-match-p
"\\`\\(org-\\|orgtbl-\\|outline-\\|comment-\\|paragraph-\\|\
auto-fill\\|normal-auto-fill\\|fill-paragraph\\|indent-\\)"
(symbol-name name))
x)))
(with-temp-buffer
(org-mode)
(buffer-local-variables)))))
(defun org-clone-local-variables (from-buffer &optional regexp)
"Clone local variables from FROM-BUFFER.
@ -9441,9 +9442,7 @@ Optional argument REGEXP selects variables to clone."
(dolist (pair (buffer-local-variables from-buffer))
(let ((name (car pair)))
(when (and (symbolp name)
;; Ignore internal local variables, since those are
;; likely variables that are not meant to be copied.
(not (string-match-p "--" (symbol-name name)))
(not (memq name org-unique-local-variables))
(or (null regexp) (string-match regexp (symbol-name name))))
(set (make-local-variable name) (cdr pair))))))