]> git.eshelyaron.com Git - emacs.git/commitdiff
Make the test for auto-mode-alist from .dir-local.el stricter
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 24 Jul 2021 09:16:15 +0000 (11:16 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 24 Jul 2021 09:16:15 +0000 (11:16 +0200)
* lisp/files.el (set-auto-mode--dir-local-valid-p): New function.
(set-auto-mode--apply-alist): Use it as a stricter test.

lisp/files.el
test/lisp/files-resources/.dir-locals.el
test/lisp/files-resources/auto-test.zot1 [new file with mode: 0644]
test/lisp/files-resources/auto-test.zot2 [new file with mode: 0644]
test/lisp/files-resources/auto-test.zot3 [new file with mode: 0644]
test/lisp/files-tests.el

index d915c2a30b5173001d1e87ada9df5aa16d25d7d8..aab839eab105d214a59a638565c55c77afb74421 100644 (file)
@@ -3238,14 +3238,21 @@ extra checks should be done."
               (setq mode (car mode)
                     name (substring name 0 (match-beginning 0)))
             (setq name nil)))
-        (when (and dir-local mode)
-          (unless (string-suffix-p "-mode" (symbol-name mode))
-            (message "Ignoring invalid mode `%s'" (symbol-name mode))
-            (setq mode nil)))
+        (when (and dir-local mode
+                   (not (set-auto-mode--dir-local-valid-p mode)))
+          (message "Ignoring invalid mode `%s'" mode)
+          (setq mode nil))
         (when mode
           (set-auto-mode-0 mode keep-mode-if-same)
           t))))
 
+(defun set-auto-mode--dir-local-valid-p (mode)
+  "Say whether MODE can be used in a .dir-local.el `auto-mode-alist'."
+  (and (symbolp mode)
+       (string-suffix-p "-mode" (symbol-name mode))
+       (commandp mode)
+       (not (provided-mode-derived-p mode 'special-mode))))
+
 (defun set-auto-mode (&optional keep-mode-if-same)
   "Select major mode appropriate for current buffer.
 
index 84997b8a0c0067eb170524343053757db877ff1f..84393aa54d505b26e50dc536398f00691096289a 100644 (file)
@@ -1,2 +1,5 @@
 ;; This is used by files-tests.el.
-((auto-mode-alist . (("\\.quux\\'" . tcl-mode))))
+((auto-mode-alist . (("\\.quux\\'" . tcl-mode)
+                    ("\\.zot1\\'" . foobar)
+                    ("\\.zot2\\'" . (lambda ()))
+                    ("\\.zot3\\'" . dired-mode))))
diff --git a/test/lisp/files-resources/auto-test.zot1 b/test/lisp/files-resources/auto-test.zot1
new file mode 100644 (file)
index 0000000..80acfcc
--- /dev/null
@@ -0,0 +1 @@
+zot1
diff --git a/test/lisp/files-resources/auto-test.zot2 b/test/lisp/files-resources/auto-test.zot2
new file mode 100644 (file)
index 0000000..975fc76
--- /dev/null
@@ -0,0 +1 @@
+zot2
diff --git a/test/lisp/files-resources/auto-test.zot3 b/test/lisp/files-resources/auto-test.zot3
new file mode 100644 (file)
index 0000000..faa0715
--- /dev/null
@@ -0,0 +1 @@
+zot3
index fce7e3fd7199dc1756a20a2ad0e964fd51bad369..a5c8236017781f24d455846b3922982348596cef 100644 (file)
@@ -1537,7 +1537,13 @@ The door of all subtleties!
 (ert-deftest files-test-dir-locals-auto-mode-alist ()
   "Test an `auto-mode-alist' entry in `.dir-locals.el'"
   (find-file (ert-resource-file "whatever.quux"))
-  (should (eq major-mode 'tcl-mode)))
+  (should (eq major-mode 'tcl-mode))
+  (find-file (ert-resource-file "auto-test.zot1"))
+  (should (eq major-mode 'fundamental-mode))
+  (find-file (ert-resource-file "auto-test.zot2"))
+  (should (eq major-mode 'fundamental-mode))
+  (find-file (ert-resource-file "auto-test.zot3"))
+  (should (eq major-mode 'fundamental-mode)))
 
 (provide 'files-tests)
 ;;; files-tests.el ends here