Emacs C++模式:突出显示转换和大小of

5
我正在使用标准(预装)的Emacs C++模式,但我有一个小问题需要解决。我该如何正确地突出显示C ++中sizeof内部的类型和casts
例如:
  1. Cast

    Type *pointer = reinterpret_cast <Type *>(original);

  2. Sizeof

    std :: cout << sizeof(Type)<<“\ n”;


你所说的“适当突出显示”是什么意思?你想要类型名称与声明变量时的类型名称以相同的方式突出显示,还是有其他更“适当”的方式可以突出显示它? - Andrew
我希望在声明变量时,类型名称也能像变量一样被突出显示。 - John Bellone
鉴于在 sizeof(X) 中,X 是类型还是变量完全取决于上下文,你需要多准确的结果呢? - Pavel Minaev
1个回答

4
将以下表达式添加到您的.emacs中,或使用M-:进行评估。

Sizeof(这是两种情况中更容易的一种)

正则表达式突出显示括号内由sizeof前导的任何字母数字字符、空格和星号(由方括号表达式[...]表示;有关语法,请参见下面的注释)的任意组合。

(font-lock-add-keywords 'c++-mode
  '(("\\<sizeof[[:space:]]*(\\([[:alnum:][:space:]*]+\\))"
  1 font-lock-type-face t)))

数字1告诉emacs只使用font-lock-type-face这个样式来高亮第一个子表达式(由\\(...\\)标记),t表示覆盖任何先前的高亮。

您可以使用M-x customize group [RET] font-lock-faces [RET]来查看和更改可用的样式。

C++类型转换

我不确定您想要突出显示哪个类型名——“原始”类型还是转换后的类型。此突出显示器会将两者都标记出来:

(font-lock-add-keywords 'c++-mode
  '(("\\<[[:alnum:]]+_cast[[:space:]]*<\\([[:alnum:][:space:]*]+\\)>[[:space:]]*(\\([[:alnum:][:space:]*]+\\))"
  (1 font-lock-type-face t)
  (2 font-lock-type-face t))))

再次说明,'1and2`选择相应的子表达式。
请注意:类型名称的正则表达式并不完全符合C++语法。例如,emacs会高亮显示诸如sizeof(int * 32)之类的无意义内容。
此外,我的解决方案没有考虑Pavel在你的问题评论中提到的问题;即您还可以在变量上使用sizeof,这需要进行不同的突出显示。我认为除了在字体锁定代码中实现完整的C解析器外,这是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接