Wie erkennt man, ob sich ein passendes Paar in einem befindet?

16

F: Gibt es eine allgemeine Methode, um festzustellen, ob sich der Punkt in einem übereinstimmenden Zeichenpaar befindet oder nicht?

Das heißt: Gibt es eine allgemeine Prädikatfunktion (oder etwas anderes), die bestimmen kann, ob ein Punkt zwischen einem übereinstimmenden Paar oder zwischen willkürlich ausgewählten Zeichen liegt? Ich denke über eines nach, das tin den folgenden Szenarien ausgewertet wird , !wobei auf Punkt verwiesen wird:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

Bearbeiten : syntax-ppssscheint ein guter Ausgangspunkt zu sein, aber es ist mir nicht klar, wie man es an mehrere Zeichen entsprechende Paare anpassen würde (zB die `` LaTeX-Anführungszeichen '' oder sogar passende <b>html tags</b>). Ich frage mich, ob es eine allgemeine Lösung gibt oder ob es einen speziell entwickelten Parser erfordern würde.

Dan
quelle

Antworten:

16

syntax-ppsskönnte hier hilfreich sein. Es wird eine Liste mit den folgenden Elementen zurückgegeben:

  • Element 0: Tiefe in Parens
  • Element 3: Nicht-Null, wenn innerhalb eines Strings

Du könntest es so benutzen:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

Mit einer korrekt eingerichteten Syntax-Tabelle im Puffer (für Strings und passende Parens) sollte die Funktion das tun, was Sie erwarten. Wenn die Verwendung der Syntaxtabelle des Modus nicht möglich ist, können Sie auf die Verwendung von zurückgreifen with-syntax-table.

Paprika
quelle
Ich möchte darauf hinweisen, dass der Dokumentationsstring von parse-partial-sexpdie zurückgegebene Datenstruktur syntax-ppssausführlicher erklärt als der von mir verlinkte Abschnitt des Elisp-Handbuchs.
Paprika
2

Wenn Sie zum Beispiel prüfen möchten, ob zwischen geschweiften Klammern Folgendes steht:

(and (looking-back "{") (looking-at "}"))

Sicher, Sie können die geschweiften Klammern durch das ersetzen, was Sie wollen.

BEARBEITEN:

Eine nützlichere Funktion wird in etwa so aussehen:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))
Nsukami _
quelle
2
Das funktioniert nur, wenn der Punkt auf dem Schluss }steht und sich nichts zwischen dem befindet {}. Es kann schwierig sein, gepaarte Trennzeichen mit regulären Ausdrücken in Einklang zu bringen. Besser syntax-ppsals @paprika vorgeschlagen.
Tyler
@ Tyler funktioniert nur, wenn der Punkt beim Schließen }nicht das Verhalten ist, das ich gesehen habe: \ aber ja, die Paare mit regulären Ausdrücken zu bekommen ist in der Tat schwierig
Nsukami _
looking-atUntersucht den Text ab Punkt. Es sei denn, Punkt ist auf der }ersten Aussage oben sollte nicht funktionieren? Vielleicht ein Unterschied zwischen den Emacs-Versionen. : /
Tyler