Anta at jeg har en kort streng i C ++ og at jeg ved et uhell sletter det dobbelte sitatet som avslutter det. Det Emacs gjør er å markere resten av koden som en enkelt veldig lang streng, som ødelegger all formateringen til jeg legger det dobbelte sitatet tilbake. Det føles også litt tregt når det refonterer hele bufferen. >
Jeg skummet igjennom cc-mode.el
, men jeg kunne ikke finne innstillingen for det eller stedet der strengfontifikasjon skjer.
Er det en måte å fortelle c ++ – modus (eller font-lock kanskje?) at strengene mine aldri inneholder nye linjer, og at den aldri skal se utover den første nye linjen hvis den finner en ubestemt streng bokstavelig?
Kommentarer
- Bruker du noen syntaksbrikker? jeg liker flycheck eller flymake? De vil vise deg linjen med feil, så det vil være enkelt å rette.
- @Ian Selv om jeg vet hvor det dobbelte sitatet mangler, gjør det fortsatt at hele bufferen ser ut som en enkelt lang streng. Det er det jeg ' prøver å unngå.
- Er du sikker på at du vil endre dette? Systemet fungerer som designet, og gir deg tilbakemelding om at koden din ikke er ' t riktig.
- @TrippLilley Ja: avbryter og deretter bekrefter hele bufferen etter strengen ser stygg ut og det er også en merkbar UI-forsinkelse. Flycheck og lsp vil alltid fortelle meg om syntaksfeil uansett. Xcode fremhever for eksempel strenger med et manglende sluttnotat bare opp til neste nye linje, og det ser mye bedre ut for meg på den måten.
- I ' m forutsatt at dette innebærer endring av syntakstabeller, da denne modusen kanskje ikke gjør fontlåsing selv.
Svar
Funksjonen div id = «80150e3dd7″>
, definert i progmodes/cc-engine.el
bestemmer hvordan strenger og kommentarer identifiseres i alle c-mode
varianter. Den bruker disse to definisjonene for å gjøre det:
;; 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\""))
Dessverre, siden dette er ikke en konfigurerbar variabel, kan du ikke bare tildele den på nytt, og få c-mode
til å gjøre det du vil at den skal gjøre. Du må i utgangspunktet implementere «råd» (se: defadvice
) for c-literal-limits
-funksjonen som bruker konstantene dine i stedet. Disse konstantene vil legge til en EOL (dvs. "\\s$"
) for å avslutte strenguttrykket.
Dette er selvfølgelig ikke hvordan C / C ++ språk fungerer, så jeg anbefaler ikke å gjøre dette, men valget er ditt, og som du kan se, er det ikke en enkel vei.
R""(string-contents)""
.syntax-ppss
.c-mode
er ikke alltid fleksibel fordi den støtter mange funksjoner, dessverre …