Difference between revisions of "Editor Macro Column Align Source"
From Lazarus wiki
Jump to navigationJump to search (Created page with "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....") |
m (Categorised page; add See also section) |
||
Line 1: | Line 1: | ||
− | Please see [[ | + | 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. | 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. | ||
Line 73: | Line 71: | ||
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | == See also == | ||
+ | |||
+ | * [[Editor Macros PascalScript]] | ||
+ | * [[IDE Window: Editor Macros]] | ||
+ | |||
+ | [[Category:Lazarus]] | ||
+ | [[Category:PascalScript]] | ||
+ | [[Category:Pascal Script]] | ||
+ | [[Category:IDE Macros]] |
Latest revision as of 05:48, 21 September 2020
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)
text: string;
a: Integer;
foo: boolean
The macro:
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.