Gibt es eine Möglichkeit, den Typ der umgebenden Klammer (dh '(', '[' oder '{') um den Punkt herum herauszufinden? Zum Beispiel (Verwenden |
, um einen Punkt darzustellen)
{ abc, | df }
sollte '{' zurückgeben, und
{ abc[ | ], 123 }
sollte '[' zurückgeben. Idealerweise möchte ich, dass es auch Anführungszeichen behandelt.
Für den Fall, dass jemand neugierig ist oder weitere Details benötigt: Mein Ziel ist es, :
mithilfe von elektrischen Abständen (auch als Smart-Operator bezeichnet ) einen intelligenten automatischen Abstand in Python einzurichten . Das Problem ist, dass normalerweise (in Python) :
entweder der Slice-Operator oder der Beginn einer for / if / ... -Anweisung ist, die nicht von Leerzeichen umgeben sein sollte. Innerhalb eines Wörterbuchs ist es jedoch so etwas wie ein Zuweisungsoperator und sollte daher von Leerzeichen umgeben sein. Ich muss also überprüfen, ob sich der Punkt innerhalb eines Diktats befindet (dh innerhalb {}
), aber nicht innerhalb einer Slice-Operation oder einer Zeichenfolge innerhalb dieses Dikts (dh nicht innerhalb []
oder ""
).
Bearbeiten:
Hier ist die Hilfsfunktion, die ich basierend auf der Antwort von abo-abo geschrieben habe:
(defun enclosing-paren ()
"Return the closing parenthesis of the enclosing parens, or nil if not inside any parens."
(ignore-errors
(save-excursion
(up-list)
(char-before))))
Dann ist das letzte Prädikat:
(and (not (in-string-p))
(eq (enclosing-paren) ?\}))
Bearbeiten 2:
Die obige Funktion erwies sich als zu langsam (sie verursachte häufig eine merkliche Verzögerung, wenn a :
eingegeben wurde). Ich verwende jetzt stattdessen Stefans Antwort, die viel schneller zu sein scheint.
quelle
""
können Sie die integrierte Funktion verwendenin-string-p
.Antworten:
Anstatt dass
up-list
ich empfehlen würde, dass Sie verwenden,(syntax-ppss)
was Ihnen einen Parsing-Status zurückgibt. Dies beinhaltet Informationen darüber, ob Sie sich in einer Zeichenfolge oder einem Kommentar befinden, die Position des letzten geöffneten "Parens" usw.ZB können Sie die Art von Paren mit finden
und hoffentlich sollten Sie auch mit Anführungszeichen umgehen können (durch Aktivieren von
(nth 3 ppss)
und(char-after (nth 8 ppss))
).quelle
Versuche dies:
Beachten Sie, dass
up-list
werfen kann, so dass Sie auch Fehler behandeln müssen.quelle
Während die bevorzugte Antwort IMO von Stefan gegeben wurde, hier ein Beispiel, das eine Lösung enthält, die sich nicht auf WRT-Trennzeichen für Syntaxtabellen stützt: Es verwendet so etwas wie
und ein Stapel. Siehe Quelle hier
https://github.com/emacs-berlin/general-close
quelle
Hier ist eine Funktion, die die umgebende Klammer zurückgibt, einschließlich des Falls, wenn der Punkt direkt auf der ersten oder letzten Klammer liegt (was in meinem Fall wichtig war).
Dies funktioniert mit der Sprache, sodass
({[]})
alle beispielsweise in C funktionieren.quelle