as changes in buffers created by Emacs internally for certain jobs,
that should not be visible to Lisp programs.
-The vast bulk of buffer changing primitives will call
+The vast majority of buffer changing primitives will call
@code{before-change-functions} and @code{after-change-functions} in
balanced pairs, once for each change, where the arguments to these
hooks exactly delimit the change being made. Yet, hook functions
-should not rely on this always being the case:
-
-Other, complex primitives call @code{before-change-functions} once
-before making changes, and then call @code{after-change-functions}
-zero, one, or several times, depending on how many individual changes
-the primitive is making. The arguments to
+should not rely on this always being the case, because some complex
+primitives call @code{before-change-functions} once before making
+changes, and then call @code{after-change-functions} zero or more
+times, depending on how many individual changes the primitive is
+making. When that happens, the arguments to
@code{before-change-functions} will enclose a region in which the
individual changes are made, but won't necessarily be the minimal such
-region. The arguments to each successive call of
-@code{after-change-functions} will then delimit the current part of
-the change exactly.
+region, and the arguments to each successive call of
+@code{after-change-functions} will then delimit the part of text being
+changed exactly. In general, we advise to use either before- or the
+after-change hooks, but not both.
@defmac combine-after-change-calls body@dots{}
The macro executes @var{body} normally, but arranges to call the