1

メジャーモードのフォントロックを設定しようとしています。コード例を次に示します。

USING: foo bar bar ;

IN: fuelcolors

TUPLE: font < super-class
    name
    size
    bold?
    italic?
    { foreground initial: COLOR: black }
    { background initial: COLOR: white } ;

TUPLE: rgb red green blue ;

: foobar ( seq -- seq )
  hello there { 1 2 3 } ;

名前、サイズ、ボールド?、イタリック?、前景、背景、赤、緑、青。タプルのスロットの名前を表します。

一致した領域が連続していないため、正規表現ではそれができないことはわかっています。イタリック?および前景は一致する必要がありますが、これらの記号の間の { 文字は一致しません。その代わりに、Dmitri がここで提供しているものと同様の font-lock マッチャー関数を作成できると考えました: Context-sensitive font-locking in emacs for a very similar problem.

しかし、彼のソリューションは、ハイライトするアイテムの「シーケンス」が括弧内にあるという事実を利用していますが、ここではそうではありません。

Font-lock はこのような状況で問題を抱えています (正規表現と font-lock の一致数が不明です) が、font-lock の内部をハッキングする必要がある場合でも、「十分な」解決策を望んでいます。

4

2 に答える 2

1

これには、マッチャー関数が適しているようです。

2 つの関数を使用します。1 つTUPLEはメンバーの検索の制限を照合して設定するために使用できる関数で、もう 1 つは各要素を検索するための内部マッチャーです。内部関数は、構造を認識するように記述できます{ name ... }

トリックは、要素ごとに内部関数が 1 回呼び出されるため、一致数が不明になるという状況は決してありません。

ルールは次のようになります。

'(my-match-a-tuple
  (1 'font-lock-keyword-name-face)    ;; Highlight the word TUPLE
  (my-match-tuple-member
   ;; Pre-match form (can be used move the point around and to set search limits)
   nil
   ;; Post-match form (can be used to move point around afterwords)
   nil
   (1 'font-lock-variable-face)))

cmake スクリプトをフォント化するための私のパッケージを見ることができます。これはマッチャー関数を多用します: https://github.com/Lindydancer/cmake-font-lock

于 2013-08-09T20:49:35.157 に答える
0

これが私が最終的に得た解決策です:

(,"\\(TUPLE\\):[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\(?:[ \n]+<[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\)?"
     (1 'factor-font-lock-parsing-word)
     (2 'factor-font-lock-type-name)
     (3 'factor-font-lock-type-name nil t)
     ("\\(\\(?:\\sw\\|\\s_\\)+\\)\\|\\(?:{[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)[^}]+\\)"
      ((lambda (&rest foo)
         (save-excursion
           (re-search-forward " ;" nil t)
           (1- (point)))))
      nil
      (1 'factor-font-lock-symbol nil t)
      (2 'factor-font-lock-symbol nil t)))
于 2013-09-21T12:23:58.510 に答える