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.
.
syntax-ppss
. c-mode
non è sempre flessibile perché supporta molte funzionalità, sfortunatamente …