Sign in Join
Wiki copytemporary

SynEdit Highlighter/pl: what changed

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

OldNewLine
11Aby uzyskać więcej informacji na temat SynEdit, przejdź do: [[SynEdit/pl|SynEdit]]\
22Zobacz także [[SynEdit Markup/pl|SynEdit Markup]]
33
44------------------------------------------------------------------------
55
66# Zrozumienie podświetlacza składni SynEdit
77
88## SynEdit - zależność od podświetlacza
99
1010**SynEdit do podświetlacza** ma relację **N do 1**.
1111
1212- Jedna instancja Podświetlacza może obsługiwać **N** (wiele) instancji SynEdits
1313- Każdy SynEdit ma tylko jeden podświetlacz
1414- Ale: jeden tekst (bufor tekstu) może mieć wiele podświetlaczy, jeśli jest współdzielony przez kilka SynEdit (każdy SynEdit będzie miał jeden HL, ale wszystkie HL będą działać na tym samym dokumencie)
1515
1616W wyniku tego:
1717
1818- żadna instancja wyróżnienia nie ma (stałego) odniesienia do SynEdit.
1919
2020
2121(Podświwetlacze przechowują jednak listę buforów SynEditTextBuffer, do których są dołączone)
2222
2323- Wszystkie dane dla Podświetlacza są (i muszą być) przechowywane w SynEdit (właściwie w TextBuffer SynEdit (zwanym „Liniami”).
2424
2525Jednakże przed każdym wywołaniem Podświetlacza SynEdit upewnia się, że Highlighter.CurrentLines jest ustawiony na bieżącym wierszu SynEdit. W ten sposób podświetlacz będzie miał dostęp do danych, kiedy tylko zajdzie taka potrzeba. Format przechowywania danych jest określony przez podświetlacz (TSynCustomHighlighter.AttachToLines).
2626
2727## Scanning and Returning Highlight attributes
2828
2929## Skanowanie i zwracanie atrybutów Podświetlacza
3030
3131Oczekuje się, że podświetlacz będzie działał w oparciu o linię / wiersz tekstu.
3232
3333Jeśli jakikolwiek tekst został zmodyfikowany, SynEdit wywoła (TSynCustomHighlighter.ScanFrom / Aktualnie wywołane z TSynEdit.ScanFrom) z zakresem linii. Podświetlacz powinien znać stan poprzedniej linii.
3434
3535Jeśli wymagane są atrybuty podświetlenia, SynEdit zażąda ich również dla każdej linii. SynEdit będzie przeglądać poszczególne tokeny w linii. Obecnie dzieje się to z zagnieżdżonej procedury PaintLines w SynEdit.PaintTextLines. Wywołuje ona TSynCustomHighlighter.StartAtLineIndex, po którym następuje HL.GetTokenEx/HL.GetTokenAttribute tak długo, jak HL.GetEol ma wartość false.
3636
3737Również klasa BaseClass dla danych podświetlacza (zobacz AttachToLines) opiera się na przechowywaniu linii tekstu, a bufor tekstowy (linie) SynEdita konserwuje te dane, aby zapewnić ich synchronizację. To znaczy: za każdym razem, gdy wstawiane lub usuwane są wiersze tekstu, wstawiane lub usuwane są także wpisy z danych podświetlaczy (stąd musi istnieć jeden wpis w każdym wierszu).
3838
3939Zwykle podświetlacze przechowują w tym polu stan końca linii. Jeśli więc podświetlacz będzie działał na linii, będzie kontynuował wprowadzanie stanu z poprzedniej linii.
4040
4141## Zwijanie tekstu
4242
4343Zwijanie tekstu w SynEdit jest obsługiwane przez moduł SynEditFoldedView i SynGutterCodeFolding. Podświetlacze realizujące zwijanie są oparte na TSynCustomFoldHighlighter.
4444
4545Podstawowe informacje dotyczące komunikacji pomiędzy SynEditFoldedView i HL wymagają przechowywania 2 wartości dla każdej linii. (Oczywiście sam podświetlacz może przechowywać więcej informacji):
4646
4747- FoldLevel na końcu linii
4848- Minimalny poziom zwijania napotkany w dowolnym miejscu linii
4949
5050The Foldlevel indicates how many (nested) folds exist. It goes up whenever a fold begins, and down when a fold ends: Poziom zwinięcia wskazuje, ile istnieje (zagnieżdżonych) zwinięć. Podnosi się, gdy zaczyna się zwijanie, i obniża, gdy zwijanie się kończy:
5151
52-`                           EndLvl   MinLvl`\
53-` Procedure a;               1 -      0`\
54-` Begin                      2 --     1 -`\
55-`   b:= 1;                   2 --     2 --`\
56-`   if c > b then begin      3 ---    2 --`\
57-`     c:=b;                  3 ---    3 ---`\
58-`   end else begin           3 ---    2 --`\
59-`     b:=c;                  3 ---    3 ---`\
60-`   end;                     2 --     2 --`\
61-` end;                       0        0  // "end" zamyka zarówno zwinięcie "begin", jak i zwinięcie "procedure"`
52+``` pascal
53+ EndLvl MinLvl
54+ Procedure a; 1 - 0
55+ Begin 2 -- 1 -
56+ b:= 1; 2 -- 2 --
57+ if c > b then begin 3 --- 2 --
58+ c:=b; 3 --- 3 ---
59+ end else begin 3 --- 2 --
60+ b:=c; 3 --- 3 ---
61+ end; 2 -- 2 --
62+ end; 0 0 // "end" zamyka zarówno zwinięcie "begin", jak i zwinięcie "procedure"
63+```
6264
6365W linii
6466
65-` Procedure a;               1 -      0`
67+``` pascal
68+ Procedure a; 1 - 0
69+```
6670
6771MinLvl wynosi 0, ponieważ linia zaczęła się od poziomu 0 (i nigdy nie spadła / nie było żadnych zwinięć). Podobnie we wszystkich wierszach, w których występuje tylko słowo kluczowe otwierające („begin”).
6872
6973Ale w linii
7074
71-`   end else begin           3 ---    2 --`
75+``` pascal
76+ end else begin 3 --- 2 --
77+```
7278
7379zaczyna się od poziomu 3 i na nim również się kończy (jeden zamknięty, drugi otwarty). Ponieważ jednak spadł jako pierwszy, minimalny poziom napotkany w dowolnym miejscu na linii wynosi 2.
7480
7581Bez MinLvl nie byłoby możliwe stwierdzenie, że zwijanie kończy się w tej linii.
7682
7783Nie ma czegoś takiego jak MaxLvl, ponieważ zwijanie rozpoczynające się i kończące na tej samej linii i tak nie mogą zostać zwinięte. Nie ma potrzeby ich wykrywać.
7884
79-` if a then begin b:=1; c:=2; end; // nie ma żadnego zwijania na tej linii`
85+``` pascal
86+ if a then begin b:=1; c:=2; end; // nie ma żadnego zwijania na tej linii
87+```
8088
8189# Tworzenie podświetlacza SynEdit
8290
8391Od wersji 0.9.31 35115 podświetlacz składani uległ zmianie. Wdrażanie podstawowego zwijania jest teraz łatwiejsze.
8492
8593Wszystkie źródła można znaleźć w katalogu instalacyjnym Lazarusa pod adresem:
8694
8795:* Lazarus 2.3 i nowsze: examples\Components\SynEdit\NewHighlighterTutorial
8896
8997:* Lazarus przed 2.2.*: examples\SynEdit\NewHighlighterTutorial\\
9098
9199Projekt HighlighterTutorial zawiera 3 przykładowe podświetlenia różnicowe:
92100
93101:* SimpleHl: użyte w kroku 1 poniżej
94102
95103:* ContextHl: użyte w kroku 2 poniżej
96104
97105:* FoldHl: użyte w kroku 3 poniżej
98106
99107SimpleHl i ContextHl będą działać również z wersją 0.9.30
100108
101109Składany podświetlacz w akcji:
102110
103111![](/wiki-images/a/a2/SynEditFoldingHighlighterDemo.png)
104112
105113## Podstawy: zwracanie tokenów i atrybutów
106114
107115Jak wskazano, moduł **SimpleHl** demonstruje ten proces.
108116
109117### Co to robi
110118
111119- Dzieli każdą linię na słowa i spacje (lub tabulatory)
112120 - Spacje są częścią tekstu i również muszą być wyróżnione
113121- Ten przykład pozwala określić różne kolory dla
114122
115123
116124
117125\- tekst (domyślnie nie jest podświetlony)
118126
119127\- spacje (domyślnie srebrna ramka)
120128
121129\- słowa oddzielone spacjami rozpoczynające się od a,e,i,o,u (domyślnie pogrubione)
122130
123131\- słowo „not” (domyślnie na czerwonym tle)
124132
125133### Jak to działa
126134
127135- Create
128136
129137Podświetlacz tworzy atrybuty, dzięki którym może zwracać słowa i spacje.
130138
131139- SetLine
132140
133141Wywoływane przez SynEdit przed pomalowaniem linii (lub zanim potrzebne będą informacje o podświetleniu)
134142
135143- GetTokenEx, GetTokenAttribute, Next, GetEol
136144
137145Są używane przez SynEdit do iteracji po linii. Zauważ, że pierwszy Token (Słowo lub Spacje) musi być gotowy po SetLine, bez wywołania Next.
138146
139147[[Important:]] Tokeny zwrócone dla każdej linii muszą reprezentować oryginalny tekst linii i zostać zwrócone we właściwej kolejności.
140148
141149- GetToken, GetTokenPos, GetTokenKind
142150
143151SynEdit używa ich np. do wyszukiwania pasujących nawiasów. Jeśli tokenKind zwraca różne wartości dla każdego atrybutu, nawiasy pasują tylko wtedy, gdy są tego samego rodzaju (np. jeśli istnieje atrybut ciągu, nawiasy poza ciągiem nie będą pasować do nawiasów wewnątrz ciągu).
144152
145153### Inne uwagi
146154
147155Aby zapewnić czytelność, podświetlacz nie ma optymalizacji, więc w przypadku większych tekstów może działać bardzo wolno. Wiele dostarczonych podświetlaczy używa funkcji haszujących, aby znaleźć słowo (lub dowolną grupę znaków).
148156
149157## Krok 2: Używanie zakresów
150158
151159Jak wskazano, moduł „ContextHl” demonstruje ten proces
152160
153161Następny przykład pozwala na to, aby zawartość linii wpływała na inne linie następujące po niej. Przykład: znak „(*” w języku Pascal powoduje, że wszystkie kolejne wiersze stają się komentarzem, aż do znalezienia „*)”.
154162
155163Ten przykład rozszerza powyższy przykład **SimpleHl**: Tokeny -- i ++ (muszą być otoczone spacją lub początkiem/końcem linii, aby były samodzielnymi tokenami) przełączają słowa zaczynające się od a,e,i,o,u
156164
157165Można zagnieżdżać wiele ++ i --. Następnie dla każdego -- należy podać ++, zanim słowa zostaną ponownie podświetlone.
158166
159167Następnie rozkładamy skaner. Skanowanie wstępne w celu zapisania informacji wywołuje te same funkcje, co podświetlacz. Jest on wywoływany automatycznie, jeśli coś się zmieni. (Jest wywoływany dla wszystkich linii poniżej zmienionej linii, dopóki linia nie zwróci tej samej wartości zakresu, jaką już miała)
160168
161169Zliczana jest aktualna ilość „--”.
162170
163171``` pascal
164172 FCurRange: Integer;
165173```
166174
167175Ta ilość jest pomniejszana przez każde „++”
168176
169177Do przechowywania informacji używamy:
170178
171179GetRange
172180Wywoływany jest po całkowitym przeskanowaniu linii, aby uzyskać wartość końca linii. Wartość zostanie zapisana.
173181
174182SetRange
175183Wywoływany jest przed przeskanowaniem linii. Ustawia wartość przechowywaną od końca poprzedniego wiersza.
176184
177185ResetRange
178186Wywoływany jest przed przeskanowaniem pierwszej linii (ponieważ nie ma poprzedniej linii).
179187
180188> **Note:** Skanowanie jest wyzwalane przez *każdą* zmianę w linii (każde naciśnięcie klawisza). Skanuje bieżącą linię i wszystkie linie poniżej, aż linia zwróci ten sam zakres, który już miała. Zobacz: <http://forum.lazarus.freepascal.org/index.php/topic,21727.msg139420.html#msg139420>
181189
182190### Ważna uwaga dotycząca zakresów
183191
184192Celem zakresu jest umożliwienie HL rozpoczęcia skanowania w dowolnej linii. HL nigdy nie będzie musiał patrzeć na poprzednią linię. Wszelkie informacje potrzebne do przeskanowania bieżącej linii można uzyskać z wartości zakresów.
185193
186194Przykład:
187195
188196``` pascal
189197 writeln; (*
190198 readln;
191199 *)
192200```
193201
194202podczas skanowania „readln” HL wie z zakresu, że znajduje się w komentarzu, nie musi przeglądać poprzednich linii.
195203
196204Dlatego skanowanie można rozpocząć w dowolnej linii.
197205
198206Wyjaśnia to również uwaga z poprzedniego rozdziału. „dopóki linia nie zwróci tego samego zakresu, który już miała”. Bo nawet jeśli tekst linii nie został zmieniony, jeśli wartość zakresu na początku linii uległa zmianie, to wynik skanowania również się zmieni.
199207
200208## Step 3: Dodanie zwijania
201209
202210Jak wskazano, moduł „FoldHl” demonstruje ten proces
203211
204212Przykładowo, podświetlacz powinien zwijać wszystko pomiędzy wolnostojącymi „-(-”, „-)-”.
205213
206214Zmień dziedziczenie:
207215
208216``` pascal
209217 uses SynEditHighlighterFoldBase;
210218 ...
211219 TSynDemoHl = class(TSynCustomFoldHighlighter)
212220```
213221
214222Zmień sposób przechowywania informacji o zakresie, ponieważ klasa bazowa używa ich do informacji o zwijaniu:
215223
216224``` pascal
217225procedure TSynDemoHl.SetRange(Value: Pointer);
218226begin
219227 inherited;
220228 FCurRange := PtrInt(CodeFoldRange.RangeType);
221229end;
222230
223231procedure TSynDemoHl.ResetRange;
224232begin
225233 inherited;
226234 FCurRange := 0;
227235end;
228236
229237function TSynDemoHl.GetRange: Pointer;
230238begin
231239 CodeFoldRange.RangeType := Pointer(PtrInt(FCurRange));
232240 inherited;
233241end;
234242```
235243
236244Teraz dodaj do skanera kod, który poinformuje podświetlacz o otwieraniu i zamykaniu zwijania:
237245
238246``` pascal
239247procedure TSynDemoHl.FindTokenEnd;
240248begin
241249 ...
242250
243251 if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = '[') then
244252 StartCodeFoldBlock(nil);
245253 if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = ']') then
246254 EndCodeFoldBlock();
247255end;
248256```
249257
250258- **Dla 0.9.30**
251259
252260Proszę zapoznać się z historią tej strony, jeśli używasz wersji 0.9.30 [[http://wiki.lazarus.freepascal.org/index.php?title=SynEdit Highlighter&amp;oldid=76020]]
253261
254262#### Więcej informacji na temat StartCodeFoldBlock / EndCodeFoldBlock
255263
256264``` pascal
257265 function StartCodeFoldBlock(ABlockType: Pointer; IncreaseLevel: Boolean = true): TSynCustomCodeFoldBlock; virtual;
258266```
259267
260268ABlockType
261269Można go użyć do określenia identyfikatora bloku.\
262270
263271Pole to nie jest zwykle używane jako wskaźnik (choć jest to dozwolone). Zwykle identyfikatory są typem wyliczeniowym.\
264272Jeśli masz różne typy bloków (np. w Pascalu: begin/end; repeat/until, ...) i nie chcesz, aby blok został zamknięty niewłaściwym słowem kluczowym („end” nie powinien zamykać „repeat”), to możesz nadać im identyfikatory:\
265273StartCodeFoldBlock(PtrUInt(1)) // lub inne liczby\
266274
267275IncreaseLevel
268276Jeśli ustawione na False, zostanie wstawiony blok, którego nie można zwinąć.\
269277Takie bloki można wykorzystać do wewnętrznego śledzenia.
270278
271279UWAGA: Wszystkie zwijania muszą być zagnieżdżone, nie mogą zachodzić na siebie. Oznacza to, że ostatnia otwarta zakładka musi być najpierw zamknięta.\
272280Odnosi się to do „EndLvl”, jak pokazano w „Składaniu” (1.3) powyżej\
273281Nakładanie się (jak "IFDEF" i "begin" w IDE) nie może być wykonane w ten sposób.
274282
275283``` pascal
276284 procedure EndCodeFoldBlock(DecreaseLevel: Boolean = True); virtual;
277285```
278286
279287DecreaseLevel
280288To *musi* odpowiadać IncreaseLevel, tak jak zostało to podane w StartCodeFoldBlock\
281289
282290True oznacza zakończenie zwijania; False oznacza, że ​​blok wewnętrzny został zakończony. W przypadku niedopasowania zawijanie będzie kontynuowane lub zakończy się wcześniej.\
283291TopCodeFoldBlockType może służyć do wskazania identyfikatora najbardziej wewnętrznego otwartego bloku. Można używać różnych identyfikatorów dla bloków wewnętrznych i używać ich do ustawiania wartości.
284292
285293``` pascal
286294 function TopCodeFoldBlockType(DownIndex: Integer = 0): Pointer;
287295```
288296
289297Returns the ID of the innermost block.
290298
291299DownIndex
292300może zostać użyty do uzyskania identyfikatora drugiego bloku.
293301
294302DownIndex=1 oznacza blok otaczający najbardziej wewnętrzny.
295303
296304# Konfigurowalne podświetlacze (w tym produkty innych firm)
297305
298306## SynAnySyn
299307
300308Naprawdę prosty podświetlacz. Bardziej referencyjna implementacja niż prawdziwy, użyteczny zakreślacz.
301309
302310## SynUniHighlighter
303311
304312Używa plików konfiguracyjnych opartych na formacie XML. [stary oficjalny link](http://web.archive.org/web/20090610040212/http://www.delphist.com:80/UniHighlighter.html)
305313
306314## SynFacilSyn
307315
308316Elastyczny, w pełni konfigurowalny podświetlacz. <https://github.com/t-edson/SynFacilSyn>
309317
310318# Bibliografia
311319
312320Wątki na forum:
313321
314322- „Tworzenie podświetlacza dla składni C” [[http://www.lazarus.freepascal.org/index.php/topic,10260.0.html temat,10260]]
315323- „Tworzenie podświetlacza składni” [[http://www.lazarus.freepascal.org/index.php/topic,10959.msg54714 temat,10959.msg54714]]
316324- uzyskanie podświetlenia do druku [[http://www.lazarus.freepascal.org/index.php/topic,11384.msg57160.html|http://www.lazarus.freepascal.org/index.php/topic,11384.msg57160.html#msg57160 11384.msg57160]]
317325- Kilka szczegółów na temat zakresów i używania obiektów do przechowywania większej ilości informacji [[http://forum.lazarus.freepascal.org/index.php/topic,21727.msg139354.html|http://forum.lazarus.freepascal.org/index.php/topic,21727.msg139354.html#msg139354 temat,21727.msg139354]] i [[http://forum.lazarus.freepascal.org/index.php/topic,21727.msg139419.html|http://forum.lazarus.freepascal.org/index.php/topic,21727.msg139419.html#msg139419 temat,21727.msg139419]]
318326- Więcej o zakresach, kopii roboczej wobec niezmiennych, składanych bloków... [[http://forum.lazarus.freepascal.org/index.php/topic,30685.msg195464.html|http://forum.lazarus.freepascal.org/index.php/topic,30685.msg195464.html#msg195464 http://forum.lazarus.freepascal.org/index.php/topic,30685]]
319327- Oznacz (podświetl) wszystkie wystąpienia tokena (lub wyrażenia regularnego) [[http://forum.lazarus.freepascal.org/index.php?topic=26833 temat=26833]]
320328- Informacje o znacznikach i zwijaniu: [[http://forum.lazarus.freepascal.org/index.php?topic=30122]]
321329- Jak dokonać unieważnienia w TSynEditMarkup [[http://forum.lazarus.freepascal.org/index.php/topic,30122.msg207931.html|http://forum.lazarus.freepascal.org/index.php/topic,30122.msg207931.html#msg207931]]
322330
323331- Zwijanie
324332 - „SynEdit - ulepszone podœietlacze do obsługi zwijania kodu?” [[http://www.lazarus.freepascal.org/index.php/topic,7879.0.html temat,7879]]
325333 - „SynEdit - Dodaj zwijanie kodu pomocniczego dla Java” [[http://www.lazarus.freepascal.org/index.php/topic,7338.0.html temat,7338]]
326334 - „CodeFolding” Konfiguracja [[http://www.lazarus.freepascal.org/index.php/topic,11064 temat,11064]]
327335 - Zwijane bloki, ałowo kluczowe „end” (koniec w linii przed następnym słowem kluczowym) [[http://forum.lazarus.freepascal.org/index.php/topic,23411.msg139621.html|http://forum.lazarus.freepascal.org/index.php/topic,23411.msg139621.html#msg139621 temat,23411.msg139621]]
328336 - Zwijanie wybranego tekstu z kodu (kod użytkownika/aplikacji): [[http://forum.lazarus.freepascal.org/index.php/topic,24473.msg147312.html|http://forum.lazarus.freepascal.org/index.php/topic,24473.msg147312.html#msg147312 24473.msg147312]]
329337 - Uzyskanie stanu zwiniętego (zapisz stan złożenia w sesji) [[http://forum.lazarus.freepascal.org/index.php?topic=26748 temat=26748]]
330338
331339---
332340*From the Free Pascal wiki, page "SynEdit Highlighter/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).*
333341Category: SynEdit

Back to history