;;;--------------------------------------------------------------------------
;;; C programming configuration.
-;; Linux kernel hacking.
-
-(defvar linux-c-mode-hook)
-
-(defun linux-c-mode ()
- (interactive)
- (c-mode)
- (setq major-mode 'linux-c-mode)
- (setq mode-name "Linux C")
- (run-hooks 'linux-c-mode-hook))
-
;; Make C indentation nice.
(defun mdw-c-lineup-arglist (langelem)
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-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)
- (knr-argdecl . 0)
- (inextern-lang . [0])
- (label . 0)
- (case-label . +)
- (access-label . -)
- (inclass . +)
- (inline-open . ++)
- (statement-cont . +)
- (statement-case-intro . +)))
- t))
+(defun mdw-c-indent-arglist-nested (langelem)
+ "Indent continued argument lists.
+If we've nested more than one argument list, then only introduce a single
+indentation anyway."
+ (let ((context c-syntactic-context)
+ (pos (c-langelem-2nd-pos c-syntactic-element))
+ (should-indent-p t))
+ (while (and context
+ (eq (caar context) 'arglist-cont-nonempty))
+ (when (and (= (caddr (pop context)) pos)
+ context
+ (memq (caar context) '(arglist-intro
+ arglist-cont-nonempty)))
+ (setq should-indent-p nil)))
+ (if should-indent-p '+ 0)))
+
+(defvar mdw-define-c-styles-hook nil
+ "Hook run when `cc-mode' starts up to define styles.")
+
+(defmacro mdw-define-c-style (name &rest assocs)
+ "Define a C style, called NAME (a symbol), setting ASSOCs.
+A function, named `mdw-define-c-style/NAME', is defined to actually install
+the style using `c-add-style', and added to the hook
+`mdw-define-c-styles-hook'. If CC Mode is already loaded, then the style is
+set."
+ (declare (indent defun))
+ (let* ((name-string (symbol-name name))
+ (func (intern (concat "mdw-define-c-style/" name-string))))
+ `(progn
+ (defun ,func () (c-add-style ,name-string ',assocs))
+ (and (featurep 'cc-mode) (,func))
+ (add-hook 'mdw-define-c-styles-hook ',func))))
+
+(eval-after-load "cc-mode"
+ '(run-hooks 'mdw-define-c-styles-hook))
+
+(mdw-define-c-style mdw-trustonic-c
+ (c-basic-offset . 4)
+ (comment-column . 0)
+ (c-indent-comment-alist (anchored-comment . (column . 0))
+ (end-block . (space . 1))
+ (cpp-end-block . (space . 1))
+ (other . (space . 1)))
+ (c-class-key . "class")
+ (c-backslash-column . 0)
+ (c-auto-align-backslashes . nil)
+ (c-label-minimum-indentation . 0)
+ (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-indent-arglist-nested)
+ (topmost-intro . mdw-c-indent-extern-mumble)
+ (cpp-define-intro . 0)
+ (knr-argdecl . 0)
+ (inextern-lang . [0])
+ (label . 0)
+ (case-label . +)
+ (access-label . -)
+ (inclass . +)
+ (inline-open . ++)
+ (statement-cont . +)
+ (statement-case-intro . +)))
+
+(mdw-define-c-style mdw-c
+ (c-basic-offset . 2)
+ (comment-column . 40)
+ (c-class-key . "class")
+ (c-backslash-column . 72)
+ (c-label-minimum-indentation . 0)
+ (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)
+ (knr-argdecl . 0)
+ (inextern-lang . [0])
+ (label . 0)
+ (case-label . +)
+ (access-label . -)
+ (inclass . +)
+ (inline-open . ++)
+ (statement-cont . +)
+ (statement-case-intro . +)))
+
+(defun mdw-set-default-c-style (modes style)
+ "Update the default CC Mode style for MODES to be STYLE.
+
+MODES may be a list of major mode names or a singleton. STYLE is a style
+name, as a symbol."
+ (let ((modes (if (listp modes) modes (list modes)))
+ (style (symbol-name style)))
+ (setq c-default-style
+ (append (mapcar (lambda (mode)
+ (cons mode style))
+ modes)
+ (remove-if (lambda (assoc)
+ (memq (car assoc) modes))
+ (if (listp c-default-style)
+ c-default-style
+ (list (cons 'other c-default-style))))))))
+(setq c-default-style "mdw-c")
+
+(mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
(defvar mdw-c-comment-fill-prefix
`((,(concat "\\([ \t]*/?\\)"
(modify-syntax-entry ?\n "> b")
;; Other stuff.
- (mdw-c-style)
- (setq c-hanging-comment-ender-p nil
- c-backslash-column 72
- c-label-minimum-indentation 0
- mdw-fill-prefix mdw-c-comment-fill-prefix)
+ (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
;; Now define things to be fontified.
(make-local-variable 'font-lock-keywords)
;;;--------------------------------------------------------------------------
;;; AP calc mode.
-(defun apcalc-mode ()
- (interactive)
- (c-mode)
- (setq major-mode 'apcalc-mode)
- (setq mode-name "AP Calc")
- (run-hooks 'apcalc-mode-hook))
+(define-derived-mode apcalc-mode c-mode "AP Calc"
+ "Major mode for editing Calc code.")
(defun mdw-fontify-apcalc ()
(modify-syntax-entry ?/ ". 14")
;; Other stuff.
- (mdw-c-style)
- (setq c-hanging-comment-ender-p nil)
- (setq c-backslash-column 72)
(setq comment-start "/* ")
(setq comment-end " */")
(setq mdw-fill-prefix mdw-c-comment-fill-prefix)
;; Make indentation nice.
-(defun mdw-java-style ()
- (c-add-style "[mdw] Java style"
- '((c-basic-offset . 2)
- (c-offsets-alist (substatement-open . 0)
- (label . +)
- (case-label . +)
- (access-label . 0)
- (inclass . +)
- (statement-case-intro . +)))
- t))
+(mdw-define-c-style mdw-java
+ (c-basic-offset . 2)
+ (c-backslash-column . 72)
+ (c-offsets-alist (substatement-open . 0)
+ (label . +)
+ (case-label . +)
+ (access-label . 0)
+ (inclass . +)
+ (statement-case-intro . +)))
+(mdw-set-default-c-style 'java-mode 'mdw-java)
;; Declare Java fontification style.
(defun mdw-fontify-java ()
;; Other stuff.
- (mdw-java-style)
- (setq c-hanging-comment-ender-p nil)
- (setq c-backslash-column 72)
(setq mdw-fill-prefix mdw-c-comment-fill-prefix)
;; Now define things to be fontified.
;; Make indentation nice.
-(defun mdw-csharp-style ()
- (c-add-style "[mdw] C# style"
- '((c-basic-offset . 2)
- (c-offsets-alist (substatement-open . 0)
- (label . 0)
- (case-label . +)
- (access-label . 0)
- (inclass . +)
- (statement-case-intro . +)))
- t))
+(mdw-define-c-style mdw-csharp
+ (c-basic-offset . 2)
+ (c-backslash-column . 72)
+ (c-offsets-alist (substatement-open . 0)
+ (label . 0)
+ (case-label . +)
+ (access-label . 0)
+ (inclass . +)
+ (statement-case-intro . +)))
+(mdw-set-default-c-style 'csharp-mode 'mdw-csharp)
;; Declare C# fontification style.
(defun mdw-fontify-csharp ()
;; Other stuff.
- (mdw-csharp-style)
- (setq c-hanging-comment-ender-p nil)
- (setq c-backslash-column 72)
(setq mdw-fill-prefix mdw-c-comment-fill-prefix)
;; Now define things to be fontified.
;; Make Awk indentation nice.
-(defun mdw-awk-style ()
- (c-add-style "[mdw] Awk style"
- '((c-basic-offset . 2)
- (c-offsets-alist (substatement-open . 0)
- (statement-cont . 0)
- (statement-case-intro . +)))
- t))
+(mdw-define-c-style mdw-awk
+ (c-basic-offset . 2)
+ (c-offsets-alist (substatement-open . 0)
+ (c-backslash-column . 72)
+ (statement-cont . 0)
+ (statement-case-intro . +)))
+(mdw-set-default-c-style 'awk-mode 'mdw-awk)
;; Declare Awk fontification style.
(defun mdw-fontify-awk ()
;; Miscellaneous fiddling.
- (mdw-awk-style)
- (setq c-backslash-column 72)
(mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
;; Now define things to be fontified.