Vim sintaksis menyoroti literal angka dengan pemisah digit tanda kutip tunggal

9

C ++ 14 memberi kita pilihan untuk menggunakan tanda kutip tunggal untuk memisahkan digit literal angka besar. Ini mematahkan penyorotan sintaks Vim.

Misalnya, pertimbangkan program C ++ 14 berikut:

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

Ketika saya melihat ini di Vim, saya melihat penyorotan sintaks berikut (perhatikan bahwa saya menggunakan beberapa skrip penyorotan tambahan ):

Penyorotan sintaks Vim untuk program yang dijelaskan di atas

Saya ingin semua angka huge_number_againtampak merah. Apakah ada modifikasi yang dapat saya lakukan pada salah satu file sintaks saya atau saya ~/.vimrcuntuk memperbaikinya?

Jake
sumber
Saya melihat beberapa dukungan untuk C ++ 14 ditambahkan dalam v7.4.923 (literal biner). Tapi sepertinya bukan pemisah angka: - / File C ++ terbaru dari sini juga tampaknya belum memilikinya.
Martin Tournoij
4
Untuk memperbaiki cepat, Anda mungkin dapat menambahkan syn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>"ke ~/.vim/syntax/cpp.vim. (Btw, kalau itu C ++, gunakan cstdlib, bukan stdlib.h .)
muru
3
Saya baru memperhatikan ada masalah terbuka sejak Mei 2014 btw.
Martin Tournoij
@uru Itu tampaknya telah memperbaiki masalah. Saya baik-baik saja dengan menggunakan peretasan cepat untuk saat ini. Terima kasih!
Jake
2
@Carpetsmoker Saya tidak yakin dengan sintaks yang cocok untuk mengetahui apa yang dilakukan perubahan saya. Saya pikir itu hanya akan cocok dengan digit diikuti sejumlah digit atau tanda kutip tunggal, ditambah ullbulu, tetapi saya tidak tahu apakah itu akan cocok dengan beberapa kasus yang tidak valid. Dan ternyata C ++ 14 memungkinkan pemisah dalam oktal, biner, hex literal dan mengapung dan setelah titik desimal dalam mengapung. Itu jauh lebih banyak daripada yang saya bersedia lakukan.
muru

Jawaban:

4

The vim-jp / vim-cpp repo termasuk perubahan ini di 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\)\>"

Jika Anda tidak ingin menggunakan repo ini, Anda dapat menambahkan baris ini ke ~/.vim/syntax/cpp.vim.

Martin Tournoij
sumber