changeset 97140:9637a590d441

(c-before-hack-hook): New function (Top Level): Install c-before-hack-hook on before-hack-local-variables-hook, rather than c-postprocess-file-styles on hack-local-variables-hook.
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 31 Jul 2008 01:37:35 +0000
parents 20a2b3573c2d
children 840bd675fd85
files lisp/progmodes/cc-mode.el
diffstat 1 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/cc-mode.el	Thu Jul 31 01:37:24 2008 +0000
+++ b/lisp/progmodes/cc-mode.el	Thu Jul 31 01:37:35 2008 +0000
@@ -657,6 +657,26 @@
       (and (cdr rfn)
 	   (setq require-final-newline mode-require-final-newline)))))
 
+(defun c-before-hack-hook ()
+  "Set the CC Mode style and \"offsets\" when in the buffer's local variables.
+They are set only when, respectively, the pseudo variables
+`c-file-style' and `c-file-offsets' are present in the list.
+
+This function is called from the hook `before-hack-local-variables-hook'."
+  (when c-buffer-is-cc-mode
+    (let ((stile (cdr (assq 'c-file-style file-local-variables-alist)))
+	  (offsets (cdr (assq 'c-file-offsets file-local-variables-alist))))
+      (when stile
+	(or (stringp stile) (error "c-file-style is not a string"))
+	(c-set-style stile))
+      (when offsets
+	(mapc
+	 (lambda (langentry)
+	   (let ((langelem (car langentry))
+		 (offset (cdr langentry)))
+	     (c-set-offset langelem offset)))
+	 offsets)))))
+
 (defun c-remove-any-local-eval-or-mode-variables ()
   ;; If the buffer specifies `mode' or `eval' in its File Local Variable list
   ;; or on the first line, remove all occurrences.  See
@@ -748,7 +768,9 @@
 	    (hack-local-variables))
 	  nil))))
 
-(add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
+(if (boundp 'before-hack-local-variables-hook)
+    (add-hook 'before-hack-local-variables-hook 'c-before-hack-hook)
+  (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles))
 
 (defmacro c-run-mode-hooks (&rest hooks)
   ;; Emacs 21.1 has introduced a system with delayed mode hooks that