Onko olemassa tapa poistaa moniriviset merkkijonolitraalit käytöstä c ++ – tilassa?

Oletetaan, että minulla on lyhyt merkkijono C ++: ssa ja poistan vahingossa sen lopettavan kaksoislainauksen. Emacs tekee korostamalla loput koodista yhtenä erittäin pitkänä merkkijonona, joka sekoittaa kaiken muotoilun, kunnes laitan kaksoislainauksen takaisin sisään. Se tuntuu myös hieman hitaalta, kun se vahvistaa koko puskurin uudelleen.

Selasin läpi cc-mode.el, mutta en löytänyt sille asetusta tai paikkaa, jossa merkkijonon vahvistaminen tapahtuu.

Onko olemassa tapaa kerro c ++ – mode (tai ehkä fontin lukitus?), että merkkijononi eivät koskaan sisällä uusia rivejä ja että sen ei pitäisi koskaan katsoa ensimmäisen rivin ulkopuolelle, jos se löytää loputtoman merkkijonon kirjaimen? = ”comments”>

  • Käytätkö syntaksintarkistimia? ts. kuten flycheck tai flymake? Ne näyttävät sinulle rivin virheellisesti, joten se on helppo korjata.
  • @Ian Vaikka tiedänkin, mistä kaksoislainaus puuttuu, se tekee koko puskurista sen jälkeen, kun se näyttää yhdeltä pitkältä. merkkijono. Tätä yritän välttää '.
  • Oletko varma, että haluat muuttaa tätä? Järjestelmä toimii suunnitellusti ja antaa sinulle palautetta siitä, että koodi ei ole ' oikea.
  • @TrippLilley Kyllä: koko puskurin vahvistaminen ja vahvistaminen uudelleen merkkijonon jälkeen näyttää ruma ja käyttöliittymän viive on myös huomattava. Flycheck ja lsp kertovat aina syntaksivirheistä. Esimerkiksi Xcode korostaa merkkijonoja puuttuvasta lopullisesta lainauksesta vain seuraavaan uuteen riviin asti, ja se näyttää minulle paljon paremmalta.
  • I ' m olettaen, että tähän liittyy syntaksitaulukoiden muuttaminen, koska tämä tila ei välttämättä tee itse kirjasimen lukitusta.
  • Answer

    Funktio c-literal-limits, määritelty kohdassa progmodes/cc-engine.el määrittää, miten merkkijonot ja kommentit tunnistetaan kaikissa c-mode -muunnelmissa. Se käyttää näitä kahta määritelmää:

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

    Valitettavasti, koska tämä on Et ole määritettävissä oleva muuttuja, et voi vain määrittää sitä uudelleen ja antaa c-mode tehdä mitä haluat sen tekevän. Sinun tulisi periaatteessa toteuttaa ”neuvoja” (katso: defadvice) funktiolle c-literal-limits, joka käyttää vakioita sen sijaan. Nämä vakiot lisäisivät EOL: n (ts. "\\s$") merkkijonolausekkeen lopettamiseksi.

    C / C ++ ei tietenkään ole näin kieli toimii, joten suosittelen, ettet tee tätä, mutta valinta on sinun, ja kuten huomaat, se ei ole helppo polku.

    Kommentit

    • Se ei ollut ' t, kunnes C ++ 0x, että C ++: lla oli monirivisiä merkkijonolitraaleja. C doesn ' niillä ei ole lainkaan AFAIK: ää.
    • Olet oikeassa. Luultavasti parempi asia olisi, jos Emacs merkitsisi ne virheeksi muissa kuin C ++ -tiedostoissa.
    • Multi -linjaisissa merkkijono-litaleissa C ++: ssa on erityinen syntaksin käyttöönotto C ++ 11: ssä, ne eivät välttämättä näyttäisi välttämättä tavallisilta merkkijonoilta emacsille (esim. R""(string-contents)"".
    • Tämä toimii, mutta en halua ' halua " hyväksyä " tämä vastaus, koska se näyttää vain niin sekavalta, että joudut neuvomaan / muokkaa cc-engine.el vain saadaksesi tämän ominaisuuden. Jos ymmärsin oikein, tämä toimii vain c-tilassa, mikä yllätti minut, koska ajattelin ' ajattelin, että merkkijono-literaalien tunnistaminen oli jotain, jonka emacs itse teki ja paljasti sitten sellaisten toimintojen kautta kuin syntax-ppss.
    • @Kirill " Tämä toimii, mutta en ' et halua " hyväksyä " tätä vastausta, koska se näyttää vain niin mutkattomalta, että joudut neuvomaan / muokkaamaan cc-engine.el: tä vain saadaksesi tämä ominaisuus " kuulen. c-mode -syntaksimoottori ei ole aina joustava, koska se tukee valitettavasti monia ominaisuuksia …

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *