Vim resaltado de sintaxis de literales numéricos con separadores de dígitos de comillas simples

9

C ++ 14 nos proporcionó la opción de usar comillas simples para separar los dígitos de literales numéricos grandes. Esto rompe el resaltado de sintaxis de Vim.

Por ejemplo, considere el siguiente 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;
}

Cuando veo esto en Vim, veo el siguiente resaltado de sintaxis (tenga en cuenta que estoy usando algunos scripts de resaltado adicionales ):

Vim resaltado de sintaxis para el programa descrito anteriormente

Me gustaría que todos los dígitos huge_number_againaparezcan rojos. ¿Hay alguna modificación que pueda hacer en uno de mis archivos de sintaxis o en mi ~/.vimrcpara corregir esto?

Jake
fuente
Veo que se agregó algún soporte para C ++ 14 en v7.4.923 (literales binarios). Pero no parece el separador de números: - / Los últimos archivos C ++ de aquí tampoco parecen tenerlo todavía.
Martin Tournoij
44
Para una solución rápida, probablemente pueda agregar syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"a ~/.vim/syntax/cpp.vim. (Por cierto, si eso es C ++, use cstdlib, no stdlib.h .)
muru
3
Acabo de notar que hay un problema abierto desde mayo de 2014 por cierto.
Martin Tournoij
@muru Eso parece haber solucionado el problema. Estoy bien con el uso de un truco rápido por ahora. ¡Gracias!
Jake
2
@Carpetsmoker No estoy seguro de la coincidencia de sintaxis para saber exactamente qué hace mi cambio. Creo que solo coincidirá con un dígito seguido de cualquier número de dígitos o comillas simples, más la ullpelusa, pero no sé si coincidirá con algún caso no válido. Y aparentemente C ++ 14 permite el separador en octales, binarios, literales hexadecimales y flotantes y después del punto decimal en flotantes. Eso es mucho más de lo que estoy dispuesto a asumir.
muru

Respuestas:

4

El repositorio vim-jp / vim-cpp incluyó este cambio en julio 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\)\>"

Si no desea utilizar este repositorio, puede agregar estas líneas a ~/.vim/syntax/cpp.vim.

Martin Tournoij
fuente