使用font-lock-add-keywords定义新关键字会中断/覆盖变量名称着色(emacs)

时间:2011-11-01 11:20:30

标签: emacs text-coloring font-lock

我试图让emacs在C中添加一些额外的关键字。特别是,我要添加RESTRICT。我做了:

(add-hook 'c-mode-common-hook
      (lambda ()
        (font-lock-add-keywords nil
                    '(("\\<\\(RESTRICT\\)\\>" . font-lock-keyword-face))) ))

然而,这(不出所料)只会导致emacs使用keyword-face为“RESTRICT”实例着色。

“restrict”(小写)已经是emacs对C关键字的了解的一部分。所以,如果我宣布:

int * restrict foo;

“int”用type-face着色,“restrict”用keyword-face着色,“foo”用variable-name-face着色。但是用我新的RESTRICT字,如果我宣布:

int * RESTRICT bar;

“int”与以前一样着色,RESTRICT用keyword-face着色。但“酒吧”对它没有任何影响。如果没有我的规则,“RESTRICT”将变为color-name-face,而“bar”将是未修改的,这是正确的。

无论如何,问题是:如何在变量名面的第二个代码块中使用emacs颜色“bar”?我希望emacs实际上将“RESTRICT”视为语言中的关键字(以便变量名称变为彩色),而不仅仅是“RESTRICT”的颜色实例。

1 个答案:

答案 0 :(得分:0)

我的猜测是你想以某种方式想要在cc-langs.el(cc模式的一部分)中覆盖这个定义:

(c-lang-defconst c-type-modifier-kwds
  "Type modifier keywords.  These can occur almost anywhere in types
but they don't build a type of themselves.  Unlike the keywords on
`c-primitive-type-kwds', they are fontified with the keyword face and
not the type face."
  t    nil
  c    '("const" "restrict" "volatile")
  c++  '("const" "volatile" "throw")
  objc '("const" "volatile"))

然而,我不是cc模式的专家,但我找不到一种明显的方式来覆盖这种绑定。