Faire en sorte que forward-sexp reconnaisse les blocs définis par des mots clés, pas seulement des parenthèses

10

Dans une langue (julia) qui a des blocs définis par des mots clés tels que for..end, begin..endainsi que des parenthèses, quelle est la bonne façon de sauter un tel bloc? En outre, ce endn'est pas seulement un mot-clé de bloc, mais aussi un identifiant valide utilisé dans d'autres endroits.

Une façon consiste à rechercher des expressions rationnelles de démarrage / fermeture de bloc et à ignorer toutes les chaînes, les commentaires et les ends, etc., mais cela est quelque peu inefficace et un peu moche.

Existe-t-il un moyen de faire en sorte que l'analyse syntaxique d'emacs reconnaisse de tels mots clés de bloc, afin que forward/backward-sexpcela fonctionne automatiquement et que l'on puisse rapidement identifier le début du bloc actuel à partir de la sortie de, par exemple syntax-ppss?

[Remarque: cela ne me dérange pas d'analyser le fichier moi-même, mais dans ce cas, j'aimerais toujours savoir comment mon analyseur doit être connecté au reste d'emacs.]

Kirill
la source
1
Vous pouvez voir ruby-modece qui fait quelque chose de similaire pour le rubis. Une autre option est de se connecter aux smartparens , il a une configuration spéciale pour le mode rubis que vous pouvez utiliser comme point de départ
Iqbal Ansari

Réponses:

9

Vous pouvez jeter un œil à la bibliothèque intégrée SMIE (signifie Simple-Minded Indentation Engine). Malgré son nom, l'indentation n'est qu'une des fonctionnalités qu'il offre. C'est la méthode utilisée par de nombreux modes (y compris ruby-mode, mentionnés dans un commentaire), pour fournir le mouvement sexp et l'indentation.

Le déploiement de SMIE pour une langue est en gros une tâche en deux étapes:

  • définir la grammaire de votre langue, ainsi qu'un lexer identifiant les jetons;
  • définir des règles d'indentation.

Pour votre objectif, seule la première étape sera nécessaire!

Dans l'ensemble, l'analyseur défini de cette façon se branche bien dans emacs. Par exemple, show-parensmettra en évidence les expressions de type paren définies dans la grammaire SMIE (au moins dans les versions assez récentes d'emacs).

Notez que vous ne pourrez toujours pas utiliser syntax-ppsspour obtenir des informations sur l'environnement englobant, car il ne vous donnera que le résultat de l'analyseur de table de syntaxe. Mais les fonctions de mouvement sexp (par exemple up-listsuivies de backward-sexp) peuvent être un remplacement.

T. Verron
la source
2

J'ai fait une bibliothèque pour ça

Une fois défini, un tas de commandes sont disponibles, avancer, reculer, copier, etc.

Définition --en pseudo-code--:

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

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

Une fois terminé, il devrait être disponible, c'est-à-dire copié et retourné comme ceci

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Andreas Röhler
la source