summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/emacs/mark.texi3
-rw-r--r--doc/lispref/elisp.texi9
-rw-r--r--doc/lispref/internals.texi703
-rw-r--r--doc/lispref/loading.texi33
-rw-r--r--doc/misc/gnus.texi2
-rw-r--r--lisp/dired-aux.el21
-rw-r--r--lisp/eshell/em-rebind.el2
-rw-r--r--lisp/registry.el2
8 files changed, 750 insertions, 25 deletions
diff --git a/doc/emacs/mark.texi b/doc/emacs/mark.texi
index 10505873c53..626f9dda25f 100644
--- a/doc/emacs/mark.texi
+++ b/doc/emacs/mark.texi
@@ -444,12 +444,13 @@ from point to the end of the buffer. Commands that act this way are
identified in their own documentation.
@end itemize
+@cindex enabling Transient Mark mode temporarily
While Transient Mark mode is off, you can activate it temporarily
using @kbd{C-@key{SPC} C-@key{SPC}} or @kbd{C-u C-x C-x}.
@table @kbd
@item C-@key{SPC} C-@key{SPC}
-@kindex C-SPC C-SPC@r{, disabling Transient Mark}
+@kindex C-SPC C-SPC@r{, enabling Transient Mark mode temporarily}
Set the mark at point (like plain @kbd{C-@key{SPC}}) and enable
Transient Mark mode just once, until the mark is deactivated. (This
is not really a separate command; you are using the @kbd{C-@key{SPC}}
diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi
index a615fcb4b7c..0b846291a07 100644
--- a/doc/lispref/elisp.texi
+++ b/doc/lispref/elisp.texi
@@ -1590,9 +1590,18 @@ GNU Emacs Internals
* Memory Usage:: Info about total size of Lisp objects made so far.
* C Dialect:: What C variant Emacs is written in.
* Writing Emacs Primitives:: Writing C code for Emacs.
+* Writing Dynamic Modules:: Writing loadable modules for Emacs.
* Object Internals:: Data formats of buffers, windows, processes.
* C Integer Types:: How C integer types are used inside Emacs.
+Writing Dynamic Modules
+
+* Module Initialization::
+* Module Functions::
+* Module Values::
+* Module Misc::
+* Module Nonlocal::
+
Object Internals
* Buffer Internals:: Components of a buffer structure.
diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index d42e2444e68..0679537844e 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -18,6 +18,7 @@ internal aspects of GNU Emacs that may be of interest to C programmers.
* Memory Usage:: Info about total size of Lisp objects made so far.
* C Dialect:: What C variant Emacs is written in.
* Writing Emacs Primitives:: Writing C code for Emacs.
+* Writing Dynamic Modules:: Writing loadable modules for Emacs.
* Object Internals:: Data formats of buffers, windows, processes.
* C Integer Types:: How C integer types are used inside Emacs.
@end menu
@@ -969,6 +970,708 @@ in @file{byte-opt.el} that binds @code{side-effect-free-fns} and
@code{side-effect-and-error-free-fns} so that the compiler optimizer
knows about it.
+@node Writing Dynamic Modules
+@section Writing Dynamically-Loaded Modules
+@cindex writing emacs modules
+@cindex dynamic modules, writing
+
+@cindex module @acronym{API}
+ This section describes the Emacs module @acronym{API} and how to use
+it as part of writing extension modules for Emacs. The module
+@acronym{API} is defined in the C programming language, therefore the
+description and the examples in this section assume the module is
+written in C@. For other programming languages, you will need to use
+the appropriate bindings, interfaces and facilities for calling C code.
+Emacs C code requires a C99 or later compiler (@pxref{C Dialect}), and
+so the code examples in this section also follow that standard.
+
+Writing a module and integrating it into Emacs comprises the following
+tasks:
+
+@itemize @bullet
+@item
+Writing initialization code for the module.
+
+@item
+Writing one or more module functions.
+
+@item
+Communicating values and objects between Emacs and your module
+functions.
+
+@item
+Handling of error conditions and nonlocal exits.
+@end itemize
+
+@noindent
+The following subsections describe these tasks and the @acronym{API}
+itself in more detail.
+
+Once your module is written, compile it to produce a shared library,
+according to the conventions of the underlying platform. Then place
+the shared library in a directory mentioned in @code{load-path}
+(@pxref{Library Search}), where Emacs will find it.
+
+If you wish to verify the conformance of a module to the Emacs dynamic
+module @acronym{API}, invoke Emacs with the @kbd{--module-assertions}
+option. @xref{Initial Options,,,emacs, The GNU Emacs Manual}.
+
+@menu
+* Module Initialization::
+* Module Functions::
+* Module Values::
+* Module Misc::
+* Module Nonlocal::
+@end menu
+
+@node Module Initialization
+@subsection Module Initialization Code
+@cindex module initialization
+
+ Begin your module by including the header file @file{emacs-module.h}
+and defining the GPL compatibility symbol:
+
+@example
+#include <emacs-module.h>
+
+int plugin_is_GPL_compatible;
+@end example
+
+The @file{emacs-module.h} file is installed into your system's include
+tree as part of the Emacs installation. Alternatively, you can find
+it in the Emacs source tree.
+
+@anchor{module initialization function}
+Next, write an initialization function for the module.
+
+@deftypefn Function int emacs_module_init (struct emacs_runtime *@var{runtime})
+Emacs calls this function when it loads a module. If a module does
+not export a function named @code{emacs_module_init}, trying to load
+the module will signal an error. The initialization function should
+return zero if the initialization succeeds, non-zero otherwise. In
+the latter case, Emacs will signal an error, and the loading of the
+module will fail. If the user presses @kbd{C-g} during the
+initialization, Emacs ignores the return value of the initialization
+function and quits (@pxref{Quitting}). (If needed, you can catch user
+quitting inside the initialization function, @pxref{should_quit}.)
+
+The argument @var{runtime} is a pointer to a C @code{struct} that
+includes 2 public fields: @code{size}, which provides the size of the
+structure in bytes; and @code{get_environment}, which provides a
+pointer to a function that allows the module initialization function
+access to the Emacs environment object and its interfaces.
+
+The initialization function should perform whatever initialization is
+required for the module. In addition, it can perform the following
+tasks:
+
+@table @asis
+@cindex compatibility, between modules and Emacs
+@item Compatibility verification
+A module can verify that the Emacs executable which loads the module
+is compatible with the module, by comparing the @code{size} member of
+the @var{runtime} structure with the value compiled into the module:
+
+@example
+int
+emacs_module_init (struct emacs_runtime *ert)
+@{
+ if (ert->size < sizeof (*ert))
+ return 1;
+@}
+@end example
+
+@noindent
+If the size of the runtime object passed to the module is smaller than
+what it expects, it means the module was compiled for an Emacs version
+newer (later) than the one which attempts to load it, i.e.@: the
+module might be incompatible with the Emacs binary.
+
+In addition, a module can verify the compatibility of the module
+@acronym{API} with what the module expects. The following sample code
+assumes it is part of the @code{emacs_module_init} function shown
+above:
+
+@example
+ emacs_env *env = ert->get_environment (ert);
+ if (env->size < sizeof (*env))
+ return 2;
+@end example
+
+@noindent
+@cindex module runtime environment
+This calls the @code{get_environment} function using the pointer
+provided in the @code{runtime} structure to retrieve a pointer to the
+@acronym{API}'s @dfn{environment}, a C @code{struct} which also has a
+@code{size} field holding the size of the structure in bytes.
+
+Finally, you can write a module that will work with older versions of
+Emacs, by comparing the size of the environment passed by Emacs with
+known sizes, like this:
+
+@example
+ emacs_env *env = ert->get_environment (ert);
+ if (env->size >= sizeof (struct emacs_env_26))
+ emacs_version = 26; /* Emacs 26 or later. */
+ else if (env->size >= sizeof (struct emacs_env_25))
+ emacs_version = 25;
+ else
+ return 2; /* Unknown or unsupported version. */
+@end example
+
+@noindent
+This works because later Emacs versions always @emph{add} members to
+the environment, never @emph{remove} any members, so the size can only
+grow with new Emacs releases. Given the version of Emacs, the module
+can use only the parts of the module @acronym{API} that existed in
+that version, since those parts are identical in later versions.
+
+We recommend that modules always perform the compatibility
+verification, unless they do their job entirely in the initialization
+function, and don't access any Lisp objects or use any Emacs functions
+accessible through the environment structure.
+
+@item Binding module functions to Lisp symbols
+This gives the module functions names so that Lisp code could call it
+by that name. We describe how to do this in @ref{Module Functions}
+below.
+@end table
+@end deftypefn
+
+@node Module Functions
+@subsection Writing Module Functions
+@cindex writing module functions
+@cindex module functions
+
+ The main reason for writing an Emacs module is to make additional
+functions available to Lisp programs that load the module. This
+subsection describes how to write such @dfn{module functions}.
+
+A module function has the following general form and signature:
+
+@deftypefn Function emacs_value module_func (emacs_env *@var{env}, ptrdiff_t @var{nargs}, emacs_value *@var{args}, void *@var{data})
+The @var{env} argument provides a pointer to the @acronym{API}
+environment, needed to access Emacs objects and functions. The
+@var{nargs} argument is the required number of arguments, which can be
+zero (see @code{make_function} below for more flexible specification
+of the argument number), and @var{args} is a pointer to the array of
+the function arguments. The argument @var{data} points to additional
+data required by the function, which was arranged when
+@code{make_function} (see below) was called to create an Emacs
+function from @code{module_func}.
+
+Module functions use the type @code{emacs_value} to communicate Lisp
+objects between Emacs and the module (@pxref{Module Values}). The
+@acronym{API}, described below and in the following subsections,
+provides facilities for conversion between basic C data types and the
+corresponding @code{emacs_value} objects.
+
+A module function always returns a value. If the function returns
+normally, the Lisp code which called it will see the Lisp object
+corresponding to the @code{emacs_value} value the function returned.
+However, if the user typed @kbd{C-g}, or if the module function or its
+callees signaled an error or exited nonlocally (@pxref{Module
+Nonlocal}), Emacs will ignore the returned value and quit or throw as
+it does when Lisp code encounters the same situations.
+@end deftypefn
+
+After writing your C code for a module function, you should make a
+Lisp function object from it using @code{make_function}. This is
+normally done in the module initialization function (@pxref{module
+initialization function}), after verifying the @acronym{API}
+compatibility, and uses the pointer to @code{make_function} provided
+in the environment (recall that the pointer to the environment is
+returned by @code{get_environment}).
+
+@deftypefn Function emacs_value make_function (emacs_env *@var{env}, ptrdiff_t @var{min_arity}, ptrdiff_t @var{max_arity}, subr @var{func}, const char *@var{docstring}, void *@var{data})
+@vindex emacs_variadic_function
+This returns an Emacs function created from the C function @var{func},
+whose signature is as described for @code{module_func} above (assumed
+here to be @code{typedef}'ed as @code{subr}). The arguments
+@var{min_arity} and @var{max_arity} specify the minimum and maximum
+number of arguments that @var{func} can accept. The @var{max_arity}
+argument can have the special value @code{emacs_variadic_function},
+which makes the function accept an unlimited number of arguments, like
+the @code{&rest} keyword in Lisp (@pxref{Argument List}).
+
+The argument @var{data} is a way to arrange for arbitrary additional
+data to be passed to @var{func} when it is called. Whatever pointer
+is passed to @code{make_function} will be passed unaltered to
+@var{func}.
+
+The argument @var{docstring} specifies the documentation string for
+the function. It should be either an @acronym{ASCII} string, or a
+UTF-8 encoded non-@acronym{ASCII} string, or a @code{NULL} pointer; in
+the latter case the function will have no documentation. The
+documentation string can end with a line that specifies the advertised
+calling convention, see @ref{Function Documentation}.
+
+Since every module function must accept the pointer to the environment
+as its first argument, the call to @code{make_function} could be made
+from any module function, but you will normally want to do that from
+the module initialization function, so that all the module functions
+are known to Emacs once the module is loaded.
+@end deftypefn
+
+Finally, you should bind the Lisp function to a symbol, so that Lisp
+code could call your function by name. For that, use the module
+@acronym{API} function @code{intern} (@pxref{intern}) whose pointer is
+also provided in the environment that module functions can access.
+
+Combining the above steps, code that arranges for a C function
+@code{module_func} to be callable as @code{module-func} from Lisp will
+look like this, as part of the module initialization function:
+
+@example
+ emacs_env *env = ert->get_environment (ert);
+ emacs_value func = env->make_function (env, min_arity, max_arity,
+ module_func, docstring, data);
+ emacs_value symbol = env->intern (env, "module-func");
+ emacs_value args[] = @{symbol, func@};
+ env->funcall (env, env->intern (env, "defalias"), 2, args);
+@end example
+
+@noindent
+This makes the symbol @code{module-func} known to Emacs by calling
+@code{env->intern}, then invokes @code{defalias} from Emacs to bind
+the function to that symbol. Note that it is possible to use
+@code{fset} instead of @code{defalias}; the differences are described
+in @ref{Defining Functions, defalias}.
+
+Using the module @acronym{API}, it is possible to define more complex
+function and data types: interactive functions, inline functions,
+macros, etc. However, the resulting C code will be cumbersome and
+hard to read. Therefore, we recommend that you limit the module code
+which creates functions and data structures to the absolute minimum,
+and leave the rest for a Lisp package that will accompany your module,
+because doing these additional tasks in Lisp is much easier, and will
+produce a much more readable code. For example, given a module
+function @code{module-func} defined as above, one way of making an
+interactive command @code{module-cmd} based on it is with the
+following simple Lisp wrapper:
+
+@lisp
+(defun module-cmd (&rest args)
+ "Documentation string for the command."
+ (interactive @var{spec})
+ (apply 'module-func args))
+@end lisp
+
+The Lisp package which goes with your module could then load the
+module using the @code{module-load} primitive (@pxref{Dynamic
+Modules}) when the package is loaded into Emacs.
+
+@node Module Values
+@subsection Conversion Between Lisp and Module Values
+@cindex module values, conversion
+
+@cindex @code{emacs_value} data type
+ With very few exceptions, most modules need to exchange data with
+Lisp programs that call them: accept arguments to module functions and
+return values from module functions. For this purpose, the module
+@acronym{API} provides the @code{emacs_value} type, which represents
+Emacs Lisp objects communicated via the @acronym{API}; it is the
+functional equivalent of the @code{Lisp_Object} type used in Emacs C
+primitives (@pxref{Writing Emacs Primitives}). This section describes
+the parts of the module @acronym{API} that allow to create
+@code{emacs_value} objects corresponding to basic Lisp data types, and
+how to access from C data in @code{emacs_value} objects that
+correspond to Lisp objects.
+
+All of the functions described below are actually @emph{function
+pointers} provided via the pointer to the environment which every
+module function accepts. Therefore, module code should call these
+functions through the environment pointer, like this:
+
+@example
+emacs_env *env; /* the environment pointer */
+env->some_function (arguments@dots{});
+@end example
+
+@noindent
+The @code{emacs_env} pointer will usually come from the first argument
+to the module function, or from the call to @code{get_environment} if
+you need the environment in the module initialization function.
+
+Most of the functions described below became available in Emacs 25,
+the first Emacs release that supported dynamic modules. For the few
+functions that became available in later Emacs releases, we mention
+the first Emacs version that supported them.
+
+The following @acronym{API} functions extract values of various C data
+types from @code{emacs_value} objects. They all raise the
+@code{wrong-type-argument} error condition (@pxref{Type Predicates})
+if the argument @code{emacs_value} object is not of the type expected
+by the function. @xref{Module Nonlocal}, for details of how signaling
+errors works in Emacs modules, and how to catch error conditions
+inside the module before they are reported to Emacs. The
+@acronym{API} function @code{type_of} (@pxref{Module Misc, type_of})
+can be used to obtain the type of a @code{emacs_value} object.
+
+@deftypefn Function intmax_t extract_integer (emacs_env *@var{env}, emacs_value @var{arg})
+This function returns the value of a Lisp integer specified by
+@var{arg}. The C data type of the return value, @code{intmax_t}, is
+the widest integral data type supported by the C compiler, typically
+@w{@code{long long}}.
+@end deftypefn
+
+@deftypefn Function double extract_float (emacs_env *@var{env}, emacs_value @var{arg})
+This function returns the value of a Lisp float specified by
+@var{arg}, as a C @code{double} value.
+@end deftypefn
+
+@deftypefn Function bool copy_string_contents (emacs_env *@var{env}, emacs_value @var{arg}, char *@var{buf}, ptrdiff_t *@var{len})
+This function stores the UTF-8 encoded text of a Lisp string specified
+by @var{arg} in the array of @code{char} pointed by @var{buf}, which
+should have enough space to hold at least @code{*@var{len}} bytes,
+including the terminating null byte. The argument @var{len} must not
+be a @code{NULL} pointer, and, when the function is called, it should
+point to a value that specifies the size of @var{buf} in bytes.
+
+If the buffer size specified by @code{*@var{len}} is large enough to
+hold the string's text, the function stores in @code{*@var{len}} the
+actual number of bytes copied to @var{buf}, including the terminating
+null byte, and returns @code{true}. If the buffer is too small, the
+function raises the @code{args-out-of-range} error condition, stores
+the required number of bytes in @code{*@var{len}}, and returns
+@code{false}. @xref{Module Nonlocal}, for how to handle pending error
+conditions.
+
+The argument @var{buf} can be a @code{NULL} pointer, in which case the
+function stores in @code{*@var{len}} the number of bytes required for
+storing the contents of @var{arg}, and returns @code{true}. This is
+how you can determine the size of @var{buf} needed to store a
+particular string: first call @code{copy_string_contents} with
+@code{NULL} as @var{buf}, then allocate enough memory to hold the
+number of bytes stored by the function in @code{*@var{len}}, and call
+the function again with non-@code{NULL} @var{buf} to actually perform
+the text copying.
+@end deftypefn
+
+@deftypefn Function emacs_value vec_get (emacs_env *@var{env}, emacs_value @var{vector}, ptrdiff_t @var{index})
+This function returns the element of @var{vector} at @var{index}. The
+@var{index} of the first vector element is zero. The function raises
+the @code{args-out-of-range} error condition if the value of
+@var{index} is invalid. To extract C data from the value the function
+returns, use the other extraction functions described here, as
+appropriate for the Lisp data type stored in that element of the
+vector.
+@end deftypefn
+
+@deftypefn Function ptrdiff_t vec_size (emacs_env *@var{env}, emacs_value @var{vector})
+This function returns the number of elements in @var{vector}.
+@end deftypefn
+
+@deftypefn Function void vec_set (emacs_env *@var{env}, emacs_value @var{vector}, ptrdiff_t @var{index}, emacs_value @var{value})
+This function stores @var{value} in the element of @var{vector} whose
+index is @var{index}. It raises the @code{args-out-of-range} error
+condition if the value of @var{index} is invalid.
+@end deftypefn
+
+The following @acronym{API} functions create @code{emacs_value}
+objects from basic C data types. They all return the created
+@code{emacs_value} object.
+
+@deftypefn Function emacs_value make_integer (emacs_env *@var{env}, intmax_t @var{n})
+This function takes an integer argument @var{n} and returns the
+corresponding @code{emacs_value} object. It raises the
+@code{overflow-error} error condition if the value of @var{n} cannot
+be represented as an Emacs integer, i.e.@: is not inside the limits
+set by @code{most-negative-fixnum} and @code{most-positive-fixnum}
+(@pxref{Integer Basics}).
+@end deftypefn
+
+@deftypefn Function emacs_value make_float (emacs_env *@var{env}, double @var{d})
+This function takes a @code{double} argument @var{d} and returns the
+corresponding Emacs floating-point value.
+@end deftypefn
+
+@deftypefn Function emacs_value make_string (emacs_env *@var{env}, const char *@var{str}, ptrdiff_t @var{strlen})
+This function creates an Emacs string from C text string pointed by
+@var{str} whose length in bytes, not including the terminating null
+byte, is @var{strlen}. The original string in @var{str} can be either
+an @acronym{ASCII} string or a UTF-8 encoded non-@acronym{ASCII}
+string; it can include embedded null bytes, and doesn't have to end in
+a terminating null byte at @code{@var{str}[@var{strlen}]}. The
+function raises the @code{overflow-error} error condition if
+@var{strlen} is negative or exceeds the maximum length of an Emacs
+string.
+@end deftypefn
+
+The @acronym{API} does not provide functions to manipulate Lisp data
+structures, for example, create lists with @code{cons} and @code{list}
+(@pxref{Building Lists}), extract list members with @code{car} and
+@code{cdr} (@pxref{List Elements}), create vectors with @code{vector}
+(@pxref{Vector Functions}), etc. For these, use @code{intern} and
+@code{funcall}, described in the next subsection, to call the
+corresponding Lisp functions.
+
+Normally, @code{emacs_value} objects have a rather short lifetime: it
+ends when the @code{emacs_env} pointer used for their creation goes
+out of scope. Occasionally, you may need to create @dfn{global
+references}: @code{emacs_value} objects that live as long as you
+wish. Use the following two functions to manage such objects.
+
+@deftypefn Function emacs_value make_global_ref (emacs_env *@var{env}, emacs_value @var{value})
+This function returns a global reference for @var{value}.
+@end deftypefn
+
+@deftypefn Function void free_global_ref (emacs_env *@var{env}, emacs_value @var{global_value})
+This function frees the @var{global_value} previously created by
+@code{make_global_ref}. The @var{global_value} is no longer valid
+after the call. Your module code should pair each call to
+@code{make_global_ref} with the corresponding @code{free_global_ref}.
+@end deftypefn
+
+@cindex user pointer, using in module functions
+An alternative to keeping around C data structures that need to be
+passed to module functions later is to create @dfn{user pointer}
+objects. A user pointer, or @code{user-ptr}, object is a Lisp object
+that encapsulates a C pointer and can have an associated finalizer
+function, which is called when the object is garbage-collected
+(@pxref{Garbage Collection}). The module @acronym{API} provides
+functions to create and access @code{user-ptr} objects. These
+functions raise the @code{wrong-type-argument} error condition if they
+are called on @code{emacs_value} that doesn't represent a
+@code{user-ptr} object.
+
+@deftypefn Function emacs_value make_user_ptr (emacs_env *@var{env}, emacs_finalizer @var{fin}, void *@var{ptr})
+This function creates and returns a @code{user-ptr} object which wraps
+the C pointer @var{ptr}. The finalizer function @var{fin} can be a
+@code{NULL} pointer (meaning no finalizer), or it can be a function of
+the following signature:
+
+@example
+typedef void (*emacs_finalizer) (void *@var{ptr});
+@end example
+
+@noindent
+If @var{fin} is not a @code{NULL} pointer, it will be called with the
+@var{ptr} as the argument when the @code{user-ptr} object is
+garbage-collected. Don't run any expensive code in a finalizer,
+because GC must finish quickly to keep Emacs responsive.
+@end deftypefn
+
+@deftypefn Function void *get_user_ptr (emacs_env *@var{env}, emacs_value val)
+This function extracts the C pointer from the Lisp object represented
+by @var{val}.
+@end deftypefn
+
+@deftypefn Function void set_user_ptr (emacs_env *@var{env}, emacs_value @var{value}, void *@var{ptr})
+This function sets the C pointer embedded in the @code{user-ptr}
+object represented by @var{value} to @var{ptr}.
+@end deftypefn
+
+@deftypefn Function emacs_finalizer get_user_finalizer (emacs_env *@var{env}, emacs_value val)
+This function returns the finalizer of the @code{user-ptr} object
+represented by @var{val}, or @code{NULL} if it doesn't have a finalizer.
+@end deftypefn
+
+@deftypefn Function void set_user_finalizer (emacs_env *@var{env}, emacs_value @var{val}, emacs_finalizer @var{fin})
+This function changes the finalizer of the @code{user-ptr} object
+represented by @var{val} to be @var{fin}. If @var{fin} is a
+@code{NULL} pointer, the @code{user-ptr} object will have no finalizer.
+@end deftypefn
+
+@node Module Misc
+@subsection Miscellaneous Convenience Functions for Modules
+
+ This subsection describes a few convenience functions provided by
+the module @acronym{API}. Like the functions described in previous
+subsections, all of them are actually function pointers, and need to
+be called via the @code{emacs_env} pointer. Description of functions
+that were introduced after Emacs 25 calls out the first version where
+they became available.
+
+@deftypefn Function bool eq (emacs_env *@var{env}, emacs_value @var{val1}, emacs_value @var{val2})
+This function returns @code{true} if the Lisp objects represented by
+@var{val1} and @var{val2} are identical, @code{false} otherwise. This
+is the same as the Lisp function @code{eq} (@pxref{Equality
+Predicates}), but avoids the need to intern the objects represented by
+the arguments.
+
+There are no @acronym{API} functions for other equality predicates, so
+you will need to use @code{intern} and @code{funcall}, described
+below, to perform more complex equality tests.
+@end deftypefn
+
+@deftypefn Function bool is_not_nil (emacs_env *@var{env}, emacs_value @var{val})
+This function tests whether the Lisp object represented by @var{val}
+is non-@code{nil}; it returns @code{true} or @code{false} accordingly.
+
+Note that you could implement an equivalent test by using
+@code{intern} to get an @code{emacs_value} representing @code{nil},
+then use @code{eq}, described above, to test for equality. But using
+this function is more convenient.
+@end deftypefn
+
+@deftypefn Function emacs_value type_of (emacs_env *@var{env}, emacs_value @code{object})
+This function returns the type of @var{object} as a value that
+represents a symbol: @code{string} for a string, @code{integer} for an
+integer, @code{process} for a process, etc. @xref{Type Predicates}.
+You can use @code{intern} and @code{eq} to compare against known type
+symbols, if your code needs to depend on the object type.
+@end deftypefn
+
+@anchor{intern}
+@deftypefn Function emacs_value intern (emacs_env *@var{env}, const char *name)
+This function returns an interned Emacs symbol whose name is
+@var{name}, which should be an @acronym{ASCII} null-terminated string.
+It creates a new symbol if one does not already exist.
+
+Together with @code{funcall}, described below, this function provides
+a means for invoking any Lisp-callable Emacs function, provided that
+its name is a pure @acronym{ASCII} string. For example, here's how to
+intern a symbol whose name @code{name_str} is non-@acronym{ASCII}, by
+calling the more powerful Emacs @code{intern} function
+(@pxref{Creating Symbols}):
+
+@example
+emacs_value fintern = env->intern (env, "intern");
+emacs_value sym_name =
+ env->make_string (env, name_str, strlen (name_str));
+emacs_value intern_args[] = @{ sym_name, env->intern (env, "nil") @};
+emacs_value symbol = env->funcall (env, fintern, 2, intern_args);
+@end example
+
+@end deftypefn
+
+@deftypefn Function emacs_value funcall (emacs_env *@var{env}, emacs_value @var{func}, ptrdiff_t @var{nargs}, emacs_value *@var{args})
+This function calls the specified @var{func} passing it @var{nargs}
+arguments from the array pointed to by @var{args}. The argument
+@var{func} can be a function symbol (e.g., returned by @code{intern}
+described above), a module function returned by @code{make_function}
+(@pxref{Module Functions}), a subroutine written in C, etc. If
+@var{nargs} is zero, @var{args} can be a @code{NULL} pointer.
+
+The function returns the value that @var{func} returned.
+@end deftypefn
+
+If your module includes potentially long-running code, it is a good
+idea to check from time to time in that code whether the user wants to
+quit, e.g., by typing @kbd{C-g} (@pxref{Quitting}). The following
+function, which is available since Emacs 26.1, is provided for that
+purpose.
+
+@anchor{should_quit}
+@deftypefn Function bool should_quit (emacs_env *@var{env})
+This function returns @code{true} if the user wants to quit. In that
+case, we recommend that your module function aborts any on-going
+processing and returns as soon as possible.
+@end deftypefn
+
+@node Module Nonlocal
+@subsection Nonlocal Exits in Modules
+@cindex nonlocal exits, in modules
+
+ Emacs Lisp supports nonlocal exits, whereby program control is
+transfered from one point in a program to another remote point.
+@xref{Nonlocal Exits}. Thus, Lisp functions called by your module
+might exit nonlocally by calling @code{signal} or @code{throw}, and
+your module functions must handle such nonlocal exits properly. Such
+handling is needed because C programs will not automatically release
+resources and perform other cleanups in these cases; your module code
+must itself do it. The module @acronym{API} provides facilities for
+that, described in this subsection. They are generally available
+since Emacs 25; those of them that became available in later releases
+explicitly call out the first Emacs version where they became part of
+the @acronym{API}.
+
+When some Lisp code called by a module function signals an error or
+throws, the nonlocal exit is trapped, and the pending exit and its
+associated data are stored in the environment. Whenever a nonlocal
+exit is pending in the environment, any module @acronym{API} function
+called with a pointer to that environment will return immediately
+without any processing (the functions @code{non_local_exit_check},
+@code{non_local_exit_get}, and @code{non_local_exit_clear} are
+exceptions from this rule). If your module function then does nothing
+and returns to Emacs, a pending nonlocal exit will cause Emacs to act
+on it: signal an error or throw to the corresponding @code{catch}.
+
+So the simplest ``handling'' of nonlocal exits in module functions is
+to do nothing special and let the rest of your code to run as if
+nothing happened. However, this can cause two classes of problems:
+
+@itemize @minus
+@item
+Your module function might use uninitialized or undefined values,
+since @acronym{API} functions return immediately without producing the
+expected results.
+
+@item
+Your module might leak resources, because it might not have the
+opportunity to release them.
+@end itemize
+
+Therefore, we recommend that your module functions check for nonlocal
+exit conditions and recover from them, using the functions described
+below.
+
+@deftypefn Function enum emacs_funcall_exit non_local_exit_check (emacs_env *@var{env})
+This function returns the kind of nonlocal exit condition stored in
+@var{env}. The possible values are:
+
+@vindex emacs_funcall_exit@r{, enumeration}
+@vtable @code
+@item emacs_funcall_exit_return
+The last @acronym{API} function exited normally.
+@item emacs_funcall_exit_signal
+The last @acronym{API} function signaled an error.
+@item emacs_funcall_exit_throw
+The last @acronym{API} function exited via @code{throw}.
+@end vtable
+@end deftypefn
+
+@deftypefn Function emacs_funcall_exit non_local_exit_get (emacs_env *@var{env}, emacs_value *@var{symbol}, emacs_value *@var{data})
+This function returns the kind of nonlocal exit condition stored in
+@var{env}, like @code{non_local_exit_check} does, but it also returns
+the full information about the nonlocal exit, if any. If the return
+value is @code{emacs_funcall_exit_signal}, the function stores the
+error symbol in @code{*@var{symbol}} and the error data in
+@code{*@var{data}} (@pxref{Signaling Errors}). If the return value is
+@code{emacs_funcall_exit_throw}, the function stores the @code{catch}
+tag symbol in @code{*@var{symbol}} and the @code{throw} value in
+@code{*@var{data}}. The function doesn't store anything in memory
+pointed by these arguments when the return value is
+@code{emacs_funcall_exit_return}.
+@end deftypefn
+
+You should check nonlocal exit conditions where it matters: before you
+allocated some resource or after you allocated a resource that might
+need freeing, or where a failure means further processing is
+impossible or infeasible.
+
+Once your module function detected that a nonlocal exit is pending, it
+can either return to Emacs (after performing the necessary local
+cleanup), or it can attempt to recover from the nonlocal exit. The
+following @acronym{API} functions will help with these tasks.
+
+@deftypefn Function void non_local_exit_clear (emacs_env *@var{env})
+This function clears the pending nonlocal exit conditions and data
+from @var{env}. After calling it, the module @acronym{API} functions
+will work normally. Use this function if your module function can
+recover from nonlocal exits of the Lisp functions it calls and
+continue, and also before calling any of the following two functions
+(or any other @acronym{API} functions, if you want them to perform
+their intended processing when a nonlocal exit is pending).
+@end deftypefn
+
+@deftypefn Function void non_local_exit_throw (emacs_env *@var{env}, emacs_value @var{tag}, emacs_value @var{value})
+This function throws to the Lisp @code{catch} symbol represented by
+@var{tag}, passing it @var{value} as the value to return. Your module
+function should in general return soon after calling this function.
+One use of this function is when you want to re-throw a non-local exit
+from one of the called @acronym{API} or Lisp functions.
+@end deftypefn
+
+@deftypefn Function void non_local_exit_signal (emacs_env *@var{env}, emacs_value @var{error}, emacs_value @var{data})
+This function signals the error represented by @var{error} with the
+specified error data @var{data}. The module function should return
+soon after calling this function. This function could be useful,
+e.g., for signaling errors from module functions to Emacs.
+@end deftypefn
+
+
@node Object Internals
@section Object Internals
@cindex object internals
diff --git a/doc/lispref/loading.texi b/doc/lispref/loading.texi
index 82c133de753..6f15cd9c60a 100644
--- a/doc/lispref/loading.texi
+++ b/doc/lispref/loading.texi
@@ -1139,8 +1139,6 @@ Features}).
@section Emacs Dynamic Modules
@cindex dynamic modules
-@c FIXME: This is intentionally incomplete, as the module integration
-@c is not yet finished. To be refined later.
A @dfn{dynamic Emacs module} is a shared library that provides
additional functionality for use in Emacs Lisp programs, just like a
package written in Emacs Lisp would.
@@ -1162,30 +1160,43 @@ Every dynamic module should export a C-callable function named
@code{load} or @code{require} which loads the module. It should also
export a symbol named @code{plugin_is_GPL_compatible} to indicate that
its code is released under the GPL or compatible license; Emacs will
-refuse to load modules that don't export such a symbol.
+signal an error if your program tries to load modules that don't
+export such a symbol.
If a module needs to call Emacs functions, it should do so through the
-API defined and documented in the header file @file{emacs-module.h}
-that is part of the Emacs distribution.
+@acronym{API} (Application Programming Interface) defined and
+documented in the header file @file{emacs-module.h} that is part of
+the Emacs distribution. @xref{Writing Dynamic Modules}, for details
+of using that API when writing your own modules.
@cindex user-ptr object
+@cindex user pointer object
Modules can create @code{user-ptr} Lisp objects that embed pointers to
C struct's defined by the module. This is useful for keeping around
complex data structures created by a module, to be passed back to the
module's functions. User-ptr objects can also have associated
@dfn{finalizers} -- functions to be run when the object is GC'ed; this
is useful for freeing any resources allocated for the underlying data
-structure, such as memory, open file descriptors, etc.
+structure, such as memory, open file descriptors, etc. @xref{Module
+Values}.
@defun user-ptrp object
This function returns @code{t} if its argument is a @code{user-ptr}
object.
@end defun
+@defun module-load file
+Emacs calls this low-level primitive to load a module from the
+specified @var{file} and perform the necessary initialization of the
+module. This is the primitive which makes sure the module exports the
+@code{plugin_is_GPL_compatible} symbol, calls the module's
+@code{emacs_module_init} function, and signals an error if that
+function returns an error indication, or if the use typed @kbd{C-g}
+during the initialization. If the initialization succeeds,
+@code{module-load} returns @code{t}. Note that @var{file} must
+already have the proper file-name extension, as this function doesn't
+try looking for files with known extensions, unlike @code{load}.
+@end defun
+
Loadable modules in Emacs are enabled by using the
@kbd{--with-modules} option at configure time.
-
-If you write your own dynamic modules, you may wish to verify their
-conformance to the Emacs dynamic module API. Invoking Emacs with the
-@kbd{--module-assertions} option will help you in this matter.
-@xref{Initial Options,,,emacs, The GNU Emacs Manual}.
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 2f7d8407fc4..fb9113f4608 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -26194,7 +26194,7 @@ Get the data under @code{key} for message @code{id}.
If any extra entries are precious, their presence will make the
registry keep the whole entry forever, even if there are no groups for
the Message-ID and if the size limit of the registry is reached. By
-default this is just @code{(marks)} so the custom registry marks are
+default this is just @code{(mark)} so the custom registry marks are
precious.
@end defvar
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 1f13204b7cf..90bfa096b08 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -763,16 +763,17 @@ can be produced by `dired-get-marked-files', for example."
(y-or-n-p (format-message
"Confirm--do you mean to use `?' as a wildcard? ")))
(t))))
- (when ok
- (if on-each
- (dired-bunch-files (- 10000 (length command))
- (lambda (&rest files)
- (dired-run-shell-command
- (dired-shell-stuff-it command files t arg)))
- nil file-list)
- ;; execute the shell command
- (dired-run-shell-command
- (dired-shell-stuff-it command file-list nil arg)))))))
+ (cond ((not ok) (message "Command canceled"))
+ (t
+ (if on-each
+ (dired-bunch-files (- 10000 (length command))
+ (lambda (&rest files)
+ (dired-run-shell-command
+ (dired-shell-stuff-it command files t arg)))
+ nil file-list)
+ ;; execute the shell command
+ (dired-run-shell-command
+ (dired-shell-stuff-it command file-list nil arg))))))))
;; Might use {,} for bash or csh:
(defvar dired-mark-prefix ""
diff --git a/lisp/eshell/em-rebind.el b/lisp/eshell/em-rebind.el
index e6f04b68e0c..064dcc762d2 100644
--- a/lisp/eshell/em-rebind.el
+++ b/lisp/eshell/em-rebind.el
@@ -223,7 +223,7 @@ lock it at that."
(interactive "P")
(let ((count (prefix-numeric-value n)))
(if (eshell-point-within-input-p (- (point) count))
- (delete-backward-char count n)
+ (delete-char (- count) n)
(beep))))
(defun eshell-delchar-or-maybe-eof (arg)
diff --git a/lisp/registry.el b/lisp/registry.el
index 4928dd9b202..c3184a820f3 100644
--- a/lisp/registry.el
+++ b/lisp/registry.el
@@ -358,7 +358,7 @@ return LIMIT such candidates. If SORTFUNC is provided, sort
entries first and return candidates from beginning of list."
(let* ((precious (oref db precious))
(precious-p (lambda (entry-key)
- (cdr (memq (car-safe entry-key) precious))))
+ (memq (car-safe entry-key) precious)))
(data (oref db data))
(candidates (cl-loop for k being the hash-keys of data
using (hash-values v)