(emacs)C Indent


Prev: Lisp Indent Up: Program Indent

Customizing C Indentation
-------------------------

   Two variables control which commands perform C indentation and when.

   If `c-auto-newline' is non-`nil', newlines are inserted both before
and after braces that you insert, and after colons and semicolons.
Correct C indentation is done on all the lines that are made this way.

   If `c-tab-always-indent' is `nil', the TAB command in C mode does
indentation only if point is at the left margin or within the line's
indentation.  If there is non-whitespace to the left of point, then TAB
just inserts a tab character in the buffer.  Normally, this variable is
`t', and TAB always reindents the current line.  The default behavior
means that to insert a real tab character you must quote it by typing
`C-q' TAB.

   C does not have anything analogous to particular function names for
which special forms of indentation are desirable.  However, it has a
different need for customization facilities: many different styles of C
indentation are in common use.

   There are six variables you can set to control the style that Emacs C
mode uses.

`c-indent-level'
     Indentation of C statements within surrounding block.  The
     surrounding block's indentation is the indentation of the line on
     which the open-brace appears.

`c-continued-statement-offset'
     Extra indentation given to a substatement, such as the then-clause
     of an if or body of a while.

`c-brace-offset'
     Extra indentation for line if it starts with an open brace.

`c-brace-imaginary-offset'
     An open brace following other text is treated as if it were this
     far to the right of the start of its line.

`c-argdecl-indent'
     Indentation level of declarations of C function arguments.

`c-label-offset'
     Extra indentation for line that is a label, or case or default.

   The variable `c-indent-level' controls the indentation for C
statements with respect to the surrounding block.  In the example

         {
           foo ();

the difference in indentation between the lines is `c-indent-level'.
Its standard value is 2.

   If the open-brace beginning the compound statement is not at the
beginning of its line, the `c-indent-level' is added to the indentation
of the line, not the column of the open-brace.  For example,

     if (losing) {
       do_this ();

One popular indentation style is that which results from setting
`c-indent-level' to 8 and putting open-braces at the end of a line in
this way.  I prefer to put the open-brace on a separate line.

   In fact, the value of the variable `c-brace-imaginary-offset' is
also added to the indentation of such a statement.  Normally this
variable is zero.  Think of this variable as the imaginary position of
the open brace, relative to the first nonblank character on the line.
By setting this variable to 4 and `c-indent-level' to 0, you can get
this style:

     if (x == y) {
         do_it ();
         }

   When `c-indent-level' is zero, the statements inside most braces
will line up right under the open brace.  But there is an exception made
for braces in column zero, such as surrounding a function's body.  The
statements just inside it do not go at column zero.  Instead,
`c-brace-offset' and `c-continued-statement-offset' (see below) are
added to produce a typical offset between brace levels, and the
statements are indented that far.

   `c-continued-statement-offset' controls the extra indentation for a
line that starts within a statement (but not within parentheses or
brackets).  These lines are usually statements that are within other
statements, such as the then-clauses of `if' statements and the bodies
of `while' statements.  This parameter is the difference in indentation
between the two lines in

     if (x == y)
       do_it ();

Its standard value is 2.  Some popular indentation styles correspond to
a value of zero for `c-continued-statement-offset'.

   `c-brace-offset' is the extra indentation given to a line that
starts with an open-brace.  Its standard value is zero; compare

     if (x == y)
       {

with

     if (x == y)
       do_it ();

if `c-brace-offset' were set to 4, the first example would become

     if (x == y)
           {

   `c-argdecl-indent' controls the indentation of declarations of the
arguments of a C function.  It is absolute: argument declarations
receive exactly `c-argdecl-indent' spaces.  The standard value is 5,
resulting in code like this:

     char *
     index (string, c)
          char *string;
          int c;

   `c-label-offset' is the extra indentation given to a line that
contains a label, a case statement, or a `default:' statement.  Its
standard value is -2, resulting in code like this

     switch (c)
       {
       case 'x':

If `c-label-offset' were zero, the same code would be indented as

     switch (c)
       {
         case 'x':

This example assumes that the other variables above also have their
standard values.

   I strongly recommend that you try out the indentation style produced
by the standard settings of these variables, together with putting open
braces on separate lines.  You can see how it looks in all the C source
files of GNU Emacs.


automatically generated by info2www