Cè un modo per disabilitare le stringhe letterali su più righe in modalità c ++?

Supponiamo di avere una breve stringa in C ++ e di eliminare accidentalmente le virgolette doppie che la terminano. Quello che fa Emacs è evidenziare il resto del codice come una singola stringa molto lunga, che rovina tutta la formattazione fino a quando non inserisco nuovamente le virgolette doppie. Sembra anche un po lento quando refontifica lintero buffer.

Ho sfogliato cc-mode.el, ma non sono riuscito a trovare limpostazione o il luogo in cui avviene la fontificazione delle stringhe.

Esiste un modo per dire alla modalità c ++ (o forse il blocco dei caratteri?) che le mie stringhe non contengono mai nuove righe e non dovrebbe mai guardare oltre la prima riga se trova una stringa letterale non terminata?

Commenti

  • Utilizzi controlli di sintassi? cioè come flycheck o flymake? Ti mostreranno la riga con errore, quindi sarà facile correggerla.
  • @Ian Anche se so dove manca la virgoletta doppia, fa comunque sembrare lintero buffer dopo che sembra un singolo lungo corda. Questo è ciò che ' sto cercando di evitare.
  • Sei sicuro di volerlo cambiare? Il sistema funziona come progettato, dandoti un feedback sul fatto che il tuo codice non è ' corretto.
  • @TrippLilley Sì: non ha limiti e poi refontifica lintero buffer dopo la stringa sembra brutto e cè anche un notevole ritardo dellinterfaccia utente. Flycheck e lsp mi diranno sempre comunque degli errori di sintassi. Xcode, ad esempio, evidenzia le stringhe con una virgoletta finale mancante solo fino alla nuova riga successiva, e mi sembra molto meglio in questo modo.
  • I ' m supponendo che ciò implichi la modifica delle tabelle di sintassi in quanto questa modalità potrebbe non bloccare il carattere da solo.

Answer

La funzione c-literal-limits, definito in progmodes/cc-engine.el, determina il modo in cui le stringhe e i commenti vengono identificati in tutte le varianti c-mode. Utilizza queste due definizioni per farlo:

 ;; 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\""))  

Sfortunatamente, poiché questo è non è una variabile configurabile, non puoi semplicemente riassegnarla e fare in modo che c-mode faccia quello che vuoi che faccia. Fondamentalmente dovresti implementare “consiglio” (vedi: defadvice) per la funzione c-literal-limits che utilizza invece le tue costanti. Queste costanti aggiungerebbero un EOL (cioè "\\s$") per terminare lespressione stringa.

Questo, ovviamente, non è il modo in cui C / C ++ language funziona, tuttavia, quindi consiglio vivamente di non farlo, ma la scelta è tua e, come puoi vedere, non è un percorso facile.

Commenti

  • Non era ' t fino a C ++ 0x che C ++ aveva stringhe letterali su più righe. C non ' non li ha affatto AFAIK.
  • Hai ragione. Immagino che una cosa migliore sarebbe che Emacs li segnalasse come un errore nei file non C ++.
  • Multi -Le stringhe letterali in C ++ hanno una sintassi speciale introdotta in C ++ 11, non ' appariranno necessariamente come stringhe regolari a emacs (ad es.

.

  • Funziona, ma ' non voglio " accettare " questa risposta perché sembra così contorto dover consigliare / modifica cc-engine.el solo per ottenere questa funzione. Se ho capito bene, questo funziona solo per c-mode, il che mi ha sorpreso perché ' pensavo che lidentificazione delle stringhe letterali fosse qualcosa fatto da emacs stesso e quindi esposto attraverso funzioni come syntax-ppss.
  • @Kirill " Funziona, ma non ' voglio " accettare " questa risposta perché sembra così contorto dover consigliare / modificare cc-engine.el solo per ottenere questa funzione " ti sento. Il motore di sintassi in c-mode non è sempre flessibile perché supporta molte funzionalità, sfortunatamente …
  • Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *