【发布时间】: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 的定义。