diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/emacs-lisp/seq.el | 1 | ||||
-rw-r--r-- | lisp/files.el | 24 |
2 files changed, 22 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index 9073f9c7a51..4656277ea16 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -474,6 +474,7 @@ Equality is defined by TESTFN if non-nil or by `equal' if nil." (seq-reverse sequence1) '())) +;;;###autoload (cl-defgeneric seq-group-by (function sequence) "Apply FUNCTION to each element of SEQUENCE. Separate the elements of SEQUENCE into an alist using the results as diff --git a/lisp/files.el b/lisp/files.el index c2c58dae934..bbc8f881590 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4301,9 +4301,27 @@ Return the new class name, which is a symbol named DIR." (if (not (and newvars variables)) (or newvars variables) (require 'map) - (map-merge-with 'list (lambda (a b) (map-merge 'list a b)) - variables - newvars)))))) + ;; We want to make the variable setting from + ;; newvars (the second .dir-locals file) take + ;; presedence over the old variables, but we also + ;; want to preserve all `eval' elements as is from + ;; both lists. + (map-merge-with + 'list + (lambda (a b) + (let ((ag + (seq-group-by + (lambda (e) (eq (car e) 'eval)) a)) + (bg + (seq-group-by + (lambda (e) (eq (car e) 'eval)) b))) + (append (map-merge 'list + (assoc-default nil ag) + (assoc-default nil bg)) + (assoc-default t ag) + (assoc-default t bg)))) + variables + newvars)))))) (setq success latest)) (setq variables (dir-locals--sort-variables variables)) (dir-locals-set-class-variables class-name variables) |