Sign in Join
Wiki copytemporary

Editor Macros PascalScript/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1+## Contents
2+
3+ * 1 Общее
4+ * 2 Доступность
5+ * 3 Простые действия
6+ * 4 Функции
7+ * 5 Представление объектов
8+ * 5.1 Caller: TSynEdit
9+ * 5.2 ClipBoard: TClipBoard
10+ * 6 Пример
11+
112# Общее
213
3-Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
14+Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
415
516См. также [[IDE Window: Editor Macros/ru|IDE_Window:_Editor_Macros]]
617
718# Доступность
819
9-Эта функциональность доступна только на определенных платформах/архитектурах:
20+Эта функциональность доступна только на определенных платформах/архитектурах:
1021
11-- Windows
12- - 32/64bit Intel/AMD
13-- Linux
14- - 32/64bit Intel/AMD
15-- Mac
16- - 32(/maybe 64)bit Intel/AMD
17- - 32bit PPC
22+ * Windows
23+ * 32/64bit Intel/AMD
24+ * Linux
25+ * 32/64bit Intel/AMD
26+ * Mac
27+ * 32(/maybe 64)bit Intel/AMD
28+ * 32bit PPC
1829
1930# Простые действия
2031
21-Все простые действия с клавиатурой представлены следующим образом:
22-
23-ecLeft;
24-Перемещает каретку \[на один символ\] влево (в редакторе, который вызвал макрос)
32+Все простые действия с клавиатурой представлены следующим образом:
2533
26-ecChar('a');
27-Вставляет \[символ\] 'a'
34+ecLeft;
35+ Перемещает каретку [на один символ] влево (в редакторе, который вызвал макрос)
36+ecChar('a');
37+ Вставляет [символ] 'a'
2838
29-См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для \[получения\] полного списка. Или используйте Recorder для получения имен действий.
39+См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для [получения] полного списка. Или используйте Recorder для получения имен действий.
3040
3141# Функции
32-
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');`
42+```
43+Function MessageDlg( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint) : Integer');
44+ Function MessageDlgPos( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer) : Integer');
45+ Function MessageDlgPosHelp( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer; const HelpFileName : string) : Integer');
46+ Procedure ShowMessage( const Msg : string);
47+ Procedure ShowMessagePos( const Msg : string; X, Y : Integer)');
48+ Function InputBox( const ACaption, APrompt, ADefault : string) : string');
49+ Function InputQuery( const ACaption, APrompt : string; var Value : string) : Boolean');
50+```
4051
4152# Представление объектов
4253
43-Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
54+Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
4455
4556## Caller: TSynEdit
4657
47-Доступны следующие методы и свойства:
48-
49-Caret (Каретка)
50-
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);`
58-
59-Selection (Выделение)
60-
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;`
72-
73-Search/Replace (Поиск/Замена)
74-
75-`   function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;`\
76-`   function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;`
77-
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);`
58+Доступны следующие методы и свойства:
9159
92-Возвращает количество выполненных замен. При поиске, возвращает 1, если \[совпадение\] найдено, 0, если \[совпадение\] не найдено. Если найдено совпадение, \[оно\] будет выделено (используйте BlockBegin/End).
60+Caret (Каретка)
61+
62+```
63+property CaretX: Integer;
64+ property CaretY: Integer;
65+ property CaretXY: TPoint;
66+ property LogicalCaretXY: TPoint;
67+ property LogicalCaretX: Integer;
68+ procedure MoveCaretIgnoreEOL(const NewCaret: TPoint);
69+ procedure MoveLogicalCaretIgnoreEOL(const NewLogCaret: TPoint);
70+```
9371
94-` if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin`\
95-`   // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)`\
96-` end;`
72+Selection (Выделение)
73+
74+```
75+property BlockBegin: TPoint;
76+ property BlockEnd: TPoint;
77+ property SelAvail: Boolean; // только для чтения
78+ property SelText: string;
79+ property SelectionMode: TSynSelectionMode;
80+ procedure ClearSelection;
81+ procedure SelectAll;
82+ procedure SelectToBrace;
83+ procedure SelectWord;
84+ procedure SelectLine(WithLeadSpaces: Boolean);
85+ procedure SelectParagraph;
86+```
9787
98-Text (Текст)
88+
9989
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-`                                 );`
90+Search/Replace (Поиск/Замена)
91+
92+```
93+function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;
94+ function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;
95+```
96+```
97+TSynSearchOptions = set of
98+ ( ssoMatchCase, ssoWholeWord,
99+ ssoBackwards,
100+ ssoEntireScope, ssoSelectedOnly, // По умолчанию от [текущего положения] каретки до конца
101+ // текста (или к началу текста, если наоборот)
102+ ssoReplace, ssoReplaceAll, // В противном случае функция выполняет только поиск
103+ ssoPrompt, // Показывать приглашение перед заменой
104+ ssoSearchInReplacement, // продолжить поиск-замену в замещенном (с помощью ssoReplaceAll)/рекурсивная замена
105+ ssoRegExpr, ssoRegExprMultiLine,
106+ ssoFindContinue // Предположим, что текущее выделение является последним совпадением и
107+ // начинается поиск позади выделения (впереди [выделения], если ssoBackward)
108+ // По умолчанию [поиск] начинается с [текущего положения] каретки (только
109+ // для SearchReplace/SearchReplaceEx, [который] имеет параметр start/end);
110+```
111111
112-Clipboard (Буфер обмена)
112+Возвращает количество выполненных замен. При поиске, возвращает 1, если [совпадение] найдено, 0, если [совпадение] не найдено. Если найдено совпадение, [оно] будет выделено (используйте BlockBegin/End).
113+```
114+if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin
115+ // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)
116+ end;
117+```
113118
114-`   procedure CopyToClipboard;`\
115-`   procedure CutToClipboard;`\
116-`   procedure PasteFromClipboard;`\
117-`   property CanPaste: Boolean     // только для чтения`
119+Text (Текст)
120+
121+```
122+property Lines[Index: Integer]: string; // read only
123+ property LineAtCaret: string; // read only
124+ procedure InsertTextAtCaret(aText: String; aCaretMode : TSynCaretAdjustMode);
125+ property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String // Логическая точка
126+ procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint;
127+ const AValue: String;
128+ aFlags: TSynEditTextFlags = [];
129+ aCaretMode: TSynCaretAdjustMode;
130+ aMarksMode: TSynMarksAdjustMode;
131+ aSelectionMode: TSynSelectionMode
132+ );
133+```
118134
119-Logical / Physical (Логический / Физический)
135+Clipboard (Буфер обмена)
136+
137+```
138+procedure CopyToClipboard;
139+ procedure CutToClipboard;
140+ procedure PasteFromClipboard;
141+ property CanPaste: Boolean // только для чтения
142+```
120143
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;`
144+Logical / Physical (Логический / Физический)
145+
146+```
147+function LogicalToPhysicalPos(const p: TPoint): TPoint;
148+ function LogicalToPhysicalCol(const Line: String; Index, LogicalPos
149+ : integer): integer;
150+ function PhysicalToLogicalPos(const p: TPoint): TPoint;
151+ function PhysicalToLogicalCol(const Line: string;
152+ Index, PhysicalPos: integer): integer;
153+ function PhysicalLineLength(Line: String; Index: integer): integer;
154+```
128155
129156## ClipBoard: TClipBoard
130-
131-`   property AsText: String;`
157+```
158+property AsText: String;
159+```
132160
133161# Пример
134162
135-Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
136-
137-Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что \[выравнивание\] будет подогнано независимо от границ слова)
163+Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
138164
139-``` pascal
140- text: string;
141- a: Integer;
142- foo: boolean
165+Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что [выравнивание] будет подогнано независимо от границ слова)
143166```
144-
145-Макрос:
167+text: string;
168+ a: Integer;
169+ foo: boolean
170+```
146171
147-``` pascal
172+Макрос:
173+```
148174function IsIdent(c: Char): Boolean;
149-begin
150- Result := ((c >= 'a') and (c <= 'z')) or
151- ((c >= 'A') and (c <= 'Z')) or
152- ((c >= '0') and (c <= '9')) or
153- (c = '_');
154-end;
155-
156-var
157- p1, p2: TPoint;
158- s1, s2: string;
159- i, j, k: Integer;
160-begin
161- if not Caller.SelAvail then exit;
162- p1 := Caller.BlockBegin;
163- p2 := Caller.BlockEnd;
164- if (p1.y > p2.y) or ((p1.y = p2.y) and (p1.x > p2.x)) then begin
165- p1 := Caller.BlockEnd;
166- p2 := Caller.BlockBegin;
167- end;
168- s1 := Caller.Lines[p1.y - 1];
169- s2 := '';
170- i := p1.x
171- while (i <= length(s1)) and (s1[i] in [#9, ' ']) do inc(i);
172- j := i;
173- if i <= length(s1) then begin
174- if IsIdent(s1[i]) then // pascal identifier
175- while (i <= length(s1)) and IsIdent(s1[i]) do inc(i)
176- else
177- while (i <= length(s1)) and not(IsIdent(s1[i]) or (s1[i] in [#9, ' '])) do inc(i);
178- end;
179- if i > j then s2 := copy(s1, j, i-j);
180-
181- if not InputQuery( 'Align', 'Token', s2) then exit;
182-
183- j := 0;
184- for i := p1.y to p2.y do begin
185- s1 := Caller.Lines[i - 1];
186- k := pos(s2, s1);
187- if (k > j) then j := k;
188- end;
189- if j < 1 then exit;
190-
191- for i := p1.y to p2.y do begin
192- s1 := Caller.Lines[i - 1];
193- k := pos(s2, s1);
194- if (k > 0) and (k < j) then begin
195- Caller.LogicalCaretXY := Point(k, i);
196- while k < j do begin
197- ecChar(' ');
198- inc(k);
199- end;
175+ begin
176+ Result := ((c >= 'a') and (c <= 'z')) or
177+ ((c >= 'A') and (c <= 'Z')) or
178+ ((c >= '0') and (c <= '9')) or
179+ (c = '_');
200180 end;
201- end;
202-
203-end.
181+
182+ var
183+ p1, p2: TPoint;
184+ s1, s2: string;
185+ i, j, k: Integer;
186+ begin
187+ if not Caller.SelAvail then exit;
188+ p1 := Caller.BlockBegin;
189+ p2 := Caller.BlockEnd;
190+ if (p1.y > p2.y) or ((p1.y = p2.y) and (p1.x > p2.x)) then begin
191+ p1 := Caller.BlockEnd;
192+ p2 := Caller.BlockBegin;
193+ end;
194+ s1 := Caller.Lines[p1.y - 1];
195+ s2 := '';
196+ i := p1.x
197+ while (i <= length(s1)) and (s1[i] in [#9, ' ']) do inc(i);
198+ j := i;
199+ if i <= length(s1) then begin
200+ if IsIdent(s1[i]) then // pascal identifier
201+ while (i <= length(s1)) and IsIdent(s1[i]) do inc(i)
202+ else
203+ while (i <= length(s1)) and not(IsIdent(s1[i]) or (s1[i] in [#9, ' '])) do inc(i);
204+ end;
205+ if i > j then s2 := copy(s1, j, i-j);
206+
207+ if not InputQuery( 'Align', 'Token', s2) then exit;
208+
209+ j := 0;
210+ for i := p1.y to p2.y do begin
211+ s1 := Caller.Lines[i - 1];
212+ k := pos(s2, s1);
213+ if (k > j) then j := k;
214+ end;
215+ if j < 1 then exit;
216+
217+ for i := p1.y to p2.y do begin
218+ s1 := Caller.Lines[i - 1];
219+ k := pos(s2, s1);
220+ if (k > 0) and (k < j) then begin
221+ Caller.LogicalCaretXY := Point(k, i);
222+ while k < j do begin
223+ ecChar(' ');
224+ inc(k);
225+ end;
226+ end;
227+ end;
228+
229+ end.
204230```
205231
232+
206233См. <http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883> для подсчета элементов массива.
207234
208235---
209-*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).*
236+*From the Free Pascal wiki, page "Editor Macros PascalScript/ru", as the Internet Archive kept it on 2022-10-03. 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