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”>
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.
R""(string-contents)""
.syntax-ppss
.c-mode
är inte alltid flexibel eftersom den stöder många funktioner tyvärr …