Подсветка синтаксиса вызовов функций C в emacs

Я использую тему подсветки пользовательского синтаксиса для C в emacs, но мне не хватает возможности подсветки вызовов функций. Например:

int func(int foo)
{
    return foo;
}

void main()
{
    int bar = func(3);
}

есть ли способ выделить вызов "func" в этом примере? Не имеет значения, выделяются ли макросы. Ключевые слова, такие как if, switch или sizeof, не должны совпадать.

спасибо!

3 ответов


порядок записей в списке ключевых слов является значительным. Поэтому, если вы поместите свои записи после тех, которые выделяют ключевые слова и объявления функций, они не будут совпадать.

(font-lock-add-keywords 'c-mode
  '(("\(\w+\)\s-*\("
    (1 rumpsteak-font-lock-function-call-face)))
  t)

кроме того, вы можете использовать функцию вместо регулярного выражения как MATCHER. Перебор для вашего вопроса, если вы точно изложили свои требования, но полезны в более сложных случаях. Непроверенный (набранный непосредственно в браузере, на самом деле, поэтому я даже не гарантирую сбалансированный скобки.)

(defun rumpsteak-match-function-call (&optional limit)
  (while (and (search-forward-regexp "\(\w+\)\s-*\(" limit 'no-error)
              (not (save-match-data
                     (string-match c-keywords-regexp (match-string 1))))
              (not (save-excursion
                     (backward-char)
                     (forward-sexp)
                     (c-skip-whitespace-forward)
                     (or (eobp) (= ?\{ (char-after (point)))))))))
(font-lock-add-keywords 'c-mode
  '((rumpsteak-match-function-call
    (1 rumpsteak-font-lock-function-call-face))))

(font-lock-add-keywords 'c-mode
                   '(("\<\([a-zA-Z_]*\) *("  1 font-lock-keyword-face)))

в свой .в Emacs. Замените font-lock-keyword-face на тот, который вы хотите (M-X list-faces-display, чтобы получить список предопределенных).


вы можете попробовать Ctrl-s для поиска или Ctrl-r для поиска назад. Emacs выделит вашу функцию для вас.