4

私は最近emacsに移動しましたが、数字が強調表示されるのに慣れています。ここから簡単にハックすると、次のようになります.emacs

(add-hook 'after-change-major-mode-hook
      '(lambda () (font-lock-add-keywords 
                   nil 
                   '(("\\([0-9]+\\)" 
                      1 font-lock-warning-face prepend)))))

これは良いスタートを与えます、すなわち、任意の数字が強調表示されます。ただし、私は正規表現の完全な初心者であり、理想的には次の動作を希望します。

  • また、浮動小数点の一部である場合は小数点を強調表示します(例:12.34)。
  • 次/単語の一部である場合は、数字のどの部分も強調表示しないでください。たとえば、次の場合:foo11 ba11r 11spam、「1」のいずれも強調表示しないでください
  • 科学的記数法を許可するには、2つの整数内の「e」を許可します(必須ではありません、ボーナスクレジット)

残念ながら、これは私が投稿するのが嫌いな「私のためにこれを行う」質問に非常によく似ていますが、私はこれまでのところ、自分でまともな進歩を遂げることができませんでした。

私が得た限りでは[^a-zA-Z][0-9]+[^a-zA-Z]、どちらかの側の文字以外のもの(たとえば等号)と一致することを発見していますが、これはすべて、強調表示に隣接する記号を含めることです。「どちらの側にも文字がない場合にのみ数字を強調表示する」ことを伝える方法がわかりません。

もちろん、正規表現が複雑な構文の強調表示を使用する方法であるとは想像できないので、emacsのアイデアで適切な数を強調表示することも歓迎します。

どんな助けでも大歓迎です。(違いが生じる場合は、Pythonコーディング時に使用します。)

4

2 に答える 2

6

スクラッチ バッファに移動し、テスト テキストを入力することから始めます。そこにいくつかの数字、いくつかの数字を含むいくつかの識別子、いくつかの欠落した部分 ( など.e12) などを入れます。これらはテストケースになり、迅速に実験できます。実行M-x re-builderして正規表現ビルダー モードに入ります。これにより、現在のバッファーのテキストに対して任意の正規表現を試して、一致するものを確認できます。これは非常に便利なモードです。ずっと使えます。Emacs Lisp では正規表現を文字列に入れる必要があるため、すべてのバックスラッシュを 2 倍にする必要があることに注意してください。あなたはすでにそれを正しく行っていますが、ここでそれらを 2 倍にするつもりはありません。

したがって、一致を識別子の一部ではない数字に限定するのは非常に簡単です。\b は単語の境界に一致するため、正規表現のいずれかの末尾に配置すると、単語全体に一致します

最初の文字クラスにピリオドを追加するだけで、フロートを一致させることができます[0-9.]。残念ながら、それはそれ自体でピリオドに一致する可能性があります。本当に必要なのは[0-9]*\.?[0-9]+で、これは 0 個以上の数字と、それに続くオプションのピリオドとそれに続く 1 つ以上の数字に一致します。

先頭の符号は と一致する[-+]?ため、負の数が得られます。

指数を一致させるには、オプションの group: が必要です。\(...\)?これは強調表示にのみ使用しており、実際にはグループのコンテンツを分離する必要がないため、 を実行できます\(?:...\)。これにより、正規表現マッチャーの時間が少し節約されます。グループ内では、"e" ( [eE])、オプションの記号 ( [-+]?)、および 1 つ以上の数字 ( [0-9]+) を一致させる必要があります。

すべてをまとめると: [-+]?\b[0-9]*\.?[0-9]+\(?:[eE][-+]?[0-9]+\)?\b. 「+」と「-」の文字が単語の境界を作成するため、オプションの記号を最初の単語の境界の前に置いたことに注意してください。

于 2013-02-20T13:47:46.590 に答える
5

まず、add-hookとをなくしlambdaます。font-lock-add-keywords呼び出しも必要ありません。のみにこれが必要な場合はpython-mode、モード記号を の代わりに最初の引数として渡しますnil

第二に、それを行う主な方法は 2 つあります。

  1. 数字の周りにグループ化構造を追加します。font-lock-keywords フォームの数字はグループに対応しているため、これは'(("\\([^a-zA-Z]\\([0-9]+\\)[^a-zA-Z]\\)" 2 font-lock-warning-face prepend). ただし、ここでは外側のグループ化はあまり役に立たないので、これを単純化して'(("[^a-zA-Z]\\([0-9]+\\)[^a-zA-Z]" 1 font-lock-warning-face prepend).

  2. 記号のバックスラッシュ構造の最初と最後を使用するだけです。次に、正規表現は次のようになります\_<[0-9]+\_>。ここで一致全体を強調表示できるため、グループ番号は必要ありません: '(("\\_<[0-9]+\\_>" . font-lock-warning-face prepend). python-modeバリエーションとして、単語の先頭と単語の末尾の構造を使用できますが、アンダースコアに隣接する数字や、構文 class に含まれる他の文字 (存在する場合) を強調表示したくない場合がありますsymbol

そして最後に、おそらく必要はありませんprepend。数値は、これより前はすべて強調表示されていない可能性が高く、 のような他のマイナー モードとの相互作用の可能性を考慮する場合はwhitespace、 を選択するかappend、この要素を完全に省略した方がよいでしょう。

最終結果:

(font-lock-add-keywords nil '(("\\_<[0-9]+\\_>" . font-lock-warning-face)))
于 2013-02-20T13:34:41.733 に答える