Sign in Join
Wiki copytemporary

SynEdit Highlighter/pl: what changed

Revision 1 to 2. 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
5252`                           EndLvl   MinLvl`\
5353` Procedure a;               1 -      0`\
5454` Begin                      2 --     1 -`\
5555`   b:= 1;                   2 --     2 --`\
5656`   if c > b then begin      3 ---    2 --`\
5757`     c:=b;                  3 ---    3 ---`\
5858`   end else begin           3 ---    2 --`\
5959`     b:=c;                  3 ---    3 ---`\
6060`   end;                     2 --     2 --`\
6161` end;                       0        0  // "end" zamyka zarówno zwinięcie "begin", jak i zwinięcie "procedure"`
6262
6363W linii
6464
6565` Procedure a;               1 -      0`
6666
6767MinLvl 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”).
6868
6969Ale w linii
7070
7171`   end else begin           3 ---    2 --`
7272
7373zaczyna 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.
7474
7575Bez MinLvl nie byłoby możliwe stwierdzenie, że zwijanie kończy się w tej linii.
7676
7777Nie 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ć.
7878
7979` if a then begin b:=1; c:=2; end; // nie ma żadnego zwijania na tej linii`
8080
8181# Tworzenie podświetlacza SynEdit
8282
8383Od wersji 0.9.31 35115 podświetlacz składani uległ zmianie. Wdrażanie podstawowego zwijania jest teraz łatwiejsze.
8484
8585Wszystkie źródła można znaleźć w katalogu instalacyjnym Lazarusa pod adresem:
8686
8787:* Lazarus 2.3 i nowsze: examples\Components\SynEdit\NewHighlighterTutorial
8888
8989:* Lazarus przed 2.2.*: examples\SynEdit\NewHighlighterTutorial\\
9090
9191Projekt HighlighterTutorial zawiera 3 przykładowe podświetlenia różnicowe:
9292
9393:* SimpleHl: użyte w kroku 1 poniżej
9494
9595:* ContextHl: użyte w kroku 2 poniżej
9696
9797:* FoldHl: użyte w kroku 3 poniżej
9898
9999SimpleHl i ContextHl będą działać również z wersją 0.9.30
100100
101101Składany podświetlacz w akcji:
102102
103-<figure>
104-<img src="SynEditFoldingHighlighterDemo.png" title="SynEditFoldingHighlighterDemo.png" />
105-<figcaption>SynEditFoldingHighlighterDemo.png</figcaption>
106-</figure>
103+![](/wiki-images/a/a2/SynEditFoldingHighlighterDemo.png)
107104
108105## Podstawy: zwracanie tokenów i atrybutów
109106
110107Jak wskazano, moduł **SimpleHl** demonstruje ten proces.
111108
112109### Co to robi
113110
114111- Dzieli każdą linię na słowa i spacje (lub tabulatory)
115112 - Spacje są częścią tekstu i również muszą być wyróżnione
116113- Ten przykład pozwala określić różne kolory dla
117114
118115
119116
120117\- tekst (domyślnie nie jest podświetlony)
121118
122119\- spacje (domyślnie srebrna ramka)
123120
124121\- słowa oddzielone spacjami rozpoczynające się od a,e,i,o,u (domyślnie pogrubione)
125122
126123\- słowo „not” (domyślnie na czerwonym tle)
127124
128125### Jak to działa
129126
130127- Create
131128
132129Podświetlacz tworzy atrybuty, dzięki którym może zwracać słowa i spacje.
133130
134131- SetLine
135132
136133Wywoływane przez SynEdit przed pomalowaniem linii (lub zanim potrzebne będą informacje o podświetleniu)
137134
138135- GetTokenEx, GetTokenAttribute, Next, GetEol
139136
140137Są 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.
141138
142139[[Important:]] Tokeny zwrócone dla każdej linii muszą reprezentować oryginalny tekst linii i zostać zwrócone we właściwej kolejności.
143140
144141- GetToken, GetTokenPos, GetTokenKind
145142
146143SynEdit 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).
147144
148145### Inne uwagi
149146
150147Aby 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).
151148
152149## Krok 2: Używanie zakresów
153150
154151Jak wskazano, moduł „ContextHl” demonstruje ten proces
155152
156153Nastę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 „*)”.
157154
158155Ten 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
159156
160157Można zagnieżdżać wiele ++ i --. Następnie dla każdego -- należy podać ++, zanim słowa zostaną ponownie podświetlone.
161158
162159Nastę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)
163160
164161Zliczana jest aktualna ilość „--”.
165162
166163``` pascal
167164 FCurRange: Integer;
168165```
169166
170167Ta ilość jest pomniejszana przez każde „++”
171168
172169Do przechowywania informacji używamy:
173170
174171GetRange
175172Wywoływany jest po całkowitym przeskanowaniu linii, aby uzyskać wartość końca linii. Wartość zostanie zapisana.
176173
177174SetRange
178175Wywoływany jest przed przeskanowaniem linii. Ustawia wartość przechowywaną od końca poprzedniego wiersza.
179176
180177ResetRange
181178Wywoływany jest przed przeskanowaniem pierwszej linii (ponieważ nie ma poprzedniej linii).
182179
183180> **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>
184181
185182### Ważna uwaga dotycząca zakresów
186183
187184Celem 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.
188185
189186Przykład:
190187
191188``` pascal
192189 writeln; (*
193190 readln;
194191 *)
195192```
196193
197194podczas skanowania „readln” HL wie z zakresu, że znajduje się w komentarzu, nie musi przeglądać poprzednich linii.
198195
199196Dlatego skanowanie można rozpocząć w dowolnej linii.
200197
201198Wyjaś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.
202199
203200## Step 3: Dodanie zwijania
204201
205202Jak wskazano, moduł „FoldHl” demonstruje ten proces
206203
207204Przykładowo, podświetlacz powinien zwijać wszystko pomiędzy wolnostojącymi „-(-”, „-)-”.
208205
209206Zmień dziedziczenie:
210207
211208``` pascal
212209 uses SynEditHighlighterFoldBase;
213210 ...
214211 TSynDemoHl = class(TSynCustomFoldHighlighter)
215212```
216213
217214Zmień sposób przechowywania informacji o zakresie, ponieważ klasa bazowa używa ich do informacji o zwijaniu:
218215
219216``` pascal
220217procedure TSynDemoHl.SetRange(Value: Pointer);
221218begin
222219 inherited;
223220 FCurRange := PtrInt(CodeFoldRange.RangeType);
224221end;
225222
226223procedure TSynDemoHl.ResetRange;
227224begin
228225 inherited;
229226 FCurRange := 0;
230227end;
231228
232229function TSynDemoHl.GetRange: Pointer;
233230begin
234231 CodeFoldRange.RangeType := Pointer(PtrInt(FCurRange));
235232 inherited;
236233end;
237234```
238235
239236Teraz dodaj do skanera kod, który poinformuje podświetlacz o otwieraniu i zamykaniu zwijania:
240237
241238``` pascal
242239procedure TSynDemoHl.FindTokenEnd;
243240begin
244241 ...
245242
246243 if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = '[') then
247244 StartCodeFoldBlock(nil);
248245 if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = ']') then
249246 EndCodeFoldBlock();
250247end;
251248```
252249
253250- **Dla 0.9.30**
254251
255252Proszę 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]]
256253
257254#### Więcej informacji na temat StartCodeFoldBlock / EndCodeFoldBlock
258255
259256``` pascal
260257 function StartCodeFoldBlock(ABlockType: Pointer; IncreaseLevel: Boolean = true): TSynCustomCodeFoldBlock; virtual;
261258```
262259
263260ABlockType
264261Można go użyć do określenia identyfikatora bloku.\
265262
266263Pole to nie jest zwykle używane jako wskaźnik (choć jest to dozwolone). Zwykle identyfikatory są typem wyliczeniowym.\
267264Jeś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:\
268-<b>StartCodeFoldBlock(PtrUInt(1))</b> // lub inne liczby\
265+StartCodeFoldBlock(PtrUInt(1)) // lub inne liczby\
269266
270267IncreaseLevel
271268Jeśli ustawione na False, zostanie wstawiony blok, którego nie można zwinąć.\
272269Takie bloki można wykorzystać do wewnętrznego śledzenia.
273270
274271UWAGA: Wszystkie zwijania muszą być zagnieżdżone, nie mogą zachodzić na siebie. Oznacza to, że ostatnia otwarta zakładka musi być najpierw zamknięta.\
275272Odnosi się to do „EndLvl”, jak pokazano w „Składaniu” (1.3) powyżej\
276273Nakładanie się (jak "IFDEF" i "begin" w IDE) nie może być wykonane w ten sposób.
277274
278275``` pascal
279276 procedure EndCodeFoldBlock(DecreaseLevel: Boolean = True); virtual;
280277```
281278
282279DecreaseLevel
283280To *musi* odpowiadać IncreaseLevel, tak jak zostało to podane w StartCodeFoldBlock\
284281
285282True 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.\
286283TopCodeFoldBlockType 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.
287284
288285``` pascal
289286 function TopCodeFoldBlockType(DownIndex: Integer = 0): Pointer;
290287```
291288
292289Returns the ID of the innermost block.
293290
294291DownIndex
295292może zostać użyty do uzyskania identyfikatora drugiego bloku.
296293
297294DownIndex=1 oznacza blok otaczający najbardziej wewnętrzny.
298295
299296# Konfigurowalne podświetlacze (w tym produkty innych firm)
300297
301298## SynAnySyn
302299
303300Naprawdę prosty podświetlacz. Bardziej referencyjna implementacja niż prawdziwy, użyteczny zakreślacz.
304301
305302## SynUniHighlighter
306303
307304Używa plików konfiguracyjnych opartych na formacie XML. [stary oficjalny link](http://web.archive.org/web/20090610040212/http://www.delphist.com:80/UniHighlighter.html)
308305
309306## SynFacilSyn
310307
311308Elastyczny, w pełni konfigurowalny podświetlacz. <https://github.com/t-edson/SynFacilSyn>
312309
313310# Bibliografia
314311
315312Wątki na forum:
316313
317314- „Tworzenie podświetlacza dla składni C” [[http://www.lazarus.freepascal.org/index.php/topic,10260.0.html temat,10260]]
318315- „Tworzenie podświetlacza składni” [[http://www.lazarus.freepascal.org/index.php/topic,10959.msg54714 temat,10959.msg54714]]
319316- 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]]
320317- 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]]
321318- 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]]
322319- Oznacz (podświetl) wszystkie wystąpienia tokena (lub wyrażenia regularnego) [[http://forum.lazarus.freepascal.org/index.php?topic=26833 temat=26833]]
323320- Informacje o znacznikach i zwijaniu: [[http://forum.lazarus.freepascal.org/index.php?topic=30122]]
324321- 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]]
325322
326323- Zwijanie
327324 - „SynEdit - ulepszone podœietlacze do obsługi zwijania kodu?” [[http://www.lazarus.freepascal.org/index.php/topic,7879.0.html temat,7879]]
328325 - „SynEdit - Dodaj zwijanie kodu pomocniczego dla Java” [[http://www.lazarus.freepascal.org/index.php/topic,7338.0.html temat,7338]]
329326 - „CodeFolding” Konfiguracja [[http://www.lazarus.freepascal.org/index.php/topic,11064 temat,11064]]
330327 - 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]]
331328 - 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]]
332329 - Uzyskanie stanu zwiniętego (zapisz stan złożenia w sesji) [[http://forum.lazarus.freepascal.org/index.php?topic=26748 temat=26748]]
333330
334331---
335332*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).*
336333Category: SynEdit

Back to history