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

Я ищу способ периодически проверять, были ли файлы в определенном каталоге изменены с момента последней проверки (функциональные возможности похожи на демон FAM или на каталог gio.monitor_directory). В emacs lisp.

  • Есть ли какая-либо библиотека / фрагмент, обеспечивающий эту функцию?
  • Если нет, как я могу реализовать такую ​​функцию?

Ответы [ 3 ]

6 голосов
/ 11 августа 2010
(defun install-monitor (file secs)
  (run-with-timer
   0 secs
   (lambda (f p)
     (unless (< p (second (time-since (elt (file-attributes f) 5))))
       (message "File %s changed!" f)))
   file secs))

(defvar monitor-timer (install-monitor "/tmp" 5)
  "Check if /tmp is changed every 5s.")

Чтобы отменить,

(cancel-timer monitor-timer)

Редактировать:

Как упоминалось mankoff, приведенный выше фрагмент кода отслеживает изменение файла в течение последних 5 секунд, а не с момента последней проверки.Чтобы добиться последнего, нам нужно будет сохранять атрибуты каждый раз, когда мы проводим проверку.Надеюсь, что это работает:

(defvar monitor-attributes nil
  "Cached file attributes to be monitored.")

(defun install-monitor (file secs)
  (run-with-timer
   0 secs
   (lambda (f p)
     (let ((att (file-attributes f)))
       (unless (or (null monitor-attributes) (equalp monitor-attributes att))
         (message "File %s changed!" f))
       (setq monitor-attributes att)))
   file secs))

(defvar monitor-timer (install-monitor "/tmp" 5)
  "Check if /tmp is changed every 5s.")
1 голос
/ 11 августа 2010

У меня нет правильного решения, но, возможно, пара указателей, чтобы направить вас в нужном направлении.

Согласно некоторым быстрым поискам, кажется, что dbus имеет встроенные интерфейсы inotify.Начиная с последней версии emacs вы можете получить доступ к интерфейсу dbus через Emacs lisp (по крайней мере, под Linux), возможно, вы можете подключить все это вместе, чтобы все заработало.Вот пример использования dbus с Emacs:

http://emacs -fu.blogspot.com / 2009/01 / using-d-bus-example.html

0 голосов
/ 22 июня 2018

Emacs связывается с различными библиотеками-наблюдателями файловой системы и представляет унифицированный интерфейс в filenotify.el.

...