実際、Emacsは、フォントロックモードの「アンカーマッチ」機能を使用して、これを行うために必要なものを提供します。構文は少し厄介ですが、追加の「マッチャー」(基本的には正規表現、部分式識別子、および面名)を指定できます。これは、(デフォルトで)メインの「マッチャー」regexpが終了した位置に続いて適用されます。行の終わり。適用するテキストの範囲を正確にカスタマイズするためのより複雑な方法がありますが、それが一般的な考え方です。
これは、目的のために自分の顔を定義する方法も示す簡単な例です。
(defface bioseq-mode-a
'((((min-colors 8)) :foreground "red"))
"Face for As in bioseq-mode")
(defface bioseq-mode-g
'((((min-colors 8)) :foreground "blue"))
"Face for Gs in bioseq-mode")
(setq dna-keyword
'(("^\\+" ("A" nil nil (0 'bioseq-mode-a)))
("^\\+" ("G" nil nil (0 'bioseq-mode-g)))))
1つのメインマッチャーに2つ以上のアンカーマッチャーを指定することもできます(ここでのメインマッチャーは正規表現"^\\+"
です)。これを機能させるには、最初のアンカーされたマッチャーが検索を開始する前に、行の先頭に明示的に戻る必要があります。それ以外の場合は、前のアンカーされたマッチャーが最後に出現した後にのみ強調表示を開始します。これは、PRE-MATCH-FORMスロット(リストの要素2、以下を参照)に(行頭)を挿入することによって実現されます。
(setq dna-keyword
'(("^\\+"
("A" nil nil (0 'bioseq-mode-a))
("G" (beginning-of-line) nil (0 'bioseq-mode-g)))))
私はそれがあなたが好む好みの問題だと思います。2番目の方法は、1行に多数の異なるアンカーマッチャーがある場合、コードが少し明確になる可能性がありますが、パフォーマンスに大きな違いがあるとは思えません。
以下のドキュメントの関連ビットは次のfont-lock-defaults
とおりです。
HIGHLIGHTは、MATCH-HIGHLIGHTまたはMATCH-ANCHOREDのいずれかである必要があります。
[....]
MATCH-ANCHOREDは、次の形式である必要があります。
(MATCHER PRE-MATCH-FORM POST-MATCH-FORM MATCH-HIGHLIGHT ...)
ここで、MATCHERは、上記のMATCH-HIGHLIGHTと同様に、検索する正規表現または検索を行うために呼び出す関数名ですが、1つの例外があります。下記参照。PRE-MATCH-FORMとPOST-MATCH-FORMは最初の前に評価され、最後の後にインスタンスMATCH-ANCHOREDのMATCHERが使用されます。したがって、MATCHERを使用する前に初期化し、後でクリーンアップするために使用できます。通常、PRE-MATCH-FORMは、MATCH-ANCHOREDのMATCHERで開始する前に、元のMATCHERに対してある位置に移動するために使用されます。POST-MATCH-FORMは、MATCH-ANCHOREDの親のMATCHERで再開する前に、戻るために使用される場合があります。
上記の例外は以下のとおりです。MATCHER検索の制限は、PRE-MATCH-FORMが評価された後、デフォルトで行末になります。ただし、PRE-MATCH-FORMが評価された後の位置よりも大きい位置を返す場合、その位置が検索の制限として使用されます。一般に、行の終わりよりも大きい位置を返すことはお勧めできません。つまり、MATCHER検索で行にまたがるようにすることはお勧めできません。
フォントロックのドキュメントを3回ほど読んでからでないと、意味がわかりません;-)