# HG changeset patch # User Stefan Monnier # Date 1187297194 0 # Node ID a635ddf58f79beb03e409c2796141df5f57a005c # Parent e1ded939264516b4a1fc8293215106fc62566ffe *** empty log message *** diff -r e1ded9392645 -r a635ddf58f79 etc/NEWS --- a/etc/NEWS Thu Aug 16 03:18:21 2007 +0000 +++ b/etc/NEWS Thu Aug 16 20:46:34 2007 +0000 @@ -175,6 +175,11 @@ * Lisp Changes in Emacs 23.1 ++++ +** inhibit-modification-hooks is bound to t while running modification hooks. +As a happy consequence, after-change-functions and before-change-functions +are not bound to nil any more while running an (after|before)-change-function. + ** Non-breaking space now acts as whitespace. +++ diff -r e1ded9392645 -r a635ddf58f79 lispref/text.texi --- a/lispref/text.texi Thu Aug 16 03:18:21 2007 +0000 +++ b/lispref/text.texi Thu Aug 16 20:46:34 2007 +0000 @@ -4278,35 +4278,6 @@ functions. @end defmac -The two variables above are temporarily bound to @code{nil} during the -time that any of these functions is running. This means that if one of -these functions changes the buffer, that change won't run these -functions. If you do want a hook function to make changes that run -these functions, make it bind these variables back to their usual -values. - -One inconvenient result of this protective feature is that you cannot -have a function in @code{after-change-functions} or -@code{before-change-functions} which changes the value of that variable. -But that's not a real limitation. If you want those functions to change -the list of functions to run, simply add one fixed function to the hook, -and code that function to look in another variable for other functions -to call. Here is an example: - -@example -(setq my-own-after-change-functions nil) -(defun indirect-after-change-function (beg end len) - (let ((list my-own-after-change-functions)) - (while list - (funcall (car list) beg end len) - (setq list (cdr list))))) - -@group -(add-hooks 'after-change-functions - 'indirect-after-change-function) -@end group -@end example - @defvar first-change-hook This variable is a normal hook that is run whenever a buffer is changed that was previously in the unmodified state. @@ -4318,6 +4289,13 @@ described above in this section, as well as the hooks attached to certain special text properties (@pxref{Special Properties}) and overlay properties (@pxref{Overlay Properties}). + +Also, this variable is bound to non-@code{nil} while running those +same hook variables, so that by default modifying the buffer from +a modification hook does not cause other modification hooks to be run. +If you do want modification hooks to be run in a particular piece of +code that is itself run from a modification hook, then rebind locally +@code{inhibit-modification-hooks} to @code{nil}. @end defvar @ignore