Hervorheben der Vim-Syntax von numerischen Literalen mit einfachen Anführungszeichen

9

C ++ 14 bot uns die Möglichkeit, einfache Anführungszeichen zu verwenden, um die Ziffern großer numerischer Literale zu trennen. Dies unterbricht die Syntaxhervorhebung von Vim.

Betrachten Sie beispielsweise das folgende C ++ 14-Programm:

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

Wenn ich dies in Vim ansehe, wird die folgende Syntax hervorgehoben (beachten Sie, dass ich einige zusätzliche Hervorhebungsskripte verwende ):

Hervorheben der Vim-Syntax für das oben beschriebene Programm

Ich möchte, dass alle Ziffern huge_number_againrot angezeigt werden. Gibt es eine Änderung, die ich an einer meiner Syntaxdateien oder an meiner vornehmen kann, ~/.vimrcum dies zu korrigieren?

Jake
quelle
Ich sehe, dass in Version 7.4.923 (binäre Literale) Unterstützung für C ++ 14 hinzugefügt wurde. Aber nicht das Zahlentrennzeichen, wie es scheint: - / Die neuesten C ++ - Dateien von hier scheinen es auch noch nicht zu haben.
Martin Tournoij
4
Für eine schnelle Lösung, können Sie wahrscheinlich hinzufügen syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"zu ~/.vim/syntax/cpp.vim. (Btw, wenn das C ++, verwendet cstdlib, nicht stdlib.h .)
muru
3
Ich habe gerade bemerkt, dass es seit Mai 2014 übrigens ein offenes Thema gibt.
Martin Tournoij
@muru Das scheint das Problem behoben zu haben. Ich kann vorerst einen schnellen Hack verwenden. Vielen Dank!
Jake
2
@Carpetsmoker Ich bin mir nicht sicher, ob die Syntax übereinstimmt, um genau zu wissen, was meine Änderung bewirkt. Ich denke, es wird nur mit einer Ziffer übereinstimmen, gefolgt von einer beliebigen Anzahl von Ziffern oder einfachen Anführungszeichen plus dem ullFlaum, aber ich weiß nicht, ob es mit einem ungültigen Fall übereinstimmt. Und anscheinend erlaubt C ++ 14 das Trennzeichen in Oktal-, Binär-, Hex-Literalen und Gleitkommazahlen und nach dem Dezimalpunkt in Gleitkommazahlen. Das ist viel mehr, als ich annehmen möchte.
Muru

Antworten:

4

Das Repo vim-jp / vim-cpp enthielt diese Änderung im Juli 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\)\>"

Wenn Sie dieses Repo nicht verwenden möchten, können Sie diese Zeilen hinzufügen ~/.vim/syntax/cpp.vim.

Martin Tournoij
quelle