1

carバッファ内の特定のフォーム(そのフォームで識別される)を「監視」し、編集するたびに評価するようにEmacsに指示したいと思います。

私が考えることができる1つのアプローチは、に関数を追加することです。この関数post-self-insert-hookは、ターゲットフォームを見つけて解析し、以前に保存された状態と比較します。

特に「1秒あたりの呼び出し数」の最大値が適用されている場合(たとえば、を使用している場合)、それほど非効率に聞こえることはありませんcurrent-time

これを達成するためのより高いレベル/より慣用的な方法はありますか?すでに解決されているような問題のようです。

4

2 に答える 2

3

最も自然な方法は、フォームの最初から最後までのオーバーレイを作成することだと思います。

オーバーレイには Modification -hooksプロパティがあり、ウォッチャー関数を追加できます。

オーバーレイは、バッファーの内容を厳密に内部で変更すると適切に縮小または拡大しますが、フォームの端でバッファーを編集する場合はどうするかを決める必要があります。およびmake-overlayの最後の 2 つの引数を参照insert-in-front-hooksしてください。これらのほとんどの場合、新しい境界を確認するために、おそらくオーバーレイを再作成するだけです。insert-behind-hooks

「1 秒あたりの呼び出し数」については、run-with-idle-timer を使用できます。

于 2012-12-29T21:47:03.190 に答える
2

@Dmitryが言及したものの一部は、単純なプロトタイプに変えることができます。マーク(message "text")して実行M-xeval-on-modify-add

(defun eval-on-modify-add ()
  (interactive)
  (let ((ov (make-overlay (region-beginning) (region-end))))
    (overlay-put ov 'modification-hooks '(eval-on-modify-execute))))

(defun eval-on-modify-execute (ov &optional flag &rest rv)
  (if flag
      (eval-region (overlay-start ov) (overlay-end ov))))

(message "test")
于 2013-01-03T01:29:43.140 に答える