Faltung in SynEdit

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Faltung in SynEdit

Beitrag von wennerer »

Hallo,
ich versuche in ein Synedit eine zweite Faltung einzufügen. Hab da auch schon etliches probiert. Aber es Faltet nicht so wie ich möchte.

SyneditFaltung.png
SyneditFaltung.png (78.44 KiB) 4252 mal betrachtet
Meine erste Faltung geht von @@ zum übernächsten @@. Meine Zweite Faltung sollte von Diff zu Diff, also so das dazwischen alles weggefaltet ist.
Leider verstehe ich hier die Beschreibung in der SynEdit Bibel nicht.
Kann mir jemand der sich auskennt hier weiter helfen? Meinen Versuch hab ich angehängt.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(148.7 KiB) 53-mal heruntergeladen

martin_frb
Beiträge: 573
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Faltung in SynEdit

Beitrag von martin_frb »

Es gibt ein Tutorial.
https://wiki.freepascal.org/SynEdit_Highlighter
Meine erste Faltung geht von @@ zum übernächsten @@.
"Nächsten" ?

Der code ruft bei jedem "@@" EndCodeFoldBlock() auf.
Übrigens langfristig besser testen ob ein Block offen ist.

if TopCodeFoldBlockType = PtrInt(cfbt_Header) then
EndCodeFoldBlock()

Ist es Absicht das der eine "@@" block über den "diff" hinausgeht?
Oder soll die "diff" Zeile den auch beenden?

Wenn es Absicht ist, hast Du überlappende Folds.
StartCodeFoldBlock/EndCodeFoldBlock sehen nur verschachtelte Folds vor, das heisst der zuletzt geöffnete muss zwingend als erster geschlossen werden (wie beim Stack).

Der PasHL hat Code für mehrere unverschachtelte (siehe IFDEF). Ist aber ein gutes Stück Arbeit (IIRC).


-------------
Wenn Du den @@ im ProcDiff schließen willst.

1) Füge cfbt_NONE ein, als erstes element der liste ord(cfbt_NONE)=0
2) Afaik, TopCodeFoldBlockType liefert nil wenn kein Block offen ist
3) im ProcDiff
if TopCodeFoldBlockType = PtrInt(cfbt_Header) then
EndCodeFoldBlock()
if TopCodeFoldBlockType = PtrInt(cfbt_Diff) then
EndCodeFoldBlock()
StartCodeFoldBlock(cfbt_Diff)


oder ähnlich.

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Faltung in SynEdit

Beitrag von wennerer »

Hallo Martin,
herzlichen Dank für deine Antwort. Es funktioniert!
Obwohl ich schwören könnte das ich alle Varianten probiert habe . :oops:
Das Tutorial hab ich natürlich schon gelesen. Auch die Beispiele die in Lazarus dabei sind und selbstverständlich den Quellcode der mitgelieferten Highlighter.
Ist halt für mich nicht immer leicht zu verstehen.
Deshalb nochmal Danke das du als Profi dir die Zeit nimmst Fragen zu beantworten!

Für alle die es nachvollziehen möchten hänge ich das funktionierende Projekt an.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(148.74 KiB) 64-mal heruntergeladen

Antworten