Sign in Join
Wiki copytemporary

SynEdit/pl: what changed

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

Title: SynEdit/pl

OldNewLine
1+**SynEdit** to pakiet edycji/notatek z [[Syntax highlighting/pl|podświetlaniem składni]] dostępny na [[SynEdit tab/pl|karcie SynEdit]] obsługujący wiele języków/składni.
2+
3+SynEdit zawarty w Lazarusie został utworzony na bazie [SynEdit 1.0.3](http://synedit.sourceforge.net/), i został w dużym stopniu zaadaptowany i rozszerzony. Zmiany są wymienione poniżej.
4+
5+Pakiet Lazarus zawiera komponent edytora źródeł o nazwie [[TSynEdit/pl|TSynEdit]], kilka podświetlaczy składni i inne komponenty używane do edycji źródeł.
6+
7+Licencjonowany na tych samych warunkach, co oryginalny SynEdit (MPL lub GPL).
8+
9+## Wersja oryginalna a Lazarus
10+
11+Wersją dla Lazarus opiekuje się głównie Martin Friebe. Martin napisał na forum, co zostało dodane do wersji Lazarusa od czasu pojawienia się tego forka:
12+
13+Duże rzeczy dodane do wersji Lazarus:
14+
15+- zwijanie bloków kodu
16+- konfigurowalny boczny margines i jego części (tzw. rynna)
17+- wspólny tekst pomiędzy kilkoma redaktorami
18+- obsługa kodowania utf-8
19+- wtyczka do edycji synchronizacji
20+- podstawowa obsługa RTL/LTR
21+- konfiguracja myszy za pomocą MouseActions
22+- przepisano różne moduły podświetlania/oznaczeń składni
23+
24+Bazy kodu wersji Delphi/Lazarus zostały niezależnie przeprojektowane. Pozostało bardzo niewiele do zrobienia.
25+
26+## Port SynEdit 2.0
27+
28+Istnieje alternatywny port wersji 2.0.x oryginalnego SynEdit. Nie jest aktywnie utrzymywany, ostatnie zatwierdzenie (obecnie jest marzec 2024) miało miejsce w 2023 roku, ale od 2011 roku ma on wersję 2.0.5.
29+
30+- [[SynEdit/port]]
31+- [Github](https://github.com/rnapoles/strona)
32+
33+## SynEdit w IDE
34+
35+SynEdit w Lazarusie jest pakietem wbudowanym, ponieważ samo IDE używa go do edycji kodów źródłowych. Z tego powodu nie można usunąć tego pakietu z listy instalacyjnej. Natomiast aby usunąć SynEdit z palety komponentów, można usunąć pakiet SynEditDsgn z instalacji.
36+
37+## Używanie SynEdit
38+
39+### Podświetlacze składni
40+
41+- Istnieje kilka standardowych poświetlaczy składni (zobacz [[SynEdit tab/pl|karta SynEdit]] w [[Component Palette|palecie komponentów]])
42+- Istnieją podświetlacze skryptowe, które można dostosować do wielu innych formatów plików:
43+ - [[TSynAnySyn]] (standardowy, jest domyślnie na palecie komponentów)
44+ - [[TSynPositionHighlighter]] (standardowy, **nie** jest obecny palecie komponentów)
45+ - [[TSynUniHighlighter]] (standardowy, **nie** jest obecny na palecie komponentów)
46+ - SynFacilSyn ([Github](https://github.com/t-edson/SynFacilSyn))
47+- Istnieje więcej podświetlaczy innych firm: SynCacheSyn, SynGeneralSyn, SynRCSyn, SynRubySyn, SynSDDSyn, SynSMLSyn, SynSTSyn, SynTclTkSyn, SynUnrealSyn, SynURISyn, SynVBScriptSyn, SynVrml97Syn, [Spójrz tutaj](http://bugs.freepascal.org/view.php?id=18248).
48+- Możesz napisać nowy podświetlacz, zobacz informacje na [[SynEdit Highlighter/pl|SynEdit Highlighter]].
49+
50+### Znaczniki
51+
52+Znaczniki umożliwiają dodatkowe kolorowanie [[SynEdit Markup]]
53+
54+### Oznaczenia
55+
56+Znaczniki zapewniają dodatkowe kolorowanie
57+
58+### Edycja istniejącego podświetlacza
59+
60+Czasami możesz chcieć edytować istniejące podświetlacze składni (tak jak chciałem to zrobić kilka dni temu), które już istnieją. W tym przykładzie będziemy edytować podświetlacz dla kodu pascala (nazwa klasy: [[TSynPasSyn]]; pakiet: SynEdit V1.0; moduł: SynHighlighterPas.pas).
61+
62+Powiedzmy, że chcemy osiągnąć to, aby nasza aplikacja (w tym przypadku Lazarus) rozróżniał trzy typy komentarzy, które istnieją w Pascalu:
63+
64+``` pascal
65+ (* standardowe *)
66+ { klamry }
67+ // ukośniki
68+```
69+
70+Może to być pomocne, jeśli chcesz rozróżnić różne typy swoich komentarzy (np. „Opis”, „Notatka”, „Referencja” itp.) i chcesz, aby każdy wyróżniony był innym kolorem.
71+
72+> **Note:** Na wypadek, gdybyś coś zepsuł, sugeruję dodanie kilku komentarzy „NEW” i „/NEW”, ale nie jest to konieczne
73+
74+- Najpierw otwórz moduł „SynHighlighterPas”, który powinien znajdować się w katalogu SynEdit.
75+- Ponieważ nie chcemy powodować niezgodności, tworzymy nowy rodzaj typu wyliczającego, który pomoże nam później zidentyfikować nasz komentarz:
76+
77+Np. pod deklaracją „tkTokenKind” napisz:
78+
79+``` pascal
80+ {NEW}
81+ TtckCommentKind = (tckAnsi, tckBor, tckSlash);
82+ {/NEW}
83+```
84+
85+- W deklaracji „TSynPasSyn” wyszukaj „FTokenID” i dodaj pomiędzy „FTokenID” a następnym polem
86+
87+``` pascal
88+ {NEW}
89+ FCommentID: TtckCommentKind;
90+ {/NEW}
91+ //Tworzy to nowe pole, w którym możemy zapisać informację, jakiego rodzaju mamy komentarz
92+```
93+
94+- W deklaracji „TSynPasSyn” wyszukaj „fCommentAttri” i dodaj następujący tekst między „fCommentAttri” a następnym polem
95+
96+``` pascal
97+ {NEW}
98+ fCommentAttri_Ansi: TSynHighlighterAttributes;
99+ fCommentAttri_Bor: TSynHighlighterAttributes;
100+ fCommentAttri_Slash: TSynHighlighterAttributes;
101+ {/NEW}
102+ //Dzięki temu możemy zwrócić różne atrybuty dla każdego typu komentarza
103+```
104+
105+- Następnie wyszukaj definicję konstruktora „TSynPasSyn”, która powinna brzmieć „constructor TSynPasSyn.Create(AOwner: TComponent);”.
106+- Musimy utworzyć nasze nowe atrybuty, dlatego dodajemy nasze atrybuty gdzieś w konstruktorze (sugeruję po domyślnym „fCommentAttri”)
107+
108+``` pascal
109+ (...)
110+ AddAttribute(fCommentAttri);
111+ {NEW}
112+ fCommentAttri_Ansi := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Ansi', SYNS_XML_AttrComment+'_Ansi'); //Ostatnie dwa ciągi to podpis i przechowywana nazwa
113+ //Jeśli chcesz mieć domyślne ustawienia swojego atrybutu, możesz np. dodać to:
114+ //fCommentAttri_Ansi.Background := clBlack; //Ustawiłoby to „Tło” na „clBlack” jako domyślne
115+ AddAttribute(fCommentAttri_Ansi);
116+ fCommentAttri_Bor := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Bor', SYNS_XML_AttrComment+'_Bor');
117+ AddAttribute(fCommentAttri_Bor);
118+ fCommentAttri_Slash := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Slash', SYNS_XML_AttrComment+'_Slash');
119+ AddAttribute(fCommentAttri_Slash);
120+ {/NEW}
121+ (...)
122+```
123+
124+- Bardziej skomplikowane działanie polega teraz na wyszukaniu miejsc, w których „FTokenID” jest ustawione na „tkComment” i jednocześnie obsługuje nasz „podtyp” (oczywiście już je dla Ciebie znalazłem :)
125+
126+``` pascal
127+procedure TSynPasSyn.BorProc;
128+(...)
129+ fTokenID := tkComment;
130+ {NEW}
131+ FCommentID:=tckBor;
132+ {/NEW}
133+ if rsIDEDirective in fRange then
134+(...)
135+```
136+
137+``` pascal
138+procedure TSynPasSyn.AnsiProc;
139+begin
140+ fTokenID := tkComment;
141+ {NEW}
142+ FCommentID:=tckAnsi;
143+ {/NEW}
144+(...)
145+```
146+
147+``` pascal
148+procedure TSynPasSyn.RoundOpenProc;
149+(...)
150+ fTokenID := tkComment;
151+ {NEW}
152+ FCommentID:=tckAnsi;
153+ {/NEW}
154+ fStringLen := 2; // długość "(*"
155+(...)
156+```
157+
158+``` pascal
159+procedure TSynPasSyn.SlashProc;
160+begin
161+ if fLine[Run+1] = '/' then begin
162+ fTokenID := tkComment;
163+ {NEW}
164+ FCommentID:=tckSlash;
165+ {/NEW}
166+ if FAtLineStart then begin
167+(...)
168+```
169+
170+``` pascal
171+procedure TSynPasSyn.SlashContinueProc;
172+(...)
173+ fTokenID := tkComment;
174+ {NEW}
175+ FCommentID:=tckSlash;
176+ {/NEW}
177+ while not(fLine[Run] in [#0, #10, #13]) do
178+(...)
179+```
180+
181+- Teraz musimy tylko pobrać informacje po wywołaniu „GetTokenAttribute” i zwrócić właściwy atrybut, dlatego edytujemy „GetTokenAttribute” w następujący sposób:
182+
183+``` pascal
184+function TSynPasSyn.GetTokenAttribute: TSynHighlighterAttributes;
185+begin
186+ case GetTokenID of
187+ tkAsm: Result := fAsmAttri;
188+ {OLD
189+ tkComment: Result := fCommentAttri; //To jest komentarz i stanowi kopię zapasową, więc zostanie zignorowany
190+ /OLD}
191+ {NEW}
192+ tkComment: begin
193+ if (FCommentID = tckAnsi) then
194+ Result := fCommentAttri_Ansi //To jest typ standardowy AnsiComment
195+ else
196+ if (FCommentID = tckBor) then
197+ Result := fCommentAttri_Bor //To jest typ klamrowy BorComment
198+ else
199+ if (FCommentID = tckSlash) then
200+ Result := fCommentAttri_Slash //To jest typ ukośnikowy SlashComment
201+ else
202+ Result := fCommentAttri //Jeśli nasz kod w jakiś sposób zawiódł, przywróć ustawienia domyślne
203+ end;
204+ {/NEW}
205+ tkIDEDirective: begin
206+(...)
207+```
208+
209+Jeśli używasz lazarusa, po prostu zainstaluj ponownie pakiet SynEdit, jeśli nie, przekompiluj swój projekt/pakiet.
210+
211+**GOTOWE ! Mówię poważnie! Twój kod jest teraz gotowy na rozróżnianie różnych typów komentarzy.**
212+
213+Lazarus-IDE automatycznie wykrywa, jakie atrybuty istnieją i pokazuje je w opcjach, na przykład zapisuje je, jeśli je zmienisz. Jeśli Twoja aplikacja/IDE tego nie robi, będziesz musiał ustawić Kolor/Czcionkę/itp. nowych atrybutów gdzieś ręcznie (np. w konstruktorze TSynPasSyn)
214+
215+### Realizacja wtyczek
216+
217+Istnieją 3 wtyczki uzupełniające dla SynEdit:
218+
219+[[TSynCompletion]]
220+
221+- Oferuje listę słów w rozwijanym menu za pomocą kombinacji klawiszy skrótu (domyślnie: Ctrl-Spacja).
222+- Używane w IDE do uzupełniania identyfikatora.
223+- Zawarte w przykładach.
224+- Dostępne na palecie komponentów (od wersji 0.9.3x).
225+
226+Przykładowy kod wywołujący programowo wyskakujące okienko uzupełniania (tj. bez naciskania skrótu klawiaturowego):
227+
228+``` pascal
229+YourSynEdit.CommandProcessor(YourSynCompletion.ExecCommandID, '', nil)
230+```
231+
232+[[TSynAutoComplete]]
233+
234+- Zastępuje bieżący token fragmentem tekstu. **Nie** jest to interaktywne. **Nie** posiada menu rozwijanego.
235+- Zawarte w przykładach.
236+- Dostępne na palecie komponentów.
237+
238+[[TSynEditAutoComplete]]
239+
240+- Podstawowy moduł szablonów. **Nie** posiada menu rozwijanego.
241+- Używany przez IDE do szablonów kodu. IDE zawiera dodatkowy kod rozszerzający tę funkcję (rozwijane i synchronizujące makra dodawane są przez IDE).
242+- **Nie** ujęte w przykładach.
243+
244+Todo: Należy udokumentować różnice pomiędzy 2. i 3. poziomem. Może uda się je połączyć.
245+
246+### Logiczna/fizyczna pozycja karetki
247+
248+SynEdit oferuje położenie karetki (migającego kursora tekstowego) w 2 różnych formach:
249+
250+- Fizyczne X/Y: Odpowiada pozycji wizualnej (na płótnie) karetki,
251+- Logiczne X/Y: Odpowiada przesunięciu bajtów tekstu.
252+
253+Obydwa są oparte na 1. Obecnie współrzędne Y są zawsze takie same. To może się zmienić w przyszłości.
254+
255+Współrzędna fizyczna
256+To pozycja w siatce wyświetlania (pomijająca przewijanie). Przy czym:
257+
258+litera „a” i „â” zajmują JEDNĄ komórkę w siatce, zwiększając fizyczne x o 1. Mimo że w utf8 kodowanie „a” zajmuje jeden bajt, a „â” zajmuje kilka bajtów.
259+
260+jednakże znak tabulacji (#9), poza tym, że jest tylko jednym bajtem i jednym znakiem, może zająć kilka komórek w siatce, zwiększając fizyczne x o więcej niż jeden. Istnieją również znaki w językach chińskim i wschodnim, które zajmują 2 pozycje siatki (znak Google o pełnej szerokości i o połowie szerokości)
261+
262+Współrzędna logiczna
263+To przesunięcie bajtu w ciągu znaków przechowującym linię.
264+
265+litera „a” ma 1 bajt i zwiększa się o 1
266+
267+litera „â” ma 2 (lub 3) bajty i zwiększa się o tą wartość
268+
269+tab ma 1 bajt i zwiększa się o 1.
270+
271+Żaden z tych współrzędnych nie podaje pozycji w znakach/punktach kodowych UTF8 (tak jak np. Utf8Copy czy Utf8Length).
272+
273+Fizyczna współrzędna X jest zawsze liczona od lewej strony tekstu, nawet jeśli jest on przewijany. Aby uzyskać grid-x aktualnie przewijanej kontrolki, wykonaj:
274+
275+
276+grid-X-in-visible-part-of-synedit := PhysicalX - SynEdit.LeftChar + 1
277+
278+grid-y-in-visible-part-of-synedit := SynEdit.RowToScreenRow(PhysicalY); // obejmuje zwijanie bloków
279+
280+użyj ScreenRowToRow do odwrotnych wyliczeń
281+
282+### Zmiana tekstu za pomocą kodu
283+
284+> **Warning:** Zmiana tekstu za pomocą właściwości <u>SynEdit.Lines</u> <u>nie działa w przypadku funkcji cofnij/ponów. </u>
285+
286+Dostęp do tekstu można uzyskać za pośrednictwem SynEdit.Lines. Jest to właściwość oparta na TStrings oferująca dostęp do odczytu/zapisu dla każdej linii. Pierwszy wiersz ma index 0.
287+
288+``` pascal
289+ SynEdit.Lines[0] := 'Text'; // pierwsza line
290+```
291+
292+Za pomocą SynEdit.Lines można ustawić początkową wersję tekstu (np. wczytaną z pliku). Należy pamiętać, że SynEdit.Lines.Add/SynEdit.Lines.Append nie obsługuje podziału wierszy wewnątrz dodanych ciągów. Należy dodawać linie jedna po drugiej.
293+
294+Aby zmodyfikować zawartość SynEdit i pozwolić użytkownikowi na cofnięcie akcji, użyj następujących metod:
295+
296+``` pascal
297+ procedure InsertTextAtCaret(aText: String; aCaretMode: TSynCaretAdjustMode = scamEnd);
298+ property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String // Logiczna pozycja
299+ read GetTextBetweenPoints write SetTextBetweenPointsSimple;
300+ property TextBetweenPointsEx[aStartPoint, aEndPoint: TPoint; CaretMode: TSynCaretAdjustMode]: String
301+ write SetTextBetweenPointsEx;
302+ procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint;
303+ const AValue: String;
304+ aFlags: TSynEditTextFlags = [];
305+ aCaretMode: TSynCaretAdjustMode = scamIgnore;
306+ aMarksMode: TSynMarksAdjustMode = smaMoveUp;
307+ aSelectionMode: TSynSelectionMode = smNormal );
308+```
309+
310+Examples:
311+
312+``` pascal
313+ // Wstaw tekst w miejscu karetki
314+ SynEdit.InsertTextAtCaret('Tekst');
315+ // Zamień tekst od punktu (x=2,y=10) do punktu (x=4,y=20) na Str
316+ SynEdit.TextBetweenPoints[Point(2,10), Point(4,20)] := Str;
317+```
318+
319+``` pascal
320+ // Usuń/zamień pojedynczy znak w pozycji karetki
321+ var
322+ p1, p2: TPoint;
323+ begin
324+ p1 := SynEdit.LogicalCaretXY;
325+ p2 := p1;
326+ // Oblicz pozycję bajtu następnego znaku
327+ p2.x := p2.x + UTF8CharacterLength(@SynEdit.LineText[p2.x]);
328+ // p1 wskazuje pierwszy bajt znaku, który ma zostać zastąpiony
329+ // p2 wskazuje pierwszy bajt znaku po ostatnim znaku, który można zastąpić
330+ // Zamień na „Tekst” (lub użyj pustego ciągu, aby usunąć)
331+ SynEdit.TextBetweenPoints[p1, p2] := 'Tekst';
332+```
333+
334+### Zwiń/rozwiń za pomocą kodu
335+
336+- To jest wciąż w budowie.
337+- Działa to tylko wtedy, gdy bieżący poddświetlacz składni obsługuje zwijanie kodu (szczegóły w [[SynEdit Highlighter]]).
338+- Należy również pamiętać, że niektóre podświetlacze obsługują kilka niezależnych drzew zwijania. Np. w Pascalu możesz zwinąć słowa kluczowe (begin, end, class, procedura itp.), które jest głównym zwijaniem, ale możesz zwinąć też \$ifdef lub \$region, które jest zwijaniem drugorzędnym.
339+- Zwijanie bieżącego zaznaczenia różni się także od zwijania słów kluczowych.
340+
341+Metody zwijania kodu:
342+
343+1\) TSynEdit.CodeFoldAction
344+
345+Pasuje na podanej linii. Jeśli jest więcej niż jeden, zwija najbardziej do środka (najbardziej po prawej). Uwaga: to nie działa w przypadku zaznaczania ani w przypadku zakładek, które całkowicie się ukrywają / Wymagają przetestowania dla innych operacji zwijania.
346+
347+2\) TSynEdit.FindNextUnfoldedLine
348+
349+3\) TSynEdit.FoldAll / TSynEdit.UnfoldAll
350+
351+### Zakładki
352+
353+- [Temat na forum dotyczący dodawania znaków marginesu (rynny) i kolorowych linii](http://forum.lazarus.freepascal.org/index.php/topic,14948.msg79794.html)
354+
355+### Więcej informacji
356+
357+Dyskusje na forum, które zawierają informacje o SynEdit:
358+
359+- [Wyszukaj/zamień; wstawka korektorska; pozycja logiczna/fizyczna](http://forum.lazarus.freepascal.org/index.php/topic,19520.msg111158.html#msg111158)
360+- [Różnica między SynEdit/SynMemo](http://forum.lazarus.freepascal.org/index.php/topic,19645.msg111962.html#msg111962)
361+- [Działania myszy; wyłącz wklejanie środkowym kliknięciem](http://forum.lazarus.freepascal.org/index.php/topic,23997.msg144100.html#msg144100)
362+- [Informacje o TSynEditMarkup](http://forum.lazarus.freepascal.org/index.php?topic=24842)
363+
364+### Przykładowe aplikacje
365+
366+Przykładowe zastosowania znajdziesz w folderze "lazarus/examples/synedit".
367+
368+### Dodawanie skrótów klawiszowych do wycinania/kopiowania/wklejania/itp
369+
370+Skróty klawiszowe można wdrożyć za pomocą poleceń SynEdit.
371+
372+``` pascal
373+uses
374+ SynEdit, SynEditKeyCmds;
375+
376+procedure TForm1.SynEdit1KeyDown(Sender: TObject; var Key: Word;
377+ Shift: TShiftState);
378+begin
379+ if (Shift = [ssCtrl]) then
380+ case Key of
381+ VK_C: SynEdit1.CommandProcessor(TSynEditorCommand(ecCopy), ' ', nil);
382+ VK_V: SynEdit1.CommandProcessor(TSynEditorCommand(ecPaste), ' ', nil);
383+ VK_X: SynEdit1.CommandProcessor(TSynEditorCommand(ecCut), ' ', nil);
384+ end;
385+end;
386+```
387+
388+## Dalszy rozwój, dyskusje
389+
390+- RTL (od prawej do lewej): rozpoczęty przez Mazena (częściowo zaimplementowany w systemie Windows)
391+- SynEdit używa tylko UTF8; wersja ASCII/ANSI już nie istnieje. Czcionka jest wstępnie wybrana w zależności od systemu. Użytkownik może wybrać inną czcionkę, ale musi wtedy wybrać czcionkę o stałej szerokości.
392+ - automatyczny wybór czcionki o stałej szerokości: W tej chwili SynEdit zaczyna od czcionki „courier”. W tej chwili LCL TFont nie udostępnia właściwości umożliwiającej filtrowanie czcionek o stałej szerokości.
393+ - automatyczny wybór czcionki UTF-8: To samo co powyżej o stałej szerokości, ale także z czcionką UTF-8, tak aby np. umlauty były wyświetlane poprawnie.
394+- Martwe klucze. Większość klawiatur obsługuje wpisywanie dwóch lub więcej klawiszy w celu utworzenia jednego znaku specjalnego (takiego jak znaki akcentowane lub umlaut). (Jest to obsługiwane przez zestaw widżetów LCL)
395+- [[Redesign of the SynEdit component|Przeprojektowanie komponentu SynEdit]]. Podstawowym celem jest bardziej niezawodne wyświetlanie i nawigacja w tekście. Bardziej modułowe podejście pozwala również na lepszą integrację rozszerzeń i wyspecjalizowanych elementów sterujących do użytku poza Lazarusem.
396+- [Zawijanie słów](http://bugs.freepascal.org/view.php?id=30395). Jest to eksperymentalna implementacja oparta na idei klas TextTrimmer/TabExpansion. Powiązany problem z bugtrakerem zawiera klasę i wyjaśnienie zmian wymaganych w innych plikach, aby działał.
397+- Haki w przetwarzaniu kluczy/poleceń SynEdit. Na forum: <http://forum.lazarus-ide.org/index.php/topic,35592.msg243316.html#msg243316>
398+
399+## Zobacz także
400+
401+- [[SynEdit Highlighter/pl|Podświetlacz SynEdit]]
402+- [„Edytuj istniejący podświetlacz”: niemiecki wątek na forum pod adresem „lazarusforum.de”](http://www.lazarusforum.de/viewtopic.php?f=5&t=8723)
403+- [[ATSynEdit]]
404+
405+---
406+*From the Free Pascal wiki, page "SynEdit/pl", as it stood on 2024-03-12 after a change by Slawek, 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).*
407+Category: Components
408+Category: Lazarus
409+Category: SynEdit

Back to history