Home | History | Annotate | Download | only in google-styleguide
      1 ;;; google-c-style.el --- Google's C/C++ style for c-mode
      2 
      3 ;; Keywords: c, tools
      4 
      5 ;; google-c-style.el is Copyright (C) 2008 Google Inc. All Rights Reserved.
      6 ;;
      7 ;; It is free software; you can redistribute it and/or modify it under the
      8 ;; terms of either:
      9 ;;
     10 ;; a) the GNU General Public License as published by the Free Software
     11 ;; Foundation; either version 1, or (at your option) any later version, or
     12 ;;
     13 ;; b) the "Artistic License".
     14 
     15 ;;; Commentary:
     16 
     17 ;; Provides the google C/C++ coding style. You may wish to add
     18 ;; `google-set-c-style' to your `c-mode-common-hook' after requiring this
     19 ;; file. For example:
     20 ;;
     21 ;;    (add-hook 'c-mode-common-hook 'google-set-c-style)
     22 ;;
     23 ;; If you want the RETURN key to go to the next line and space over
     24 ;; to the right place, add this to your .emacs right after the load-file:
     25 ;;
     26 ;;    (add-hook 'c-mode-common-hook 'google-make-newline-indent)
     27 
     28 ;;; Code:
     29 
     30 ;; For some reason 1) c-backward-syntactic-ws is a macro and 2)  under Emacs 22
     31 ;; bytecode cannot call (unexpanded) macros at run time:
     32 (eval-when-compile (require 'cc-defs))
     33 
     34 ;; Wrapper function needed for Emacs 21 and XEmacs (Emacs 22 offers the more
     35 ;; elegant solution of composing a list of lineup functions or quantities with
     36 ;; operators such as "add")
     37 (defun google-c-lineup-expression-plus-4 (langelem)
     38   "Indents to the beginning of the current C expression plus 4 spaces.
     39 
     40 This implements title \"Function Declarations and Definitions\"
     41 of the Google C++ Style Guide for the case where the previous
     42 line ends with an open parenthese.
     43 
     44 \"Current C expression\", as per the Google Style Guide and as
     45 clarified by subsequent discussions, means the whole expression
     46 regardless of the number of nested parentheses, but excluding
     47 non-expression material such as \"if(\" and \"for(\" control
     48 structures.
     49 
     50 Suitable for inclusion in `c-offsets-alist'."
     51   (save-excursion
     52     (back-to-indentation)
     53     ;; Go to beginning of *previous* line:
     54     (c-backward-syntactic-ws)
     55     (back-to-indentation)
     56     (cond
     57      ;; We are making a reasonable assumption that if there is a control
     58      ;; structure to indent past, it has to be at the beginning of the line.
     59      ((looking-at "\\(\\(if\\|for\\|while\\)\\s *(\\)")
     60       (goto-char (match-end 1)))
     61      ;; For constructor initializer lists, the reference point for line-up is
     62      ;; the token after the initial colon.
     63      ((looking-at ":\\s *")
     64       (goto-char (match-end 0))))
     65     (vector (+ 4 (current-column)))))
     66 
     67 ;;;###autoload
     68 (defconst google-c-style
     69   `((c-recognize-knr-p . nil)
     70     (c-enable-xemacs-performance-kludge-p . t) ; speed up indentation in XEmacs
     71     (c-basic-offset . 2)
     72     (indent-tabs-mode . nil)
     73     (c-comment-only-line-offset . 0)
     74     (c-hanging-braces-alist . ((defun-open after)
     75                                (defun-close before after)
     76                                (class-open after)
     77                                (class-close before after)
     78                                (inexpr-class-open after)
     79                                (inexpr-class-close before)
     80                                (namespace-open after)
     81                                (inline-open after)
     82                                (inline-close before after)
     83                                (block-open after)
     84                                (block-close . c-snug-do-while)
     85                                (extern-lang-open after)
     86                                (extern-lang-close after)
     87                                (statement-case-open after)
     88                                (substatement-open after)))
     89     (c-hanging-colons-alist . ((case-label)
     90                                (label after)
     91                                (access-label after)
     92                                (member-init-intro before)
     93                                (inher-intro)))
     94     (c-hanging-semi&comma-criteria
     95      . (c-semi&comma-no-newlines-for-oneline-inliners
     96         c-semi&comma-inside-parenlist
     97         c-semi&comma-no-newlines-before-nonblanks))
     98     (c-indent-comments-syntactically-p . t)
     99     (comment-column . 40)
    100     (c-indent-comment-alist . ((other . (space . 2))))
    101     (c-cleanup-list . (brace-else-brace
    102                        brace-elseif-brace
    103                        brace-catch-brace
    104                        empty-defun-braces
    105                        defun-close-semi
    106                        list-close-comma
    107                        scope-operator))
    108     (c-offsets-alist . ((arglist-intro google-c-lineup-expression-plus-4)
    109                         (func-decl-cont . ++)
    110                         (member-init-intro . ++)
    111                         (inher-intro . ++)
    112                         (comment-intro . 0)
    113                         (arglist-close . c-lineup-arglist)
    114                         (topmost-intro . 0)
    115                         (block-open . 0)
    116                         (inline-open . 0)
    117                         (substatement-open . 0)
    118                         (statement-cont
    119                          .
    120                          (,(when (fboundp 'c-no-indent-after-java-annotations)
    121                              'c-no-indent-after-java-annotations)
    122                           ,(when (fboundp 'c-lineup-assignments)
    123                              'c-lineup-assignments)
    124                           ++))
    125                         (label . /)
    126                         (case-label . +)
    127                         (statement-case-open . +)
    128                         (statement-case-intro . +) ; case w/o {
    129                         (access-label . /)
    130                         (innamespace . 0))))
    131   "Google C/C++ Programming Style.")
    132 
    133 ;;;###autoload
    134 (defun google-set-c-style ()
    135   "Set the current buffer's c-style to Google C/C++ Programming
    136   Style. Meant to be added to `c-mode-common-hook'."
    137   (interactive)
    138   (make-local-variable 'c-tab-always-indent)
    139   (setq c-tab-always-indent t)
    140   (c-add-style "Google" google-c-style t))
    141 
    142 ;;;###autoload
    143 (defun google-make-newline-indent ()
    144   "Sets up preferred newline behavior. Not set by default. Meant
    145   to be added to `c-mode-common-hook'."
    146   (interactive)
    147   (define-key c-mode-base-map "\C-m" 'newline-and-indent)
    148   (define-key c-mode-base-map [ret] 'newline-and-indent))
    149 
    150 (provide 'google-c-style)
    151 ;;; google-c-style.el ends here
    152