SynEdit Highlighter/pl: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: SynEdit Highlighter/pl
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Aby uzyskać więcej informacji na temat SynEdit, przejdź do: [[SynEdit/pl|SynEdit]]\ | |
| 2 | + | Zobacz także [[SynEdit Markup/pl|SynEdit Markup]] | |
| 3 | + | ||
| 4 | + | ------------------------------------------------------------------------ | |
| 5 | + | ||
| 6 | + | # Zrozumienie podświetlacza składni SynEdit | |
| 7 | + | ||
| 8 | + | ## SynEdit - zależność od podświetlacza | |
| 9 | + | ||
| 10 | + | **SynEdit do podświetlacza** ma relację **N do 1**. | |
| 11 | + | ||
| 12 | + | - Jedna instancja Podświetlacza może obsługiwać **N** (wiele) instancji SynEdits | |
| 13 | + | - Każdy SynEdit ma tylko jeden podświetlacz | |
| 14 | + | - 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) | |
| 15 | + | ||
| 16 | + | W wyniku tego: | |
| 17 | + | ||
| 18 | + | - żadna instancja wyróżnienia nie ma (stałego) odniesienia do SynEdit. | |
| 19 | + | ||
| 20 | + | ||
| 21 | + | (Podświwetlacze przechowują jednak listę buforów SynEditTextBuffer, do których są dołączone) | |
| 22 | + | ||
| 23 | + | - Wszystkie dane dla Podświetlacza są (i muszą być) przechowywane w SynEdit (właściwie w TextBuffer SynEdit (zwanym „Liniami”). | |
| 24 | + | ||
| 25 | + | Jednakż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). | |
| 26 | + | ||
| 27 | + | ## Scanning and Returning Highlight attributes | |
| 28 | + | ||
| 29 | + | ## Skanowanie i zwracanie atrybutów Podświetlacza | |
| 30 | + | ||
| 31 | + | Oczekuje się, że podświetlacz będzie działał w oparciu o linię / wiersz tekstu. | |
| 32 | + | ||
| 33 | + | Jeś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. | |
| 34 | + | ||
| 35 | + | Jeś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. | |
| 36 | + | ||
| 37 | + | Ró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). | |
| 38 | + | ||
| 39 | + | Zwykle 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. | |
| 40 | + | ||
| 41 | + | ## Zwijanie tekstu | |
| 42 | + | ||
| 43 | + | Zwijanie tekstu w SynEdit jest obsługiwane przez moduł SynEditFoldedView i SynGutterCodeFolding. Podświetlacze realizujące zwijanie są oparte na TSynCustomFoldHighlighter. | |
| 44 | + | ||
| 45 | + | Podstawowe 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): | |
| 46 | + | ||
| 47 | + | - FoldLevel na końcu linii | |
| 48 | + | - Minimalny poziom zwijania napotkany w dowolnym miejscu linii | |
| 49 | + | ||
| 50 | + | The 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: | |
| 51 | + | ||
| 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"` | |
| 62 | + | ||
| 63 | + | W linii | |
| 64 | + | ||
| 65 | + | ` Procedure a; 1 - 0` | |
| 66 | + | ||
| 67 | + | MinLvl 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”). | |
| 68 | + | ||
| 69 | + | Ale w linii | |
| 70 | + | ||
| 71 | + | ` end else begin 3 --- 2 --` | |
| 72 | + | ||
| 73 | + | zaczyna 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. | |
| 74 | + | ||
| 75 | + | Bez MinLvl nie byłoby możliwe stwierdzenie, że zwijanie kończy się w tej linii. | |
| 76 | + | ||
| 77 | + | Nie 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ć. | |
| 78 | + | ||
| 79 | + | ` if a then begin b:=1; c:=2; end; // nie ma żadnego zwijania na tej linii` | |
| 80 | + | ||
| 81 | + | # Tworzenie podświetlacza SynEdit | |
| 82 | + | ||
| 83 | + | Od wersji 0.9.31 35115 podświetlacz składani uległ zmianie. Wdrażanie podstawowego zwijania jest teraz łatwiejsze. | |
| 84 | + | ||
| 85 | + | Wszystkie źródła można znaleźć w katalogu instalacyjnym Lazarusa pod adresem: | |
| 86 | + | ||
| 87 | + | :* Lazarus 2.3 i nowsze: examples\Components\SynEdit\NewHighlighterTutorial | |
| 88 | + | ||
| 89 | + | :* Lazarus przed 2.2.*: examples\SynEdit\NewHighlighterTutorial\\ | |
| 90 | + | ||
| 91 | + | Projekt HighlighterTutorial zawiera 3 przykładowe podświetlenia różnicowe: | |
| 92 | + | ||
| 93 | + | :* SimpleHl: użyte w kroku 1 poniżej | |
| 94 | + | ||
| 95 | + | :* ContextHl: użyte w kroku 2 poniżej | |
| 96 | + | ||
| 97 | + | :* FoldHl: użyte w kroku 3 poniżej | |
| 98 | + | ||
| 99 | + | SimpleHl i ContextHl będą działać również z wersją 0.9.30 | |
| 100 | + | ||
| 101 | + | Składany podświetlacz w akcji: | |
| 102 | + | ||
| 103 | + | <figure> | |
| 104 | + | <img src="SynEditFoldingHighlighterDemo.png" title="SynEditFoldingHighlighterDemo.png" /> | |
| 105 | + | <figcaption>SynEditFoldingHighlighterDemo.png</figcaption> | |
| 106 | + | </figure> | |
| 107 | + | ||
| 108 | + | ## Podstawy: zwracanie tokenów i atrybutów | |
| 109 | + | ||
| 110 | + | Jak wskazano, moduł **SimpleHl** demonstruje ten proces. | |
| 111 | + | ||
| 112 | + | ### Co to robi | |
| 113 | + | ||
| 114 | + | - Dzieli każdą linię na słowa i spacje (lub tabulatory) | |
| 115 | + | - Spacje są częścią tekstu i również muszą być wyróżnione | |
| 116 | + | - Ten przykład pozwala określić różne kolory dla | |
| 117 | + | ||
| 118 | + | ||
| 119 | + | ||
| 120 | + | \- tekst (domyślnie nie jest podświetlony) | |
| 121 | + | ||
| 122 | + | \- spacje (domyślnie srebrna ramka) | |
| 123 | + | ||
| 124 | + | \- słowa oddzielone spacjami rozpoczynające się od a,e,i,o,u (domyślnie pogrubione) | |
| 125 | + | ||
| 126 | + | \- słowo „not” (domyślnie na czerwonym tle) | |
| 127 | + | ||
| 128 | + | ### Jak to działa | |
| 129 | + | ||
| 130 | + | - Create | |
| 131 | + | ||
| 132 | + | Podświetlacz tworzy atrybuty, dzięki którym może zwracać słowa i spacje. | |
| 133 | + | ||
| 134 | + | - SetLine | |
| 135 | + | ||
| 136 | + | Wywoływane przez SynEdit przed pomalowaniem linii (lub zanim potrzebne będą informacje o podświetleniu) | |
| 137 | + | ||
| 138 | + | - GetTokenEx, GetTokenAttribute, Next, GetEol | |
| 139 | + | ||
| 140 | + | Są 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. | |
| 141 | + | ||
| 142 | + | [[Important:]] Tokeny zwrócone dla każdej linii muszą reprezentować oryginalny tekst linii i zostać zwrócone we właściwej kolejności. | |
| 143 | + | ||
| 144 | + | - GetToken, GetTokenPos, GetTokenKind | |
| 145 | + | ||
| 146 | + | SynEdit 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). | |
| 147 | + | ||
| 148 | + | ### Inne uwagi | |
| 149 | + | ||
| 150 | + | Aby 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). | |
| 151 | + | ||
| 152 | + | ## Krok 2: Używanie zakresów | |
| 153 | + | ||
| 154 | + | Jak wskazano, moduł „ContextHl” demonstruje ten proces | |
| 155 | + | ||
| 156 | + | Nastę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 „*)”. | |
| 157 | + | ||
| 158 | + | Ten 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 | |
| 159 | + | ||
| 160 | + | Można zagnieżdżać wiele ++ i --. Następnie dla każdego -- należy podać ++, zanim słowa zostaną ponownie podświetlone. | |
| 161 | + | ||
| 162 | + | Nastę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) | |
| 163 | + | ||
| 164 | + | Zliczana jest aktualna ilość „--”. | |
| 165 | + | ||
| 166 | + | ``` pascal | |
| 167 | + | FCurRange: Integer; | |
| 168 | + | ``` | |
| 169 | + | ||
| 170 | + | Ta ilość jest pomniejszana przez każde „++” | |
| 171 | + | ||
| 172 | + | Do przechowywania informacji używamy: | |
| 173 | + | ||
| 174 | + | GetRange | |
| 175 | + | Wywoływany jest po całkowitym przeskanowaniu linii, aby uzyskać wartość końca linii. Wartość zostanie zapisana. | |
| 176 | + | ||
| 177 | + | SetRange | |
| 178 | + | Wywoływany jest przed przeskanowaniem linii. Ustawia wartość przechowywaną od końca poprzedniego wiersza. | |
| 179 | + | ||
| 180 | + | ResetRange | |
| 181 | + | Wywoływany jest przed przeskanowaniem pierwszej linii (ponieważ nie ma poprzedniej linii). | |
| 182 | + | ||
| 183 | + | > **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> | |
| 184 | + | ||
| 185 | + | ### Ważna uwaga dotycząca zakresów | |
| 186 | + | ||
| 187 | + | Celem 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. | |
| 188 | + | ||
| 189 | + | Przykład: | |
| 190 | + | ||
| 191 | + | ``` pascal | |
| 192 | + | writeln; (* | |
| 193 | + | readln; | |
| 194 | + | *) | |
| 195 | + | ``` | |
| 196 | + | ||
| 197 | + | podczas skanowania „readln” HL wie z zakresu, że znajduje się w komentarzu, nie musi przeglądać poprzednich linii. | |
| 198 | + | ||
| 199 | + | Dlatego skanowanie można rozpocząć w dowolnej linii. | |
| 200 | + | ||
| 201 | + | Wyjaś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. | |
| 202 | + | ||
| 203 | + | ## Step 3: Dodanie zwijania | |
| 204 | + | ||
| 205 | + | Jak wskazano, moduł „FoldHl” demonstruje ten proces | |
| 206 | + | ||
| 207 | + | Przykładowo, podświetlacz powinien zwijać wszystko pomiędzy wolnostojącymi „-(-”, „-)-”. | |
| 208 | + | ||
| 209 | + | Zmień dziedziczenie: | |
| 210 | + | ||
| 211 | + | ``` pascal | |
| 212 | + | uses SynEditHighlighterFoldBase; | |
| 213 | + | ... | |
| 214 | + | TSynDemoHl = class(TSynCustomFoldHighlighter) | |
| 215 | + | ``` | |
| 216 | + | ||
| 217 | + | Zmień sposób przechowywania informacji o zakresie, ponieważ klasa bazowa używa ich do informacji o zwijaniu: | |
| 218 | + | ||
| 219 | + | ``` pascal | |
| 220 | + | procedure TSynDemoHl.SetRange(Value: Pointer); | |
| 221 | + | begin | |
| 222 | + | inherited; | |
| 223 | + | FCurRange := PtrInt(CodeFoldRange.RangeType); | |
| 224 | + | end; | |
| 225 | + | ||
| 226 | + | procedure TSynDemoHl.ResetRange; | |
| 227 | + | begin | |
| 228 | + | inherited; | |
| 229 | + | FCurRange := 0; | |
| 230 | + | end; | |
| 231 | + | ||
| 232 | + | function TSynDemoHl.GetRange: Pointer; | |
| 233 | + | begin | |
| 234 | + | CodeFoldRange.RangeType := Pointer(PtrInt(FCurRange)); | |
| 235 | + | inherited; | |
| 236 | + | end; | |
| 237 | + | ``` | |
| 238 | + | ||
| 239 | + | Teraz dodaj do skanera kod, który poinformuje podświetlacz o otwieraniu i zamykaniu zwijania: | |
| 240 | + | ||
| 241 | + | ``` pascal | |
| 242 | + | procedure TSynDemoHl.FindTokenEnd; | |
| 243 | + | begin | |
| 244 | + | ... | |
| 245 | + | ||
| 246 | + | if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = '[') then | |
| 247 | + | StartCodeFoldBlock(nil); | |
| 248 | + | if (FTokenEnd = FTokenPos+1) and (FLineText[FTokenPos] = ']') then | |
| 249 | + | EndCodeFoldBlock(); | |
| 250 | + | end; | |
| 251 | + | ``` | |
| 252 | + | ||
| 253 | + | - **Dla 0.9.30** | |
| 254 | + | ||
| 255 | + | Proszę zapoznać się z historią tej strony, jeśli używasz wersji 0.9.30 [[http://wiki.lazarus.freepascal.org/index.php?title=SynEdit Highlighter&oldid=76020]] | |
| 256 | + | ||
| 257 | + | #### Więcej informacji na temat StartCodeFoldBlock / EndCodeFoldBlock | |
| 258 | + | ||
| 259 | + | ``` pascal | |
| 260 | + | function StartCodeFoldBlock(ABlockType: Pointer; IncreaseLevel: Boolean = true): TSynCustomCodeFoldBlock; virtual; | |
| 261 | + | ``` | |
| 262 | + | ||
| 263 | + | ABlockType | |
| 264 | + | Można go użyć do określenia identyfikatora bloku.\ | |
| 265 | + | ||
| 266 | + | Pole to nie jest zwykle używane jako wskaźnik (choć jest to dozwolone). Zwykle identyfikatory są typem wyliczeniowym.\ | |
| 267 | + | Jeś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\ | |
| 269 | + | ||
| 270 | + | IncreaseLevel | |
| 271 | + | Jeśli ustawione na False, zostanie wstawiony blok, którego nie można zwinąć.\ | |
| 272 | + | Takie bloki można wykorzystać do wewnętrznego śledzenia. | |
| 273 | + | ||
| 274 | + | UWAGA: Wszystkie zwijania muszą być zagnieżdżone, nie mogą zachodzić na siebie. Oznacza to, że ostatnia otwarta zakładka musi być najpierw zamknięta.\ | |
| 275 | + | Odnosi się to do „EndLvl”, jak pokazano w „Składaniu” (1.3) powyżej\ | |
| 276 | + | Nakładanie się (jak "IFDEF" i "begin" w IDE) nie może być wykonane w ten sposób. | |
| 277 | + | ||
| 278 | + | ``` pascal | |
| 279 | + | procedure EndCodeFoldBlock(DecreaseLevel: Boolean = True); virtual; | |
| 280 | + | ``` | |
| 281 | + | ||
| 282 | + | DecreaseLevel | |
| 283 | + | To *musi* odpowiadać IncreaseLevel, tak jak zostało to podane w StartCodeFoldBlock\ | |
| 284 | + | ||
| 285 | + | True 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.\ | |
| 286 | + | TopCodeFoldBlockType 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. | |
| 287 | + | ||
| 288 | + | ``` pascal | |
| 289 | + | function TopCodeFoldBlockType(DownIndex: Integer = 0): Pointer; | |
| 290 | + | ``` | |
| 291 | + | ||
| 292 | + | Returns the ID of the innermost block. | |
| 293 | + | ||
| 294 | + | DownIndex | |
| 295 | + | może zostać użyty do uzyskania identyfikatora drugiego bloku. | |
| 296 | + | ||
| 297 | + | DownIndex=1 oznacza blok otaczający najbardziej wewnętrzny. | |
| 298 | + | ||
| 299 | + | # Konfigurowalne podświetlacze (w tym produkty innych firm) | |
| 300 | + | ||
| 301 | + | ## SynAnySyn | |
| 302 | + | ||
| 303 | + | Naprawdę prosty podświetlacz. Bardziej referencyjna implementacja niż prawdziwy, użyteczny zakreślacz. | |
| 304 | + | ||
| 305 | + | ## SynUniHighlighter | |
| 306 | + | ||
| 307 | + | Używa plików konfiguracyjnych opartych na formacie XML. [stary oficjalny link](http://web.archive.org/web/20090610040212/http://www.delphist.com:80/UniHighlighter.html) | |
| 308 | + | ||
| 309 | + | ## SynFacilSyn | |
| 310 | + | ||
| 311 | + | Elastyczny, w pełni konfigurowalny podświetlacz. <https://github.com/t-edson/SynFacilSyn> | |
| 312 | + | ||
| 313 | + | # Bibliografia | |
| 314 | + | ||
| 315 | + | Wątki na forum: | |
| 316 | + | ||
| 317 | + | - „Tworzenie podświetlacza dla składni C” [[http://www.lazarus.freepascal.org/index.php/topic,10260.0.html temat,10260]] | |
| 318 | + | - „Tworzenie podświetlacza składni” [[http://www.lazarus.freepascal.org/index.php/topic,10959.msg54714 temat,10959.msg54714]] | |
| 319 | + | - 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]] | |
| 320 | + | - 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]] | |
| 321 | + | - 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]] | |
| 322 | + | - Oznacz (podświetl) wszystkie wystąpienia tokena (lub wyrażenia regularnego) [[http://forum.lazarus.freepascal.org/index.php?topic=26833 temat=26833]] | |
| 323 | + | - Informacje o znacznikach i zwijaniu: [[http://forum.lazarus.freepascal.org/index.php?topic=30122]] | |
| 324 | + | - 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]] | |
| 325 | + | ||
| 326 | + | - Zwijanie | |
| 327 | + | - „SynEdit - ulepszone podœietlacze do obsługi zwijania kodu?” [[http://www.lazarus.freepascal.org/index.php/topic,7879.0.html temat,7879]] | |
| 328 | + | - „SynEdit - Dodaj zwijanie kodu pomocniczego dla Java” [[http://www.lazarus.freepascal.org/index.php/topic,7338.0.html temat,7338]] | |
| 329 | + | - „CodeFolding” Konfiguracja [[http://www.lazarus.freepascal.org/index.php/topic,11064 temat,11064]] | |
| 330 | + | - 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]] | |
| 331 | + | - 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]] | |
| 332 | + | - Uzyskanie stanu zwiniętego (zapisz stan złożenia w sesji) [[http://forum.lazarus.freepascal.org/index.php?topic=26748 temat=26748]] | |
| 333 | + | ||
| 334 | + | --- | |
| 335 | + | *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).* | |
| 336 | + | Category: SynEdit |
