Difference between revisions of "Fully automatic indentation"

From Free Pascal wiki
Jump to navigationJump to search
Line 88: Line 88:
 
   on e do ; // indent after finally
 
   on e do ; // indent after finally
 
end;        // unindent before finally-end
 
end;        // unindent before finally-end
 +
</Delphi>
 +
 +
==case of end==
 +
 +
<Delphi>
 +
case expr of
 +
const: ;  // no indent after case-of
 +
const:
 +
  Code;    // indent after case-colon
 +
const:
 +
  begin    // indent after case-colon
 +
    Code;  // indent after case-colon-begin
 +
  end;    // unindent before case-colon-end, unindent after case-colon-end
 +
else      // no indent case-else
 +
  Code;    // indent after case-else
 +
end;      // unindent after case-else statements
 +
</Delphi>
 +
 +
<Delphi>
 +
case expr of
 +
          // empty lines => not supported
 +
  const: ; // indent after case-of
 +
 +
  const:
 +
  begin    // no indent after case-colon
 +
  end;
 +
else      // no indent before case-else
 +
end;      // no indent before case-end
 
</Delphi>
 
</Delphi>

Revision as of 14:15, 22 May 2009

Overview

The source editor should auto indent on pressing return/enter, on paste and when inserting auto generated code. This depends on language and user preferences. Most other editors use either a fixed set of rules or a set of options to configure the rules. This is semi automatic indentation. These options are either too simple or too complex. And they only allow one set of rules, so editing sources with different policies is difficult.

Fully automatic indentation tries to guess the rules from the surrounding code.

Examples

Amount of indent

Let's keep it simple and assume one indent size. Open questions are:

  • How much indent
  • Use tabs
  • long lines
  • Special cases

Examples

Sometimes record and classes are aligned to the keywords instead of start of last line.

<Delphi> type TMyRecord = record

                i: integer;
                end;

</Delphi>

begin end

<Delphi> procedure Do; var

 i: integer; // indent after var

begin // no indent after procedure, no indent before procedure-begin, unindent after var section

 if expr then
 begin       // no indent after then, no indent before then-begin
   Code;     // indent after begin
 end;        // unindent before end

end; </Delphi>

<Delphi> procedure Do; begin

 if expr then begin  
   Code;             // indent after begin
 end;                // unindent before end

end; </Delphi>

<Delphi> procedure Do; begin

 if expr then
   begin   // indent after then and unindent after then-statement
   Code;   // no indent after begin
   end;    // no unindent before end

end; </Delphi>

<Delphi> procedure Do; begin

 if expr then
   begin     // indent after then and unindent after then-statement
     Code;   // indent after begin
   end;      // unindent before end

end; </Delphi>

repeat until

I never saw code other than this:

<Delphi> repeat

 Code; // indent after repeat

until ; // unindent before until </Delphi>

try finally

I never saw code other than this:

<Delphi> try

 Code;     // indent after try

finally // unindent before finally

 on e do ; // indent after finally

end; // unindent before finally-end </Delphi>

case of end

<Delphi> case expr of const: ; // no indent after case-of const:

 Code;    // indent after case-colon

const:

 begin    // indent after case-colon
   Code;  // indent after case-colon-begin
 end;     // unindent before case-colon-end, unindent after case-colon-end

else // no indent case-else

 Code;    // indent after case-else

end; // unindent after case-else statements </Delphi>

<Delphi> case expr of

          // empty lines => not supported
 const: ; // indent after case-of
 const: 
 begin    // no indent after case-colon
 end;

else // no indent before case-else end; // no indent before case-end </Delphi>