From c56296d07eb9c33431d9e842cc20330b4cbe38b2 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 27 Apr 2016 16:22:34 +0100 Subject: [PATCH] el/dot-emacs.el: Use the CC Mode style machinery properly. * Add new macros for defining styles properly, and for tweaking the default style selections. * Replace the `mdw-mumble-style' functions with macro calls to set up the styles. * Move explicit variable settings into the style settings where possible. This looks more complicated than it really is, because a bunch of stuff gets moved about and reindented. --- el/dot-emacs.el | 153 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 88 insertions(+), 65 deletions(-) diff --git a/el/dot-emacs.el b/el/dot-emacs.el index bb8ccaa..8b24c35 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -1450,28 +1450,66 @@ doesn't match any of the regular expressions in 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)) +(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-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]*/?\\)" @@ -1490,11 +1528,7 @@ doesn't match any of the regular expressions in (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) @@ -1679,9 +1713,6 @@ doesn't match any of the regular expressions in (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) @@ -1719,25 +1750,22 @@ doesn't match any of the regular expressions in ;; 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. @@ -1916,25 +1944,22 @@ doesn't match any of the regular expressions in ;; 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. @@ -2247,21 +2272,19 @@ doesn't match any of the regular expressions in ;; 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. -- 2.11.0