commit 4328d3dba2cc4f6089a8efb964c2539164d5db91 (HEAD, refs/remotes/origin/master) Author: Paul Eggert Date: Fri Oct 16 19:01:36 2015 -0700 Fix quoting of data within htmlfontify doc * doc/misc/htmlfontify.texi (Data Structures, Customization): Fix quoting of data structures. A Lisp quote is needed only when data appears within Lisp code. diff --git a/doc/misc/htmlfontify.texi b/doc/misc/htmlfontify.texi index b14f2d3..1b0afdd 100644 --- a/doc/misc/htmlfontify.texi +++ b/doc/misc/htmlfontify.texi @@ -1153,8 +1153,8 @@ An assoc with elements of the form @samp{(face-name style-name . style-string)}. The actual stylesheet for each page is derived from one of these. @lisp -'((default "default" . "@{ background: black; color: white@}") - (font-lock-string-face "string" . "@{ color: rgb(64,224,208) @}")) +((default "default" . "@{ background: black; color: white@}") + (font-lock-string-face "string" . "@{ color: rgb(64,224,208) @}")) @end lisp @item hfy-facemap-assoc @@ -1173,24 +1173,24 @@ dealt with (and therefore no longer care about) will be invalid at any time. @lisp -'((64820 . end) - (64744 . font-lock-comment-face) - (64736 . end) - (64722 . font-lock-string-face) - (64630 . end) - (64623 . font-lock-string-face) - (64449 . end) - ;; Big similar section elided. You get the idea. - (5459 . end) - (5431 . (:inherit font-lock-keyword-face :background "7e7e7e")) - (5431 . end) - (4285 . font-lock-constant-face) - (4285 . end) - (4221 . font-lock-comment-face) - (4221 . end) - (4197 . font-lock-constant-face) - (4197 . end) - (1 . font-lock-comment-face)) +((64820 . end) + (64744 . font-lock-comment-face) + (64736 . end) + (64722 . font-lock-string-face) + (64630 . end) + (64623 . font-lock-string-face) + (64449 . end) + ;; Big similar section elided. You get the idea. + (5459 . end) + (5431 . (:inherit font-lock-keyword-face :background "7e7e7e")) + (5431 . end) + (4285 . font-lock-constant-face) + (4285 . end) + (4221 . font-lock-comment-face) + (4221 . end) + (4197 . font-lock-constant-face) + (4197 . end) + (1 . font-lock-comment-face)) @end lisp @end table @@ -1301,36 +1301,35 @@ access to the face spec you would use if you were connected to an X display. Some valid class specification elements are: @lisp - '(class color) - '(class grayscale) - '(background dark) - '(background light) - '(type x-toolkit) - '(type tty) - '(type motif) - '(type lucid) + (class color) + (class grayscale) + (background dark) + (background light) + (type x-toolkit) + (type tty) + (type motif) + (type lucid) @end lisp Multiple values for a tag may be combined, to indicate that any one or more -of these values in the specification key constitutes a match, eg: +of these values in the specification key constitutes a match. For +example, @code{((class color grayscale) (type tty))} would match any of: -'((class color grayscale) (type tty)) would match any of: @lisp - '((class color)) - '((class grayscale)) - '((class color grayscale))) - '((class color foo)) - '((type tty)) - '((type tty) (class color)) + ((class color)) + ((class grayscale)) + ((class color grayscale))) + ((class color foo)) + ((type tty)) + ((type tty) (class color)) @end lisp -and so on. @item hfy-page-header @vindex hfy-page-header @anchor{hfy-page-header} Function called with two arguments (the filename relative to the top -level source directory being etag'd and fontified), and a string containing +level source directory being etagged and fontified), and a string containing the @samp{} text to embed in the document---the string returned will be used as the header for the htmlfontified version of the source file. @@ -1355,7 +1354,7 @@ be large and take a long time to render or be difficult to navigate. @vindex hfy-find-cmd @anchor{hfy-find-cmd} -``find'' command used to harvest a list of files to attempt to fontify. +The ``find'' command used to harvest a list of files to attempt to fontify. @item hfy-extn @vindex hfy-extn commit 8868b834022379f81268b387363cd6a3ff1214b4 Author: Artur Malabarba Date: Fri Oct 16 23:54:38 2015 +0100 * emacs-lisp/package.el: Reload archive-contents if priorities change (package--old-archive-priorities): New variable. (package-read-all-archive-contents, package-menu--refresh): Use it to decide when the `package-archive-contents' needs to be read again. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 89f2a1a..2dbcdf6 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1364,10 +1364,18 @@ If the archive version is too new, signal an error." (dolist (package contents) (package--add-to-archive-contents package archive))))) +(defvar package--old-archive-priorities nil + "Store currently used `package-archive-priorities'. +This is the value of `package-archive-priorities' last time +`package-read-all-archive-contents' was called. It can be used +by arbitrary functions to decide whether it is necessary to call +it again.") + (defun package-read-all-archive-contents () "Re-read `archive-contents', if it exists. If successful, set `package-archive-contents'." (setq package-archive-contents nil) + (setq package--old-archive-priorities package-archive-priorities) (dolist (archive package-archives) (package-read-archive-contents (car archive)))) @@ -2675,6 +2683,8 @@ KEYWORDS should be nil or a list of keywords." (push pkg info-list))))) ;; Available and disabled packages: + (unless (equal package--old-archive-priorities package-archive-priorities) + (package-read-all-archive-contents)) (dolist (elt package-archive-contents) (let ((name (car elt))) ;; To be displayed it must be in PACKAGES; commit 55ba8c022b493b494bea257e4f523758154e0fdd Author: Paul Eggert Date: Fri Oct 16 14:54:09 2015 -0700 Make src headers idempotent and standalone Redo src/*.h so that each include file is idempotent (that is, can be included multiple times with the latter inclusions having no effect) and standalone (that is, can be included by itself, with no include file other than config.h needed as a prerequisite). This is standard practice in GNU programs nowadays. * lwlib/lwlib-widget.h, src/buffer.h, src/category.h, src/character.h: * src/charset.h, src/coding.h, src/commands.h, src/disptab.h: * src/fontset.h, src/gnutls.h, src/indent.h, src/keymap.h, src/macros.h: * src/regex.h [emacs]: * src/syntax.h, src/systty.h, src/termhooks.h: Include lisp.h, for Lisp_Object. * src/buffer.h, src/category.h, src/cm.h, src/commands.h, src/disptab.h: * src/indent.h, src/intervals.h, src/keyboard.h, src/macros.h: * src/process.h, src/puresize.h, src/region-cache.h, src/syntax.h: * src/syssignal.h, src/sysstdio.h, src/systty.h, src/termchar.h: * src/termopts.h, src/tparam.h, src/unexec.h: Protect against multiple inclusion. * src/buffer.h: Include character.h, for STRING_CHAR. * src/emacsgtkfixed.h (struct frame): * src/fontset.h (struct face): * src/region-cache.h (struct buffer): * src/termhooks.h (struct glyph): * src/xsettings.h (struct x_display_info): Add possibly-forward decl. * src/syntax.h: Include buffer.h, for BVAR. * src/sysselect.h: Include lisp.h, for eassume. * src/termchar.h: Include , for FILE. * src/widget.h: Include , for Widget. * src/xsettings.h: Include , for XEvent. diff --git a/lwlib/lwlib-widget.h b/lwlib/lwlib-widget.h index 92ae7e6..6ec6d27 100644 --- a/lwlib/lwlib-widget.h +++ b/lwlib/lwlib-widget.h @@ -23,6 +23,8 @@ along with GNU Emacs. If not, see . */ #ifndef LWLIB_WIDGET_H #define LWLIB_WIDGET_H +#include "../src/lisp.h" + typedef enum { NO_CHANGE = 0, @@ -96,7 +98,7 @@ typedef struct _widget_value /* Whether we should free the toolkit data slot when freeing the widget_value itself. */ bool free_toolkit_data; -#endif +#endif } widget_value; diff --git a/src/buffer.h b/src/buffer.h index a0410d4..f80530a 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -18,9 +18,15 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_BUFFER_H +#define EMACS_BUFFER_H + #include #include +#include "character.h" +#include "lisp.h" + INLINE_HEADER_BEGIN /* Accessing the parameters of the current buffer. */ @@ -1377,3 +1383,5 @@ lowercasep (int c) INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); } INLINE_HEADER_END + +#endif /* EMACS_BUFFER_H */ diff --git a/src/category.h b/src/category.h index ef784c8..02f9a19 100644 --- a/src/category.h +++ b/src/category.h @@ -22,6 +22,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_CATEGORY_H +#define EMACS_CATEGORY_H /* We introduce here three types of object: category, category set, and category table. @@ -53,6 +55,8 @@ along with GNU Emacs. If not, see . */ The second extra slot is a version number of the category table. But, for the moment, we are not using this slot. */ +#include "lisp.h" + INLINE_HEADER_BEGIN #define CATEGORYP(x) RANGED_INTEGERP (0x20, x, 0x7E) @@ -116,3 +120,5 @@ CHAR_HAS_CATEGORY (int ch, int category) extern bool word_boundary_p (int, int); INLINE_HEADER_END + +#endif /* EMACS_CATEGORY_H */ diff --git a/src/character.h b/src/character.h index 67d4bca..871c1c3 100644 --- a/src/character.h +++ b/src/character.h @@ -24,6 +24,7 @@ along with GNU Emacs. If not, see . */ #define EMACS_CHARACTER_H #include +#include "lisp.h" INLINE_HEADER_BEGIN diff --git a/src/charset.h b/src/charset.h index f657598..d2daf2b 100644 --- a/src/charset.h +++ b/src/charset.h @@ -28,6 +28,7 @@ along with GNU Emacs. If not, see . */ #define EMACS_CHARSET_H #include +#include "lisp.h" INLINE_HEADER_BEGIN diff --git a/src/cm.h b/src/cm.h index 829abc0..1ade6d1 100644 --- a/src/cm.h +++ b/src/cm.h @@ -16,6 +16,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_CM_H +#define EMACS_CM_H + /* Holds the minimum and maximum costs for the parameterized capabilities. */ struct parmcap { @@ -166,3 +169,5 @@ extern void cmcostinit (struct tty_display_info *); extern void cmgoto (struct tty_display_info *, int, int); extern void Wcm_clear (struct tty_display_info *); extern int Wcm_init (struct tty_display_info *); + +#endif /* EMACS_CM_H */ diff --git a/src/coding.h b/src/coding.h index c73a9cc..2bf51c4 100644 --- a/src/coding.h +++ b/src/coding.h @@ -26,6 +26,8 @@ along with GNU Emacs. If not, see . */ #ifndef EMACS_CODING_H #define EMACS_CODING_H +#include "lisp.h" + /* Index to arguments of Fdefine_coding_system_internal. */ enum define_coding_system_arg_index diff --git a/src/commands.h b/src/commands.h index 19cd2e4..e938334 100644 --- a/src/commands.h +++ b/src/commands.h @@ -16,6 +16,10 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_COMMANDS_H +#define EMACS_COMMANDS_H + +#include "lisp.h" #define Ctl(c) ((c)&037) @@ -39,3 +43,5 @@ extern Lisp_Object unread_switch_frame; /* Nonzero if input is coming from the keyboard. */ #define INTERACTIVE (NILP (Vexecuting_kbd_macro) && !noninteractive) + +#endif /* EMACS_COMMANDS_H */ diff --git a/src/disptab.h b/src/disptab.h index 7afc862..3a319c4 100644 --- a/src/disptab.h +++ b/src/disptab.h @@ -18,6 +18,11 @@ along with GNU Emacs. If not, see . */ /* Access the slots of a display-table, according to their purpose. */ +#ifndef EMACS_DISPTAB_H +#define EMACS_DISPTAB_H + +#include "lisp.h" + #define DISP_TABLE_P(obj) \ (CHAR_TABLE_P (obj) \ && EQ (XCHAR_TABLE (obj)->purpose, Qdisplay_table) \ @@ -92,3 +97,5 @@ extern struct Lisp_Char_Table *buffer_display_table (void); #define SET_GLYPH_FROM_CHAR(glyph, c) \ SET_GLYPH (glyph, c, DEFAULT_FACE_ID) + +#endif /* EMACS_DISPTAB_H */ diff --git a/src/emacsgtkfixed.h b/src/emacsgtkfixed.h index bcf1cd9..a969a6d 100644 --- a/src/emacsgtkfixed.h +++ b/src/emacsgtkfixed.h @@ -23,6 +23,8 @@ along with GNU Emacs. If not, see . */ #include +struct frame; + G_BEGIN_DECLS extern GtkWidget *emacs_fixed_new (struct frame *f); diff --git a/src/fontset.h b/src/fontset.h index 6103944..aa69051 100644 --- a/src/fontset.h +++ b/src/fontset.h @@ -26,6 +26,10 @@ along with GNU Emacs. If not, see . */ #ifndef EMACS_FONTSET_H #define EMACS_FONTSET_H +#include "lisp.h" + +struct face; + extern void free_face_fontset (struct frame *, struct face *); extern int face_for_char (struct frame *, struct face *, int, ptrdiff_t, Lisp_Object); diff --git a/src/gnutls.h b/src/gnutls.h index fd69682..9c804b8 100644 --- a/src/gnutls.h +++ b/src/gnutls.h @@ -23,6 +23,8 @@ along with GNU Emacs. If not, see . */ #include #include +#include "lisp.h" + /* This limits the attempts to handshake per process (connection). */ #define GNUTLS_EMACS_HANDSHAKES_LIMIT 100 diff --git a/src/indent.h b/src/indent.h index cece9e4..037fd74 100644 --- a/src/indent.h +++ b/src/indent.h @@ -16,6 +16,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_INDENT_H +#define EMACS_INDENT_H + +#include "lisp.h" + struct position { ptrdiff_t bufpos; @@ -51,3 +56,5 @@ bool disptab_matches_widthtab (struct Lisp_Char_Table *disptab, /* Recompute BUF's width table, using the display table DISPTAB. */ void recompute_width_table (struct buffer *buf, struct Lisp_Char_Table *disptab); + +#endif /* EMACS_INDENT_H */ diff --git a/src/intervals.h b/src/intervals.h index 30fb4b1..5a7829d 100644 --- a/src/intervals.h +++ b/src/intervals.h @@ -16,6 +16,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_INTERVALS_H +#define EMACS_INTERVALS_H + #include "dispextern.h" INLINE_HEADER_BEGIN @@ -295,3 +298,5 @@ extern void syms_of_textprop (void); #include "composite.h" INLINE_HEADER_END + +#endif /* EMACS_INTERVALS_H */ diff --git a/src/keyboard.h b/src/keyboard.h index 0402e0a..67afc3b 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -17,6 +17,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_KEYBOARD_H +#define EMACS_KEYBOARD_H + #include "systime.h" /* for struct timespec, Time */ #include "coding.h" /* for ENCODE_UTF_8 and ENCODE_SYSTEM */ #include "termhooks.h" @@ -483,3 +486,5 @@ extern const char *const lispy_function_keys[]; #endif INLINE_HEADER_END + +#endif /* EMACS_KEYBOARD_H */ diff --git a/src/keymap.h b/src/keymap.h index 215dd3f..e7a3b0a 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -19,6 +19,8 @@ along with GNU Emacs. If not, see . */ #ifndef KEYMAP_H #define KEYMAP_H +#include "lisp.h" + /* The maximum byte size consumed by push_key_description. All callers should assure that at least this size of memory is allocated at the place pointed by the second argument. diff --git a/src/macros.h b/src/macros.h index eab8041..46150ad 100644 --- a/src/macros.h +++ b/src/macros.h @@ -16,6 +16,10 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_MACROS_H +#define EMACS_MACROS_H + +#include "lisp.h" /* Number of successful iterations so far for innermost keyboard macro. @@ -42,3 +46,5 @@ extern void finalize_kbd_macro_chars (void); /* Store a character into kbd macro being defined */ extern void store_kbd_macro_char (Lisp_Object); + +#endif /* EMACS_MACROS_H */ diff --git a/src/process.h b/src/process.h index 24bad45..9ee5a05 100644 --- a/src/process.h +++ b/src/process.h @@ -16,6 +16,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_PROCESS_H +#define EMACS_PROCESS_H + #ifdef HAVE_SYS_TYPES_H #include #endif @@ -243,3 +246,5 @@ extern Lisp_Object network_interface_info (Lisp_Object); extern Lisp_Object remove_slash_colon (Lisp_Object); INLINE_HEADER_END + +#endif /* EMACS_PROCESS_H */ diff --git a/src/puresize.h b/src/puresize.h index c61b31f..f075624 100644 --- a/src/puresize.h +++ b/src/puresize.h @@ -16,6 +16,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_PURESIZE_H +#define EMACS_PURESIZE_H + +#include "lisp.h" + INLINE_HEADER_BEGIN /* Define PURESIZE, the number of bytes of pure Lisp code to leave space for. @@ -92,3 +97,5 @@ CHECK_IMPURE (Lisp_Object obj, void *ptr) } INLINE_HEADER_END + +#endif /* EMACS_PURESIZE_H */ diff --git a/src/regex.h b/src/regex.h index c89ca46..eaa7729 100644 --- a/src/regex.h +++ b/src/regex.h @@ -167,6 +167,7 @@ typedef unsigned long reg_syntax_t; extern reg_syntax_t re_syntax_options; #ifdef emacs +# include "lisp.h" /* In Emacs, this is the string or buffer in which we are matching. It is used for looking up syntax properties. */ extern Lisp_Object re_match_object; diff --git a/src/region-cache.h b/src/region-cache.h index 1f336ce..2814df4 100644 --- a/src/region-cache.h +++ b/src/region-cache.h @@ -18,6 +18,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_REGION_CACHE_H +#define EMACS_REGION_CACHE_H /* This code was written by Jim Blandy to help GNU Emacs better support the gene editor written for the University @@ -60,6 +62,7 @@ along with GNU Emacs. If not, see . */ this region has property P" vs. "I don't know if this region has property P or not." */ +struct buffer; /* Allocate, initialize and return a new, empty region cache. */ struct region_cache *new_region_cache (void); @@ -105,3 +108,5 @@ extern int region_cache_forward (struct buffer *buf, struct region_cache *c, /* Likewise, except before POS rather than after POS. */ extern int region_cache_backward (struct buffer *buf, struct region_cache *c, ptrdiff_t pos, ptrdiff_t *next); + +#endif /* EMACS_REGION_CACHE_H */ diff --git a/src/syntax.h b/src/syntax.h index 34b652b..06ce0ec 100644 --- a/src/syntax.h +++ b/src/syntax.h @@ -18,6 +18,12 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_SYNTAX_H +#define EMACS_SYNTAX_H + +#include "buffer.h" +#include "lisp.h" + INLINE_HEADER_BEGIN extern void update_syntax_table (ptrdiff_t, EMACS_INT, bool, Lisp_Object); @@ -213,3 +219,5 @@ extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT); extern void SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t, ptrdiff_t); INLINE_HEADER_END + +#endif /* EMACS_SYNTAX_H */ diff --git a/src/sysselect.h b/src/sysselect.h index 54f90fb..d6c5d1c 100644 --- a/src/sysselect.h +++ b/src/sysselect.h @@ -23,6 +23,8 @@ along with GNU Emacs. If not, see . */ #include #endif +#include "lisp.h" + /* The w32 build defines select stuff in w32.h, which is included where w32 needs it, but not where sysselect.h is included. The w32 definitions in w32.h are incompatible with the below. */ diff --git a/src/syssignal.h b/src/syssignal.h index 5c14479..ec60994 100644 --- a/src/syssignal.h +++ b/src/syssignal.h @@ -17,6 +17,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_SYSSIGNAL_H +#define EMACS_SYSSIGNAL_H + #include extern void init_signals (bool); @@ -72,3 +75,5 @@ char const *safe_strsignal (int) ATTRIBUTE_CONST; #endif void deliver_process_signal (int, signal_handler_t); + +#endif /* EMACS_SYSSIGNAL_H */ diff --git a/src/sysstdio.h b/src/sysstdio.h index c97c4f8..1668230 100644 --- a/src/sysstdio.h +++ b/src/sysstdio.h @@ -17,6 +17,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_SYSSTDIO_H +#define EMACS_SYSSTDIO_H + #include #include @@ -29,3 +32,5 @@ extern FILE *emacs_fopen (char const *, char const *); # define FOPEN_BINARY "" # define FOPEN_TEXT "" #endif + +#endif /* EMACS_SYSSTDIO_H */ diff --git a/src/systty.h b/src/systty.h index 3a46156..1022455 100644 --- a/src/systty.h +++ b/src/systty.h @@ -16,6 +16,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_SYSTTY_H +#define EMACS_SYSTTY_H + /* Include the proper files. */ #ifndef DOS_NT @@ -37,6 +40,8 @@ along with GNU Emacs. If not, see . */ #include +#include "lisp.h" + /* Try to establish the correct character to disable terminal functions in a system-independent manner. Note that USG (at least) define @@ -85,3 +90,5 @@ extern int emacs_set_tty (int, struct emacs_tty *, bool) EXTERNALLY_VISIBLE; extern void suppress_echo_on_tty (int); extern int serial_open (Lisp_Object); extern void serial_configure (struct Lisp_Process *, Lisp_Object); + +#endif /* EMACS_SYSTTY_H */ diff --git a/src/termchar.h b/src/termchar.h index d8066d7..06c0427 100644 --- a/src/termchar.h +++ b/src/termchar.h @@ -16,6 +16,10 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_TERMCHAR_H +#define EMACS_TERMCHAR_H + +#include #include "dispextern.h" /* Each termcap frame points to its own struct tty_output object in @@ -230,3 +234,5 @@ extern struct tty_display_info *tty_list; : (emacs_abort (), (struct tty_display_info *) 0)) #define CURTTY() FRAME_TTY (SELECTED_FRAME()) + +#endif /* EMACS_TERMCHAR_H */ diff --git a/src/termhooks.h b/src/termhooks.h index 88c62df..8bde987 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -23,8 +23,11 @@ along with GNU Emacs. If not, see . */ /* Miscellanea. */ +#include "lisp.h" #include "systime.h" /* for Time */ +struct glyph; + INLINE_HEADER_BEGIN enum scroll_bar_part { diff --git a/src/termopts.h b/src/termopts.h index c54d392..c5cd563 100644 --- a/src/termopts.h +++ b/src/termopts.h @@ -17,9 +17,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_TERMOPTS_H +#define EMACS_TERMOPTS_H /* Nonzero means use interrupt-driven input. */ extern bool interrupt_input; /* Nonzero while interrupts are temporarily deferred during redisplay. */ extern bool interrupts_deferred; + +#endif /* EMACS_TERMOPTS_H */ diff --git a/src/tparam.h b/src/tparam.h index 59fc859..b391e89 100644 --- a/src/tparam.h +++ b/src/tparam.h @@ -17,6 +17,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ +#ifndef EMACS_TPARAM_H +#define EMACS_TPARAM_H /* Don't try to include termcap.h. On some systems, configure finds a non-standard termcap.h that the main build won't find. */ @@ -33,3 +35,5 @@ char *tparam (const char *, char *, int, int, int, int, int); extern char PC; extern char *BC; extern char *UP; + +#endif /* EMACS_TPARAM_H */ diff --git a/src/unexec.h b/src/unexec.h index 343eb6d8..cdb2e80 100644 --- a/src/unexec.h +++ b/src/unexec.h @@ -1 +1,4 @@ +#ifndef EMACS_UNEXEC_H +#define EMACS_UNEXEC_H void unexec (const char *, const char *); +#endif /* EMACS_UNEXEC_H */ diff --git a/src/widget.h b/src/widget.h index a782035..e2e19b0 100644 --- a/src/widget.h +++ b/src/widget.h @@ -21,6 +21,8 @@ along with GNU Emacs. If not, see . */ #ifndef _EmacsFrame_h #define _EmacsFrame_h +#include + #define XtNminibuffer "minibuffer" #define XtCMinibuffer "Minibuffer" #define XtNunsplittable "unsplittable" diff --git a/src/xsettings.h b/src/xsettings.h index 7ef94a0..71b71d6 100644 --- a/src/xsettings.h +++ b/src/xsettings.h @@ -20,6 +20,10 @@ along with GNU Emacs. If not, see . */ #ifndef XSETTINGS_H #define XSETTINGS_H +#include + +struct x_display_info; + extern void xsettings_initialize (struct x_display_info *); extern void xft_settings_event (struct x_display_info *, const XEvent *); extern const char *xsettings_get_system_font (void); commit 1e1a326c0f609f403c625bd9082e1099a4d9a52a Author: Jürgen Hötzel Date: Fri Oct 16 19:46:18 2015 +0200 Handle symlink targets containing spaces in tramp-gvfs.el * lisp/net/tramp-gvfs.el (tramp-gvfs-handle-file-attributes): Handle symlink targets containing spaces. diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index 463b997..b9d2fa2 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -813,7 +813,7 @@ file names." (goto-char (point-min)) (setq res-symlink-target (if (re-search-forward - "standard::symlink-target:\\s-+\\(\\S-+\\)" nil t) + "standard::symlink-target:\\s-+\\(.*\\)$" nil t) (match-string 1))) ;; ... number links (goto-char (point-min)) commit 995b69918bddb58536b5d09d2127179314e1fffb Author: Artur Malabarba Date: Fri Oct 16 16:10:38 2015 +0100 * custom.el (custom-theme-load-path): Demote to defvar `custom-theme-load-path' was a defcustom, but it shouldn't be for the same reason that `load-path' shouldn't. Setting it via the customize interface is a trap for the user. Installed themes commonly add themselves to this variable, which means its value is not fit for being saved (it will permanently remember dirs that don't exist anymore). This is aggravated by the fact that Emacs always applies the `user' theme on top of any theme that's loaded, since this will apply the old variable value and remove any new directories that had been recently added by themes themselves. Not to mention, we already have `custom-theme-directory', which is safe to customize. diff --git a/lisp/custom.el b/lisp/custom.el index e212e32..c5d0e65 100644 --- a/lisp/custom.el +++ b/lisp/custom.el @@ -1120,7 +1120,7 @@ directory first---see `custom-theme-load-path'." :group 'customize :version "22.1") -(defcustom custom-theme-load-path (list 'custom-theme-directory t) +(defvar custom-theme-load-path (list 'custom-theme-directory t) "List of directories to search for custom theme files. When loading custom themes (e.g. in `customize-themes' and `load-theme'), Emacs searches for theme files in the specified @@ -1132,13 +1132,11 @@ order. Each element in the list should be one of the following: - a directory name (a string). Each theme file is named THEME-theme.el, where THEME is the theme -name." - :type '(repeat (choice (const :tag "custom-theme-directory" - custom-theme-directory) - (const :tag "Built-in theme directory" t) - directory)) - :group 'customize - :version "24.1") +name. + +This variable is designed for use in lisp code (including +external packages). For manual user customizations, use +`custom-theme-directory' instead.") (defvar custom--inhibit-theme-enable nil "Whether the custom-theme-set-* functions act immediately. commit ce47ac81f6aaa347942fb7f7173b349bd1a231c1 Author: Stefan Monnier Date: Fri Oct 16 09:56:05 2015 -0400 * lisp/mpc.el: Rename the new toggling commands (mpc-toggle-consume, mpc-toggle-repeat, mpc-toggle-single) (mpc-toggle-shuffle): Add "-toggle" in the name. diff --git a/lisp/mpc.el b/lisp/mpc.el index 8cbea4f..af1aac9 100644 --- a/lisp/mpc.el +++ b/lisp/mpc.el @@ -1134,17 +1134,17 @@ If PLAYLIST is t or nil or missing, use the main playlist." (easy-menu-define mpc-mode-menu mpc-mode-map "Menu for MPC.el." '("MPC.el" - ["Play/Pause" mpc-toggle-play] - ["Next Track" mpc-next] - ["Previous Track" mpc-prev] + ["Play/Pause" mpc-toggle-play] ;FIXME: Add one of ⏯/▶/⏸ in there? + ["Next Track" mpc-next] ;FIXME: Add ⇥ there? + ["Previous Track" mpc-prev] ;FIXME: Add ⇤ there? "--" - ["Repeat Playlist" mpc-repeat :style toggle + ["Repeat Playlist" mpc-toggle-repeat :style toggle :selected (member '(repeat . "1") mpc-status)] - ["Shuffle Playlist" mpc-shuffle :style toggle + ["Shuffle Playlist" mpc-toggle-shuffle :style toggle :selected (member '(random . "1") mpc-status)] - ["Repeat Single Track" mpc-single :style toggle + ["Repeat Single Track" mpc-toggle-single :style toggle :selected (member '(single . "1") mpc-status)] - ["Consume Mode" mpc-consume :style toggle + ["Consume Mode" mpc-toggle-consume :style toggle :selected (member '(consume . "1") mpc-status)] "--" ["Add new browser" mpc-tagbrowser] @@ -2362,25 +2362,25 @@ This is used so that they can be compared with `eq', which is needed for (mpc-status-stop) (if proc (delete-process proc)))) -(defun mpc-consume () +(defun mpc-toggle-consume () "Toggle consume mode: removing played songs from the playlist." (interactive) (mpc-cmd-consume (if (string= "0" (cdr (assq 'consume (mpc-cmd-status)))) "1" "0"))) -(defun mpc-repeat () +(defun mpc-toggle-repeat () "Toggle repeat mode." (interactive) (mpc-cmd-repeat (if (string= "0" (cdr (assq 'repeat (mpc-cmd-status)))) "1" "0"))) -(defun mpc-single () +(defun mpc-toggle-single () "Toggle single mode." (interactive) (mpc-cmd-single (if (string= "0" (cdr (assq 'single (mpc-cmd-status)))) "1" "0"))) -(defun mpc-shuffle () +(defun mpc-toggle-shuffle () "Toggle shuffling of the playlist (random mode)." (interactive) (mpc-cmd-random commit 1158df5f677c1c9ac8649910a680c17b53452753 Author: Eli Zaretskii Date: Fri Oct 16 16:42:11 2015 +0300 Improve the doc string of 'completion-boundaries' * lisp/minibuffer.el (completion-boundaries): Rename the argument TABLE to COLLECTION, for consistency with other high-level completion functions. Document how COLLECTION is called if it is a function. (Bug#21644) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 2814d02..6123750 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -92,18 +92,21 @@ ;;; Completion table manipulation ;; New completion-table operation. -(defun completion-boundaries (string table pred suffix) - "Return the boundaries of the completions returned by TABLE for STRING. +(defun completion-boundaries (string collection pred suffix) + "Return the boundaries of text on which COLLECTION will operate. STRING is the string on which completion will be performed. SUFFIX is the string after point. +If COLLECTION is a function, it is called with 3 arguments: STRING, +PRED, and a cons cell of the form (boundaries . SUFFIX). + The result is of the form (START . END) where START is the position in STRING of the beginning of the completion field and END is the position in SUFFIX of the end of the completion field. E.g. for simple completion tables, the result is always (0 . (length SUFFIX)) and for file names the result is the positions delimited by the closest directory separators." - (let ((boundaries (if (functionp table) - (funcall table string pred + (let ((boundaries (if (functionp collection) + (funcall collection string pred (cons 'boundaries suffix))))) (if (not (eq (car-safe boundaries) 'boundaries)) (setq boundaries nil)) commit 3f24a31fb760537e9b9cc994e8431f045d526f4b Author: Oleh Krehel Date: Fri Oct 16 14:45:22 2015 +0200 lisp/dired-aux.el (dired-shell-command): Fix compile warning diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 7469eb9..8c575c6 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -792,16 +792,15 @@ On error, pop up the log buffer." (let ((out-buffer " *dired-check-process output*")) (with-current-buffer (get-buffer-create out-buffer) (erase-buffer) - (setq res - (process-file - shell-file-name - nil - t - nil - shell-command-switch - cmd))) - (unless (zerop res) - (pop-to-buffer out-buffer)))) + (let ((res (process-file + shell-file-name + nil + t + nil + shell-command-switch + cmd))) + (unless (zerop res) + (pop-to-buffer out-buffer)))))) ;; Commands that delete or redisplay part of the dired buffer. diff --git a/lisp/dired.el b/lisp/dired.el index 232abf6..14c7f4b 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3896,7 +3896,7 @@ Ask means pop up a menu for the user to select one of copy, move or link." ;;; Start of automatically extracted autoloads. -;;;### (autoloads nil "dired-aux" "dired-aux.el" "9565afd70e820a750c6452d45776005d") +;;;### (autoloads nil "dired-aux" "dired-aux.el" "3921477843dc9d08d6896f07f90e8c6e") ;;; Generated autoloads from dired-aux.el (autoload 'dired-diff "dired-aux" "\ commit 7175459da149da7e46dc799796ad670eb122273d Author: Oleh Krehel Date: Fri Oct 16 13:57:22 2015 +0200 Make dired-do-compress work for *.zip files * lisp/dired-aux.el (dired-check-process): Transform the top-level comment into a docstring. (dired-shell-command): New command. This mirrors `dired-check-process', but is more user-friendly for passing arguments. (dired-compress-file-suffixes): Allow to specify the command switches along with input (%i) and output (%o) inside the PROGRAM part. Add an entry for *.zip files, and update the entry for *.tar.gz files to the new style. Update the docstring. (dired-compress-file): When PROGRAM matches %i or %o, use the new logic. (dired-update-file-line): Avoid an error when at end of buffer. Fixes Bug#21637 diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index f1f9436..7469eb9 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -762,12 +762,12 @@ can be produced by `dired-get-marked-files', for example." (defun dired-check-process (msg program &rest arguments) -; "Display MSG while running PROGRAM, and check for output. -;Remaining arguments are strings passed as command arguments to PROGRAM. -; On error, insert output -; in a log buffer and return the offending ARGUMENTS or PROGRAM. -; Caller can cons up a list of failed args. -;Else returns nil for success." + "Display MSG while running PROGRAM, and check for output. +Remaining arguments are strings passed as command arguments to PROGRAM. +On error, insert output +in a log buffer and return the offending ARGUMENTS or PROGRAM. +Caller can cons up a list of failed args. +Else returns nil for success." (let (err-buffer err (dir default-directory)) (message "%s..." msg) (save-excursion @@ -785,6 +785,23 @@ can be produced by `dired-get-marked-files', for example." (kill-buffer err-buffer) (message "%s...done" msg) nil)))) + +(defun dired-shell-command (cmd) + "Run CMD, and check for output. +On error, pop up the log buffer." + (let ((out-buffer " *dired-check-process output*")) + (with-current-buffer (get-buffer-create out-buffer) + (erase-buffer) + (setq res + (process-file + shell-file-name + nil + t + nil + shell-command-switch + cmd))) + (unless (zerop res) + (pop-to-buffer out-buffer)))) ;; Commands that delete or redisplay part of the dired buffer. @@ -864,7 +881,7 @@ command with a prefix argument (the value does not matter)." from-file))) (defvar dired-compress-file-suffixes - '(("\\.tar\\.gz" "" "tar" "-zxvf") + '(("\\.tar\\.gz\\'" "" "tar -zxvf %i") ("\\.gz\\'" "" "gunzip") ("\\.tgz\\'" ".tar" "gunzip") ("\\.Z\\'" "" "uncompress") @@ -875,16 +892,21 @@ command with a prefix argument (the value does not matter)." ("\\.tbz\\'" ".tar" "bunzip2") ("\\.bz2\\'" "" "bunzip2") ("\\.xz\\'" "" "unxz") + ("\\.zip\\'" "" "unzip -o -d %o %i") ;; This item controls naming for compression. ("\\.tar\\'" ".tgz" nil)) "Control changes in file name suffixes for compression and uncompression. Each element specifies one transformation rule, and has the form: - (REGEXP NEW-SUFFIX PROGRAM &rest ARGS) + (REGEXP NEW-SUFFIX PROGRAM) The rule applies when the old file name matches REGEXP. The new file name is computed by deleting the part that matches REGEXP (as well as anything after that), then adding NEW-SUFFIX in its place. If PROGRAM is non-nil, the rule is an uncompression rule, and uncompression is done by running PROGRAM. + +Within PROGRAM, %i denotes the input file, and %o denotes the +output file. + Otherwise, the rule is a compression rule, and compression is done with gzip. ARGS are command switches passed to PROGRAM.") @@ -895,7 +917,8 @@ Return the name of the compressed or uncompressed file. Return nil if no change in files." (let ((handler (find-file-name-handler file 'dired-compress-file)) suffix newname - (suffixes dired-compress-file-suffixes)) + (suffixes dired-compress-file-suffixes) + command) ;; See if any suffix rule matches this file name. (while suffixes (let (case-fold-search) @@ -910,13 +933,22 @@ Return nil if no change in files." (funcall handler 'dired-compress-file file)) ((file-symlink-p file) nil) - ((and suffix (nth 2 suffix)) - ;; We found an uncompression rule. - (when (not (apply 'dired-check-process - `(,(concat "Uncompressing " file) - ,@(cddr suffix) - ,file))) - newname)) + ((and suffix (setq command (nth 2 suffix))) + (if (string-match "%[io]" command) + (prog1 (setq newname (file-name-as-directory newname)) + (dired-shell-command + (replace-regexp-in-string + "%o" newname + (replace-regexp-in-string + "%i" file + command)))) + ;; We found an uncompression rule. + (when (not + (dired-check-process + (concat "Uncompressing " file) + command + file)) + newname))) (t ;; We don't recognize the file as compressed, so compress it. ;; Try gzip; if we don't have that, use compress. @@ -931,8 +963,10 @@ Return nil if no change in files." (not (if (file-directory-p file) (let ((default-directory (file-name-directory file))) - (dired-check-process (concat "Compressing " file) - "tar" "-czf" out-name (file-name-nondirectory file))) + (dired-check-process + (concat "Compressing " file) + "tar" "-czf" + out-name (file-name-nondirectory file))) (dired-check-process (concat "Compressing " file) "gzip" "-f" file))) (or (file-exists-p out-name) @@ -1132,15 +1166,16 @@ See Info node `(emacs)Subdir switches' for more details." ;; here is faster than with dired-add-entry's optional arg). ;; Does not update other dired buffers. Use dired-relist-entry for that. (let* ((opoint (line-beginning-position)) - (char (char-after opoint)) - (buffer-read-only)) + (char (char-after opoint)) + (buffer-read-only)) (delete-region opoint (progn (forward-line 1) (point))) (if file - (progn - (dired-add-entry file nil t) - ;; Replace space by old marker without moving point. - ;; Faster than goto+insdel inside a save-excursion? - (subst-char-in-region opoint (1+ opoint) ?\040 char)))) + (progn + (dired-add-entry file nil t) + ;; Replace space by old marker without moving point. + ;; Faster than goto+insdel inside a save-excursion? + (when char + (subst-char-in-region opoint (1+ opoint) ?\040 char))))) (dired-move-to-filename)) ;;;###autoload commit b0d190fbe2cd4a092fa186b3d674ec89ff000776 Author: Eli Zaretskii Date: Fri Oct 16 13:01:53 2015 +0300 Minor improvement in documentation of internals * doc/lispref/internals.texi (Writing Emacs Primitives): Document QUIT. diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi index 20681c0..e620da0 100644 --- a/doc/lispref/internals.texi +++ b/doc/lispref/internals.texi @@ -660,6 +660,7 @@ usage: (or CONDITIONS...) */) if (!NILP (val)) break; args = XCDR (args); + QUIT; @} @end group @@ -779,6 +780,14 @@ their addresses after performing Lisp evaluation. Lisp evaluation can occur via calls to @code{eval_sub} or @code{Feval}, either directly or indirectly. +@cindex @code{QUIT}, use in Lisp primitives + Note the call to the @code{QUIT} macro inside the loop: this macro +checks whether the user pressed @kbd{C-g}, and if so, aborts the +processing. You should do that in any loop that can potentially +require a large number of iterations; in this case, the list of +arguments could be very long. This increases Emacs responsiveness and +improves user experience. + You must not use C initializers for static or global variables unless the variables are never written once Emacs is dumped. These variables with initializers are allocated in an area of memory that becomes commit d05410f349661768845a8c16a9d473b175d6a1de Author: Eli Zaretskii Date: Fri Oct 16 12:38:36 2015 +0300 Improve documentation of COLLECTION in completion functions * doc/lispref/minibuf.texi (Minibuffer Completion): Add a cross-reference to "Programmed Completion". * src/minibuf.c (Fcompleting_read): Improve the doc string. (Bug#21644) diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi index 96c1020..0b1a4a9 100644 --- a/doc/lispref/minibuf.texi +++ b/doc/lispref/minibuf.texi @@ -975,6 +975,9 @@ Thus, if @var{predicate} is non-@code{nil}, it should be compatible with @var{collection} and @code{completion-ignore-case}. @xref{Definition of test-completion}. +@xref{Programmed Completion}, for detailed requirements when +@var{collection} is a function. + The value of the optional argument @var{require-match} determines how the user may exit the minibuffer: diff --git a/src/minibuf.c b/src/minibuf.c index 2cde8b0..e149e81 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -1595,8 +1595,11 @@ PROMPT is a string to prompt with; normally it ends in a colon and a space. COLLECTION can be a list of strings, an alist, an obarray or a hash table. COLLECTION can also be a function to do the completion itself. PREDICATE limits completion to a subset of COLLECTION. -See Info node `(elisp)Basic Completion' for more details - on completion, COLLECTION, and PREDICATE. +See `try-completion', `all-completions', `test-completion', +and `completion-boundaries', for more details on completion, +COLLECTION, and PREDICATE. See also Info nodes `(elisp)Basic Completion' +for the details about completion, and `(elisp)Programmed Completion' for +expectations from COLLECTION when it's a function. REQUIRE-MATCH can take the following values: - t means that the user is not allowed to exit unless commit 3000d33c5db303efe377b3e21c9c748e7ac750a0 Author: Eli Zaretskii Date: Fri Oct 16 11:56:52 2015 +0300 ; More updates and corrections in etc/HISTORY diff --git a/etc/HISTORY b/etc/HISTORY index 092e133..0426425 100644 --- a/etc/HISTORY +++ b/etc/HISTORY @@ -83,7 +83,9 @@ GNU Emacs 18.58 (1991-02-18) GNU Emacs 18.59 (1992-10-30) -GNU Emacs 19.8 (1993-05-25) +GNU Emacs 19.7 (1993-05-22) + +GNU Emacs 19.8 (1993-05-24) GNU Emacs 19.9 (1993-05-27) @@ -109,17 +111,21 @@ GNU Emacs 19.19 (1993-08-14) GNU Emacs 19.20 (1993-11-11) +GNU Emacs 19.21 (1993-11-16) + GNU Emacs 19.22 (1993-11-27) +GNU Emacs 19.23 (1994-05-16) + GNU Emacs 19.24 (1994-05-23) GNU Emacs 19.25 (1994-05-30) GNU Emacs 19.26 (1994-09-07) -GNU Emacs 19.28 (1994-11-01) +GNU Emacs 19.28 (1994-10-06) -GNU Emacs 19.29 (1995-06-21) +GNU Emacs 19.29 (1995-06-19) GNU Emacs 19.30 (1995-11-24) @@ -131,9 +137,9 @@ GNU Emacs 19.33 (1996-08-11) GNU Emacs 19.34 (1996-08-21) -GNU Emacs 20.1 (1997-09-17) +GNU Emacs 20.1 (1997-09-15) -GNU Emacs 20.2 (1997-09-20) +GNU Emacs 20.2 (1997-09-19) GNU Emacs 20.3 (1998-08-19) commit 1c8ccba72f715a342b98d58a4063e42e5a1a1ab9 Author: Eli Zaretskii Date: Fri Oct 16 11:45:01 2015 +0300 Add more release info to etc/HISTORY * etc/HISTORY: Add more release information about 19.x and 20.x versions. diff --git a/etc/HISTORY b/etc/HISTORY index d19ca48..092e133 100644 --- a/etc/HISTORY +++ b/etc/HISTORY @@ -83,6 +83,40 @@ GNU Emacs 18.58 (1991-02-18) GNU Emacs 18.59 (1992-10-30) +GNU Emacs 19.8 (1993-05-25) + +GNU Emacs 19.9 (1993-05-27) + +GNU Emacs 19.10 (1993-05-30) + +GNU Emacs 19.11 (1993-06-01) + +GNU Emacs 19.12 (1993-06-02) + +GNU Emacs 19.13 (1993-06-08) + +GNU Emacs 19.14 (1993-06-17) + +GNU Emacs 19.15 (1993-06-19) + +GNU Emacs 19.16 (1993-07-06) + +GNU Emacs 19.17 (1993-07-19) + +GNU Emacs 19.18 (1993-08-08) + +GNU Emacs 19.19 (1993-08-14) + +GNU Emacs 19.20 (1993-11-11) + +GNU Emacs 19.22 (1993-11-27) + +GNU Emacs 19.24 (1994-05-23) + +GNU Emacs 19.25 (1994-05-30) + +GNU Emacs 19.26 (1994-09-07) + GNU Emacs 19.28 (1994-11-01) GNU Emacs 19.29 (1995-06-21) @@ -91,6 +125,10 @@ GNU Emacs 19.30 (1995-11-24) GNU Emacs 19.31 (1996-05-25) +GNU Emacs 19.32 (1996-07-31) + +GNU Emacs 19.33 (1996-08-11) + GNU Emacs 19.34 (1996-08-21) GNU Emacs 20.1 (1997-09-17) @@ -101,6 +139,12 @@ GNU Emacs 20.3 (1998-08-19) GNU Emacs 20.4 (1999-07-12) +GNU Emacs 20.5 (1999-12-04) + +GNU Emacs 20.6 (2000-02-15) + +GNU Emacs 20.7 (2000-06-13) + GNU Emacs 21.1 (2001-10-20) GNU Emacs 21.2 (2002-03-16)