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).
This commit is contained in:
parent
e7b8c93f94
commit
117d58ace7
2 changed files with 22 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue