バッファ変更状態にフックする方法は?


8

mode-line-modifiedバッファが変更された場合にモード行にアスタリスクを表示する組み込み変数など。

具体的にhl-line-modeは、バッファーが変更されている場合はオフに、変更されていない場合はオンにしたいと思います。

「フックの変更」に関するドキュメントを読みましたがhl-line-mode、モードラインのアスタリスクのように変更を取り消すときに切り替えたいのですが。


3
関連のフックは、ように見えるafter-change-functionsfirst-change-hook。何らかの理由で、変更されたバッファーから変更されていないバッファーへの取り消しがこれらのフックの「変更」としてカウントされない場合はundo、トグルを実行することをお勧めします。
ダン

buffer-modified-p変更が発生したかどうかをテストする関数も参照してください。私が使用していますafter-save-hookし、first-change-hook私のタブバー上の変更インジケータを切り替えること。
法律家、2014

3
元に戻すときに変更フックが完全に機能しない場合、最も確実な方法はpost-command-hookをチェックすることbuffer-modified-pです。
Malabarba 14

回答:


5

コメントに基づいて、ここに、あなたがやろうとしていることを達成する2つの方法があります。(十分にテストされていないため、YMMV。)

オプション1: post-command-hook

バッファが変更されているかどうかをテストする関数を作成し、それをにフックしますpost-command-hook

(defun hl-line-mode-toggle-maybe ()
  "Turn on `hl-line-mode' when buffer is unmodified, turn it off
when it is modified."
  (hl-line-mode (if (buffer-modified-p) -1 1)))

(add-hook 'post-command-hook #'hl-line-mode-toggle-maybe)

利点は、それがかなり単純であることです。欠点は、Emacsがすべてのコマンドの後にこのテストを実行することです。これはやり過ぎのようです。

オプション2: 、first-change-hookafter-save-hookおよびundo

hl-line-modeオフにしてにフックする関数を作成しますfirst-change-hook。オンにhl-line-modeしてにフックする関数を作成しますafter-save-hook。提供するafter上でアドバイスをundo回ってしまうようなhl-line-modeアンドゥが変更されていない状態にバッファを返したときに:

(defun hl-line-mode-off ()
  "Turn off `hl-line-mode'."
  (hl-line-mode -1))

(defun hl-line-mode-on ()
  "Turn off `hl-line-mode'."
  (hl-line-mode 1))

(add-hook 'first-change-hook #'hl-line-mode-off)
(add-hook 'after-save-hook   #'hl-line-mode-on)

(defadvice undo (after hl-line-when-unmodified activate)
  (unless (buffer-modified-p)
    (hl-line-mode 1)))

利点は、すべてのコマンドの後ではなく、これらの関数を頻繁に呼び出さないことです。不利な点は、アドバイスを掘り下げる必要があったことです。また、「ターンオンhl-line-mode」ステップをトリガーしない、バッファーを未変更の状態にする予期しない他の方法があるかもしれません。


ああ、はい、それを答えに入れてくれてありがとう。を使用しないように、2番目のオプションを使用することになりましたpost-command-hook
ナニー14

revert-bufferバッファを変更されていない状態にする別の一般的なケースのようです。を使用しafter-revert-hookてこれを処理できます。
グルカ2014

また、新しく開いたバッファのハイライトをオンにする方法も必要after-change-major-mode-hookです。おそらく?
グルカ2014

1
add-hooklocalパラメータがあるので、特定のメジャーモードまたはバッファでの動作をオーバーライドするだけの場合は、そうすることができます。
Wilfred Hughes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.