mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-22 06:19:21 +02:00
IDE: added code macro: PrevWord, from Oleg, bug #13747
git-svn-id: trunk@20166 -
This commit is contained in:
parent
a1856b3cee
commit
49402b03a1
@ -135,17 +135,21 @@ begin
|
|||||||
begin
|
begin
|
||||||
s := Temp[i];
|
s := Temp[i];
|
||||||
j := Pos('|', s);
|
j := Pos('|', s);
|
||||||
if j > 0 then
|
while j > 0 do
|
||||||
begin
|
begin
|
||||||
Delete(s, j, 1);
|
Delete(s, j, 1);
|
||||||
Temp[i] := s;
|
Temp[i] := s;
|
||||||
NewCaretPos := TRUE;
|
if (not NewCaretPos) then
|
||||||
Inc(p.y, i);
|
begin
|
||||||
if i = 0 then
|
Inc(p.y, i);
|
||||||
Inc(p.x, j - 1)
|
if i = 0 then
|
||||||
else
|
Inc(p.x, j - 1)
|
||||||
p.x := j;
|
else
|
||||||
break;
|
p.x := j;
|
||||||
|
NewCaretPos := TRUE;
|
||||||
|
end;
|
||||||
|
j := Pos('|', s);
|
||||||
|
//break;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
s := Temp.Text;
|
s := Temp.Text;
|
||||||
|
@ -42,7 +42,7 @@ uses
|
|||||||
IDECommands, TextTools, SrcEditorIntf, MenuIntf, IDEWindowIntf, LazIDEIntf,
|
IDECommands, TextTools, SrcEditorIntf, MenuIntf, IDEWindowIntf, LazIDEIntf,
|
||||||
// IDE
|
// IDE
|
||||||
IDEProcs, InputHistory, LazarusIDEStrConsts, EditorOptions, CodeMacroSelect,
|
IDEProcs, InputHistory, LazarusIDEStrConsts, EditorOptions, CodeMacroSelect,
|
||||||
IDEContextHelpEdit, ButtonPanel;
|
IDEContextHelpEdit, ButtonPanel, SynRegExpr;
|
||||||
|
|
||||||
type
|
type
|
||||||
TAutoCompleteOption = (
|
TAutoCompleteOption = (
|
||||||
@ -184,7 +184,10 @@ function CodeMacroAddMissingEnd(const Parameter: string;
|
|||||||
function CodeMacroOfAll(const Parameter: string; InteractiveValue: TPersistent;
|
function CodeMacroOfAll(const Parameter: string; InteractiveValue: TPersistent;
|
||||||
SrcEdit: TSourceEditorInterface;
|
SrcEdit: TSourceEditorInterface;
|
||||||
var Value, ErrorMsg: string): boolean;
|
var Value, ErrorMsg: string): boolean;
|
||||||
|
function CodeMacroPrevWord(const Parameter: string;
|
||||||
|
InteractiveValue: TPersistent;
|
||||||
|
SrcEdit: TSourceEditorInterface;
|
||||||
|
var Value, ErrorMsg: string): boolean;
|
||||||
|
|
||||||
const
|
const
|
||||||
CodeTemplatesMenuRootName = 'CodeTemplates';
|
CodeTemplatesMenuRootName = 'CodeTemplates';
|
||||||
@ -516,6 +519,92 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function CodeMacroPrevWord(const Parameter: string;
|
||||||
|
InteractiveValue: TPersistent; SrcEdit: TSourceEditorInterface; var Value,
|
||||||
|
ErrorMsg: string): boolean;
|
||||||
|
{ gets word previous to the cursor position in current line
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
line
|
||||||
|
i 0 count-1 forb|
|
||||||
|
|
||||||
|
with code template
|
||||||
|
for $PrevWord(1) := $PrevWord(2) to $PrevWord(3) do // template:$PrevWord(0)
|
||||||
|
begin
|
||||||
|
|
|
||||||
|
end;$PrevWord(-1)
|
||||||
|
|
||||||
|
is expanded to
|
||||||
|
for i := 0 to count-1 do // template:forb
|
||||||
|
begin
|
||||||
|
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
if $PrevWord(2) is empty, then template
|
||||||
|
is expanded to
|
||||||
|
for i := | to do // template:forb
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
$PrevWord(0) expands to template itself, i.e. 'forb'
|
||||||
|
$PrevWord(-1) expands to empty string and is used in the end
|
||||||
|
if macro to delete words in the beginning of the line
|
||||||
|
}
|
||||||
|
var
|
||||||
|
Line,s: String;
|
||||||
|
p: TPoint;
|
||||||
|
CodeXYPos: TCodeXYPosition;
|
||||||
|
re : TRegExpr;
|
||||||
|
iParam,lastword,firstword,Position : Integer;
|
||||||
|
st: TStringList;
|
||||||
|
begin
|
||||||
|
iParam:=StrToIntDef(Parameter,-1);
|
||||||
|
Result:=true;
|
||||||
|
Value:='';
|
||||||
|
Line:=SrcEdit.CurrentLineText;
|
||||||
|
p:=SrcEdit.CursorTextXY;
|
||||||
|
if p.y<1 then exit;
|
||||||
|
CodeXYPos.X:=p.x;
|
||||||
|
CodeXYPos.Y:=p.y;
|
||||||
|
CodeXYPos.Code:=SrcEdit.CodeToolsBuffer as TCodeBuffer;
|
||||||
|
if CodeXYPos.Code=nil then exit;
|
||||||
|
|
||||||
|
st:=TStringList.Create;
|
||||||
|
re:=TRegExpr.Create;
|
||||||
|
re.Expression:='[\w\-+*\(\)\[\].^@]+';
|
||||||
|
if(re.Exec(Line))then
|
||||||
|
begin
|
||||||
|
firstword:=re.MatchPos[0];
|
||||||
|
repeat
|
||||||
|
st.Add(re.Match[0]);
|
||||||
|
lastword:=re.MatchPos[0];
|
||||||
|
until (not re.ExecNext);
|
||||||
|
end;
|
||||||
|
s:=st[st.count-1];
|
||||||
|
st.Delete(st.count-1);
|
||||||
|
st.Insert(0,s);
|
||||||
|
if(iParam<0)then
|
||||||
|
begin
|
||||||
|
p.X:=SrcEdit.CursorTextXY.x;
|
||||||
|
CodeXYPos.Code.LineColToPosition(CodeXYPos.Y,firstword,Position);
|
||||||
|
CodeXYPos.Code.Delete(Position,lastword-firstword);
|
||||||
|
p.X:=p.X-(lastword-firstword);
|
||||||
|
SrcEdit.CursorTextXY:=p;
|
||||||
|
Value:='';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if(iParam<st.count)then
|
||||||
|
Value:=st[iParam]
|
||||||
|
else
|
||||||
|
Value:='|';
|
||||||
|
end;
|
||||||
|
st.Free;
|
||||||
|
re.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure RegisterStandardCodeTemplatesMenuItems;
|
procedure RegisterStandardCodeTemplatesMenuItems;
|
||||||
var
|
var
|
||||||
Path: string;
|
Path: string;
|
||||||
@ -587,7 +676,18 @@ begin
|
|||||||
RegisterCodeMacro('OfAll','list of all case values',
|
RegisterCodeMacro('OfAll','list of all case values',
|
||||||
'returns list of all values of case variable in front of variable',
|
'returns list of all values of case variable in front of variable',
|
||||||
@CodeMacroOfAll,nil);
|
@CodeMacroOfAll,nil);
|
||||||
end;
|
RegisterCodeMacro('PrevWord','Preceding word',
|
||||||
|
'Returns parameter-indexed word from the current line preceding cursor position.'+LineEnding+LineEnding+
|
||||||
|
'Words in a line are numbered 1,2,3,... from left to right, but the last word'+LineEnding+
|
||||||
|
'which is always a macro command to be expanded has number 0, thus $PrevWord(0)'+LineEnding+
|
||||||
|
'is always the current macro'+LineEnding+LineEnding+
|
||||||
|
'Example line:'+LineEnding+
|
||||||
|
'i 0 count-1 forb|'+LineEnding+
|
||||||
|
'Here $PrevWord(0)=forb, $PrevWord(1)=1, $PrevWord(2)=0, $PrevWord(2)=count-1'+LineEnding+LineEnding+
|
||||||
|
'In the end of your template use $PrevWord(-1) which expands to an empty string, but performs an '+
|
||||||
|
'importaint operation of wiping off all of the $PrevWords found. In addition here is a regexp that is used'+
|
||||||
|
'to detect words for this macro: [\w\-+*\(\)\[\].^@]+',
|
||||||
|
@CodeMacroPrevWord,nil);end;
|
||||||
|
|
||||||
{ TCodeTemplateEditForm }
|
{ TCodeTemplateEditForm }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user