changeset 109461:d898f8a84d48

Enhance `c-file-style' in file/directory local variables. cc-mode.el (c-count-cfss): New function. (c-before-hack-hook): Call `c-set-style' differently according to whether c-file-style was set in file or directory local variables.
author Alan Mackenzie <acm@muc.de>
date Sun, 18 Jul 2010 20:28:00 +0000
parents 597339bd6bef
children a150e8a14679 4e2dbc291dc0 af1c1a57ee7f
files lisp/ChangeLog lisp/progmodes/cc-mode.el
diffstat 2 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Jul 18 14:44:32 2010 -0400
+++ b/lisp/ChangeLog	Sun Jul 18 20:28:00 2010 +0000
@@ -1,3 +1,11 @@
+2010-07-18  Alan Mackenzie  <acm@muc.de>
+
+	Enhance `c-file-style' in file/directory local variables.
+	* cc-mode.el (c-count-cfss): New function.
+	(c-before-hack-hook): Call `c-set-style' differently according to
+	whether c-file-style was set in file or directory local
+	variables.
+
 2010-07-18  Michael R. Mauger  <mmaug@yahoo.com>
 
 	* progmodes/sql.el: Version 2.2.
--- a/lisp/progmodes/cc-mode.el	Sun Jul 18 14:44:32 2010 -0400
+++ b/lisp/progmodes/cc-mode.el	Sun Jul 18 20:28:00 2010 +0000
@@ -662,6 +662,17 @@
       (and (cdr rfn)
 	   (setq require-final-newline mode-require-final-newline)))))
 
+(defun c-count-cfss (lv-alist)
+  ;; LV-ALIST is an alist like `file-local-variables-alist'.  Count how many
+  ;; elements with the key `c-file-style' there are in it.
+  (let ((elt-ptr lv-alist) elt (cownt 0))
+    (while elt-ptr
+      (setq elt (car elt-ptr)
+	    elt-ptr (cdr elt-ptr))
+      (when (eq (car elt) 'c-file-style)
+	(setq cownt (1+ cownt))))
+    cownt))
+							  
 (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
@@ -678,7 +689,15 @@
 	      (delq mode-cons file-local-variables-alist)))
       (when stile
 	(or (stringp stile) (error "c-file-style is not a string"))
-	(c-set-style stile))
+	(if (boundp 'dir-local-variables-alist)
+	    ;; Determine whether `c-file-style' was set in the file's local
+	    ;; variables or in a .dir-locals.el (a directory setting).
+	    (let ((cfs-in-file-and-dir-count
+		   (c-count-cfss file-local-variables-alist))
+		  (cfs-in-dir-count (c-count-cfss dir-local-variables-alist)))
+	      (c-set-style stile
+			   (= cfs-in-file-and-dir-count cfs-in-dir-count)))
+	  (c-set-style stile)))
       (when offsets
 	(mapc
 	 (lambda (langentry)