Emacs の Haxe モードの変更に取り組んでいます。これは、c モード、Java 言語に基づいています。
このモードが作成された後、言語は新しい構造を導入しました。スタイルは Java アノテーションに似ていますが、次の 1 つの点が異なります。
@:macro public function foo() { ... }
も注釈です。つまり、"@: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
- しかし、実際に何が起こっているのかを知るには複雑すぎます...
私が試したもう1つのこと:
(c-lang-defconst c-symbol-start
haxe (concat "[" c-alpha "_@]:?"))
しかし、どちらも助けにはなりませんでした。さらに詳しい情報: IC-c C-sを含む行にいる場合、構文@:macro
を取得しcpp-macro
ます。これは皮肉なことに近いですが、必要なものではありません。
詳細: オーバーライドc-beginning-of-macro
することで、それが ではないと信じさせることができますcpp-macro
が、まだ注釈として認識されません。また、Java スタイルの識別子をテストするために、ハードコーディングされた正規表現があった場所をオーバーライドしましたc-forward-decl-or-cast-1
...まだ行きません :(
また(c-lang-defconst c-basic-matchers-after ...)
、以下に変更しましたが、それでもうまくいきません...
,@(when (c-major-mode-is 'java-mode)
`((eval . (list "\\<\\(@:?[a-zA-Z0-9]+\\)\\>" 1 c-annotation-face))))