He estado buscando una forma de detectar si el punto está en un comentario mirando cómo se fuente el búfer actual.
Smartparens define sp-point-in-comment
, que se basa syntax-ppss
. Sin embargo, parece que syntax-ppss
y parse-partial-sexp
se puede utilizar para los idiomas arbitrarias, incluso si no lo hacen uso de s-expresiones.
Por ejemplo, este Python:
x = 1
# I'm a comment
y = 2
Colocar el punto dentro del comentario y evaluar (if (nth 4 (syntax-ppss)) 'comment 'not-comment)
funciona correctamente.
¿ syntax-ppss
Funciona para cualquier modo de programación? ¿Por qué las cadenas de documentos discuten las expresiones s?
syntax-highlighting
parsing
syntax
Wilfred Hughes
fuente
fuente
Respuestas:
Bueno, las expresiones s son esencialmente "sintaxis abstracta", en el sentido de que son simplemente una sintaxis concreta para árboles de sintaxis abstracta, y por lo tanto, cualquier lenguaje puede representarse como expresiones s y manipularse con comandos de expresiones s. Por lo tanto,
syntax-ppss
hablar de "Sexps" es simplemente la forma de Lisp de hablar sobre árboles de sintaxis abstracta.Prácticamente, sin embargo,
syntax-ppss
generalmente no funciona para ningún modo. Está fundamentalmente dirigido a lenguajes similares a Lisp, y si el lenguaje concreto de un lenguaje se desvía demasiado de Sexps, ya no tiene mucho sentido usar los comandos de Sexp para manipular el lenguaje. Funcionaría, pero habría una brecha demasiado grande entre la representación abstracta y la sintaxis concreta, lo que haría que la mayoría de los comandos sean contra-intuitivos.Sin embargo, parte de la infraestructura subyacente
syntax-ppss
es bastante genérica. Los modos principales generalmente se esfuerzan por conectarse, porque los hace funcionar bien con muchas características integradas de Emacs y proporciona una interfaz genérica para otros paquetes de terceros como Smartparens.En particular, se
syntax-ppss
basa en las tablas de sintaxis para cadenas y comentarios. Las tablas de sintaxis clasifican los caracteres individuales por su clase sintáctica. Hay clases para delimitadores emparejados, delimitadores de cadena y caracteres de comentario.La estructura de cadenas y comentarios es bastante similar en casi todos los lenguajes de programación: las cadenas normalmente están encerradas en delimitadores especiales. Los comentarios también pueden tener delimitadores especiales, o comenzar con un determinado carácter y extenderse hasta el final de la línea. Estas estructuras se pueden capturar fácilmente en tablas de sintaxis, y casi todos los modos principales definen tablas de sintaxis apropiadas, aunque solo sea para beneficiarse de la fortificación sintáctica de Emacs.
Por lo tanto,
syntax-ppss
funciona bien para cadenas y comentarios en casi cualquier idioma, pero el soporte y la "utilidad" de otras características varían.fuente
Agregando a la respuesta de @ lunaryorn, creo que syntax-ppss solo confía en la solidez del sistema de tabla de sintaxis de emacs, que funciona para comentarios y cadenas en la mayoría de los idiomas. Pero si el lenguaje tiene sintaxis que la tabla de sintaxis no puede capturar, y si el modo no construye un analizador para agregar propiedades de sintaxis en los lugares correctos,
syntax-ppss
fallaría.Prueba esto en
html-mode
:y llame al siguiente comando:
Solo aa es cierto, pero bb también debería ser cierto.
Cuando está dentro
nxml-mode
, nada de eso devuelve verdadero, pero al menos aa debería ser verdadero.fuente