【问题标题】:Syntax highlighting of C function calls in emacsemacs 中 C 函数调用的语法高亮显示
【发布时间】:2010-12-20 14:59:55
【问题描述】:

我在 emacs 中使用 C 的自定义语法高亮主题,但我错过了高亮函数调用的可能性。例如:

int func(int foo)
{
    return foo;
}

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

在这个例子中,有什么方法可以突出对“func”的调用吗? 宏是否也被突出显示并不重要。 if、switch 或 sizeof 等关键字不应匹配。

谢谢!

【问题讨论】:

    标签: c emacs syntax-highlighting


    【解决方案1】:

    关键字列表中的条目顺序很重要。因此,如果您将条目放在突出显示关键字和函数声明的条目之后,这些将不会匹配。

    (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))))
    

    【讨论】:

      【解决方案2】:
      (font-lock-add-keywords 'c-mode
                         '(("\\<\\([a-zA-Z_]*\\) *("  1 font-lock-keyword-face)))
      

      在您的 .emacs 中。将 font-lock-keyword-face 替换为您想要的(M-X list-faces-display 以获取预定义的列表)。

      【讨论】:

      • 非常感谢!有什么方法可以避免匹配函数声明和关键字?
      • 这可能是可能的,但我不知道如何不看文档。从 C-H F 开始并给出 font-lock-add-keywords 作为函数(C-H V 请求帮助以获取变量,font-lock-keywords 是另一个候选起点)。
      【解决方案3】:

      您可以尝试 Ctrl-s 搜索或 Ctrl-r 向后搜索。 Emacs 将为您突出显示您的功能。

      【讨论】:

      • 谢谢,但我正在寻找一种方法,将所有函数调用永久着色为着色主题的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2012-03-11
      • 2014-04-07
      • 2010-10-26
      • 2011-02-11
      相关资源
      最近更新 更多