annotate man/lispref/loading.texi @ 5157:1fae11d56ad2

redo memory-usage mechanism, add way of dynamically initializing Lisp objects -------------------- ChangeLog entries follow: -------------------- lisp/ChangeLog addition: 2010-03-18 Ben Wing <ben@xemacs.org> * diagnose.el (show-memory-usage): Rewrite to take into account API changes in memory-usage functions. src/ChangeLog addition: 2010-03-18 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (disksave_object_finalization_1): * alloc.c (lisp_object_storage_size): * alloc.c (listu): * alloc.c (listn): * alloc.c (Fobject_memory_usage_stats): * alloc.c (compute_memusage_stats_length): * alloc.c (Fobject_memory_usage): * alloc.c (Ftotal_object_memory_usage): * alloc.c (malloced_storage_size): * alloc.c (common_init_alloc_early): * alloc.c (reinit_alloc_objects_early): * alloc.c (reinit_alloc_early): * alloc.c (init_alloc_once_early): * alloc.c (syms_of_alloc): * alloc.c (reinit_vars_of_alloc): * buffer.c: * buffer.c (struct buffer_stats): * buffer.c (compute_buffer_text_usage): * buffer.c (compute_buffer_usage): * buffer.c (buffer_memory_usage): * buffer.c (buffer_objects_create): * buffer.c (syms_of_buffer): * buffer.c (vars_of_buffer): * console-impl.h (struct console_methods): * dynarr.c (Dynarr_memory_usage): * emacs.c (main_1): * events.c (clear_event_resource): * extents.c: * extents.c (compute_buffer_extent_usage): * extents.c (extent_objects_create): * extents.h: * faces.c: * faces.c (compute_face_cachel_usage): * faces.c (face_objects_create): * faces.h: * general-slots.h: * glyphs.c: * glyphs.c (compute_glyph_cachel_usage): * glyphs.c (glyph_objects_create): * glyphs.h: * lisp.h: * lisp.h (struct usage_stats): * lrecord.h: * lrecord.h (enum lrecord_type): * lrecord.h (struct lrecord_implementation): * lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): * lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT): * lrecord.h (MAKE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT): * lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT): * lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT): * lrecord.h (MAKE_MODULE_LISP_OBJECT): * lrecord.h (INIT_LISP_OBJECT): * lrecord.h (INIT_MODULE_LISP_OBJECT): * lrecord.h (UNDEF_LISP_OBJECT): * lrecord.h (UNDEF_MODULE_LISP_OBJECT): * lrecord.h (DECLARE_LISP_OBJECT): * lrecord.h (DECLARE_MODULE_API_LISP_OBJECT): * lrecord.h (DECLARE_MODULE_LISP_OBJECT): * lstream.c: * lstream.c (syms_of_lstream): * lstream.c (vars_of_lstream): * marker.c: * marker.c (compute_buffer_marker_usage): * mc-alloc.c (mc_alloced_storage_size): * mc-alloc.h: * mule-charset.c: * mule-charset.c (struct charset_stats): * mule-charset.c (compute_charset_usage): * mule-charset.c (charset_memory_usage): * mule-charset.c (mule_charset_objects_create): * mule-charset.c (syms_of_mule_charset): * mule-charset.c (vars_of_mule_charset): * redisplay.c: * redisplay.c (compute_rune_dynarr_usage): * redisplay.c (compute_display_block_dynarr_usage): * redisplay.c (compute_glyph_block_dynarr_usage): * redisplay.c (compute_display_line_dynarr_usage): * redisplay.c (compute_line_start_cache_dynarr_usage): * redisplay.h: * scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage): * scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage): * scrollbar-x.c (x_compute_scrollbar_instance_usage): * scrollbar.c (compute_scrollbar_instance_usage): * scrollbar.h: * symbols.c: * symbols.c (reinit_symbol_objects_early): * symbols.c (init_symbols_once_early): * symbols.c (reinit_symbols_early): * symbols.c (defsymbol_massage_name_1): * symsinit.h: * ui-gtk.c: * ui-gtk.c (emacs_gtk_object_getprop): * ui-gtk.c (emacs_gtk_object_putprop): * ui-gtk.c (ui_gtk_objects_create): * unicode.c (compute_from_unicode_table_size_1): * unicode.c (compute_to_unicode_table_size_1): * unicode.c (compute_from_unicode_table_size): * unicode.c (compute_to_unicode_table_size): * window.c: * window.c (struct window_stats): * window.c (compute_window_mirror_usage): * window.c (compute_window_usage): * window.c (window_memory_usage): * window.c (window_objects_create): * window.c (syms_of_window): * window.c (vars_of_window): * window.h: Redo memory-usage mechanism, make it general; add way of dynamically initializing Lisp object types -- OBJECT_HAS_METHOD(), similar to CONSOLE_HAS_METHOD(). (1) Create OBJECT_HAS_METHOD(), OBJECT_HAS_PROPERTY() etc. for specifying that a Lisp object type has a particular method or property. Call such methods with OBJECT_METH, MAYBE_OBJECT_METH, OBJECT_METH_OR_GIVEN; retrieve properties with OBJECT_PROPERTY. Methods that formerly required a DEFINE_*GENERAL_LISP_OBJECT() to specify them (getprop, putprop, remprop, plist, disksave) now instead use the dynamic-method mechanism. The main benefit of this is that new methods or properties can be added without requiring that the declaration statements of all existing methods be modified. We have to make the `struct lrecord_implementation' non-const, but I don't think this should have any effect on speed -- the only possible method that's really speed-critical is the mark method, and we already extract those out into a separate (non-const) array for increased cache locality. Object methods need to be reinitialized after pdump, so we put them in separate functions such as face_objects_create(), extent_objects_create() and call them appropriately from emacs.c The only current object property (`memusage_stats_list') that objects can specify is a Lisp object and gets staticpro()ed so it only needs to be set during dump time, but because it references symbols that might not exist in a syms_of_() function, we initialize it in vars_of_(). There is also an object property (`num_extra_memusage_stats') that is automatically initialized based on `memusage_stats_list'; we do that in reinit_vars_of_alloc(), which is called after all vars_of_() functions are called. `disksaver' method was renamed `disksave' to correspond with the name normally given to the function (e.g. disksave_lstream()). (2) Generalize the memory-usage mechanism in `buffer-memory-usage', `window-memory-usage', `charset-memory-usage' into an object-type- specific mechanism called by a single function `object-memory-usage'. (Former function `object-memory-usage' renamed to `total-object-memory-usage'). Generalize the mechanism of different "slices" so that we can have different "classes" of memory described and different "slices" onto each class; `t' separates classes, `nil' separates slices. Currently we have three classes defined: the memory of an object itself, non-Lisp-object memory associated with the object (e.g. arrays or dynarrs stored as fields in the object), and Lisp-object memory associated with the object (other internal Lisp objects stored in the object). This isn't completely finished yet and we might need to further separate the "other internal Lisp objects" class into two classes. The memory-usage mechanism uses a `struct usage_stats' (renamed from `struct overhead_stats') to describe a malloc-view onto a set of allocated memory (listing how much was requested and various types of overhead) and a more general `struct generic_usage_stats' (with a `struct usage_stats' in it) to hold all statistics about object memory. `struct generic_usage_stats' contains an array of 32 Bytecounts, which are statistics of unspecified semantics. The intention is that individual types declare a corresponding struct (e.g. `struct window_stats') with the same structure but with specific fields in place of the array, corresponding to specific statistics. The number of such statistics is an object property computed from the list of tags (Lisp symbols describing the statistics) stored in `memusage_stats_list'. The idea here is to allow particular object types to customize the number and semantics of the statistics where completely avoiding consing. This doesn't matter so much yet, but the intention is to have the memory usage of all objects computed at the end of GC, at the same time as other statistics are currently computed. The values for all statistics for a single type would be added up to compute aggregate values for all objects of a specific type. To make this efficient, we can't allow any memory allocation at all. (3) Create some additional functions for creating lists that specify the elements directly as args rather than indirectly through an array: listn() (number of args given), listu() (list terminated by Qunbound). (4) Delete a bit of remaining unused C window_config stuff, also unused lrecord_type_popup_data.
author Ben Wing <ben@xemacs.org>
date Thu, 18 Mar 2010 10:50:06 -0500
parents 576fb035e263
children 9fae6227ede5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/loading.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Loading, Byte Compilation, Macros, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @chapter Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 @cindex loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 @cindex library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 @cindex Lisp library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 Loading a file of Lisp code means bringing its contents into the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 environment in the form of Lisp objects. XEmacs finds and opens the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 file, reads the text, evaluates each form, and then closes the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 The load functions evaluate all the expressions in a file just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 as the @code{eval-current-buffer} function evaluates all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 expressions in a buffer. The difference is that the load functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 read and evaluate the text in the file as found on disk, not the text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 in an Emacs buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 @cindex top-level form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 The loaded file must contain Lisp expressions, either as source code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 or as byte-compiled code. Each form in the file is called a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 @dfn{top-level form}. There is no special format for the forms in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 loadable file; any form in a file may equally well be typed directly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 into a buffer and evaluated there. (Indeed, most code is tested this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 way.) Most often, the forms are function definitions and variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 A file containing Lisp code is often called a @dfn{library}. Thus,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 the ``Rmail library'' is a file containing code for Rmail mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 Similarly, a ``Lisp library directory'' is a directory of files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 containing Lisp code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 * How Programs Do Loading:: The @code{load} function and others.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 * Autoload:: Setting up a function to autoload.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 * Repeated Loading:: Precautions about loading a file twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 * Named Features:: Loading a library if it isn't already loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 * Unloading:: How to ``unload'' a library that was loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 * Hooks for Loading:: Providing code to be run when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 particular libraries are loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 @node How Programs Do Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 @section How Programs Do Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 XEmacs Lisp has several interfaces for loading. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 @code{autoload} creates a placeholder object for a function in a file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 trying to call the autoloading function loads the file to get the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 function's real definition (@pxref{Autoload}). @code{require} loads a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 file if it isn't already loaded (@pxref{Named Features}). Ultimately, all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 these facilities call the @code{load} function to do the work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 @defun load filename &optional missing-ok nomessage nosuffix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 This function finds and opens a file of Lisp code, evaluates all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 forms in it, and closes the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 To find the file, @code{load} first looks for a file named
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 @file{@var{filename}.elc}, that is, for a file whose name is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 @var{filename} with @samp{.elc} appended. If such a file exists, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 loaded. If there is no file by that name, then @code{load} looks for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 file named @file{@var{filename}.el}. If that file exists, it is loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 Finally, if neither of those names is found, @code{load} looks for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 file named @var{filename} with nothing appended, and loads it if it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 exists. (The @code{load} function is not clever about looking at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 @var{filename}. In the perverse case of a file named @file{foo.el.el},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 evaluation of @code{(load "foo.el")} will indeed find it.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 If the optional argument @var{nosuffix} is non-@code{nil}, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 suffixes @samp{.elc} and @samp{.el} are not tried. In this case, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 must specify the precise file name you want.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 If @var{filename} is a relative file name, such as @file{foo} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 @file{baz/foo.bar}, @code{load} searches for the file using the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 @code{load-path}. It appends @var{filename} to each of the directories
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 listed in @code{load-path}, and loads the first file it finds whose name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 matches. The current default directory is tried only if it is specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 in @code{load-path}, where @code{nil} stands for the default directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 @code{load} tries all three possible suffixes in the first directory in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 @code{load-path}, then all three suffixes in the second directory, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 so on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 If you get a warning that @file{foo.elc} is older than @file{foo.el}, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 means you should consider recompiling @file{foo.el}. @xref{Byte
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 Compilation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 Messages like @samp{Loading foo...} and @samp{Loading foo...done} appear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 in the echo area during loading unless @var{nomessage} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 non-@code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 @cindex load errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 Any unhandled errors while loading a file terminate loading. If the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 load was done for the sake of @code{autoload}, any function definitions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 made during the loading are undone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 @kindex file-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 If @code{load} can't find the file to load, then normally it signals the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 error @code{file-error} (with @samp{Cannot open load file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 @var{filename}}). But if @var{missing-ok} is non-@code{nil}, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 @code{load} just returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 You can use the variable @code{load-read-function} to specify a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 for @code{load} to use instead of @code{read} for reading expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 See below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 @code{load} returns @code{t} if the file loads successfully.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 @deffn Command load-file filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 This function loads the file @var{filename}. If @var{filename} is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 absolute file name, then it is loaded. If it is relative, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 current default directory is assumed. @code{load-path} is not used, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 suffixes are not appended. Use this function if you wish to specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 the file to be loaded exactly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 @deffn Command load-library library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 This function loads the library named @var{library}. A library is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 nothing more than a file that may be loaded as described earlier. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 function is identical to @code{load}, save that it reads a file name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 interactively with completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 @defopt load-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 @cindex @code{EMACSLOADPATH} environment variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 The value of this variable is a list of directories to search when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 loading files with @code{load}. Each element is a string (which must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 a directory name) or @code{nil} (which stands for the current working
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 directory). The value of @code{load-path} is initialized from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 environment variable @code{EMACSLOADPATH}, if that exists; otherwise its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 default value is specified in @file{emacs/src/paths.h} when XEmacs is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 built.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 The syntax of @code{EMACSLOADPATH} is the same as used for @code{PATH};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 @samp{:} (or @samp{;}, according to the operating system) separates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 directory names, and @samp{.} is used for the current default directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 Here is an example of how to set your @code{EMACSLOADPATH} variable from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 a @code{csh} @file{.login} file:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 @c This overfull hbox is OK. --rjc 16mar92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 setenv EMACSLOADPATH .:/user/bil/emacs:/usr/lib/emacs/lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 Here is how to set it using @code{sh}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 export EMACSLOADPATH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 EMACSLOADPATH=.:/user/bil/emacs:/usr/local/lib/emacs/lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 Here is an example of code you can place in a @file{.emacs} file to add
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 several directories to the front of your default @code{load-path}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (setq load-path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (append (list nil "/user/bil/emacs"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 "/usr/local/lisplib"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 "~/emacs")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 load-path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 @c Wordy to rid us of an overfull hbox. --rjc 15mar92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 In this example, the path searches the current working directory first,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 followed then by the @file{/user/bil/emacs} directory, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 @file{/usr/local/lisplib} directory, and the @file{~/emacs} directory,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 which are then followed by the standard directories for Lisp code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 The command line options @samp{-l} or @samp{-load} specify a Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 library to load as part of Emacs startup. Since this file might be in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 the current directory, Emacs 18 temporarily adds the current directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 to the front of @code{load-path} so the file can be found there. Newer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 Emacs versions also find such files in the current directory, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 without altering @code{load-path}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 Dumping Emacs uses a special value of @code{load-path}. If the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 @code{load-path} at the end of dumping is unchanged (that is, still the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 same special value), the dumped Emacs switches to the ordinary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 @code{load-path} value when it starts up, as described above. But if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 @code{load-path} has any other value at the end of dumping, that value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 is used for execution of the dumped Emacs also.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 Therefore, if you want to change @code{load-path} temporarily for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 loading a few libraries in @file{site-init.el} or @file{site-load.el},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 you should bind @code{load-path} locally with @code{let} around the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 calls to @code{load}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 @defun locate-file filename path-list &optional suffixes mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 This function searches for a file in the same way that @code{load} does,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 and returns the file found (if any). (In fact, @code{load} uses this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 function to search through @code{load-path}.) It searches for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 @var{filename} through @var{path-list}, expanded by one of the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 @var{suffixes} (string of suffixes separated by @samp{:}s), checking for
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
202 access @var{mode} (0|1|2|4 = exists|executable|writable|readable),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 default readable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 @code{locate-file} keeps hash tables of the directories it searches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 through, in order to speed things up. It tries valiantly to not get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 confused in the face of a changing and unpredictable environment, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 can occasionally get tripped up. In this case, you will have to call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 @code{locate-file-clear-hashing} to get it back on track. See that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 function for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 @defun locate-file-clear-hashing path
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 This function clears the hash records for the specified list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 directories. @code{locate-file} uses a hashing scheme to speed lookup, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 will correctly track the following environmental changes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 changes of any sort to the list of directories to be searched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 addition and deletion of non-shadowing files (see below) from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 directories in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 byte-compilation of a .el file into a .elc file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 @code{locate-file} will primarily get confused if you add a file that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 shadows (i.e. has the same name as) another file further down in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 directory list. In this case, you must call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 @code{locate-file-clear-hashing}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 @defvar load-in-progress
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 This variable is non-@code{nil} if Emacs is in the process of loading a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 file, and it is @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 @defvar load-read-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 This variable specifies an alternate expression-reading function for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 @code{load} and @code{eval-region} to use instead of @code{read}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 The function should accept one argument, just as @code{read} does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 Normally, the variable's value is @code{nil}, which means those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 functions should use @code{read}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 @defopt load-warn-when-source-newer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 This variable specifies whether @code{load} should check whether the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 source is newer than the binary. If this variable is true, then when a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 @samp{.elc} file is being loaded and the corresponding @samp{.el} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 newer, a warning message will be printed. The default is @code{nil},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 but it is bound to @code{t} during the initial loadup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 @defopt load-warn-when-source-only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 This variable specifies whether @code{load} should warn when loading a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 @samp{.el} file instead of an @samp{.elc}. If this variable is true,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 then when @code{load} is called with a filename without an extension,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 and the @samp{.elc} version doesn't exist but the @samp{.el} version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 does, then a message will be printed. If an explicit extension is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 passed to @code{load}, no warning will be printed. The default is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 @code{nil}, but it is bound to @code{t} during the initial loadup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 @defopt load-ignore-elc-files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 This variable specifies whether @code{load} should ignore @samp{.elc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 files when a suffix is not given. This is normally used only to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 bootstrap the @samp{.elc} files when building XEmacs, when you use the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 command @samp{make all-elc}. (This forces the @samp{.el} versions to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 loaded in the process of compiling those same files, so that existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 out-of-date @samp{.elc} files do not make it mess things up.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 @end defopt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 To learn how @code{load} is used to build XEmacs, see @ref{Building XEmacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 @node Autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 @section Autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 @cindex autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 The @dfn{autoload} facility allows you to make a function or macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 known in Lisp, but put off loading the file that defines it. The first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 call to the function automatically reads the proper file to install the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 real definition and other associated code, then runs the real definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 as if it had been loaded all along.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 There are two ways to set up an autoloaded function: by calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 @code{autoload}, and by writing a special ``magic'' comment in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 source before the real definition. @code{autoload} is the low-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 primitive for autoloading; any Lisp program can call @code{autoload} at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 any time. Magic comments do nothing on their own; they serve as a guide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 for the command @code{update-file-autoloads}, which constructs calls to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 @code{autoload} and arranges to execute them when Emacs is built. Magic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 comments are the most convenient way to make a function autoload, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 only for packages installed along with Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 @defun autoload function filename &optional docstring interactive type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 This function defines the function (or macro) named @var{function} so as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 to load automatically from @var{filename}. The string @var{filename}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 specifies the file to load to get the real definition of @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 The argument @var{docstring} is the documentation string for the
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
303 function. Normally, this is identical to the documentation string in
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
304 the function definition itself. Specifying the documentation string in
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
305 the call to @code{autoload} makes it possible to look at the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 documentation without loading the function's real definition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 If @var{interactive} is non-@code{nil}, then the function can be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 interactively. This lets completion in @kbd{M-x} work without loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 the function's real definition. The complete interactive specification
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 need not be given here; it's not needed unless the user actually calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 @var{function}, and when that happens, it's time to load the real
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 definition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 You can autoload macros and keymaps as well as ordinary functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 Specify @var{type} as @code{macro} if @var{function} is really a macro.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
317 Specify @var{type} as @code{keymap} if @var{function} is really a keymap.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
318 Various parts of Emacs need to know this information without loading the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
319 real definition.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 An autoloaded keymap loads automatically during key lookup when a prefix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 key's binding is the symbol @var{function}. Autoloading does not occur
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 for other kinds of access to the keymap. In particular, it does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 happen when a Lisp program gets the keymap from the value of a variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 and calls @code{define-key}; not even if the variable name is the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 symbol @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 @cindex function cell in autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 If @var{function} already has a non-void function definition that is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 an autoload object, @code{autoload} does nothing and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 If the function cell of @var{function} is void, or is already an autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 object, then it is defined as an autoload object like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (autoload @var{filename} @var{docstring} @var{interactive} @var{type})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
338 For example,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (symbol-function 'run-prolog)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 @result{} (autoload "prolog" 169681 t nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 In this case, @code{"prolog"} is the name of the file to load, 169681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 refers to the documentation string in the @file{DOC} file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (@pxref{Documentation Basics}), @code{t} means the function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 interactive, and @code{nil} that it is not a macro or a keymap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 @cindex autoload errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 The autoloaded file usually contains other definitions and may require
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 or provide one or more features. If the file is not completely loaded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (due to an error in the evaluation of its contents), any function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 definitions or @code{provide} calls that occurred during the load are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 undone. This is to ensure that the next attempt to call any function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 autoloading from this file will try again to load the file. If not for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 this, then some of the functions in the file might appear defined, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 they might fail to work properly for the lack of certain subroutines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 defined later in the file and not loaded successfully.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 XEmacs as distributed comes with many autoloaded functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 The calls to @code{autoload} are in the file @file{loaddefs.el}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 There is a convenient way of updating them automatically.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 If the autoloaded file fails to define the desired Lisp function or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 macro, then an error is signaled with data @code{"Autoloading failed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 define function @var{function-name}"}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 @findex update-file-autoloads
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 @findex update-directory-autoloads
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 A magic autoload comment looks like @samp{;;;###autoload}, on a line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 by itself, just before the real definition of the function in its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 autoloadable source file. The command @kbd{M-x update-file-autoloads}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 writes a corresponding @code{autoload} call into @file{loaddefs.el}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 @kbd{M-x update-directory-autoloads} is even more powerful; it updates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 autoloads for all files in the current directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 The same magic comment can copy any kind of form into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 @file{loaddefs.el}. If the form following the magic comment is not a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 function definition, it is copied verbatim. You can also use a magic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 comment to execute a form at build time @emph{without} executing it when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 the file itself is loaded. To do this, write the form @dfn{on the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 line} as the magic comment. Since it is in a comment, it does nothing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 when you load the source file; but @code{update-file-autoloads} copies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 it to @file{loaddefs.el}, where it is executed while building Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 The following example shows how @code{doctor} is prepared for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 autoloading with a magic comment:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (defun doctor ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 "Switch to *doctor* buffer and start giving psychotherapy."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (switch-to-buffer "*doctor*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (doctor-mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 Here's what that produces in @file{loaddefs.el}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (autoload 'doctor "doctor"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 "\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 Switch to *doctor* buffer and start giving psychotherapy."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 The backslash and newline immediately following the double-quote are a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 convention used only in the preloaded Lisp files such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 @file{loaddefs.el}; they tell @code{make-docfile} to put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 documentation string in the @file{DOC} file. @xref{Building XEmacs}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 @node Repeated Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 @section Repeated Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 @cindex repeated loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 You may load one file more than once in an Emacs session. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 example, after you have rewritten and reinstalled a function definition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 by editing it in a buffer, you may wish to return to the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 version; you can do this by reloading the file it came from.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 When you load or reload files, bear in mind that the @code{load} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 @code{load-library} functions automatically load a byte-compiled file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 rather than a non-compiled file of similar name. If you rewrite a file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 that you intend to save and reinstall, remember to byte-compile it if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 necessary; otherwise you may find yourself inadvertently reloading the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 older, byte-compiled file instead of your newer, non-compiled file!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 When writing the forms in a Lisp library file, keep in mind that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 file might be loaded more than once. For example, the choice of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 @code{defvar} vs.@: @code{defconst} for defining a variable depends on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 whether it is desirable to reinitialize the variable if the library is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 reloaded: @code{defconst} does so, and @code{defvar} does not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (@xref{Defining Variables}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 The simplest way to add an element to an alist is like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (setq minor-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (cons '(leif-mode " Leif") minor-mode-alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 But this would add multiple elements if the library is reloaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 To avoid the problem, write this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (or (assq 'leif-mode minor-mode-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (setq minor-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (cons '(leif-mode " Leif") minor-mode-alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 To add an element to a list just once, use @code{add-to-list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (@pxref{Setting Variables}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 Occasionally you will want to test explicitly whether a library has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 already been loaded. Here's one way to test, in a library, whether it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 has been loaded before:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (defvar foo-was-loaded)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 (if (not (boundp 'foo-was-loaded))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 @var{execute-first-time-only})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (setq foo-was-loaded t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 If the library uses @code{provide} to provide a named feature, you can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 use @code{featurep} to test whether the library has been loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 @xref{Named Features}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 @node Named Features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 @section Features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 @cindex features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 @cindex requiring features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 @cindex providing features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 @code{provide} and @code{require} are an alternative to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 @code{autoload} for loading files automatically. They work in terms of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 named @dfn{features}. Autoloading is triggered by calling a specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 function, but a feature is loaded the first time another program asks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 for it by name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 A feature name is a symbol that stands for a collection of functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 variables, etc. The file that defines them should @dfn{provide} the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 feature. Another program that uses them may ensure they are defined by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 @dfn{requiring} the feature. This loads the file of definitions if it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 hasn't been loaded already.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 To require the presence of a feature, call @code{require} with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 feature name as argument. @code{require} looks in the global variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 @code{features} to see whether the desired feature has been provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 already. If not, it loads the feature from the appropriate file. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 file should call @code{provide} at the top level to add the feature to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 @code{features}; if it fails to do so, @code{require} signals an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 @cindex load error with require
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 Features are normally named after the files that provide them, so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 @code{require} need not be given the file name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
512 For example, in @file{emacs/lisp/prolog.el},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 the definition for @code{run-prolog} includes the following code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (defun run-prolog ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 "Run an inferior Prolog process, input and output via buffer *prolog*."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (require 'comint)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (switch-to-buffer (make-comint "prolog" prolog-program-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (inferior-prolog-mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 The expression @code{(require 'comint)} loads the file @file{comint.el}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 if it has not yet been loaded. This ensures that @code{make-comint} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 The @file{comint.el} file contains the following top-level expression:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (provide 'comint)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 This adds @code{comint} to the global @code{features} list, so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 @code{(require 'comint)} will henceforth know that nothing needs to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 @cindex byte-compiling @code{require}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 When @code{require} is used at top level in a file, it takes effect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 when you byte-compile that file (@pxref{Byte Compilation}) as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 when you load it. This is in case the required package contains macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 that the byte compiler must know about.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 Although top-level calls to @code{require} are evaluated during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 byte compilation, @code{provide} calls are not. Therefore, you can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 ensure that a file of definitions is loaded before it is byte-compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 by including a @code{provide} followed by a @code{require} for the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 feature, as in the following example.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (provide 'my-feature) ; @r{Ignored by byte compiler,}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 ; @r{evaluated by @code{load}.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (require 'my-feature) ; @r{Evaluated by byte compiler.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 The compiler ignores the @code{provide}, then processes the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 @code{require} by loading the file in question. Loading the file does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 execute the @code{provide} call, so the subsequent @code{require} call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 does nothing while loading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 @defun provide feature
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 This function announces that @var{feature} is now loaded, or being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 loaded, into the current XEmacs session. This means that the facilities
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 associated with @var{feature} are or will be available for other Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 programs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 The direct effect of calling @code{provide} is to add @var{feature} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 the front of the list @code{features} if it is not already in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 The argument @var{feature} must be a symbol. @code{provide} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 @var{feature}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 @result{} (bar bish)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (provide 'foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 @result{} foo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 @result{} (foo bar bish)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 When a file is loaded to satisfy an autoload, and it stops due to an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 error in the evaluating its contents, any function definitions or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 @code{provide} calls that occurred during the load are undone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 @xref{Autoload}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 @defun require feature &optional filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 This function checks whether @var{feature} is present in the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 XEmacs session (using @code{(featurep @var{feature})}; see below). If it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 is not, then @code{require} loads @var{filename} with @code{load}. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 @var{filename} is not supplied, then the name of the symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 @var{feature} is used as the file name to load.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 If loading the file fails to provide @var{feature}, @code{require}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 signals an error, @samp{Required feature @var{feature} was not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 provided}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 @defun featurep fexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 This function returns @code{t} if feature @var{fexp} is present in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 Emacs. Use this to conditionalize execution of lisp code based on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 presence or absence of emacs or environment extensions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 @var{fexp} can be a symbol, a number, or a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
612 If @var{fexp} is a symbol, it is looked up in the @code{features} variable,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 and @code{t} is returned if it is found, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 If @var{fexp} is a number, the function returns @code{t} if this Emacs
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
616 has an equal or greater number than @var{fexp}, @code{nil} otherwise.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 Note that minor Emacs version is expected to be 2 decimal places wide,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 so @code{(featurep 20.4)} will return @code{nil} on XEmacs 20.4---you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 must write @code{(featurep 20.04)}, unless you wish to match for XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 20.40.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 If @var{fexp} is a list whose car is the symbol @code{and}, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 returns @code{t} if all the features in its cdr are present, @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 If @var{fexp} is a list whose car is the symbol @code{or}, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 returns @code{t} if any the features in its cdr are present, @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
630 If @var{fexp} is a list whose car is the symbol @code{not}, the function
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 returns @code{t} if the feature is not present, @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 Examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (featurep 'xemacs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 @result{} ; @r{t on XEmacs.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (featurep '(and xemacs gnus))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 @result{} ; @r{t on XEmacs with Gnus loaded.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (featurep '(or tty-frames (and emacs 19.30)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 @result{} ; @r{t if this Emacs supports TTY frames.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (featurep '(or (and xemacs 19.15) (and emacs 19.34)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 @result{} ; @r{t on XEmacs 19.15 and later, or on}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 ; @r{FSF Emacs 19.34 and later.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 @strong{Please note:} The advanced arguments of this function (anything other than a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 symbol) are not yet supported by FSF Emacs. If you feel they are useful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 for supporting multiple Emacs variants, lobby Richard Stallman at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 @samp{<bug-gnu-emacs@@prep.ai.mit.edu>}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 @defvar features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 The value of this variable is a list of symbols that are the features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 loaded in the current XEmacs session. Each symbol was put in this list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 with a call to @code{provide}. The order of the elements in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 @code{features} list is not significant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 @node Unloading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 @section Unloading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 @cindex unloading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 @c Emacs 19 feature
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 You can discard the functions and variables loaded by a library to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 reclaim memory for other Lisp objects. To do this, use the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 @code{unload-feature}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 @deffn Command unload-feature feature &optional force
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 This command unloads the library that provided feature @var{feature}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 It undefines all functions, macros, and variables defined in that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 library with @code{defconst}, @code{defvar}, @code{defun},
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
676 @code{defmacro}, @code{defsubst}, @code{define-function} and
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 @code{defalias}. It then restores any autoloads formerly associated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 with those symbols. (Loading saves these in the @code{autoload}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 property of the symbol.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 Ordinarily, @code{unload-feature} refuses to unload a library on which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 other loaded libraries depend. (A library @var{a} depends on library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 @var{b} if @var{a} contains a @code{require} for @var{b}.) If the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 optional argument @var{force} is non-@code{nil}, dependencies are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 ignored and you can unload any library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 @end deffn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 The @code{unload-feature} function is written in Lisp; its actions are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 based on the variable @code{load-history}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 @defvar load-history
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 This variable's value is an alist connecting library names with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 names of functions and variables they define, the features they provide,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 and the features they require.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 Each element is a list and describes one library. The @sc{car} of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 list is the name of the library, as a string. The rest of the list is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 composed of these kinds of objects:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 Symbols that were defined by this library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 Lists of the form @code{(require . @var{feature})} indicating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 features that were required.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 Lists of the form @code{(provide . @var{feature})} indicating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 features that were provided.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 The value of @code{load-history} may have one element whose @sc{car} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 @code{nil}. This element describes definitions made with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 @code{eval-buffer} on a buffer that is not visiting a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 The command @code{eval-region} updates @code{load-history}, but does so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 by adding the symbols defined to the element for the file being visited,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 rather than replacing that element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 @node Hooks for Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 @section Hooks for Loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 @cindex loading hooks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 @cindex hooks for loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 @ignore @c Not currently in XEmacs. JWZ hates it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 You can ask for code to be executed if and when a particular library is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 loaded, by calling @code{eval-after-load}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 @defun eval-after-load library form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 This function arranges to evaluate @var{form} at the end of loading the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 library @var{library}, if and when @var{library} is loaded. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 @var{library} is already loaded, it evaluates @var{form} right away.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 The library name @var{library} must exactly match the argument of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 @code{load}. To get the proper results when an installed library is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 found by searching @code{load-path}, you should not include any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 directory names in @var{library}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 An error in @var{form} does not undo the load, but does prevent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 execution of the rest of @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 In general, well-designed Lisp programs should not use this feature.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 The clean and modular ways to interact with a Lisp library are (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 examine and set the library's variables (those which are meant for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 outside use), and (2) call the library's functions. If you wish to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 do (1), you can do it immediately---there is no need to wait for when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 the library is loaded. To do (2), you must load the library (preferably
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 with @code{require}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 But it is ok to use @code{eval-after-load} in your personal customizations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 if you don't feel they must meet the design standards of programs to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 released.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 @defvar after-load-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 An alist of expressions to evaluate if and when particular libraries are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 loaded. Each element looks like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 (@var{filename} @var{forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 When @code{load} is run and the file-name argument is @var{filename},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 the @var{forms} in the corresponding element are executed at the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 loading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 @var{filename} must match exactly! Normally @var{filename} is the name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 of a library, with no directory specified, since that is how @code{load}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 is normally called. An error in @var{forms} does not undo the load, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 does prevent execution of the rest of the @var{forms}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 @ignore @c eval-after-load not in XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 The function @code{load} checks @code{after-load-alist} in order to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 implement @code{eval-after-load}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 @c Emacs 19 feature