In einer Sprache (julia) , die Blöcke , die durch Schlüsselwörter wie hat for..end
, begin..end
sowie Klammern, was ist ein guter Weg , einen solchen Block zu überspringen? Ist end
nicht 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 end
s 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-sexp
dies 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.]
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önnenAntworten:
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:
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-parens
wird 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-ppss
Informationen über die einschließende Umgebung abrufen können, da nur das Ergebnis des Syntax-Tabellen-Parsers angezeigt wird. Aber Sexp-Bewegungsfunktionen (zum Beispielup-list
gefolgt vonbackward-sexp
) können ein Ersatz sein.quelle
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--:
Wenn dies erledigt ist, sollte es verfügbar sein, dh so kopiert und zurückgegeben werden
quelle