dot-emacs: Fix C indentation quite a lot.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 12 Jun 2009 14:00:24 +0000 (15:00 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 12 Jun 2009 14:00:24 +0000 (15:00 +0100)
This change fixes a number of C indentation annoyances:

  * One-line blocks are indented relative to the preceding line.

  * Stuff inside `extern "C" { ... }' isn't indended.

  * The `extern "C" {' line itself /is/ indended.

  * Blocks in macro argument lists are fixed.

  * Macro indentation is fixed.

dot-emacs.el

index 3ee4ab0..0d27f52 100644 (file)
@@ -816,19 +816,42 @@ the regular expressions in `mdw-backup-disable-regexps'."
      (define-key c-mode-map "*" nil)
      (define-key c-mode-map "/" nil)))
 
+(defun mdw-c-lineup-arglist (langelem)
+  "Hack for DWIMmery in c-lineup-arglist."
+  (if (save-excursion
+       (c-block-in-arglist-dwim (c-langelem-2nd-pos c-syntactic-element)))
+      0
+    (c-lineup-arglist langelem)))
+
+(defun mdw-c-indent-extern-mumble (langelem)
+  "Indent `extern \"...\" {' lines."
+  (save-excursion
+    (back-to-indentation)
+    (if (looking-at
+        "\\s-*\\<extern\\>\\s-*\"\\([^\\\\\"]+\\|\\.\\)*\"\\s-*{")
+       c-basic-offset
+      nil)))
+
 (defun mdw-c-style ()
   (c-add-style "[mdw] C and C++ style"
               '((c-basic-offset . 2)
                 (comment-column . 40)
                 (c-class-key . "class")
-                (c-offsets-alist (substatement-open . 0)
-                                 (label . 0)
-                                 (case-label . +)
-                                 (access-label . -)
-                                 (inclass . +)
-                                 (inline-open . ++)
-                                 (statement-cont . 0)
-                                 (statement-case-intro . +)))
+                (c-backslash-column . 72)
+                (c-offsets-alist
+                 (substatement-open . (add 0 c-indent-one-line-block))
+                 (defun-open . (add 0 c-indent-one-line-block))
+                 (arglist-cont-nonempty . mdw-c-lineup-arglist)
+                 (topmost-intro . mdw-c-indent-extern-mumble)
+                 (cpp-define-intro . 0)
+                 (inextern-lang . [0])
+                 (label . 0)
+                 (case-label . +)
+                 (access-label . -)
+                 (inclass . +)
+                 (inline-open . ++)
+                 (statement-cont . 0)
+                 (statement-case-intro . +)))
               t))
 
 (defun mdw-fontify-c-and-c++ ()