Evidenziazione della sintassi di Vim di valori letterali numerici con separatori di cifre a virgoletta singola


9

C ++ 14 ci ha fornito la possibilità di usare virgolette singole per separare le cifre di grandi letterali numerici. Ciò interrompe l'evidenziazione della sintassi di Vim.

Ad esempio, considera il seguente programma 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 lo vedo in Vim, vedo la seguente evidenziazione della sintassi (nota che sto usando alcuni script di evidenziazione aggiuntivi ):

Evidenziazione della sintassi di Vim per il programma sopra descritto

Vorrei che tutte le cifre fossero huge_number_againrosse. È possibile apportare una modifica a uno dei miei file di sintassi o al mio ~/.vimrcper correggerlo?


Vedo che è stato aggiunto un supporto per C ++ 14 in v7.4.923 (valori binari letterali). Ma non sembra il separatore di numeri: - / Anche gli ultimi file C ++ da qui sembrano non averlo ancora.
Martin Tournoij,

4
Per una soluzione rapida, puoi probabilmente aggiungere syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"a ~/.vim/syntax/cpp.vim. (A proposito, se questo è C ++, usa cstdlib, no stdlib.h .)
Muru

3
Ho appena notato che c'è un problema aperto da maggio 2014 a proposito.
Martin Tournoij,

@muru Sembra aver risolto il problema. Per ora sto bene usando un trucco rapido. Grazie!
Jake,

2
@Carpetsmoker Non sono sicuro della corrispondenza della sintassi per sapere esattamente cosa fa la mia modifica. Penso che corrisponderà a una cifra seguita da un numero qualsiasi di cifre o virgolette singole, più la ulllanugine, ma non so se corrisponderà a un caso non valido. E apparentemente C ++ 14 consente il separatore in ottali, binari, valori letterali esadecimali e float e dopo la virgola decimale in float. È molto più di quello che sono disposto ad affrontare.
Muru,

Risposte:


4

Il repository vim-jp / vim-cpp includeva questa modifica a luglio 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 non si desidera utilizzare questo repository, è possibile aggiungere queste righe a ~/.vim/syntax/cpp.vim.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.