3

私が質問をするのは、質問と考えられる答えの両方が、 を定義する Lisp コードを書く Emacs ユーザーの助けになると思うからですfont-lock-keywords。私は役立つと思う1つの答えを提供しています。私は他の答えにも興味があります。

その変数の値は式のリストであり、それぞれが一致する 1 つまたは複数のパターンまたは一致を実行する関数、および一致するテキストを強調表示するための 1 つまたは複数のフェイスを指定できます。値の可能性font-lock-keywordsは多数あり、複雑です。(これについて説明しているドキュメントは、Elisp マニュアルの nodeSearch-based Fontificationです。)

ほとんどの場合、リストには複数の要素があり、これは複数の正規表現パターンを意味します。これらはさまざまな方法で相互作用できます。他の人が効果を発揮するのを妨げるものもあれば、他の人の効果を変えるものもあります。たとえば、私のライブラリDired+font-lock-keywordsは Dired モードで 31 のエントリ (正規表現) を定義しており、その多くは相互作用します。

そのすべてをまっすぐに保つ方法は?このようなリストを定義または変更するときに、 どのようにデバッグしますか? リスト項目の 1 つを除くすべてをコメントアウトして、単独での効果を確認することができます。そして、別のものを繰り返します。そして、おそらくいくつかを一緒に、そしておそらく異なる順序で追加します. いろいろな可能性があると思いますが、いったい何をしているのですか?

(わかりました、ほとんどの Elisp コーダーは超複雑なfont-lock-keywords定義を記述しないことを知っています。しかし、単純な定義であっても、これは複雑になる可能性があります。おそらく、このプロセスがより簡単であれば、ユーザーは自分自身を 1 つまたは 2 つのエントリに不必要に制限することはないでしょう。)

4

2 に答える 2

6

新しくリリースされたFont Lock Studioを使用できます。以下は readme ファイルからのものです。

font-lock-studio - Font Lock キーワード用の対話型デバッガー

Font Lock Studioは、Font Lock キーワード (Emacs 構文強調表示ルール)の対話型デバッガーです。

序章

Font Lock Studio では、Font Lock キーワード (マッチャー、ハイライト、アンカー ルール)を1 ステップで実行できるため、バッファーがフォント化されたときに何が起こるかを確認できます。ルール上またはルール内にブレークポイントを設定し、ヒットするまで実行できます。ルール内では、一致は背景色のパレットを使用して視覚化されます。説明者は平文の英語でルールを説明できます。 Edebugとの緊密な統合により、Font Lock キーワードの一部である Lisp 式にステップ インできます。

デバッガーを使用すると、インターフェイス バッファーが表示されます。これにはすべてのキーワードが含まれており、一致データのナビゲーションと可視化に使用されます。

Font Lock Studio が開始されると、コメントと文字列は以前の構文段階の一部であるため (Font Lock Studio ではサポートされていません)、事前に色付けされます。

「Mx font-lock-studio RET」と入力してデバッガを起動します。? 使用可能なコマンドについては、メニューを押すか参照してください。

を使用するバッファの場合html-mode、インターフェイス バッファは次のようになります。他の主要なモードには通常、ますます複雑なルールがあります。左側の矢印は、現在アクティブな場所を示しています。ソース バッファ内の対応する矢印は、現在の検索位置に配置されます。

        ========================
        === Font Lock Studio ===
        ========================
    --------------------------------------------------
=>  "<\\([!?][_:[:alpha:]][-_.:[:alnum:]]*\\)"
      (1 font-lock-keyword-face)
    --------------------------------------------------
    "</?\\([_[:alpha:]][-_.[:alnum:]]*\\)\\(?::\\([_:[:alpha:]]
    [-_.:[:alnum:]]*\\)\\)?"
      (1
       (if
           (match-end 2)
           sgml-namespace-face font-lock-function-name-face))
      (2 font-lock-function-name-face nil t)
    --------------------------------------------------
    "\\(?:^\\|[ \t]\\)\\([_[:alpha:]][-_.[:alnum:]]*\\)\\(?::
    \\([_:[:alpha:]][-_.:[:alnum:]]*\\)\\)?=[\"']"
      (1
       (if
           (match-end 2)
           sgml-namespace-face font-lock-variable-name-face))
      (2 font-lock-variable-name-face nil t)
    --------------------------------------------------
    "[&%][_:[:alpha:]][-_.:[:alnum:]]*;?"
      (0 font-lock-variable-name-face)
    --------------------------------------------------
    "<\\(b\\(?:ig\\|link\\)\\|cite\\|em\\|h[1-6]\\|rev\\|s\\(?:
    mall\\|trong\\)\\|t\\(?:itle\\|t\\)\\|var\\|[bisu]\\)
    \\([ \t][^>]*\\)?>\\([^<]+\\)</\\1>"
      (3
       (cdr
        (assoc-string
         (match-string 1)
         sgml-tag-face-alist t))
       prepend)
    ==================================================
    Public state:
      Debug on error     : YES
      Debug on quit      : YES
      Explain rules      : YES
      Show compiled code : NO

スペースを押すと、すべてのキーワードをシングル ステップで表示します。"n" は次のキーワードに移動し、"b" はブレークポイントを設定し、"g" は最後 (または次のブレークポイント) まで実行し、"q" は終了します。

特徴

ステッピング

Font Lock キーワードの、、およびにシングルステップで移動できます。固定ルールは完全にサポートされています。さらに、最後または次のブレークポイントまで実行できます。

ブレークポイント

キーワードの一部、マッチャー (正規表現など)、ハイライト ルール、または固定されたハイライト ルール内にブレークポイントを設定できます。

ブレークポイントで停止せずにステップ実行または実行する場合は、コマンドの前にC-u.

固定ルールでは、ルール全体または個々の部分にブレークポイントを設定できることに注意してください。前者の場合、外側の括弧のみが強調表示されます。

試合データの可視化

キーワードまたはアンカーされたハイライトのマッチャーが実行された後、ソース バッファー、正規表現、および対応するハイライト ルールの背景色を使用して、一致データ (検索で見つかったものは何でも) が視覚化されます。正規表現またはハイライトの一部が一致しなかった場合、色付けされません。これは、たとえば、後置正規表現演算子?が使用された場合に発生する可能性があります。

内側の一致グループは外側のグループよりも優先されることに注意してください。これは、ハイライト ルールが正規表現またはソース バッファーに表示されない色を取得する状況につながる可能性があります。たとえば、マッチャー "\(abc\)" はマッチ 1 の色で色付けされますが、ハイライト ルール `(0 a-face)' はマッチ 0 の色を取得します。

正規化されたキーワード

インターフェイスに表示されるキーワードは正規化されています。たとえば、代わりに

     ("xyz" . font-lock-type-face)

キーワード

      ("xyz" (0 font-lock-type-face))

示されています。詳細font-lock-studio-normalize-keywordsについては、を参照してください。

説明者

説明者は、Font Lock キーワードの現在の部分の人間が読める説明をエコーし​​ます。これは、ルール内のすべてのnil:s とt:s が実際に意味することを理解するのに役立ちます。

自動説明機能を使用すると、Font Lock Studio は各コマンドの後に説明をエコーし​​ます。

Edebug -- Emacs Lisp デバッガ

Edebug との緊密な統合により、インターフェイス バッファー内のキーワードに埋め込まれた単一ステップの式が可能になり、ソース ファイルでデバッグするために呼び出された関数をインストルメント化できます。

フォローモードの認識

ソース バッファー内の検索位置は、オーバーレイ矢印とポイントの更新によって視覚化されます。ソース バッファが複数の横に並んだウィンドウに表示され、フォロー モードが有効になっている場合、スクロールを最小限に抑えるために検索場所が適切なウィンドウに表示されます。

于 2014-01-27T21:03:35.793 に答える
0

この問題を解決するために、Iciclesマルチ コマンドicicle-font-lock-keywords. 次のようなことができます。

  • 個別のfont-lock-keywordsエントリ (パターン) を切り替えて、個別に適用してそれぞれの効果を確認します。

  • 個々のエントリを選択して個別に適用すると、同じ結果が得られます。

  • 一連のエントリを選択して適用します。エントリは に表示される順序と同じですfont-lock-keywords。これを何セットでも行うことができます。

  • 複数のエントリ セットの効果を、選択した順序で累積します。

  • 元に戻す。すべてのエントリの効果をまとめて確認します。つまり、すべてのfont-lock-keywords.

そして、そのすべてをコマンドの 1 回の呼び出しで任意の順序で実行できます。

M-oは Facemenu と font-locking のプレフィックス キーなので、 IcicleモードM-o Iのときはこのコマンドを key に置きます。

于 2014-01-14T22:50:08.017 に答える