Lassen Sie forward-sexp Blöcke erkennen, die durch Schlüsselwörter definiert sind, nicht nur durch Klammern


10

In einer Sprache (julia) , die Blöcke , die durch Schlüsselwörter wie hat for..end, begin..endsowie Klammern, was ist ein guter Weg , einen solchen Block zu überspringen? Ist endnicht nur ein Blockschlüsselwort, sondern auch eine gültige Kennung, die an anderen Stellen verwendet wird.

Eine Möglichkeit besteht darin, nach Regex zum Starten / Schließen von Blöcken zu suchen und alle Zeichenfolgen, Kommentare und ends usw. zu überspringen. Dies ist jedoch etwas ineffizient und etwas hässlich.

Gibt es eine Möglichkeit, Emacs 'eigene Syntaxanalyse zu veranlassen, solche Blockschlüsselwörter zu erkennen, so dass forward/backward-sexpdies automatisch funktioniert und man den Beginn des aktuellen Blocks schnell anhand der Ausgabe von z syntax-ppss.

[Hinweis: Es macht mir nichts aus, die Datei selbst zu analysieren, aber in diesem Fall möchte ich trotzdem wissen, wie mein Parser in den Rest der Emacs eingesteckt werden soll.]


1
Sie können sich ansehen ruby-mode, was für Ruby etwas Ähnliches bewirkt. Eine andere Möglichkeit ist, sich in Smartparens einzuhängen . Es gibt eine spezielle Konfiguration für den Ruby- Modus, die Sie als Ausgangspunkt verwenden können
Iqbal Ansari

Antworten:


9

Sie können sich die integrierte Bibliothek SMIE ansehen (steht für Simple-Minded Indentation Engine). Trotz des Namens ist die Einrückung nur eine der Funktionen, die sie bietet. Dies ist die Methode, die von vielen Modi (einschließlich ruby-mode, wie in einem Kommentar erwähnt) verwendet wird, um sexuelle Bewegung und Einrückung bereitzustellen.

Das Bereitstellen von SMIE für eine Sprache erfolgt in etwa in zwei Schritten:

  • Definieren Sie die Grammatik für Ihre Sprache zusammen mit einem Lexer, der Token identifiziert.
  • Einrückungsregeln definieren.

Für Ihren Zweck wird nur der erste Schritt benötigt!

Insgesamt lässt sich der so definierte Parser gut in Emacs einbinden. Zum Beispiel show-parenswird Highlight paren ähnliche Ausdrücke in der SMIE Grammatik definiert (zumindest in den letzten genügend Versionen von Emacs).

Beachten Sie, dass Sie weiterhin keine syntax-ppssInformationen über die einschließende Umgebung abrufen können, da nur das Ergebnis des Syntax-Tabellen-Parsers angezeigt wird. Aber Sexp-Bewegungsfunktionen (zum Beispiel up-listgefolgt von backward-sexp) können ein Ersatz sein.


2

Ich habe dafür eine Bibliothek gemacht

Nach der Definition stehen eine Reihe von Befehlen zur Verfügung, die sich vorwärts, rückwärts, kopieren usw. bewegen.

Definieren --in Pseudo-Code--:

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

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

Wenn dies erledigt ist, sollte es verfügbar sein, dh so kopiert und zurückgegeben werden

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.