Există o modalitate de a dezactiva literele șirului de mai multe linii în modul c ++?

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”>

  • Folosiți vreun verificator de sintaxă? adică flycheck sau flymake? Acestea vă vor arăta linia cu erori, deci va fi ușor de corectat.
  • @Ian Chiar dacă știu unde lipsește ghilimele duble, totuși face ca întregul buffer să pară un singur lung şir. Asta este ceea ce ' încerc să evit.
  • Sunteți sigur că doriți să schimbați acest lucru? Sistemul funcționează așa cum a fost conceput, oferindu-vă feedback că codul dvs. nu este ' t corect.
  • @TrippLilley Da: necontentare și apoi refontificare a întregului buffer după șir arată urât și există și un decalaj vizibil al interfeței de utilizare. Flycheck și lsp îmi vor spune întotdeauna despre erorile de sintaxă oricum. Xcode, de exemplu, evidențiază șirurile cu un citat final lipsă doar până la următoarea linie nouă și așa mi se pare mult mai bine.
  • I ' m presupunând că acest lucru implică schimbarea tabelelor de sintaxă, deoarece acest mod ar putea să nu facă blocarea fontului în sine.
  • 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ă.

    Comentarii

    • Nu a fost ' t până la C ++ 0x că C ++ a avut literele șirului cu mai multe linii. / div> nu le aveți deloc AFAIK.
    • Aveți dreptate. Cred că un lucru mai bun ar fi ca Emacs să le semnaleze ca o eroare în fișierele non-C ++.
    • Multi literele șir -line din C ++ au o sintaxă specială introdusă în C ++ 11, nu ar apărea neapărat ca șiruri obișnuite pentru emacs (de ex., R""(string-contents)"".
    • Acest lucru funcționează, dar nu ' nu vreau să " accept " acest răspuns, deoarece pare atât de complicat să ai sfaturi / editați cc-engine.el doar pentru a obține această caracteristică. Dacă am înțeles corect, acest lucru funcționează doar pentru modul c, ceea ce m-a surprins pentru că ' m-am gândit că identificarea literelor șirului este ceva realizat chiar de emacs și apoi expus prin funcții precum syntax-ppss.
    • @Kirill " Acest lucru funcționează, dar eu nu ' Nu vreau să " acceptați " acest răspuns, deoarece pare atât de complicat să trebuiască să sfătuiți / editați cc-engine.el doar pentru a obține această caracteristică " te aud. Motorul de sintaxă din c-mode nu este întotdeauna flexibil, deoarece acceptă o mulțime de caracteristici, din păcate …

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *