Existuje způsob, jak zakázat víceřádkové řetězcové literály v režimu c ++?

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.

Komentáře

  • Nebylo ' t, dokud C ++ 0x neměl C ++ víceřádkové řetězcové literály. C doesn ' Nemáte je vůbec AFAIK.
  • Máte pravdu. Myslím, že lepší by bylo, kdyby je Emacs označil jako chybu v souborech jiných než C ++.
  • Multi -řádkové řetězcové literály v C ++ mají speciální syntaxi zavedenou v C ++ 11, nevypadaly by ' nutně jako běžné řetězce pro emacs (např. R""(string-contents)"".
  • Toto funguje, ale ' nechci " přijmout " tuto odpověď, protože se zdá, že je tak spletitá, že musí radit / upravte cc-engine.el, abyste získali tuto funkci. Pokud jsem správně pochopil, funguje to pouze pro režim c, což mě překvapilo, protože jsem si ' d myslel, že identifikace řetězcových literálů je něco, co provádí sám emacs, a poté je vystaveno prostřednictvím funkcí jako syntax-ppss.
  • @Kirill " To funguje, ale ' Nechci " přijmout " tuto odpověď, protože se zdá, že je tak komplikované, že musí radit / upravovat cc-engine.el, jen aby dostal tato funkce " Slyším. Syntaxe v c-mode není vždy flexibilní, protože bohužel podporuje mnoho funkcí …

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *