Van-e mód a többsoros karakterláncok letiltására c ++ – módban?

Tegyük fel, hogy van egy rövid karakterláncom a C ++ – ban, és véletlenül töröltem az ezzel végződő dupla idézetet. Amit Emacs csinál, az kiemeli a többi kódot egyetlen nagyon hosszú karaktersorozatként, ami az összes formázást elrontja, amíg vissza nem teszem a dupla idézetet. Kicsit lassúnak érzi azt is, amikor újrahelyezi az egész puffert.

Átfutottam a cc-mode.el fájlt, de nem találtam meg a beállítását, vagy azt a helyet, ahol a karakterlánc fontifikálása történik.

Van rá mód mondd meg a c ++ – mode-nak (vagy esetleg font-lock-nak?), hogy a karaktersorozataim soha nem tartalmaznak új sorokat, és soha nem szabad az első új vonalon túlra nézni, ha egy befejezetlen karakterláncot talál?

Megjegyzések

  • Használsz szintaktikai ellenőrzőket? azaz mint flycheck vagy flymake? Hibásan mutatják meg a sort, így könnyen kijavítható lesz.
  • @Ian Még ha tudom is, hogy honnan hiányzik a dupla idézet, akkor is az egész puffert teszi, miután egyetlen hosszúnak tűnik. húr. Ezt próbálom elkerülni '.
  • Biztos benne, hogy ezen változtatni akar? A rendszer a tervek szerint működik, visszajelzést küldve arról, hogy a kód nem megfelelő '.
  • @TrippLilley Igen: a teljes puffer megerősítése a karakterlánc után, majd újratelepítése csúnyán néz ki, és észrevehető a felhasználói felület késése is. A Flycheck és az LSP egyébként mindig elmondja a szintaktikai hibákat. Az Xcode például csak a következő új sorig emeli ki a hiányzó végső idézettel ellátott karakterláncokat, és nekem így sokkal jobban néz ki.
  • I ' m feltételezve, hogy ez szintaxistáblák megváltoztatásával jár, mivel ez a mód nem biztos, hogy betűzárat hajt végre.

Válasz

A A div div = = 80150e3dd7 “>

, az progmodes/cc-engine.el mezőben definiálva határozza meg, hogy a karakterláncok és megjegyzések hogyan azonosíthatók az összes c-mode változatban. Ehhez a két definíciót használja:

 ;; 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\""))  

Sajnos, mivel ez nem konfigurálható változó, nem egyszerűen kijelölheti, és c-mode tegye azt, amit akar. Alapvetően “tanácsot” (lásd: defadvice) kell végrehajtania a c-literal-limits függvényhez, amely az állandókat használja. Ezek az állandók hozzáadnának egy EOL-t (azaz "\\s$") a karakterlánc kifejezés befejezéséhez.

A C / C ++ természetesen nem így működik A nyelv ugyan működik, ezért nagyon ajánlom, hogy ne ezt tegye, de a választás az Öné, és mint láthatja, ez nem könnyű út.

Megjegyzések

  • Ez addig nem volt ' t, amíg C ++ 0x-ig C ++ nem rendelkezik többsoros karakterláncokkal. C doesn ' egyáltalán nincsenek náluk AFAIK.
  • Igazad van. Gondolom, jobb lenne, ha az Emacs hibaként jelölné meg őket nem C ++ fájlokban.
  • Több A C ++ soros karakterláncok speciális szintaxissal rendelkeznek a C ++ 11-ben, nem feltétlenül jelennek meg normális karakterláncként az emacs számára (pl. R""(string-contents)"".
  • Ez működik, de nem ' nem akarom " elfogadni a " ez a válasz, mert csak annyira összezavarodottnak tűnik, hogy tanácsot kell adnia / szerkessze a cc-engine.el fájlt csak azért, hogy megszerezze ezt a funkciót. Ha jól értettem, ez csak a c-módnál működik, ami meglepett, mert ' úgy gondoltam, hogy a karakterlánc-literálok azonosítását valami emacs maga végezte el, majd olyan funkciók révén tették közzé, mint a syntax-ppss.
  • @Kirill " Ez működik, de nem ' nem akarom " elfogadni " ezt a választ, mert csak annyira összezavarodottnak tűnik, hogy tanácsot kell adni / szerkeszteni a cc-engine.el-t, csak ezt a funkciót " hallom. A c-mode szintaxis motorja nem mindig rugalmas, mert sajnos sok funkciót támogat …

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük