Existe-t-il un moyen de désactiver les littéraux de chaîne multiligne en mode C ++?

Supposons que jai une chaîne courte en C ++ et que je supprime accidentellement le guillemet double qui la termine. Ce que fait Emacs, cest mettre en évidence le reste du code comme une seule très longue chaîne, ce qui gâche tout le formatage jusquà ce que je remette les guillemets doubles. Cela semble aussi un peu lent quand il refontifie tout le tampon.

Jai parcouru cc-mode.el, mais je nai pas pu trouver le paramètre ni lendroit où la police de caractères se produit.

Y a-t-il un moyen de dire à c ++ – mode (ou font-lock peut-être?) que mes chaînes ne contiennent jamais de sauts de ligne et quil ne devrait jamais regarder au-delà du premier saut de ligne sil trouve une chaîne littérale non terminée?

Commentaires

  • Utilisez-vous des vérificateurs de syntaxe? cest-à-dire comme flycheck ou flymake? Ils vous montreront la ligne avec lerreur, donc ce sera facile à corriger.
  • @Ian Même si je sais où le guillemet double est manquant, cela fait quand même le tampon entier après quil ressemble à un seul long chaîne de caractères. Cest ce que jessaie ' déviter.
  • Voulez-vous vraiment changer cela? Le système fonctionne comme prévu, vous indiquant que votre code nest pas ' correct.
  • @TrippLilley Oui: suppression de la police puis refontification du tampon entier après la chaîne semble moche et il y a aussi un décalage notable de linterface utilisateur. Flycheck et lsp me parleront toujours des erreurs de syntaxe de toute façon. Xcode, par exemple, met en surbrillance les chaînes avec un guillemet final manquant uniquement jusquà la prochaine nouvelle ligne, et cela me semble beaucoup mieux ainsi.
  • I ' m en supposant que cela implique de changer les tables de syntaxe car ce mode peut ne pas verrouiller les polices lui-même.

Réponse

La fonction c-literal-limits, défini dans progmodes/cc-engine.el détermine la manière dont les chaînes et les commentaires sont identifiés dans toutes les variantes c-mode. Pour ce faire, il utilise ces deux définitions:

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

Malheureusement, car cest pas une variable configurable, vous ne pouvez pas simplement la réaffecter, et demander à c-mode de faire ce que vous voulez quil fasse. Vous auriez à implémenter essentiellement « conseil » (voir: defadvice) pour la fonction c-literal-limits qui utilise vos constantes à la place. Ces constantes ajouteraient un EOL (cest-à-dire "\\s$") pour terminer lexpression de chaîne.

Ce nest bien sûr pas ainsi que le C / C ++ la langue fonctionne, cependant, je recommande vivement de ne pas faire cela, mais le choix vous appartient, et comme vous pouvez le voir, ce n’est pas un chemin facile.

Commentaires

  • Ce nétait ' t que jusquà C ++ 0x que C ++ avait des littéraux de chaîne multilignes. C ne ' Je ne les ai pas du tout AFAIK.
  • Vous avez raison. Je suppose que mieux serait quEmacs les signale comme une erreur dans les fichiers non-C ++.
  • Multi Les littéraux de chaîne -line en C ++ ont une syntaxe spéciale introduite en C ++ 11, ils ne ' t apparaissent nécessairement comme des chaînes régulières pour emacs (par exemple, R""(string-contents)"".
  • Cela fonctionne, mais je ne ' pas vouloir " accepter " cette réponse car il semble tellement compliqué davoir à un conseil / éditez cc-engine.el juste pour obtenir cette fonctionnalité. Si jai bien compris, cela ne fonctionne que pour le mode C, ce qui ma surpris car je ' pensais que lidentification des chaînes littérales était quelque chose de fait par emacs lui-même et ensuite exposé via des fonctions comme syntax-ppss.
  • @Kirill " Cela fonctionne, mais je ne ' Je veux " accepter " cette réponse parce que cela semble tellement compliqué davoir à conseiller / modifier cc-engine.el juste pour obtenir cette fonctionnalité " Je vous entends. Le moteur de syntaxe de c-mode nest pas toujours flexible car il prend en charge de nombreuses fonctionnalités, malheureusement …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *