Определение новых ключевых слов с помощью font-lock-add-keywords прерывает/переопределяет окраску имени переменной (emacs)

Я пытался заставить emacs раскрасить некоторые дополнительные ключевые слова в C. В частности, я добавил RESTRICT. Я сделал:

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

Однако это (что неудивительно) просто заставляет emacs окрашивать экземпляры «RESTRICT» с помощью ключевого слова-лица.

"restrict" (нижний регистр) уже является частью знаний emacs о ключевых словах C. Итак, если я объявлю:

int * restrict foo;

«int» окрашен шрифтом, «restrict» — ключевым словом, а «foo» — именем переменной. Но с моим новым словом RESTRICT, если я объявлю:

int * RESTRICT bar;

«int» окрашен, как и раньше, а RESTRICT окрашен ключевым словом. Но "бар" на него не влияет. Без моего правила «RESTRICT» было бы окрашено имя-переменной-лицом, а «bar» не было бы изменено, что правильно.

Во всяком случае, вопрос: как я могу сделать «полосу» цвета emacs во втором кодовом блоке с именем переменной? Я хочу, чтобы emacs фактически рассматривал «RESTRICT» как ключевое слово в языке (чтобы имена переменных окрашивались), а не просто окрашивал экземпляры «RESTRICT» определенным образом.


person ehliu    schedule 01.11.2011    source источник


Ответы (1)


я предполагаю, что вы каким-то образом хотите переопределить это определение в cc-langs.el (часть cc-mode):

(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, но я не смог найти очевидный способ переопределить эту привязку.

person jtahlborn    schedule 02.11.2011
comment
Интересно, спасибо. Я тоже не знаю, как это переопределить. Я супер новичок в этом; эта штука с блокировкой шрифта была самым сложным изменением, которое я пробовал. В любом случае на машине есть только файл cc-langs.elc; Я предполагаю, что c означает скомпилирован. Но ссылка, похоже, обрабатывает файлы CUDA, расширяя c-mode? Так что, возможно, я смогу сделать что-то подобное... как только пойму, как это работает. Теперь, когда я знаю, что хочу добавить к c-type-modifier-kwds, должен ли я создать новый поток? - person ehliu; 07.11.2011