การเน้นไวยากรณ์เป็นกลุ่มของตัวอักษรตัวเลขที่มีตัวคั่นหลักเดียวที่มีเครื่องหมายคำพูด


9

C ++ 14 ทำให้เรามีตัวเลือกในการใช้เครื่องหมายคำพูดเดี่ยวเพื่อแยกตัวเลขของตัวอักษรตัวเลขขนาดใหญ่ สิ่งนี้จะหยุดยั้งการเน้นไวยากรณ์ของ Vim

ตัวอย่างเช่นพิจารณาโปรแกรม 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;
}

เมื่อฉันดูสิ่งนี้ใน Vim ฉันเห็นการเน้นไวยากรณ์ต่อไปนี้ (โปรดทราบว่าฉันกำลังใช้สคริปต์การเน้นเพิ่มเติมบางส่วน):

เน้นไวยากรณ์เป็นกลุ่มสำหรับโปรแกรมที่อธิบายไว้ข้างต้น

ฉันต้องการให้ตัวเลขทั้งหมดเป็นhuge_number_againสีแดง มีการแก้ไขที่ฉันสามารถทำกับหนึ่งในไฟล์ไวยากรณ์ของฉันหรือ~/.vimrcเพื่อแก้ไขนี้ได้หรือไม่


ฉันเห็นการสนับสนุนบางอย่างสำหรับ C ++ 14 ถูกเพิ่มใน v7.4.923 (ตัวอักษรไบนารี) แต่ดูเหมือนจะไม่ใช่ตัวคั่นตัวเลข: - / ไฟล์ C ++ ล่าสุดจากที่นี่ดูเหมือนจะยังไม่มี
Martin Tournoij

4
สำหรับการแก้ไขอย่างรวดเร็วคุณอาจจะสามารถเพิ่มการsyn match cNumber display contained "\d\(\d\|'\)*\(u\=l\{0,2}\|ll\=u\)\>" ~/.vim/syntax/cpp.vim(Btw ถ้านั่นคือ C ++, การใช้งานcstdlib, ไม่ stdlib.h .)
Muru

3
ฉันเพิ่งสังเกตเห็นว่ามีปัญหาเปิดตั้งแต่พฤษภาคม 2014 btw
Martin Tournoij

@muru ดูเหมือนว่าจะแก้ไขปัญหาได้แล้ว ตอนนี้ฉันสบายดีแล้วที่ใช้แฮ็คอย่างรวดเร็ว ขอบคุณ!
Jake

2
@Carpetsmoker ฉันไม่แน่ใจว่าการจับคู่ไวยากรณ์จะรู้ว่าการเปลี่ยนแปลงของฉันทำอะไร ฉันคิดว่ามันจะตรงกับตัวเลขตามจำนวนตัวเลขใด ๆ หรือคำพูดเดียวบวกกับullปุย แต่ฉันไม่รู้ว่ามันจะตรงกับกรณีที่ไม่ถูกต้อง และเห็นได้ชัดว่า C ++ 14 อนุญาตให้ตัวแยกเป็นแปดฐานแปดตัวอักษรฐานสิบหกและลอยและหลังจุดทศนิยมในลอย นั่นมากเกินกว่าที่ฉันจะยอมทำ
muru

คำตอบ:


4

เป็นกลุ่ม-jp / กลุ่ม-CPP repo รวมการเปลี่ยนแปลงนี้ในเดือนกรกฎาคม 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\)\>"

หากคุณไม่ต้องการใช้ repo นี้คุณสามารถเพิ่มบรรทัดเหล่านี้~/.vim/syntax/cpp.vimได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.