"Naciskanie" identyfikatorów w SynEdit

"Naciskanie" identyfikatorów w SynEdit
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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:

Kopiuj
 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

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
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.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
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

Kopiuj
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.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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ę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.