unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* filenotify.el
@ 2013-06-25 12:02 Michael Albinus
  2013-06-25 16:25 ` filenotify.el Rüdiger Sonderfeld
                   ` (2 more replies)
  0 siblings, 3 replies; 50+ messages in thread
From: Michael Albinus @ 2013-06-25 12:02 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 891 bytes --]

Hi,

I have written filenotify.el, which is intended as upper layer for
gfilenotify.c, inotify.c and w32notify.c. This is a simplified
interface, which offers just file change or file attribute change
notifications. I believe this is sufficient for the use-cases in Emacs;
if more fine granular notifications are needed, one could still use one
of the low-level packages.

The package is appended, together with needed changes in subr.el and
autorevert.el. I've tested it with gfilenotify and inotify; the tests
for w32notify I cannot perform as usual. There are still some changes
needed, but basic functionality shall be available.

Beside further tests and bug fixing, I plan to write ert tests as well
as a Tramp file name handler. Documentation is also lacking. But these
steps could be applied later, once there is an agreement about the
interface.

Comments?

Best regards, Michael.


[-- Attachment #2: filenotify.diff --]
[-- Type: text/x-diff, Size: 21329 bytes --]

=== modified file 'lisp/ChangeLog'
*** lisp/ChangeLog	2013-06-25 09:18:09 +0000
--- lisp/ChangeLog	2013-06-25 11:44:00 +0000
***************
*** 1,11 ****
  2013-06-25  Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
  
! 	* lisp/textmodes/bibtex.el (bibtex-generate-url-list): Add support
  	for DOI URLs.
  
  2013-06-25  Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
  
! 	* lisp/textmodes/bibtex.el (bibtex-mode, bibtex-set-dialect):
  	Update imenu-support when dialect changes.
  
  2013-06-25  Leo Liu  <sdl.web@gmail.com>
--- 1,23 ----
+ 2013-06-25  Michael Albinus  <michael.albinus@gmx.de>
+ 
+ 	* filenotify.el: New package.
+ 
+ 	* autorevert.el (top): Require filenotify.el.
+ 	(auto-revert-notify-enabled): Remove.  Use `file-notify-support'
+ 	instead.
+ 	(auto-revert-notify-rm-watch, auto-revert-notify-add-watch)
+ 	(auto-revert-notify-handler): Use `file-notify-*' functions.
+ 
+ 	* subr.el (file-notify-handle-event): Move function to filenotify.el.
+ 
  2013-06-25  Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
  
! 	* textmodes/bibtex.el (bibtex-generate-url-list): Add support
  	for DOI URLs.
  
  2013-06-25  Rüdiger Sonderfeld  <ruediger@c-plusplus.de>
  
! 	* textmodes/bibtex.el (bibtex-mode, bibtex-set-dialect):
  	Update imenu-support when dialect changes.
  
  2013-06-25  Leo Liu  <sdl.web@gmail.com>

=== modified file 'lisp/autorevert.el'
*** lisp/autorevert.el	2013-06-05 19:57:10 +0000
--- lisp/autorevert.el	2013-06-25 11:41:17 +0000
***************
*** 103,108 ****
--- 103,109 ----
  
  (eval-when-compile (require 'cl-lib))
  (require 'timer)
+ (require 'filenotify)
  
  ;; Custom Group:
  ;;
***************
*** 270,290 ****
    :type 'boolean
    :version "24.4")
  
! (defconst auto-revert-notify-enabled
!   (or (featurep 'gfilenotify) (featurep 'inotify) (featurep 'w32notify))
!   "Non-nil when Emacs has been compiled with file notification support.")
! 
! (defcustom auto-revert-use-notify auto-revert-notify-enabled
    "If non-nil Auto Revert Mode uses file notification functions.
  This requires Emacs being compiled with file notification
! support (see `auto-revert-notify-enabled').  You should set this
! variable through Custom."
    :group 'auto-revert
    :type 'boolean
    :set (lambda (variable value)
! 	 (set-default variable (and auto-revert-notify-enabled value))
  	 (unless (symbol-value variable)
! 	   (when auto-revert-notify-enabled
  	     (dolist (buf (buffer-list))
  	       (with-current-buffer buf
  		 (when (symbol-value 'auto-revert-notify-watch-descriptor)
--- 271,287 ----
    :type 'boolean
    :version "24.4")
  
! (defcustom auto-revert-use-notify file-notify-support
    "If non-nil Auto Revert Mode uses file notification functions.
  This requires Emacs being compiled with file notification
! support (see `file-notify-support').  You should set this variable
! through Custom."
    :group 'auto-revert
    :type 'boolean
    :set (lambda (variable value)
! 	 (set-default variable (and file-notify-support value))
  	 (unless (symbol-value variable)
! 	   (when file-notify-support
  	     (dolist (buf (buffer-list))
  	       (with-current-buffer buf
  		 (when (symbol-value 'auto-revert-notify-watch-descriptor)
***************
*** 502,513 ****
  	     (puthash key value auto-revert-notify-watch-descriptor-hash-list)
  	   (remhash key auto-revert-notify-watch-descriptor-hash-list)
  	   (ignore-errors
! 	     (funcall
! 	      (cond
! 	       ((fboundp 'gfile-rm-watch) 'gfile-rm-watch)
! 	       ((fboundp 'inotify-rm-watch) 'inotify-rm-watch)
! 	       ((fboundp 'w32notify-rm-watch) 'w32notify-rm-watch))
! 	      auto-revert-notify-watch-descriptor)))))
       auto-revert-notify-watch-descriptor-hash-list)
      (remove-hook 'kill-buffer-hook 'auto-revert-notify-rm-watch))
    (setq auto-revert-notify-watch-descriptor nil
--- 499,505 ----
  	     (puthash key value auto-revert-notify-watch-descriptor-hash-list)
  	   (remhash key auto-revert-notify-watch-descriptor-hash-list)
  	   (ignore-errors
! 	     (file-notify-rm-watch auto-revert-notify-watch-descriptor)))))
       auto-revert-notify-watch-descriptor-hash-list)
      (remove-hook 'kill-buffer-hook 'auto-revert-notify-rm-watch))
    (setq auto-revert-notify-watch-descriptor nil
***************
*** 522,621 ****
  
    (when (and buffer-file-name auto-revert-use-notify
  	     (not auto-revert-notify-watch-descriptor))
!     (let ((func
! 	   (cond
! 	    ((fboundp 'gfile-add-watch) 'gfile-add-watch)
! 	    ((fboundp 'inotify-add-watch) 'inotify-add-watch)
! 	    ((fboundp 'w32notify-add-watch) 'w32notify-add-watch)))
! 	  (aspect
! 	   (cond
! 	    ((fboundp 'gfile-add-watch) '(watch-mounts))
! 	    ;; `attrib' is needed for file modification time.
! 	    ((fboundp 'inotify-add-watch) '(attrib create modify moved-to))
! 	    ((fboundp 'w32notify-add-watch) '(size last-write-time))))
! 	  (file (if (or (fboundp 'gfile-add-watch) (fboundp 'inotify-add-watch))
! 		    (directory-file-name (expand-file-name default-directory))
! 		  (buffer-file-name))))
!       (setq auto-revert-notify-watch-descriptor
! 	    (ignore-errors
! 	      (funcall func file aspect 'auto-revert-notify-handler)))
!       (if auto-revert-notify-watch-descriptor
! 	  (progn
! 	    (puthash
! 	     auto-revert-notify-watch-descriptor
! 	     (cons (current-buffer)
! 		   (gethash auto-revert-notify-watch-descriptor
! 			    auto-revert-notify-watch-descriptor-hash-list))
! 	     auto-revert-notify-watch-descriptor-hash-list)
! 	    (add-hook (make-local-variable 'kill-buffer-hook)
! 		      'auto-revert-notify-rm-watch))
! 	;; Fallback to file checks.
! 	(set (make-local-variable 'auto-revert-use-notify) nil)))))
! 
! (defun auto-revert-notify-event-p (event)
!   "Check that event is a file notification event."
!   (and (listp event)
!        (cond ((featurep 'gfilenotify)
! 	      (and (>= (length event) 3) (stringp (nth 2 event))))
! 	     ((featurep 'inotify)
! 	      (= (length event) 4))
! 	     ((featurep 'w32notify)
! 	      (and (= (length event) 3) (stringp (nth 2 event)))))))
! 
! (defun auto-revert-notify-event-descriptor (event)
!   "Return watch descriptor of file notification event, or nil."
!   (and (auto-revert-notify-event-p event) (car event)))
! 
! (defun auto-revert-notify-event-action (event)
!   "Return action of file notification event, or nil."
!   (and (auto-revert-notify-event-p event) (nth 1 event)))
! 
! (defun auto-revert-notify-event-file-name (event)
!   "Return file name of file notification event, or nil."
!   (and (auto-revert-notify-event-p event)
!        (cond ((featurep 'gfilenotify) (nth 2 event))
! 	     ((featurep 'inotify) (nth 3 event))
! 	     ((featurep 'w32notify) (nth 2 event)))))
  
  (defun auto-revert-notify-handler (event)
    "Handle an EVENT returned from file notification."
!   (when (auto-revert-notify-event-p event)
!     (let* ((descriptor (auto-revert-notify-event-descriptor event))
! 	   (action (auto-revert-notify-event-action event))
! 	   (file (auto-revert-notify-event-file-name event))
! 	   (buffers (gethash descriptor
! 			     auto-revert-notify-watch-descriptor-hash-list)))
!       (ignore-errors
! 	;; Check, that event is meant for us.
! 	;; TODO: Filter events which stop watching, like `move' or `removed'.
! 	(cl-assert descriptor)
! 	(cond
! 	 ((featurep 'gfilenotify)
! 	  (cl-assert (memq action '(attribute-changed changed created deleted
!                                     ;; FIXME: I keep getting this action, so I
!                                     ;; added it here, but I have no idea what
!                                     ;; I'm doing.  --Stef
!                                     changes-done-hint))
!                      t))
! 	 ((featurep 'inotify)
! 	  (cl-assert (or (memq 'attrib action)
! 			 (memq 'create action)
! 			 (memq 'modify action)
! 			 (memq 'moved-to action))))
! 	 ((featurep 'w32notify) (cl-assert (eq 'modified action))))
! 	;; Since we watch a directory, a file name must be returned.
! 	(cl-assert (stringp file))
! 	(dolist (buffer buffers)
! 	  (when (buffer-live-p buffer)
! 	    (with-current-buffer buffer
! 	      (when (and (stringp buffer-file-name)
! 			 (string-equal
! 			  (file-name-nondirectory file)
! 			  (file-name-nondirectory buffer-file-name)))
! 		;; Mark buffer modified.
! 		(setq auto-revert-notify-modified-p t)
! 		;; No need to check other buffers.
! 		(cl-return)))))))))
  
  (defun auto-revert-active-p ()
    "Check if auto-revert is active (in current buffer or globally)."
--- 514,562 ----
  
    (when (and buffer-file-name auto-revert-use-notify
  	     (not auto-revert-notify-watch-descriptor))
!     (setq auto-revert-notify-watch-descriptor
! 	  (ignore-errors
! 	    (file-notify-add-watch
! 	     (directory-file-name (expand-file-name default-directory))
! 	     '(change attribute-change) 'auto-revert-notify-handler)))
!     (if auto-revert-notify-watch-descriptor
! 	(progn
! 	  (puthash
! 	   auto-revert-notify-watch-descriptor
! 	   (cons (current-buffer)
! 		 (gethash auto-revert-notify-watch-descriptor
! 			  auto-revert-notify-watch-descriptor-hash-list))
! 	   auto-revert-notify-watch-descriptor-hash-list)
! 	  (add-hook (make-local-variable 'kill-buffer-hook)
! 		    'auto-revert-notify-rm-watch))
!       ;; Fallback to file checks.
!       (set (make-local-variable 'auto-revert-use-notify) nil))))
  
  (defun auto-revert-notify-handler (event)
    "Handle an EVENT returned from file notification."
!   (let* ((descriptor (car event))
! 	 (action (nth 1 event))
! 	 (file (nth 2 event))
! 	 (buffers (gethash descriptor
! 			   auto-revert-notify-watch-descriptor-hash-list)))
!     (ignore-errors
!       ;; Check, that event is meant for us.
!       ;; TODO: Filter events which stop watching, like `move' or `removed'.
!       (cl-assert descriptor)
!       (cl-assert (memq action '(attribute-changed changed created deleted)) t)
!       ;; Since we watch a directory, a file name must be returned.
!       (cl-assert (stringp file))
!       (dolist (buffer buffers)
! 	(when (buffer-live-p buffer)
! 	  (with-current-buffer buffer
! 	    (when (and (stringp buffer-file-name)
! 		       (string-equal
! 			(file-name-nondirectory file)
! 			(file-name-nondirectory buffer-file-name)))
! 	      ;; Mark buffer modified.
! 	      (setq auto-revert-notify-modified-p t)
! 	      ;; No need to check other buffers.
! 	      (cl-return))))))))
  
  (defun auto-revert-active-p ()
    "Check if auto-revert is active (in current buffer or globally)."

=== added file 'lisp/filenotify.el'
*** lisp/filenotify.el	1970-01-01 00:00:00 +0000
--- lisp/filenotify.el	2013-06-25 11:36:23 +0000
***************
*** 0 ****
--- 1,244 ----
+ ;;; filenotify.el --- watch files for changes on disk
+ 
+ ;; Copyright (C) 2013 Free Software Foundation, Inc.
+ 
+ ;; Author: Michael Albinus <michael.albinus@gmx.de>
+ 
+ ;; This file is part of GNU Emacs.
+ 
+ ;; GNU Emacs is free software: you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation, either version 3 of the License, or
+ ;; (at your option) any later version.
+ 
+ ;; GNU Emacs is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;; GNU General Public License for more details.
+ 
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+ 
+ ;;; Commentary
+ 
+ ;; This package is an abstraction layer from the different low-level
+ ;; file notification packages `gfilenotify', `inotify' and
+ ;; `w32notify'.
+ 
+ ;;; Code:
+ 
+ ;; We check that there is exactly one low-level package.
+ ;;;###autoload
+ (defconst file-notify-support
+   (or (and (featurep 'gfilenotify)
+ 	   (not (featurep 'inotify))
+ 	   (not (featurep 'w32notify)))
+       (and (not (featurep 'gfilenotify))
+ 	   (featurep 'inotify)
+ 	   (not (featurep 'w32notify)))
+       (and (not (featurep 'gfilenotify))
+ 	   (not (featurep 'inotify))
+ 	   (featurep 'w32notify)))
+   "Non-nil when Emacs has been compiled with file notification support.")
+ 
+ ;; Shouldn't this be `file-notify-error'?
+ (defconst filewatch-error nil
+   "The file notification error symbol")
+ (put 'filewatch-error 'error-conditions '(filewatch-error file-error error))
+ (put 'filewatch-error 'error-message "Filewatch error")
+ 
+ (defvar file-notify-descriptors (make-hash-table :test 'equal)
+   "Hash table for registered file notification descriptors.
+ A key in this hash table is the descriptor as returned from a
+ `gfilenotify', `inotify' or `w32notify'.  The value in the hash
+ table is the cons cell (FILE . CALLBACK).")
+ 
+ ;; This function is used by `gfilenotify', `inotify' and `w32notify' events.
+ ;;;###autoload
+ (defun file-notify-handle-event (event)
+   "Handle file system monitoring event.
+ If EVENT is a filewatch event, call its callback.
+ Otherwise, signal a `filewatch-error'."
+   (interactive "e")
+   (if (and (eq (car event) 'file-notify)
+ 	   (>= (length event) 3))
+       (funcall (nth 2 event) (nth 1 event))
+     (signal 'filewatch-error
+ 	    (cons "Not a valid file-notify event" event))))
+ 
+ (defun file-notify-event-file-name (event)
+   "Return file name of file notification event, or nil."
+   (cond ((featurep 'gfilenotify) (nth 2 event))
+ 	((featurep 'inotify) (nth 3 event))
+ 	((featurep 'w32notify) (nth 2 event))))
+ 
+ (defun file-notify-event-file1-name (event)
+   "Return second file name of file notification event, or nil.
+ This is available in case a file has been moved."
+   (cond ((featurep 'gfilenotify) (nth 3 event))
+ 	((featurep 'inotify) (nth 4 event))
+ 	((featurep 'w32notify) (nth 3 event))))
+ 
+ ;; The callback function used to map between specific flags of the
+ ;; respective file notifications, and the ones we return.
+ (defun file-notify-callback (event)
+   "Handle an EVENT returned from file notification.
+ EVENT is the same one as in `file-notify-handle-event' except the
+ car of that event, which is the symbol `file-notify'."
+   (let ((descriptor (car event))
+ 	(action (nth 1 event))
+ 	(file (file-notify-event-file-name event))
+ 	(file1 (file-notify-event-file1-name event))
+ 	 callback tmp)
+     ;; Check, that event is meant for us.
+     (unless (setq callback (cdr (gethash descriptor file-notify-descriptors)))
+       (signal 'filewatch-error (list "Not a valid descriptor" descriptor)))
+ 
+     ;; Map action.  We ignore all events which cannot be mapped.
+     (setq action
+ 	  (cond
+ 	   ((featurep 'gfilenotify)
+ 	    (cond
+ 	     ((memq action '(attribute-changed changed created deleted moved))
+ 	      action)))
+ 	   ((featurep 'inotify)
+ 	    (cond
+ 	     ((memq 'attrib action) 'attribute-changed)
+ 	     ((memq 'create action) 'created)
+ 	     ((memq 'modify action) 'changed)
+ 	     ((memq 'delete action) 'deleted)
+ 	     ((memq 'delete-self action) 'deleted)
+ 	     ((memq 'moved-from action) 'deleted)
+ 	     ((memq 'moved-to action) 'created)
+ 	     ((memq 'move-self action) 'deleted)))
+ 	   ((featurep 'w32notify)
+ 	    (cond
+ 	     ((eq 'added action) 'created)
+ 	     ((eq 'modified action) 'changed)
+ 	     ((eq 'removed action) 'deleted)
+ 	     ((eq 'renamed-from action) 'deleted)
+ 	     ((eq 'renamed-to action) 'created)))))
+ 
+     ;; Apply callback.
+     (when (and (stringp file) (eq action 'moved))
+       (funcall callback (list descriptor 'deleted file))
+       (setq action 'created file file1))
+     (when (and (stringp file) action)
+       (funcall callback (list descriptor action file)))))
+ 
+ ;; We do not return a `renamed' action, for simplicity.  This could be
+ ;; added later on.
+ (defun file-notify-add-watch (file flags callback)
+   "Add a watch for filesystem events pertaining to FILE.
+ This arranges for filesystem events pertaining to FILE to be reported
+ to Emacs.  Use `file-notify-rm-watch' to cancel the watch.
+ 
+ The returned value is a descriptor for the added watch.  If the
+ file cannot be watched for some reason, this function signals a
+ `file-error' error.
+ 
+ FLAGS is a list of conditions to set what will be watched for.  It can
+ include the following symbols:
+ 
+   `change'           -- watch for file changes
+   `attribute-change' -- watch for file attributes changes, like
+                         permissions or modification time
+ 
+ If FILE is a directory, 'change' watches for file creation or
+ deletion in that directory.
+ 
+ When any event happens, Emacs will call the CALLBACK function passing
+ it a single argument EVENT, which is of the form
+ 
+   (DESCRIPTOR ACTION FILE [FILE1])
+ 
+ DESCRIPTOR is the same object as the one returned by this function.
+ ACTION is the description of the event.  It could be any one of the
+ following:
+ 
+   `created'           -- FILE was created
+   `deleted'           -- FILE was deleted
+   `changed'           -- FILE has changed
+   `attribute-changed' -- a FILE attribute was changed
+ 
+ FILE is the name of the file whose event is being reported."
+   ;; Check arguments.
+   (unless (stringp file)
+     (signal 'wrong-type-argument (list file)))
+   (setq file (expand-file-name file))
+   (unless (and (consp flags)
+ 	       (null (delq 'change (delq 'attribute-change flags))))
+     (signal 'wrong-type-argument (list flags)))
+   (unless (functionp callback)
+     (signal 'wrong-type-argument (list callback)))
+ 
+   (let ((handler (find-file-name-handler file 'file-notify-add-watch))
+ 	func fl desc)
+     (if handler
+ 	;; A file name handler could exist even if there is no local
+ 	;; file notification support.
+ 	(setq desc (funcall handler 'file-notify-add-watch file flags callback))
+ 
+       ;; Check, whether Emacs has been compiled with file notification support.
+       (unless file-notify-support
+ 	(signal 'filewatch-error '("No file notification package available")))
+ 
+       ;; Check, whether this has been registered already.
+       (maphash
+        (lambda (key value)
+ 	 (when (equal (cons file callback) value) (setq desc key)))
+        file-notify-descriptors)
+ 
+       (unless desc
+ 	;; Determine local function to be called.
+ 	(setq func (cond
+ 		    ((fboundp 'gfile-add-watch) 'gfile-add-watch)
+ 		    ((fboundp 'inotify-add-watch) 'inotify-add-watch)
+ 		    ((fboundp 'w32notify-add-watch) 'w32notify-add-watch)))
+ 
+ 	;; Determine respective flags.
+ 	(if (fboundp 'gfile-add-watch)
+ 	    (setq fl '(watch-mounts))
+ 	  (when (memq 'change flags)
+ 	    (setq
+ 	     fl
+ 	     (cond
+ 	      ((fboundp 'inotify-add-watch) '(create modify move delete))
+ 	      ((fboundp 'w32notify-add-watch) '(size last-write-time)))))
+ 	  (when (memq 'attribute-change flags)
+ 	    (add-to-list
+ 	     'fl
+ 	     (cond
+ 	      ((fboundp 'inotify-add-watch) '(attrib))
+ 	      ((fboundp 'w32notify-add-watch) '(attributes))))))
+ 
+ 	;; Call low-level function.
+ 	(setq desc (funcall func file fl 'file-notify-callback))))
+ 
+     ;; Return descriptor.
+     (puthash desc (cons file callback) file-notify-descriptors)
+     desc))
+ 
+ (defun file-notify-rm-watch (descriptor)
+   "Remove an existing watch specified by its DESCRIPTOR.
+ DESCRIPTOR should be an object returned by `file-notify-add-watch'."
+   (let ((file (car (gethash descriptor file-notify-descriptors)))
+ 	handler)
+ 
+     (when (stringp file)
+       (setq handler (find-file-name-handler file 'file-notify-rm-watch))
+       (if handler
+ 	  (funcall handler 'file-notify-rm-watch descriptor)
+ 	(funcall
+ 	 (cond
+ 	  ((fboundp 'gfile-rm-watch) 'gfile-rm-watch)
+ 	  ((fboundp 'inotify-rm-watch) 'inotify-rm-watch)
+ 	  ((fboundp 'w32notify-add-watch) 'w32notify-rm-watch))
+ 	 descriptor)))
+ 
+     (remhash descriptor file-notify-descriptors)))
+ 
+ ;; The end:
+ (provide 'filenotify)
+ 
+ ;;; filenotify.el ends here

=== modified file 'lisp/subr.el'
*** lisp/subr.el	2013-06-20 14:15:42 +0000
--- lisp/subr.el	2013-06-24 07:49:32 +0000
***************
*** 4494,4513 ****
         nil ,@(cdr (cdr spec)))))
  
  \f
- ;;;; Support for watching filesystem events.
- 
- (defun file-notify-handle-event (event)
-   "Handle file system monitoring event.
- If EVENT is a filewatch event, call its callback.
- Otherwise, signal a `filewatch-error'."
-   (interactive "e")
-   (if (and (eq (car event) 'file-notify)
- 	   (>= (length event) 3))
-       (funcall (nth 2 event) (nth 1 event))
-     (signal 'filewatch-error
- 	    (cons "Not a valid file-notify event" event))))
- 
- \f
  ;;;; Comparing version strings.
  
  (defconst version-separator "."
--- 4494,4499 ----


^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2013-08-02  7:10 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-25 12:02 filenotify.el Michael Albinus
2013-06-25 16:25 ` filenotify.el Rüdiger Sonderfeld
2013-06-25 19:00   ` filenotify.el Michael Albinus
2013-06-25 19:20     ` filenotify.el Eli Zaretskii
2013-06-25 19:27       ` filenotify.el Michael Albinus
2013-06-25 20:14         ` filenotify.el Eli Zaretskii
2013-06-26  6:06           ` filenotify.el Michael Albinus
2013-06-26  0:11     ` filenotify.el Stefan Monnier
2013-06-26  6:21       ` filenotify.el Michael Albinus
2013-06-26 13:04         ` filenotify.el Stefan Monnier
2013-06-26 14:15           ` filenotify.el Michael Albinus
2013-06-26 14:28             ` filenotify.el Stefan Monnier
2013-06-26 14:37               ` filenotify.el Michael Albinus
2013-06-26 15:57               ` filenotify.el Eli Zaretskii
2013-06-26 19:59                 ` filenotify.el Stefan Monnier
2013-06-26 20:28                   ` filenotify.el Michael Albinus
2013-06-26  0:45     ` filenotify.el Rüdiger Sonderfeld
2013-06-26  6:40       ` filenotify.el Michael Albinus
2013-06-26  7:50         ` About `<prefix>--' (was Re: filenotify.el) Stephen Berman
2013-06-26 13:06           ` Stefan Monnier
2013-06-26 22:36             ` Stephen Berman
2013-06-27  1:39               ` Stefan Monnier
2013-06-27 23:19           ` Josh
2013-06-28  3:00             ` Xue Fuqiao
2013-06-28 22:54               ` Stefan Monnier
2013-06-28 23:50                 ` Xue Fuqiao
2013-06-29  2:06                   ` Stefan Monnier
2013-06-28 21:59             ` Richard Stallman
2013-06-30 18:50               ` Josh
2013-06-27 12:18 ` filenotify.el (2) Michael Albinus
2013-07-04  9:54   ` Michael Albinus
2013-07-17 13:52 ` filenotify.el Rüdiger Sonderfeld
2013-07-17 14:54   ` filenotify.el Michael Albinus
2013-07-17 16:21     ` filenotify.el Rüdiger Sonderfeld
2013-07-18 10:10       ` filenotify.el Michael Albinus
2013-07-22 18:17     ` filenotify.el Davis Herring
2013-07-22 18:28       ` filenotify.el Michael Albinus
2013-07-22 19:00         ` filenotify.el Stefan Monnier
2013-07-23  6:57           ` filenotify.el Michael Albinus
2013-07-23 13:08             ` filenotify.el Stefan Monnier
2013-07-23 13:34               ` filenotify.el Michael Albinus
2013-07-23 13:57                 ` filenotify.el Stefan Monnier
2013-07-23 14:13                   ` filenotify.el Michael Albinus
2013-07-23 14:23                     ` filenotify.el Stefan Monnier
2013-07-23 15:31                       ` filenotify.el Davis Herring
2013-07-24  9:14                         ` filenotify.el Michael Albinus
2013-08-02  7:10                         ` filenotify.el Michael Albinus
2013-07-24 14:01                       ` filenotify.el Michael Albinus
2013-07-23 16:10                 ` filenotify.el Glenn Morris
2013-07-23 16:58                   ` filenotify.el Michael Albinus

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).