2011-08-11 7 views
4

1つまたは複数の訪問済みファイルが他の場所から変更されたという事実をemacsに通知するにはどうすればよいですか?ここでは、この機能がGeditの中に実装されている方法は次のとおりです。EmacsWikiで"Revert Buffer"文書で説明し、回避策(私の個人的な好みのために少し修正された)のようなものを見つけEmacs - ファイルが外部で変更されたときに通知する

gedit - notify about external changes

私はアプローチを見て撮影しました。

(global-set-key (kbd "<f5>") (lambda() 
    (interactive) 
    (if (string= (buffer-name) ecb-directories-buffer-name) 
    (refresh-ecb) 
    (if (buffer-modified-p) 
     (revert-buffer) ; ask for confirmation 
     (revert-buffer t t))))) ; don't ask for confirmation - it's unnecessary, since the buffer hasn't been modified 

これは素晴らしいですが、私が望むのは自動解決策です。たぶん、ある種のノイズの多いメッセージがバッファーにインライン展開されているかもしれません(スクリーンショットのように)。たぶん、Visual Studioで実装されているようなモーダルダイアログ(迷惑ですが、やっぱりやってみましょう)。あなたの提案は何ですか?

+2

バッファはEmacsの外で変更されたとき、Emacsは、質問と警告を表示しませんか?騒々しいほどではないですか? – Tom

+0

ええ、そうですが、バッファが汚れていないときと、入力を開始したときだけですが、バッファに切り替えると即座には効かなくなります。 –

+0

可能であれば、画像を更新してください –

答えて

2

ここで私が思いついたのは、EmacsWikiのヒントのおかげで大変感謝しています。私は数秒ごとに起動されるコールバックを作成しました。ファイルが変更されていると、modtimeをチェックし、迷惑なメッセージを表示します。

解決策のほとんどは、バッファが変更されているかどうかにかかわらず、ほとんどの場合ソリューションが変更を通知してくれます。欠点としては、modtimeの現在のファイルを常にポーリングすることですが、私の仕事のシナリオはそれを許容することができます。

emacs notify external changes

;(global-auto-revert-mode 1) 
(defun ask-user-about-supersession-threat (fn) "blatantly ignore files that changed on disk") 
(run-with-timer 0 2 'my-check-external-modifications) 
(add-hook 'after-save-hook 'my-check-external-modifications) 
(add-hook 'after-revert-hook 'my-check-external-modifications) 

(defun my-load-external-modifications() 
    (interactive) 
    (if (string= (buffer-name) ecb-directories-buffer-name) 
    (refresh-ecb) 
    (if (buffer-modified-p) 
     (revert-buffer) ; ask for confirmation 
     (revert-buffer t t)) ; don't ask for confirmation - it's unnecessary, since the buffer hasn't been modified 
    (my-check-external-modifications))) 

(defun my-overwrite-external-modifications() 
    (interactive) 
    (clear-visited-file-modtime) 
    (set-buffer-modified-p (current-buffer)) 
    (save-buffer) 
    (my-check-external-modifications)) 

(defun my-check-external-modifications() 
    (if (verify-visited-file-modtime (current-buffer)) 
    (progn 
     (global-set-key (kbd "<f5>") 'my-load-external-modifications) 
     (global-set-key (kbd "C-s") 'save-buffer) 
     (setq header-line-format tabbar-header-line-format)) 
    (progn 
     (global-set-key (kbd "<f5>") 'my-load-external-modifications) 
     (global-set-key (kbd "C-s") 'my-overwrite-external-modifications) 
     (setq header-line-format (format "%s. Press F5 to load external changes, C-s to overwrite them" 
     (propertize "This file has been changed externally" 'face '(:foreground "#f00"))))))) 
+0

あなたはwiki WRTを読み返すことをお伝えしましたが、ここでも言及したいと思います。多くの場合、自動復帰モードまたはグローバル自動復帰モードが良い解決策です。このモードでは、auto-revert-mode-intervalおよびauto-revert-mode-hook変数による変更が許可されます。 あなたのコードサンプルは一番上にコメントアウトされたglobal-auto-revert-modeを持っているので、このアプローチを検討したことは知っていますが、他の人にとっては役に立つかもしれません。 –

+0

これは私のために働いていません。どうすればデバッグできますか? – manu

+0

私のコードはあなたがインストールしていないECBへの参照を持っている可能性があります。また、あなたと私のemacsバージョン(私は23.2.1です)との間に矛盾があるかもしれません。最後に、私が知っている2つのオプションがあります:1)emacsで--emacsでエラーをデバッグするために--debug-initを使ってemacsを実行する、2)put(setq stack-trace-on-error t)または(setq debug-on-error t).emacsのどこかで実行時エラーをデバッグしてください。 –

2

汚れたバッファについても警告を表示したい場合は、switch-to-bufferにアドバイスすることができます。そのため、バッファに切り替えて変更したときにファイルが変更されているかどうかを確認し、変更されていないバッファの場合は組み込みのチェックと同じように元に戻します。

+0

うわー、ありがとう!私はswitch-to-buffer-hookのようなものを探しましたが、運が全くありません。アドバイスを作成することは間違いなく行ける方法です! –

関連する問題