別のメジャーモードでバッファの領域をフォント化する


12

Ansibleモジュールのドキュメントを表示するバッファーがあります。このバッファには、すべての標準的なものを提供する独自のメジャーモードがあります。特に、インラインマークアップ、オプション、セクションなどを強調表示するためにバッファをフォント化します。全体として、これはに非常によく似ていM-x manます。

ドキュメントの下部には、通常、YAMLのコード例がいくつかあります。これらもフォント化したいと思います。もちろん、YAMLに独自のフォントロックキーワードを追加することもできますが、YAMLモードのフォント化を再利用したいです。

どうやってやるの?具体的には、バッファの特定の領域をフォント化するために、どのように異なるメジャーモードを使用できますか?

この地域では、YAMLモードをアクティブにする必要はありません。バッファ全体はパッシブなディスプレイバッファに過ぎず、編集することを意図したものではありません。私は本当にその地域でYAMLモードがアクティブであるかのように生成されたフォントのみを必要とします。

バッファーの領域を一時バッファーにコピーし、YAMLモードを有効にし、バッファーをフォント化し、すべてのテキストプロパティをコピーできると想定しています。それはうまくいくでしょうか?その場合、テキストプロパティをコピーする方法、およびコピーする関連プロパティは何ですか?または、より良いアプローチがありますか?


非yamlフォント化はどのように実装されますか?テキストプロパティを手動で適用しますか、それともfont-lock-modeを使用しますか?
マラバルバ

:このポスト集計そこにオプションの少なくともかなりの部分のリンクwisdomandwonder.com/link/8610/...
grettke

回答:


10

私は最近、同様の問題に遭遇しました。基本的に、他のソースを入手したドキュメントのコードスニペットをフォント化したかったのです。私はあなたの答えの終わりに向かって言及されたアプローチに従い、それは私のためにうまくいった。私が次のようなものになった機能

(defun my-fontify-yaml (text)
  (with-temp-buffer
    (erase-buffer)
    (insert text)
    (delay-mode-hooks (yaml-mode))
    (font-lock-default-function 'yaml-mode)
    (font-lock-default-fontify-region (point-min)
                                      (point-max)
                                      nil)
    (buffer-string)))

@Malabarbaがコメントで指摘したように、宛先バッファがfont-lock-modeを使用している場合、上記の簡単なアプローチは機能しません。しかし私たちは、文字列がすでにフォントのテキストプロパティを設定することによりロックされていることを信じるように、フォント・ロック・モードをだましことができますfont-lock-faceface、(我々が得るface我々は上記の機能を使用する場合、プロパティセットを)とテキストプロパティを設定fontifiedしますt。次の関数は、上記の関数によって返された文字列を受け取り、必要な処理を行って、文字列がフォント化されて挿入されるようにします(これはorg-modeのorg-src-font-lock-fontify-block関数から取得されます

(defun my-fontify-using-faces (text)
  (let ((pos 0))
    (while (setq next (next-single-property-change pos 'face text))
      (put-text-property pos next 'font-lock-face (get-text-property pos 'face text) text)
      (setq pos next))
    (add-text-properties 0  (length text) '(fontified t) text)
    text))

次のように使用できます

(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))

これは私が見つけたのと同じ解決策sx.elですが、宛先バッファーがfont-lock-modeを使用しない場合にのみ機能することに注意することが重要です。
マラバルバ14

正しい!私は、バッファで使用されるので、フォントロックが(ヘルプバッファ)を使用していなかったところ、私はちょうど私のために働いたこれを実現
イクバルアンサリを

@Malabarbaは、フォント・ロック・モードで宛先バッファを持つこの作品を作るための方法が有効見つかった
イクバルアンサリを

感謝します、完璧動作します!
lunaryorn 14

いいね!助けてくれてうれしいです:)
イクバルアンサリ14

3

Library Narrow Indirectnarrow-indirect)はここで役立ちます-ヘッダーのコメントをご覧ください。以下に依存します。

  1. バッファ上の一部に編集を制限するナローイング、および
  2. 間接モードバッファ。メジャーモードを変更できる別のバッファにコピーします。

ナローイングは初心者には使いにくいと見なされるため、デフォルトでは無効になっています(デフォルトのバインディングはC-x n n)。以下をinitファイルに入れることで有効にできます:

(put 'narrow-to-region 'disabled nil)

またmyfn-narrow-indirectconfで私の手作りを見ることができます。


狭めることは実際にフォントロックに影響しますか?つまり、狭められた領域の外側からそれを遠ざけますか?フォントロックは実際にバッファ制限を削除しませんか?
lunaryorn 14

とにかく、wikiパッケージはオプションではありません。
lunaryorn 14

さらに、disabledEmacs Lispから呼び出すためにコマンドからプロパティを削除する必要はありません。インタラクティブな使用にのみ影響します。
lunaryorn 14

0

org-modeソースブロックにこの機能を提供するorg-src-font-lock-fontify-blockを確認することをお勧めします。関連する部分を別のバッファにコピーし、そこでメジャーモードを有効にしてから、フォント化されたテキストをコピーして戻すようです。ハックしますが、うまくいくようです。


2
この回答は、問題に対処するための推奨される方向性を提供する限りコメントのように見えますが、完全な回答ではありません。コメントに変更することを検討してください。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.