Suponga que tengo una cadena corta en C ++ y borro accidentalmente la comilla doble que la termina. Lo que hace Emacs es resaltar el resto del código como una sola cadena muy larga, lo que estropea todo el formato hasta que vuelvo a poner las comillas dobles. También se siente un poco lento cuando refontifica todo el búfer.
Hojeé cc-mode.el
, pero no pude encontrar la configuración o el lugar donde ocurre la fuente de caracteres.
¿Hay alguna manera de decirle a c ++ – mode (¿o quizás font-lock?) que mis cadenas nunca contienen nuevas líneas y que nunca debería mirar más allá de la primera línea nueva si encuentra una cadena literal sin terminar.
Comentarios
- ¿Utiliza verificadores de sintaxis? es decir, como flycheck o flymake? Le mostrarán la línea con error, por lo que será fácil de corregir.
- @Ian Incluso si sé dónde falta la comilla doble, todavía hace que todo el búfer después de que parezca un solo largo cuerda. Eso es lo que ' estoy tratando de evitar.
- ¿Está seguro de que desea cambiar esto? El sistema está funcionando según lo diseñado, lo que le proporciona información de que su código no es ' t correcto.
- @TrippLilley Sí: eliminar la fuente y luego refontificar todo el búfer después de la cadena se ve feo y también hay un retraso notable en la interfaz de usuario. Flycheck y lsp siempre me informarán sobre errores de sintaxis de todos modos. Xcode, por ejemplo, resalta las cadenas con una cita final faltante solo hasta la siguiente nueva línea, y me parece mucho mejor de esa manera.
- I ' m asumiendo que esto implica cambiar las tablas de sintaxis, ya que este modo podría no bloquear la fuente por sí mismo.
Responder
La función c-literal-limits
, definido en progmodes/cc-engine.el
determina cómo se identifican las cadenas y los comentarios en todas las c-mode
variantes. Utiliza estas dos definiciones para hacerlo:
;; String syntax chars, suitable for skip-syntax-(forward|backward). (defconst c-string-syntax (if (memq "gen-string-delim c-emacs-features) "\"|" "\"")) ;; Regexp matching string limit syntax. (defconst c-string-limit-regexp (if (memq "gen-string-delim c-emacs-features) "\\s\"\\|\\s|" "\\s\""))
Desafortunadamente, ya que esto es no es una variable configurable, no puede simplemente reasignarla y hacer que c-mode
haga lo que quiere que haga. Tendría que implementar básicamente un «consejo» (ver: defadvice
) para la función c-literal-limits
que usa sus constantes en su lugar. Estas constantes agregarían un EOL (es decir, "\\s$"
) para terminar la expresión de cadena.
Esto, por supuesto, no es cómo C / C ++ Sin embargo, el idioma funciona, así que recomiendo encarecidamente no hacerlo, pero la elección es suya y, como puede ver, no es un camino fácil.
R""(string-contents)""
.syntax-ppss
.c-mode
no siempre es flexible porque admite muchas características, desafortunadamente …