Emacs - уведомлять, когда файл был изменен извне - PullRequest
5 голосов
/ 11 августа 2011

Как мне заставить emacs уведомить меня о том, что один или несколько посещенных файлов изменены из других источников?Вот как эта функциональность реализована в Gedit:

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 ]

2 голосов
/ 12 августа 2011

Вот то, что я смог придумать - большое спасибо ребятам из EmacsWiki за подсказки. Я создал обратный вызов, который запускается каждые несколько секунд - он проверяет время выполнения и отображает раздражающее сообщение, если файл был изменен.

С другой стороны, решение в основном работает и уведомляет меня об изменениях независимо от того, был ли изменен буфер или нет. С другой стороны, он включает в себя постоянный опрос текущего файла для 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")))))))
2 голосов
/ 12 августа 2011

Если вы хотите, чтобы предупреждение также содержало грязные буферы, вы можете посоветовать переключиться в буфер, поэтому, когда вы переключаетесь в буфер и он модифицируется, он будет проверять, изменен ли файл, и если да, то он может предложить вернутьсяэто как встроенная проверка в случае неизмененных буферов.

...