Mise en évidence de la syntaxe Vim des littéraux numériques avec des séparateurs de chiffres entre guillemets simples

9

C ++ 14 nous a donné la possibilité d'utiliser des guillemets simples pour séparer les chiffres des grands littéraux numériques. Cela rompt la mise en évidence de la syntaxe de Vim.

Par exemple, considérez le programme C ++ 14 suivant:

#include <stdlib.h>

int main(int argc, char** argv) {
  // small numbers are fine
  int normal_number = 5;

  // large numbers have the correct highlighting but they're hard to visually parse
  int huge_number = 1000000000;

  // apostrophes help with visual parsing but mess up syntax higlighting
  int huge_number_again = 1'000'000'000;

  return EXIT_SUCCESS;
}

Lorsque je vois cela dans Vim, je vois la coloration syntaxique suivante (notez que j'utilise des scripts de surbrillance supplémentaires ):

Mise en évidence de la syntaxe Vim pour le programme décrit ci-dessus

Je voudrais que tous les chiffres huge_number_againapparaissent en rouge. Puis-je apporter une modification à l'un de mes fichiers de syntaxe ou à mon ~/.vimrcpour corriger cela?

Jake
la source
Je vois un certain support pour C ++ 14 a été ajouté dans v7.4.923 (littéraux binaires). Mais pas le séparateur de nombres, il semble: - / Les derniers fichiers C ++ d'ici ne semblent pas encore l'avoir.
Martin Tournoij
4
Pour une solution rapide, vous pouvez probablement ajouter syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"à ~/.vim/syntax/cpp.vim. (Btw, si c'est du C ++, utilisez cstdlib-le pas stdlib.h .)
muru
3
Je viens de remarquer qu'il y a un problème ouvert depuis mai 2014 btw.
Martin Tournoij
@muru Cela semble avoir résolu le problème. Je suis d'accord pour utiliser un hack rapide pour l'instant. Merci!
Jake
2
@Carpetsmoker Je ne suis pas sûr de la correspondance de syntaxe pour savoir exactement ce que fait ma modification. Je pense que cela correspondra simplement à un chiffre suivi d'un nombre quelconque de chiffres ou de guillemets simples, plus le ullfluff, mais je ne sais pas s'il correspondra à un cas non valide. Et apparemment, C ++ 14 autorise le séparateur en octaux, binaires, hexadécimaux et flottants et après la virgule décimale en flottants. C'est beaucoup plus que ce que je suis prêt à accepter.
muru

Réponses:

4

Le repo vim-jp / vim-cpp a inclus ce changement en juillet 2016:

syn match   cNumber     display contained "\d\('\=\d\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
syn match   cNumber     display contained "0x\x\('\=\x\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
syn match   cNumber     display contained "0b[01]\('\=[01]\+\)*\(u\=l\{0,2}\|ll\=u\)\>"

Si vous ne souhaitez pas utiliser ce dépôt, vous pouvez ajouter ces lignes à ~/.vim/syntax/cpp.vim.

Martin Tournoij
la source