Niech seksu naprzód rozpozna bloki zdefiniowane przez słowa kluczowe, a nie tylko nawiasy

10

W języku (Julia), który ma bloki zdefiniowane przez słowa kluczowe, takie jak for..end, begin..endoraz nawiasy, jaki jest dobry sposób na pominięcie takiego bloku? Ponadto endjest nie tylko słowem kluczowym blokowym, ale także prawidłowym identyfikatorem używanym w innych miejscach.

Jednym ze sposobów jest poszukiwanie wyrażenia regularnego rozpoczynającego / zamykającego blokowanie i pomijanie wszystkich ciągów, komentarzy i ends itd., Ale jest to nieco nieefektywne i trochę brzydkie.

Czy istnieje sposób, aby własna analiza składni Emacsa rozpoznała takie słowa kluczowe bloku, aby forward/backward-sexpdziałało to automatycznie i aby można było szybko określić początek bieżącego bloku na podstawie wyniku np. syntax-ppss?

[Uwaga: nie mam nic przeciwko samodzielnej analizie pliku, ale w takim przypadku nadal chciałbym wiedzieć, w jaki sposób mój parser powinien być podłączony do reszty emacsa.]

Cyryl
źródło
1
Możesz spojrzeć na to, ruby-modeco robi coś podobnego do ruby. Inną opcją jest podłączenie do smartparens , ma specjalną konfigurację dla trybu ruby , którego można użyć jako punktu wyjścia
Iqbal Ansari,

Odpowiedzi:

9

Możesz zajrzeć do wbudowanej biblioteki SMIE (skrót od Simple-Minded Indentation Engine). Pomimo nazwy wcięcie jest tylko jedną z funkcji, które zapewnia. Jest to metoda używana przez wiele trybów (w tym ruby-modewspomnianych w komentarzu), aby zapewnić ruch i wcięcie seksu.

Wdrażanie SMIE dla języka to z grubsza dwa kroki:

  • zdefiniuj gramatykę dla swojego języka wraz z leksemem identyfikującym tokeny;
  • zdefiniuj reguły wcięć.

Do tego celu potrzebny będzie tylko pierwszy krok!

Ogólnie, parser zdefiniowany w ten sposób ładnie pasuje do emacsa. Na przykład show-parenspodświetli wyrażenia podobne do paren, zdefiniowane w gramatyce SMIE (przynajmniej w wystarczająco ostatnich wersjach emacsa).

Zauważ, że nadal nie będziesz mógł użyć syntax-ppssinformacji o otaczającym środowisku, ponieważ da ci to tylko wynik parsera tabeli składni. Ale funkcje ruchowe sexp (na przykład up-listpo nim backward-sexp) mogą zastąpić.

T. Verron
źródło
2

Zrobiłem bibliotekę do tego

Po zdefiniowaniu dostępnych jest kilka poleceń, przejście do przodu, do tyłu, kopiowanie itp.

Definiowanie - w pseudo-code--:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Po zakończeniu powinien być dostępny, tzn. Skopiowany i zwrócony w ten sposób

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Andreas Röhler
źródło