Să presupunem că am un șir scurt în C ++ și șterg accidental ghilimelul dublu care îl termină. Ceea ce face Emacs este să evidențieze restul codului ca un singur șir foarte lung, care încurcă toate formatările până când pun din nou ghilimelul. Se simte, de asemenea, puțin lent atunci când refontifică întregul buffer.
Am parcurs cc-mode.el
, dar nu am putut găsi setarea pentru acesta sau locul unde se întâmplă fontificarea șirului.
Există o modalitate de a spuneți c ++ – modul (sau font-lock, poate?) că șirurile mele nu conțin niciodată linii noi și nu ar trebui să arate niciodată dincolo de prima linie nouă dacă găsește un șir literal nedefinit? = „comentarii”>
Răspuns
Funcția c-literal-limits
, definit în progmodes/cc-engine.el
determină modul în care șirurile și comentariile sunt identificate în toate variantele c-mode
. Folosește aceste două definiții pentru a face acest lucru:
;; 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\""))
Din păcate, deoarece acesta este nu este o variabilă configurabilă, nu o puteți reatribui și cere c-mode
să facă ceea ce doriți să facă. Trebuie să implementați practic „sfaturi” (a se vedea: defadvice
) pentru funcția c-literal-limits
care utilizează în schimb constantele dvs. Aceste constante ar adăuga un EOL (adică "\\s$"
) pentru a termina expresia șirului.
Acest lucru, desigur, nu este modul în care C / C ++ limba funcționează, totuși, așa că vă recomand cu tărie să nu faceți acest lucru, dar alegerea este a dvs. și, după cum puteți vedea, nu este o cale ușoară.
R""(string-contents)""
.syntax-ppss
.c-mode
nu este întotdeauna flexibil, deoarece acceptă o mulțime de caracteristici, din păcate …