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.
.
syntax-ppss
. c-mode
er ikke altid fleksibel, fordi den desværre understøtter mange funktioner …