Finns det ett sätt att inaktivera stränglitteratur med flera rader i c ++ – läge?

Antag att jag har en kort sträng i C ++ och att jag av misstag tar bort det dubbla citatet som avslutar det. Vad Emacs gör är att markera resten av koden som en enda mycket lång sträng, som förstör all formatering tills jag lägger tillbaka det dubbla citatet. Det känns också lite långsamt när det återbetonar hela bufferten.

Jag skummade igenom cc-mode.el, men jag kunde inte hitta inställningen för den eller den plats där strängfontifiering sker.

Finns det ett sätt att säga till c ++ – läge (eller font-lock kanske?) att mina strängar aldrig innehåller nya rader och att den aldrig ska se utöver den första nya raden om den hittar en obestämd sträng bokstavlig? = ”comments”>

  • Använder du syntaxkontroller? jag gillar flygcheck eller flymake? De visar dig raden med fel, så det blir lätt att korrigera.
  • @Ian Även om jag vet var det dubbla citatet saknas, gör det fortfarande hela bufferten efter att den ser ut som en enda lång sträng. Det är det jag ' försöker undvika.
  • Är du säker på att du vill ändra detta? Systemet fungerar som designat, vilket ger dig feedback om att din kod inte är ' t korrekt.
  • @TrippLilley Ja: avaktivera och sedan återbetala hela bufferten efter strängen ser ful ut och det finns en märkbar UI-fördröjning också. Flycheck och lsp kommer alltid att berätta om syntaxfel ändå. Xcode framhäver till exempel strängar med en saknad slutlig offert bara upp till nästa nya rad, och det ser mycket bättre ut för mig på det sättet.
  • I ' m förutsatt att detta innebär att man ändrar syntaxtabeller eftersom det här läget kanske inte låser typsnittet själv.
  • Svar

    Funktionen c-literal-limits, definierat i progmodes/cc-engine.el avgör hur strängar och kommentarer identifieras i alla c-mode -varianter. Det använder dessa två definitioner för att göra 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\""))  

    Tyvärr, eftersom detta är inte en konfigurerbar variabel, du kan inte bara tilldela den igen och låta c-mode göra vad du vill att den ska göra. Du måste i princip implementera ”råd” (se: defadvice) för c-literal-limits -funktionen som använder dina konstanter istället. Dessa konstanter skulle lägga till en EOL (dvs. "\\s$") för att avsluta stränguttrycket.

    Detta är naturligtvis inte hur C / C ++ språk fungerar dock, så jag rekommenderar starkt att du inte gör det här, men valet är ditt, och som du kan se är det inte en lätt väg.

    Kommentarer

    • Det var inte ' t tills C ++ 0x att C ++ hade flera radsträngbokstäver. C inte ' t har dem alls AFAIK.
    • Du har rätt. Jag antar att en bättre sak skulle vara för Emacs att flagga dem som ett fel i icke-C ++ filer.
    • Multi stränglitteraler i C ++ har en speciell syntax introducerad i C ++ 11, de skulle ' inte nödvändigtvis se ut som vanliga strängar för emacs (t.ex. R""(string-contents)"".
    • Det här fungerar, men jag vill inte ' t " accepterar " det här svaret eftersom det bara verkar så krångligt att behöva råda / redigera cc-engine.el bara för att få den här funktionen. Om jag förstod rätt fungerar det bara för c-mode, vilket förvånade mig för att jag ' tänkte att identifiera stränglitteraler var något som gjordes av emacs själv och sedan exponerades genom funktioner som syntax-ppss.
    • @Kirill " Detta fungerar, men jag gör inte ' t vill " acceptera " det här svaret eftersom det bara verkar så krångligt att behöva ge råd / redigera cc-engine.el bara för att få den här funktionen " Jag hör dig. Syntaxmotorn i c-mode är inte alltid flexibel eftersom den stöder många funktioner tyvärr …

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *