5

生物学的配列データ(つまり、DNAとペプチド)を操作するためのEmacsメジャーモードを作成しようとしています。異なる文字の色が異なるシンタックスハイライトを実装したいと思います。モードはDNA配列とアミノ酸配列を区別し、それらを異なる色にする必要があるため、次の行がどのように示されるかを示す1文字のプレフィックス(+または#)を付けてファイル内の各配列を1行に配置します強調表示する必要があります。

したがって、たとえば、ファイルに次のような行が含まれている場合:

+AAGATCCCAGATT

「A」はすべて、他の行とは異なる1つの色である必要があります。

私はテストとして以下を試しました:

(setq dna-keyword
 '(("^\+\\([GCT\-]*\\(A\\)\\)*" (2 font-lock-function-name-face))
  )
)

(define-derived-mode bioseq-mode fundamental-mode
  (setq font-lock-defaults '(dna-keyword))
  (setq mode-name "bioseq mode")
)

しかし、それはすべてではなく最後のAにのみ一致します。

私の最初の考えは、行全体を1つの正規表現と一致させてから、別の正規表現を使用してその行内のAだけを一致させることでしたが、font-lock-modeのコンテキストでそれが可能かどうか、またはどのようになるかはわかりません。達成されました。そのようなことを行う方法、またはこれを別の方法で達成する方法についてのアイデアはありますか?

4

1 に答える 1

7

実際、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-MAT​​CH-FORM MATCH-HIGHLIGHT ...)

ここで、MATCHERは、上記のMATCH-HIGHLIGHTと同様に、検索する正規表現または検索を行うために呼び出す関数名ですが、1つの例外があります。下記参照。PRE-MATCH-FORMとPOST-MAT​​CH-FORMは最初の前に評価され、最後の後にインスタンスMATCH-ANCHOREDのMATCHERが使用されます。したがって、MATCHERを使用する前に初期化し、後でクリーンアップするために使用できます。通常、PRE-MATCH-FORMは、MATCH-ANCHOREDのMATCHERで開始する前に、元のMATCHERに対してある位置に移動するために使用されます。POST-MAT​​CH-FORMは、MATCH-ANCHOREDの親のMATCHERで再開する前に、戻るために使用される場合があります。

上記の例外は以下のとおりです。MATCHER検索の制限は、PRE-MATCH-FORMが評価された後、デフォルトで行末になります。ただし、PRE-MATCH-FORMが評価された後の位置よりも大きい位置を返す場合、その位置が検索の制限として使用されます。一般に、行の終わりよりも大きい位置を返すことはお勧めできません。つまり、MATCHER検索で行にまたがるようにすることはお勧めできません。

フォントロックのドキュメントを3回ほど読んでからでないと、意味がわかりません;-)

于 2012-04-29T00:04:25.007 に答える