Sign in Join
Wiki copytemporary

Editor Macros PascalScript/ru: what changed

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

Title: Editor Macros PascalScript/ru

OldNewLine
1+# Общее
2+
3+Макросы [[PascalScript]] доступны в Lazarus 1.1 и более поздних версиях. Чтобы использовать эту функцию, вам необходимо установить пакет EditorMacroScript, который включает пакет [[Pascal Script/ru|Pascal Script]]. Pascal Script предоставляется объектами REM. Минимальный пакет предоставляется дистрибутивом Lazarus 1.1.
4+
5+См. также [[IDE Window: Editor Macros/ru|IDE_Window:_Editor_Macros]]
6+
7+# Доступность
8+
9+Эта функциональность доступна только на определенных платформах/архитектурах:
10+
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
18+
19+# Простые действия
20+
21+Все простые действия с клавиатурой представлены следующим образом:
22+
23+ecLeft;
24+Перемещает каретку \[на один символ\] влево (в редакторе, который вызвал макрос)
25+
26+ecChar('a');
27+Вставляет \[символ\] 'a'
28+
29+См. модуль SynEditKeyCmds в пакете [[SynEdit/ru|SynEdit]] и IDECommands в IDEIntf для \[получения\] полного списка. Или используйте Recorder для получения имен действий.
30+
31+# Функции
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');`
40+
41+# Представление объектов
42+
43+Сценарии могут ссылаться на вызывающий SynEdit через идентификатор "Caller".
44+
45+## Caller: TSynEdit
46+
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);`
91+
92+Возвращает количество выполненных замен. При поиске, возвращает 1, если \[совпадение\] найдено, 0, если \[совпадение\] не найдено. Если найдено совпадение, \[оно\] будет выделено (используйте BlockBegin/End).
93+
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+
129+## ClipBoard: TClipBoard
130+
131+`   property AsText: String;`
132+
133+# Пример
134+
135+Макрос, показанный ниже, выравнивает выбранный код к определенному токену. Он ищет определенный токен в каждой выбранной строке и выравнивает каждое его появление.
136+
137+Выберите 3 строки. Если выделение начинается прямо перед ":", тогда символ ":" будет обнаружен. В подсказке будет предложено подтвердить ":". Затем все ":" будут выровнены. (Если вы используете слово для выравнивания, обратите внимание, что \[выравнивание\] будет подогнано независимо от границ слова)
138+
139+``` pascal
140+ text: string;
141+ a: Integer;
142+ foo: boolean
143+```
144+
145+Макрос:
146+
147+``` pascal
148+function 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;
200+ end;
201+ end;
202+
203+end.
204+```
205+
206+См. <http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883> для подсчета элементов массива.
207+
208+---
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