Podświetlanie składni literowych Vima za pomocą separatorów pojedynczych cudzysłowów

9

C ++ 14 zapewnił nam możliwość użycia pojedynczych cudzysłowów do oddzielenia cyfr dużych literałów liczbowych. To łamie podświetlanie składni Vima.

Rozważmy na przykład następujący program 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;
}

Kiedy przeglądam to w Vimie, widzę następujące podświetlanie składni (zauważ, że używam dodatkowych skryptów podświetlających ):

Podświetlanie składni Vima dla programu opisanego powyżej

Chciałbym, żeby wszystkie cyfry były huge_number_againczerwone. Czy mogę zmodyfikować jeden z moich plików składniowych lub ~/.vimrcpoprawić to?

Jake
źródło
Widzę pewne wsparcie dla C ++ 14 zostało dodane w wersji 7.4.923 (literały binarne). Ale wydaje się, że nie jest to separator liczb: - / Wydaje się, że najnowsze pliki C ++ tutaj jeszcze go nie mają.
Martin Tournoij
4
Aby szybko naprawić, prawdopodobnie możesz dodać syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"do ~/.vim/syntax/cpp.vim. (Btw, jeśli to C ++, użyj cstdlib, nie stdlib.h .)
muru
3
Właśnie zauważyłem, że istnieje otwarty problem od maja 2014 roku.
Martin Tournoij
@muru To chyba naprawiło problem. Na razie nie mam nic przeciwko szybkiemu hakowaniu. Dzięki!
Jake
2
@Carpetsmoker Nie jestem pewien dopasowania dopasowania składni, aby wiedzieć dokładnie, co robi moja zmiana. Myślę, że po prostu dopasuje cyfrę po dowolnej liczbie cyfr lub pojedynczych cudzysłowów plus ullpuch, ale nie wiem, czy pasuje do jakiejś nieprawidłowej wielkości. I najwyraźniej C ++ 14 pozwala na separator w liczbach ósemkowych, dwójkowych, szesnastkowych i liczbach zmiennoprzecinkowych oraz po kropce dziesiętnej w liczbach zmiennoprzecinkowych. To o wiele więcej, niż jestem w stanie przyjąć.
muru

Odpowiedzi:

4

Vim-jp / vim-cpp repo zawarte tę zmianę w lipcu 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\)\>"

Jeśli nie chcesz korzystać z tego repozytorium, możesz dodać te wiersze do ~/.vim/syntax/cpp.vim.

Martin Tournoij
źródło