Browse Source

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.
Nicolas Goaziou 9 years ago
parent
commit
d02f9d41af
1 changed files with 24 additions and 25 deletions
  1. 24 25
      lisp/org.el

+ 24 - 25
lisp/org.el

@@ -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))))))