Special comments in the Jedi Code Formatter
===========================================

The code formatter now  recognizes certain comments  to disable and enable formatting options around blocks of code.

Since the earliest versions, the comments `{(*}` and `{*)}` could be used to disable and reenable formatting respectively, in order to exclude a block of code from formatting. 

From version 0.52, a more extensive syntax has been implemented to allow for fine-grained control over which formatting options are temporarily disabled. The original special comments `{(*}` and `{*)}` are retained as synonymns for `//jcf:format=off` and `//jcf:format=on`  respectively.

For instance, in the following line of code, the formatter will not alter the spacing

```
//jcf:space=off
  a   :=     a     +     1   ;
//jcf:space=on
```

As you can see, the new syntax has the form of a comment like `//jcf:**flag**=**state**`, where **state** is one of `on` or `off`, and the flags are listed below.

Flags
-----

| **Flag** | **Description** |
| --- | --- |
| `parse` | Stop parsing tokens (to avoid errors on unsupported code)- to turn it on again need jcf:parse=on (since lazarus 3.99)|
| `all` | all=on is used to reverse the effects of all `off` comments (except parse), as described below. `all=off` is not valid |
| `format` | All formatting (except parse)|
| `space` | All processes that insert or remove spaces |
| `addspace` | All processes that insert spaces |
| `removespace` | All processes that remove spaces |
| `return` | All processes that insert or remove returns |
| `addreturn` | All processes that insert returns |
| `removereturn` | All processes that remove returns |
| `add` | All processes that insert spaces or returns |
| `remove` | All processes that remove spaces or returns |
| `align` | All processes that align statements - i.e. alignment of variables, constants, types and assignment statements |
| `aligndef` | Alignment of variables, constants and types |
| `alignfn` | Alignment of variables and assignments |
| `alignvars` | Alignment of variables |
| `alignconst` | Alignment of constants |
| `aligntypedef` | Alignment of types |
| `alignassign` | Alignment of assignment |
| `indent` | Correct block indent of statements and declarations |
| `caps` | Capitalisation of reserved words or user-specified words |
| `capsreservedwords` | Capitalisation of reserved words |
| `capsspecificwords` | Capitalisation of user-specified words |
| `linebreaking` | Breaking of long lines |
| `blockstyle` | Line-breaking in blocks of statements |
| `warnings` | Warnings generated by the code fornatter |
| `warnassigntofunctionname` | Warning asign to function name (since lazarus 3.99)|
| `warncasenoelse` | Warning case has no else  (since lazarus 3.99)|
| `warnemptyblock` | Warning empty block (since lazarus 3.99)|
| `warnunusedparam` | Warning unused param (since lazarus 3.99)|
| `findreplace` | Find and replace |
| `findreplaceuses` | Maniupulation of the uses clause |

The following rules apply:

* Turning a flag on will not enable it if it is not enabled in the configuration - the flags are to 'block out' a section of code where a format option is not wanted. The on state is there only to end a previous off state.
* All processes (except parse) turned off by a flag comment remain turned off until the corresponding flag comment that turns it back on is reached, or the end of the file is reached, or the flag comment `//jcf:all=on` is reached.
* The flag comment `//jcf:all=on` will reenable all processes that have been turned off by comments, ie it returns formatting to the options specified in the configuration (except parse).
* Flag comments only affect the file in which they occur, from the position in which the occur onwards.
* The effects of some of the flags overlap - this is done to allow degrees of granularity e.g. turn off all alignment, or just alignment of variable declarations for a block of code.
* In these special comments, character case and some spaces are ignored.
* A comment that starts with `//jcf:` but cannot be recognised as one of the options given will cause a warning in the log but will have no effect of the file's format.

For examples see the test case unit TestExclusionFlags.pas, for implmentation see the unit FormatFlags.pas

* * *

