なぜメジャーモードは単に顔を検査しないのですか?


10

メジャーモードを作成する場合、「文字列内のポイントはどこにあるのか?」「コメントにポイントがありますか?」

ほとんどの主要なモードは、プログラミング言語を解析しようとするようです。例えば:

  • python-syntax-content 呼び出し syntax-ppss
  • haskell-fill-paragraph呼び出しsyntax-ppssre-search-forward
  • c-in-comment-line-prefix-p ポイントを移動して呼び出します looking-at
  • sp-point-in-comment呼び出しますsyntax-ppssが、コメント区切りにあるかどうかもチェックします

ただし、これが機能しない場合もあります。org-modeバッファでは、ソースブロック内のコメントはこれらのアプローチでは正しく検出されません。

バッファはすでにハイライトされコメントを表示しているのでそれも無意味に見えます

代わりに、ポイントで面を単に検査することができます:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

なぜメジャーモードはこれを行わないのですか?バッファはすでにフォント化されているので、これはより高速で、より堅牢で、必要なコードが少ないと思います。


1
この質問が好きです。ただし、使用しない場合はどうなりますfont-lock-modeか?(私があなたがするべきだと思うわけではありません。)
mbork 2014年

回答:


12

問題は、それがより堅牢ではないということです。

まず、メジャーモードは、コメントまたは文字列を決定するためのモードです。フォントロックの目的でそれらをうまく定義できた場合、他の目的でも同じことができるはずです。

第二に、ポイントが内部にあるコンテキストを決定するために構文を読むことは、正しく行われる場合、それを行うためのより堅牢な方法です。それが失敗するインスタンスを見つけた場合、メジャーモードの作者にバグレポートを提出する価値があります。


面の検査の堅牢性が低下する理由は、状況によっては失敗する可能性があるためです。

  1. 手始めに、ユーザーは無効になっている可能性がありますfont-lock-mode(おそらくそれは巨大なバッファーです)が、font-lock-mode有効にされていても、顔はやや不安定です。

  2. また、ユーザーは、いくつかを追加するマイナーモードfont-lock-keywordsTODOコメントの強調表示など)を持つことができます。あるいは、font-lockがバッファーをフォント化した後に動的に一部の面を適用するマイナーモードがあるかもしれません。

要約すると、メジャーモードは、それによって定義された面が現在適用されている面であることを保証しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.