【问题标题】:Extending c-mode, based on Java, how to tweak annotations?扩展c-mode,基于Java,如何调整注解?
【发布时间】:2012-10-12 19:52:33
【问题描述】:

我正在为 Emacs 修改 Haxe 模式。它基于c-mode,Java语言。

创建此模式后,语言引入了新的结构,风格类似于Java注解,除了一件事:

@:macro public function foo() { ... }

也是一个注解。 IE。 "@:macro" 部分是一个注解,但 c-mode 将注解视为必须是 "@" 符号后跟字母(一旦它看到 ":",它认为它是注解的结尾)。

它用于解析注释的规则是什么,我将如何修改它?

以下是我尝试做的事情,但它不起作用,我也不确定这是正确的方法。

(defadvice c-forward-annotation
  (around haxe-forward-annotation ())
  "Overrides `c-forward-annotation' to be able to use @:\w+ syntax as well
as the Java original syntax."
  (message "c-forward-annotation overloaded")
  (and (looking-at "@")
       (progn (forward-char) t)
       (if (looking-at ":")
           (progn
             (forward-char)
             (c-forward-type))
         (c-forward-type))
       (progn (c-forward-syntactic-ws) t)
       (if (looking-at "(")
           (c-go-list-forward)
         t)))

该功能似乎确实可以正常工作,后来不起作用的是c-beginning-of-statement-1 - 但它太复杂了,无法找出实际发生的事情......

我尝试过的另一件事:

(c-lang-defconst c-symbol-start
  haxe (concat "[" c-alpha "_@]:?"))

但也没有帮助。甚至更多信息:如果我 C-c C-s 在包含 @:macro 的行上,我会得到 cpp-macro 语法,具有讽刺意味的是,这非常接近,但不是我需要的。

更多信息:通过覆盖c-beginning-of-macro,我可以让它相信它不是cpp-macro,但它仍然不能被识别为注释。我还覆盖了c-forward-decl-or-cast-1 中的位置,它有一个硬编码的正则表达式,用于测试 Java 风格的标识符......仍然不行:(

(c-lang-defconst c-basic-matchers-after ...)也改成下面了,还是不行……

,@(when (c-major-mode-is 'java-mode)
    `((eval . (list "\\<\\(@:?[a-zA-Z0-9]+\\)\\>" 1 c-annotation-face))))

【问题讨论】:

  • 查看 cc-engine.el 中 c-forward-label 的定义。

标签: emacs syntax-highlighting


【解决方案1】:

我想我终于找到了!

(c-lang-defconst c-cpp-matchers
  haxe (append
        (c-lang-const c-cpp-matchers c)
        '(("\\<\\([A-Z][A-Za-z0-9_]*\\)\\>" 1 font-lock-type-face))
        '(("\\<\\(@:?[A-Za-z]+\\)\\>" 1 c-annotation-face))))

我必须添加最后一个匹配器正则表达式以使其识别元数据中的冒号。我仍然不确定我所做的其他更改以及它们中的任何更改对于完成它的最终更改的重要性,但肯定这是一个重要的更改。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多