Fai in modo che forward-sexp riconosca i blocchi definiti dalle parole chiave, non solo dalle parentesi


10

In una lingua (julia) che ha blocchi definiti da parole chiave come for..end, begin..endtra parentesi, qual è un buon modo per saltare un blocco del genere? Inoltre, endnon è solo una parola chiave a blocchi, ma anche un identificatore valido utilizzato in altri luoghi.

Un modo è cercare regex di avvio / chiusura a blocchi e saltare tutte le stringhe, i commenti e gli altri end, ecc., Ma questo è in qualche modo inefficiente e un po 'brutto.

Esiste un modo per fare in modo che l'analisi della sintassi di emacs riconosca tali parole chiave a blocchi, in modo che forward/backward-sexpfunzionino automaticamente e in modo da poter dire rapidamente l'inizio del blocco corrente dall'output di, ad esempio syntax-ppss?

[Nota: non mi dispiace analizzare il file da solo, ma in quel caso vorrei ancora sapere come il mio parser dovrebbe essere collegato al resto di emacs.]


1
Puoi dare un'occhiata a ciò ruby-modeche fa qualcosa di simile per il rubino. Un'altra opzione è quella di collegarsi a smartparens , ha una configurazione speciale per la modalità ruby che puoi usare come punto di partenza
Iqbal Ansari,

Risposte:


9

Puoi dare un'occhiata alla libreria integrata SMIE (acronimo di Simple-Minded Indentation Engine). Nonostante il nome, il rientro è solo una delle funzionalità che offre. Questo è il metodo usato da molte modalità (incluso ruby-mode, menzionato in un commento), per fornire movimento e rientro del sesso.

La distribuzione di SMIE per una lingua è all'incirca un lavoro in due passaggi:

  • definire la grammatica per la tua lingua, insieme a un lexer che identifica i token;
  • definire le regole di rientro.

Per il tuo scopo, sarà necessario solo il primo passo!

Nel complesso, il parser definito in questo modo si inserisce bene in emacs. Ad esempio, show-parensmetterà in evidenza espressioni simili a parentesi definite nella grammatica SMIE (almeno nelle versioni abbastanza recenti di emacs).

Si noti che non sarà ancora possibile utilizzare syntax-ppssper ottenere informazioni sull'ambiente che la racchiude, poiché fornirà solo il risultato del parser della tabella di sintassi. Ma le funzioni di movimento del sexp (ad esempio up-listseguite da backward-sexp) possono essere un sostituto.


2

Ho creato una biblioteca per questo

Una volta definiti, sono disponibili numerosi comandi che si spostano avanti, indietro, copia ecc.

Definire --in pseudo-codice--:

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

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

Al termine, dovrebbe essere disponibile, ovvero copiato e restituito in questo modo

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.