changeset 72764:88fd4983fe78

(conf-space-mode): Use hack-local-variables-hook instead of calling hack-local-variables. (conf-space-keywords-override): New variable.
author Richard M. Stallman <rms@gnu.org>
date Sat, 09 Sep 2006 23:20:39 +0000
parents 0a277f9db761
children d46f55287c80
files lisp/textmodes/conf-mode.el
diffstat 1 files changed, 39 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/conf-mode.el	Sat Sep 09 22:36:01 2006 +0000
+++ b/lisp/textmodes/conf-mode.el	Sat Sep 09 23:20:39 2006 +0000
@@ -442,6 +442,9 @@
   (setq imenu-generic-expression
 	'(("Parameters" "^[ \t]*\\(.+?\\)[=: \t]" 1))))
 
+(defvar conf-space-keywords-override nil
+  "Value to be put in `conf-space-keywords' after `conf-space-mode'.")
+
 ;;;###autoload
 (define-derived-mode conf-space-mode conf-unix-mode "Conf[Space]"
   "Conf Mode starter for space separated conf files.
@@ -465,34 +468,44 @@
 add /dev/audio		desktop
 add /dev/mixer		desktop"
   (conf-mode-initialize "#" 'conf-space-font-lock-keywords)
-  (set (make-local-variable 'conf-assignment-sign)
-       nil)
-  ;; This doesn't seem right, but the next two depend on conf-space-keywords
-  ;; being set, while after-change-major-mode-hook might set up imenu, needing
-  ;; the following result:
-  (hack-local-variables-prop-line)
-  (hack-local-variables)
+  (make-local-variable 'conf-assignment-sign)
+  (setq conf-assignment-sign nil)
   (cond (current-prefix-arg
-         (set (make-local-variable 'conf-space-keywords)
-              (if (> (prefix-numeric-value current-prefix-arg) 0)
-                  (read-string "Regexp to match keywords: "))))
-        (conf-space-keywords)
+	 (make-local-variable 'conf-space-keywords-override)
+	 ;; By setting conf-space-keywords-override
+	 ;; we arrange for the hook function below
+	 ;; to override any value of conf-space-keywords
+	 ;; specified in a local variables list.
+         (setq conf-space-keywords-override
+	       (if (> (prefix-numeric-value current-prefix-arg) 0)
+		   (read-string "Regexp to match keywords: "))))
         (buffer-file-name
-         (set (make-local-variable 'conf-space-keywords)
-              (assoc-default buffer-file-name conf-space-keywords-alist
-                             'string-match))))
-  (set (make-local-variable 'conf-assignment-regexp)
-       (if conf-space-keywords
-	   (concat "\\(?:" conf-space-keywords "\\)[ \t]+.+?\\([ \t]+\\|$\\)")
-	 ".+?\\([ \t]+\\|$\\)"))
-  (setq imenu-generic-expression
-	`(,@(cdr imenu-generic-expression)
-	  ("Parameters"
-	   ,(if conf-space-keywords
-		(concat "^[ \t]*\\(?:" conf-space-keywords
-			"\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
-	      "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
-	   1))))
+	 ;; By setting conf-space-keywords directly, 
+	 ;; we let a value in the local variables list take precedence.
+	 (make-local-variable 'conf-space-keywords)
+         (setq conf-space-keywords
+	       (assoc-default buffer-file-name conf-space-keywords-alist
+			      'string-match))))
+  ;; This is stuff to be done after parsing the local variables, once
+  ;; any local variable spec fo rconf-space-keywords is already in  effect.
+  (push (lambda ()
+	  (when conf-space-keywords-override
+	    (setq conf-space-keywords
+		  conf-space-keywords-override))
+	  (make-local-variable 'conf-assignment-regexp)
+	  (setq conf-assignment-regexp
+		(if conf-space-keywords
+		    (concat "\\(?:" conf-space-keywords "\\)[ \t]+.+?\\([ \t]+\\|$\\)")
+		  ".+?\\([ \t]+\\|$\\)"))
+	  (setq imenu-generic-expression
+		`(,@(cdr imenu-generic-expression)
+		  ("Parameters"
+		   ,(if conf-space-keywords
+			(concat "^[ \t]*\\(?:" conf-space-keywords
+				"\\)[ \t]+\\([^ \t\n]+\\)\\(?:[ \t]\\|$\\)")
+		      "^[ \t]*\\([^ \t\n[]+\\)\\(?:[ \t]\\|$\\)")
+		   1))))
+	hack-local-variables-hook))
 
 ;;;###autoload
 (define-derived-mode conf-colon-mode conf-unix-mode "Conf[Colon]"