From: Miles Bader Date: Wed, 7 Jun 2006 18:05:10 +0000 (+0000) Subject: Merge from emacs--devo--0 X-Git-Tag: emacs-pretest-23.0.90~8295^2~922 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b883cdb2fefa8ea9c3b0d82eba7a9ee792f871bb;p=emacs.git Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 285-296) - Update from CVS - Merge from gnus--rel--5.10 - Update from CVS: admin/FOR-RELEASE: Update refcard section. * gnus--rel--5.10 (patch 102-104) - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-64 --- b883cdb2fefa8ea9c3b0d82eba7a9ee792f871bb diff --cc configure index 6969f29fed4,d72790133d7..c84eb76bdd5 --- a/configure +++ b/configure @@@ -310,7 -310,7 +310,7 @@@ ac_includes_default=" # include #endif" - ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP LN_S INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA RANLIB ac_ct_RANLIB INSTALL_INFO GZIP_PROG LIBSOUND SET_MAKE PKG_CONFIG GTK_CFLAGS GTK_LIBS XFT_CFLAGS XFT_LIBS FREETYPE_CFLAGS FREETYPE_LIBS FONTCONFIG_CFLAGS FONTCONFIG_LIBS HAVE_LIBOTF LIBOTF_CFLAGS LIBOTF_LIBS ALLOCA liblockfile LIBOBJS NEED_SETGID KMEM_GROUP GETLOADAVG_LIBS GETOPT_H GETOPTOBJS version configuration canonical srcdir lispdir locallisppath lisppath x_default_search_path etcdir archlibdir docdir bitmapdir gamedir gameuser c_switch_system c_switch_machine LD_SWITCH_X_SITE LD_SWITCH_X_SITE_AUX C_SWITCH_X_SITE X_TOOLKIT_TYPE machfile opsysfile carbon_appdir LTLIBOBJS' -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP LN_S INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA RANLIB ac_ct_RANLIB INSTALL_INFO GZIP_PROG LIBSOUND PKG_CONFIG ALSA_CFLAGS ALSA_LIBS CFLAGS_SOUND SET_MAKE GTK_CFLAGS GTK_LIBS ALLOCA liblockfile LIBOBJS NEED_SETGID KMEM_GROUP GETLOADAVG_LIBS GETOPT_H GETOPTOBJS version configuration canonical srcdir lispdir locallisppath lisppath x_default_search_path etcdir archlibdir docdir bitmapdir gamedir gameuser c_switch_system c_switch_machine LD_SWITCH_X_SITE LD_SWITCH_X_SITE_AUX C_SWITCH_X_SITE X_TOOLKIT_TYPE machfile opsysfile carbon_appdir LTLIBOBJS' ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP LN_S INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA RANLIB ac_ct_RANLIB INSTALL_INFO GZIP_PROG LIBSOUND PKG_CONFIG ALSA_CFLAGS ALSA_LIBS CFLAGS_SOUND SET_MAKE GTK_CFLAGS GTK_LIBS XFT_CFLAGS XFT_LIBS FREETYPE_CFLAGS FREETYPE_LIBS FONTCONFIG_CFLAGS FONTCONFIG_LIBS HAVE_LIBOTF LIBOTF_CFLAGS LIBOTF_LIBS ALLOCA liblockfile LIBOBJS NEED_SETGID KMEM_GROUP GETLOADAVG_LIBS GETOPT_H GETOPTOBJS version configuration canonical srcdir lispdir locallisppath lisppath x_default_search_path etcdir archlibdir docdir bitmapdir gamedir gameuser c_switch_system c_switch_machine LD_SWITCH_X_SITE LD_SWITCH_X_SITE_AUX C_SWITCH_X_SITE X_TOOLKIT_TYPE machfile opsysfile carbon_appdir LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@@ -24295,19 -23769,13 +24411,22 @@@ s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t s,@INSTALL_INFO@,$INSTALL_INFO,;t t s,@GZIP_PROG@,$GZIP_PROG,;t t s,@LIBSOUND@,$LIBSOUND,;t t - s,@SET_MAKE@,$SET_MAKE,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t + s,@ALSA_CFLAGS@,$ALSA_CFLAGS,;t t + s,@ALSA_LIBS@,$ALSA_LIBS,;t t + s,@CFLAGS_SOUND@,$CFLAGS_SOUND,;t t + s,@SET_MAKE@,$SET_MAKE,;t t s,@GTK_CFLAGS@,$GTK_CFLAGS,;t t s,@GTK_LIBS@,$GTK_LIBS,;t t +s,@XFT_CFLAGS@,$XFT_CFLAGS,;t t +s,@XFT_LIBS@,$XFT_LIBS,;t t +s,@FREETYPE_CFLAGS@,$FREETYPE_CFLAGS,;t t +s,@FREETYPE_LIBS@,$FREETYPE_LIBS,;t t +s,@FONTCONFIG_CFLAGS@,$FONTCONFIG_CFLAGS,;t t +s,@FONTCONFIG_LIBS@,$FONTCONFIG_LIBS,;t t +s,@HAVE_LIBOTF@,$HAVE_LIBOTF,;t t +s,@LIBOTF_CFLAGS@,$LIBOTF_CFLAGS,;t t +s,@LIBOTF_LIBS@,$LIBOTF_LIBS,;t t s,@ALLOCA@,$ALLOCA,;t t s,@liblockfile@,$liblockfile,;t t s,@LIBOBJS@,$LIBOBJS,;t t diff --cc etc/NEWS.19 index 00000000000,2d2e5f57066..ce06d2a8bfa mode 000000,100644..100644 --- a/etc/NEWS.19 +++ b/etc/NEWS.19 @@@ -1,0 -1,6540 +1,6540 @@@ + GNU Emacs NEWS -- history of user-visible changes. 1992. + Copyright (C) 1993, 1994, 1995, 2001, 2006 Free Software Foundation, Inc. + See the end for copying conditions. + + This file is about changes in emacs versions 19. + + + + * Emacs 19.34 is a bug-fix release with no user-visible changes. + + + + * Changes in Emacs 19.33. + + ** Bibtex mode no longer turns on Auto Fill automatically. (No major + mode should do that--it is the user's choice.) + + ** The variable normal-auto-fill-function specifies the function to + use for auto-fill-function, if and when Auto Fill is turned on. + Major modes can set this locally to alter how Auto Fill works. + + + + * Editing Changes in Emacs 19.32 + + ** C-x f with no argument now signals an error. + To set the fill column at the current column, use C-u C-x f. + + ** Expanding dynamic abbrevs with M-/ is now smarter about case + conversion. If you type the abbreviation with mixed case, and it + matches the beginning of the expansion including case, then the + expansion is copied verbatim. Using SPC M-/ to copy an additional + word always copies it verbatim except when the previous copied word is + all caps. + + ** On a non-windowing terminal, which can display only one Emacs frame + at a time, creating a new frame with C-x 5 2 also selects that frame. + + When using a display that can show multiple frames at once, C-x 5 2 + does make the frame visible, but does not select it. This is the same + as in previous Emacs versions. + + ** You can use C-x 5 2 to create multiple frames on MSDOS, just as on a + non-X terminal on Unix. Of course, only one frame is visible at any + time, since your terminal doesn't have the ability to display multiple + frames. + + ** On Windows, set win32-pass-alt-to-system to a non-nil value + if you would like tapping the Alt key to invoke the Windows menu. + This feature is not enabled by default; since the Alt key is also the + Meta key, it is too easy and painful to activate this feature by + accident. + + ** The command apply-macro-to-region-lines repeats the last defined + keyboard macro once for each complete line within the current region. + It does this line by line, by moving point to the beginning of that + line and then executing the macro. + + This command is not new, but was never documented before. + + ** You can now use Mouse-1 to place the region around a string constant + (something surrounded by doublequote characters or other delimiter + characters of like syntax) by double-clicking on one of the delimiting + characters. + + ** Font Lock mode + + *** Font Lock support modes + + Font Lock can be configured to use Fast Lock mode and Lazy Lock mode (see + below) in a flexible way. Rather than adding the appropriate function to the + hook font-lock-mode-hook, you can use the new variable font-lock-support-mode + to control which modes have Fast Lock mode or Lazy Lock mode turned on when + Font Lock mode is enabled. + + For example, to use Fast Lock mode when Font Lock mode is turned on, put: + + (setq font-lock-support-mode 'fast-lock-mode) + + in your ~/.emacs. + + *** lazy-lock + + The lazy-lock package speeds up Font Lock mode by making fontification occur + only when necessary, such as when a previously unfontified part of the buffer + becomes visible in a window. When you create a buffer with Font Lock mode and + Lazy Lock mode turned on, the buffer is not fontified. When certain events + occur (such as scrolling), Lazy Lock makes sure that the visible parts of the + buffer are fontified. Lazy Lock also defers on-the-fly fontification until + Emacs has been idle for a given amount of time. + + To use this package, put in your ~/.emacs: + + (setq font-lock-support-mode 'lazy-lock-mode) + + To control the package behavior, see the documentation for `lazy-lock-mode'. + + ** Changes in BibTeX mode. + + *** For all entries allow spaces and tabs between opening brace or + paren and key. + + *** Non-escaped double-quoted characters (as in `Sch"of') are now + supported. + + ** Gnus changes. + + Gnus, the Emacs news reader, has undergone further rewriting. Many new + commands and variables have been added. There should be no + significant incompatibilities between this Gnus version and the + previously released version, except in the message composition area. + + Below is a list of the more user-visible changes. Coding changes + between Gnus 5.1 and 5.2 are more extensive. + + *** A new message composition mode is used. All old customization + variables for mail-mode, rnews-reply-mode and gnus-msg are now + obsolete. + + *** Gnus is now able to generate "sparse" threads -- threads where + missing articles are represented by empty nodes. + + (setq gnus-build-sparse-threads 'some) + + *** Outgoing articles are stored on a special archive server. + + To disable this: (setq gnus-message-archive-group nil) + + *** Partial thread regeneration now happens when articles are + referred. + + *** Gnus can make use of GroupLens predictions: + + (setq gnus-use-grouplens t) + + *** A trn-line tree buffer can be displayed. + + (setq gnus-use-trees t) + + *** An nn-like pick-and-read minor mode is available for the summary + buffers. + + (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) + + *** In binary groups you can use a special binary minor mode: + + `M-x gnus-binary-mode' + + *** Groups can be grouped in a folding topic hierarchy. + + (add-hook 'gnus-group-mode-hook 'gnus-topic-mode) + + *** Gnus can re-send and bounce mail. + + Use the `S D r' and `S D b'. + + *** Groups can now have a score, and bubbling based on entry frequency + is possible. + + (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) + + *** Groups can be process-marked, and commands can be performed on + groups of groups. + + *** Caching is possible in virtual groups. + + *** nndoc now understands all kinds of digests, mail boxes, rnews news + batches, ClariNet briefs collections, and just about everything else. + + *** Gnus has a new backend (nnsoup) to create/read SOUP packets. + + *** The Gnus cache is much faster. + + *** Groups can be sorted according to many criteria. + + For instance: (setq gnus-group-sort-function 'gnus-group-sort-by-rank) + + *** New group parameters have been introduced to set list-address and + expiration times. + + *** All formatting specs allow specifying faces to be used. + + *** There are several more commands for setting/removing/acting on + process marked articles on the `M P' submap. + + *** The summary buffer can be limited to show parts of the available + articles based on a wide range of criteria. These commands have been + bound to keys on the `/' submap. + + *** Articles can be made persistent -- as an alternative to saving + articles with the `*' command. + + *** All functions for hiding article elements are now toggles. + + *** Article headers can be buttonized. + + (add-hook 'gnus-article-display-hook 'gnus-article-add-buttons-to-head) + + *** All mail backends support fetching articles by Message-ID. + + *** Duplicate mail can now be treated properly. See the + `nnmail-treat-duplicates' variable. + + *** All summary mode commands are available directly from the article + buffer. + + *** Frames can be part of `gnus-buffer-configuration'. + + *** Mail can be re-scanned by a daemonic process. + + *** Gnus can make use of NoCeM files to filter spam. + + (setq gnus-use-nocem t) + + *** Groups can be made permanently visible. + + (setq gnus-permanently-visible-groups "^nnml:") + + *** Many new hooks have been introduced to make customizing easier. + + *** Gnus respects the Mail-Copies-To header. + + *** Threads can be gathered by looking at the References header. + + (setq gnus-summary-thread-gathering-function + 'gnus-gather-threads-by-references) + + *** Read articles can be stored in a special backlog buffer to avoid + refetching. + + (setq gnus-keep-backlog 50) + + *** A clean copy of the current article is always stored in a separate + buffer to allow easier treatment. + + *** Gnus can suggest where to save articles. See `gnus-split-methods'. + + *** Gnus doesn't have to do as much prompting when saving. + + (setq gnus-prompt-before-saving t) + + *** gnus-uu can view decoded files asynchronously while fetching + articles. + + (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view) + + *** Filling in the article buffer now works properly on cited text. + + *** Hiding cited text adds buttons to toggle hiding, and how much + cited text to hide is now customizable. + + (setq gnus-cited-lines-visible 2) + + *** Boring headers can be hidden. + + (add-hook 'gnus-article-display-hook 'gnus-article-hide-boring-headers) + + *** Default scoring values can now be set from the menu bar. + + *** Further syntax checking of outgoing articles have been added. + + The Gnus manual has been expanded. It explains all these new features + in greater detail. + + + * Lisp Changes in Emacs 19.32 + + ** The function set-visited-file-name now accepts an optional + second argument NO-QUERY. If it is non-nil, then the user is not + asked for confirmation in the case where the specified file already + exists. + + ** The variable print-length applies to printing vectors and bitvectors, + as well as lists. + + ** The new function keymap-parent returns the parent keymap + of a given keymap. + + ** The new function set-keymap-parent specifies a new parent for a + given keymap. The arguments are KEYMAP and PARENT. PARENT must be a + keymap or nil. + + ** Sometimes menu keymaps use a command name, a symbol, which is really + an automatically generated alias for some other command, the "real" + name. In such a case, you should give that alias symbol a non-nil + menu-alias property. That property tells the menu system to look for + equivalent keys for the real name instead of equivalent keys for the + alias. + + + + * Editing Changes in Emacs 19.31 + + ** Freedom of the press restricted in the United States. + + Emacs has been censored in accord with the Communications Decency Act. + This includes removing some features of the doctor program. That law + was described by its supporters as a ban on pornography, but it bans + far more than that. The Emacs distribution has never contained any + pornography, but parts of it were nonetheless prohibited. + + For information on US government censorship of the Internet, and what + you can do to bring back freedom of the press, see the web site + `http://www.vtw.org/'. + + ** A note about C mode indentation customization. + + The old (Emacs 19.29) ways of specifying a C indentation style + do not normally work in the new implementation of C mode. + It has its own methods of customizing indentation, which are + much more powerful than the old C mode. See the Editing Programs + chapter of the manual for details. + + However, you can load the library cc-compat to make the old + customization variables take effect. + + ** Marking with the mouse. + + When you mark a region with the mouse, the region now remains + highlighted until the next input event, regardless of whether you are + using M-x transient-mark-mode. + + ** Improved Windows NT/95 support. + + *** Emacs now supports scroll bars on Windows NT and Windows 95. + + *** Emacs now supports subprocesses on Windows 95. (Subprocesses used + to work on NT only and not on 95.) + + *** There are difficulties with subprocesses, though, due to problems + in Windows, beyond the control of Emacs. They work fine as long as + you run Windows applications. The problems arise when you run a DOS + application in a subprocesses. Since current shells run as DOS + applications, these problems are significant. + + If you run a DOS application in a subprocess, then the application is + likely to busy-wait, which means that your machine will be 100% busy. + However, if you don't mind the temporary heavy load, the subprocess + will work OK as long as you tell it to terminate before you start any + other DOS application as a subprocess. + + Emacs is unable to terminate or interrupt a DOS subprocess. + You have to do this by providing input directly to the subprocess. + + If you run two DOS applications at the same time in two separate + subprocesses, even if one of them is asynchronous, you will probably + have to reboot your machine--until then, it will remain 100% busy. + Windows simply does not cope when one Windows process tries to run two + separate DOS subprocesses. Typing CTL-ALT-DEL and then choosing + Shutdown seems to work although it may take a few minutes. + + ** M-x resize-minibuffer-mode. + + This command, not previously mentioned in NEWS, toggles a mode in + which the minibuffer window expands to show as many lines as the + minibuffer contains. + + ** `title' frame parameter and resource. + + The `title' X resource now specifies just the frame title, nothing else. + It does not affect the name used for looking up other X resources. + It works by setting the new `title' frame parameter, which likewise + affects just the displayed title of the frame. + + The `name' parameter continues to do what it used to do: + it specifies the frame name for looking up X resources, + and also serves as the default for the displayed title + when the `title' parameter is unspecified or nil. + + ** Emacs now uses the X toolkit by default, if you have a new + enough version of X installed (X11R5 or newer). + + ** When you compile Emacs with the Motif widget set, Motif handles the + F10 key by activating the menu bar. To avoid confusion, the usual + Emacs binding of F10 is replaced with a no-op when using Motif. + + If you want to be able to use F10 in Emacs, you can rebind the Motif + menubar to some other key which you don't use. To do so, add + something like this to your X resources file. This example rebinds + the Motif menu bar activation key to S-F12: + + Emacs*defaultVirtualBindings: osfMenuBar : ShiftF12 + + ** In overwrite mode, DEL now inserts spaces in most cases + to replace the characters it "deletes". + + ** The Rmail summary now shows the number of lines in each message. + + ** Rmail has a new command M-x unforward-rmail-message, which extracts + a forwarded message from the message that forwarded it. To use it, + select a message which contains a forwarded message and then type the command. + It inserts the forwarded message as a separate Rmail message + immediately after the selected one. + + This command also undoes the textual modifications that are standardly + made, as part of forwarding, by Rmail and other mail reader programs. + + ** Turning off saving of .saves-... files in your home directory. + + Each Emacs session writes a file named .saves-... in your home + directory to record which files M-x recover-session should recover. + If you exit Emacs normally with C-x C-c, it deletes that file. If + Emacs or the operating system crashes, the file remains for M-x + recover-session. + + You can turn off the writing of these files by setting + auto-save-list-file-name to nil. If you do this, M-x recover-session + will not work. + + Some previous Emacs versions failed to delete these files even on + normal exit. This is fixed now. If you are thinking of turning off + this feature because of past experiences with versions that had this + bug, it would make sense to check whether you still want to do so + now that the bug is fixed. + + ** Changes to Version Control (VC) + + There is a new variable, vc-follow-symlinks. It indicates what to do + when you visit a link to a file that is under version control. + Editing the file through the link bypasses the version control system, + which is dangerous and probably not what you want. + + If this variable is t, VC follows the link and visits the real file, + telling you about it in the echo area. If it is `ask' (the default), + VC asks for confirmation whether it should follow the link. If nil, + the link is visited and a warning displayed. + + ** iso-acc.el now lets you specify a choice of language. + Languages include "latin-1" (the default) and "latin-2" (which + is designed for entering ISO Latin-2 characters). + + There are also choices for specific human languages such as French and + Portuguese. These are subsets of Latin-1, which differ in that they + enable only the accent characters needed for particular language. + The other accent characters, not needed for the chosen language, + remain normal. + + ** Posting articles and sending mail now has M-TAB completion on various + header fields (Newsgroups, To, CC, ...). + + Completion in the Newsgroups header depends on the list of groups + known to your news reader. Completion in the Followup-To header + offers those groups which are in the Newsgroups header, since + Followup-To usually just holds one of those. + + Completion in fields that hold mail addresses works based on the list + of local users plus your aliases. Additionally, if your site provides + a mail directory or a specific host to use for any unrecognized user + name, you can arrange to query that host for completion also. (See the + documentation of variables `mail-directory-process' and + `mail-directory-stream'.) + + ** A greatly extended sgml-mode offers new features such as (to be configured) + skeletons with completing read for tags and attributes, typing named + characters including optionally all 8bit characters, making tags invisible + with optional alternate display text, skipping and deleting tag(pair)s. + + Note: since Emacs' syntax feature cannot limit the special meaning of ', " and + - to inside <>, for some texts the result, especially of font locking, may be + wrong (see `sgml-specials' if you get wrong results). + + The derived html-mode configures this with tags and attributes more or + less HTML3ish. It also offers optional quick keys like C-c 1 for + headline or C-c u for unordered list (see `html-quick-keys'). Edit / + Text Properties / Face or M-g combinations create tags as applicable. + Outline minor mode is supported and level 1 font-locking tries to + fontify tag contents (which only works when they fit on one line, due + to a limitation in font-lock). + + External viewing via browse-url can occur automatically upon saving. + + ** M-x imenu-add-to-menubar now adds to the menu bar for the current + buffer only. If you want to put an Imenu item in the menu bar for all + buffers that use a particular major mode, use the mode hook, as in + this example: + + (add-hook 'emacs-lisp-mode-hook + '(lambda () (imenu-add-to-menubar "Index"))) + + ** Changes in BibTeX mode. + + *** Field names may now contain digits, hyphens, and underscores. + + *** Font Lock mode is now supported. + + *** bibtex-make-optional-field is no longer interactive. + + *** If bibtex-maintain-sorted-entries is non-nil, inserting new + entries is now done with a faster algorithm. However, inserting + will fail in this case if the buffer contains invalid entries or + isn't in sorted order, so you should finish each entry with C-c C-c + (bibtex-close-entry) after you have inserted or modified it. + The default value of bibtex-maintain-sorted-entries is nil. + + *** Function `show-all' is no longer bound to a key, since C-u C-c C-q + does the same job. + + *** Entries with quotes inside quote-delimited fields (as `author = + "Stefan Sch{\"o}f"') are now supported. + + *** Case in field names doesn't matter anymore when searching for help + text. + + ** Font Lock mode + + *** Global Font Lock mode + + Font Lock mode can be turned on globally, in buffers that support it, by the + new command global-font-lock-mode. You can use the new variable + font-lock-global-modes to control which modes have Font Lock mode automagically + turned on. By default, this variable is set so that Font Lock mode is turned + on globally where the buffer mode supports it. + + For example, to automagically turn on Font Lock mode where supported, put: + + (global-font-lock-mode t) + + in your ~/.emacs. + + *** Local Refontification + + In Font Lock mode, editing a line automatically refontifies that line only. + However, if your change alters the syntactic context for following lines, + those lines remain incorrectly fontified. To refontify them, use the new + command M-g M-g (font-lock-fontify-block). + + In certain major modes, M-g M-g refontifies the entire current function. + (The variable font-lock-mark-block-function controls how to find the + current function.) In other major modes, M-g M-g refontifies 16 lines + above and below point. + + With a prefix argument N, M-g M-g refontifies N lines above and below point. + + ** Follow mode + + Follow mode is a new minor mode combining windows showing the same + buffer into one tall "virtual window". The windows are typically two + side-by-side windows. Follow mode makes them scroll together as if + they were a unit. To use it, go to a frame with just one window, + split it into two side-by-side windows using C-x 3, and then type M-x + follow-mode. + + M-x follow-mode turns off Follow mode if it is already enabled. + + To display two side-by-side windows and activate Follow mode, use the + command M-x follow-delete-other-windows-and-split. + + ** hide-show changes. + + The hooks hs-hide-hooks and hs-show-hooks have been renamed + to hs-hide-hook and hs-show-hook, to follow the convention for + normal hooks. + + ** Simula mode now has a menu containing the most important commands. + The new command simula-indent-exp is bound to C-M-q. + + ** etags can now handle programs written in Erlang. Files are + recognised by the extensions .erl and .hrl. The tagged lines are + those that begin a function, record, or macro. + + ** MSDOS Changes + + *** It is now possible to compile Emacs with the version 2 of DJGPP. + Compilation with DJGPP version 1 also still works. + + *** The documentation of DOS-specific aspects of Emacs was rewritten + and expanded; see the ``MS-DOS'' node in the on-line docs. + + *** Emacs now uses ~ for backup file names, not .bak. + + *** You can simulate mouse-3 on two-button mice by simultaneously + pressing both mouse buttons. + + *** A number of packages and commands which previously failed or had + restricted functionality on MS-DOS, now work. The most important ones + are: + + **** Printing (both with `M-x lpr-buffer' and with `ps-print' package) + now works. + + **** `Ediff' works (in a single-frame mode). + + **** `M-x display-time' can be used on MS-DOS (due to the new + implementation of Emacs timers, see below). + + **** `Dired' supports Unix-style shell wildcards. + + **** The `c-macro-expand' command now works as on other platforms. + + **** `M-x recover-session' works. + + **** `M-x list-colors-display' displays all the available colors. + + **** The `TPU-EDT' package works. + + + * Lisp changes in Emacs 19.31. + + ** The function using-unix-filesystems on Windows NT and Windows 95 + tells Emacs to read and write files assuming that they reside on a + remote Unix filesystem. No CR/LF translation is done on any files in + this case. Invoking using-unix-filesystems with t activates this + behavior, and invoking it with any other value deactivates it. + + ** Change in system-type and system-configuration values. + + The value of system-type on a Linux-based GNU system is now `lignux', + not `linux'. This means that some programs which use `system-type' + need to be changed. The value of `system-configuration' will also + be different. + + It is generally recommended to use `system-configuration' rather + than `system-type'. + + See the file LINUX-GNU in this directory for more about this. + + ** The functions shell-command and dired-call-process + now run file name handlers for default-directory, if it has them. + + ** Undoing the deletion of text now restores the positions of markers + that pointed into or next to the deleted text. + + ** Timers created with run-at-time now work internally to Emacs, and + no longer use a separate process. Therefore, they now work more + reliably and can be used for shorter time delays. + + The new function run-with-timer is a convenient way to set up a timer + to run a specified amount of time after the present. A call looks + like this: + + (run-with-timer SECS REPEAT FUNCTION ARGS...) + + SECS says how many seconds should elapse before the timer happens. + It may be an integer or a floating point number. When the timer + becomes ripe, the action is to call FUNCTION with arguments ARGS. + + REPEAT gives the interval for repeating the timer (measured in + seconds). It may be an integer or a floating point number. nil or 0 + means don't repeat at all--call FUNCTION just once. + + *** with-timeout provides an easy way to do something but give + up if too much time passes. + + (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...) + + This executes BODY, but gives up after SECONDS seconds. + If it gives up, it runs the TIMEOUT-FORMS and returns the value + of the last one of them. Normally it returns the value of the last + form in BODY. + + *** You can now arrange to call a function whenever Emacs is idle for + a certain length of time. To do this, call run-with-idle-timer. A + call looks like this: + + (run-with-idle-timer SECS REPEAT FUNCTION ARGS...) + + SECS says how many seconds of idleness should elapse before the timer + runs. It may be an integer or a floating point number. When the + timer becomes ripe, the action is to call FUNCTION with arguments + ARGS. + + Emacs becomes idle whenever it finishes executing a keyboard or mouse + command. It remains idle until it receives another keyboard or mouse + command. + + REPEAT, if non-nil, means this timer should be activated again each + time Emacs becomes idle and remains idle for SECS seconds The timer + does not repeat if Emacs *remains* idle; it runs at most once after + each time Emacs becomes idle. + + If REPEAT is nil, the timer runs just once, the first time Emacs is + idle for SECS seconds. + + *** post-command-idle-hook is now obsolete; you shouldn't use it at + all, because it interferes with the idle timer mechanism. If your + programs use post-command-idle-hook, convert them to use idle timers + instead. + + *** y-or-n-p-with-timeout lets you ask a question but give up if + there is no answer within a certain time. + + (y-or-n-p-with-timeout PROMPT SECONDS DEFAULT-VALUE) + + asks the question PROMPT (just like y-or-n-p). If the user answers + within SECONDS seconds, it returns the answer that the user gave. + Otherwise it gives up after SECONDS seconds, and returns DEFAULT-VALUE. + + ** Minor change to `encode-time': you can now pass more than seven + arguments. If you do that, the first six arguments have the usual + meaning, the last argument is interpreted as the time zone, and the + arguments in between are ignored. + + This means that it works to use the list returned by `decode-time' as + the list of arguments for `encode-time'. + + ** The default value of load-path now includes the directory + /usr/local/share/emacs/VERSION/site-lisp In addition to + /usr/local/share/emacs/site-lisp. You can use this new directory for + site-specific Lisp packages that belong with a particular Emacs + version. + + It is not unusual for a Lisp package that works well in one Emacs + version to cause trouble in another. Sometimes packages need updating + for incompatible changes; sometimes they look at internal data that + has changed; sometimes the package has been installed in Emacs itself + and the installed version should be used. Whatever the reason for the + problem, this new feature makes it easier to solve. + + ** When your program contains a fixed file name (like .completions or + .abbrev.defs), the file name usually needs to be different on operating + systems with limited file name syntax. + + Now you can avoid ad-hoc conditionals by using the function + convert-standard-filename to convert the file name to a proper form + for each operating system. Here is an example of use, from the file + completions.el: + + (defvar save-completions-file-name + (convert-standard-filename "~/.completions") + "*The filename to save completions to.") + + This sets the variable save-completions-file-name to a value that + depends on the operating system, because the definition of + convert-standard-filename depends on the operating system. On + Unix-like systems, it returns the specified file name unchanged. On + MS-DOS, it adapts the name to fit the limitations of that system. + + ** The interactive spec N now returns the numeric prefix argument + rather than the raw prefix argument. (It still reads a number using the + minibuffer if there is no prefix argument at all.) + + ** When a process is deleted, this no longer disconnects the process + marker from its buffer position. + + ** The variable garbage-collection-messages now controls whether + Emacs displays a message at the beginning and end of garbage collection. + The default is nil, meaning there are no messages. + + ** The variable debug-ignored-errors specifies certain kinds of errors + that should not enter the debugger. Its value is a list of error + condition symbols and/or regular expressions. If the error has any + of the condition symbols listed, or if any of the regular expressions + matches the error message, then that error does not enter the debugger, + regardless of the value of debug-on-error. + + This variable is initialized to match certain common but uninteresting + errors that happen often during editing. + + ** The new function error-message-string converts an error datum + into its error message. The error datum is what condition-case + puts into the variable, to describe the error that happened. + + ** Anything that changes which buffer appears in a given window + now runs the window-scroll-functions for that window. + + ** The new function get-buffer-window-list returns a list of windows displaying + a buffer. The function is called with the buffer (a buffer object or a buffer + name) and two optional arguments specifying the minibuffer windows and frames + to search. Therefore this function takes optional args like next-window etc., + and not get-buffer-window. + + ** buffer-substring now runs the hook buffer-access-fontify-functions, + calling each function with two arguments--the range of the buffer + being accessed. buffer-substring-no-properties does not call them. + + If you use this feature, you should set the variable + buffer-access-fontified-property to a non-nil symbol, which is a + property name. Then, if all the characters in the buffer range have a + non-nil value for that property, the buffer-access-fontify-functions + are not called. When called, these functions should put a non-nil + property on the text that they fontify, so that they won't get called + over and over for the same text. + + ** Changes in lisp-mnt.el + + *** The lisp-mnt package can now recognize file headers that are written + in the formats used by the `what' command and the RCS `ident' command: + + ;; @(#) HEADER: text + ;; $HEADER: text $ + + in addition to the normal + + ;; HEADER: text + + *** The commands lm-verify and lm-synopsis are now interactive. lm-verify + checks that the library file has proper sections and headers, and + lm-synopsis extracts first line "synopsis'"information. + + + + * Editing Changes in Emacs 19.30. + + ** Be sure to recompile your byte-compiled Emacs Lisp files + if you last compiled them with Emacs 19.28 or earlier. + You can use M-x byte-force-recompile to recompile all the .elc files + in a specified directory. + + ** Emacs now provides multiple-frame support on Windows NT + and Windows 95. + + ** M-x column-number-mode toggles a minor mode which displays + the current column number in the mode line. + + ** Line Number mode is now enabled by default. + + ** M-x what-line now displays the line number in the accessible + portion of the buffer as well as the line number in the full buffer, + when narrowing is in effect. + + ** If you type a M-x command that has an equivalent key binding, + the equivalent is shown in the minibuffer before the command executes. + This feature is enabled by default for the sake of beginning users. + You can turn the feature off by setting suggest-key-bindings to nil. + + ** The menu bar is now visible on text-only terminals. To choose a + command from the menu bar when you have no mouse, type M-` + (Meta-Backquote) or F10. To turn off menu bar display, + do (menu-bar-mode -1). + + ** Whenever you invoke a minibuffer, it appears in the minibuffer + window that the current frame uses. + + Emacs can only use one minibuffer window at a time. If you activate + the minibuffer while a minibuffer window is active in some other + frame, the outer minibuffer window disappears while the inner one is + active. + + ** Echo area messages always appear in the minibuffer window that the + current frame uses. If a minibuffer is active in some other frame, + the echo area message does not hide it even temporarily. + + ** The minibuffer now has a menu-bar menu. You can use it to exit or + abort the minibuffer, or to ask for completion. + + ** Dead-key and composite character processing is done in the standard + X11R6 manner (through the default "input method" using the + /usr/lib/X11/locale/*/Compose databases of key combinations). I.e. if + it works in xterm, it should also work in emacs now. + + ** Mouse changes + + *** You can now use the mouse when running Emacs in an xterm. + Use M-x xterm-mouse-mode to let emacs take control over the mouse. + + *** C-mouse-1 now once again provides a menu of buffers to select. + S-mouse-1 is now the way to select a default font for the frame. + + *** There is a new mouse-scroll-min-lines variable to control the + minimum number of lines scrolled by dragging the mouse outside a + window's edge. + + *** Dragging mouse-1 on a vertical line that separates windows + now moves the line, thus changing the widths of the two windows. + (This feature is available only if you don't have vertical scroll bars. + If you do use them, a scroll bar separates two side-by-side windows.) + + *** Double-click mouse-1 on a character with "symbol" syntax (such as + underscore, in C mode) selects the entire symbol surrounding that + character. (Double-click mouse-1 on a letter selects a whole word.) + + ** When incremental search wraps around to the beginning (or end) of + the buffer, if you keep on searching until you go past the original + starting point of the search, the echo area changes from "Wrapped" to + "Overwrapped". That tells you that you are revisiting matches that + you have already seen. + + ** Filling changes. + + *** If the variable colon-double-space is non-nil, the explicit fill + commands put two spaces after a colon. + + *** Auto-Fill mode now supports Adaptive Fill mode just as the + explicit fill commands do. The variable adaptive-fill-regexp + specifies a regular expression to match text at the beginning of + a line that should be the fill prefix. + + *** Adaptive Fill mode can take a fill prefix from the first line of a + paragraph, *provided* that line is not a paragraph-starter line. + + Paragraph-starter lines are indented lines that start a new + paragraph because they are indented. This indentation shouldn't + be copied to additional lines. + + Whether indented lines are paragraph lines depends on the value of the + variable paragraph-start. Some major modes set this; you can set it + by hand or in mode hooks as well. For editing text in which paragraph + first lines are not indented, and which contains paragraphs in which + all lines are indented, you should use Indented Text mode or arrange + for paragraph-start not to match these lines. + + *** You can specify more complex ways of choosing a fill prefix + automatically by setting `adaptive-fill-function'. This function + is called with point after the left margin of a line, and it should + return the appropriate fill prefix based on that line. + If it returns nil, that means it sees no fill prefix in that line. + + ** Gnus changes. + + Gnus, the Emacs news reader, has been rewritten and expanded. Most + things that worked with the old version should still work with the new + version. Code that relies heavily on Gnus internals is likely to + fail, though. + + *** Incompatibilities with the old GNUS. + + **** All interactive commands have kept their names, but many internal + functions have changed names. + + **** The summary mode gnus-uu commands have been moved from the `C-c + C-v' keymap to the `X' keymap. + + **** There can now be several summary buffers active at once. + Variables that are relevant to each summary buffer are buffer-local to + that buffer. + + **** Old hilit code doesn't work at all. Gnus performs its own + highlighting based not only on what's visible in the buffer, but on + other data structures. + + **** Old packages like `expire-kill' will no longer work. + + **** `C-c C-l' in the group buffer no longer switches to a different + buffer, but instead lists killed groups in the group buffer. + + *** New features. + + **** The look of all buffers can be changed by setting format-like + variables. + + **** Local spool and several NNTP servers can be used at once. + + **** Groups can be combined into virtual groups. + + **** Different mail formats can be read much the same way as one would + read newsgroups. All the mail backends implement mail expiry schemes. + + **** Gnus can use various strategies for gathering threads that have + lost their roots (thereby gathering loose sub-threads into one thread) + or it can go back and retrieve enough headers to build a complete + thread. + + **** Killed groups can be read. + + **** Gnus can do partial group updates - you do not have to retrieve + the entire active file just to check for new articles in a few groups. + + **** Gnus implements a sliding scale of subscribedness to groups. + + **** You can score articles according to any number of criteria. You + can get Gnus to score articles for you using adaptive scoring. + + **** Gnus maintains a dribble buffer that is auto-saved the normal + Emacs manner, so it should be difficult to lose much data on what you + have read if your machine should go down. + + **** Gnus now has its own startup file (`.gnus.el') to avoid + cluttering up the `.emacs' file. + + **** You can set the process mark on both groups and articles and + perform operations on all the marked items. + + **** You can grep through a subset of groups and create a group from + the results. + + **** You can list subsets of groups using matches on group names or + group descriptions. + + **** You can browse foreign servers and subscribe to groups from those + servers. + + **** Gnus can pre-fetch articles asynchronously on a second connection + to the servers. + + **** You can cache articles locally. + + **** Gnus can fetch FAQs to and descriptions of groups. + + **** Digests (and other files) can be used as the basis for groups. + + **** Articles can be highlighted and customized. + + ** Changes to Version Control (VC) + + *** General changes (all backends). + + VC directory listings (C-x v d) are now kept up to date when you do a + vc-next-action (C-x v v) on the marked files. The `g' command updates + the buffer properly. `=' in a VC dired buffer produces a version + control diff, not an ordinary diff. + + *** CVS changes. + + Under CVS, you no longer need to type C-x C-q before you can edit a + file. VC doesn't write-protect unmodified buffers anymore; you can + freely change them at any time. The mode line keeps track of the + file status. + + If you do want unmodified files to be write-protected, set your + CVSREAD environment variable. VC sees this and behaves accordingly; + that will give you the behavior of Emacs 19.29, similar to that under + RCS and SCCS. In this mode, if the variable vc-mistrust-permissions + is nil, VC learns the modification state from the file permissions. + When setting CVSREAD for the first time, you should check out the + whole module anew, so that the file permissions are set correctly. + + VC also works with remote repositories now. When you visit a file, it + doesn't run "cvs status" anymore, so there shouldn't be any long delays. + + Directory listings under VC/CVS have been enhanced. Type C-x v d, and + you get a list of all files in or below the current directory that are + not up-to-date. The actual status (modified, merge, conflict, ...) is + displayed for each file. If you give a prefix argument (C-u C-x v d), + up-to-date files are also listed. You can mark any number of files, + and execute the next logical version control command on them (C-x v v). + + *** Starting a new branch. + + If you try to lock a version that is not the latest on its branch, + VC asks for confirmation in the minibuffer. If you say no, it offers + to lock the latest version instead. + + *** RCS non-strict locking. + + VC can now handle RCS non-strict locking, too. In this mode, working + files are always writable and you needn't lock the file before making + changes, similar to the default mode under CVS. To enable non-strict + locking for a file, use the "rcs -U" command. + + *** Sharing RCS master files. + + If you share RCS subdirs with other users (through symbolic links), + and you always want to work on the latest version, set + vc-consult-headers to nil and vc-mistrust-permissions to `t'. + Then you see the state of the *latest* version on the mode line, not + that of your working file. When you do a check out, VC overwrites + your working file with the latest version from the master. + + *** RCS customization. + + There is a new variable vc-consult-headers. If it is t (the default), -VC searches for RCS headers in working files (like `$Id$') and ++VC searches for RCS headers in working files (like `$Id: NEWS.19,v 1.1 2006/06/04 01:01:51 kfstorm Exp $') and + determines the state of the file from them, not from the master file. + This is fast and more reliable when you use branches. (The variable + was already present in Emacs 19.29, but didn't get mentioned in the + NEWS.) + + ** Calendar changes. + + *** New calendars supported: Chinese, Coptic, Ethiopic + + Here are the commands for converting to and from these calendars: + + gC: calendar-goto-chinese-date + gk: calendar-goto-coptic-date + ge: calendar-goto-ethiopic-date + + pC: calendar-print-chinese-date + pk: calendar-print-coptic-date + pe: calendar-print-ethiopic-date + + *** Printed calendars + + Calendar mode now has commands to produce fancy printed calendars via + LaTeX. You can ask for a calendar for one or more days, weeks, months + or years. The commands all start with `t'; see the manual for a list + of them. + + *** New sexp diary entry type + + Reminders that apply in the days leading up to an event. + + ** The CC-mode package now provides the default C and C++ modes. + See the manual for documentation of its features. + + ** The uniquify package chooses buffer names differently when you + visit multiple files with the same name (in different directories). + + ** RMAIL now always uses the movemail program when it renames an + inbox file, so that it can interlock properly with the mailer + no matter where it is delivering mail. + + ** tex-start-of-header and tex-end-of-header are now regular expressions, + not strings. + + ** To enable automatic uncompression of compressed files, + type M-x auto-compression-mode. (This command used to be called + toggle-auto-compression, but was not documented before.) In Lisp, + you can do + + (auto-compression-mode 1) + + to turn the mode on. + + ** The new pc-select package emulates the key bindings for cutting and + pasting, and selection of regions, found in Windows, Motif, and the + Macintosh. + + ** Help buffers now use a special major mode, Help mode. This mode + normally turns on View mode; it also provides a hook, help-mode-hook, + which you can use for other customization. + + ** Apropos now uses faces for enhanced legibility. It now describes + symbol properties as well as their function definitions and variable + values. You can use Mouse-2 or RET to get more information about a + function definition, variable, or property. + + ** Font Lock mode + + *** Supports Scheme, TCL and Help modes + + For example, to automatically turn on Font Lock mode in the *Help* + buffer, put: + + (add-hook 'help-mode-hook 'turn-on-font-lock) + + in your ~/.emacs. + + *** Enhanced fontification + + The structure of font-lock-keywords is extended to allow "anchored" keywords. + Typically, a keyword item of font-lock-keywords comprises a regexp to search + for and information to specify how the regexp should be highlighted. However, + the highlighting information is extended so that it can be another keyword + item. This keyword item, its regexp and highlighting information, is processed + before resuming with the keyword item of which it is part. + + For example, a typical keyword item might be: + + ("\\" (0 anchor-face)) + + which fontifies each occurrence of the discrete word "anchor" in the value of + the variable anchor-face. However, the highlighting information can be used to + fontify text that is anchored to the word "anchor". For example: + + ("\\" (0 anchor-face) ("\\=[ ,]*\\(item\\)" nil nil (1 item-face))) + + which fontifies each occurrence of "anchor" as above, but for each occurrence + of "anchor", each occurrence of "item", in any following comma separated list, + is fontified in the value of the variable item-face. Thus the "item" text is + anchored to the "anchor" text. See the variable documentation for further + information. + + This feature is used to extend the level and quality of fontification in a + number of modes. For example, C/C++ modes now have level 3 decoration that + includes the fontification of variable and function names in declaration lists. + In this instance, the "anchor" described in the above example is a type or + class name, and an "item" is a variable or function name. + + *** Fontification levels + + The variables font-lock-maximum-decoration and font-lock-maximum-size are + extended to specify levels and sizes for specific modes. The variable + font-lock-maximum-decoration specifies the preferred level of fontification for + modes that provide multiple levels (typically from "subdued" to "gaudy"). The + variable font-lock-maximum-size specifies the buffer size for which buffer + fontification is suppressed when Font Lock mode is turned on (typically because + it would take too long). + + These variables can now specify values for individual modes, by supplying + lists of mode names and values. For example, to use the above mentioned level + 3 decoration for buffers in C/C++ modes, and default decoration otherwise, put: + + (setq font-lock-maximum-decoration '((c-mode . 3) (c++-mode . 3))) + + in your ~/.emacs. Maximum buffer size values for individual modes are + specified in the same way with the variable font-lock-maximum-size. + + *** Font Lock configuration + + The mechanism to provide default settings for Font Lock mode are the variables + font-lock-defaults and font-lock-maximum-decoration. Typically, you should + only need to change the value of font-lock-maximum-decoration. However, to + support Font Lock mode for buffers in modes that currently do not support Font + Lock mode, you should set a buffer local value of font-lock-defaults for that + mode, typically via its mode hook. + + These variables are used by Font Lock mode to set the values of the variables + font-lock-keywords, font-lock-keywords-only, font-lock-syntax-table, + font-lock-beginning-of-syntax-function and font-lock-keywords-case-fold-search. + + You need not set these variables directly, and should not set them yourself + since the underlining mechanism may change in future. + + ** Archive mode is now the default mode for various sorts of + archive files (files whose names end with .arc, .lzh, .zip, and .zoo). + + ** You can automatically update the years in copyright notice by + means of (add-hook 'write-file-hooks 'copyright-update). + Optionally it can update the GPL version as well. + + ** Scripts of various languages (Shell, AWK, Perl, makefiles ...) can + be automatically provided with a magic number and be made executable + by their respective modes under control of various user variables. + The mode must call (executable-set-magic "perl") or + (executable-set-magic "make" "-f"). The latter for example has no + effect on [Mm]akefile. + + ** Shell script mode now supports over 15 different shells. The new + command C-c ! executes the region, and optionally beginning of script + as well, by passing them to the shell. + + Cases such as `sh' being a `bash' are now accounted for. + Fontification now also does variables, the magic number and all + builtin commands. Shell script mode no longer mingles `tab-width' and + indentation style. The variable `sh-tab-width' has been renamed to + `sh-indentation'. Empty lines are now indented like previous + non-empty line, rather than just previous line. + + The annoying $ variable prompting has been eliminated. Instead, shell + script mode uses `comint-dynamic-completion' for commands, variables + and filenames. + + ** Two-column mode now automatically scrolls both buffers together, + which makes it possible to eliminate the special scrolling commands + that used to do so. + + The commands that operate in two-column mode are no longer bound to + keys outside that mode. f2 o will now position at the same point in + associated buffer. + + the new command f2 RET inserts a newline in both buffers, at point and + at the corresponding position in the associated buffer. + + ** Skeleton commands now work smoothly as abbrev definitions. The + element < no longer exists, ' is a new element. + + ** The autoinsert insert facility for prefilling empty files as soon + as they are found has been extended to accommodate skeletons or calling + functions. See the function auto-insert. + + ** TPU-edt Changes + + Loading tpu-edt no longer turns on tpu-edt mode. In fact, it is no + longer necessary to explicitly load tpu-edt. All you need to do to + turn on tpu-edt is run the tpu-edt function. Here's how to run + tpu-edt instead of loading the file: + + Running Emacs: Type emacs -f tpu-edt + not emacs -l tpu-edt + + Within Emacs: Type M-x tpu-edt + not M-x load-library tpu-edt + + In .emacs: Use (tpu-edt) + not (load "tpu-edt") + + The default name of the tpu-edt X key definition file has changed from + ~/.tpu-gnu-keys to ~/.tpu-keys. If you don't rename the file yourself, + tpu-edt will offer to rename it the first time you invoke it under + x-windows. + + ** MS-DOS Enhancements: + + *** Better mouse control by adding the following functions [in dosfns.c] + msdos-mouse-enable, msdos-mouse-disable, msdos-mouse-init. + + *** If another foreground/background color than the default is setup in + your ~/_emacs, then the screen briefly flickers with the default + colors before changing to the colors you have specified. To avoid + this, the EMACSCOLORS environment variable exists. It shall be + defined as a string with the following elements: + + set EMACSCOLORS=fb;fb + + The first set of "fb" defines the initial foreground and background + colors using standard dos color numbers (0=black,.., 7=white). + If specified, the second set of "fb" defines the colors which are + restored when you leave emacs. + + *** The new SUSPEND environment variable can now be set as the shell to + use when suspending emacs. This can be used to override the stupid + limitation on the environment of sub-shells in MS-DOS (they are just + large enough to hold the currently defined variables, not leaving + room for more); to overcome this limitation, add this to autoexec.bat: + + set SUSPEND=%COMSPEC% /E:2000 + + ** The escape character can now be displayed on X frames. Try + this: + (aset standard-display-table 27 (vector 27)) + after first creating a display table (you can do that by loading + the disp-table library). + + ** The new command-line option --eval specifies an expression to evaluate + from the command line. + + ** etags has now the ability to tag Perl files. They are recognised + either by the .pm and .pl suffixes or by a first line which starts + with `#!' and specifies a Perl interpreter. The tagged lines are + those beginning with the `sub' keyword. + + New suffixes recognised are .hpp for C++; .f90 for Fortran; .bib, + .ltx, .TeX for TeX (.bbl, .dtx removed); .ml for Lisp; .prolog for + prolog (.pl is now Perl). + + ** The files etc/termcap.dat and etc/termcap.ucb have been replaced + with a new, merged, and much more comprehensive termcap file. The + new file should include all the special entries from the old one. + This new file is under active development as part of the ncurses + project. If you have any questions about this file, or problems with + an entry in it, email terminfo@ccil.org. + + + * Lisp changes in Emacs 19.30. + + ** New Data Types + + *** There is a new data type called a char-table which is an array + indexed by a character. Currently this is mostly equivalent to a + vector of length 256, but in the future, when a wider character set is + in use, it will be different. To create one, call + (make-char-table SUBTYPE INITIAL-VALUE) + + SUBTYPE is a symbol that identifies the specific use of this + character table. It can be any of these values: + + syntax-table + display-table + keyboard-translate-table + case-table + + The function `char-table-subtype' returns the subtype of a char-table. + You cannot alter the subtype of an existing char-table. + + A char-table has an element for each character code. It also has some + "extra slots". The number of extra slots depends on the subtype and + their use depends on the subtype. (Each subtype symbol has a + `char-table-extra-slots' property that says how many extra slots to + make.) Use (char-table-extra-slot TABLE N) to access extra slot N and + (set-char-table-extra-slot TABLE N VALUE) to store VALUE in slot N. + + A char-table T can have a parent, which should be another char-table + P. If you look for the value in T for character C, and the table T + actually holds nil, P's element for character C is used instead. + The functions `char-table-parent' and `set-char-table-parent' + let you read or set the parent of a char-table. + + To scan all the values in a char-table, do not try to loop through all + possible character codes. That would work for now, but will not work + in the future. Instead, call map-char-table. (map-char-table + FUNCTION TABLE) calls FUNCTION once for each character or character + set that has a distinct value in TABLE. FUNCTION gets two arguments, + RANGE and VALUE. RANGE specifies a range of TABLE that has one + uniform value, and VALUE is the value in TABLE for that range. + + Currently, RANGE is always a vector containing a single character + and it refers to that character alone. In the future, other kinds + of ranges will occur. You can set the value for a given range + with (set-char-table-range TABLE RANGE VALUE) and examine the value + for a range with (char-table-range TABLE RANGE). + + *** Syntax tables are now represented as char-tables. + All syntax tables other than the standard syntax table + normally have the standard syntax table as their parent. + Their subtype is `syntax-table'. + + *** Display tables are now represented as char-tables. + Their subtype is `display-table'. + + *** Case tables are now represented as char-tables. + Their subtype is `case-table'. + + *** The value of keyboard-translate-table may now be a char-table + instead of a string. Normally the char-tables used for this purpose + have the subtype `keyboard-translate-table', but that is not required. + + *** A new data type called a bool-vector is a vector of values + that are either t or nil. To create one, do + (make-bool-vector LENGTH INITIAL-VALUE) + + ** You can now specify, for each marker, how it should relocate when + text is inserted at the place where the marker points. This is called + the "insertion type" of the marker. + + To set the insertion type, do (set-marker-insertion-type MARKER TYPE). + If TYPE is t, it means the marker advances when text is inserted. If + TYPE is nil, it means the marker does not advance. (In Emacs 19.29, + markers did not advance.) + + The function marker-insertion-type reports the insertion type of a + given marker. The function copy-marker takes a second argument TYPE + which specifies the insertion type of the new copied marker. + + ** When you create an overlay, you can specify the insertion type of + the beginning and of the end. To do this, you can use two new + arguments to make-overlay: front-advance and rear-advance. + + ** The new function overlays-in returns a list of the overlays that + overlap a specified range of the buffer. The returned list includes + empty overlays at the beginning of this range, as well as within the + range. + + ** The new hook window-scroll-functions is run when a window has been + scrolled. The functions in this list are called just before + redisplay, after the new window-start has been computed. Each function + is called with two arguments--the window that has been scrolled, and its + new window-start position. + + This hook is useful for on-the-fly fontification and other features + that affect how the redisplayed text will look when it is displayed. + + The window-end value of the window is not valid when these functions + are called. The computation of window-end is byproduct of actual + redisplay of the window contents, which means it has not yet happened + when the hook is run. Computing window-end specially in advance for + the sake of these functions would cause a slowdown. + + The hook functions can determine where the text on the window will end + by calling vertical-motion starting with the window-start position. + + ** The new hook redisplay-end-trigger-functions is run whenever + redisplay in window uses text that extends past a specified end + trigger position. You set the end trigger position with the function + set-window-redisplay-end-trigger. The functions are called with two + arguments: the window, and the end trigger position. Storing nil for + the end trigger position turns off the feature, and the trigger value + is automatically reset to nil just after the hook is run. + + You can use the function window-redisplay-end-trigger to read a + window's current end trigger value. + + ** The new function insert-file-contents-literally inserts the + contents of a file without any character set translation or decoding. + + ** The new function safe-length computes the length of a list. + It never gets an error--it treats any non-list like nil. + If given a circular list, it returns an upper bound for the number + of elements before the circularity. + + ** replace-match now takes a fifth argument, SUBEXP. If SUBEXP is + non-nil, that says to replace just subexpression number SUBEXP of the + regexp that was matched, not the entire match. For example, after + matching `foo \(ba*r\)' calling replace-match with 1 as SUBEXP means + to replace just the text that matched `\(ba*r\)'. + + ** The new keymap special-event-map defines bindings for certain + events that should be handled at a very low level--as soon as they + are read. The read-event function processes these events itself, + and never returns them. + + Events that are handled in this way do not echo, they are never + grouped into key sequences, and they never appear in the value of + last-command-event or (this-command-keys). They do not discard a + numeric argument, they cannot be unread with unread-command-events, + they may not appear in a keyboard macro, and they are not recorded + in a keyboard macro while you are defining one. + + These events do, however, appear in last-input-event immediately after + they are read, and this is the way for the event's definition to find + the actual event. + + The events types iconify-frame, make-frame-visible and delete-frame + are normally handled in this way. + + ** encode-time now supports simple date arithmetic by means of + out-of-range values for its SEC, MINUTE, HOUR, DAY, and MONTH + arguments; for example, day 0 means the day preceding the given month. + Also, the ZONE argument can now be a TZ-style string. + + ** command-execute and call-interactively now accept an optional third + argument KEYS. If specified and non-nil, this specifies the key + sequence containing the events that were used to invoke the command. + + ** The environment variable NAME, if set, now specifies the value of + (user-full-name), when Emacs starts up. + + + + * User Editing Changes in Emacs 19.29 + + ** If you run out of memory. + + If you get the error message "Virtual memory exhausted", type C-x s. + That way of saving files has the least additional memory needs. Emacs + 19.29 keeps a reserve of memory which it makes available when this + error happens; that is to ensure that C-x s can complete its work. + + Once you have saved your data, you can exit and restart Emacs, or use + M-x kill-some-buffers to free up space. If you kill buffers + containing a substantial amount of text, you can go on editing. + + Do not use M-x buffer-menu to save or kill buffers when you are out of + memory, because that needs a fair amount memory itself and you may not + have enough to get it started. + + ** The format of compiled files has changed incompatibly. + + Byte-compiled files made with Emacs 19.29 normally use a new format + that will not work in older Emacs versions. You can compile files + in the old format if you wish; see "Changes in compilation," below. + + ** Emacs 19.29 supports the DEC Alpha. + + ** Emacs runs on Windows NT. + + This port does not yet support windowing features. It works like a + text-only terminal, but it does support a mouse. + + In general, support for non-GNU-like operating systems is not a high + priority for the GNU project. We merged in the support for Windows NT + because that system is expected to be very widely used. + + ** Emacs supports Motif widgets. + + You can build Emacs with Motif widgets by specifying --with-x-toolkit=motif + when you run configure. + + Motif defines collections of windows called "tab groups", and uses the + tab key and the cursor keys to move between windows in a tab group. + Emacs naturally does not support this--it has other uses for the tab + key and cursor keys. Emacs does not support Motif accelerators either, + because it uses its normal keymap event binding features. + + We give higher priority to operation with a free widget set than to + operation with a proprietary one. + + ** If Emacs or the computer crashes, you can recover all the files you + were editing from their auto save files by typing M-x recover-session. + This first shows you a list of recorded interrupted sessions. Move + point to the one you choose, and type C-c C-c. + + Then recover-session asks about each of the files that were being + edited during that session, asking whether to recover that file. If + you answer y, it calls recover-file, which works in its normal + fashion. It shows the dates of the original file and its auto-save + file and asks once again whether to recover that file. + + When recover-session is done, the files you've chosen to recover + are present in Emacs buffers. You should then save them. + Only this--saving them--updates the files themselves. + + ** Menu bar menus now stay up if you click on the menu bar item and + release the mouse button within a certain amount of time. This is in + the X Toolkit version. + + ** The menu bar menus have been rearranged and split up to make for a + better organization. Two new menu bar menus, Tools and Search, + contain items that were formerly in the Files and Edit menus, as well + as some that did not exist in the menu bar menus before. + + ** Emacs can now display on more than one X display at the same time. + Use the command make-frame-on-display to create a frame, specifying + which display to use. + + ** M-x talk-connect sets up a multi-user talk connection + via Emacs. Specify the X display of the person you want to talk to. + You can talk to any number of people (within reason) by using + this command repeatedly to specify different people. + + Emacs does not make a fuss about security; the people who you talk to + can use all Emacs features, including visiting and editing files. If + this frightens you, don't use M-x talk-connect. + + ** The range of integer values is now at least 2**28 on all machines. + This means the maximum size of a buffer is at least 2**27-1, + or 134,217,727. + + ** When you start Emacs, you can now specify option names in + long GNU form (starting with `--') and you can abbreviate the names. + + You can now specify the options in any order. + The previous requirements about the order of options + have been eliminated. + + The -L or --directory option lets you specify an additional + directory to search for Lisp libraries (including libraries + that you specify with the -l or --load options). + + ** Incremental search in Transient Mark mode, if the mark is already + active, now leaves the mark active and does not change its position. + You can make incremental search deactivate the mark once again with + this expression. + + (add-hook 'isearch-mode-hook 'deactivate-mark) + + ** C-delete now deletes a word backwards. This is for compatibility + with some editors in the PC world. (This key is not available on + ordinary ASCII terminals, because C-delete is not a distinct character + on those terminals.) + + ** ESC ESC ESC is now a command to escape from various temporary modes + and states. + + ** M-x pc-bindings-mode sets up bindings compatible with many PC editors. + In particular, Delete and its variants delete forward instead of backward. + Use Backspace to delete backward. + + C-Backspace kills backward a word (as C-Delete normally would). + M-Backspace does undo. + Home and End move to beginning and end of line + C-Home and C-End move to beginning and end of buffer. + + ** The key sequence for evaluating a Lisp expression using the minibuffer + is now ESC :. It used to be ESC ESC, but we moved it to make way for + the ESC ESC ESC feature, on the grounds that people who evaluate Lisp + expressions are experienced users and can cope with a change. + If you prefer the old ESC ESC binding, put in your `~/.emacs': + + (global-set-key "\e\e" 'eval-expression) + + ** The f1 function key is now equivalent to the help key. This is + done with key-translation-map; delete the binding for f1 in that map + if you want to use f1 for something else. + + ** Mouse-3, in the simplest case, still sets the region. But now, it + places the mark where point was, and sets point where you click. + (It used to set the mark where you click and leave point alone.) + + If you position point with Mouse-1, then scroll with the scroll bar + and use Mouse-3, Mouse-3 uses the position you specified with Mouse-1 + even if it has scrolled off the screen (and point is no longer there). + This makes it easier to select a region with the mouse which is bigger + than a screenful. + + Any editing of the buffer, and any cursor motion or scrolling for any + reason other than the scroll bar, cancels the special state set up by + Mouse-1--so that a subsequent Mouse-3 click will use the actual value + of point. + + ** C-mouse-3 now pops up a mode-specific menu of commands--normally + the same ones available in the mode's own menu bar menus. + + ** C-mouse-2 now pops up a menu of faces, indentation, justification, + and certain other text properties. This menu is also available + through the menu-bar Edit menu. It is meant for use with Enriched + mode. + + *** You can use this menu to change the face of the region. + You can also set the face of the region with the new M-g command. + + *** The menu also includes commands for indenting the region, + which locally changes the values of left-margin and fill-column that + are used. + + *** All fill functions now indent every line to the left-margin. If + there is also a fill-prefix, that goes after the margin indentation. + + *** Open-line and newline also make sure that the lines they create + are indented to the left margin. + + *** It also allows you to set the "justification" of the region: + whether it should be centered, flush right, and so forth. The fill + functions (including auto-fill-mode) will maintain the justification + and indentation that you request. + + *** The new function `list-colors-display' shows you what colors are + available. This is also accessible from the C-mouse-2 menu. + + ** You can now save and load files including their faces and other + text-properties by using Enriched-mode. Files are saved in an + extended version of the MIME text/enriched format. You can use the + menus described above, or M-g and other keyboard commands, to + alter the formatting information. + + ** C-mouse-1 now pops up the menu for changing the frame's default font. + + ** You can input Hyper, Super, Meta, and Alt characters, as well as + non-ASCII control characters, on an ASCII-only terminal. + To do this, use + + C-x @ h -- hyper + C-x @ s -- super + C-x @ m -- meta + C-x @ a -- alt + C-x @ S -- shift + C-x @ c -- control + + These are not ordinary key sequences; they operate through + function-key-map, which means they can be used even in the + middle of an ordinary key sequence. + + ** Outline minor mode and Hideif mode now use C-c @ as their prefix + character. + + ** Echo area messages are now logged in the "*Messages*" buffer. The + size of this buffer is limited to message-log-max lines. + + ** RET in various special modes for read-only buffers that contain + lists of items now selects the item point is on. These modes include + Dired, Compilation buffers, Buffer-menu, Tar mode, and Occur mode. + (In Info, RET follows the reference near point; in completion list + buffers, RET chooses the completion around point.) + + ** set-background-color now updates the modeline face in a special + way. If that face was previously set up to be reverse video, the + reverse of the default face, then set-background-color updates it so + that it remains the reverse of the default face. + + ** The functions raise-frame and lower-frame are now commands. + When used interactively, they apply to the selected frame. + + ** M-x buffer-menu now displays the buffer list in the selected window. + Use M-x buffer-menu-other-window to display it in another window. + + ** M-w followed by a kill command now *does not* append the text in + the kill ring. In consequence, M-w followed by C-w works as you would + expect: it leaves the top of the kill ring matching the region that + you killed. + + ** In Lisp mode, the C-M-x command now executes defvar forms in a + special way: it unconditionally sets the variable to the specified + default value, if there is one. Normal execution of defvar does not + alter the variable if it already has a non-void value. + + ** In completion list buffers, the left and right arrow keys run the + new commands previous-completion and next-completion. They move one + completion at a time. + + ** While doing completion in the minibuffer, the `prior' or `pageup' + key switches to the completion list window. + + ** When you exit the minibuffer with empty contents, the empty string + is not put in the minibuffer history. + + ** The default buffer for insert-buffer is now the "first" buffer + other than the current one. If you have more than one window, this + is a buffer visible in another window. (Usually it is the buffer + that C-M-v would scroll.) + + ** The etags program is now capable of recording tags based on regular + expressions provided on the command line. + + This new feature allows easy support for constructs not normally + handled by etags, such as the macros frequently used in big C/C++ + projects to define project-specific structures. It also enables the + use of etags and TAGS files for languages not supported by etags. + + The Emacs manual section on Tags contains explanations and examples + for Emacs's DEFVAR, VHDL, Cobol, Postscript and TCL. + + ** Various mode-specific commands that used to be bound to C-c LETTER + have been moved. + + *** In gnus-uu mode, gnus-uu-interactive-scan-directory is now on C-c C-d, + and gnus-uu-interactive-save-current-file is on C-c C-z. + + *** In Scribe mode, scribe-insert-environment is now on C-c C-v, + scribe-chapter is on C-c C-c, scribe-subsection is on C-c C-s, + scribe-section is on C-c C-t, scribe-bracket-region-be is on C-c C-e, + scribe-italicize-word is on C-c C-i, scribe-bold-word is on C-c C-b, + and scribe-underline-word is on C-c C-u. + + *** In Gomoku mode, gomoku-human-takes-back is now on C-c C-b, + gomoku-human-plays is on C-c C-p, gomoku-human-resigns is on C-c C-r, + and gomoku-emacs-plays is on C-c C-e. + + *** In the Outline mode defined in allout.el, + outline-rebullet-current-heading is now on C-c *. + + ** M-s in Info now searches through the nodes of the Info file, + just like s. The alias M-s was added so that you can use the same + command for searches in both Info and Rmail. + + ** iso-acc.el now lets you enter inverted-! and inverted-? + with the sequences ~! and ~?. + + ** M-x compare-windows now pushes mark in both windows before + it starts moving point. + + ** There are two new commands in Dired, A (dired-do-search) + and Q (dired-do-query-replace). These are similar to tags-search and + tags-query-replace, but instead of searching the list of files that + appears in a tags table, they search all the files marked in Dired. + + ** Changes to dabbrev. + + A new function, `dabbrev-completion' (bound to M-C-/), expands the + unique part of an abbreviation. + + Dabbrev now looks for expansions in other buffers, looks for symbols + instead of words and it works in the minibuffer. + + Dabbrev can be customized to work for shell scripts, with variables + that sometimes have and sometimes haven't a leading "$". See the + variable 'dabbrev-abbrev-skip-leading-regexp'. + + ** In Rmail, the command rmail-input-menu has been eliminated. The + feature of selecting an Rmail file from a menu is now implemented in + another way. + + ** Bookmarks changes. + + *** It now works to set bookmarks in Info nodes. + + *** Bookmarks can have annotations; type "C-h m" after doing + "M-x list-bookmarks", for more information on annotations. + + *** The bookmark-jump popup menu function is now `bookmark-menu-jump', for + those who bind it to a mouse click. + + *** The default bookmarks file name is now "~/.emacs.bmk". If you + already have a bookmarks file, it will be renamed automagically when + you next load it. + + ** New package, ps-print. + + The ps-print package generates PostScript printouts of buffers or + regions, and includes face attributes such as color, underlining, + boldface and italics in the printed output. + + ** New package, msb. + + The msb package provides a buffer-menu in the menubar with separate + menus for different types of buffers. + + ** `cpp.el' is a new library that can highlight or hide parts of a C + file according to C preprocessor conditionals. To try it, run the + command M-x cpp-highlight-buffer. + + ** Changes in CC mode. + + *** c-set-offset and related functions and variables can now accept + variable symbols. Also ++ and -- which mean 2* positive and negative + c-basic-offset respectively. + + *** New variable, c-recognize-knr-p, which controls whether K&R C + constructs will be recognized. Trying to recognize K&R constructs is a + time hog so if you're programming strictly in ANSI C, set this + variable to nil (it should already be nil in c++-mode). + + *** New variable, c-hanging-comment-ender-p for controlling + c-fill-paragraph's behavior. + + *** New syntactic symbol: statement-case-open. This is assigned to lines + containing an open brace just after a case/default label. + + *** New variable, c-progress-interval, which controls minibuffer update + message displays during long re-indention. This is a new feature + which prints percentage complete messages at specified intervals. + + ** Makefile mode changes. + + *** The electric keys are not enabled by default. + + *** There is now a mode-specific menu bar menu. + + *** The mode supports font-lock, add-log, and imenu. + + *** The command M-TAB does completion of target names and variable names. + + ** icomplete.el now works more like a minor mode. Use M-x icomplete-mode + to turn it on and off. + + Icomplete now supports an `icomplete-minibuffer-setup-hook', which is + run on minibuffer setup whenever icompletion will be occurring. This + hook can be used to customize interoperation of icomplete with other + minibuffer-specific packages, eg rsz-mini. See the doc string for + more info. + + ** Ediff change. + + Use ediff-revision instead of vc-ediff. It also replaces rcs-ediff, + for those who use that; if you want to use a version control package + other than vc.el, you must set the variable + ediff-version-control-package to specify which package. + + ** VC now supports branches with RCS. + + You can use C-u C-x C-q to select any branch or version by number. + It reads the version number or branch number with the minibuffer, + then checks out the file unlocked. + + Type C-x C-q again to lock the selected branch or version. + When you check in changes to that branch or version, there are two + possibilities: + + -- If you've selected a branch, or a version at the tip of a branch, + then the new version adds to that branch. If you wish to create a + new branch, use C-u C-x C-q to specify a version number when you check + in the new version. + + -- If you've selected an inner version which is not the latest in its + branch, then the new version automatically creates a new branch. + + ** VC now supports CVS as well as RCS and SCCS. + + Since there are no locks in CVS, some things behave slightly + different when the backend is CVS. When vc-next-action is invoked + in a directory handled by CVS, it does the following: + + If the file is not already registered, this registers it for version + control. This does a "cvs add", but no "cvs commit". + If the file is added but not committed, it is committed. + If the file has not been changed, neither in your working area or + in the repository, a message is printed and nothing is done. + If your working file is changed, but the repository file is + unchanged, this pops up a buffer for entry of a log message; when you + finish the log message with C-c C-c, that checks in the resulting + changes along with the log message as change commentary. A writable + file remains in existence. + + If vc-next-action changes the repository file, it asks you + whether to merge in the changes into your working copy. + + vc-directory, when started in a CVS file hierarchy, reports + all files that are modified (and thus need to be committed). + (When the backend is RCS or SCCS vc-directory reports all + locked files). + + VC has no support for running the initial "cvs checkout" to get a + working copy of a module. You can only use VC in a working copy of + a module. + + You can disable the CVS support as follows: + + (setq vc-master-templates (delq 'vc-find-cvs-master vc-master-templates)) + + or by setting vc-handle-cvs to nil. + + This may be desirable if you run a non-standard version of CVS, or + if CVS was compiled with FORCE_USE_EDITOR or (possibly) + RELATIVE_REPOS. + + ** Comint and shell mode changes: + + *** Completion works with file names containing quoted characters. + + File names containing special characters (such as " ", "!", etc.) that are + quoted with a "\" character are recognised during completion. Special + characters are quoted when they are inserted during completion. + + *** You can use M-x comint-truncate-buffer to truncate the buffer. + + When this command is run, the buffer is truncated to a maximum number + of lines, specified by the variable comint-buffer-maximum-size. Just + like the command comint-strip-ctrl-m, this can be run automatically + during process output by doing this: + + (add-hook 'comint-output-filter-functions + 'comint-truncate-buffer) + + ** Telnet mode buffer name changed. + + The buffer name for a Telnet buffer is now *telnet-HOST*, not + *HOST-telnet*. This is for consistency with other Emacs packages. + + ** M-x man (man) is now faster and more robust. On systems where the + entire man page is indented, the indentation is removed. + + The user option names that used to end in -p now end in -flag. The + new names are: Man-reuse-okay-flag, Man-downcase-section-letters-flag, + Man-circular-pages-flag. The Man-notify user option has been renamed to + Man-notify-method and accepts one more value, `pushy', that just + switches the current buffer to the manpage buffer, without switching + frames nor changing your windows configuration. + + A new user option Man-fontify-manpage-flag disables fontification + (thus speeding up man) when set to nil. Default is to fontify if a + window system is used. Two new user options Man-overstrike-face + (default 'bold) and Man-underline-face (default 'underline) can be set + to the preferred faces to be used for the words that man overstrikes + and underlines. Useful for those who like coloured man pages. + + Two new interactive functions are provided: Man-cleanup-manpage and + Man-fontify-manpage. Both can be used on a buffer that contains the + output of a `rsh host man manpage' command, or the output of an + `nroff -man -Tman manpage' command to make them readable. + Man-cleanup-manpage is faster, but does not fontify. + + ** The new function modify-face makes it easy to specify + all the attributes of a face, all at once. + + ** Faces now support background stippling. + + Use the command set-face-stipple to specify the stipple-pattern for a + face. Use face-stipple to access the specified stipple pattern. The + existing face functions now handle the stipple pattern when + appropriate. + + If you specify one of the standard gray colors as a face background + color, and your display doesn't handle gray, Emacs automatically uses + stipple instead to get the same effect. + + ** Changes in Font Lock mode. + + *** Fontification + + Two new default faces are provided; `font-lock-variable-name-face' and + `font-lock-reference-face'. The face `font-lock-doc-string-face' has + been removed since it is the same as the existing + `font-lock-string-face'. Where appropriate, fontification + automatically uses these new faces. + + Fontification via commands `font-lock-mode' and + `font-lock-fontify-buffer' is now cleanly interruptible (i.e., with + C-g). If you interrupt during the fontification process, the buffer + remains in its previous modified state and all highlighting is removed + from the buffer. + + For C/C++ modes, Font Lock mode is much faster but highlights much + more. Other modes are faster/more extensive/more discriminatory, or a + combination of these. + + To enable Font Lock mode, add the new function `turn-on-font-lock' in + one of the following ways: + + (add-hook 'c-mode-hook 'turn-on-font-lock) + + Or for any visited file with: + + (add-hook 'find-file-hooks 'turn-on-font-lock) + + *** Supports color and grayscale displays + + Font Lock mode supports different ways of highlighting, depending on + the type of display and background shade. Attributes (face color, + bold, italic and underline, and display type and background mode) can + be controlled either from Emacs Lisp or X resources. + + See the new variables `font-lock-display-type' and + `font-lock-face-attributes'. + + *** Supports more modes + + The following modes are directly supported: + + ada-mode, asm-mode, bibtex-mode, c++-c-mode, c++-mode, c-mode, + change-log-mode, compilation-mode, dired-mode, emacs-lisp-mode, + fortran-mode, latex-mode, lisp-mode, mail-mode, makefile-mode, + outline-mode, pascal-mode, perl-mode, plain-tex-mode, rmail-mode, + rmail-summary-mode, scheme-mode, shell-mode, slitex-mode, tex-mode, + texinfo-mode. + + See the new variables `font-lock-defaults-alist' and + `font-lock-defaults'. + + Some modes support different levels of fontification. You can choose + to use the minimum or maximum available decoration by changing the + value of the new variable `font-lock-maximum-decoration'. + + Programmers are urged to make available to the community their own + keywords for modes not yet supported. See font-lock.el for + information about efficiency. + + *** fast-lock + + The fast-lock package speeds up Font Lock mode by saving font choices + in associated cache files. When you visit a file with Font Lock mode + and Fast Lock mode turned on for the first time, the file's buffer is + fontified as normal. When certain events occur (such as exiting + Emacs), Fast Lock saves the highlighting in a cache file. When you + subsequently visit this file, its cache is used to restore the + highlighting. + + To use this package, put in your `~/.emacs': + + (add-hook 'font-lock-mode-hook 'turn-on-fast-lock) + + To control the use of caches, see the documentation for `fast-lock-mode'. + + ** You can tell pop-to-buffer to display certain buffers in the selected + window rather than finding some other window to display them in. + There are two variables you can use to specify these buffers. + + same-window-buffer-names holds a list of buffer names; if a buffer's + name appears in this list, pop-to-buffer puts it in the selected window. + + same-window-regexps holds a list of regexps--if any one of them + matches a buffer's name, then pop-to-buffer puts that buffer in the + selected window. + + The default values of these variables are not nil: they list various + buffers that normally appear, when you as for them, in the selected + window. These include shell buffers, mail buffers, telnet buffers, + and others. By removing elements from these variables, you can ask + Emacs to display those buffers in separate windows. + + ** The special-display-buffer-names and special-display-regexps lists + have been generalized. An element may now be a list. The car of the list + is the buffer name or regular expression for matching buffer names. + + The cdr of the list can be an alist specifying additional frame + parameters for use in constructing the special display frame. + + Alternatively, the cdr can have this form: + + (FUNCTION ARGS...) + + where FUNCTION is a symbol. Then the frame is constructed by calling + FUNCTION; its first argument is the buffer, and its remaining + arguments are ARGS. + + ** If the environment variable REPLYTO is set, its value is the default + for mail-default-reply-to. + + ** When you send a message in Emacs, if you specify an Rmail file with + the FCC: header field, Emacs converts the message to Rmail format + before writing it. Thus, the file never contains anything but Rmail + format messages. + + ** The new variable mail-from-style controls whether the From: header + should include the sender's full name, and if so, which format to use. + + ** The new variable mail-personal-alias-file specifies the name of the + user's personal aliases. This defaults to the file ~/.mailrc. + mailabbrev.el used to have its own variable for this purpose + (mail-abbrev-mailrc-file). That variable is no longer used. + + ** In Buffer-Menu mode, the d and C-d commands (which mark buffers for + deletion) now accept a prefix argument which serves as a repeat count. + + ** Changes in BibTeX mode. + + *** Reference keys can now be entered with TAB completion. All + reference keys defined in that buffer and all labels that appear in + crossreference entries are object to completion. + + *** Braces are supported as field delimiters in addition to quotes. + BibTeX entries may have brace-delimited and quote-delimited fields + intermixed. The delimiters generated for new entries are specified by + the variables bibtex-field-left-delimiter and + bibtex-field-right-delimiter on a buffer-local basis. Those variables + default to braces, since it is easier to put quote accented characters + (as the german umlauts) into a brace-delimited entry. + + *** The function bibtex-clean-entry can now be invoked with a prefix + argument. In this case, a label is automatically generated from + various fields in the record. If bibtex-clean-entry is invoked on a + record without label, a label is also generated automatically. + Various variables (all beginning with `bibtex-autokey-') control the + creation of that key. The variable bibtex-autokey-edit-before-use + determines, if the user is allowed to edit auto-generated reference + keys before they are used. + + *** A New function bibtex-complete-string completes strings with + respect to the strings defined in this buffer and a set of predefined + strings (initialized to the string macros defined in the standard + BibTeX style files) in the same way in which ispell-complete-word + works with respect to words in a dictionary. Candidates for + bibtex-complete-string are initialized from variable + bibtex-predefined-strings and by parsing the files found in + bibtex-string-files for @String definitions. + + *** Every reference/field pair has now attached a comment which + appears in the echo area when this field is edited. These comments + should provide useful hints for BibTeX usage, especially for BibTeX + beginners. New variable bibtex-help-message determines if these help + messages are to appear in the minibuffer when moving to a text entry. + + *** Inscriptions of menu bar changed from "Entry Types" to + "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit". + + *** The variable bibtex-include-OPTcrossref is now not longer a binary + switch but a list of reference names which should contain a crossref + field. E.g., you can tell bibtex-mode you want a crossref field for + @InProceedings and @InBook entries but for no other. + + *** The function validate-bibtex-buffer was completely rewritten to + validate if a buffer is syntactically correct. find-bibtex-duplicates + is no longer a function itself but was moved into + validate-bibtex-buffer. + + *** Cleaning a BibTeX entry tests, if necessary fields are there. + E.g., if you tell bibtex-mode to include a crossref entry, some fields + are optional which would be required without the crossref entry. If + you now leave the crossref entry empty and do a bibtex-clean-entry + with some now required fields left empty, version 2.0 of bibtex.el + complains about the absence of these fields, whereas version 1.3 + didn't. + + *** Default value for variables bibtex-maintain-sorted-entries and + bibtex-sort-ignore-string-entries is now t. + + *** All interactive functions are renamed to begin with `bibtex-'. + + *** Keybindings with \C-c\C-e entry changed for unification. Often + used reference types are now on control-modified keys, mediocre used + types are on unmodified keys, seldom used types are on shift-modified + keys and almost never used types on meta-modified keys. + + + * Configuration Changes in Emacs 19.29 + + ** Emacs now uses directory /usr/local/share for most of its installed + files. This follows a GNU convention for directory usage. + + ** The option --with-x11 is no longer supported. + X11 is the only version of X that Emacs 19.29 supports; + use --with-x if you need to request X support explicitly. + (Normally this should not be necessary, since configure should + automatically enable X support if X is installed on your machine.) + + ** If you use the site-init.el file to set the variable + mail-host-address to a string in the dumped Emacs, that string becomes + the default host address for initializing user-mail-address. + It is used instead of the value of (system-name). + + + * Lisp-Level Changes in Emacs 19.29 + + ** Basic Lisp + + *** The range of integer values is now at least 2**28 on all machines. + This means the maximum size of a buffer is at least 2**27-1, + or 134,217,727. + + *** You can now use Common Lisp syntax for the backquote and comma + macros. Thus, you can now write `(x ,y z) instead of (` (x (, y) z)). + + The old syntax is still accepted. + + *** The new function rassoc is like assoc, except that it compares the + key against the cdr of each alist element, where assoc would compare + it against the car of each alist element. + + *** The new function unintern deletes a symbol from an obarray. The + first argument can be the symbol to delete, or a string giving its + name. The second argument specifies the obarray (nil means the + current default obarray). + + If the specified symbol is not in the obarray, or if there's no symbol + in the obarray matching the specified string, unintern does nothing + and returns nil. If it does delete a symbol, it returns t. + + *** You can specify an alternative read function for use by load and + eval-region by binding the variable load-read-function to some other + function. This function should accept one argument just like read. + If load-read-function is nil, load and eval-region use ordinary read. + + *** The new function `type-of' takes any object as argument, and + returns a symbol identifying the type of that object--one of `symbol', + `integer', `float', `string', `cons', `vector', `marker', `overlay', + `window', `buffer', `subr', `compiled-function', + `window-configuration', `process'. + + *** When you use eval-after-load for a file that is already loaded, it + executes the FORM right away. As before, if the file is not yet + loaded, it arranges to execute FORM if and when the file is loaded + later. The result is: if you have called eval-after-load for a file, + and if that file has been loaded, then regardless of the order of + these two events, the specified form has been evaluated. + + *** The Lisp construct #@NUMBER now skips the next NUMBER characters, + treating them as a comment. + + You would not want to use this in a file you edit by hand, but it is + useful for commenting out parts of machine-generated files. + + *** Two new functions, `plist-get' and `plist-put', + allow you to modify and retrieve values from lists formatted as property-lists. + They work like `get' and `put', but operate on any list. + `plist-put' returns the modified property-list; you must store it + back where you got it. + + *** The new function add-to-list is called with two elements, + a variable that holds a list and a new element. + It adds the element to the list unless it is already present. + It compares elements using `equal'. Here is an example: + + (setq foo '(a b)) => (a b) + + (add-to-list 'foo 'c) => (c a b) + + (add-to-list 'foo 'b) => (c a b) + + foo => (c a b) + + ** Changes in compilation. + + Functions and variables loaded from a byte-compiled file + now refer to the file for their doc strings. + + This has a few consequences: + + -- Loading the file is faster and uses less memory. + -- Reference to doc strings is a little slower (the same speed + as reference to the doc strings of primitive and preloaded functions). + -- The compiled files will not work in old versions of Emacs. + -- If you move the compiled file after loading it, Emacs can no longer + find these doc strings. + -- If you alter the compiled file (such as by compiling a new + version), then further access to documentation strings will get + nonsense results. + + The byte compiler now optionally supports lazy loading of compiled + functions' definitions. If you enable this feature when you compile, + loading the compiled file does not actually bring the function + definitions into core. Instead it creates references to the compiled + file, and brings each function's definition into core the first time + you call that function, or when you force it with the new function + `fetch-bytecode'. + + Using the lazy loading feature has a few consequences: + + -- Loading the file is faster and uses less memory. + -- Calling any function in the file for the first time is slower. + -- If you move the compiled file after loading it, Emacs can no longer + find the function definitions. + -- If you alter the compiled file (such as by compiling a new + version), then further access to functions not already loaded + will get nonsense results. + + To enable the lazy loading feature, set up a non-nil file local + variable binding for the variable `byte-compile-dynamic' in the Lisp + source file. For example, put this on the first line: + + -*-byte-compile-dynamic: t;-*- + + It's a good idea to use the lazy loading feature for a file that + contains many functions, most of which are not actually used by a + given user in a given session. + + To turn off the basic feature of referring to the file for doc + strings, set byte-compile-dynamic-docstrings to nil. You can do this + globally, or for one source file by adding this to the first line: + + -*-byte-compile-dynamic-docstrings: nil;-*- + + ** Strings + + *** Do not pass integer arguments to `concat' (or `vconcat' or + `append'). We are phasing out the old unrecommended support for + integers as arguments to these functions, in preparation for treating + numbers as single characters in a future release. To concatenate + numbers in string form, use `number-to-string' first, or rewrite the + call to use `format' instead of `concat'. + + *** The new function match-string returns the string of text matched at + the given parenthesized expression by the last regexp search, or nil + if there was no match. If the last match was by `string-match' on a + string, the string must be given. Therefore, this function can be + used in place of `buffer-substring' and `substring', when using + `match-beginning' and `match-end' to find match positions. + + (match-string N) or (match-string N STRING) + + *** The function replace-match now accepts an optional fourth argument, + STRING. Use this after performing string-match on STRING, to replace + the portion of STRING that was matched. When used in this way, + replace-match returns a newly created string which is the same as + STRING except for the matched portion. + + *** The new function buffer-substring-no-properties + is like buffer-substring except that the string it returns + has no text properties. + + *** The function `equal' now considers two strings to be different + if they don't have the same text properties. + + ** Completion + + *** all-completions now takes an optional fourth argument. + If that argument is non-nil, completions that start with a space + are ignored unless the initial string also starts with a space. + (This used to happen unconditionally.) + + ** Local Variables + + *** Local hook variables. + + There is now a clean way to give a hook variable a buffer-local value. + Call the function `make-local-hook' to do this. + + Once a hook variable is buffer-local, you can add hooks to it either + globally or locally. run-hooks runs the local hook functions + of the current buffer, then all the global hook functions. + + The functions add-hook and remove-hook take an additional optional + argument LOCAL which says whether to add (or remove) a local hook + function or a global one. + + Local hooks use t as an element of the (local) value of the hook + variable as a flag meaning to use the global value also. + + *** The new function local-variable-p tells you whether a particular + variable is buffer-local in the current buffer or a specified buffer. + + ** Editing Facilities + + *** The function copy-region-as-kill no longer sets this-command; + as a result, a following kill command will not normally append + to the text saved by copy-region-as-kill. + + *** Regular expression searching and matching no longer performs full + Posix backtracking by default. They now stop with the first match found + instead of looking for the longest match--just as they did in Emacs 18. + The reason for this change is to get higher speed. + + There are new functions you can use if you really want to search or + match with Posix behavior: posix-search-forward, + posix-search-backward, posix-looking-at, and posix-string-match. Call + these just like re-search-forward, re-search-backward, looking-at, and + string-match. + + ** Files + + *** The new variable `format-alist' defines file formats, + which are ways of translating between the data in a file and things + (text, text-properties, and possibly other information) in a buffer. + + `format-alist' has one element for each format. Each element is a + list like this: + (NAME DOC-STRING REGEXP FROM-FN TO-FN MODIFY MODE-FN) + containing the name of the format, a documentation string, a regular + expression which is used to recognize files in that format, a decoding + function, an encoding function, a flag that indicates whether the + encoding function modifies the buffer, and a mode function. + + FROM-FN is called to decode files in that format; it gets two args, BEGIN + and END, and can make any modifications it likes, returning the new + end position. It must make sure that the beginning of the file no + longer matches REGEXP, or else it will get called again. + TO-FN is called to encode a region into that format; it is also passed BEGIN + and END, and either returns a list of annotations as in + `write-region-annotate-functions', or modifies the region and returns + the new end position. + MODIFY, if non-nil, means the TO-FN modifies the region. If nil, TO-FN may + not make any changes and should return a list of annotations. + + `insert-file-contents' checks the beginning of the file that it is + inserting to see if it matches one of the regexps. If so, then it + calls the decoding function, and then looks for another match. When + visiting a file, it also calls the mode function, and sets the + variable `buffer-file-format' to the list of formats that the file + used. + + `write-region' calls the encoding functions for each format in + `buffer-file-format' before it writes the file. To save a file in a + different format, either set `buffer-file-format' to a different + value, or call the new function `format-write-file'. + + Since some encoding functions may be slow, you can request that + auto-save use a format different from the buffer's default by setting + the variable `auto-save-file-format' to the desired format. This will + determine the format of all auto-save files. + + *** The new function file-ownership-preserved-p tells you whether + deleting a file and recreating it would keep the file's owner + unchanged. + + *** The new function file-regular-p returns t if a file + is a "regular" file (not a directory, symlink, named pipe, + terminal, or other I/O device). + + *** The new function file-name-sans-extension discards the extension + of a file name. You call it with a file name, and returns a string + lacking the extension. + + *** The variable path-separator is a string which says which + character separates directories in a search path. It is ":" + for Unix and GNU systems, ";" for MSDOG and Windows NT. + + ** Commands and Key Sequences + + *** Key sequences consisting of C-c followed by {, }, <, >, : or ; are + now reserved for major modes. Sequences consisting of C-c followed by + any other punctuation character are now meant for minor modes. We don't + plan to convert all existing major modes to stop using those sequences, + but we hope to keep them to a minimum. + + *** When the post-command-hook or the pre-command-hook gets an error, the error + is silently ignored. Emacs no longer sets the hook variable to nil when this + happens. Meanwhile, the hook functions can now alter the hook variable in + a normal fashion; there is no need to do anything special. + + *** define-key, lookup-key, and various other functions for changing or + looking up key bindings now let you write an event type with a list + like (ctrl meta newline) or (meta ?d), as in XEmacs. (ctrl meta newline) + is equivalent to the event type symbol C-M-newline, and (meta ?d) + is equivalent to the character ?\M-d. + + *** The function event-convert-list converts a list such as + (meta ?d) into the corresponding event type (a symbol or integer). + + *** In an interactive spec, `k' means to read a key sequence. In this + key sequence, upper case characters and shifted function keys which + have no bindings are converted to lower case if that makes them + defined. + + The new interactive code `K' reads a key sequence similarly, but does + not convert the last event. `K' is useful for reading a key sequence + to be given a binding. + + *** The variable overriding-local-map now has no effect on the menu bar + display unless overriding-local-map-menu-flag is non-nil. This is why + incremental search no longer temporarily changes the menu bars. + + Note that overriding-local-map does still affect the execution of key + sequences entered using the menu bar. So if you use + overriding-local-map, and a menu bar key sequence comes in, you should + make sure to clear overriding-local-map before that key sequence gets + looked up and executed. But this is what you'd normally do anyway: + programs that use overriding-local-map normally exit and "put back" + any event such as menu-bar that they do not handle specially. + + *** The new variable `overriding-terminal-local-map' is like + overriding-local-map, but is specific to a single terminal. + + *** delete-frame events. + + When you use the X window manager's "delete window" command, this now + generates a delete-frame event. The standard definition of this event + is a command that deletes the frame that received the event, and kills + Emacs when the last visible or iconified frame is deleted. You can + rebind the event to some other command if you wish. + + *** Two new types of events, iconify-frame and make-frame-visible, + indicate that the user iconified or deiconified a frame with the + window manager. Since the window manager has already done the work, + the default definition for both event types in Emacs is to do nothing. + + ** Frames and X + + *** Certain Lisp variables are now local to an X terminal (in other + words, all the screens of a single X server). The value in effect, at + any given time, is the one that belongs to the terminal of the + selected frame. The terminal-local variables are + default-minibuffer-frame, system-key-alist, defining-kbd-macro, and + last-kbd-macro. There is no way for Lisp programs to create others. + + The terminal-local variables cannot be buffer-local. + + *** When you create an X frame, for the `top' and `left' frame + parameters, you can now use values of the form (+ N) or (- N), where N + is an integer. (+ N) means N pixels to the right of the left edge of + the screen and (- N) means N pixels to the left of the right edge. In + both cases, N may be zero (exactly at the edge) or negative (putting + the window partly off the screen). + + The function x-parse-geometry can return values of these forms + for certain inputs. + + *** The variable menu-bar-file-menu has been renamed to + menu-bar-files-menu to match the actual item that appears in the menu. + (All the other such variable names do match.) + + *** The new function active-minibuffer-window returns the minibuffer window + currently active, or nil if none is now active. + + *** In the functions next-window, previous-window, next-frame, + previous-frame, get-buffer-window, get-lru-window, get-largest-window + and delete-windows-on, if you specify 0 for the last argument, + it means to consider all visible and iconified frames. + + *** When you set a frame's cursor type with modify-frame-parameters, + you can now specify (bar . INTEGER) as the cursor type. This stands + for a bar cursor of width INTEGER. + + *** The new function facep returns t if its argument is a face name + (or if it is a vector such as is used internally by the Lisp code + to represent a face). + + *** Each frame can now have a buffer-predicate function, + which is the `buffer-predicate' frame parameter. + When `other-buffer' looks for an alternative buffer, it considers + only the buffers that fit the selected frame's buffer predicate (if it + has one). This is useful for applications that make their own frames. + + *** When you create an X frame, you can now specify the frame parameter + `display'. This says which display to put the frame on. The value + should be a display name--a string of the form + "HOST:DPYNUMBER.SCREENNUMBER". + + The functions x-server-... and x-display-... now take an optional + argument which specifies the display to ask about. You can use either + a display name string or a frame. A value of nil stands for the + selected frame. + + To close the connection to an X display, use the function + x-close-connection. Specify which display with a display name. You + cannot close the connection if Emacs still has frames open on that + display. + + x-display-list returns a list indicating which displays Emacs has + connections to. Its elements are display names (strings). + + *** The icon-type frame parameter may now be a file name. + Then the contents of that file specify the icon bitmap to use + for that frame. + + *** The title of an Emacs frame, displayed by most window managers, is + set from frame-title-format or icon-title-format. These have the same + structure as mode-line-format. + + *** x-display-grayscale-p is a new function that returns non-nil if + your X server can display shades of gray. Currently it returns + non-nil for color displays (because they can display shades of gray); + we may change it in the next version to return nil for color displays. + + *** The frame parameter scroll-bar-width specifies the width of the + scrollbar in pixels. + + ** Buffers + + *** Creating a buffer with get-buffer-create does not obey + default-major-mode. That variable is now handled in a separate + function, set-buffer-major-mode. get-buffer-create and generate-new-buffer + always leave the newly created buffer in Fundamental mode. + + Creating a new buffer by visiting a file or with switch-to-buffer, + pop-to-buffer, and similar functions does call set-buffer-major-mode + to select the default major mode specified with default-major-mode. + + *** You can now create an "indirect buffer". An indirect buffer shares + its text, including text properties, with another buffer (the "base + buffer"), but has its own major mode, local variables, overlays, and + narrowing. An indirect buffer has a name of its own, distinct from + those of the base buffer and all other buffers. An indirect buffer + cannot itself be visiting a file (though its base buffer can be). + The base buffer cannot itself be indirect. + + Use (make-indirect-buffer BASE-BUFFER NAME) to make an indirect buffer + named NAME whose base is BASE-BUFFER. If BASE-BUFFER is an indirect + buffer, its base buffer is used as the base for the new buffer. + + You can make an indirect buffer current, or switch to it in a window, + just as you would a non-indirect buffer. + + The function buffer-base-buffer, given an indirect buffer, returns its + base buffer. It returns nil when given an ordinary buffer (not + indirect). + + The library `noutline' has versions of Outline mode and Outline minor + mode which let you display different parts of the outline in different + indirect buffers. + + ** Subprocesses + + *** The functions call-process and call-process-region now allow + you to direct error message output from the subprocess into a + separate destination, instead of mixing it with ordinary output. + To do this, specify for the third argument, BUFFER, a list of the form + (BUFFER-OR-NAME ERROR-DESTINATION) + BUFFER-OR-NAME specifies where to put ordinary output; it should + be a buffer or buffer name, or t, nil or 0. This is what would + have been the BUFFER argument, ordinarily. + + ERROR-DESTINATION specifies where to put the error output. + nil means discard it, t means mix it with the ordinary output, + and a string specifies a file name to write this output into. + + You can't specify a buffer to put the error output in; that is not + easy to implement directly. You can put the error output into a + buffer by sending it to a temporary file and then inserting the file + into a buffer. + + *** Comint mode changes: + + **** The variable comint-completion-addsuffix can also be a cons pair + of the form (DIRSUFFIX . FILESUFFIX), where DIRSUFFIX and FILESUFFIX are + strings added on unambiguous or exact completion of directories and file + names, respectively. + + ** Text properties + + *** You can now specify which values of the `invisible' property + make text invisible in a given buffer. The variable + `buffer-invisibility-spec', which is always local in all buffers, + controls this. + + If its value is t, then any non-nil `invisible' property makes + a character invisible. + + If its value is a list, then a character is invisible if its + `invisible' property value appears as a member of the list, or if it + appears as the car of a member of the list. + + When the `invisible' property value appears as the car of a member of + the `buffer-invisibility-spec' list, then the cdr of that member has + an effect. If it is non-nil, then an ellipsis appears in place of the + character. (This happens only for the *last* invisible character in a + series of consecutive invisible characters, and only at the end of a + line.) + + If a character's `invisible' property is a list, then Emacs checks each + element of the list against `buffer-invisibility-spec'. If any element + matches, the character is invisible. + + *** The command `list-text-properties-at' shows what text properties + are in effect at point. + + *** Frame objects now exist in Emacs even on systems that don't support + X Windows. You can create multiple frames, and switch between them + using select-frame. The selected frame is actually displayed on your + terminal; other frames are not displayed at all. The selected frame + number appears in the mode line after `Emacs', except for frame 1. + + Switching frames on ASCII terminals is therefore more or less + equivalent to switching between different window configurations. + + *** The new variable window-size-change-functions holds a list of + functions to be called if window sizes change (or if windows are + created or deleted). The functions are called once for each frame on + which changes have occurred, with the frame as the sole argument. + This takes place shortly before redisplay. + + *** The modification hook functions of overlays now work differently. + They are called both before and after each change. This makes it + possible for the functions to determine exactly what the change was. + + This change affects three overlay properties: the modification-hooks + property, a list of functions called for deletions overlapping the + overlay's range and for insertions inside it; the + insert-in-front-hooks, a list of functions called for insertions at + the beginning of the overlay; and the insert-behind-hooks, a list of + functions called for insertions at the end of the overlay. + + Each function is called both before and after each change that it + applies to. Before the change, it is called with four arguments: + (funcall FUNCTION OVERLAY nil START END) + START and END are the same arguments that the before-change-functions + receive. + + After the change, each function is called with five arguments: + (funcall FUNCTION OVERLAY t START END OLDSIZE) + The last arguments, START and END and OLDSIZE, + are the same arguments that the after-change-functions receive. + + This means the function must accept either four or five arguments. + + *** You can set defaults for text-properties with the new variable + `default-text-properties'. Its value is a property list; the values + specified there are used whenever a character (or its category) does + not specify a value. + + *** The `face' property of a character or an overlay can now be a list + of face names. Formerly it had to be just one face name. + + *** Changes in handling the `intangible' text property. + + **** If inhibit-point-motion-hooks is non-nil, then `intangible' properties + are ignored. + + **** Moving to just before a stretch of intangible text + is no longer special in any way. Point stays at that place. + + **** When you move point backwards into the midst of intangible text, + point moves back to the beginning of that text. (It used to move + forward to the end of that text, which was not very useful.) + + **** When moving across intangible text, Emacs stops wherever the + property value changes. So if you have two stretches of intangible + text, with different non-nil intangible properties, it is possible to + place point between them. + + ** Overlays + + *** Overlay changes. + + **** The new function previous-overlay-change returns the position of + the previous overlay start or end, before a specified position. This + is the backwards-moving counterpart of next-overlay-change. + + **** overlay-get now supports category properties on an overlay + the same way get-text-property supports them as text properties. + + Specifically, if an overlay does not have the property PROP that you + ask for, but it does have a `category' property which is a symbol, + then that symbol's PROP property is used. + + **** If an overlay has a non-nil `evaporate' property, it will be + deleted if it ever becomes empty (i.e., when it spans no characters). + + **** If an overlay has a `before-string' and/or `after-string' property, + these strings are displayed at the overlay's endpoints. + + ** Filling + + *** The new variable fill-paragraph-function provides a way for major + modes to override the filling of paragraphs. If this is non-nil, + fill-paragraph calls it as a function, passing along its sole + argument. If the function returns non-nil, fill-paragraph assumes it + has done the job and simply passes on whatever value it returned. + + The usual use of this feature is to fill comments in programming + language modes. + + *** Text filling and justification changes: + + **** The new variable use-hard-newlines can be used to make a + distinction between "hard" and "soft" newlines; the fill functions + will then never remove a newline that was manually inserted. Hard + newlines are marked with a non-nil `hard' text-property. + + **** The fill-column and left-margin can now be modified by text-properties. + Most lisp programs should use the new functions (current-fill-column) and + (current-left-margin), which return the proper values to use for the + current line. + + **** There are new functions for dealing with margins: + + ***** Set-left-margin and set-right-margin (set the value for a region + and re-fill). These functions take three arguments: two to specify + a region, and the desired margin value. + + ***** Increase-left-margin, decrease-left-margin, increase-right-margin, and + decrease-right-margin (change settings relative to current values, and + re-fill). + + ***** move-to-left-margin moves point there, optionally adding + indentation or changing tabs to spaces in order to make that possible. + beginning-of-line-text also moves past the fill-prefix and any + indentation added to center or right-justify a line, to the beginning + of the text that the user actually typed. + + ***** delete-to-left-margin removes any left-margin indentation, but + does not change the property. + + **** The paragraph-movement functions look for the paragraph-start and + paragraph-separate regexps at the current left margin, not at the + beginning of the line. This means that those regexps should NOT use ^ + to anchor the search. However, for backwards compatibility, a ^ at + the beginning of the regexp will be ignored, so most packages won't break. + + **** justify-current-line is now capable of doing left, center, or + right justification as well as full justification. + + **** The fill functions can do any kind of justification based on the new + `justification' text-property and `default-justification' variable, + or arguments to the functions. They also have a new option which + defeats the normal removal of extra whitespace. + + **** The new function `current-justification' returns the kind of + justification used for the current line. The new function + `set-justification' can be used to change it, including re-justifying + the text of the region according to the new value. + + **** Filling and auto-fill are disabled if justification is `none'. + + **** The auto-fill-function is now called regardless of whether + the fill-column has been exceeded; the function can determine on its + own whether filling (or justification) is necessary. + + ** Processes + + *** process-tty-name is a new function that returns the name of the + terminal that the process itself reads and writes on (not the name of + the pty that Emacs uses to talk with that terminal). + + *** Errors in process filters and sentinels are now normally caught + automatically, so that they don't abort other Lisp programs. + + Setting debug-on-error non-nil turns off this feature; then errors in + filters and sentinels are not caught. As a result, they can invoke + the debugger, under the control of debug-on-error. + + *** Emacs now preserves the match data around the execution of process + filters and sentinels. You can use search and match functions freely + in filters and sentinels without explicitly bothering to save the + match data. + + ** Display + + *** The variable message-log-max controls how messages are logged in the + "*Messages*" buffer. An integer value means to keep that many lines; + t means to log with no limit; nil means disable message logging. Lisp + code that calls `message' excessively (e.g. isearch.el) should probably + bind this variable to nil. + + *** Display tables now have a new element, at index 261, specifying the + glyph to use for the separator between two side-by-side windows. By + default, this is the vertical bar character `|'. Probably the only + other useful character to store for this element is a space, to make + less visual separation between two side-by-side windows displaying + related information. + + *** The new mode-line-format spec %c displays the current column number. + + *** The new variable blink-matching-delay specifies how long to keep + the cursor at the matching open-paren, after you insert a close-paren. + This is useful mainly on systems which can wait for a fraction of a + second--you can then specify fractional values such as 0.5. + + *** Faster processing of buffers with long lines + + The new variable cache-long-line-scans determines whether Emacs + should use caches to handle long lines more quickly. This variable is + buffer-local, in all buffers. + + Normally, the line-motion functions work by scanning the buffer for + newlines. Columnar operations (like `move-to-column' and + `compute-motion') also work by scanning the buffer, summing character + widths as they go. This works well for ordinary text, but if the + buffer's lines are very long (say, more than 500 characters), these + motion functions will take longer to execute. Emacs may also take + longer to update the display. + + If cache-long-line-scans is non-nil, these motion functions cache + the results of their scans, and consult the cache to avoid rescanning + regions of the buffer until the text is modified. The caches are most + beneficial when they prevent the most searching---that is, when the + buffer contains long lines and large regions of characters with the + same, fixed screen width. + + When cache-long-line-scans is non-nil, processing short lines will + become slightly slower (because of the overhead of consulting the + cache), and the caches will use memory roughly proportional to the + number of newlines and characters whose screen width varies. + + The caches require no explicit maintenance; their accuracy is + maintained internally by the Emacs primitives. Enabling or disabling + the cache should not affect the behavior of any of the motion functions; + it should only affect their performance. + + ** System Interface + + *** The function user-login-name now accepts an optional + argument uid. If the argument is non-nil, user-login-name + returns the login name for that user id. + + *** system-name, user-name, user-full-name and user-real-name are now + variables as well as functions. The variables hold the same values + that the functions would return. The new variable multiple-frames + is non-nil if at least two non-minibuffer frames are visible. These + variables may be useful in constructing the value of frame-title-format + or icon-title-format. + + *** Changes in time-conversion functions. + + **** The new function format-time-string takes a format string and a + time value. It converts the time to a string, according to the format + specified. You can specify what kind of conversion to use with + %-specifications. + + **** The new function decode-time converts a time value into a list of + specific items of information: the year, month, day of week, day of + month, hour, minute and second. (A time value is a list of two or + three integers.) + + **** The new function encode-time converts specific items of time + information--the second, minute, hour, day, month, year, and time + zone--into a time value. + + + + * Changes in Emacs 19.27 + + There are no changes; however, here is one bug fix made in 19.26 that users + think should be documented here. + + ** SPC and DEL in Info now handle menus consistently. + + SPC and DEL scroll through an entire subtree an Info manual. Once you + scroll through a node far enough to reach a menu, SPC begins moving + into the subnodes of the menu, starting with the first one. When you + reach the end of a subnode, SPC moves into the next subnode, and so + on. + + DEL more or less scrolls through the same text in reverse order. + + + + * User Editing Changes in Emacs 19.26 + + ** In the X toolkit version, if you click on a menu bar item and + release the button quickly outside the menu, the menu remains visible + until you click or type something else. If you click on the menu, you + select from the menu. Any other mouse click makes the menu disappear. + Keyboard input gets rid of the menu and then is processed normally. + + "Quickly" means within double-click-time milliseconds. + + ** The C-x 5 commands to select a buffer in "another frame" now use an + existing iconified frame, if any, deiconifying it. They also raise + the frame. + + ** Region highlighting on a black-and-white-only display now uses + underlining. Inverse-video had the problem that you couldn't see + the cursor. + + ** You can now change the height of a window by pressing mouse-1 on + the mode line and dragging it up and down. + + ** If you set the environment variable LC_CTYPE to iso_8859_1 or + iso-8859-1, Emacs automatically sets up for display and syntactic + handling of the ISO Latin-1 character set. + + This does not automatically load any of the packages for input of + these characters, because it's not yet clear what is right to do. + You must still explicitly load either iso-transl or iso-acc. + + ** For a read-only buffer that is also modified, the mode line now displays + %* instead of %%. + + ** M-prior (scroll-other-window-down) is a new command that works like + M-next (and C-M-v) but scrolls in the opposite direction. + + M-home moves to the beginning of the buffer, in the other window. + M-end moves to the end of the buffer, in the other window. These two + commands, along with M-next and M-prior, form a series of commands for + moving around in the other window. + + ** In change logs, the mail address is now delimited with <...> instead + of (...). + + This makes it a little more convenient to extract the mail address for + use in mailing a message. + + ** In Shell mode and other comint modes, C-a has now returned to + its ordinary meaning: move to the beginning of the line. + Use C-c C-a to move to the end of the prompt. + + ** If you set mail-signature to t to cause automatic insertion of + your .signature file, you now get a -- before the signature. + + ** Setting rmail-highlighted-headers to nil entirely turns off + highlighting in Rmail. However, if your motivation for doing this is + that the highlighted text doesn't look good on your display, it might + be better to change the appearance of the `highlight' face. Once + you've done that, you may find Rmail highlighting is useful. + + ** In the calendar, mouse-2 is now used only for commands that apply to a date. + If you click it when not on a date, it gives an immediate error. + + Mouse-3 in the calendar now gives a menu of commands that do not apply + to a particular date. + + The D command displays diary entries from a specified diary file (not + your standard diary file). + + ** In the gnus-uu package, the binding for gnus-uu-threaded-decode-and-view + is now C-c C-v C-d, not C-c C-v C-h. Thus, C-c C-v C-h is now available + for asking for a list of the subcommands of C-c C-v. + + ** You can now specify "who you are" for various Emacs packages by + setting just one variable, user-mail-address. This currently applies + to posting news with GNUS and to making change log entries. It may + apply to additional Emacs features in the future. + + + * Lisp-Level Changes in Emacs 19.26: + + ** The function insert-char now takes an optional third argument + which, if non-nil, says the inserted characters should inherit sticky + text properties from the surrounding text. + + ** The `diary' library has been renamed to `diary-lib'. If you refer + to this library in your Lisp code, you must update the references. + + ** Sending text to a subprocess can read input from subprocesses if it + has to wait because the destination subprocess's terminal input buffer + is full. + + It was already possible in unusual occasions for this operation to + read subprocess input, but it did not happen very often. It is now + more likely to happen. + + ** last-nonmenu-event is now bound to t around filter functions and sentinels. + This is to ensure that y-or-n-p and yes-or-no-p use the keyboard by default. + + ** In mode lines, %+ now displays as % for unmodified read-only + buffers. It is now the same as %* except in the case of a modified + read-only buffer; in that case, %+ displays as *. + + The old meaning of %+ is now available on %&. + It displays * for a modified buffer and - for an unmodified buffer, + regardless of read-only status. + + ** You can now use `underline' in the color list of a face. + It serves as a last resort, and says to underline the face + (if previous color list elements can't be used). + + ** The new function x-color-values returns the list of color values + for a given color name (a string). The list contains three integers + which give the amounts of red, green and blue in the color: (R G B). + + ** In run-at-time, 0 as the repeat interval means "don't repeat". + + ** The variable trim-versions-without-asking has been renamed to + delete-old-versions. + + ** The new function other-window-for-scrolling returns the choice of + other window for C-M-v to scroll. + + ** Note that the function fceiling was mistakenly documented as fceil before. + + + * Changes in cc-mode.el in Emacs 19.26: + + ** A new syntactic symbol has been added: substatement-open. It + defines the open brace of a substatement block. These used to get: + ((block-open ...) (substatement . ...)). + + Non-block substatement lines still get just ((substatement . ...)) + + Note that the custom indent function c-adaptive-block-open has been + removed as obsolete. + + ** You can now specify the `hanginess' of closing braces. See + c-hanging-braces-alist. + + ** Recognizes try and catch blocks in C++. They are given the + substatement syntactic symbol. + + ** should be generally more forgiving about non-GNU standard top-level + construct definition styles (i.e. where the function/class/struct + opening brace does not start in column zero). + + If you hang the braces that open a top-level construct on the right + edge, and you find you still need to define defun-open-prompt (Emacs + 19) please let me know. Note that there may still be performance + issues related to non-column zero opening braces. + + ** c-macro-expand is put on C-c C-e + + ** New style: "Default". Resets indentation to those shipped with + cc-mode.el. + + ** internal defun c-indent-via-language-element has been renamed + c-indent-line for compatibility with c-mode.el and awk-mode. + + ** new buffer-local variable c-comment-start-regexp for (potential) + flexibility in adding new modes based on cc-mode.el + + + + * Changes in Emacs 19.25 + + The variable x-cross-pointer-shape (which didn't really exist) has + been renamed to x-sensitive-text-pointer-shape, and now does exist. + + + + * Changes in Emacs 19.24 + + Here is a list of new Lisp packages introduced since 19.22. + + derived.el Define new major modes based on old ones. + dired-x.el Extra Dired features. + double.el New mode for conveniently inputting non-beyond chars. + easymenu.el Create menus easily. + ediff.el Snazzy diff interface. + foldout.el A kind of outline mode designed for editing programs. + gnus-uu.el UUdecode in GNUS buffers. + ielm.el Interactively evaluate Lisp. + This is a replacement for Lisp Interaction Mode. + iso-cvt.el Conversion of beyond-ASCII characters between + various different representations. + jka-compr.el Automatic compression/decompression. + mldrag.el Drag modeline to change heights of windows. + mail-hist.el Provides history for headers of outgoing mail. + rsz-mini.el Automatically resizing minibuffers. + s-region.el Set region by holding shift. + skeleton.el Templates for statement insertion. + soundex.el Classifying words by how they sound. + tempo.el Template insertion with hotspots. + + + + * User Editing Changes in 19.23. + + ** Emacs 19.23 uses Ispell version 3. + + Previous Emacs 19 versions used Ispell version 4. That version had + improvements in storing the dictionary compactly, but these are not + very important nowadays. Meanwhile, in parallel to the work on Ispell + 4, many useful features were added to Ispell 3. Until a few months + ago, the terms on Ispell 3 did not let us use it; but they have now + been changed, so now we are using it. We are dropping Ispell 4. + + ** Emacs 19.23 can run on MS-DOG. See the file MSDOS in the same + directory as this file. + + ** Emacs 19.23 can work with an X toolkit. You must specify toolkit + operation when you configure Emacs: use the option + --with-x-toolkit=yes. (This option uses code developed by Lucid; + thanks to Frederic Pierresteguy for helping to adapt it.) + + ** Emacs now has dialog boxes; yes/no and y/n questions automatically + use them in commands invoked with the mouse. For more information, + see below under "Lisp programming changes". + + ** Menus now display the keyboard equivalents (if any) of the menu + commands in parentheses after the menu item. + + ** Kill commands, used in a read-only buffer, now move point across + the text they would otherwise have killed. This way, you can use + repeated kill commands to transfer text into the kill ring. + + ** There is now a global mark ring in addition to the mark ring that is local + to each buffer. The global mark ring stores positions in any buffer. Any + time the mark is set and the current buffer is different from the last time + the mark was set, the new mark is pushed on the global mark ring as well. + The new command C-x C-SPC (pop-global-mark) pops the global mark ring and + jumps to the last mark pushed, first switching to that buffer. + + ** Query Replace is now available in the Edit menu. + + ** ESC no longer simply exits a Query Replace. It now exits the Query + Replace and remains pending. Thus, ESC A and M-A are now equivalent + in Query Replace. + + To simply exit a Query Replace, type RET or Period. + + ** M-mouse-2 now puts point at the end of the yanked secondary selection. + + ** Mouse-1 in the mode line now simply selects the window above that + mode line. Mouse-2 in the mode line selects that window and expands + it to fill the frame it is in. + + ** You can now use mouse-2 in a Dired buffer or Tar mode buffer to find + a file you click on, in a compilation buffer to go to a particular + error message, and in a *Occur* buffer to go to a particular + occurrence. + + (It was already possible to do likewise in Info and in completion list + buffers.) + + What's more, the sensitive areas of the buffer now highlight when you + move the mouse over them. + + ** In a completion list buffer, the command RET now chooses the completion + that is around or next to point. + + ** If you specify the foreground color for the `mode-line' face, and + mode-line-inverse-video is non-nil, then the default background color + is the usual foreground color. + + ** revert-buffer now preserves markers pointing within the unchanged + text (if any) at the beginning and end of the file. + + ** Version control checkin and checkout preserve all markers if the + file does not contain any of the magic version header sequences that + are updated automatically by RCS and SCCS. If such version headers + are present, checkin and checkout preserve a marker unless it comes + between two such sequences. (So it's a good idea to put all the + header sequences close together.) + + ** When a large deletion shuts off auto save temporarily in a buffer, + you can now turn it on again by saving the buffer with C-x C-s (as was + possible in Emacs 18). You can also turn it on again with M-1 M-x + auto-save (as has been possible in Emacs 19). + + ** C-x r d now runs the command delete-rectangle. + + ** The new command imenu shows you a menu of interesting places in the + current buffer and lets you select one; then it moves point there. + The definition of interesting places depends on the major mode, but + typically this includes function definitions and such. Normally, + imenu displays the menu in a buffer; but if you bind it to a mouse + event, it shows a mouse popup menu. + + ** You can make certain chosen buffers, that normally appear in a + separate window, appear in special frames of their own. To do this, + set special-display-buffer-names to a list of buffer names; any buffer + whose name is in that list automatically gets a special frame when it + is to be displayed in another window. + + A good value to try is ("*compilation*" "*grep*" "*TeX Shell*"). + + More generally, you can set special-display-regexps to a list of regular + expressions; then each buffer whose name matches any of those regular + expressions gets its own frame. + + The variable special-display-frame-alist specifies the frame + parameters for these frames. It has a default value, so you don't + need to set it. + + ** If you set sentence-end-double-space to nil, the fill commands + expect just one space at the end of a sentence. (If you want the + sentence commands to accept single spaces, you must modify the regexp + sentence-end also.) + + ** You can suppress the startup echo area message by adding text like + this to your .emacs file: + + (setq inhibit-startup-echo-area-message "YOUR-LOGIN-NAME") + + Simply setting inhibit-startup-echo-area-message to your login name is + not sufficient to inhibit the message; Emacs explicitly checks whether + .emacs contains an expression as shown above. Your login name must + appear in the expression as a Lisp string constant. + + This way, you can easily inhibit the message for yourself if you wish, + but thoughtless copying of your .emacs file will not inhibit the + message for someone else. + + ** Outline minor mode now uses C-c C-o as a prefix instead of just C-c. + + ** In Outline mode, hide-subtree is now C-c C-d. (It was C-c C-h; but + that is now a conventional way to ask for help about C-c commands.) + + ** There are two additional commands in Outline mode. + M-x hide-sublevels + hides all headers except the topmost N levels. + M-x hide-other + hides everything about the body that point is in + plus the headers leading up from there to the top of the tree. + + ** In iso-transl and iso-insert, the sequences for entering A-ring and + the AE ligature are now just A and E (plus the initial C-x 8 or Alt). + You used to have to enter AA or AE, after the C-x 8 prefix of course. + Likewise for lower case a-ring and ae. + + ** iso-transl now defines convenient Alt keys as well as the C-x 8 prefix. + Instead of prefixing a sequence with C-x 8, you can add Alt to the + first character of the sequence. For example, Alt-" a is now a way + to enter an a-umlaut. + + ** CC mode is a greatly improved mode for C and C++. + See the following page. + + ** tcl mode is a new major mode. It provides features for + editing, indenting and running tcl programs. + + ** Compilation minor mode lets you parse error messages in any buffer, + not just a normal compilation output buffer. Type M-x + compilation-minor-mode to enable the minor mode; then C-c C-c jumps to + the source location for the error at point, as in the `*compilation*' + buffer. If you use compilation-minor-mode in an Rlogin buffer, it + automatically accesses remote source files by ftp. + + ** Comint and shell mode changes: + + *** Comint modes (including Shell mode, GUD modes, etc.) now bind + C-M-l to the command comint-show-output. This command scrolls the + buffer to show the last batch of output from the subprogram. + + *** Completion in Comint modes now truly operates on the string before + point, rather than the word that point is within. + + *** Comint mode file name completion ignores those files that end with a + string in the new variable comint-completion-fignore. This variable's + default value is nil. + + *** Shell mode uses the variable shell-completion-fignore to set + comint-completion-fignore. The default value is nil, but some + people prefer ("~" "#" "%"). + + *** The function `comint-watch-for-password-prompt' can be used to + suppress echoing when a subprocess asks for a password. To use it, + do this: + + (add-hook 'comint-output-filter-functions + 'comint-watch-for-password-prompt) + + *** You can use M-x shell-strip-ctrl-m to strip ^M characters from + process output. + + *** In Shell mode, TAB now completes environment variables, if possible, + and expands directory references. + + *** You can use M-x comint-run to execute any program of your choice in + a comint mode. Some programs such as shells, rlogin, and debuggers + have their own specialized modes; this command is one way to use + comint to run programs for which no such specialized mode exits. (You + can also run a shell with M-x shell and run the program of your choice + under the shell--but that gives you the specializations of Shell + mode.) + + ** When you run GUD (M-x gdb, M-x dbx, and so on), you can use TAB + to do file name completion in the minibuffer. + + The "Complete" menu includes an item for directory expansion. + + ** GUD working with future versions of GDB will permit TAB for + GDB-style symbol completion. This will work with GDB 4.13. + + ** Rmail no longer gets new mail automatically when you visit an Rmail + file specified by name--not even if it is your primary Rmail file. To + get new mail, type `g'. This feature is an advantage because you now + have a choice of whether to get new mail. (This change actually + occurred in an earlier version, but wasn't listed here then, since it + made the code do what the documentation already said.) + + ** Rmail now highlights certain fields automatically, when you use X + windows. The variable rmail-highlighted-headers controls which + fields. + + ** If you set rmail-summary-window-size to an integer, Rmail uses + a window that many lines high for the summary buffer. + + ** rmail-input-menu is a new command that visits an Rmail file letting + you choose which file with a mouse menu. rmail-output-menu is + similar; it outputs the current message, using a mouse menu to choose + which Rmail file. These commands use the variables + rmail-secondary-file-directory and rmail-secondary-file-regexp. + + ** The mh-e package has been changed substantially. + See the file ./MH-E-NEWS for details. + + ** The calendar and diary have new features. + + The menu bar for the calendar contains most of the calendar commands, + arranged into logical categories. + + Mouse-2 now performs specific-date-related commands when clicked on a + date in the calendar window and common three-month-related commands + when clicked elsewhere in the calendar window. + + You can set up colored/shaded highlighting of holidays, diary entry + dates, and today's date, by setting calendar-holiday-marker, + diary-entry-marker, and calendar-today-marker to a face instead of a + character. Using a special face is now the default if you are using a + window system. + + ** The appt package for displaying appointment reminders has new + features. + + *** The appt alarm window stays for the full duration of + appt-display-duration. It no longer disappears when you start typing + text. + + *** You can change the way the appointment window is created/deleted by + setting the variables appt-disp-window-function and + appt-delete-window-function. + + For instance, these variables can be set to functions that display + appointments in pop-up frames, which are lowered or iconified after + appt-display-duration seconds. + + ** desktop.el can now save a list of buffer-local variables, + and saves more global ones. + + ** Pascal mode has been completely rewritten. It now features + completing of function names, variables and type definitions around + current point (like M-TAB does with lisp-symbols). There's also an + outline mode (M-x pascal-outline) that hides the bodies of all + functions you're not working with. + + ** Edebug has a number of changes: + + *** Edebug syntax error reporting is improved. + + *** Top-level forms and defining forms other than defun and defmacro may + now be debugged with Edebug. + + *** Edebug specifications may now contain body, &define, name, arg or + arglist, def-body, and def-form, to support definitions. + + *** edebug-all-defuns is renamed to edebug-all-defs. + def-edebug-form-spec is replaced by def-edebug-form whose arguments + are unevaluated. The old names are still available for now. + + *** Frequency counts and coverage data may be displayed for functions being + debugged. + + *** A global break condition is now checked at every stop point. + + *** The previous condition at a breakpoint may now be edited. + + *** A new "next" mode stops only after expression evaluation. + + *** A new command, top-level-nonstop, does not even stop for unwind-protect, + as top-level would. + + + * Changes in CC mode in Emacs 19.23. + + `cc-mode' provides ANSI C, K&R C, and ARM C++ language editing. It + represents the merge of c++-mode.el and c-mode.el. cc-mode provides a + new, more flexible indentation engine so that indentation + customization is more intuitive. There are two steps to calculating + indentation: first, CC mode analyzes the line for syntactic content, + then based on this content it applies user defined offsets and adds + this offset to the indentation of some previous line. + + The syntactic analysis determines if the line describes a `statement', + `substatement', `class-open', `member-init-intro', etc. These are + described in detail with C-h v c-offsets-alist. You can change the + offsets interactively with C-c C-o (c-set-offsets), or + programmatically in your c-mode-common-hook, which is run both by + c-mode and c++-mode. You can also set up "styles" in the same way + that you could with c-mode.el. The variable c-basic-offset controls + the basic offset given to a level of indentation. + + If, for example, you wanted to change this style: + + int foo (int i) + { + switch (i) { + case 1: + printf ("its a foo\n"); + break; + default: + printf ("don't know what it is\n"); + break; + } + } + + into this: + + int foo (int i) + { + switch (i) { + case 1: + printf ("its a foo\n"); + break; + default: + printf ("don't know what it is\n"); + break; + } + } + + you could add the following to your .emacs file: + + (defun my-c-mode-common-hook () + (c-set-offset 'case-label 2) + (c-set-offset 'statement-case-intro 2)) + (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) + + ** New variables: + + c-offsets-alist contains an association list of syntactic symbols and + their relative offsets. Do a "C-h v c-offsets-alist" to get a list of + all syntactic symbols currently defined, and their meanings. You + should not change this variable directly; use the supplied interface + commands c-set-offset and c-set-style. + + c-mode-common-hook is run by both c-mode and c++-mode during their + common initializations. You should put any customizations that are + the same for both C and C++ into this hook. + + The variable c-strict-semantics-p is used mainly for debugging. When + non-nil, CC mode signals an error if it returns a syntactic symbol + that can't be found in c-offsets-alist. + + If you want CC mode to echo the syntactic analysis for a particular + line when you hit the TAB key, set c-echo-semantic-information-p to + non-nil. + + c-basic-offset controls the standard amount of offset for a level of + indentation. You can set a syntactic symbol's offset to + or - as a + short-hand for positive or negative c-basic-offset. + + c-comment-only-line-offset lets you control indentation given to lines + which contain only a comment, in the case of C++ line style comments, + or the introduction to a C block comment. Comment-only lines at + column zero can be anchored there independent of the indentation given + to other comment-only lines. + + c-block-comments-indent-p controls the style of C block comment + re-indentation. If you put leading stars in front of comment + continuation lines, you should set this variable to nil. + + c-cleanup-list is a list describing certain C and C++ constructs to be + "cleaned up" as they are typed, but only when the auto-newline feature + is turned on. In C++, make sure this variable contains at least + 'scope-operator so that double colons will not be separated by a + newline. + + Colons (`:') and braces (`{` and `}') are special in C and C++. For + certain constructs, you may like them to hang on the right edge of the + code, or you may like them to start a new line of code. You can use + the two variables c-hanging-braces-alist and c-hanging-colons-alist + to control whether newlines are placed before and/or after colons and + braces when certain C and C++ constructs are entered. For example, + you can control whether the colon that introduces a C++ member + initialization list hangs on the right edge, starts a new line, or has + no newlines either before or after it. + + c-special-indent-hook is run after a line is indented by CC mode. You + can perform any custom indentations here. + + c-delete-function is the function that is called when a single + character is deleted with the c-electric-delete command (DEL). + + c-electric-pound-behavior describes what happens when you enter the + `#' that introduces a cpp macro. + + If c-tab-always-indent is neither t nor nil, then TAB inserts a tab + when within strings, comments, and cpp directives, but it reindents + the line unconditionally. + + c-inhibit-startup-warnings-p inhibits warnings about any old + version of Emacs you might be running, which could be incompatible + with cc-mode. + + ** There are two new minor-mode features in CC mode: auto-newline and + hungry-delete. Auto-newline inserts newlines automatically as you + type certain constructs. Hungry-delete consumes all preceding + whitespace (spaces, tabs, and newlines) when the delete key is hit. + You can toggle auto-newline on and off on a per-buffer basis by + hitting C-c C-a. You can toggle hungry-delete on and off by hitting + C-c C-d. You can toggle them both on and off together with C-c C-t. + + ** Slash (`/') and star (`*') are now both electric characters. + + ** New commands: + + The new C-c C-o (c-set-offset) command can be used to interactively change + the offset for a particular syntactic symbol. + + The new command C-c : (c-scope-operator) inserts the C++ scope operator in + c++-mode only. + + The new command C-c C-q (c-indent-defun) indents the entire enclosing + top-level function or class. + + The new command C-c C-s (c-show-semantic-information) echos the current + syntactic analysis without re-indenting the current line. + + The new commands M-x c-forward-into-nomenclature and M-x + c-backward-into-nomenclature (currently otherwise unbound to a key + sequence), make movement easier when using the C++ variable naming + convention of VariableNamesWithoutUnderscoresButEachWordCapitalized. + + ** Command from c-mode.el that have been renamed in cc-mode.el: + + electric-c-brace => c-electric-brace + electric-c-semi => c-electric-semi&comma + electric-c-sharp-sign => c-electric-pound + mark-c-function => c-mark-function + electric-c-terminator => c-electric-colon + indent-c-exp => c-indent-exp + set-c-style => c-set-style + + ** Variables from c-mode.el that are obsolete with cc-mode.el: + + c-indent-level + c-brace-imaginary-offset + c-brace-offset + c-argdecl-indent + c-label-offset + c-continued-statement-offset + c-continued-brace-offset + + + * Lisp programming changes in Emacs 19.23. + + ** To pop up a dialog box, call x-popup-dialog. + It takes two arguments, POSITION and CONTENTS. + + POSITION specifies which frame to place the dialog box over; + the dialog box always goes on the center of the frame. + POSITION may be a mouse event, a window, a frame, + or t meaning use the frame that the mouse is in. + + CONTENTS specifies the contents of the dialog box. + It looks like a single pane of a popup menu: + (TITLE ITEM1 ITEM2 ...), where each ITEM has the form (STRING . VALUE). + The return value is VALUE from the chosen item. + + An ITEM may also be just a string--that makes a nonselectable item. + An ITEM may also be nil--that means to put all preceding items + on the left of the dialog box and all following items on the right. + (By default, approximately half appear on each side.) + + If your Emacs is not using an X toolkit, then it cannot display a + real dialog box; so instead it displays a pop-up menu in the center + of the frame. + + ** y-or-n-p, yes-or-no-p and map-y-or-n-p now use menus or dialog boxes + to ask their question(s) if the command that is running was reached by + a mouse event. + + If you want to control which way these functions work, bind the + variable last-nonmenu-event around the call. These functions use the + keyboard if that variable holds a keyboard event (actually, any + non-list); they use the mouse if that variable holds a mouse event + (actually, any list). + + ** The mouse-face property is now implemented, both in overlays and as + a text property. It specifies a face to use when the mouse is in the + range of text for which the property is specified. + + ** When text has a non-nil `intangible' property, you cannot move point + within it or right before it. If you try, point actually moves to the + end of the intangible text. Note that this means that backward-char + is a no-op when there is an intangible character to the left of point. + + ** minibuffer-exit-hook is a new normal hook that is run when you + exit the minibuffer. + + ** The variable x-cross-pointer-shape specifies the cursor shape to use + when the mouse is over text that has a mouse-face property. + + ** The new variable interpreter-mode-alist specifies major modes to use + for shell scripts that specify a command interpreter. Its elements + look like (INTERPRETER . MODE); for example, ("perl" . perl-mode) is + one element present by default. This feature applies only when the + file name doesn't indicate which mode to use. + + ** If you use a minibuffer-only frame, set the variable + minibuffer-auto-raise to t, and entering the minibuffer will then + raise the minibuffer frame. + + ** If pop-up-frames is t, display-buffer now looks for an existing + window in any visible frame, showing the specified buffer, and uses + such a window in preference to making a new frame. + + ** In the functions next-window, previous-window, next-frame, + previous-frame, get-buffer-window, get-lru-window, get-largest-window + and delete-windows-on, if you specify `visible' for the last argument, + it means to consider all visible frames. + + ** Mouse events now give the X and Y coordinates in pixels, rather than + in characters. You can convert these values to characters by dividing by + the values of (frame-char-width) and (frame-char-height). + + ** The new functions mouse-pixel-position and set-mouse-pixel-position + read and set the mouse position in units of pixels. The existing + functions mouse-position and set-mouse-position continue to work with + units of characters. + + ** The new function compute-motion is useful for computing the width + of certain text when it is displayed. + + ** The function vertical-motion now takes an option second argument WINDOW + which says which window to use for the display calculations. + + vertical-motion always operates on the current buffer. + It is ok to specify a window displaying some other buffer. + Then vertical-motion uses the width, hscroll and display-table of + the specified window, but still scans the current buffer. + + ** An error no longer sets last-command to t; the value of last-command + does reflect the previous command (the one that got an error). + + If you do not want a particular command to be recognized as the + previous command in the case where it got an error, you must code that + command to prevent this. Set this-command to t at the beginning of + the command, and set this-command back to its proper value at the end, + like this: + + (defun foo (args...) + (interactive ...) + (setq this-command t) + ...do the work... + (setq this-command 'foo)) + + or like this: + + (defun foo (args...) + (interactive ...) + (let ((old-this-command this-command)) + (setq this-command t) + ...do the work... + (setq this-command old-this-command))) + + The undo and yank commands do this. + + ** If you specify an explicit title for a new frame when you create it, + the title is used as the resource name when looking up X resources to + control the shape of that frame. If you don't specify the frame title, + the value of x-resource-name is used, as before. + + ** The frame parameter user-position, if non-nil, says that the user + has specified the frame position. Emacs reports this to the window + manager, to tell it not to override the position that the user + specified. + + ** Major modes can now set change-major-mode-hook to arrange for state + to be cleaned up when the user switches to a new major mode. The function + kill-all-local-variables runs this hook. For best results, make the hook a + buffer-local variable so that it will disappear after doing its job and will + not interfere with the subsequent major mode. + + ** The new variable overriding-local-map, if non-nil, specifies a keymap + that overrides the current local map, all minor mode keymaps, and all + text property keymaps. Incremental search uses this feature to override + all other keymaps temporarily. + + ** A key definition in a menu keymap can now have additional structure: + in addition to (ITEMNAME [HELPSTRING] . COMMAND) which was allowed + before, the form (ITEMNAME [HELPSTRING] (...) . COMMAND) is + allowed. (HELPSTRING is optional, and is not currently used.) + + Here (...) represents a sublist containing information about keyboard + key sequences that run the same command COMMAND. Displaying the menu + automatically creates and updates the sublist when appropriate; you + need never set these up yourself. + + lookup-key, key-binding, and similar functions return just COMMAND, + not the whole binding. + + To precompute this information for a given keymap, you can do + (x-popup-menu nil KEYMAP). + + ** When you specify coordinates for x-popup-menu as a list ((XOFFSET + YOFFSET) WINDOW), the coordinates are now measured in pixels. + + ** where-is-internal now takes just four arguments: + DEFINITION KEYMAP FIRSTONLY NOINDIRECT. + The single argument KEYMAP replaces two arguments KEYMAP and KEYMAP1. + + If KEYMAP is non-nil, where-is-internal searches only KEYMAP and the + global keymap. + + If KEYMAP is nil, where-is-internal searches all the currently active + keymaps, but finds the active keymaps as if overriding-local-map were + nil. + + If you pass a list of the form (keymap) as KEYMAP, where-is-internal + searches only the global map. (This is not a special case--it follows + from the specifications above.) + + If you pass the value of overriding-local-map as KEYMAP, where-is-internal + searches in exactly the same was as command execution does. + + ** Use the macro define-derived-mode to define a new major mode that + inherits the definition of another major mode. Here's how to define a + command named hypertext-mode that inherits from the command text-mode: + + (define-derived-mode hypertext-mode text-mode "Hypertext" + "Major mode for hypertext.\n\n\\{hypertext-mode-map}" + (setq case-fold-search nil)) + + (define-key hypertext-mode-map [down-mouse-3] 'do-hyper-link) + + The new mode has its own keymap, which inherits from that of the + original mode. It also has its own syntax and abbrev tables, which + are initialized by copying those of the original mode. It also has + its own mode hook. All are given names made by appending a suffix + to the name of the new mode. + + ** A syntax table can now inherit the data for some characters from + standard-syntax-table, while specifying other characters itself. + Syntax code 13 means "inherit this character from the standard syntax + table." In modify-syntax-entry, the character `@' represents this code. + + The function `make-syntax-table' now creates a syntax table which + inherits all letters and control characters (0 to 31 and 128 to 255) + from the standard syntax table, while copying the other characters + from the standard syntax table. Most syntax tables in Emacs are set + up this way. + + This sort of inheritance is useful for people who set up character + sets with additional alphabetic characters in the range 128 to 255. + Just changing the standard syntax for these characters affects all + major modes. + + ** The new function transpose-regions swaps two regions of the buffer. + It preserves the markers in those two regions, so that they stay with + the surrounding text as it is swapped. + + ** revert-buffer now runs before-revert-hook at the beginning and + after-revert-hook at the end. These can be used by minor modes + that need to clean up state variables. + + ** The new function get-char-property is like get-text-property, but + checks for overlays with properties as well as for text properties. + It checks for overlays first, in order of descending priority, and + text properties last. + + get-char-property allows windows as the OBJECT argument, as well + as buffers and strings. If you specify a window, then only overlays + active on that window are considered. + + ** Overlays can have the `invisible' property. + + ** The function insert-file-contents now takes an optional fifth + argument called REPLACE. If this is t, it means to replace the + contents of the buffer (actually, just the accessible portion) + with the contents of the file. + + This is better than simply deleting and inserting the whole thing + because (1) it preserves some marker positions and (2) it puts less + data in the undo list. + + ** The variable inhibit-first-line-modes-regexps specifies classes of + file names for which -*- on the first line should not be looked for. + + ** The variables before-change-functions and after-change-functions + hold lists of functions to call before and after a change in the + buffer's text. They work much like before-change-function and + after-change-function, except that they hold a list of functions + instead of just one. + + These variables will eventually make before-change-function and + after-change-function obsolete. + + ** The variable kill-buffer-query-functions holds a list of functions + to be called with no arguments when a buffer is about to be killed. + (That buffer is the current buffer when the function is called.) + If any of the functions returns nil, the buffer is not killed + (and the remaining functions in the list are not called). + + ** The variable kill-emacs-query-functions holds a list of functions + to be called with no arguments when you ask to exit Emacs. + If any of the functions returns nil, the exit is canceled + (and the remaining functions in the list are not called). + + ** The argument for buffer-disable-undo is now optional, + like the argument for buffer-enable-undo. + + ** The new variable system-configuration holds the canonical three-part + GNU configuration name for which Emacs was built. + + ** The function system-name now tries harder to return a fully qualified + domain name. + + ** The variable emacs-major-version holds the major version number + of Emacs. (Currently 19.) + + ** The variable emacs-minor-version holds the minor version number + of Emacs. (Currently 23.) + + ** The default value of comint-input-autoexpand is now nil. + However, Shell mode sets it from the value of shell-input-autoexpand, + whose default value is `history'. + + ** The new function set-process-window-size specifies the terminal window + size for a subprocess. On some systems it sends the subprocess a signal + to let it know that the size has changed. + + ** %P is a new way to display a percentage in the mode line. It + displays the percentage of the buffer text that is above the *bottom* + of the window (which includes the text visible, in the window as well + as the text above the top). It displays `Top' as well as the + percentage if the top of the buffer is visible on screen. + + ** %+ in the mode line specs displays `*' if the buffer is modified, + and otherwise `-'. It never displays `%', as `%*' would do; whether the + buffer is read-only has no effect on %+. + + ** The new functions ffloor, fceiling, fround and ftruncate take a + floating point argument and return a floating point result whose value + is a nearby integer. ffloor returns the nearest integer below; fceiling, + the nearest integer above; ftruncate, the nearest integer in the + direction towards zero; fround, the nearest integer. + + ** Setting `print-escape-newlines' to a non-nil value now also makes + formfeeds print as ``\f''. + + ** auto-mode-alist now has a new feature. If an element has the form + (REGEXP FUNCTION t), and REGEXP matches the file name, then after calling + FUNCTION, Emacs deletes the part of the file name that matched REGEXP + and then searches auto-mode-alist again for a new match. + + This is useful for uncompression packages. An entry of this sort for + .gz can uncompress the file and then put the uncompressed file in the + proper mode according to the name sans .gz. + + ** The new function emacs-pid returns the process ID number of Emacs. + + ** user-login-name now consistently checks the LOGNAME environment + variable before USER. user-original-login-name is obsolete, since it + provides the same functionality. To ignore the environment variables, + use user-real-login-name. + + ** There is a more general way of handling the system-specific X + keysyms. Set the variable system-key-alist to an alist containing + elements of the form (CODE . SYMBOL), where CODE is the numeric keysym + code minus the "vendor specific" bit, and symbol is the name for the + function key. + + ** You can use the variable command-line-functions to set up functions + to process unrecognized command line arguments. The variable's value + should be a list of functions of no arguments. The functions are + called successively until one of them returns non-nil. + + Each function should access the free variables argi (the current + argument) and command-line-args-left (the remaining arguments). The + function should return non-nil only if it recognizes and processes the + argument in argi. If it does so, it may consume following arguments + as well by removing them from command-line-args-left. + + ** There's a new way for a magic file name handler to run a primitive + and inhibit handling of the file name. Here is how to do it: + + (let ((inhibit-file-name-handlers + (cons 'ange-ftp-file-handler + (and (eq inhibit-file-name-operation operation) + inhibit-file-name-handlers))) + (inhibit-file-name-operation operation)) + (apply this-operation args)) + + The function find-file-name-handler now takes two arguments. The + second argument is OPERATION, the operation for which the handler is + being sought. + + People have suggested that the second argument should be optional, for + backward compatibility. It would be nice if that were possible, but + it is not. There is simply no way for find-file-name-handler to do + the right thing without receiving the proper value for its second + argument. + + ** The variable completion-regexp-list affects the completion + primitives try-completion and all-completions. They consider + only the possible completions that match each regexp in the list. + + ** Case conversion in the function replace-match has been changed. + + The old behavior was this: if any word in the old text was + capitalized, replace-match capitalized each word of the replacement + text. + + The new behavior is this: if the first word in the old text is capitalized, + replace-match capitalizes the first word of the replacement text. + + ** You can now specify a case table with CANON non-nil and EQV nil. + Then the EQV part of the case table is deduced from CANON. + + ** The new function minibuffer-prompt takes no arguments and returns + the current minibuffer prompt string. + + The new function minibuffer-prompt-width takes no arguments and + returns the display width of the minibuffer prompt string. + + ** The new function frame-first-window returns the window at the + upper left corner of a given frame. + + ** wholenump is a new alias for natnump. + + ** The variable installation-directory, if non-@code{nil}, names a + directory within which to look for the `lib-src' and `etc' + subdirectories. This is non-nil when Emacs can't find those + directories in their standard installed locations, but can find them + near where the Emacs executable was found. + + ** invocation-name and invocation-directory are now variables as well + as functions. The variable values are the same values that the + functions return: the Emacs program name sans directories, and the + directory it was found in. (invocation-directory may be nil, if Emacs + can't determine which directory it should be.) + + ** Installation change regarding version number counting. + + The version number of an Emacs executable contains three numbers. + The first two describe the Emacs release and the third increments + each time you build Emacs. + + Now the file version.el contains only the first two version numbers. + The third component is now determined on the basis of the names of the + existing executable files. This means that version.el is not altered + by building Emacs. + + + + * Changes in 19.22. + + ** The mouse click M-mouse-2 now inserts the current secondary + selection (from Emacs or any other X client) where you click. + It does not move point. + This command is called mouse-yank-secondary. + + mouse-kill-secondary no longer has a key binding by default. + Clicking M-mouse-3 (mouse-secondary-save-then-kill) twice + may be a convenient enough way of killing the secondary selection. + Or perhaps there should be a keyboard binding for killing the + secondary selection. Any suggestions? + + ** New packages: + + *** `icomplete' provides character-by-character information + about what you could complete if you type TAB. + + *** `avoid' moves the mouse away from point so that it doesn't hide + your typing. + + *** `shadowfile' helps you update files that are supposed to be stored + identically in different places (perhaps on different machines). + + ** C-h p now knows about four additional keywords: data, faces, mouse, + and matching. + + ** The key for starting an inferior Lisp process, in Lisp mode, + is now C-c C-z instead of C-c C-l. + + ** When the VC commands ask whether to save the buffer, if you say no, + they signal an error. This is so that you won't operate on the wrong + data. + + ** ISO Accents mode now supports `"s' as a way of typing German sharp s. + + ** By default, comint buffers (including Shell mode and debuggers) + no longer try to scroll to keep the cursor on the bottom line. + This feature was added in 19.21 but did not work smoothly enough. + + ** Emacs now handles the window manager "delete window" operation. + + ** Display of buffers with text properties is much faster now. + + ** The feature previously announced whereby `insert' does not inherit + text properties from surrounding text was not fully implemented + before; but now it is. use `insert-and-inherit' if you wish to + inherit sticky properties from the surrounding text. + + ** The functions next-property-change, previous-property-change, + next-single-property-change, and previous-single-property-change + now take one additional optional argument LIMIT that is a position at + which to stop scanning. If scan ends without finding the property + change sought, these functions return the specified limit. + + The value returned by previous-single-property-change and + previous-property-change, when they do find a change, is now one + greater than what it used to be. It is the position between the two + characters whose properties differ, which is one greater than the + position of the first character found (while scanning back) with + different properties. + + + + * User editing changes in version 19.21. + + ** ISO Accents mode supports four additional characters: + A-with-ring (entered as /A), AE ligature (entered as /E), + and their lower-case equivalents. + + + + * User editing changes in version 19.20. + (See following page for Lisp programming changes.) + + Note that some of these changes were made subsequent to the Emacs 19.20 + editions of the Emacs manual and Emacs Lisp manual; therefore, if you + have those editions, do read this page. + + ** Dragging with mouse button 1 now puts the selected region + in the kill ring so you can paste it into other X applications. + + ** Double and triple clicks with button 1 now behave as in xterm, + selecting the word or line surrounding where you click. If you drag + after the last click, you can select a range of words or lines. + + ** You can use button 3 to extend a mouse-selected region, as in xterm. + This works for regions selected either by dragging Mouse-1 or by + multiple-clicking Mouse-1. Clicking Mouse-3 moves the end of the + region that is (initially) nearer to where you click. + + If the selection was first made by multiple-clicking Mouse-1, and thus + consists of entire words or lines, Mouse-3 preserves that state. + + As before, clicking Mouse-3 again in the same place kills the region + thus selected. + + ** The secondary selection commands, M-Mouse-1 and M-Mouse-3, have been + likewise modified. + + ** You can now search for strings and regexps using the Edit menu bar menu. + + ** You can now access bookmarks using the Bookmark submenu in the File + menu in the menu bar. + + ** ISO Accents mode, a buffer-local minor mode, provides a convenient + way to type certain non-ASCII characters. It makes the characters `, + ', ", ^, ~ and / serve as modifiers for the following letter. ` and ' + add accents, " adds an umlaut or dieresis, ^ adds a circumflex, ~ + adds a tilde, and / adds a slash to the following letter. + + If the following character is not a letter, or cannot be modified as + requested, then both characters stand for themselves. If you + duplicate the modifier accent character, that enters the corresponding + ISO non-spacing accent character (thus, '' enters the ISO acute-accent + character). To enter a modifier character itself, type it followed by + a space. + + This feature can be used whenever a key sequence is expected: for + ordinary insertion, for searching, and for certain command arguments. + + A few special combinations: + + ~c => c with cedilla + ~d => d with stroke + ~< => left guillemot + ~> => right guillemot + + ** iso-transl.el is a new library that replaces iso-insert.el. + It defines C-x 8 as an insertion prefix for the ISO characters + between 128 and 255, much like iso-insert, except that iso-transl + works even in searches and help commands--wherever a key sequence + is expected. + + To define case-conversion for these characters for ISO 8859/1, + load the library iso-syntax. (This is not new.) + + ** M-TAB in Text mode now runs the command ispell-complete-word + which performs completion using the spelling dictionary. + + The spelling correction submenu now includes this command + and another command which completes a word fragment (that is, + it doesn't assume that the text to be completed starts at the + beginning of a word. + + ** In incremental search, you can use M-y to yank the most recent kill + into the search string. + + ** The new function ispell-message checks the spelling of a message + you are about to send or post. It ignores text cited from other + messages. + + To automatically check all your outgoing messages, include the + following line in your .emacs file: + (setq news-inews-hook (setq mail-send-hook 'ispell-message)) + + ** There is now a separate minibuffer history list for the names of + extended commands. This history list is used by M-x when reading + the command name. The motivation for this is to prevent command + names from appearing in the history used for other minibuffer + arguments. + + Note that the history list for entire commands that use the minibuffer + is a separate feature. That history list records a command with all + its arguments, and you must use C-x ESC ESC to access it. + + ** You can use the new command C-x v ~ VERSION RET to examine a + specified version of a file that is maintained with version control. + + ** In Indented Text mode, only blank lines now separate paragraphs. + Indented lines continue the paragraph that is in progress. This makes + the user option variable adaptive-fill-mode have its intended effect. + + ** Local variable specifications in files for variables whose names end + in `-hook' and `-function' are now controlled by the variable + `enable-local-eval', just like the `eval' variable. + + ** C-x r j (jump-to-register) when restoring a frame configuration now + makes all unwanted frames (existing frames not mentioned in the + configuration) invisible. + + If you want to delete these unwanted frames, use a prefix argument for + C-x r j. + + ** You can customize the calendar to display weeks beginning on + Monday: set the variable `calendar-week-start-day' to 1. + + ** Rmail changes. + + If you save messages to a file in Unix format while viewing a message + with its whole header, this now copies to the file the entire header + of each message copied. + + ** Comint mode changes. + + C-c C-e shows as much output as possible in the window. + C-c RET copies an old input (the one at point) + and places the copy after the latest prompt. + C-c C-p and C-c C-n move through the buffer, stopping at places + where the subshell prompted for input. + C-c C-h lists the input history in a `*Help*' buffer. + + There are new menu bar items for completion/input/output/signal commands. + + Input behavior is configurable. Variables control whether some windows + showing the buffer scroll to the bottom before insertion. These are + `comint-scroll-to-bottom-on-input' and `before-change-function'. By default, + insertion causes the selected window to scroll to the bottom before insertion + occurs. + + Subprocess output now keeps point at the end of the buffer in each + window individually if point was already at the end of the buffer in + that window. + + If `comint-scroll-show-maximum-output' is non-nil (which is the + default), then scrolling due to arrival of output tries to place the + last line of text at the bottom line of the window, so as to show as + much useful text as possible. (This mimics the scrolling behavior of + many terminals.) + + By setting `comint-scroll-to-bottom-on-output', you can opt for having + point jump to the end of the buffer whenever output arrives--no matter + where in the buffer point was before. If the value is `this', point + jumps in the selected window. If the value is `all', point jumps in + each window that shows the comint buffer. If the value is `other', + point jumps in all nonselected windows that show the current buffer. + The default value is nil, which means point does not jump to the end. + + Input history insertion is configurable. A variable controls whether only the + first instance of successive identical inputs is stored in the input history. + This is `comint-input-ignoredups'. + + Completion (bound to TAB) is now more general. Depending on context, + completion now operates on the input history, on command names, or (as + before) on filenames. + + Filename completion is configurable. Variables control whether + file/directory suffix characters are added (`comint-completion-addsuffix'), + whether shortest completion is acceptable when no further unambiguous + completion is possible (`comint-completion-recexact'), and the timing of + completion candidate listing (`comint-completion-autolist'). + + Comint mode now provides history expansion. Insert input using `!' + and `^', in the same syntax that typical shells use; then type TAB. + This searches the comint input history for a matching element, + performs substitution if necessary, and places the result in the + comint buffer in place of the original input. + + History references in the input may be expanded before insertion into + the input ring, or on input to the interpreter (and therefore + visibly). The variable `comint-input-autoexpand' specifies which. + + You can make the SPC key perform history expansion by binding + SPC to the command `comint-magic-space'. + + The command `comint-dynamic-complete-variable' does variable name + completion using the environment variables as set within Emacs. The + variables controlling filename completion apply to variable name + completion too. This command is normally available through the menu + bar. + + ** Shell mode + + Paragraph motion and marking commands (default bindings M-{, M-}, M-h) operate + on output groups (i.e., shell prompt plus associated shell output). + + TAB now completes commands, as well as file names and expand history. + Commands are searched for along the path that Emacs has on startup. + + C-c C-f now moves forward a command (`shell-forward-command') and + C-c C-b now moves backward a command (`shell-backward-command'). + + Command completion is configurable. The variables controlling + filename completion in comint mode apply, together with a variable + controlling whether to restrict possible completions to only files + that are executable (`shell-command-execonly'). + + The input history is initialised from the file name given in the + variable `shell-input-ring-file-name'--normally `.history' in your + home directory. + + Directory tracking is more robust. It can cope with command sequences + and forked commands, and can detect the failure of directory changing + commands in most circumstances. It's still not infallible, of course. + + You can now configure the behavior of `pushd'. Variables control + whether `pushd' behaves like `cd' if no argument is given + (`shell-pushd-tohome'), pop rather than rotate with a numeric argument + (`shell-pushd-dextract'), and only add directories to the directory + stack if they are not already on it (`shell-pushd-dunique'). The + configuration you choose should match the underlying shell, of course. + + + * Emacs Lisp programming changes in Emacs 19.20. + + ** A new function `remove-hook' is now used to remove a hook that you might + have added with `add-hook'. + + ** There is now a Lisp pretty-printer in the library `pp'. + + ** The partial Common Lisp support has been entirely reimplemented. + + ** When you insert text using `insert', `insert-before-markers' or + `insert-buffer-substring', text properties are no longer inherited + from the surrounding text. + + When you want to inherit text properties, use the new functions + `insert-and-inherit' or `insert-before-markers-and-inherit'. + + The self-inserting character command does do inheritance. + + ** Frame creation hooks. + + The function make-frame now runs the normal hooks + before-make-frame-hook and after-make-frame-hook. + + ** You can now use function-key-map to make a key an alias for other + key sequences that can vary depending on circumstances. To do this, + give the key a definition in function-key-map which is a function + rather than a specific expansion key sequence. + + If the function reads input itself, it can have the effect of altering + the event that follows. For example, here's how to define C-c h to + turn the character that follows into a hyper character: + + (define-key function-key-map "\C-ch" 'hyperify) + + (defun hyperify (prompt) + (let ((e (read-event))) + (vector (if (numberp e) + (logior (lsh 1 20) e) + (if (memq 'hyper (event-modifiers e)) + e + (add-event-modifier "H-" e)))))) + + (defun add-event-modifier (string e) + (let ((symbol (if (symbolp e) e (car e)))) + (setq symbol (intern (concat string (symbol-name symbol)))) + (if (symbolp e) + symbol + (cons symbol (cdr e))))) + + The character translation function gets one argument, which is the + prompt that was specified in read-key-sequence--or nil if the key + sequence is being read by the editor command loop. In most cases + you can just ignore the prompt value. + + ** Changes for reading and writing text properties. + + New low-level Lisp features make it possible to write Lisp programs to + save text properties in files, and read text properties from files. + You can program any file format you like. + + The variable `write-region-annotation-functions' should contain a list + of functions to be run by `write-region' to encode text properties in + some fashion as annotations to the text that is written. + + Each function in the list is called with two arguments: the start and + end of the region to be written. These functions should not alter the + contents of the buffer. Instead, they should return lists indicating + annotations to write in the file in addition to the text in the + buffer. + + Each function should return a list of elements of the form (POSITION + . STRING), where POSITION is an integer specifying the relative + position in the text to be written, and STRING is the annotation to + add there. + + Each list returned by one of these functions must be already sorted in + increasing order by POSITION. If there is more than one function, + `write-region' merges the lists destructively into one sorted list. + + When `write-region' actually writes the text from the buffer to the + file, it intermixes the specified annotations at the corresponding + positions. All this takes place without modifying the buffer. + + The variable `after-insert-file-functions' should contain a list of + functions to be run each time a file's contents have been inserted into + a buffer. Each function receives one argument, the length of the + inserted text; point indicates the start of that text. The function + should make whatever changes it wants to make, then return the updated + length of the inserted text, as it stands after those changes. The + value returned by one function is used as the argument to the next. + These functions should always return with point at the beginning of + the inserted text. + + The intended use of `after-insert-file-functions' is for converting + some sort of textual annotations into actual text properties. But many + other uses may be possible. + + We now invite users to begin implementing Lisp programs to store and + retrieve text properties in files, using these new primitive features, + and thus to experiment with various data formats and find good ones. + + We suggest not trying to handle arbitrary Lisp objects as property + names or property values--because a program that general is probably + difficult to write, and slow. Instead, choose a set of possible data + types that are reasonably flexible, and not too hard to encode. + + ** Comint completion. + + Currently comint-dynamic-complete-command (and associated variable + comint-after-partial-pathname-command) are set by default to complete a + filename. Other comint-mode users should have their own functions to achieve + this. For example, gud-mode could complete debugger commands. A completion + function is provided solely for this reason (comint-dynamic-simple-complete). + + Other comint-mode users should bind comint-dynamic-complete (shell-mode does + already). + + ** Comint history reference expansion + + Currently comint-input-autoexpand is 'history, which means only expand + history on insertion to comint-input-ring. For non-shell modes, this is + a strange default, since non-shells will not understand history references. + Perhaps it would be better for the variable to be 'input, which means expand + on RET. + + The value 'history might possibly be wrong even for shells, since the + expansion will be done both by comint and the underlying shell (except sh, of + course). It would be better for expansion to be done by one or the other, + not both since they may (ahem) disagree. Since it is silly to put a literal + history reference into comint-input-ring, perhaps it would be better for the + variable to be 'input too. + + The reason the variable is not 'input by default is that I was attempting to + adhere to The Principle of Least Astonishment. I didn't want to shock users + by having their input change in front of their eyes. + + ** Argument delimiters and Comint mode. + + Currently comint-delimiter-argument-list is '(), which means no strings are + to be treated as delimiters and arguments. In shell-mode, this variable is + set to shell-delimiter-argument-list, '("|" "&" "<" ">" "(" ")" ";"). Other + comint-mode users should set this variable too. For example, a lisp-type + mode might want to set this to '("." "(" ")") or some such. + + ** Comint output hook. + + There is now a hook, comint-output-filter-hook, that is run-hooks'ed by the + output filter, comint-output-filter. This is useful for scrolling (see + below), but also things like processing output for specific text, output + highlighting, etc. + + So that such output processing may be done efficiently, there is a new + variable, comint-last-output-start, that records the position of the start of + the lastest output inserted into the buffer (effectively the previous value + of process-mark). Output processing functions should process the text + between comint-last-output-start (or perhaps the beginning of the line that + the position lies on) and process-mark. + + ** Comint scrolling. + + There is now automatic scrolling of process windows. + + Currently comint-scroll-show-maximum-output is t, which means when scrolling + output put process-mark at the bottom of the window. There is a good case + for it to be t, since the user is likely to want to see as much output as + possible. But, then again, there is a comint-show-maximum-output command. + + ** Comint history retrieval. + + The input following point is not deleted when moving around the input history + (with M-p etc.). Emacs maintainers may not like this. However, I feel this + is a useful feature. The simple remedy is to put end-of-line in before + delete-region in comint-previous-matching-input. + + The input history retrieval commands still wrap-around the input ring, unlike + Emacs command history. + + + + * Changes in version 19.19. + + ** The new package bookmark.el records named bookmarks: positions that + you can jump to. Bookmarks are saved automatically between Emacs + sessions. + + ** Another simpler package saveplace.el records your position in each + file when you kill its buffer (or kill Emacs), and jumps to the same + position when you visit the file again (even in another Emacs + session). Use `toggle-save-place' to turn on place-saving in a given file; + use (setq-default save-place t) to turn it on for all files. + + ** In Outline mode, you can now customize how to compute the level of a + heading line. Set `outline-level' to a function of no arguments which + returns the level, assuming point is at the beginning of a heading + line. + + ** You can now specify the prefix key to use for Outline minor mode. + (The default is C-c.) Set the variable outline-minor-mode-prefix to + the key sequence you want to use (as a string or vector). + + ** In Bibtex mode, C-c e has been changed to C-c C-b. This is because + C-c followed by a letter is reserved for users. + + ** The `mod' function is no longer an alias for `%', but is a separate function + that yields a result with the same sign as the divisor. `floor' now takes an + optional second argument, which divides the first argument before the floor is + taken. + + ** `%' no longer allows floating point arguments, since the results were often + inconsistent with integer `%'. + + + + * Changes in version 19.18. + + ** Typing C-z in an iconified Emacs frame now deiconifies it. + + ** hilit19 is a new library for automatic highlighting of parts of the + text in the buffer, based on its meaning and context. + + ** Killing no longer sends the killed text to the X clipboard. + And large strings are not put in the cut buffer either. + The variable x-cut-buffer-max specifies the maximum number of characters + to put in the cut buffer. + + ** The new command C-x 5 o (other-frame) selects different frames, + successively, in cyclic order. It does for frames what C-x o + does for windows. + + ** The command M-ESC (eval-expression) has its own command history. + + ** The commands M-! and M-| for running shell commands have their own + command history. + + ** If the directory containing the Emacs executable has a sibling named + `lisp', that `lisp' directory is added to the end of `load-path' + (provided you don't override the normal value with the EMACSLOADPATH + environment variable). This feature may make it easier to move + an installed Emacs from place to place. + + ** M-x validate-tex-buffer now records the locations of mismatches + found in the `*Occur*' buffer. You can go to that buffer and type C-c + C-c to visit a particular mismatch. + + ** There are new commands in Shell mode. + + C-c C-n and C-c C-p move point to the next or previous shell input line. + + C-c C-d is now another way to send an end-of-file to the subshell. + + ** Changes to calendar/diary. + + Time zone data is now determined automatically, including the + start/stop days and times of daylight savings time. The code now + works correctly almost anywhere in the world. + + The format of the holiday specifications has changed and IS NO LONGER + COMPATIBLE with the old (version 18) format. See the documentation of + the variable calendar-holidays for details of the new, improved + format. + + The hook `diary-display-hook' has been split into two: + diary-display-hook which should be used ONLY for the display and + `diary-hook' which should be used for appointment notification. If + diary-display-hook is nil (the default), simple-diary-display is + used. This allows the diary hooks to be correctly set with add-hook. + + The forms used for dates in diary entries and general display are no + longer autoloaded, but set at load time; this means they will be set + correctly based on values you assign to various variables. + + ** The functions x-rebind-key and x-rebind-keys have been deleted, + because you can accomplish the same job by binding keys to keyboard + macros. + + ** Emacs now distinguishes double and triple drag events and double and + triple button-down events. These work analogously to double and + triple click events. + + Double drag events, if not defined, convert to ordinary click events. + Double down events, if not defined, convert first to ordinary down + events, which are then discarded if not defined. Triple events that + are not defined convert to the corresponding double event; if that is + also not defined, it may convert further. + + ** The new function event-click-count returns the number of clicks, + from an event which is a list. It is 1 for an ordinary click, drag, + or button-down event, 2 for a double event, and 3 or more for a triple + event. + + ** The new function previous-frame is like next-frame, but moves + around through the set of existing frames in the opposite order. + + ** The post-command-hook now runs even after commands that get an error + and return to top level. As a consequence of the same change, this + hook also runs before Emacs reads the first command. That might sound + paradoxical, as if this hook were the same as the pre-command-hook. + Actually, they are not similar; the latter runs before *execution* of + a command, but after it has been read. + + ** You can turn off the text property hooks that run when point moves + to certain places in the buffer, by binding inhibit-point-motion-hooks + to a non-nil value. + + ** Inserting a string with no text properties into the buffer normally + inherits the properties of the preceding character. You can now + control this inheritance by setting the front-sticky and + rear-nonsticky properties of a character. + + If you make a character's front-sticky property t, then insertion + before the character inherits its properties. If you make the + rear-nonsticky property t, then insertion after the character does not + inherit its properties. You can regard characters as normally being + rear-sticky and not front-sticky, and this is why insertion normally + inherits from the previous character. + + If neither side of an insertion is suitably sticky, then the inserted + text gets no properties. If both sides are sticky, then the inserted + text gets the properties of both sides, with the previous character's + properties taking precedence when both sides have a property in + common. + + You can also specify stickiness for individual properties. To do so, + use a list of property names as the value of the front-sticky property + or the rear-nonsticky property. For example, if a character has a + rear-nonsticky property whose value is (face read-only), then + insertion after the character will not inherit its face property or + read-only property (if any), but will inherit any other properties. + + The merging of properties when both sides of the insertion are sticky + takes place one property at a time. If the preceding character is + rear-sticky for the property, and the property is non-nil, it + dominates. Otherwise, the following character's property value is + used if it is front-sticky for that property. + + ** If you give a character a non-nil `invisible' text property, the + character does not appear on the screen. This works much like + selective display. + + The details of this feature are likely to change in future Emacs + versions. + + ** In Info, when you go to a node, it runs the normal hook + Info-selection-hook. + + ** You can use the new function `invocation-directory' to get the name + of the directory containing the Emacs executable that was run. + + ** Entry to the minibuffer runs the normal hook minibuffer-setup-hook. + + ** The new function minibuffer-window-active-p takes one argument, a + minibuffer window, and returns t if the window is currently active. + + + + * Changes in version 19.17. + + ** When Emacs displays a list of completions in a buffer, + you can select a completion by clicking mouse button 2 + on that completion. + + ** Use the command `list-faces-display' to display a list of + all the currently defined faces, showing what they look like. + + ** Menu bar items from local maps now come after the usual items. + + ** The Help menu bar item always comes last in the menu bar. + + ** If you enable Font-Lock mode on a buffer containing a program + (certain languages such as C and Lisp are supported), everything you + type is automatically given a face property appropriate to its + syntactic role. For example, there are faces for comments, string + constants, names of functions being defined, and so on. + + ** Dunnet, an adventure game, is now available. + + ** Several major modes now have their own menu bar items, + including Dired, Rmail, and Sendmail. We would like to add + suitable menu bar items to other major modes. + + ** The key binding C-x a C-h has been eliminated. + This is because it got in the way of the general feature of typing + C-h after a prefix character. If you want to run + inverse-add-global-abbrev, you can use C-x a - or C-x a i g instead. + + ** If you set the variable `rmail-mail-new-frame' to a non-nil value, + all the Rmail commands to send mail make a new frame to do it in. + When you send the message, or use the menu bar command not to send it, + that frame is deleted. + + ** In Rmail, the o and C-o commands are now almost interchangeable. + Both commands check the format of the file you specify, and append + the message to it in Rmail format if it is an Rmail file, and in + inbox file format otherwise. C-o and o are different only when you + specify a new file. + + ** The function `copy-face' now takes an optional fourth argument + NEW-FRAME. If you specify this, it copies the definition of face + OLD-FACE on frame FRAME to face NEW-NAME on frame NEW-FRAME. + + ** A local map can now cancel out one of the global map's menu items. + Just define that subcommand of the menu item with `undefined' + as the definition. For example, this cancels out the `Buffers' item + for the current major mode: + + (local-set-key [menu-bar buffer] 'undefined) + + ** To put global items at the end of the menu bar, use the new variable + `menu-bar-final-items'. It should be a list of symbols--event types + bound in the menu bar. The menu bar items for these symbols are + moved to the end. + + ** The list returned by `buffer-local-variables' now contains cons-cell + elements of the form (SYMBOL . VALUE) only for buffer-local variables + that have values. For unbound buffer-local variables, the variable + name (symbol) appears directly as an element of the list. + + ** The `modification-hooks' property of a character no longer affects + insertion; it runs only for deletion and modification of the character. + + To detect insertion, use `insert-in-front-hooks' and + `insert-behind-hooks' properties. The former runs when text is + inserted immediately preceding the character that has the property; + the latter runs when text is inserted immediately following the + character. + + ** Buffer modification now runs hooks belonging to overlays as well as + hooks belonging to characters. If an overlay has a + `modification-hooks' property, it applies to any change to text in the + overlay, and any insertion within the overlay. If the overlay has a + `insert-in-front-hooks' property, it runs for insertion at the + beginning boundary of the overlay. If the overlay has an + `insert-behind-hooks' property, it runs for insertion at the end + boundary of the overlay. + + The values of these properties should be lists of functions. Each + function is called, receiving as arguments the overlay in question, + followed by the bounds of the range being modified. + + ** The new `-name NAME' option directs Emacs to search for its X + resources using the name `NAME', and sets the title of the initial + frame. This argument was added for consistency with other X clients. + + ** The new `-xrm DATABASE' option tells Emacs to treat the string + DATABASE as the text of an X resource database. Emacs searches + DATABASE for resource values, in addition to the usual places. This + argument was added for consistency with other X clients. + + ** Emacs now searches for X resources in the files specified by the + XFILESEARCHPATH, XUSERFILESEARCHPATH, and XAPPLRESDIR environment + variables, emulating the functionality provided by programs written + using Xt. Because of this change, Emacs will now notice system-wide + application defaults files, as other X clients do. + + XFILESEARCHPATH and XUSERFILESEARCHPATH should be a list of file names + separated by colons; XAPPLRESDIR should be a list of directory names + separated by colons. + + Emacs searches for X resources + + specified on the command line, with the `-xrm RESOURCESTRING' + option, + + then in the value of the XENVIRONMENT environment variable, + - or if that is unset, in the file named ~/.Xdefaults-HOSTNAME if it exists + (where HOSTNAME is the hostname of the machine Emacs is running on), + + then in the screen-specific and server-wide resource properties + provided by the server, + - or if those properties are unset, in the file named ~/.Xdefaults + if it exists, + + then in the files listed in XUSERFILESEARCHPATH, + - or in files named LANG/Emacs in directories listed in XAPPLRESDIR + (where LANG is the value of the LANG environment variable), if + the LANG environment variable is set, + - or in files named Emacs in the directories listed in XAPPLRESDIR + - or in ~/LANG/Emacs (if the LANG environment variable is set), + - or in ~/Emacs, + + then in the files listed in XFILESEARCHPATH. + + The paths in the variables XFILESEARCHPATH, XUSERFILESEARCHPATH, and + XAPPLRESDIR may contain %-escapes (like the control strings passed to + the Emacs lisp `format' function or C printf function), which Emacs expands. + + %N is replaced by the string "Emacs" wherever it occurs. + %T is replaced by "app-defaults" wherever it occurs. + %S is replaced by the empty string wherever it occurs. + %L and %l are replaced by the value of the LANG environment variable; if LANG + is not set, Emacs does not use that directory or file name at all. + %C is replaced by the value of the resource named "customization" + (class "Customization"), as retrieved from the server's resource + properties or the user's ~/.Xdefaults file, or the empty string if + that resource doesn't exist. + + So, for example, + if XFILESEARCHPATH is set to the value + "/usr/lib/X11/%L/%T/%N%C:/usr/lib/X11/%T/%N%C:/usr/lib/X11/%T/%N", + and the LANG environment variable is set to + "english", + and the customization resource is the string + "-color", + then, in the last step of the process described above, Emacs checks + for resources in the first of the following files that is present and + readable: + /usr/lib/X11/english/app-defaults/Emacs-color + /usr/lib/X11/app-defaults/Emacs-color + /usr/lib/X11/app-defaults/Emacs + If the LANG environment variable is not set, then Emacs never uses the + first element of the path, "/usr/lib/X11/%L/%T/%N%C", because it + contains the %L escape. + + If XFILESEARCHPATH is unset, Emacs uses the default value + "/usr/lib/X11/%L/app-defaults/Emacs%C:\ + /usr/lib/X11/app-defaults/Emacs%C:\ + /usr/lib/X11/%L/app-defaults/Emacs:\ + /usr/lib/X11/app-defaults/Emacs" + + This feature was added for consistency with other X applications. + + ** The new function `text-property-any' scans the region of text from + START to END to see if any character's property PROP is `eq' to + VALUE. If so, it returns the position of the first such character. + Otherwise, it returns nil. + + The optional fifth argument, OBJECT, specifies the string or buffer to + be examined. + + ** The new function `text-property-not-all' scans the region of text from + START to END to see if any character's property PROP is not `eq' to + VALUE. If so, it returns the position of the first such character. + Otherwise, it returns nil. + + The optional fifth argument, OBJECT, specifies the string or buffer to + be examined. + + ** The function `delete-windows-on' now takes an optional second + argument FRAME, which specifies which frames it should affect. + + If FRAME is nil or omitted, then `delete-windows-on' deletes windows + showing BUFFER (its first argument) on all frames. + + If FRAME is t, then `delete-windows-on' only deletes windows on the + selected frame; other frames are unaffected. + + If FRAME is a frame, then `delete-windows-on' only deletes windows on + the given frame; other frames are unaffected. + + + + * Changes in version 19.16. + + ** When dragging the mouse to select a region, Emacs now highlights the + region as you drag (if Transient Mark mode is enabled). If you + continue the drag beyond the boundaries of the window, Emacs scrolls + the window at a steady rate until you either move the mouse back into + the window or release the button. + + ** RET now exits `query-replace' and `query-replace-regexp'; this makes it + more consistent with the incremental search facility, which uses RET + to end the search. + + ** In C mode, C-c C-u now runs c-up-conditional. + C-c C-n and C-c C-p now run new commands that move forward + and back over balanced sets of C conditionals (c-forward-conditional + and c-backward-conditional). + + ** The Edit entry in the menu bar has a new alternative: + "Choose Next Paste". It gives you a menu showing the various + strings in the kill ring; click on one to select it as the text + to be yanked ("pasted") the next time you yank. + + ** If you enable Transient Mark mode and set `mark-even-if-inactive' to + non-nil, then the region is highlighted in a transient fashion just as + normally in Transient Mark mode, but the mark really remains active + all the time; commands that use the region can be used even if the + region highlighting turns off. + + ** If you type C-h after a prefix key, it displays the bindings + that start with that prefix. + + ** The VC package now searches for version control commands in the + directories named by the variable `vc-path'; its value should be a + list of strings. + + ** If you are visiting a file that has locks registered under RCS, + VC now displays each lock's owner and version number in the mode line + after the string `RCS'. If there are no locks, VC displays the head + version number. + + ** When using X, if you load the `paren' library, Emacs automatically + underlines or highlights the matching paren whenever point is + next to the outside of a paren. When point is before an open-paren, + this shows the matching close; when point is after a close-paren, + this shows the matching open. + + ** The new function `define-key-after' is like `define-key', + but takes an extra argument AFTER. It places the newly defined + binding after the binding for the event AFTER. + + ** `accessible-keymaps' now takes an optional second argument, PREFIX. + If PREFIX is non-nil, it means the value should include only maps for + keys that start with PREFIX. + + `describe-bindings' also accepts an optional argument PREFIX which + means to describe only the keys that start with PREFIX. + + ** The variable `prefix-help-command' hold a command to run to display help + whenever the character `help-char' follows a prefix key and does not have + a key binding in that context. + + ** Emacs now detects double- and triple-mouse clicks. A single mouse + click produces a pair events of the form: + (down-mouse-N POSITION) + (mouse-N POSITION) + Clicking the same mouse button again, soon thereafter and at the same + location, produces another pair of events of the form: + (down-mouse-N POSITION) + (double-mouse-N POSITION 2) + Another click will produce an event pair of the form: + (down-mouse-N POSITION) + (triple-mouse-N POSITION 3) + All the POSITIONs in such a sequence would be identical, except for + their timestamps. + + To count as double- and triple-clicks, mouse clicks must be at the + same location as the first click, and the number of milliseconds + between the first release and the second must be less than the value + of the lisp variable `double-click-time'. Setting `double-click-time' + to nil disables multi-click detection. Setting it to t removes the + time limit; Emacs then detects multi-clicks by position only. + + If `read-key-sequence' finds no binding for a double-click event, but + the corresponding single-click event would be bound, + `read-key-sequence' demotes it to a single-click. Similarly, it + demotes unbound triple-clicks to double- or single-clicks. This means + you don't have to distinguish between single- and multi-clicks if you + don't want to. + + Emacs reports all clicks after the third as `triple-mouse-N' clicks, + but increments the click count after POSITION. For example, a fourth + click, soon after the third and at the same location, produces a pair + of events of the form: + (down-mouse-N POSITION) + (triple-mouse-N POSITION 4) + + ** The way Emacs reports positions of mouse events has changed + slightly. If a mouse event includes a position list of the form: + (WINDOW (PLACE-SYMBOL) (COLUMN . ROW) TIMESTAMP) + this denotes exactly the same position as the list: + (WINDOW PLACE-SYMBOL (COLUMN . ROW) TIMESTAMP) + That is, the event occurred over a non-textual area of the frame, + specified by PLACE-SYMBOL, a symbol like `mode-line' or + `vertical-scroll-bar'. + + Enclosing PLACE-SYMBOL in a singleton list does not change the + position denoted, but the `read-key-sequence' function uses the + presence or absence of the singleton list to tell whether or not it + should prefix the event with its place symbol. + + Normally, `read-key-sequence' prefixes mouse events occurring over + non-textual areas with their PLACE-SYMBOLs, to select the sub-keymap + appropriate for the event; for example, clicking on the mode line + produces a sequence like + [mode-line (mouse-1 POSN)] + However, if lisp code elects to unread the resulting key sequence by + placing it in the `unread-command-events' variable, it is important + that `read-key-sequence' not insert the prefix symbol again; that + would produce a malformed key sequence like + [mode-line mode-line (mouse-1 POSN)] + For this reason, `read-key-sequence' encloses the event's PLACE-SYMBOL + in a singleton list when it first inserts the prefix, but doesn't + insert the prefix when processing events whose PLACE-SYMBOLs are + already thus enclosed. + + + + * Changes in version 19.15. + + ** `make-frame-visible', which uniconified frames, is now a command, + and thus may be bound to a key. This makes sense because frames + respond to user input while iconified. + + ** You can now use Meta mouse clicks to set and use the "secondary + selection". You can drag M-Mouse-1 across the region you want to + select. Or you can press M-Mouse-1 at one end and M-Mouse-3 at the + other (this also copies the text to the kill ring). Repeating M-Mouse-3 + again at the same place kills that text. + + M-Mouse-2 kills the secondary selection. + + Setting the secondary selection does not move point or the mark. It + is possible to make a secondary selection that does not all fit on the + screen, by using M-Mouse-1 at one end, scrolling, then using M-Mouse-3 + at the other end. + + Emacs has only one secondary selection at any time. Starting to set + a new one cancels any previous one. The secondary selection displays + using a face named `secondary-selection'. + + ** There's a new way to request use of Supercite (sc.el). Do this: + + (add-hook 'mail-citation-hook 'sc-cite-original) + + Currently this works with Rmail. In the future, other Emacs based + mail-readers should be modified to understand this hook also. + In the mean time, you should keep doing what you have done in the past + for those other mail readers. + + ** When a regular expression contains `\(...\)' inside a repetition + operator such as `*' or `+', and you ask about the range that was matched + using `match-beginning' and `match-end', the range you get corresponds + to the *last* repetition *only*. In Emacs 18, you would get a range + corresponding to all the repetitions. + + If you want to get a range corresponding to all the repetitions, + put a `\(...\)' grouping *outside* the repetition operator. This + is the syntax that corresponds logically to the desired result, and + it works the same in Emacs 18 and Emacs 19. + + (This change actually took place earlier, but we didn't know about it + and thus didn't document it.) + + + + * Changes in version 19.14. + + ** To modify read-only text, bind the variable `inhibit-read-only' + to a non-nil value. If the value is t, then all reasons that might + make text read-only are inhibited (including `read-only' text properties). + If the value is a list, then a `read-only' property is inhibited + if it is `memq' in the list. + + ** If you call `get-buffer-window' passing t as its second argument, it + will only search for windows on visible frames. Previously, passing t + as the secord argument caused `get-buffer-window' to search all + frames, visible or not. + + ** If you call `other-buffer' with a nil or omitted second argument, it + will ignore buffers displayed windows on any visible frame, not just + the selected frame. + + ** You can specify a window or a frame for C-x # to use when + selects a server buffer. Set the variable server-window + to the window or frame that you want. + + ** The command M-( now inserts spaces outside the open-parentheses in + some cases--depending on the syntax classes of the surrounding + characters. If the variable `parens-dont-require-spaces' is non-nil, + it inhibits insertion of these spaces. + + ** The GUD package now supports the debugger known as xdb on HP/UX + systems. Use M-x xdb. The variable `gud-xdb-directories' lets you + specify a list of directories to search for source code. + + ** If you are using the mailabbrev package, you should note that its + function for defining an alias is now called `define-mail-abbrev'. + This package no longer contains a definition for `define-mail-alias'; + that name is used only in mailaliases. + + ** Inserted characters now inherit the properties of the text before + them, by default, rather than those of the following text. + + ** The function `insert-file-contents' now takes optional arguments BEG + and END that specify which part of the file to insert. BEG defaults to + 0 (the beginning of the file), and END defaults to the end of the file. + + If you specify BEG or END, then the argument VISIT must be nil. + + + + * Changes in version 19.13. + + ** Magic file names can now handle the `load' operation. + + ** Bibtex mode now sets up special entries in the menu bar. + + ** The incremental search commands C-w and C-y, which copy text from + the buffer into the search string, now convert it to lower case + if you are in a case-insensitive search. This is to avoid making + the search a case-sensitive one. + + ** GNUS now knows your time zone automatically if Emacs does. + + ** Hide-ifdef mode no longer defines keys of the form + C-c LETTER, since those keys are reserved for users. + Those commands have been moved to C-c M-LETTER. + We may move them again for greater consistency with other modes. + + + + * Changes in version 19.12. + + ** You can now make many of the sort commands ignore case by setting + `sort-fold-case' to a non-nil value. + + + + * Changes in version 19.11. + + ** Supercite is installed. + + ** `write-file-hooks' functions that return non-nil are responsible + for making a backup file if you want that to be done. + To do so, execute the following code: + + (or buffer-backed-up (backup-buffer)) + + You might wish to save the file modes value returned by + `backup-buffer' and use that to set the mode bits of the file + that you write. This is what `basic-save-buffer' does when + it writes a file in the usual way. + + (This is not actually new, but wasn't documented before.) + + + + * Changes in version 19.10. + + ** The command `repeat-complex-command' is now on C-x ESC ESC. + It used to be bound to C-x ESC. + + The reason for this change is to make function keys work after C-x. + + ** The variable `highlight-nonselected-windows' now controls whether + the region is highlighted in windows other than the selected window + (in Transient Mark mode only, of course, and currently only when + using X). + + + + * Changes in version 19.8. + + ** It is now simpler to tell Emacs to display accented characters under + X windows. M-x standard-display-european toggles the display of + buffer text according to the ISO Latin-1 standard. With a prefix + argument, this command enables European character display iff the + argument is positive. + + ** The `-i' command-line argument tells Emacs to use a picture of the + GNU gnu as its icon, instead of letting the window manager choose an + icon for it. This option used to insert a file into the current + buffer; use `-insert' to do that now. + + ** The `configure' script now supports `--prefix' and `--exec-prefix' + options. + + The `--prefix=PREFIXDIR' option specifies where the installation process + should put emacs and its data files. This defaults to `/usr/local'. + - Emacs (and the other utilities users run) go in PREFIXDIR/bin + (unless the `--exec-prefix' option says otherwise). + - The architecture-independent files go in PREFIXDIR/lib/emacs/VERSION + (where VERSION is the version number of Emacs, like `19.7'). + - The architecture-dependent files go in + PREFIXDIR/lib/emacs/VERSION/CONFIGURATION + (where CONFIGURATION is the configuration name, like mips-dec-ultrix4.2), + unless the `--exec-prefix' option says otherwise. + + The `--exec-prefix=EXECDIR' option allows you to specify a separate + portion of the directory tree for installing architecture-specific + files, like executables and utility programs. If specified, + - Emacs (and the other utilities users run) go in EXECDIR/bin, and + - The architecture-dependent files go in + EXECDIR/lib/emacs/VERSION/CONFIGURATION. + EXECDIR/bin should be a directory that is normally in users' PATHs. + + ** When running under X, the new lisp function `x-list-fonts' + allows code to find out which fonts are available from the X server. + The first argument PATTERN is a string, perhaps with wildcard characters; + the * character matches any substring, and + the ? character matches any single character. + PATTERN is case-insensitive. + If the optional arguments FACE and FRAME are specified, then + `x-list-fonts' returns only fonts the same size as FACE on FRAME. + + + + * Changes in version 19. + + ** When you kill buffers, Emacs now returns memory to the operating system, + thus reducing the size of the Emacs process. All the space that you free + up by killing buffers can now be reused for other buffers no matter what + their sizes, or reused by other processes if Emacs doesn't need it. + + ** Emacs now does garbage collection and auto saving while it is waiting + for input, which often avoids the need to do these things while you + are typing. + + The variable `auto-save-timeout' says how many seconds Emacs should + wait, after you stop typing, before it does an auto save and a garbage + collection. + + ** If auto saving detects that a buffer has shrunk greatly, it refrains + from auto saving that buffer and displays a warning. Now it also turns + off Auto Save mode in that buffer, so that you won't get the same + warning again. + + If you reenable Auto Save mode in that buffer, Emacs will start saving + it again with no further warnings. + + ** A new minor mode called Line Number mode displays the current line + number in the mode line, updating it as necessary when you move + point. + + However, if the buffer is very large (larger than the value of + `line-number-display-limit'), then the line number doesn't appear. + This is because computing the line number can be painfully slow if the + buffer is very large. + + ** You can quit while Emacs is waiting to read or write files. + + ** The arrow keys now have default bindings to move in the appropriate + directions. + + ** You can suppress next-line's habit of inserting a newline when + called at the end of a buffer by setting next-line-add-newlines to nil + (it defaults to t). + + ** You can now get back recent minibuffer inputs conveniently. While + in the minibuffer, type M-p to fetch the next earlier minibuffer + input, and use M-n to fetch the next later input. + + There are also commands to search forward or backward through the + history for history elements that match a regular expression. M-r + searches older elements in the history, while M-s searches newer + elements. By special dispensation, these commands can always use the + minibuffer to read their arguments even though you are already in the + minibuffer when you issue them. + + The history feature is available for all uses of the minibuffer, but + there are separate history lists for different kinds of input. For + example, there is a list for file names, used by all the commands that + read file names. There is a list for arguments of commands like + `query-replace'. There are also very specific history lists, such + as the one that `compile' uses for compilation commands. + + ** You can now display text in a mixture of fonts and colors, using the + "face" feature, together with the overlay and text property features. + See the Emacs Lisp manual for details. The Emacs Users Manual describes + how to change the colors and font of standard predefined faces. + + ** You can refer to files on other machines using special file name syntax: + + /HOST:FILENAME + /USER@HOST:FILENAME + + When you do this, Emacs uses the FTP program to read and write files on + the specified host. It logs in through FTP using your user name or the + name USER. It may ask you for a password from time to time; this + is used for logging in on HOST. + + ** Some C-x key bindings have been moved onto new prefix keys. + + C-x r is a prefix for registers and rectangles. + C-x n is a prefix for narrowing. + C-x a is a prefix for abbrev commands. + + C-x r C-SPC + C-x r SPC point-to-register (Was C-x /) + C-x r j jump-to-register (Was C-x j) + C-x r s copy-to-register (Was C-x x) + C-x r i insert-register (Was C-x g) + C-x r r copy-rectangle-to-register (Was C-x r) + C-x r k kill-rectangle + C-x r y yank-rectangle + C-x r o open-rectangle + C-x r f frame-configuration-to-register + (This saves the state of all windows in all frames.) + C-x r w window-configuration-to-register + (This saves the state of all windows in the selected frame.) + + (Use C-x r j to restore a configuration saved with C-x r f or C-x r w.) + + C-x n n narrow-to-region (Was C-x n) + C-x n p narrow-to-page (Was C-x p) + C-x n w widen (Was C-x w) + + C-x a l add-mode-abbrev (Was C-x C-a) + C-x a g add-global-abbrev (Was C-x +) + C-x a i l inverse-add-mode-abbrev (Was C-x C-h) + C-x a i g inverse-add-global-abbrev (Was C-x -) + C-x a e expand-abbrev (Was C-x ') + + (The old key bindings C-x /, C-x j, C-x x and C-x g + have not yet been removed.) + + ** You can put a file name in a register to be able to visit the file + quickly. Do this: + + (set-register ?CHAR '(file . NAME)) + + where NAME is the file name as a string. Then C-x r j CHAR finds that + file. + + This is useful for files that you need to visit frequently, + but that you don't want to keep in buffers all the time. + + ** The keys M-g (fill-region) and C-x a (append-to-buffer) + have been eliminated. + + ** The new command `string-rectangle' inserts a specified string on + each line of the region-rectangle. + + ** C-x 4 r is now `find-file-read-only-other-window'. + + ** C-x 4 C-o is now `display-buffer', which displays a specified buffer + in another window without selecting it. + + ** Picture mode has been substantially improved. The picture editing commands + now arrange for automatic horizontal scrolling to keep point visible + when editing a wide buffer with truncate-lines on. Picture-mode + initialization now does a better job of rebinding standard commands; + it finds not just their normal keybindings, but any function keys + attached to them. + + ** If you enable Transient Mark mode, then the mark becomes "inactive" + after every command that modifies the buffer. While the mark is + active, the region is highlighted (under X, at least). Most commands + that use the mark give an error if the mark is inactive, but you can + use C-x C-x to make it active again. This feature is also sometimes + known as "Zmacs mode". + + ** Outline mode is now available as a minor mode. This minor mode can + combine with any major mode; it substitutes the C-c commands of + Outline mode for those of the major mode. Use M-x outline-minor-mode + to enable and disable the new mode. + + M-x outline-mode is unchanged; it still switches to Outline mode as a + major mode. + + ** The default setting of `version-control' comes from the environment + variable VERSION_CONTROL. + + ** The user option for controlling whether files can set local + variables is now called `enable-local-variables'. A value of t means + local-variables lists are obeyed; nil means they are ignored; anything + else means query the user. + + The user option for controlling use of the `eval' local variable is + now called is `enable-local-eval'; its values are interpreted like + those of `enable-local-variables'. + + ** X Window System changes: + + C-x 5 C-f and C-x 5 b switch to a specified file or buffer in a new + frame. Likewise, C-x 5 m starts outgoing mail in another frame, and + C-x 5 . finds a tag in another frame. + + When you are using X, C-z now iconifies the selected frame. + + Emacs can now exchange text with other X applications. Killing or + copying text in Emacs now makes that text available for pasting into + other X applications. The Emacs yanking commands now insert the + latest selection set by other applications, and add the text to the + kill ring. The Emacs commands for selecting and inserting text with + the mouse now use the kill ring in the same way the keyboard killing + and yanking commands do. + + The option to specify the title for the initial frame is now `-name NAME'. + There is currently no way to specify an icon title; perhaps we will add + one in the future. + + ** Undoing a deletion now puts point back where it was before the + deletion. + + ** The variables that control how much undo information to save have + been renamed to `undo-limit' and `undo-strong-limit'. They used to be + called `undo-threshold' and `undo-high-threshold'. + + ** You can now use kill commands in read-only buffers. They don't + actually change the buffer, and Emacs will beep and warn you that the + buffer is read-only, but they do copy the text you tried to kill into + the kill ring, so you can yank it into other buffers. + + ** C-o inserts the fill-prefix on the newly created line. The command + M-^ deletes the prefix (if it occurs) after the newline that it + deletes. + + ** C-M-l now runs the command `reposition-window'. It scrolls the + window heuristically in a way designed to get useful information onto + the screen. + + ** C-M-r is now reverse incremental regexp search. + + ** M-z now kills through the target character. In version 18, it + killed up to but not including the target character. + + ** M-! now runs the specified shell command asynchronously if it + ends in `&' (just as the shell does). + + ** C-h C-f and C-h C-k are new help commands that display the Info + node for a given Emacs function name or key sequence, respectively. + + ** The C-h p command system lets you find Emacs Lisp packages by + topic keywords. Here is a partial list of package categories: + + abbrev abbreviation handling, typing shortcuts, macros + bib code related to the bib bibliography processor + c C and C++ language support + calendar calendar and time management support + comm communications, networking, remote access to files + docs support for Emacs documentation + emulations emulations of other editors + extensions Emacs Lisp language extensions + games games, jokes and amusements + hardware support for interfacing with exotic hardware + help support for on-line help systems + i14n internationalization and alternate character-set support + internal code for Emacs internals, build process, defaults + languages specialized modes for editing programming languages + lisp Lisp support, including Emacs Lisp + local code local to your site + maint maintenance aids for the Emacs development group + mail modes for electronic-mail handling + news support for netnews reading and posting + processes process, subshell, compilation, and job control support + terminals support for terminal types + tex code related to the TeX formatter + tools programming tools + unix front-ends/assistants for, or emulators of, UNIX features + vms support code for vms + wp word processing + + More will be added soon. + + ** The command to split a window into two side-by-side windows is now + C-x 3. It was C-x 5. + + ** M-. (find-tag) no longer has any effect on what M-, will do + subsequently. You can no longer use M-, to find the next similar tag; + you must use M-. with a prefix argument, instead. + + The motive for this change is so that you can more reliably use + M-, to resume a suspended `tags-search' or `tags-query-replace'. + + ** C-x s (`save-some-buffers') now gives you more options when it asks + whether to save a particular buffer. In addition to `y' or `n', you + can answer `!' to save all the remaining buffers, `.' to save this + buffer but not save any others, ESC to stop saving and exit the + command, and C-h to get help. These options are analogous to those + of `query-replace'. + + ** M-x make-symbolic-link does not expand its first argument. + This lets you make a link with a target that is a relative file name. + + ** M-x add-change-log-entry and C-x 4 a now automatically insert the + name of the file and often the name of the function that you changed. + They also handle grouping of entries. + + There is now a special major mode for editing ChangeLog files. It + makes filling work conveniently. Each bunch of grouped entries is one + paragraph, and each collection of entries from one person on one day + is considered a page. + + ** The `comment-region' command adds comment delimiters to the lines that + start in the region, thus commenting them out. With a negative argument, + it deletes comment delimiters from the lines in the region--this cancels + the effect of `comment-region' without an argument. + + With a positive argument, `comment-region' adds comment delimiters + but duplicates the last character of the comment start sequence as many + times as the argument specifies. This is a way of calling attention to + the comment. In Lisp, you should use an argument at least two, because + the indentation convention for single semicolon comments does not leave + them at the beginning of a line. + + ** If `split-window-keep-point' is non-nil, C-x 2 tries to avoid + shifting any text on the screen by putting point in whichever window + happens to contain the screen line the cursor is already on. + The default is that `split-window-keep-point' is non-nil on slow + terminals. + + ** M-x super-apropos is like M-x apropos except that it searches both + Lisp symbol names and documentation strings for matches. It describes + every symbol that has a match in either the symbol's name or its + documentation. + + Both M-x apropos and M-x super-apropos take an optional second + argument DO-ALL which controls the more expensive part of the job. + This includes looking up and printing the key bindings of all + commands. It also includes checking documentation strings in + super-apropos. DO-ALL is nil by default; use a prefix arg to make it + non-nil. + + ** M-x revert-buffer no longer offers to revert from a recent auto-save + file unless you give it a prefix argument. Otherwise it always + reverts from the real file regardless of whether there has been an + auto-save since thenm. (Reverting from the auto-save file is no longer + very useful now that the undo capacity is larger.) + + ** M-x recover-file no longer turns off Auto Save mode when it reads + the last Auto Save file. + + ** M-x rename-buffer, if you give it a prefix argument, + avoids errors by modifying the new name to make it unique. + + ** M-x rename-uniquely renames the current buffer to a similar name + with a numeric suffix added to make it both different and unique. + + One use of this command is for creating multiple shell buffers. + If you rename your shell buffer, and then do M-x shell again, it + makes a new shell buffer. This method is also good for mail buffers, + compilation buffers, and any Emacs feature which creates a special + buffer with a particular name. + + ** M-x compare-windows with a prefix argument ignores changes in whitespace. + If `compare-ignore-case' is non-nil, then differences in case are also + ignored. + + ** `backward-paragraph' is now bound to M-{ by default, and `forward-paragraph' + to M-}. Originally, these commands were bound to M-[ and M-], but they were + running into conflicts with the use of function keys. On many terminals, + function keys send a sequence beginning ESC-[, so many users have defined this + as a prefix key. + + ** C-x C-u (upcase-region) and C-x C-l (downcase-region) are now disabled by + default; these commands seem to be often hit by accident, and can be + quite destructive if their effects are not noticed immediately. + + ** The function `erase-buffer' is now interactive, but disabled by default. + + ** When visiting a new file, Emacs attempts to abbreviate the file's + path using the symlinks listed in `directory-abbrev-alist'. + + ** When you visit the same file in under two names that translate into + the same name once symbolic links are handled, Emacs warns you that + you have two buffers for the same file. + + ** If you wish to avoid visiting the same file in two buffers under + different names, set the variable `find-file-existing-other-name' + non-nil. Then `find-file' uses the existing buffer visiting the file, + no matter which of the file's names you specify. + + ** If you set `find-file-visit-truename' non-nil, then the file name + recorded for a buffer is the file's truename (in which all symbolic + links have been removed), rather than the name you specify. Setting + `find-file-visit-truename' also implies the effect of + `find-file-existing-other-name'. + + ** C-x C-v now inserts the entire current file name in the minibuffer. + This is convenient if you made a small mistake in typing it. Point + goes after the last slash, before the last file name component, so if + you want to replace it entirely, you can use C-k right away to delete + it. + + ** Commands such as C-M-f in Lisp mode now ignore parentheses within comments. + + ** C-x q now uses ESC to terminate all iterations of the keyboard + macro, rather than C-d as before. + + ** Use the command `setenv' to set an individual environment variable + for Emacs subprocesses. Specify a variable name and a value, both as + strings. This command applies only to subprocesses yet to be + started. + + ** Use `rot13-other-window' to examine a buffer with rot13. + + This command does not change the text in the buffer. Instead, it + creates a window with a funny display table that applies the code when + displaying the text. + + ** The command `M-x version' now prints the current Emacs version; The + `version' command is an alias for the `emacs-version' command. + + ** More complex changes in existing packages. + + *** `fill-nonuniform-paragraphs' is a new command, much like + `fill-individual-paragraphs' except that only separator lines separate + paragraphs. Since this means that the lines of one paragraph may have + different amounts of indentation, the fill prefix used is the smallest + amount of indentation of any of the lines of the paragraph. + + *** Filling is now partially controlled by a new minor mode, Adaptive + Fill mode. When this mode is enabled (and it is enabled by default), + if you use M-x fill-region-as-paragraph on an indented paragraph and + you don't have a fill prefix, it uses the indentation of the second + line of the paragraph as the fill prefix. + + Adaptive Fill mode doesn't have much effect on M-q in most major + modes, because an indented line will probably count as a paragraph + starter and thus each line of an indented paragraph will be considered + a paragraph of its own. + + *** M-q in C mode now runs `c-fill-paragraph', which is designed + for filling C comments. (We assume you don't want to fill + the code in a C program.) + + *** M-$ now runs the Ispell program instead of the Unix spell program. + + M-$ starts an Ispell process the first time you use it. But the process + stays alive, so that subsequent uses of M-$ run very fast. + If you want to get rid of the process, use M-x kill-ispell. + + To check the entire current buffer, use M-x ispell-buffer. + Use M-x ispell-region to check just the current region. + + Ispell commands often involve interactive replacement of words. + You can interrupt the interactive replacement with C-g. + You can restart it again afterward with C-u M-$. + + During interactive replacement, you can type the following characters: + + a Accept this word this time. + DIGIT Replace the word (this time) with one of the displayed near-misses. + The digit you use says which near-miss to use. + i Insert this word in your private dictionary + so that Ispell will consider it correct it from now on. + r Replace the word this time with a string typed by you. + + When the Ispell process starts, it reads your private dictionary which + is the file `~/ispell.words'. If you "insert" words with the `i' command, + these words are added to that file, but not right away--only at the end + of the interactive replacement process. + + Use M-x reload-ispell to reload your private dictionary from + `~/ispell.words' if you edit it outside of Ispell. + + ** Changes in existing modes. + + *** gdb-mode has been replaced by gud-mode. + + The package gud.el (Grand Unified Debugger) replaces gdb.el in Emacs + 19. It provides a gdb.el-like interface to any of three debuggers; + gdb itself, the sdb debugger supported on some Unix systems, or the + dbx debugger on Berkeley systems. + + You start it up with one of the commands M-x gdb, M-x sdb, or + M-x dbx. Each entry point finishes by executing a hook; gdb-mode-hook, + sdb-mode-hook or dbx-mode-hook respectively. + + These bindings have changed: + C-x C-a > gud-down (was M-d) + C-x C-a < gud-up (was M-u) + C-x C-a C-r gud-cont (was M-c) + C-x C-a C-n gud-next (was M-n) + C-x C-a C-s gud-step (was M-s) + C-x C-a C-i gud-stepi (was M-i) + C-x C-a C-l gud-recenter (was C-l) + C-d comint-delchar-or-maybe-eof (was C-c C-d) + + These bindings have been removed: + C-c C-r (was comint-show-output; now gud-cont) + + Since GUD mode uses comint, it uses comint's input history commands, + superseding C-c C-y (copy-last-shell-input): + M-p comint-next-input + M-n comint-previous-input + M-r comint-previous-similar-input + M-s comint-next-similar-input + M-C-r comint-previous-input-matching + + The C-x C-a bindings are also active in source files. + + *** The old TeX mode bindings of M-{ and M-} have been moved to C-c { + and C-c }. (These commands are `up-list' and `tex-insert-braces'; + they are the TeX equivalents of M-( and M-).) This is because M-{ + and M-} are now globally defined commands. + + *** Changes in Mail mode. + + `%' is now a word-separator character in Mail mode. + + `mail-signature', if non-nil, tells M-x mail to insert your + `.signature' file automatically. If you don't want your signature in + a particular message, just delete it before you send the message. + + You can specify the text to insert at the beginning of each line when + you use C-c C-y to yank the message you are replying to. Set + `mail-yank-prefix' to the desired string. A value of `nil' (the + default) means to use indentation, as in Emacs 18. If you use just + C-u as the prefix argument to C-c C-y, then it does not insert + anything at the beginning of the lines, regardless of the value of + `mail-yank-prefix'. + + If you like, you can expand mail aliases as abbrevs, as soon as you + type them in. To enable this feature, execute the following: + + (add-hook 'mail-setup-hook 'mail-abbrevs-setup) + + This can go in your .emacs file. + + Word abbrevs don't expand unless you insert a word-separator character + afterward. Any mail aliases that you didn't expand at insertion time + are expanded subsequently when you send the message. + + *** Changes in Rmail. + + Rmail by default gets new mail only from the system inbox file, + not from `~/mbox'. + + In Rmail, you can retry sending a message that failed + by typing `M-m' on the failure message. + + By contrast, another new command M-x rmail-resend is used for + forwarding a message and marking it as "resent from" you + with header fields "Resent-From:" and "Resent-To:". + + `e' is now the command to edit a message. + To expunge, type `x'. We know this will surprise people + some of the time, but the surprise will not be disastrous--if + you type `e' meaning to expunge, just turn off editing with C-c C-c + and then type `x'. + + Another new Rmail command is `<', which moves to the first message. + This is for symmetry with `>'. + + Use the `b' command to bury the Rmail buffer and its summary buffer, + if any, removing both of them from display on the screen. + + The variable `rmail-output-file-alist' now controls the default + for the file to output a message to. + + In the Rmail summary buffer, all cursor motion commands select + the message you move to. It's really neat when you use + incremental search. + + You can now issue most Rmail commands from an Rmail summary buffer. + The commands do the same thing in that buffer that they do in the + Rmail buffer. They apply to the message that is selected in the Rmail + buffer, which is always the one described by the current summary + line. + + Conversely, motion and deletion commands in the Rmail buffer also + update the summary buffer. If you set the variable + `rmail-redisplay-summary' to a non-nil value, then they bring the + summary buffer (if one exists) back onto the screen. + + C-M-t is a new command to make a summary by topic. It uses regexp + matching against just the subjects of the messages to decide which + messages to show in the summary. + + You can easily convert an Rmail file to system mailbox format with the + command `unrmail'. This command reads two arguments, the name of + the Rmail file to convert, and the name of the new mailbox file. + (This command does not change the Rmail file itself.) + + Rmail now handles Content Length fields in messages. + + *** `mail-extract-address-components' unpacks mail addresses. + It takes an address as a string (the contents of the From field, for + example) and returns a list of the form (FULL-NAME + CANONICAL-ADDRESS). + + *** Changes in C mode and C-related commands. + + **** M-x c-up-conditional + + In C mode, `c-up-conditional' moves back to the containing + preprocessor conditional, setting the mark where point was + previously. + + A prefix argument acts as a repeat count. With a negative argument, + this command moves forward to the end of the containing preprocessor + conditional. When going backwards, `#elif' acts like `#else' followed + by `#if'. When going forwards, `#elif' is ignored. + + **** In C mode, M-a and M-e are now defined as + `c-beginning-of-statement' and `c-end-of-statement'. + + **** In C mode, M-x c-backslash-region is a new command to insert or + align `\' characters at the ends of the lines of the region, except + for the last such line. This is useful after writing or editing a C + macro definition. + + If a line already ends in `\', this command adjusts the amount of + whitespace before it. Otherwise, it inserts a new `\'. + + *** New features in info. + + When Info looks for an Info file, it searches the directories + in `Info-directory-list'. This makes it easy to install the Info files + that come with various packages. You can specify the path with + the environment variable INFOPATH. + + There are new commands in Info mode. + + `]' now moves forward a node, going up and down levels as needed. + `[' is similar but moves backward. These two commands try to traverse + the entire Info tree, node by node. They are the equivalent of reading + a printed manual sequentially. + + `<' moves to the top node of the current Info file. + `>' moves to the last node of the file. + + SPC scrolls through the current node; at the end, it advances to the + next node in depth-first order (like `]'). + + DEL scrolls backwards in the current node; at the end, it moves to the + previous node in depth-first order (like `['). + + After a menu select, the info `up' command now restores point in the + menu. The combination of this and the previous two changes means that + repeated SPC keystrokes do the right (depth-first traverse forward) thing. + + `i STRING RET' moves to the node associated with STRING in the index + or indices of this manual. If there is more than one match for + STRING, the `i' command finds the first match. + + `,' finds the next match for the string in the previous `i' command + + If you click the middle mouse button near a cross-reference, + menu item or node pointer while in Info, you will go to the node + which is referenced. + + *** Changes in M-x compile. + + You can repeat any previous compilation command conveniently using the + minibuffer history commands, while in the minibuffer entering the + compilation command. + + While a compilation is going on, the string `Compiling' appears in + the mode line. When this string disappears, that tells you the + compilation is finished. + + The buffer of compiler messages is in Compilation mode. This mode + provides the keys SPC and DEL to scroll by screenfuls, and M-n and M-p + to move to the next or previous error message. You can also use C-c + C-c on any error message to find the corresponding source code. + + Emacs 19 has a more general parser for compiler messages. For example, it + can understand messages from lint, and from certain C compilers whose error + message format is unusual. Also, it only parses until it sees the error + message you want; you never have to wait a long time to see the first + error, no matter how big the buffer is. + + *** M-x diff and M-x diff-backup. + + This new command compares two files, displaying the differences in an + Emacs buffer. The options for the `diff' program come from the + variable `diff-switches', whose value should be a string. + + The buffer of differences has Compilation mode as its major mode, so you + can use C-x ` to visit successive changed locations in the two + source files, or you can move to a particular hunk of changes and type + C-c C-c to move to the corresponding source. You can also use the + other special commands of Compilation mode: SPC and DEL for + scrolling, and M-n and M-p for cursor motion. + + M-x diff-backup compares a file with its most recent backup. + If you specify the name of a backup file, `diff-backup' compares it + with the source file that it is a backup of. + + *** The View commands (such as M-x view-buffer and M-x view-file) no + longer use recursive edits; instead, they switch temporarily to a + different major mode (View mode) specifically designed for moving + around through a buffer without editing it. + + *** Changes in incremental search. + + **** The character to terminate an incremental search is now RET. + This is for compatibility with the way most other arguments are read. + + To search for a newline in an incremental search, type LFD (also known + as C-j). + + **** Incremental search now maintains a ring of previous search + strings. Use M-p and M-n to move through the ring to pick a search + string to reuse. These commands leave the selected search ring + element in the minibuffer, where you can edit it. Type C-s or C-r to + finish editing and search for the chosen string. + + **** If you type an upper case letter in incremental search, that turns + off case-folding, so that you get a case-sensitive search. + + **** If you type a space during regexp incremental search, it matches + any sequence of whitespace characters. If you want to match just a space, + type C-q SPC. + + **** Incremental search is now implemented as a major mode. When you + type C-s, it switches temporarily to a different keymap which defines + each key to do what it ought to do for incremental search. This has + next to no effect on the user-visible behavior of searching, but makes + it easier to customize that behavior. + + Emacs 19 eliminates the old variables `search-...-char' that used to + be the way to specify the characters to use for various special + purposes in incremental search. Instead, you can define the meaning + of a character in incremental search by modifying `isearch-mode-map'. + + *** New commands in Buffer Menu mode. + + The command C-o now displays the current line's buffer in another + window but does not select it. This is like the existing command `o' + which selects the current line's buffer in another window. + + The command % toggles the read-only flag of the current line's buffer. + + The way to switch to a set of several buffers, including those marked + with m, is now v. The q command simply quits, replacing the buffer + menu buffer with the buffer that was displayed previously. + + ** New major modes and packages. + + *** The news reader GNUS is now installed. + + *** There is a new interface for version control systems, called VC. + It works with both RCS and SCCS; in fact, you don't really have to + know which one of them is being used, because it automatically deals + with either one. + + Most of the time, the only command you have to know about is C-x C-q. + This command normally toggles the read-only flag of the current + buffer. If the buffer is visiting a file that is maintained with a + version control system, the command still toggles read-only, but does + so by checking the file in or checking it out. + + When you check a file in, VC asks you for a log entry by popping up a + buffer. Edit the entry there, then type C-c C-c when it is ready. + That's when the actual checkin happens. If you change your mind about + the checkin, simply switch buffers and don't ever go back to the log + buffer. + + To start using version control for a file, use the command C-x v v. + This works like C-x C-q (performing the next logical version-control + operation needed to change the file's writability) but it will also + perform initial checkin on an unregistered file. + + By default, VC uses RCS if RCS is installed on your machine; + otherwise, SCCS. If you want to make the choice explicitly, you can do + it by setting `vc-default-back-end' to the symbol `RCS' or the symbol + `SCCS'. + + You can tell when a file you visit is maintained with version control + because either `RCS' or `SCCS' appears in the mode line. + + *** A new Calendar mode has been added, the work of Edward M. Reingold. + The mode can display the Gregorian calendar and a variety of other + calendars at any date, and interacts with a diary facility similar to + the UNIX `calendar' utility. + + *** There is a new major mode for editing binary files: Hexl mode. + To use it, use M-x hexl-find-file instead of C-x C-f to visit the file. + This command converts the file's contents to hexadecimal and lets you + edit the translation. When you save the file, it is converted + automatically back to binary. + + You can also use M-x hexl-mode to translate an existing buffer into hex. + Do this if you have already visited a binary file. + + Hexl mode has a few other commands: + + C-M-d insert a byte with a code typed in decimal. + C-M-o insert a byte with a code typed in octal. + C-M-x insert a byte with a code typed in hex. + + C-x [ move to the beginning of a 1k-byte "page". + C-x ] move to the end of a 1k-byte "page". + + M-g go to an address specified in hex. + M-j go to an address specified in decimal. + + C-c C-c leave hexl mode and go back to the previous major mode. + + *** Miscellaneous new major modes include Awk mode, Icon mode, Makefile + mode, Perl mode and SGML mode. + + *** Edebug, a new source-level debugger for Emacs Lisp functions. + + To use Edebug, use the command M-x edebug-defun to "evaluate" a + function definition in an Emacs Lisp file. We put "evaluate" in + quotation marks because it doesn't just evaluate the function, it also + inserts additional information to support source-level debugging. + + You must also do + + (setq debugger 'edebug-debug) + + to cause errors and single-stepping to use Edebug instead of the usual + Emacs Lisp debugger. + + For more information, see the Edebug manual, which should be included + in the Emacs distribution. + + *** C++ mode is like C mode, except that it understands C++ comment syntax + and certain other differences between C and C++. It also has a command + `fill-c++-comment' which fills a paragraph made of comment lines. + + The command `comment-region' is useful in C++ mode for commenting out + several consecutive lines, or removing the commenting out of such lines. + + *** A new package for merging two variants of the same text. + + It's not unusual for programmers to get their signals crossed and + modify the same program in two different directions. Then somebody + has to merge the two versions. The command `emerge-files' makes this + easier. + + `emerge-files' reads two file names and compares them. Then it + displays three buffers: one for each file, and one for the + differences. + + If the original version of the file is available, you can make things + even easier using `emerge-files-with-ancestor'. It reads three file + names--variant 1, variant 2, and the common ancestor--and uses diff3 + to compare them. + + You control the merging interactively. The main loop of Emerge + consists of showing you one set of differences, asking you what to do + about them, and doing it. You have a choice of two modes for giving + directions to Emerge: "fast" mode and "edit" mode. + + In Fast mode, Emerge commands are single characters, and ordinary + Emacs commands are disabled. This makes Emerge operations fast, but + prevents you from doing more than selecting the A or the B version of + differences. In Edit mode, all emerge commands use the C-c prefix, + and the usual Emacs commands are available. This allows editing the + merge buffer, but slows down Emerge operations. Edit and fast modes + are indicated by `F' and `E' in the minor modes in the mode line. + + The Emerge commands are: + + p go to the previous difference + n go to the next difference + a select the A version of this difference + b select the B version of this difference + j go to a particular difference (prefix argument + specifies which difference) (0j suppresses display of + the flags) + q quit - finish the merge* + f go into fast mode + e go into edit mode + l recenter (C-l) all three windows* + - and 0 through 9 + prefix numeric arguments + d a select the A version as the default from here down in + the merge buffer* + d b select the B version as the default from here down in + the merge buffer* + c a copy the A version of the difference into the kill + ring + c b copy the B version of the difference into the kill + ring + i a insert the A version of the difference at the point + i b insert the B version of the difference at the point + m put the point and mark around the difference region + ^ scroll-down (like M-v) the three windows* + v scroll-up (like C-v) the three windows* + < scroll-left (like C-x <) the three windows* + > scroll-right (like C-x >) the three windows* + | reset horizontal scroll on the three windows* + x 1 shrink the merge window to one line (use C-u l to restore it + to full size) + x a find the difference containing a location in the A buffer* + x b find the difference containing a location in the B buffer* + x c combine the two versions of this difference* + x C combine the two versions of this difference, using a + register's value as the template* + x d find the difference containing a location in the merge buffer* + x f show the files/buffers Emerge is operating on in Help window + (use C-u l to restore windows) + x j join this difference with the following one + (C-u x j joins this difference with the previous one) + x l show line numbers of points in A, B, and merge buffers + x m change major mode of merge buffer* + x s split this difference into two differences + (first position the point in all three buffers to the places + to split the difference) + x t trim identical lines off top and bottom of difference + (such lines occur when the A and B versions are + identical but differ from the ancestor version) + x x set the template for the x c command* + + Normally, the merged output goes back in the first file specified. + If you use a prefix argument, Emerge reads another file name to use + for the output file. + + Once Emerge has prepared the buffer of differences, it runs the hooks + in `emerge-startup-hooks'. + + *** Asm mode is a new major mode for editing files of assembler code. + It defines these commands: + + TAB tab-to-tab-stop. + LFD Insert a newline and then indent using tab-to-tab-stop. + : Insert a colon and then remove the indentation + from before the label preceding colon. Then tab-to-tab-stop. + ; Insert or align a comment. + + *** Two-column mode lets you conveniently edit two side-by-side columns + of text. It works using two side-by-side windows, each showing its + own buffer. + + Here are three ways to enter two-column mode: + + C-x 6 2 makes the current buffer into the left-hand buffer. In the + right-hand window it puts a buffer whose name is based on the current + buffer's name. + + C-x 6 b BUFFER RET makes the current buffer into the left-hand buffer, + and uses buffer BUFFER as the right-hand buffer. + + C-x 6 s splits the current buffer, which contains two-column text, + into two side-by-side buffers. The old current buffer becomes the + left-hand buffer, but the text in the right column is moved into the + right-hand buffer. The current column specifies the split point. + Splitting starts with the current line and continues to the end of the + buffer. + + C-x 6 s takes a prefix argument which specifies how many characters + before point constitute the column separator. (The default argument + is 1, as usual, so by default the column separator is the character + before point.) Lines that don't have the column separator at the + proper place remain unsplit; they stay in the left-hand buffer, and + the right-hand buffer gets an empty line to correspond. + + You can scroll both buffers together using C-x 6 SPC (scroll up), C-x + 6 DEL (scroll down), and C-x 6 RET (scroll up one line). C-x 6 C-l + recenters both buffers together. + + If you want to make a line which will span both columns, put it in + the left-hand buffer, with an empty line in the corresponding place in + the right-hand buffer. + + When you have edited both buffers as you wish, merge them with C-x 6 + 1. This copies the text from the right-hand buffer as a second column + in the other buffer. To go back to two-column editing, use C-x 6 s. + + Use C-x 6 d to disassociate the two buffers, leaving each as it + stands. (If the other buffer, the one that was not current when you + type C-x 6 d, is empty, C-x 6 d kills it.) + + *** You can supply command arguments such as files to visit to an Emacs + that is already running. To do this, you must do this in your .emacs + file: + (add-hook 'suspend-hook 'resume-suspend-hook) + Also you must use the shellscript emacs.csh or emacs.sh, found in the + etc subdirectory. + + *** Shell mode has been completely replaced. + The basic idea is the same, but there are new commands available in + this mode. + + TAB now completes the file name before point in the shell buffer. + To get a list of all possible completions, type M-?. + + There is a new convenient history mechanism for repeating previous + commands. Use the command M-p to recall the last command; it copies + the text of that command to the place where you are editing. If you + repeat M-p, it replaces the copied command with the previous command. + M-n is similar but goes in the opposite direction towards the present. + When you find the command you wanted, you can edit it, or just + resubmit it by typing RET. + + You can also use M-r and M-s to search for (respectively) earlier or + later inputs starting with a given string. First type the string, + then type M-r to yank a previous input from the history which starts + with that string. You can repeat M-r to find successively earlier + inputs starting with the same string. You can start moving in the + opposite direction (toward more recent inputs) by typing M-s instead + of M-r. As long as you don't use any commands except M-r and M-s, + they keep using the same string that you had entered initially. + + C-c C-o kills the last batch of output from a shell command. This is + useful if a shell command spews out lots of output that just gets in + the way. + + C-c C-r scrolls to display the beginning of the last batch of output + at the top of the window; it also moves the cursor there. + + C-a on a line that starts with a shell prompt moves to the end of the + prompt, not to the very beginning of the line. + + C-d typed at the end of the shell buffer sends EOF to the subshell. + At any other position in the buffer, it deletes a character as usual. + + If Emacs gets confused while trying to track changes in the shell's + current directory, type M-x dirs to re-synchronize. + + M-x send-invisible reads a line of text without echoing it, and + sends it to the shell. + + If you accidentally suspend your process, use M-x comint-continue-subjob + to continue it. + + *** There is now a convenient way to enable flow control on terminals + where you can't win without it. Suppose you want to do this on + VT-100 and H19 terminals; put the following in your `.emacs' file: + + (enable-flow-control-on "vt100" "h19") + + When flow control is enabled, you must type C-\ to get the effect of a + C-s, and type C-^ to get the effect of a C-q. + + The function `enable-flow-control' enables flow control unconditionally. + + ** Changes in Dired + + Dired has many new features which allow you to do these things: + + - Rename, copy, or make links to many files at once. + + - Make distinguishable types of marks for different operations. + + - Display contents of subdirectories in the same Dired buffer as the + parent directory. + + *** Setting and Clearing Marks + + There are now two kinds of marker that you can put on a file in Dired: + `D' for deletion, and `*' for any other kind of operation. + The `x' command deletes only files marked with `D', and most + other Dired commands operate only on the files marked with `*'. + + To mark files with `D' (also called "flagging" the files), you + can use `d' as usual. Here are some commands for marking with + `*' (and also for unmarking): + + **** `m' marks the current file with `*', for an operation other than + deletion. + + **** `*' marks all executable files. With a prefix argument, it + unmarks all those files. + + **** `@' marks all symbolic links. With a prefix argument, it unmarks + all those files. + + **** `/' marks all directory files except `.' and `..'. With a prefix + argument, it unmarks all those files. + + **** M-DEL removes a specific or all marks from every file. With an + argument, queries for each marked file. Type your help character, + usually C-h, at that time for help. + + **** `c' replaces all marks that use the character OLD with marks that + use the character NEW. You can use almost any character as a mark + character by means of this command, to distinguish various classes of + files. If OLD is ` ', then the command operates on all unmarked + files; if NEW is ` ', then the command unmarks the files it acts on. + + *** Operating on Multiple Files + + The Dired commands to operate directly on files (rename them, copy + them, and so on) have been generalized to work on multiple files. + There are also some additional commands in this series. + + All of these commands use the same convention to decide which files to + manipulate: + + - If you give the command a numeric prefix argument @var{n}, it operates + on the next @var{n} files, starting with the current file. + + - Otherwise, if there are marked files, the commands operate on all the + marked files. + + - Otherwise, the command operates on the current file only. + + These are the commands: + + **** `C' copies the specified files. You must specify a directory to + copy into, or (if copying a single file) a new name. + + If `dired-copy-preserve-time' is non-`nil', then copying sets + the modification time of the new file to be the same as that of the old + file. + + **** `R' renames the specified files. You must specify a directory to + rename into, or (if renaming a single file) a new name. + + Dired automatically changes the visited file name of buffers associated + with renamed files so that they refer to the new names. + + **** `H' makes hard links to the specified files. You must specify a + directory to make the links in, or (if making just one link) the name + to give the link. + + **** `S' makes symbolic links to the specified files. You must specify + a directory to make the links in, or (if making just one link) the + name to give the link. + + **** `M' changes the mode of the specified files. This calls the + `chmod' program, so you can describe the desired mode change with any + argument that `chmod' would handle. + + **** `G' changes the group of the specified files. + + **** `O' changes the owner of the specified files. (On normal systems, + only the superuser can do this.) + + The variable `dired-chown-program' specifies the name of the + program to use to do the work (different systems put `chown' in + different places. + + **** `Z' compresses or uncompresses the specified files. + + **** `L' loads the specified Emacs Lisp files. + + **** `B' byte compiles the specified Emacs Lisp files. + + **** `P' prints the specified files. It uses the variables + `lpr-command' and `lpr-switches' just as `lpr-file' does. + + *** Shell Commands in Dired + + `!' reads a shell command string in the minibuffer and runs the shell + command on all the specified files. There are two ways of applying a + shell command to multiple files: + + - If you use `*' in the command, then the shell command runs just + once, with the list of file names substituted for the `*'. + + Thus, `! tar cf foo.tar * RET' runs `tar' on the entire list of file + names, putting them into one tar file `foo.tar'. The file names are + inserted in the order that they appear in the Dired buffer. + + - If the command string doesn't contain `*', then it runs once for + each file, with the file name attached at the end. For example, `! + uudecode RET' runs `uudecode' on each file. + + To run the shell command once for each file but without being limited + to putting the file name inserted in the middle, use a shell loop. + For example, this shell command would run `uuencode' on each of the + specified files, writing the output into a corresponding `.uu' file: + + for file in *; uuencode $file $file >$file.uu; done + + The working directory for the shell command is the top level directory + of the Dired buffer. + + *** Regular Expression File Name Substitution + + **** `% m REGEXP RET' marks all files whose names match the regular + expression REGEXP. + + Only the non-directory part of the file name is used in matching. Use + `^' and `$' to anchor matches. Exclude subdirs by hiding them. + + **** `% d REGEXP RET' flags for deletion all files whose names match + the regular expression REGEXP. + + **** `% R', `% C', `% H', `% S' + + These four commands rename, copy, make hard links and make soft links, + in each case computing the new name by regular expression substitution + from the name of the old file. They effectively perform + `query-replace-regexp' on the selected file names in the Dired buffer. + + The commands read two arguments: a regular expression, and a + substitution pattern. Each selected file name is matched against the + regular expression, and then the part which matched is replaced with + the substitution pattern. You can use `\&' and `\DIGIT' in the + substitution pattern to refer to all or part of the old file name. + + If the regular expression matches more than once in a file name, + only the first match is replaced. + + Normally, the replacement process does not consider the directory names; + it operates on the file name within the directory. If you specify a + prefix argument of zero, then replacement affects entire file name. + + To apply the command to all files matching the same regexp that you + use in the command, mark those files with `% m REGEXP RET', then use + the same regular expression in `% R'. To make this easier, `% R' uses + as a default the last regular expression specified in a `%' command. + + *** Dired Case Conversion + + **** `% u' renames each of the selected files to an upper case name. + + **** `% l' renames each of the selected files to a lower case name. + + *** File Comparison with Dired + + **** `=' compares the current file with another file (the file at the + mark), by running the `diff' program. The file at the mark is given + to `diff' first. + + **** `M-=' compares the current file with its backup file. If there + are several numerical backups, it uses the most recent one. If this + file is a backup, it is compared with its original. + + The backup file is the first file given to `diff'. + + *** Subdirectories in Dired + + You can display more than one directory in one Dired buffer. + The simplest way to do this is to specify the options `-lR' for + running `ls'. That produces a recursive directory listing showing + all subdirectories, all within the same Dired buffer. + + You can also insert the contents of a particular subdirectory with the + `i' command. Use this command on the line that describes a file which + is a directory. Inserted subdirectory contents follow the top-level + directory of the Dired buffer, just as they do in `ls -lR' output. + + If the subdirectory's contents are already present in the buffer, the + `i' command just moves to it (type `l' to refresh it). It sets the + Emacs mark before moving, so C-x C-x takes you back to the old + position in the buffer. + + When you have subdirectories in the Dired buffer, you can use the page + motion commands C-x [ and C-x ] to move by entire directories. + + The following commands move up and down in the tree of directories + in one Dired buffer: + + **** C-M-u Go up to the parent directory's headerline. + + **** C-M-d Go down in the tree, to the first subdirectory's + headerline. + + **** C-M-n Go to next subdirectory headerline, regardless of level. + + **** C-M-p Go to previous subdirectory headerline, regardless of + level. + + *** Hiding Subdirectories + + "Hiding" a subdirectory means to make it invisible, except for its + headerline. Files inside a hidden subdirectory are never considered + by Dired. For example, the commands to operate on marked files ignore + files in hidden directories even if they are marked. + + **** `$' hides or unhides the current subdirectory and move to next + subdirectory. A prefix argument serves as a repeat count. + + **** `M-$' hides all subdirectories, leaving only their header lines. + Or, if at least one subdirectory is currently hidden, it makes + everything visible again. You can use this command to get an overview + in very deep directory trees or to move quickly to subdirectories far + away. + + *** Editing the Dired Buffer + + **** `l' updates the specified files in a Dired buffer. This means + reading their current status from the file system and changing the + buffer to reflect it properly. + + If you use this command on a subdirectory header line, it updates the + contents of the subdirectory. + + **** `g' updates the entire contents of the Dired buffer. It preserves + all marks except for those on files that have vanished. Hidden + subdirectories are updated but remain hidden. + + **** `k' kills all marked lines (not the files). With a prefix + argument, it kills that many lines starting with the current line. + + This command does not delete files; it just deletes text from the Dired + buffer. + + If you kill the line for a file that is a directory, then its contents + are also deleted from the buffer. Typing `C-u k' on the header line + for a subdirectory is another way to delete a subdirectory from the + Dired buffer. + + *** `find' and Dired. + + To search for files with names matching a wildcard pattern use + `find-name-dired'. Its arguments are DIRECTORY and + PATTERN. It selects all the files in DIRECTORY or its + subdirectories whose own names match PATTERN. + + The files thus selected are displayed in a Dired buffer in which the + ordinary Dired commands are available. + + If you want to test the contents of files, rather than their names, use + `find-grep-dired'. This command takes two minibuffer arguments, + DIRECTORY and REGEXP; it selects all the files in + DIRECTORY or its subdirectories that contain a match for + REGEXP. It works by running `find' and `grep'. + + The most general command in this series is `find-dired', which lets + you specify any condition that `find' can test. It takes two + minibuffer arguments, DIRECTORY and FIND-ARGS; it runs `find' in + DIRECTORY with using FIND-ARGS as the arguments to `find' specifying + which files to accept. To use this command, you need to know how to + use `find'. + + ** New amusements and novelties. + + *** `M-x mpuz' displays a multiplication puzzle, in which each letter + stands for a digit, and you must determine which digit. The puzzles + are determined randomly, so they are always different. + + *** `M-x gomoku' plays the game Gomoku with you. It needs more work. + + *** `M-x spook' adds a line of randomly chosen keywords to an outgoing + mail message. The keywords are chosen from a list of words that + suggest you are discussing something subversive. + + The idea is that the NSA reads all messages that contain keywords + suggesting they might be interested, and that adding these lines could + help to overload them. I would guess that they have modified their + program by now to ignore these lines of keywords; perhaps the program + can be updated if some clever hacker can determine what criterion they + actually use now. + + ** Installation changes + + *** The configure script has been provided to help with the + installation process. It takes the place of editing the Makefiles and + src/config.h, and can often guess the appropriate operating system to + use for a particular machine type. See INSTALL for a more detailed + description of the steps required for installation. + + *** If you create a Lisp file named `site-start.el', Emacs loads the file + whenever it starts up. + + *** A new Lisp variable, `data-directory', indicates the directory + containing the DOC file, tutorial, copying agreement, and other + familiar `etc' files. The value of `data-directory' is a simple string. + The default should be set at build time, and the person installing + Emacs should place all the data files in this directory. The `help.el' + functions that look for docstrings and information files check this + variable. All Emacs Lisp packages should also be coded so that they + refer to `data-directory' to find data files. + + *** The PURESIZE definition has been moved from config.h to its own + file, puresize.h. Since almost every file of C source in the + distribution depends on config.h, but only alloc.c and data.c depend + on puresize.h, this means that changing the value of PURESIZE causes + only those two files to be recompiled. + + *** The makefile at the top of the Emacs source tree now supports a + `dist' target, which creates a compressed tar file suitable for + distribution, using the contents of the source tree. Object files, + old file versions, executables, DOC files, and other + architecture-specific or easy-to-recreate files are not included in + the tar file. + + + + ---------------------------------------------------------------------- + Copyright information: + + Copyright (C) 1993, 1994, 1995, 2001, 2006 Free Software Foundation, Inc. + + Permission is granted to anyone to make or distribute verbatim copies + of this document as received, in any medium, provided that the + copyright notice and this permission notice are preserved, + thus giving the recipient permission to redistribute in turn. + + Permission is granted to distribute modified versions + of this document, or of portions of it, + under the above conditions, provided also that they + carry prominent notices stating who last changed them. + + Local variables: + mode: outline + paragraph-separate: "[ ]*$" + end: + + arch-tag: 944be39b-afe8-4217-9977-c745b68a7ca2 diff --cc lisp/progmodes/sh-script.el index 0e73427a33c,ef80d28c578..b80fe4c0fbc --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@@ -1019,11 -1088,12 +1088,12 @@@ This is used to flag quote characters i (")" 0 (sh-font-lock-paren (match-beginning 0))))) (defun sh-font-lock-syntactic-face-function (state) - (if (nth 3 state) - (if (characterp (nth 3 state)) - font-lock-string-face - sh-heredoc-face) - font-lock-comment-face)) + (let ((q (nth 3 state))) + (if q - (if (char-valid-p q) ++ (if (characterp q) + (if (eq q ?\`) 'sh-quoted-exec font-lock-string-face) + sh-heredoc-face) + font-lock-comment-face))) (defgroup sh-indentation nil "Variables controlling indentation in shell scripts. diff --cc src/Makefile.in index 049a4c5bc17,4b6599dc26d..342540df7be --- a/src/Makefile.in +++ b/src/Makefile.in @@@ -281,7 -280,7 +281,7 @@@ TOOLKIT_DEFINES /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM since it may have -I options that should override those two. */ - ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS} @FREETYPE_CFLAGS@ @FONTCONFIG_CFLAGS@ @LIBOTF_CFLAGS@ -ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${CFLAGS} ++ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${CFLAGS} @FREETYPE_CFLAGS@ @FONTCONFIG_CFLAGS@ @LIBOTF_CFLAGS@ .c.o: $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< diff --cc src/coding.c index debb2f27ffc,be39ceb7fe6..9f95c2c6777 --- a/src/coding.c +++ b/src/coding.c @@@ -8304,811 -7446,204 +8304,818 @@@ DECODING-SYSTEM is the coding system t \(in case OPERATION does decoding), and ENCODING-SYSTEM is the coding system for encoding (in case OPERATION does encoding). -The first argument OPERATION specifies an I/O primitive: - For file I/O, `insert-file-contents' or `write-region'. - For process I/O, `call-process', `call-process-region', or `start-process'. - For network I/O, `open-network-stream'. +The first argument OPERATION specifies an I/O primitive: + For file I/O, `insert-file-contents' or `write-region'. + For process I/O, `call-process', `call-process-region', or `start-process'. + For network I/O, `open-network-stream'. + +The remaining arguments should be the same arguments that were passed +to the primitive. Depending on which primitive, one of those arguments +is selected as the TARGET. For example, if OPERATION does file I/O, +whichever argument specifies the file name is TARGET. + +TARGET has a meaning which depends on OPERATION: - For file I/O, TARGET is a file name. ++ For file I/O, TARGET is a file name (except for the special case below). + For process I/O, TARGET is a process name. + For network I/O, TARGET is a service name or a port number + +This function looks up what specified for TARGET in, +`file-coding-system-alist', `process-coding-system-alist', +or `network-coding-system-alist' depending on OPERATION. +They may specify a coding system, a cons of coding systems, +or a function symbol to call. +In the last case, we call the function with one argument, +which is a list of all the arguments given to this function. + ++If OPERATION is `insert-file-contents', the argument corresponding to ++TARGET may be a cons (FILENAME . BUFFER). In that case, FILENAME is a ++file name to look up, and BUFFER is a buffer that contains the file's ++contents (not yet decoded). If `file-coding-system-alist' specifies a ++function to call for FILENAME, that function should examine the ++contents of BUFFER instead of reading the file. ++ +usage: (find-operation-coding-system OPERATION ARGUMENTS ...) */) + (nargs, args) + int nargs; + Lisp_Object *args; +{ + Lisp_Object operation, target_idx, target, val; + register Lisp_Object chain; + + if (nargs < 2) + error ("Too few arguments"); + operation = args[0]; + if (!SYMBOLP (operation) + || !INTEGERP (target_idx = Fget (operation, Qtarget_idx))) + error ("Invalid first arguement"); + if (nargs < 1 + XINT (target_idx)) + error ("Too few arguments for operation: %s", + SDATA (SYMBOL_NAME (operation))); + target = args[XINT (target_idx) + 1]; + if (!(STRINGP (target) + || (EQ (operation, Qopen_network_stream) && INTEGERP (target)))) + error ("Invalid %dth argument", XINT (target_idx) + 1); + + chain = ((EQ (operation, Qinsert_file_contents) + || EQ (operation, Qwrite_region)) + ? Vfile_coding_system_alist + : (EQ (operation, Qopen_network_stream) + ? Vnetwork_coding_system_alist + : Vprocess_coding_system_alist)); + if (NILP (chain)) + return Qnil; + + for (; CONSP (chain); chain = XCDR (chain)) + { + Lisp_Object elt; + + elt = XCAR (chain); + if (CONSP (elt) + && ((STRINGP (target) + && STRINGP (XCAR (elt)) + && fast_string_match (XCAR (elt), target) >= 0) + || (INTEGERP (target) && EQ (target, XCAR (elt))))) + { + val = XCDR (elt); + /* Here, if VAL is both a valid coding system and a valid + function symbol, we return VAL as a coding system. */ + if (CONSP (val)) + return val; + if (! SYMBOLP (val)) + return Qnil; + if (! NILP (Fcoding_system_p (val))) + return Fcons (val, val); + if (! NILP (Ffboundp (val))) + { - val = call1 (val, Flist (nargs, args)); ++ val = safe_call1 (val, Flist (nargs, args)); + if (CONSP (val)) + return val; + if (SYMBOLP (val) && ! NILP (Fcoding_system_p (val))) + return Fcons (val, val); + } + return Qnil; + } + } + return Qnil; +} + +DEFUN ("set-coding-system-priority", Fset_coding_system_priority, + Sset_coding_system_priority, 0, MANY, 0, + doc: /* Assign higher priority to the coding systems given as arguments. +If multiple coding systems belongs to the same category, +all but the first one are ignored. + +usage: (set-coding-system-priority ...) */) + (nargs, args) + int nargs; + Lisp_Object *args; +{ + int i, j; + int changed[coding_category_max]; + enum coding_category priorities[coding_category_max]; + + bzero (changed, sizeof changed); + + for (i = j = 0; i < nargs; i++) + { + enum coding_category category; + Lisp_Object spec, attrs; + + CHECK_CODING_SYSTEM_GET_SPEC (args[i], spec); + attrs = AREF (spec, 0); + category = XINT (CODING_ATTR_CATEGORY (attrs)); + if (changed[category]) + /* Ignore this coding system because a coding system of the + same category already had a higher priority. */ + continue; + changed[category] = 1; + priorities[j++] = category; + if (coding_categories[category].id >= 0 + && ! EQ (args[i], CODING_ID_NAME (coding_categories[category].id))) + setup_coding_system (args[i], &coding_categories[category]); + Fset (AREF (Vcoding_category_table, category), args[i]); + } + + /* Now we have decided top J priorities. Reflect the order of the + original priorities to the remaining priorities. */ + + for (i = j, j = 0; i < coding_category_max; i++, j++) + { + while (j < coding_category_max + && changed[coding_priorities[j]]) + j++; + if (j == coding_category_max) + abort (); + priorities[i] = coding_priorities[j]; + } + + bcopy (priorities, coding_priorities, sizeof priorities); + + /* Update `coding-category-list'. */ + Vcoding_category_list = Qnil; + for (i = coding_category_max - 1; i >= 0; i--) + Vcoding_category_list + = Fcons (AREF (Vcoding_category_table, priorities[i]), + Vcoding_category_list); + + return Qnil; +} + +DEFUN ("coding-system-priority-list", Fcoding_system_priority_list, + Scoding_system_priority_list, 0, 1, 0, + doc: /* Return a list of coding systems ordered by their priorities. +HIGHESTP non-nil means just return the highest priority one. */) + (highestp) + Lisp_Object highestp; +{ + int i; + Lisp_Object val; + + for (i = 0, val = Qnil; i < coding_category_max; i++) + { + enum coding_category category = coding_priorities[i]; + int id = coding_categories[category].id; + Lisp_Object attrs; + + if (id < 0) + continue; + attrs = CODING_ID_ATTRS (id); + if (! NILP (highestp)) + return CODING_ATTR_BASE_NAME (attrs); + val = Fcons (CODING_ATTR_BASE_NAME (attrs), val); + } + return Fnreverse (val); +} + +static char *suffixes[] = { "-unix", "-dos", "-mac" }; + +static Lisp_Object +make_subsidiaries (base) + Lisp_Object base; +{ + Lisp_Object subsidiaries; + int base_name_len = SBYTES (SYMBOL_NAME (base)); + char *buf = (char *) alloca (base_name_len + 6); + int i; + + bcopy (SDATA (SYMBOL_NAME (base)), buf, base_name_len); + subsidiaries = Fmake_vector (make_number (3), Qnil); + for (i = 0; i < 3; i++) + { + bcopy (suffixes[i], buf + base_name_len, strlen (suffixes[i]) + 1); + ASET (subsidiaries, i, intern (buf)); + } + return subsidiaries; +} + + +DEFUN ("define-coding-system-internal", Fdefine_coding_system_internal, + Sdefine_coding_system_internal, coding_arg_max, MANY, 0, + doc: /* For internal use only. +usage: (define-coding-system-internal ...) */) + (nargs, args) + int nargs; + Lisp_Object *args; +{ + Lisp_Object name; + Lisp_Object spec_vec; /* [ ATTRS ALIASE EOL_TYPE ] */ + Lisp_Object attrs; /* Vector of attributes. */ + Lisp_Object eol_type; + Lisp_Object aliases; + Lisp_Object coding_type, charset_list, safe_charsets; + enum coding_category category; + Lisp_Object tail, val; + int max_charset_id = 0; + int i; + + if (nargs < coding_arg_max) + goto short_args; + + attrs = Fmake_vector (make_number (coding_attr_last_index), Qnil); + + name = args[coding_arg_name]; + CHECK_SYMBOL (name); + CODING_ATTR_BASE_NAME (attrs) = name; + + val = args[coding_arg_mnemonic]; + if (! STRINGP (val)) + CHECK_CHARACTER (val); + CODING_ATTR_MNEMONIC (attrs) = val; + + coding_type = args[coding_arg_coding_type]; + CHECK_SYMBOL (coding_type); + CODING_ATTR_TYPE (attrs) = coding_type; + + charset_list = args[coding_arg_charset_list]; + if (SYMBOLP (charset_list)) + { + if (EQ (charset_list, Qiso_2022)) + { + if (! EQ (coding_type, Qiso_2022)) + error ("Invalid charset-list"); + charset_list = Viso_2022_charset_list; + } + else if (EQ (charset_list, Qemacs_mule)) + { + if (! EQ (coding_type, Qemacs_mule)) + error ("Invalid charset-list"); + charset_list = Vemacs_mule_charset_list; + } + for (tail = charset_list; CONSP (tail); tail = XCDR (tail)) + if (max_charset_id < XFASTINT (XCAR (tail))) + max_charset_id = XFASTINT (XCAR (tail)); + } + else + { + charset_list = Fcopy_sequence (charset_list); + for (tail = charset_list; !NILP (tail); tail = Fcdr (tail)) + { + struct charset *charset; + + val = Fcar (tail); + CHECK_CHARSET_GET_CHARSET (val, charset); + if (EQ (coding_type, Qiso_2022) + ? CHARSET_ISO_FINAL (charset) < 0 + : EQ (coding_type, Qemacs_mule) + ? CHARSET_EMACS_MULE_ID (charset) < 0 + : 0) + error ("Can't handle charset `%s'", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); + + XSETCAR (tail, make_number (charset->id)); + if (max_charset_id < charset->id) + max_charset_id = charset->id; + } + } + CODING_ATTR_CHARSET_LIST (attrs) = charset_list; + + safe_charsets = Fmake_string (make_number (max_charset_id + 1), + make_number (255)); + for (tail = charset_list; CONSP (tail); tail = XCDR (tail)) + SSET (safe_charsets, XFASTINT (XCAR (tail)), 0); + CODING_ATTR_SAFE_CHARSETS (attrs) = safe_charsets; + + CODING_ATTR_ASCII_COMPAT (attrs) = args[coding_arg_ascii_compatible_p]; + + val = args[coding_arg_decode_translation_table]; + if (! CHAR_TABLE_P (val) && ! CONSP (val)) + CHECK_SYMBOL (val); + CODING_ATTR_DECODE_TBL (attrs) = val; + + val = args[coding_arg_encode_translation_table]; + if (! CHAR_TABLE_P (val) && ! CONSP (val)) + CHECK_SYMBOL (val); + CODING_ATTR_ENCODE_TBL (attrs) = val; + + val = args[coding_arg_post_read_conversion]; + CHECK_SYMBOL (val); + CODING_ATTR_POST_READ (attrs) = val; + + val = args[coding_arg_pre_write_conversion]; + CHECK_SYMBOL (val); + CODING_ATTR_PRE_WRITE (attrs) = val; + + val = args[coding_arg_default_char]; + if (NILP (val)) + CODING_ATTR_DEFAULT_CHAR (attrs) = make_number (' '); + else + { + CHECK_CHARACTER (val); + CODING_ATTR_DEFAULT_CHAR (attrs) = val; + } + + val = args[coding_arg_for_unibyte]; + CODING_ATTR_FOR_UNIBYTE (attrs) = NILP (val) ? Qnil : Qt; + + val = args[coding_arg_plist]; + CHECK_LIST (val); + CODING_ATTR_PLIST (attrs) = val; + + if (EQ (coding_type, Qcharset)) + { + /* Generate a lisp vector of 256 elements. Each element is nil, + integer, or a list of charset IDs. + + If Nth element is nil, the byte code N is invalid in this + coding system. + + If Nth element is a number NUM, N is the first byte of a + charset whose ID is NUM. + + If Nth element is a list of charset IDs, N is the first byte + of one of them. The list is sorted by dimensions of the + charsets. A charset of smaller dimension comes firtst. */ + val = Fmake_vector (make_number (256), Qnil); + + for (tail = charset_list; CONSP (tail); tail = XCDR (tail)) + { + struct charset *charset = CHARSET_FROM_ID (XFASTINT (XCAR (tail))); + int dim = CHARSET_DIMENSION (charset); + int idx = (dim - 1) * 4; + + if (CHARSET_ASCII_COMPATIBLE_P (charset)) + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; + + for (i = charset->code_space[idx]; + i <= charset->code_space[idx + 1]; i++) + { + Lisp_Object tmp, tmp2; + int dim2; + + tmp = AREF (val, i); + if (NILP (tmp)) + tmp = XCAR (tail); + else if (NUMBERP (tmp)) + { + dim2 = CHARSET_DIMENSION (CHARSET_FROM_ID (XFASTINT (tmp))); + if (dim < dim2) + tmp = Fcons (XCAR (tail), Fcons (tmp, Qnil)); + else + tmp = Fcons (tmp, Fcons (XCAR (tail), Qnil)); + } + else + { + for (tmp2 = tmp; CONSP (tmp2); tmp2 = XCDR (tmp2)) + { + dim2 = CHARSET_DIMENSION (CHARSET_FROM_ID (XFASTINT (XCAR (tmp2)))); + if (dim < dim2) + break; + } + if (NILP (tmp2)) + tmp = nconc2 (tmp, Fcons (XCAR (tail), Qnil)); + else + { + XSETCDR (tmp2, Fcons (XCAR (tmp2), XCDR (tmp2))); + XSETCAR (tmp2, XCAR (tail)); + } + } + ASET (val, i, tmp); + } + } + ASET (attrs, coding_attr_charset_valids, val); + category = coding_category_charset; + } + else if (EQ (coding_type, Qccl)) + { + Lisp_Object valids; + + if (nargs < coding_arg_ccl_max) + goto short_args; -The remaining arguments should be the same arguments that were passed -to the primitive. Depending on which primitive, one of those arguments -is selected as the TARGET. For example, if OPERATION does file I/O, -whichever argument specifies the file name is TARGET. + val = args[coding_arg_ccl_decoder]; + CHECK_CCL_PROGRAM (val); + if (VECTORP (val)) + val = Fcopy_sequence (val); + ASET (attrs, coding_attr_ccl_decoder, val); -TARGET has a meaning which depends on OPERATION: - For file I/O, TARGET is a file name (except for the special case below). - For process I/O, TARGET is a process name. - For network I/O, TARGET is a service name or a port number + val = args[coding_arg_ccl_encoder]; + CHECK_CCL_PROGRAM (val); + if (VECTORP (val)) + val = Fcopy_sequence (val); + ASET (attrs, coding_attr_ccl_encoder, val); -This function looks up what specified for TARGET in, -`file-coding-system-alist', `process-coding-system-alist', -or `network-coding-system-alist' depending on OPERATION. -They may specify a coding system, a cons of coding systems, -or a function symbol to call. -In the last case, we call the function with one argument, -which is a list of all the arguments given to this function. + val = args[coding_arg_ccl_valids]; + valids = Fmake_string (make_number (256), make_number (0)); + for (tail = val; !NILP (tail); tail = Fcdr (tail)) + { + int from, to; -If OPERATION is `insert-file-contents', the argument corresponding to -TARGET may be a cons (FILENAME . BUFFER). In that case, FILENAME is a -file name to look up, and BUFFER is a buffer that contains the file's -contents (not yet decoded). If `file-coding-system-alist' specifies a -function to call for FILENAME, that function should examine the -contents of BUFFER instead of reading the file. + val = Fcar (tail); + if (INTEGERP (val)) + { + from = to = XINT (val); + if (from < 0 || from > 255) + args_out_of_range_3 (val, make_number (0), make_number (255)); + } + else + { + CHECK_CONS (val); + CHECK_NATNUM_CAR (val); + CHECK_NATNUM_CDR (val); + from = XINT (XCAR (val)); + if (from > 255) + args_out_of_range_3 (XCAR (val), + make_number (0), make_number (255)); + to = XINT (XCDR (val)); + if (to < from || to > 255) + args_out_of_range_3 (XCDR (val), + XCAR (val), make_number (255)); + } + for (i = from; i <= to; i++) + SSET (valids, i, 1); + } + ASET (attrs, coding_attr_ccl_valids, valids); -usage: (find-operation-coding-system OPERATION ARGUMENTS ...) */) - (nargs, args) - int nargs; - Lisp_Object *args; -{ - Lisp_Object operation, target_idx, target, val; - register Lisp_Object chain; + category = coding_category_ccl; + } + else if (EQ (coding_type, Qutf_16)) + { + Lisp_Object bom, endian; - if (nargs < 2) - error ("Too few arguments"); - operation = args[0]; - if (!SYMBOLP (operation) - || !INTEGERP (target_idx = Fget (operation, Qtarget_idx))) - error ("Invalid first argument"); - if (nargs < 1 + XINT (target_idx)) - error ("Too few arguments for operation: %s", - SDATA (SYMBOL_NAME (operation))); - /* For write-region, if the 6th argument (i.e. VISIT, the 5th - argument to write-region) is string, it must be treated as a - target file name. */ - if (EQ (operation, Qwrite_region) - && nargs > 5 - && STRINGP (args[5])) - target_idx = make_number (4); - target = args[XINT (target_idx) + 1]; - if (!(STRINGP (target) - || (EQ (operation, Qinsert_file_contents) && CONSP (target) - && STRINGP (XCAR (target)) && BUFFERP (XCDR (target))) - || (EQ (operation, Qopen_network_stream) && INTEGERP (target)))) - error ("Invalid argument %d", XINT (target_idx) + 1); - if (CONSP (target)) - target = XCAR (target); + CODING_ATTR_ASCII_COMPAT (attrs) = Qnil; - chain = ((EQ (operation, Qinsert_file_contents) - || EQ (operation, Qwrite_region)) - ? Vfile_coding_system_alist - : (EQ (operation, Qopen_network_stream) - ? Vnetwork_coding_system_alist - : Vprocess_coding_system_alist)); - if (NILP (chain)) - return Qnil; + if (nargs < coding_arg_utf16_max) + goto short_args; - for (; CONSP (chain); chain = XCDR (chain)) - { - Lisp_Object elt; - elt = XCAR (chain); + bom = args[coding_arg_utf16_bom]; + if (! NILP (bom) && ! EQ (bom, Qt)) + { + CHECK_CONS (bom); + val = XCAR (bom); + CHECK_CODING_SYSTEM (val); + val = XCDR (bom); + CHECK_CODING_SYSTEM (val); + } + ASET (attrs, coding_attr_utf_16_bom, bom); + + endian = args[coding_arg_utf16_endian]; + CHECK_SYMBOL (endian); + if (NILP (endian)) + endian = Qbig; + else if (! EQ (endian, Qbig) && ! EQ (endian, Qlittle)) + error ("Invalid endian: %s", SDATA (SYMBOL_NAME (endian))); + ASET (attrs, coding_attr_utf_16_endian, endian); + + category = (CONSP (bom) + ? coding_category_utf_16_auto + : NILP (bom) + ? (EQ (endian, Qbig) + ? coding_category_utf_16_be_nosig + : coding_category_utf_16_le_nosig) + : (EQ (endian, Qbig) + ? coding_category_utf_16_be + : coding_category_utf_16_le)); + } + else if (EQ (coding_type, Qiso_2022)) + { + Lisp_Object initial, reg_usage, request, flags; + int i; - if (CONSP (elt) - && ((STRINGP (target) - && STRINGP (XCAR (elt)) - && fast_string_match (XCAR (elt), target) >= 0) - || (INTEGERP (target) && EQ (target, XCAR (elt))))) + if (nargs < coding_arg_iso2022_max) + goto short_args; + + initial = Fcopy_sequence (args[coding_arg_iso2022_initial]); + CHECK_VECTOR (initial); + for (i = 0; i < 4; i++) { - val = XCDR (elt); - /* Here, if VAL is both a valid coding system and a valid - function symbol, we return VAL as a coding system. */ - if (CONSP (val)) - return val; - if (! SYMBOLP (val)) - return Qnil; - if (! NILP (Fcoding_system_p (val))) - return Fcons (val, val); - if (! NILP (Ffboundp (val))) + val = Faref (initial, make_number (i)); + if (! NILP (val)) { - val = safe_call1 (val, Flist (nargs, args)); - if (CONSP (val)) - return val; - if (SYMBOLP (val) && ! NILP (Fcoding_system_p (val))) - return Fcons (val, val); + struct charset *charset; + + CHECK_CHARSET_GET_CHARSET (val, charset); + ASET (initial, i, make_number (CHARSET_ID (charset))); + if (i == 0 && CHARSET_ASCII_COMPATIBLE_P (charset)) + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; } - return Qnil; + else + ASET (initial, i, make_number (-1)); } - } - return Qnil; -} -DEFUN ("update-coding-systems-internal", Fupdate_coding_systems_internal, - Supdate_coding_systems_internal, 0, 0, 0, - doc: /* Update internal database for ISO2022 and CCL based coding systems. -When values of any coding categories are changed, you must -call this function. */) - () -{ - int i; + reg_usage = args[coding_arg_iso2022_reg_usage]; + CHECK_CONS (reg_usage); + CHECK_NUMBER_CAR (reg_usage); + CHECK_NUMBER_CDR (reg_usage); - for (i = CODING_CATEGORY_IDX_EMACS_MULE; i < CODING_CATEGORY_IDX_MAX; i++) - { - Lisp_Object val; + request = Fcopy_sequence (args[coding_arg_iso2022_request]); + for (tail = request; ! NILP (tail); tail = Fcdr (tail)) + { + int id; + Lisp_Object tmp; + + val = Fcar (tail); + CHECK_CONS (val); + tmp = XCAR (val); + CHECK_CHARSET_GET_ID (tmp, id); + CHECK_NATNUM_CDR (val); + if (XINT (XCDR (val)) >= 4) + error ("Invalid graphic register number: %d", XINT (XCDR (val))); + XSETCAR (val, make_number (id)); + } - val = SYMBOL_VALUE (XVECTOR (Vcoding_category_table)->contents[i]); - if (!NILP (val)) + flags = args[coding_arg_iso2022_flags]; + CHECK_NATNUM (flags); + i = XINT (flags); + if (EQ (args[coding_arg_charset_list], Qiso_2022)) + flags = make_number (i | CODING_ISO_FLAG_FULL_SUPPORT); + + ASET (attrs, coding_attr_iso_initial, initial); + ASET (attrs, coding_attr_iso_usage, reg_usage); + ASET (attrs, coding_attr_iso_request, request); + ASET (attrs, coding_attr_iso_flags, flags); + setup_iso_safe_charsets (attrs); + + if (i & CODING_ISO_FLAG_SEVEN_BITS) + category = ((i & (CODING_ISO_FLAG_LOCKING_SHIFT + | CODING_ISO_FLAG_SINGLE_SHIFT)) + ? coding_category_iso_7_else + : EQ (args[coding_arg_charset_list], Qiso_2022) + ? coding_category_iso_7 + : coding_category_iso_7_tight); + else { - if (! coding_system_table[i]) - coding_system_table[i] = ((struct coding_system *) - xmalloc (sizeof (struct coding_system))); - setup_coding_system (val, coding_system_table[i]); + int id = XINT (AREF (initial, 1)); + + category = (((i & CODING_ISO_FLAG_LOCKING_SHIFT) + || EQ (args[coding_arg_charset_list], Qiso_2022) + || id < 0) + ? coding_category_iso_8_else + : (CHARSET_DIMENSION (CHARSET_FROM_ID (id)) == 1) + ? coding_category_iso_8_1 + : coding_category_iso_8_2); } - else if (coding_system_table[i]) + if (category != coding_category_iso_8_1 + && category != coding_category_iso_8_2) + CODING_ATTR_ASCII_COMPAT (attrs) = Qnil; + } + else if (EQ (coding_type, Qemacs_mule)) + { + if (EQ (args[coding_arg_charset_list], Qemacs_mule)) + ASET (attrs, coding_attr_emacs_mule_full, Qt); + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; + category = coding_category_emacs_mule; + } + else if (EQ (coding_type, Qshift_jis)) + { + + struct charset *charset; + + if (XINT (Flength (charset_list)) != 3 + && XINT (Flength (charset_list)) != 4) + error ("There should be three or four charsets"); + + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 1) + error ("Dimension of charset %s is not one", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); + if (CHARSET_ASCII_COMPATIBLE_P (charset)) + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; + + charset_list = XCDR (charset_list); + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 1) + error ("Dimension of charset %s is not one", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); + + charset_list = XCDR (charset_list); + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 2) + error ("Dimension of charset %s is not two", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); + + charset_list = XCDR (charset_list); + if (! NILP (charset_list)) { - xfree (coding_system_table[i]); - coding_system_table[i] = NULL; + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 2) + error ("Dimension of charset %s is not two", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); } + + category = coding_category_sjis; + Vsjis_coding_system = name; } + else if (EQ (coding_type, Qbig5)) + { + struct charset *charset; - return Qnil; -} + if (XINT (Flength (charset_list)) != 2) + error ("There should be just two charsets"); -DEFUN ("set-coding-priority-internal", Fset_coding_priority_internal, - Sset_coding_priority_internal, 0, 0, 0, - doc: /* Update internal database for the current value of `coding-category-list'. -This function is internal use only. */) - () -{ - int i = 0, idx; - Lisp_Object val; + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 1) + error ("Dimension of charset %s is not one", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); + if (CHARSET_ASCII_COMPATIBLE_P (charset)) + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; - val = Vcoding_category_list; + charset_list = XCDR (charset_list); + charset = CHARSET_FROM_ID (XINT (XCAR (charset_list))); + if (CHARSET_DIMENSION (charset) != 2) + error ("Dimension of charset %s is not two", + SDATA (SYMBOL_NAME (CHARSET_NAME (charset)))); - while (CONSP (val) && i < CODING_CATEGORY_IDX_MAX) + category = coding_category_big5; + Vbig5_coding_system = name; + } + else if (EQ (coding_type, Qraw_text)) { - if (! SYMBOLP (XCAR (val))) - break; - idx = XFASTINT (Fget (XCAR (val), Qcoding_category_index)); - if (idx >= CODING_CATEGORY_IDX_MAX) - break; - coding_priorities[i++] = (1 << idx); - val = XCDR (val); + category = coding_category_raw_text; + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; + } + else if (EQ (coding_type, Qutf_8)) + { + category = coding_category_utf_8; + CODING_ATTR_ASCII_COMPAT (attrs) = Qt; + } + else if (EQ (coding_type, Qundecided)) + category = coding_category_undecided; + else + error ("Invalid coding system type: %s", + SDATA (SYMBOL_NAME (coding_type))); + + CODING_ATTR_CATEGORY (attrs) = make_number (category); + CODING_ATTR_PLIST (attrs) + = Fcons (QCcategory, Fcons (AREF (Vcoding_category_table, category), + CODING_ATTR_PLIST (attrs))); + CODING_ATTR_PLIST (attrs) + = Fcons (QCascii_compatible_p, + Fcons (CODING_ATTR_ASCII_COMPAT (attrs), + CODING_ATTR_PLIST (attrs))); + + eol_type = args[coding_arg_eol_type]; + if (! NILP (eol_type) + && ! EQ (eol_type, Qunix) + && ! EQ (eol_type, Qdos) + && ! EQ (eol_type, Qmac)) + error ("Invalid eol-type"); + + aliases = Fcons (name, Qnil); + + if (NILP (eol_type)) + { + eol_type = make_subsidiaries (name); + for (i = 0; i < 3; i++) + { + Lisp_Object this_spec, this_name, this_aliases, this_eol_type; + + this_name = AREF (eol_type, i); + this_aliases = Fcons (this_name, Qnil); + this_eol_type = (i == 0 ? Qunix : i == 1 ? Qdos : Qmac); + this_spec = Fmake_vector (make_number (3), attrs); + ASET (this_spec, 1, this_aliases); + ASET (this_spec, 2, this_eol_type); + Fputhash (this_name, this_spec, Vcoding_system_hash_table); + Vcoding_system_list = Fcons (this_name, Vcoding_system_list); + val = Fassoc (Fsymbol_name (this_name), Vcoding_system_alist); + if (NILP (val)) + Vcoding_system_alist + = Fcons (Fcons (Fsymbol_name (this_name), Qnil), + Vcoding_system_alist); + } } - /* If coding-category-list is valid and contains all coding - categories, `i' should be CODING_CATEGORY_IDX_MAX now. If not, - the following code saves Emacs from crashing. */ - while (i < CODING_CATEGORY_IDX_MAX) - coding_priorities[i++] = CODING_CATEGORY_MASK_RAW_TEXT; + + spec_vec = Fmake_vector (make_number (3), attrs); + ASET (spec_vec, 1, aliases); + ASET (spec_vec, 2, eol_type); + + Fputhash (name, spec_vec, Vcoding_system_hash_table); + Vcoding_system_list = Fcons (name, Vcoding_system_list); + val = Fassoc (Fsymbol_name (name), Vcoding_system_alist); + if (NILP (val)) + Vcoding_system_alist = Fcons (Fcons (Fsymbol_name (name), Qnil), + Vcoding_system_alist); + + { + int id = coding_categories[category].id; + + if (id < 0 || EQ (name, CODING_ID_NAME (id))) + setup_coding_system (name, &coding_categories[category]); + } return Qnil; + + short_args: + return Fsignal (Qwrong_number_of_arguments, + Fcons (intern ("define-coding-system-internal"), + make_number (nargs))); } -DEFUN ("define-coding-system-internal", Fdefine_coding_system_internal, - Sdefine_coding_system_internal, 1, 1, 0, - doc: /* Register CODING-SYSTEM as a base coding system. -This function is internal use only. */) - (coding_system) - Lisp_Object coding_system; + +DEFUN ("coding-system-put", Fcoding_system_put, Scoding_system_put, + 3, 3, 0, + doc: /* Change value in CODING-SYSTEM's property list PROP to VAL. */) + (coding_system, prop, val) + Lisp_Object coding_system, prop, val; { - Lisp_Object safe_chars, slot; + Lisp_Object spec, attrs; - if (NILP (Fcheck_coding_system (coding_system))) - Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil)); - safe_chars = coding_safe_chars (coding_system); - if (! EQ (safe_chars, Qt) && ! CHAR_TABLE_P (safe_chars)) - error ("No valid safe-chars property for %s", - SDATA (SYMBOL_NAME (coding_system))); - if (EQ (safe_chars, Qt)) + CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec); + attrs = AREF (spec, 0); + if (EQ (prop, QCmnemonic)) { - if (NILP (Fmemq (coding_system, XCAR (Vcoding_system_safe_chars)))) - XSETCAR (Vcoding_system_safe_chars, - Fcons (coding_system, XCAR (Vcoding_system_safe_chars))); + if (! STRINGP (val)) + CHECK_CHARACTER (val); + CODING_ATTR_MNEMONIC (attrs) = val; } - else + else if (EQ (prop, QCdefalut_char)) { - slot = Fassq (coding_system, XCDR (Vcoding_system_safe_chars)); - if (NILP (slot)) - XSETCDR (Vcoding_system_safe_chars, - nconc2 (XCDR (Vcoding_system_safe_chars), - Fcons (Fcons (coding_system, safe_chars), Qnil))); + if (NILP (val)) + val = make_number (' '); else - XSETCDR (slot, safe_chars); + CHECK_CHARACTER (val); + CODING_ATTR_DEFAULT_CHAR (attrs) = val; + } + else if (EQ (prop, QCdecode_translation_table)) + { + if (! CHAR_TABLE_P (val) && ! CONSP (val)) + CHECK_SYMBOL (val); + CODING_ATTR_DECODE_TBL (attrs) = val; + } + else if (EQ (prop, QCencode_translation_table)) + { + if (! CHAR_TABLE_P (val) && ! CONSP (val)) + CHECK_SYMBOL (val); + CODING_ATTR_ENCODE_TBL (attrs) = val; + } + else if (EQ (prop, QCpost_read_conversion)) + { + CHECK_SYMBOL (val); + CODING_ATTR_POST_READ (attrs) = val; + } + else if (EQ (prop, QCpre_write_conversion)) + { + CHECK_SYMBOL (val); + CODING_ATTR_PRE_WRITE (attrs) = val; + } + else if (EQ (prop, QCascii_compatible_p)) + { + CODING_ATTR_ASCII_COMPAT (attrs) = val; + } + + CODING_ATTR_PLIST (attrs) + = Fplist_put (CODING_ATTR_PLIST (attrs), prop, val); + return val; +} + + +DEFUN ("define-coding-system-alias", Fdefine_coding_system_alias, + Sdefine_coding_system_alias, 2, 2, 0, + doc: /* Define ALIAS as an alias for CODING-SYSTEM. */) + (alias, coding_system) + Lisp_Object alias, coding_system; +{ + Lisp_Object spec, aliases, eol_type, val; + + CHECK_SYMBOL (alias); + CHECK_CODING_SYSTEM_GET_SPEC (coding_system, spec); + aliases = AREF (spec, 1); + /* ALISES should be a list of length more than zero, and the first + element is a base coding system. Append ALIAS at the tail of the + list. */ + while (!NILP (XCDR (aliases))) + aliases = XCDR (aliases); + XSETCDR (aliases, Fcons (alias, Qnil)); + + eol_type = AREF (spec, 2); + if (VECTORP (eol_type)) + { + Lisp_Object subsidiaries; + int i; + + subsidiaries = make_subsidiaries (alias); + for (i = 0; i < 3; i++) + Fdefine_coding_system_alias (AREF (subsidiaries, i), + AREF (eol_type, i)); } + + Fputhash (alias, spec, Vcoding_system_hash_table); + Vcoding_system_list = Fcons (alias, Vcoding_system_list); + val = Fassoc (Fsymbol_name (alias), Vcoding_system_alist); + if (NILP (val)) + Vcoding_system_alist = Fcons (Fcons (Fsymbol_name (alias), Qnil), + Vcoding_system_alist); + return Qnil; } diff --cc src/lread.c index b6161ebedaa,31f974d9bc0..d8abde1c458 --- a/src/lread.c +++ b/src/lread.c @@@ -89,13 -87,8 +89,14 @@@ Lisp_Object Qascii_character, Qload, Ql Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction; Lisp_Object Qinhibit_file_name_operation; Lisp_Object Qeval_buffer_list, Veval_buffer_list; + Lisp_Object Qfile_truename, Qdo_after_load_evaluation; /* ACM 2006/5/16 */ +/* Used instead of Qget_file_char while loading *.elc files compiled + by Emacs 21 or older. */ +static Lisp_Object Qget_emacs_mule_file_char; + +static Lisp_Object Qload_force_doc_strings; + extern Lisp_Object Qevent_symbol_element_mask; extern Lisp_Object Qfile_exists_p; @@@ -906,8 -728,7 +907,9 @@@ Return t if the file exists and loads s Lisp_Object handler; int safe_p = 1; char *fmode = "r"; + Lisp_Object tmp[2]; + int version; + #ifdef DOS_NT fmode = "rt"; #endif /* DOS_NT */ @@@ -1028,10 -848,15 +1029,17 @@@ Vloads_in_progress = Fcons (found, Vloads_in_progress); } + /* Get the name for load-history. */ + hist_file_name = (! NILP (Vpurify_flag) + ? Fconcat (2, (tmp[0] = Ffile_name_directory (file), + tmp[1] = Ffile_name_nondirectory (found), + tmp)) + : found) ; + + version = -1; if (!bcmp (SDATA (found) + SBYTES (found) - 4, - ".elc", 4)) + ".elc", 4) + || (version = safe_to_load_p (fd)) > 0) /* Load .elc files directly, but not when they are remote and have no handler! */ { @@@ -1040,10 -865,9 +1048,10 @@@ struct stat s1, s2; int result; - GCPRO2 (file, found); + GCPRO3 (file, found, hist_file_name); - if (!safe_to_load_p (fd)) + if (version < 0 + && ! (version = safe_to_load_p (fd))) { safe_p = 0; if (!load_dangerous_libraries) @@@ -1141,24 -965,15 +1149,24 @@@ load_descriptor_list = Fcons (make_number (fileno (stream)), load_descriptor_list); load_in_progress++; - readevalloop (Qget_file_char, stream, hist_file_name, - Feval, 0, Qnil, Qnil, Qnil, Qnil); + if (! version || version >= 22) - readevalloop (Qget_file_char, stream, - (! NILP (Vpurify_flag) ? file : found), ++ readevalloop (Qget_file_char, stream, hist_file_name, + Feval, 0, Qnil, Qnil, Qnil, Qnil); + else + { + /* We can't handle a file which was compiled with + byte-compile-dynamic by older version of Emacs. */ + specbind (Qload_force_doc_strings, Qt); - readevalloop (Qget_emacs_mule_file_char, stream, file, Feval, ++ readevalloop (Qget_emacs_mule_file_char, stream, hist_file_name, Feval, + 0, Qnil, Qnil, Qnil, Qnil); + } unbind_to (count, Qnil); - /* Run any load-hooks for this file. */ - temp = Fassoc (file, Vafter_load_alist); - if (!NILP (temp)) - Fprogn (Fcdr (temp)); + /* Run any eval-after-load forms for this file */ + if (NILP (Vpurify_flag) + && (!NILP (Ffboundp (Qdo_after_load_evaluation)))) + call1 (Qdo_after_load_evaluation, hist_file_name) ; + UNGCPRO; if (saved_doc_string) @@@ -1581,8 -1396,16 +1589,14 @@@ readevalloop (readcharfun, stream, sour record_unwind_protect (readevalloop_1, load_convert_to_unibyte ? Qt : Qnil); load_convert_to_unibyte = !NILP (unibyte); - readchar_backlog = -1; - GCPRO4 (sourcename, readfun, start, end); + /* Try to ensure sourcename is a truename, except whilst preloading. */ + if (NILP (Vpurify_flag) + && !NILP (sourcename) && Ffile_name_absolute_p (sourcename) + && (!NILP (Ffboundp (Qfile_truename)))) + sourcename = call1 (Qfile_truename, sourcename) ; + LOADHIST_ATTACH (sourcename); continue_reading_p = 1; diff --cc src/xfaces.c index 2b2f1620133,df303e401fd..9adc9218f6d --- a/src/xfaces.c +++ b/src/xfaces.c @@@ -7485,10 -7070,10 +7484,10 @@@ realize_default_face (f xassert (lface_fully_specified_p (XVECTOR (lface)->contents)); check_lface (lface); bcopy (XVECTOR (lface)->contents, attrs, sizeof attrs); - face = realize_face (c, attrs, 0, NULL, DEFAULT_FACE_ID); + face = realize_face (c, attrs, DEFAULT_FACE_ID); #ifdef HAVE_WINDOW_SYSTEM - #ifdef HAVE_X_WINDOWS + #ifdef HAVE_X_WINDOWS if (face->font != FRAME_FONT (f)) /* As the font specified for the frame was not acceptable as a font for the default face (perhaps because auto-scaled fonts