Estoy tratando de escribir un modo mayor que resalte las cadenas entre comillas triples. Aquí hay un ejemplo mínimo reproducible:
(defconst demo-triple-quoted-string-regex
(rx "\"\"\""
;; After the delimiter, we're a sequence of
;; non-backslashes or blackslashes paired with something.
(*? (or (not (any "\\"))
(seq "\\" anything)))
"\"\"\""))
(defun demo-stringify-triple-quote ()
"Put `syntax-table' property on triple-quoted strings."
(let* ((string-literal (match-string 0))
(string-start-pos (- (point) (length string-literal)))
(string-end-pos (point)))
(unless (nth 4 (syntax-ppss)) ;; not inside comment
(put-text-property string-start-pos string-end-pos
'syntax-table (string-to-syntax "|")))))
(defconst demo-syntax-propertize-function
(syntax-propertize-rules
(demo-triple-quoted-string-regex
(0 (ignore (demo-stringify-triple-quote))))))
(define-derived-mode demo-mode prog-mode "Demo"
"Major mode showing stack overflow question."
(set (make-local-variable 'font-lock-defaults) '(()))
(set (make-local-variable 'syntax-propertize-function)
demo-syntax-propertize-function))
Sin embargo, esto conduce a un comportamiento realmente extraño al modificar el búfer. Aquí está mi contenido de búfer:
dodgy when we put a newline after babel
"""
a
"
babel
"""
x = 1
M-x demo-mode
da resaltado correcto:
pero presionar enter de repente da esto:
¿Qué estoy haciendo mal?
No tengo una solución, pero noté el mismo problema con la continuación de cursiva y negrita en los ajustes de línea en el modo org.
—
Usuario de Emacs
El primer problema es que está poniendo la sintaxis en todos los caracteres de la cadena, mientras que solo debe hacerse para el primer y el último carácter de valla. Puede verificar que Emacs trata cada par de su supuesta cadena como un sexp, es decir, una sola cadena, a través de
—
politza
forward-sexp
.
El segundo problema es que realmente no puedes unir las cuerdas como imaginas. Esto solo funcionaría si se garantiza que la búsqueda comience fuera de cualquier cadena ya presente en el búfer. Después de todo, son pares iguales: un triple comienza una cadena si y solo si está precedida por un número par de otros triples. Afortunadamente hace
—
politza
syntax-ppss
un seguimiento de esto. Echa un vistazo a cómo se hace python.el
.
@politza ¡Estoy asombrado de tus habilidades de elisp! Muchas gracias :). Sus correcciones fueron suficientes para que mi código funcionara (vea la respuesta a continuación), por lo que ahora puedo corregir el error del modo julia que me metió en esto.
—
Wilfred Hughes