メジャーモードのリロードなしでemacsのフォントロックキーワードを更新する
-
07-07-2019 - |
質問
SLIMEを少し修正して、現在ロードされているすべてのシンボルをLispから取得し、分析して、フォントロックでフォントをフォント化できるようにします。
これらのすべての手順を実行できましたが、小さな問題があります。フォントロックでキーワードリストが変更された場合、メジャーlispモードを再起動しない限り、バッファは更新されません。キーワードを更新するたびにlispモードを再起動したくないのは、ファイルを初めて読み込むときにのみ実行したいlispモードにいくつかのフックがあるためです。
すべての新しいキーワードを読み取り、それに応じてバッファをフォント化するように、フォントロックを更新する他の方法はありますか? font-lockをオフにして font-lock-fontify-buffer
を使用しても、トリックは実行されません。
UPD:報奨金を追加しました-質問はまだ残っています。メジャーモードをリロードせずにfont-lockキーワードをリロードする方法が必要です。
解決
OK、代わりにこれはどうですか:
(defun my-font-lock-restart ()
(interactive)
(setq font-lock-mode-major-mode nil)
(font-lock-fontify-buffer))
他のヒント
メジャーモードをトリガーしても、font-lockが機能するわけではありません。私はSLIMEやlisp-modeの内部に精通していませんが、変数を設定するだけで動作するはずです。 font-lock-modeを切り替えると、 font-lock-fontify-buffer
と同様に、新しいキーワードを念頭に置いてfont-lockがフォントの再フォント化を開始します。
私はほとんどcperl-modeをハックしますが、これは cperl-init-faces
(内部フォントロック変数を設定する)とフォントロックの再起動の単純な問題です。 lisp-modeは、 cperl-init-faces
への呼び出しを必要としないことを除いて、それほど違わないはずです;)
編集:lisp-interaction-modeのいくつかの実験により、font-lock-modeを再起動することさえ厳密には必要ないことが明らかになりました。何らかの方法でフォント化を再トリガーする限り、font-lock-keywordsを変更するだけで十分です。 (テキストの編集、font-lock-fontify-bufferなど)
一時的にモードフック変数をクリアして再起動できます:
(defun my-restart-lisp-mode ()
(interactive)
(let ((lisp-mode-hook nil))
(normal-mode)))