Sign in Join
Wiki copytemporary

Editor Macros PascalScript/ru: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Общее
22
33Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
44
55См. также [[IDE Window: Editor Macros/ru|IDE_Window:_Editor_Macros]]
66
77# Доступность
88
99Эта функциональность доступна только на определенных платформах/архитектурах:
1010
1111- Windows
1212 - 32/64bit Intel/AMD
1313- Linux
1414 - 32/64bit Intel/AMD
1515- Mac
1616 - 32(/maybe 64)bit Intel/AMD
1717 - 32bit PPC
1818
1919# Простые действия
2020
2121Все простые действия с клавиатурой представлены следующим образом:
2222
2323ecLeft;
2424Перемещает каретку \[на один символ\] влево (в редакторе, который вызвал макрос)
2525
2626ecChar('a');
2727Вставляет \[символ\] 'a'
2828
2929См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для \[получения\] полного списка. Или используйте Recorder для получения имен действий.
3030
3131# Функции
3232
33-`   Function MessageDlg( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint) : Integer');`\
34-`   Function MessageDlgPos( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer) : Integer');`\
35-`   Function MessageDlgPosHelp( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer; const HelpFileName : string) : Integer');`\
36-`   Procedure ShowMessage( const Msg : string);`\
37-`   Procedure ShowMessagePos( const Msg : string; X, Y : Integer)');`\
38-`   Function InputBox( const ACaption, APrompt, ADefault : string) : string');`\
39-`   Function InputQuery( const ACaption, APrompt : string; var Value : string) : Boolean');`
33+``` pascal
34+ Function MessageDlg( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint) : Integer');
35+ Function MessageDlgPos( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer) : Integer');
36+ Function MessageDlgPosHelp( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer; const HelpFileName : string) : Integer');
37+ Procedure ShowMessage( const Msg : string);
38+ Procedure ShowMessagePos( const Msg : string; X, Y : Integer)');
39+ Function InputBox( const ACaption, APrompt, ADefault : string) : string');
40+ Function InputQuery( const ACaption, APrompt : string; var Value : string) : Boolean');
41+```
4042
4143# Представление объектов
4244
4345Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
4446
4547## Caller: TSynEdit
4648
4749Доступны следующие методы и свойства:
4850
4951Caret (Каретка)
5052
51-`   property CaretX: Integer;`\
52-`   property CaretY: Integer;`\
53-`   property CaretXY: TPoint;`\
54-`   property LogicalCaretXY: TPoint;`\
55-`   property LogicalCaretX: Integer;`\
56-`   procedure MoveCaretIgnoreEOL(const NewCaret: TPoint);`\
57-`   procedure MoveLogicalCaretIgnoreEOL(const NewLogCaret: TPoint);`
53+``` pascal
54+ property CaretX: Integer;
55+ property CaretY: Integer;
56+ property CaretXY: TPoint;
57+ property LogicalCaretXY: TPoint;
58+ property LogicalCaretX: Integer;
59+ procedure MoveCaretIgnoreEOL(const NewCaret: TPoint);
60+ procedure MoveLogicalCaretIgnoreEOL(const NewLogCaret: TPoint);
61+```
5862
5963Selection (Выделение)
6064
61-`   property BlockBegin: TPoint;`\
62-`   property BlockEnd: TPoint;`\
63-`   property SelAvail: Boolean; // только для чтения`\
64-`   property SelText: string;`\
65-`   property SelectionMode: TSynSelectionMode;`\
66-`   procedure ClearSelection;`\
67-`   procedure SelectAll;`\
68-`   procedure SelectToBrace;`\
69-`   procedure SelectWord;`\
70-`   procedure SelectLine(WithLeadSpaces: Boolean);`\
71-`   procedure SelectParagraph;`
65+``` pascal
66+ property BlockBegin: TPoint;
67+ property BlockEnd: TPoint;
68+ property SelAvail: Boolean; // только для чтения
69+ property SelText: string;
70+ property SelectionMode: TSynSelectionMode;
71+ procedure ClearSelection;
72+ procedure SelectAll;
73+ procedure SelectToBrace;
74+ procedure SelectWord;
75+ procedure SelectLine(WithLeadSpaces: Boolean);
76+ procedure SelectParagraph;
77+```
7278
7379Search/Replace (Поиск/Замена)
7480
75-`   function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;`\
76-`   function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;`
81+``` pascal
82+ function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;
83+ function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;
84+```
7785
78-`   TSynSearchOptions = set of`\
79-`   ( ssoMatchCase, ssoWholeWord,`\
80-`     ssoBackwards,`\
81-`     ssoEntireScope, ssoSelectedOnly,  // По умолчанию от [текущего положения] каретки до конца `\
82-`                                       // текста (или к началу текста, если наоборот)`\
83-`     ssoReplace, ssoReplaceAll,        // В противном случае функция выполняет только поиск`\
84-`     ssoPrompt,                        // Показывать приглашение перед заменой`\
85-`     ssoSearchInReplacement,           // продолжить поиск-замену в замещенном (с помощью ssoReplaceAll)/рекурсивная замена`\
86-`     ssoRegExpr, ssoRegExprMultiLine,`\
87-`     ssoFindContinue                   // Предположим, что текущее выделение является последним совпадением и `\
88-`                                       // начинается поиск позади выделения (впереди [выделения], если ssoBackward)`\
89-`                                       // По умолчанию [поиск] начинается с [текущего положения] каретки (только `\
90-`                                       // для SearchReplace/SearchReplaceEx, [который] имеет параметр start/end);`
86+``` pascal
87+ TSynSearchOptions = set of
88+ ( ssoMatchCase, ssoWholeWord,
89+ ssoBackwards,
90+ ssoEntireScope, ssoSelectedOnly, // По умолчанию от [текущего положения] каретки до конца
91+ // текста (или к началу текста, если наоборот)
92+ ssoReplace, ssoReplaceAll, // В противном случае функция выполняет только поиск
93+ ssoPrompt, // Показывать приглашение перед заменой
94+ ssoSearchInReplacement, // продолжить поиск-замену в замещенном (с помощью ssoReplaceAll)/рекурсивная замена
95+ ssoRegExpr, ssoRegExprMultiLine,
96+ ssoFindContinue // Предположим, что текущее выделение является последним совпадением и
97+ // начинается поиск позади выделения (впереди [выделения], если ssoBackward)
98+ // По умолчанию [поиск] начинается с [текущего положения] каретки (только
99+ // для SearchReplace/SearchReplaceEx, [который] имеет параметр start/end);
100+```
91101
92102Возвращает количество выполненных замен. При поиске, возвращает 1, если \[совпадение\] найдено, 0, если \[совпадение\] не найдено. Если найдено совпадение, \[оно\] будет выделено (используйте BlockBegin/End).
93103
94-` if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin`\
95-`   // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)`\
96-` end;`
104+``` pascal
105+ if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin
106+ // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)
107+ end;
108+```
97109
98110Text (Текст)
99111
100-`   property Lines[Index: Integer]: string; // read only`\
101-`   property LineAtCaret: string;  // read only`\
102-`   procedure InsertTextAtCaret(aText: String; aCaretMode : TSynCaretAdjustMode);`\
103-`   property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String              // Логическая точка`\
104-`   procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint;`\
105-`                                  const AValue: String;`\
106-`                                  aFlags: TSynEditTextFlags = [];`\
107-`                                  aCaretMode: TSynCaretAdjustMode;`\
108-`                                  aMarksMode: TSynMarksAdjustMode;`\
109-`                                  aSelectionMode: TSynSelectionMode`\
110-`                                 );`
112+``` pascal
113+ property Lines[Index: Integer]: string; // read only
114+ property LineAtCaret: string; // read only
115+ procedure InsertTextAtCaret(aText: String; aCaretMode : TSynCaretAdjustMode);
116+ property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String // Логическая точка
117+ procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint;
118+ const AValue: String;
119+ aFlags: TSynEditTextFlags = [];
120+ aCaretMode: TSynCaretAdjustMode;
121+ aMarksMode: TSynMarksAdjustMode;
122+ aSelectionMode: TSynSelectionMode
123+ );
124+```
111125
112126Clipboard (Буфер обмена)
113127
114-`   procedure CopyToClipboard;`\
115-`   procedure CutToClipboard;`\
116-`   procedure PasteFromClipboard;`\
117-`   property CanPaste: Boolean     // только для чтения`
128+``` pascal
129+ procedure CopyToClipboard;
130+ procedure CutToClipboard;
131+ procedure PasteFromClipboard;
132+ property CanPaste: Boolean // только для чтения
133+```
118134
119135Logical / Physical (Логический / Физический)
120136
121-`   function LogicalToPhysicalPos(const p: TPoint): TPoint;`\
122-`   function LogicalToPhysicalCol(const Line: String; Index, LogicalPos`\
123-`                             : integer): integer;`\
124-`   function PhysicalToLogicalPos(const p: TPoint): TPoint;`\
125-`   function PhysicalToLogicalCol(const Line: string;`\
126-`                                 Index, PhysicalPos: integer): integer;`\
127-`   function PhysicalLineLength(Line: String; Index: integer): integer;`
137+``` pascal
138+ function LogicalToPhysicalPos(const p: TPoint): TPoint;
139+ function LogicalToPhysicalCol(const Line: String; Index, LogicalPos
140+ : integer): integer;
141+ function PhysicalToLogicalPos(const p: TPoint): TPoint;
142+ function PhysicalToLogicalCol(const Line: string;
143+ Index, PhysicalPos: integer): integer;
144+ function PhysicalLineLength(Line: String; Index: integer): integer;
145+```
128146
129147## ClipBoard: TClipBoard
130148
131-`   property AsText: String;`
149+```text
150+ property AsText: String;
151+```
132152
133153# Пример
134154
135155Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
136156
137157Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что \[выравнивание\] будет подогнано независимо от границ слова)
138158
139159``` pascal
140160 text: string;
141161 a: Integer;
142162 foo: boolean
143163```
144164
145165Макрос:
146166
147167``` pascal
148168function IsIdent(c: Char): Boolean;
149169begin
150170 Result := ((c >= 'a') and (c <= 'z')) or
151171 ((c >= 'A') and (c <= 'Z')) or
152172 ((c >= '0') and (c <= '9')) or
153173 (c = '_');
154174end;
155175
156176var
157177 p1, p2: TPoint;
158178 s1, s2: string;
159179 i, j, k: Integer;
160180begin
161181 if not Caller.SelAvail then exit;
162182 p1 := Caller.BlockBegin;
163183 p2 := Caller.BlockEnd;
164184 if (p1.y > p2.y) or ((p1.y = p2.y) and (p1.x > p2.x)) then begin
165185 p1 := Caller.BlockEnd;
166186 p2 := Caller.BlockBegin;
167187 end;
168188 s1 := Caller.Lines[p1.y - 1];
169189 s2 := '';
170190 i := p1.x
171191 while (i <= length(s1)) and (s1[i] in [#9, ' ']) do inc(i);
172192 j := i;
173193 if i <= length(s1) then begin
174194 if IsIdent(s1[i]) then // pascal identifier
175195 while (i <= length(s1)) and IsIdent(s1[i]) do inc(i)
176196 else
177197 while (i <= length(s1)) and not(IsIdent(s1[i]) or (s1[i] in [#9, ' '])) do inc(i);
178198 end;
179199 if i > j then s2 := copy(s1, j, i-j);
180200
181201 if not InputQuery( 'Align', 'Token', s2) then exit;
182202
183203 j := 0;
184204 for i := p1.y to p2.y do begin
185205 s1 := Caller.Lines[i - 1];
186206 k := pos(s2, s1);
187207 if (k > j) then j := k;
188208 end;
189209 if j < 1 then exit;
190210
191211 for i := p1.y to p2.y do begin
192212 s1 := Caller.Lines[i - 1];
193213 k := pos(s2, s1);
194214 if (k > 0) and (k < j) then begin
195215 Caller.LogicalCaretXY := Point(k, i);
196216 while k < j do begin
197217 ecChar(' ');
198218 inc(k);
199219 end;
200220 end;
201221 end;
202222
203223end.
204224```
205225
206226См. <http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883> для подсчета элементов массива.
207227
208228---
209229*From the Free Pascal wiki, page "Editor Macros PascalScript/ru", as it stood on 2020-02-14 after a change by Trev, out of the wiki's dump of 2024-05-26. 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](/wiki-contact).*

Back to history