¿Hay alguna forma de deshabilitar los literales de cadenas de varias líneas en el modo c ++?

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.

Comentarios

  • No era ' t hasta C ++ 0x que C ++ tenía literales de cadena de varias líneas. C no ' no los tengo en absoluto.
  • Tienes razón. Supongo que sería mejor que Emacs los marcara como un error en archivos que no son C ++.
  • Los literales de cadena de línea en C ++ tienen una sintaxis especial introducida en C ++ 11, no ' t necesariamente aparecerían como cadenas regulares en emacs (por ejemplo, R""(string-contents)"".
  • Esto funciona, pero yo ' no quiero " aceptar " esta respuesta porque parece muy complicado tener un consejo / edite cc-engine.el solo para obtener esta función. Si entendí correctamente, esto solo funciona para el modo c, lo que me sorprendió porque ' pensé que la identificación de cadenas literales era algo hecho por emacs y luego expuesto a través de funciones como syntax-ppss.
  • @Kirill " Esto funciona, pero yo no ' No quiero " aceptar " esta respuesta porque parece muy complicado tener que aconsejar / editar cc-engine.el solo para obtener esta característica " Te escucho. El motor de sintaxis en c-mode no siempre es flexible porque admite muchas características, desafortunadamente …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *