From: Lars Ingebrigtsen Date: Tue, 20 Oct 2020 11:07:25 +0000 (+0200) Subject: Preserve all `eval' elements from both .dir-locals files X-Git-Tag: emacs-28.0.90~5530 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=117d58ace75fc210c15e6815d965b080466edc55;p=emacs.git Preserve all `eval' elements from both .dir-locals files * lisp/files.el (dir-locals-read-from-dir): Preserve all `eval' elements from both .dir-locals files (bug#44066). --- 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)