Destaque da sintaxe Vim de literais numéricos com separadores de dígitos de aspas simples

9

O C ++ 14 nos forneceu a opção de usar aspas simples para separar os dígitos de literais numéricos grandes. Isso interrompe o destaque da sintaxe do Vim.

Por exemplo, considere o seguinte programa C ++ 14:

#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;
}

Quando vejo isso no Vim, vejo o seguinte destaque da sintaxe (observe que estou usando alguns scripts de destaque adicionais ):

Destaque da sintaxe do Vim para o programa descrito acima

Gostaria que todos os dígitos huge_number_againaparecessem em vermelho. Existe uma modificação que posso fazer em um dos meus arquivos de sintaxe ou no meu ~/.vimrcpara corrigir isso?

Jake
fonte
Vejo que algum suporte para C ++ 14 foi adicionado na v7.4.923 (literais binários). Mas não o separador de números que parece: - / Os arquivos C ++ mais recentes daqui também não parecem possuí-lo.
Martin Tournoij 14/03
4
Para uma solução rápida, você provavelmente pode adicionar syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"a ~/.vim/syntax/cpp.vim. (Btw, se é C ++, utilização cstdlib, não stdlib.h .)
Muru
3
Acabei de perceber que há um problema em aberto desde maio de 2014.
Martin Tournoij 14/03
@ muru Isso parece ter resolvido o problema. Por enquanto, estou bem em usar um hack rápido. Obrigado!
Jake
2
@Carpetsmoker Não tenho certeza da correspondência de sintaxe para saber exatamente o que minha alteração faz. Penso que corresponderá apenas a um dígito seguido de qualquer número de dígitos ou aspas simples, além do ullcotão, mas não sei se corresponderá a algum caso inválido. E, aparentemente, o C ++ 14 permite o separador em octal, binário, literais hexadecimais e flutuadores e após o ponto decimal em flutuadores. Isso é muito mais do que estou disposto a enfrentar.
Muru

Respostas:

4

O repositório vim-jp / vim-cpp incluiu essa alteração em julho de 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\)\>"

Se você não quiser usar este repositório, poderá adicionar essas linhas a ~/.vim/syntax/cpp.vim.

Martin Tournoij
fonte