¿Para qué idiomas es apropiado 'syntax-ppss'?

12

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-ppssy parse-partial-sexpse 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-ppssFunciona para cualquier modo de programación? ¿Por qué las cadenas de documentos discuten las expresiones s?

Wilfred Hughes
fuente
1
No es que haya explorado esto a fondo, pero aún no he encontrado un idioma en el que no funcione. Incluso en modos derivados de texto, como el látex, funcionó bien para mí.
Malabarba

Respuestas:

13

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-ppsshablar de "Sexps" es simplemente la forma de Lisp de hablar sobre árboles de sintaxis abstracta.

Prácticamente, sin embargo, syntax-ppssgeneralmente 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-ppsses 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-ppssbasa 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-ppssfunciona bien para cadenas y comentarios en casi cualquier idioma, pero el soporte y la "utilidad" de otras características varían.

Lunaryorn
fuente
4

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-ppssfallaría.

Prueba esto en html-mode:

<p class="aa" id='bb'>"cc" 'dd'</p>

y llame al siguiente comando:

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

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.

Xah Lee
fuente