Subject: Re: bug#73359: 30.0.91; editorconfig does not work on xml files

From: Stefan Monnier <[email-masked]>
Date: Fri, 20 Sep 2024 14:58:54 -0400

> Stefan, this element of editorconfig-indentation-alist:
>
>       (nxml-mode nxml-child-indent (nxml-attribute-indent . 2))
>
> seems to violate the expected form of the elements, which is
> (MODE . SETTING).  It was added as part of commit 8e143a2f300, whose
> log says "Sync with upstream", so I suppose this form of the element
> is supported by upstream, but not by Emacs?  I guess we need to
> replace it with a function or something?

Yup.  I pushed the patch below to `emacs-30` for it.

> Btw, can we clarify the doc string of editorconfig-indentation-alist,
> where it says "where SETTING should obey the same rules as
> `editorconfig-indent-size-vars'"?  Because if one looks at the doc
> string of editorconfig-indent-size-vars, the "rules" are either
> trivial or unclear.  If SETTING above should be one or more symbols
> ("list of variables that need to be set to SIZE") or a function that
> returns a list of (VAR . VAL) pairs, then why not say that in the doc
> string of editorconfig-indentation-alist?

I didn't want to do it because it's redundant with the docstring of
`editorconfig-indent-size-vars`, but see the patch where I tried to
address your request.

        Stefan

diff --git a/lisp/editorconfig.el b/lisp/editorconfig.el
index 931781007d9..870f6d32162 100644
--- a/lisp/editorconfig.el
+++ b/lisp/editorconfig.el
@@ -211,7 +211,7 @@ editorconfig-indentation-alist
     (mustache-mode mustache-basic-offset)
     (nasm-mode nasm-basic-offset)
     (nginx-mode nginx-indent-level)
-    (nxml-mode nxml-child-indent (nxml-attribute-indent . 2))
+    (nxml-mode . editorconfig--get-indentation-nxml-mode)
     (objc-mode c-basic-offset)
     (octave-mode octave-block-offset)
     (perl-mode perl-indent-level)
@@ -266,7 +266,9 @@ editorconfig-indentation-alist
 `editorconfig-indent-size-vars'.
 
 Each element should look like (MODE . SETTING) where SETTING
-should obey the same rules as `editorconfig-indent-size-vars'."
+should obey the same rules as `editorconfig-indent-size-vars',
+i.e. either a list of variable names or a function returning a list of (VAR . VAL)
+settings."
   :type '(alist :key-type symbol
                 :value-type (choice function
                                     (repeat
@@ -341,6 +343,11 @@ editorconfig--get-indentation-latex-mode
     (LaTeX-indent-level . ,size)
     (LaTeX-item-indent . ,(- size))))
 
+(defun editorconfig--get-indentation-nxml-mode (size)
+  "Vars to set `nxml-mode' indent size to SIZE."
+  `((nxml-child-indent . ,size)
+    (nxml-attribute-indent . ,(* 2 size))))
+
 (defun editorconfig--get-indentation-lisp-mode (size)
   "Set indent size to SIZE for Lisp mode(s)."
   (when (cond ((null editorconfig-lisp-use-default-indent)  t)