Předpokládejme, že mám v C ++ krátký řetězec a omylem odstraním uvozovku, která ho končí. To, co Emacs dělá, je zvýraznění zbytku kódu jako jediného velmi dlouhého řetězce, který pokazí všechny formátování, dokud nevrátím dvojitou uvozovku zpět. Také se cítí trochu pomalu, když refontifikuje celou vyrovnávací paměť.
Procházel jsem cc-mode.el
, ale nemohl jsem najít jeho nastavení ani místo, kde dochází k fontifikaci řetězce.
Existuje způsob, jak řekni c ++ – mode (nebo snad font-lock?), že moje řetězce nikdy neobsahují nové řádky a nikdy by se neměly dívat za první nový řádek, pokud naleznou neukončený řetězcový literál?
Komentáře
- Používáte nějaké nástroje pro kontrolu syntaxe? tj. jako flycheck nebo flymake? Ukáží vám řádek s chybou, takže to bude snadné opravit.
- @Ian I když vím, kde chybí dvojitá nabídka, stále to dělá celý buffer, když to vypadá jako jediný dlouhý tětiva. To tomu se ' snažím vyhnout.
- Jste si jisti, že to chcete změnit? Systém funguje tak, jak byl navržen, a dává vám zpětnou vazbu, že váš kód není ' správný.
- @TrippLilley Ano: odškrtnutí a následná kontrola celé vyrovnávací paměti za řetězcem vypadá ošklivě a je zde také znatelné zpoždění uživatelského rozhraní. Flycheck a lsp mi stejně vždy řeknou o syntaktických chybách. Například Xcode zvýrazňuje řetězce s chybějící finální nabídkou pouze po další nový řádek a vypadá mi to tak mnohem lépe.
- I ' m za předpokladu, že to zahrnuje změnu tabulek syntaxe, protože tento režim by nemusel sám uzamknout písmo.
odpověď
funkce div id = „80150e3dd7″>
definované v progmodes/cc-engine.el
určuje, jak jsou řetězce a komentáře identifikovány ve všech c-mode
variantách. Využívá k tomu tyto dvě definice:
;; 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\""))
Bohužel, protože toto je nejedná se o konfigurovatelnou proměnnou, nemůžete ji jen znovu přiřadit a c-mode
udělat to, co chcete. Pro funkci c-literal-limits
, která místo toho používá vaše konstanty, byste museli v zásadě implementovat „radu“ (viz: defadvice
). Tyto konstanty by přidaly EOL (tj. "\\s$"
) k ukončení řetězcového výrazu.
To samozřejmě není způsob, jakým C / C ++ jazyk však funguje, takže to velmi nedoporučuji dělat, ale volba je na vás a jak vidíte, není to snadná cesta.
R""(string-contents)""
.syntax-ppss
.c-mode
není vždy flexibilní, protože bohužel podporuje mnoho funkcí …