Er der en måde at deaktivere multi-line strengliteraler i c ++ – mode?

Antag at jeg har en kort streng i C ++ og ved et uheld sletter det dobbelte citat, der slutter det. Hvad Emacs gør er at fremhæve resten af koden som en enkelt meget lang streng, der ødelægger al formatering, indtil jeg sætter det dobbelte citat tilbage i. Det føles også lidt langsomt, når det refonterer hele bufferen.

Jeg skumrede igennem cc-mode.el, men jeg kunne ikke finde indstillingen for det eller det sted, hvor strengfontifikation sker.

Er der en måde at fortælle c ++ – mode (eller font-lock måske?) at mine strenge aldrig indeholder nye linjer, og det bør aldrig se ud over den første nye linje, hvis den finder en ubestemt streng bogstavelig?

Kommentarer

  • Bruger du nogen syntaksbrikker? det vil sige flycheck eller flymake? De viser dig linjen med fejl, så det bliver let at rette.
  • @Ian Selvom jeg ved, hvor det dobbelte citat mangler, får det stadig hele bufferen, efter at den ligner en enkelt lang snor. Det er det, jeg ' prøver på at undgå.
  • Er du sikker på, at du vil ændre dette? Systemet fungerer som designet, hvilket giver dig feedback om, at din kode ikke er ' t korrekt.
  • @TrippLilley Ja: afbestille og derefter genbekræfte hele bufferen efter strengen ser grim ud, og der er også en mærkbar UI-forsinkelse. Flycheck og lsp fortæller mig altid om syntaksfejl alligevel. Xcode fremhæver for eksempel strenge med et manglende slut citat kun op til den næste nye linje, og det ser meget bedre ud for mig på den måde.
  • I ' m forudsat at dette indebærer skift af syntaks-tabeller, da denne tilstand muligvis ikke låser skrifttypen selv.

Svar

Funktionen c-literal-limits, defineret i progmodes/cc-engine.el bestemmer, hvordan strenge og kommentarer identificeres i alle c-mode varianter. Det bruger disse to definitioner til at gø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\""))  

Desværre, da dette er ikke en konfigurerbar variabel, kan du ikke bare tildele den igen og have c-mode til at gøre, hvad du vil have den til at gøre. Du bliver grundlæggende nødt til at implementere “rådgivning” (se: defadvice) til c-literal-limits -funktionen, der bruger dine konstanter i stedet. Disse konstanter tilføjer en EOL (dvs. "\\s$") for at afslutte strengudtrykket.

Dette er selvfølgelig ikke, hvordan C / C ++ sprog fungerer dog, så jeg anbefaler ikke at gøre dette, men valget er dit, og som du kan se, er det ikke en let vej.

Kommentarer

  • Det var ' t indtil C ++ 0x, at C ++ havde strenglinjelister med flere linier. C betyder ikke ' t har dem overhovedet AFAIK.
  • Du har ret. Jeg antager, at en bedre ting ville være for Emacs at markere dem som en fejl i ikke-C ++ filer.
  • Multi -strengslitteraturer i C ++ har en speciel syntaks introduceret i C ++ 11, de ville ' ikke nødvendigvis virke som almindelige strenge for emacs (f.eks.

.

  • Dette fungerer, men jeg ønsker ikke ' " accepterer " dette svar, fordi det bare virker så indviklet at skulle rådgive / rediger cc-engine.el bare for at få denne funktion. Hvis jeg forstod korrekt, fungerer dette kun for c-mode, hvilket overraskede mig, fordi jeg ' troede, at identificering af strenglitteratur var noget, der blev udført af emacs selv og derefter blev eksponeret gennem funktioner som syntax-ppss.
  • @Kirill " Dette fungerer, men jeg har ikke ' t vil " acceptere " dette svar, fordi det bare virker så indviklet at skulle rådgive / redigere cc-engine.el bare for at få denne funktion " Jeg hører dig. Syntaksmotoren i c-mode er ikke altid fleksibel, fordi den desværre understøtter mange funktioner …
  • Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *