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.
R""(string-contents)""
.syntax-ppss
.c-mode
szintaxis motorja nem mindig rugalmas, mert sajnos sok funkciót támogat …