changeset 75003:bb4f2b144d6f

(auto-mode-case-fold): New defcustom. (set-auto-mode): If non-nil, perform second case-sensitive pass through auto-mode-alist if first pass failed.
author Kim F. Storm <storm@cua.dk>
date Sun, 31 Dec 2006 00:29:49 +0000
parents 7237d52e0b4c
children 20d27ba582d9
files lisp/files.el
diffstat 1 files changed, 33 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/files.el	Sat Dec 30 23:03:03 2006 +0000
+++ b/lisp/files.el	Sun Dec 31 00:29:49 2006 +0000
@@ -1876,6 +1876,16 @@
   (if (fboundp 'ucs-set-table-for-input) ; don't lose when building
       (ucs-set-table-for-input)))
 
+(defcustom auto-mode-case-fold nil
+  "Non-nil means to try second pass through `auto-mode-alist'.
+This means that if the first case-sensitive search through the alist fails
+to find a matching major mode, a second case-insensitive search is made.
+On systems with case-insensitive file names, this variable is ignored,
+since only a single case-sensitive search through the alist is made."
+  :group 'files
+  :version "22.1"
+  :type 'boolean)
+
 (defvar auto-mode-alist
   ;; Note: The entries for the modes defined in cc-mode.el (c-mode,
   ;; c++-mode, java-mode and more) are added through autoload
@@ -2238,15 +2248,29 @@
 	      (setq name (file-name-sans-versions name))
 	      (while name
 		;; Find first matching alist entry.
-		(let ((case-fold-search
-		       (memq system-type '(vax-vms windows-nt cygwin))))
-		  (if (and (setq mode (assoc-default name auto-mode-alist
-						     'string-match))
-			   (consp mode)
-			   (cadr mode))
-		      (setq mode (car mode)
-			    name (substring name 0 (match-beginning 0)))
-		    (setq name)))
+		(setq mode
+		      (if (memq system-type '(vax-vms windows-nt cygwin))
+			  ;; System is case-insensitive.
+			  (let ((case-fold-search t))
+			    (assoc-default name auto-mode-alist
+					   'string-match))
+			;; System is case-sensitive.
+			(or
+			 ;; First match case-sensitively.
+			 (let ((case-fold-search nil))
+			   (assoc-default name auto-mode-alist
+					  'string-match))
+			 ;; Fallback to case-insensitive match.
+			 (and auto-mode-case-fold
+			      (let ((case-fold-search t))
+				(assoc-default name auto-mode-alist
+					       'string-match))))))
+		(if (and mode
+			 (consp mode)
+			 (cadr mode))
+		    (setq mode (car mode)
+			  name (substring name 0 (match-beginning 0)))
+		  (setq name))
 		(when mode
 		  (set-auto-mode-0 mode keep-mode-if-same)))))))))