2011-08-11 54 views
4

如何讓emacs通知我有關一個或多個訪問過的文件從其他位置更改的事實?這裏的這個功能是如何Gedit的實施:Emacs - 在文件被外部修改時通知

gedit - notify about external changes

我已經採取一看辦法的"Revert Buffer"文件在EmacsWiki解釋,發現不大不小的解決辦法(修改了一下我的個人喜好)的:

(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變量進行修改。 我知道你考慮過這種方法,因爲你的代碼示例在頂部註釋掉了全局自動恢復模式,但它可能對其他人有用。 –

+0

這不適合我。我該如何調試它? – manu

+0

這可能是因爲我的代碼有可能沒有安裝的ECB引用。另外,你的和我的emacs版本之間可能會有差異(我的是23.2.1)。最後,在emacs中調試你有兩個選擇,我知道的東西:1)用--debug-init運行emacs來調試.emacs中的錯誤,2)put(setq stack-trace-on-error t)或setq debug-on-error t)在你的.emacs的某個地方去調試運行時錯誤。 –

2

如果你想要髒緩衝區的警告,那麼你可以建議切換到緩衝區,所以當你切換到一個緩衝區並修改它時,它會檢查文件是否被修改,如果是,那麼它可以提供給在沒有修改的緩衝區的情況下將其恢復爲內置檢查。

+0

哇,謝謝!我已經搜索了像switch-to-buffer-hook之類的東西,但沒有任何運氣。創建建議絕對是一種方式! –

相關問題