Подсветка синтаксиса Vim для числовых литералов с разделителями из одинарных кавычек

9

C ++ 14 предоставил нам возможность использовать одинарные кавычки для разделения цифр больших числовых литералов. Это нарушает подсветку синтаксиса Vim.

Например, рассмотрим следующую программу на 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;
}

Когда я просматриваю это в Vim, я вижу следующую подсветку синтаксиса (обратите внимание, что я использую некоторые дополнительные сценарии подсветки ):

Подсветка синтаксиса Vim для программы, описанной выше

Я бы хотел, чтобы все цифры huge_number_againбыли красными. Могу ли я внести изменения в один из моих файлов синтаксиса или в мой, ~/.vimrcчтобы исправить это?

Джейк
источник
Я вижу, что некоторая поддержка C ++ 14 была добавлена ​​в v7.4.923 (двоичные литералы). Но не количество сепаратора, кажется: - / Последние файлы Си ++ отсюда и не похожи, это еще.
Мартин Турной
4
Для быстрого исправления, вы можете добавить syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"в ~/.vim/syntax/cpp.vim. (Кстати, если это C ++, используйте cstdlib, а не stdlib.h .)
muru
3
Я только что заметил, что с мая 2014 года существует открытый вопрос .
Мартин Турной
@muru Это, похоже, решило проблему. Я в порядке с использованием быстрого взлома на данный момент. Спасибо!
Джейк
2
@Carpetsmoker Я не уверен в соответствии синтаксиса, чтобы точно знать, что делает мое изменение. Я думаю, что это будет просто совпадение с цифрой, следующей за любым количеством цифр или одинарных кавычек, плюс ullпуш, но я не знаю, совпадет ли это с каким-то неверным регистром. И, очевидно, C ++ 14 допускает разделитель в восьмеричных, двоичных, шестнадцатеричных литералах и числах с плавающей запятой и после десятичной точки в числах с плавающей запятой. Это намного больше, чем я готов взять на себя.
Муру

Ответы:

4

ВИМ-JP / ВИМ-каст репо включены эти изменения в июле 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\)\>"

Если вы не хотите использовать этот репозиторий, вы можете добавить эти строки в ~/.vim/syntax/cpp.vim.

Мартин Турной
источник