Er det en måte å deaktivere flerlinjestrengbokstaver i c ++ – modus?

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.

Kommentarer

  • Det var ikke ' t inntil C ++ 0x at C ++ hadde strenglinjelitteratur med flere linjer. C ikke ' t har dem i det hele tatt AFAIK.
  • Du har rett. Jeg antar at en bedre ting ville være for Emacs å markere dem som en feil i ikke-C ++ filer.
  • Multi -linjestrengbokstaver i C ++ har en spesiell syntaks introdusert i C ++ 11, de ville ikke ' t nødvendigvis virke som vanlige strenger for emacs (f.eks. R""(string-contents)"".
  • Dette fungerer, men jeg vil ikke ' t " godta " dette svaret fordi det bare virker så innblandet å måtte gi råd / rediger cc-engine.el bare for å få denne funksjonen. Hvis jeg forsto riktig, fungerer dette bare for c-modus, noe som overrasket meg fordi jeg ' trodde at å identifisere strenglitteratur var noe som ble gjort av emacs selv og deretter ble eksponert gjennom funksjoner som syntax-ppss.
  • @Kirill " Dette fungerer, men jeg gjør ikke ' t vil " godta " dette svaret fordi det bare virker så innblandet å måtte gi råd / redigere cc-engine.el bare for å få denne funksjonen " Jeg hører deg. Syntaksmotoren i c-mode er ikke alltid fleksibel fordi den støtter mange funksjoner, dessverre …

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *