38

モードごとにテキストのスタイルを設定するために Emacs が使用するデフォルトのフェイスをどのように変更しますか?

たとえば、デフォルトの固定幅フォントを含む、顔のカスタマイズにすでに満足しているとします。ただし、ある特定のモード (markdown-mode.elなど) では、デフォルトのフォントを可変幅にしたいと考えています。

ヘッダー、リンクなどをマークダウン モードに合わせて簡単にスタイル設定できます。スタイル設定されたテキストの上にカーソルを置き、M-x describe-faceリンクをクリックしてカスタマイズするだけです。

ただし、デフォルトのフェイスは、他のフェイスが指定されていない場合に使用されるフェイスであるため、markdown-mode に固有のものではなく、変更すると他のすべてのモードに影響します。

markdown-mode-hookこのモードを使用してバッファのデフォルトの顔を設定するには、どの魔法を入れることができますか?

4

5 に答える 5

34

このようなものはどうですか:

(add-hook 'markdown-mode-hook (lambda () (variable-pitch-mode t))

その後、面をカスタマイズできvariable-pitchます。バッファ内の他の面は、デフォルトの面ではなく、これを継承します。

buffer-face-modeカスタマイズの詳細については、ドキュメントを参照してください。(BufFace は ... にも使用されtext-scale-increasetext-scale-decrease非常に便利です。)

于 2009-02-11T00:37:47.650 に答える
6

これは複雑すぎてその場で把握することができず、すでに時間予算を使い果たしてしまったため、部分的な回答をしなければなりません。

顔はフレーム プロパティです。フレームは同時に複数のバッファを表示できます。モードはバッファ プロパティです。モードごとに顔を変える方法を尋ねます。これらすべてを組み合わせると、この質問には完全に正しい答えが 1 つもないように思えます。

特定のフレームが複数のバッファーを表示しないと仮定すると、目的の答えを概算できます。実際にはこのようなものでそれを達成できますが、特別な表示正規表現と、マークダウンモードのバッファー名に一致する一連の正規表現を使用するように変更されています。

(append special-display-buffer-names
        '("*VC-log*"
          "*Help*"
          ("*Completions*" 
           (height . 25)
           (font . "8x13"))))

ただし、これはおそらくあなたが望むものではありません。あなたの質問は、単一のフレームの顔のプロパティを変更することを暗示しているようです。

フレームが一度に複数のバッファーを表示することはないと仮定すると、switch-to-buffer のアドバイスを試すことができます。しかし、それは十分に低いレベルではないかもしれませんし、遅すぎるかもしれません。(未テスト)

(defadvice switch-to-buffer (after switch-to-buffer activate compile)
  "change the frame's default face after switch-to-buffer"
  (doSomethingToChangePropertiesOfDefaultFace))

そして今、私の実際の(不完全な)答えのために...

より複雑ではありますが、より良いアプローチは、組み込みの顔のいずれかがまだ割り当てられていないすべての領域に新しい顔を使用するようにマークダウンモードに指示します。copy-face で新しい顔を作成し、set-face-* で興味深いプロパティを与えることができます。

font-lock.el の 946 行目付近の「フォント化関数」で始まるコメント ブロックで説明されているように、markdown-mode の font-lock-defaults を変更して、デフォルトの font-lock-fontify-region-function をオーバーライドします。おそらく、非常にわずかに変更された font-lock-default-fontify-region を使用して、実行直後に追加のステップを 1 つだけ実行できます。

  (unless font-lock-keywords-only
    (font-lock-fontify-syntactically-region beg end loudly))

追加のステップでは、font-lock-fontify-syntaxally-region と同様に領域を解析し、領域を「興味深い」サブ領域に分割します。しかし今回は、デフォルトの面を持つサブ領域を見つけて、それらのサブ領域を以前に作成した新しい面にテキスト プロパティで配置します。

全体として、これは .emacs ファイルの elisp の数行のみである必要があるように感じます。さらに、元のファイルとのわずかな違いしかない font-lock-default-fontify-region のコピーを作成します (新しい関数を 1 つ呼び出します)。さらに、font-lock-fontify-syntaxally-region のコピーを作成し、それを変更して入札を行います (最も難しい部分)。

実際、font-lock-fontify-syntaxally-region を「後」にアドバイスする場合は、おそらく font-lock-defaults または font-lock-default-fontify-region を変更する必要さえありません。

于 2009-02-11T09:39:42.420 に答える
5

-variable-pitchモードは素晴らしいです。このスレで知りました。しかし、それはさらに素晴らしいものにすることができます:

(dolist (hook '(erc-mode-hook
        LaTeX-mode-hook
        org-mode-hook
        edit-server-start-hook
        markdown-mode-hook))
  (add-hook hook (lambda () (variable-pitch-mode t))))

サンセリフ フォントを使用するモードをリストに追加するだけです。

于 2010-09-20T22:34:23.293 に答える
2

実際、emacs バージョン 22.3.1 でも簡単です…

次のことを試してください。

(progn 
  (set-buffer "your buffer name here")
  (overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face))
于 2010-01-13T22:21:51.337 に答える