"Naciskanie" identyfikatorów w SynEdit

1

Lazarus, Delphi oraz cała masa innych środowisk posiadają taką fajną możliwość, że po naciśnięciu na jakiś identyfikator wskazywana jest jego deklaracja/definicja/wtf.
Aktualnie implementuję coś takiego w moim edytorze: działa to na podobnej zasadzie, jak w Lazarusie: kompilator wywoływany jest w trybie skanowania kodu, czyli nie generuje żadnego skompilowanego pliku wyjściowego, a plik "code scan"; ten plik to lista takich rekordów:

 Type TReference = Record
                    IdentName       : String;
                    Line, Char      : LongWord;
                    RefLine, RefChar: LongWord;
                    RefFile         : String;
                   End;

I ten plik jest wczytywany oraz analizowany przez edytor.
Tyle mam zrobione.
Teraz następuje problem, którego rozwiązania nie mogę odnaleźć:
W jaki sposób wykonać podświetlanie identyfikatorów na takiej zasadzie, jak to jest np.w Delphi czy Lazarusie?
Czyli, że naciskam lewy ctrl, a jeżeli dany identyfikator jest "poprawny" (tj.gdy ten identyfikator na tej-a-tej pozycji karetki został ujęty w pliku "code scan"), to jest on podświetlany, a gdy dodatkowo nacisnę LPM, to przechodzi się do jego definicji (zmieniana jest pozycja karetki + ew.także i wczytywany jest inny plik). Chodzi oczywiście o TSynEdit.
Nie znam fachowej nazwy tego, ale mam nadzieję, że domyślacie się o co może chodzić :P

0

Wiem że w delphi nie jest to rozwiązane tak jak się wydaje. Jak przytrzymasz Ctrl i wciśniesz LPM np na TForm to faktycznie otworzy Ci moduł Forms i postawi kursor przy deklaracji TForm. ALE ale, jeżeli EDYTUJESZ plik Forms ii wstawisz kilka enterów przed deklaracją (tak że np była na 200 linii, teraz jest na 204), i znowu będziesz chciał się odwołać do deklaracji TForms, to i tak przeniesie Cię do 200 linii mimo że deklaracja jest na 204.

0

Błąd w Delphi, jak zgaduję, to pewnie i celowy, by przyspieszyć wczytywanie akurat tych symboli.
Jeżeli odwołasz się do symbolu w swoim projekcie, już jest ok.

0

No to ja użyłbym właśnie czegoś takiego. Podczas gdy kompilator/środowisko/IDE/whatever "analizuje" ten "plan code", mógłbyś zrobić coś w stylu

var I: Integer;
 //...

I := -1;
repeat
  I := PosEx('record', Tekst, I+1);

  //pseudo kod
  {
     1. Wyszukaj znak "=" równa się, po tym słowie "record".
     2. Obetnij ze zmiennej Tekst ciąg od PozycjiSlowaRecord+6 do PozycjaZnakuRownasie
     3. Przytnij spacje z obu stron, jeżeli są
     4. Zapisz w tablicy asocjacyjnej lub innej nazwę recordu i nr linii/pozycje/etc
     5. Przy LPT+Ctrl wyszukaj w tablicy assoc kliknięty wyraz, sprawdź pozycje, wyfocusuj tą pozycje w pliku
  }  
until I = 0;

Jest taki fajny komunikat który można wywołać przez Memo1.Perform(); lub Richedit1.Perform(); z parametrami X i Y kursora, ii to coś zwraca pozycję znaku za którym aktualnie jest kursor myszki. Mam gdzieś projekt, mogę wysłać ale bez problemu do znalezienia w internetach.

0

Ale analizowanie kodu mam już wykonane (plik z analizą generuje kompilator, a edytor ten plik wczytuje), a sam problem mam z wykonaniem odpowiedniego "manewru" w TSynEdit, aby działało to na takiej zasadzie, jak w Delphi/Lazarusie.

Also, przed chwilą wpadłem na pewien pomysł jak to wykonać; zaraz go zrealizuję i jak się powiedzie, to opiszę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1