Sign in Join
Wiki copytemporary

Revision 2 of 3, by WikiArchive on 11-4-2026. The page as it is now.

Editor Macro Column Align Source

Please see Editor Macros PascalScript for info how to use PascalScript Macros in the IDE Source editor.

The macro shown below aligns selected code to a specific token. It looks for a specific token in each selected line, and aligns each occurrence of it.

Select the 3 lines. If the selection starts right before the ":" then the ":" will be detected. A prompt will ask you to confirm the ":". Then all ":" will be aligned. (If you use a word for alignment, please note, that it will be matched regardless of word boundaries)

pascal
text: string;
      a: Integer;
      foo: boolean

The macro:

pascal
function IsIdent(c: Char): Boolean;
    begin
      Result := ((c >= 'a') and (c <= 'z')) or
                ((c >= 'A') and (c <= 'Z')) or
                ((c >= '0') and (c <= '9')) or
                (c = '_');
    end;
    
    var
      p1, p2: TPoint;
      s1, s2: string;
      i, j, k: Integer;
    begin
      if not Caller.SelAvail then exit;
      p1 := Caller.BlockBegin;
      p2 := Caller.BlockEnd;
      if (p1.y > p2.y) or ((p1.y = p2.y) and (p1.x > p2.x)) then begin
        p1 := Caller.BlockEnd;
        p2 := Caller.BlockBegin;
      end;
      s1 := Caller.Lines[p1.y - 1];
      s2 := '';
      i := p1.x
      while (i <= length(s1)) and (s1[i] in [#9, ' ']) do inc(i);
      j := i;
      if i <= length(s1) then begin
        if IsIdent(s1[i]) then // pascal identifier
          while (i <= length(s1)) and IsIdent(s1[i]) do inc(i)
        else
          while (i <= length(s1)) and not(IsIdent(s1[i]) or (s1[i] in [#9, ' '])) do inc(i);
      end;
      if i > j then s2 := copy(s1, j, i-j);
    
      if not InputQuery( 'Align', 'Token', s2) then exit;
    
      j := 0;
      for i := p1.y to p2.y do begin
        s1 := Caller.Lines[i - 1];
        k := pos(s2, s1);
        if (k > j) then j := k;
      end;
      if j < 1 then exit;
    
      for i := p1.y to p2.y do begin
        s1 := Caller.Lines[i - 1];
        k := pos(s2, s1);
        if (k > 0) and (k < j) then begin
          Caller.LogicalCaretXY := Point(k, i);
          while k < j do begin
            ecChar(' ');
            inc(k);
          end;
        end;
      end;
    
    end.

See also


From the Free Pascal wiki, page "Editor Macro Column Align Source", as the Internet Archive kept it on 2023-09-24. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.