Coding Style ============ Here are some of the basics that we are trying to enforce for our coding style. The existing code (as of the commit that adds these lines) is not yet fully consistent to these rules, but following these rules will make sure that no one yells at you about your patches. We have a script that can be used to reformat code to be reasonably close to these rules; it's in scripts/whitespace.pl - this script requires clang-format to be installed (which sadly isn't installed by default on any of our platforms; even on Mac where clang is the default compiler). At the end of this file are some ideas for your .emacs file (if that's your editor of choice) as well as for QtCreator. If you have settings for other editors that implement this coding style, please add them here. Basic rules =========== - all indentation is tabs (set to 8 char) with the exception of continuation lines that are alligned with tabs and then spaces - all keywords followed by a '(' have a space in between if (condition) for (i = 0; i < 5; i++) - function calls do NOT have a space between their name and argument i = some_function(argument); - usually there is no space on the inside of parenthesis (see examples above) - function / method implementations have their opening curly braces in column 1 - all other opening curly braces follow at the end of the line, with a space separating them: if (condition) { dosomething(); } - both sides of an if / else clause either use or do not use curly braces: if (condition) i = 4; else j = 6; if (condition) { i = 6; } else { i = 4; j = 6; } - use space to make visual separation easier a = b + 3 + e / 4; - continuation lines have the operator / comma at the end if (very_long_conditiont_1 || condition_2) b = a + (c + d + f + z); - in a C++ constructor initialization list, the colon is on the same line and continuation lines are aligned as the rule above: ClassName::ClassName() : x(1), y(2), z(3) { } - unfortunate inconsistency: -- C code usually uses underscores to structure names variable_in_C -- C++ code usually uses camelCase variableInCPlusPlus where the two meet, use your best judgment and go for best consistency (i.e., where does the variable "originate") - switch statements with blocks are a little bit special (to avoid indenting too far) switch (foo) { case FIRST: whatever(); break; case SECOND: { int i; for (i = 0; i < 5; i++) do_something(i); } } Sample Settings =============== Emacs ----- These lines in your .emacs file should get you fairly close when it comes to indentation - many of the other rules you have to follow manually ;; indentation (defun c-lineup-arglist-tabs-only (ignored) "Line up argument lists by tabs, not spaces" (let* ((anchor (c-langelem-pos c-syntactic-element)) (column (c-langelem-2nd-pos c-syntactic-element)) (offset (- (1+ column) anchor)) (steps (floor offset c-basic-offset))) (* (max steps 1) c-basic-offset))) (add-hook 'c-mode-common-hook (lambda () ;; Add kernel style (c-add-style "linux-tabs-only" '("linux" (c-offsets-alist (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist-tabs-only)))))) (add-hook 'c-mode-hook (lambda () (let ((filename (buffer-file-name))) ;; Enable kernel mode for the appropriate files (setq indent-tabs-mode t) (c-set-style "linux-tabs-only")))) (add-hook 'c++-mode-hook (lambda () (let ((filename (buffer-file-name))) ;; Enable kernel mode for the appropriate files (setq indent-tabs-mode t) (c-set-style "linux-tabs-only")))) QtCreator --------- These settings seem to get indentation right in QtCreator. Making TAB always adjust indent makes it hard to add hard tabs before '\' when creating continuing lines. Copying a tab with your mouse / ctrl-C and inserting it with ctrl-V seems to work around that problem (use Command instead of ctrl on your Mac) CodeStyleData false false true false false false false false true false false false true true false true false false false 8 true false 2 false 8 DisplayName Subsurface Vim --------- As everybody knows vim is a way better editor than emacs and thus needs to be in this file to. Put this into your .vimrc and this should produce something close to our coding standards. " Subsurface coding style filetype plugin indent on filetype detect set cindent tabstop=8 shiftwidth=8 cinoptions=l1,:0 " TODO: extern "C" gets indented " TODO: content of class blocks gets indented " And some sane defaults, optional, but quite nice set nocompatible syntax on colorscheme default " The default blue is just impossible to see on a black terminal highlight Comment ctermfg=Brown " clearly point out when someone have trailing spaces highlight ExtraWhitespace ctermbg=red guibg=red " Show trailing whitespace and spaces before a tab: match ExtraWhitespace /\s\+$\| \+\ze\t/