¿Hay alguna manera de averiguar el tipo de paréntesis circundante (es decir, '(', '[' o '{') alrededor del punto? Por ejemplo (usando |
para representar el punto)
{ abc, | df }
debería devolver '{' y
{ abc[ | ], 123 }
debería devolver '['. Idealmente, me gustaría que también maneje comillas.
En caso de que alguien tenga curiosidad o necesite más detalles: mi objetivo es configurar el espaciado automático inteligente :
en Python usando el espaciado eléctrico (también conocido como operador inteligente ). El problema es que normalmente (en python) :
es el operador de división o el inicio de una declaración for / if / ..., que no debe estar rodeada de espacios. Sin embargo, dentro de un diccionario es algo así como un operador de asignación, por lo que debe estar rodeado de espacios. Entonces, tengo que verificar si el punto está dentro de un dict (es decir, dentro {}
), pero no dentro de una operación de corte o cadena dentro de ese dict (es decir, no dentro []
o ""
).
Editar:
Aquí está la función auxiliar que escribí, basada en la respuesta de abo-abo:
(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))))
Entonces, el predicado final es:
(and (not (in-string-p))
(eq (enclosing-paren) ?\}))
Edición 2:
La función anterior resultó ser demasiado lenta (a menudo causaba un retraso notable cuando :
se tecleaba). Ahora estoy usando la respuesta de Stefan, que parece ser mucho más rápido.
fuente
""
, puede usar el incorporadoin-string-p
.Respuestas:
En lugar de
up-list
recomendarle, use lo(syntax-ppss)
que le devolverá algún estado de análisis. Esto incluirá información sobre si está dentro de una cadena o un comentario, la posición del último "par" abierto, etc.Por ejemplo, puedes encontrar el tipo de pareja con
y es de esperar que también le permita manejar comillas (marcando
(nth 3 ppss)
y(char-after (nth 8 ppss))
).fuente
Prueba esto:
Tenga en cuenta que
up-list
puede arrojar, por lo que también debe manejar los errores.fuente
Mientras que la respuesta preferible IMO fue dada por Stefan, aquí un ejemplo que incluye una solución que no se basa en delimitadores WRT de tabla de sintaxis: utiliza algo como
y una pila Ver fuente aquí
https://github.com/emacs-berlin/general-close
fuente
Aquí hay una función que devuelve el paréntesis circundante, incluido el caso cuando el punto está directamente en el primer o último paréntesis (que era importante en mi caso).
Esto funciona con el lenguaje, por lo que
({[]})
todo funciona en C, por ejemplo.fuente