1

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

1 に答える 1

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

メタデータ内のコロンを認識させるために、最後のマッチャー正規表現を追加する必要がありました。私が行った他の変更と、それを行ったこの最終的な変更に関してそれらのいずれかがどれほど重要であったかについてはまだわかりませんが、確かにこれは重要なものでした.

于 2012-10-13T12:06:41.533 に答える