Subject: Re: bug#77228: [PATCH] Create major mode for `customize-dirlocals`

From: Elijah Gabe Pérez <[email-masked]>
Date: Fri, 04 Apr 2025 22:39:59 -0600

Mauro Aranda <[email-masked]> writes:

>> I made it a major mode but not derived from it.
>> I've included the Custom-mode options that are useful (as you pointed)
>> and run Custom-mode-hook.
>
> Anyway, I'm OK with this. Maybe we can use derived-mode-add-parents to
> be clear that we consider Custom-mode a parent of this new mode. Some
> comments below:
>
>> * lisp/cus-edit.el (Custom-dirlocals-mode): New major mode.
>> (custom-dirlocals-with-buffer): Move stuffs to
>> `Custom-dirlocals-mode'.
>
> "stuff".
>
>> +(define-derived-mode Custom-dirlocals-mode nil "Custom dirlocals"
>> +  "Major mode for Customize Directory Local Variables in the current directory."
>
> Please mention that it runs Custom-mode-hook too.

Done.

>From 0c61b54b5f4b33d56abc130cd108b8d896e2bc85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <[email-masked]>
Date: Sun, 23 Mar 2025 21:26:26 -0600
Subject: [PATCH] Create major mode for `customize-dirlocals` (bug#77228)

* lisp/cus-edit.el (Custom-dirlocals-mode): New major mode.
(custom-dirlocals-with-buffer): Move settings to
`Custom-dirlocals-mode'.
---
 lisp/cus-edit.el | 46 +++++++++++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index ecfce03e490..1016a5667ff 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -6060,31 +6060,47 @@ custom-dirlocals--set-widget-vars
   (custom--initialize-widget-variables)
   (add-hook 'widget-forward-hook #'custom-dirlocals-maybe-update-cons nil t))
 
+(define-derived-mode Custom-dirlocals-mode nil "Custom dirlocals"
+  "Major mode for customize Directory Local Variables in the current directory.
+Entry to this mode calls the value of `Custom-mode-hook' if that value
+is non-nil.
+
+\\{custom-dirlocals-map}"
+  (kill-all-local-variables)
+  (custom-dirlocals--set-widget-vars)
+  (setq-local major-mode #'Custom-dirlocals-mode)
+  (setq-local text-conversion-style 'action)
+  (setq-local touch-screen-keyboard-function
+              #'Custom-display-on-screen-keyboard-p)
+  (setq-local revert-buffer-function #'Custom-dirlocals-revert-buffer)
+  (setq-local tool-bar-map
+              (or custom-dirlocals-tool-bar-map
+                  ;; Set up `custom-dirlocals-tool-bar-map'.
+                  (let ((map (make-sparse-keymap)))
+                    (mapc
+                     (lambda (arg)
+                       (tool-bar-local-item-from-menu
+                        (nth 1 arg) (nth 4 arg) map custom-dirlocals-map
+                        :label (nth 5 arg)))
+                     custom-dirlocals-commands)
+                    (setq custom-dirlocals-tool-bar-map map))))
+  (use-local-map custom-dirlocals-map)
+  (run-hooks 'Custom-mode-hook))
+
+(derived-mode-add-parents 'Custom-dirlocals-mode '(Custom-mode))
+
 (defmacro custom-dirlocals-with-buffer (&rest body)
   "Arrange to execute BODY in a \"*Customize Dirlocals*\" buffer."
   ;; We don't use `custom-buffer-create' because the settings here
   ;; don't go into the `custom-file'.
   `(progn
      (switch-to-buffer "*Customize Dirlocals*")
-     (kill-all-local-variables)
+
      (let ((inhibit-read-only t))
        (erase-buffer))
      (remove-overlays)
-     (custom-dirlocals--set-widget-vars)
+     (Custom-dirlocals-mode)
      ,@body
-     (setq-local tool-bar-map
-                 (or custom-dirlocals-tool-bar-map
-                     ;; Set up `custom-dirlocals-tool-bar-map'.
-                     (let ((map (make-sparse-keymap)))
-                       (mapc
-                        (lambda (arg)
-                          (tool-bar-local-item-from-menu
-                           (nth 1 arg) (nth 4 arg) map custom-dirlocals-map
-                           :label (nth 5 arg)))
-                        custom-dirlocals-commands)
-                       (setq custom-dirlocals-tool-bar-map map))))
-     (setq-local revert-buffer-function #'Custom-dirlocals-revert-buffer)
-     (use-local-map custom-dirlocals-map)
      (widget-setup)))
 
 (defun custom-dirlocals-get-options ()
-- 
2.49.0

> Let's see if somebody else has an opinion. I'm on a trip for the
> weekend, so it won't be until next week that I can install this.

Don't worry, take your time.

-- 
                                          - E.G via GNU Emacs and Org.