Sign in Join
Wiki copytemporary

Editor Macros PascalScript/ru: what changed

Revision 2 to 3. 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-
121# Общее
132
14-Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
3+Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
154
165См. также [[IDE Window: Editor Macros/ru|IDE_Window:_Editor_Macros]]
176
187# Доступность
198
20-Эта функциональность доступна только на определенных платформах/архитектурах:
9+Эта функциональность доступна только на определенных платформах/архитектурах:
2110
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
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
2918
3019# Простые действия
3120
32-Все простые действия с клавиатурой представлены следующим образом:
21+Все простые действия с клавиатурой представлены следующим образом:
3322
34-ecLeft;
35- Перемещает каретку [на один символ] влево (в редакторе, который вызвал макрос)
36-ecChar('a');
37- Вставляет [символ] 'a'
23+ecLeft;
24+Перемещает каретку \[на один символ\] влево (в редакторе, который вызвал макрос)
3825
39-См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для [получения] полного списка. Или используйте Recorder для получения имен действий.
26+ecChar('a');
27+Вставляет \[символ\] 'a'
4028
29+См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для \[получения\] полного списка. Или используйте Recorder для получения имен действий.
30+
4131# Функции
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-```
5132
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');`
40+
5241# Представление объектов
5342
54-Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
43+Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
5544
5645## Caller: TSynEdit
5746
58-Доступны следующие методы и свойства:
47+Доступны следующие методы и свойства:
5948
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-```
49+Caret (Каретка)
7150
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-```
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);`
8758
88-
59+Selection (Выделение)
8960
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-```
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;`
11172
112-Возвращает количество выполненных замен. При поиске, возвращает 1, если [совпадение] найдено, 0, если [совпадение] не найдено. Если найдено совпадение, [оно] будет выделено (используйте BlockBegin/End).
113-```
114-if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin
115- // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)
116- end;
117-```
73+Search/Replace (Поиск/Замена)
11874
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-```
75+`   function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;`\
76+`   function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;`
13477
135-Clipboard (Буфер обмена)
136-
137-```
138-procedure CopyToClipboard;
139- procedure CutToClipboard;
140- procedure PasteFromClipboard;
141- property CanPaste: Boolean // только для чтения
142-```
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);`
14391
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-```
92+Возвращает количество выполненных замен. При поиске, возвращает 1, если \[совпадение\] найдено, 0, если \[совпадение\] не найдено. Если найдено совпадение, \[оно\] будет выделено (используйте BlockBegin/End).
15593
94+` if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin`\
95+`   // Выделение устанавливается на первое появление FindMe (поиск с позиции каретки)`\
96+` end;`
97+
98+Text (Текст)
99+
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+`                                 );`
111+
112+Clipboard (Буфер обмена)
113+
114+`   procedure CopyToClipboard;`\
115+`   procedure CutToClipboard;`\
116+`   procedure PasteFromClipboard;`\
117+`   property CanPaste: Boolean     // только для чтения`
118+
119+Logical / Physical (Логический / Физический)
120+
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;`
128+
156129## ClipBoard: TClipBoard
157-```
158-property AsText: String;
159-```
160130
131+`   property AsText: String;`
132+
161133# Пример
162134
163-Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
135+Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
164136
165-Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что [выравнивание] будет подогнано независимо от границ слова)
166-```
167-text: string;
168- a: Integer;
169- foo: boolean
170-```
137+Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что \[выравнивание\] будет подогнано независимо от границ слова)
171138
172-Макрос:
139+``` pascal
140+ text: string;
141+ a: Integer;
142+ foo: boolean
173143```
144+
145+Макрос:
146+
147+``` pascal
174148function IsIdent(c: Char): Boolean;
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 = '_');
180- 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;
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);
227199 end;
228-
229- end.
200+ end;
201+ end;
202+
203+end.
230204```
231205
232-
233206См. <http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883> для подсчета элементов массива.
234207
235208---
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).*
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).*

Back to history