GNU Emacs NEWS -- history of user-visible changes. Copyright (C) 2017-2020 Free Software Foundation, Inc. See the end of the file for license conditions. Please send Emacs bug reports to 'bug-gnu-emacs@gnu.org'. If possible, use 'M-x report-emacs-bug'. This file is about changes in Emacs version 28. See file HISTORY for a list of GNU Emacs versions and release dates. See files NEWS.27, NEWS.26, ..., NEWS.18, and NEWS.1-17 for changes in older Emacs versions. You can narrow news to a specific version by calling 'view-emacs-news' with a prefix argument or by typing 'C-u C-h C-n'. Temporary note: +++ indicates that all relevant manuals in doc/ have been updated. --- means no change in the manuals is needed. When you add a new item, use the appropriate mark if you are sure it applies, and please also update docstrings as needed. * Installation Changes in Emacs 28.1 ** Cairo graphics library is now used by default if found. '--with-cairo' is now the default, if the appropriate development files are found by 'configure'. Note that building with Cairo means using Pango instead of libXFT for font support. Since Pango 1.44 has removed support for bitmapped fonts, this may require you to adjust your font settings. Note also that 'FontBackend' settings in ".Xdefaults" or ".Xresources", or 'font-backend' frame parameter settings in your init files, may need to be adjusted, as 'xft' is no longer a valid backend when using Cairo. Use 'ftcrhb' if your Emacs was built with HarfBuzz text shaping support, and 'ftcr' otherwise. You can determine this by checking 'system-configuration-features'. The 'ftcr' backend will still be available when HarfBuzz is supported, but will not be used by default. We strongly recommend building with HarBuzz support. 'x' is still a valid backend. --- ** 'configure' now warns about building with libXft support. libXft is unmaintained, and causes a number of problems with modern fonts including but not limited to crashes; support for it may be removed in a future version of Emacs. Please consider using Cairo + HarfBuzz instead. --- ** 'configure' now warns about not using HarfBuzz if using Cairo. We want to encourage people to use the most modern font features available, and this is the Cairo graphics library + HarfBuzz for font shaping, so 'configure' now recommends that combination. --- ** The ftx font backend driver has been removed. It was declared obsolete in Emacs 27.1. * Startup Changes in Emacs 28.1 * Changes in Emacs 28.1 ** Support for '(box . SIZE)' 'cursor-type'. By default, 'box' cursor always has a filled box shape. But if you specify 'cursor-type' to be '(box . SIZE)', the cursor becomes a hollow box if the point is on an image larger than 'SIZE' pixels in any dimension. --- *** Improved language transliteration in Malayalam input methods. Added a new Mozhi scheme. The inapplicable ITRANS scheme is now deprecated. Errors in the Inscript method were corrected. * Editing Changes in Emacs 28.1 +++ ** New command 'undo-redo'. It undoes previous undo commands, but doesn't record itself as an undoable command. +++ ** 'read-number' now has its own history variable. Additionally, the function now accepts a HIST argument which can be used to specify a custom history variable. +++ ** Input history for 'goto-line' is now local to every buffer. Each buffer will keep a separate history of line numbers used with 'goto-line'. This should help making faster the process of finding line numbers that were previously jumped to. +++ ** When 'suggest-key-bindings' is non-nil, the completion list of 'M-x' shows equivalent key bindings for all commands that have them. --- ** Movement commands in 'gomoku-mode' are fixed. 'gomoku-move-sw' and 'gomoku-move-ne' now work correctly, and horizontal movements now stop at the edge of the board. ** Autosaving via 'auto-save-visited-mode' can now be inhibited by setting the variable 'auto-save-visited-mode' buffer-locally to nil. * Changes in Specialized Modes and Packages in Emacs 28.1 ** New bindings in occur-mode, 'next-error-no-select' bound to 'n' and 'previous-error-no-select' bound to 'p'. ** EIEIO: 'oset' and 'oset-default' are declared obsolete. ** New minor mode 'cl-font-lock-built-in-mode' for `lisp-mode'. The mode provides refined highlighting of built-in functions, types, and variables. ** Archive mode *** Can now modify members of 'ar' archives. *** Display of summaries unified between backends. *** New user option 'archive-hidden-columns' and command 'archive-hideshow-column'. These let you control which columns are displayed and which are kept hidden. ** Emacs Lisp mode *** The mode-line now indicates whether we're using lexical or dynamic scoping. *** A space between an open paren and a symbol changes the indentation rule. The presence of a space between an open paren and a symbol now is taken as a statement by the programmer that this should be indented as a data list rather than as a piece of code. ** Dired *** New user option 'dired-mark-region' affects all Dired commands that mark files. When non-nil and the region is active in Transient Mark mode, then Dired commands operate only on files in the active region. The values 'file' and 'line' of this user option define the details of marking the file at the end of the region. *** State changing VC operations are supported in Dired on files and directories with the help of new command 'dired-vc-next-action'. ** Change Logs and VC *** New command 'vc-dir-root' uses the root directory without asking. *** New commands 'vc-dir-mark-registered-files' (bound to '* r') and 'vc-dir-mark-unregistered-files'. *** Support for bookmark.el. Bookmark locations can refer to VC directory buffers. ** Gnus --- *** Change to default value of 'message-draft-headers' user option. The 'Date' symbol has been removed from the default value, meaning that draft or delayed messages will get a date reflecting when the message was sent. To restore the original behavior of dating a message from when it is first saved or delayed, add the symbol 'Date' back to this user option. ** Help +++ *** New command 'describe-keymap' describes keybindings in a keymap. --- ** The old non-SMIE indentation of 'sh-mode' has been removed. --- ** The sb-image.el library is now marked obsolete. This file was a compatibility kludge which is no longer needed. --- ** Lisp mode now uses 'common-lisp-indent-function'. To revert to the previous behaviour, '(setq lisp-indent-function 'lisp-indent-function)' from 'lisp-mode-hook'. ** Edebug +++ *** Edebug specification lists can use the new keyword '&error', which unconditionally aborts the current edebug instrumentation with the supplied error message. +++ ** ElDoc *** New hook 'eldoc-documentation-functions' to be used for registering doc string functions. This makes the results of all doc string functions accessible to the user through the existing single function hook 'eldoc-documentation-function'. *** 'eldoc-documentation-function' is now a user option. Modes should use the new hook instead of this user option to register their backends. ** Eshell --- *** Environment variable 'INSIDE_EMACS' is now copied to subprocesses. Its value equals the result of evaluating '(format "%s,eshell" emacs-version)'. --- *** Eshell no longer re-initializes its keymap every call. This allows users to use (define-key eshell-mode-map ...) as usual. Some modules have their own minor mode now to account for these changes. ** Tramp +++ *** New connection method "media", which allows accessing media devices like cell phones, tablets or cameras. ** Tempo --- *** 'tempo-define-template' can now re-assign templates to tags. Previously, assigning a new template to an already defined tag had no effect. ** map.el *** Pcase 'map' pattern added keyword symbols abbreviation. A pattern like '(map :sym)' binds the map's value for ':sym' to 'sym', equivalent to '(map (:sym sym))'. ** Package +++ *** New functions to filter the package list. The filter command key bindings are as follows: key binding --- ------- / a package-menu-filter-by-archive / k package-menu-filter-by-keyword / n package-menu-filter-by-name / s package-menu-filter-by-status / v package-menu-filter-by-version / m package-menu-filter-marked / / package-menu-filter-clear --- +++ Column widths in 'list-packages' display can now be customized. See the new user options 'package-name-column-width', 'package-version-column-width', 'package-status-column-width', and 'package-archive-column-width'. ** gdb-mi +++ *** gdb-mi can now store and restore window configurations. Use 'gdb-save-window-configuration' to save window configuration to a file and 'gdb-load-window-configuration' to load from a file. These commands can also be accessed through the menu bar under 'Gud -- GDB-Windows'. 'gdb-default-window-configuration-file', when non-nil, is loaded when GDB starts up. +++ *** gdb-mi can now restore window configuration after quit. Set 'gdb-restore-window-configuration-after-quit' to non-nil and Emacs will remember the window configuration before GDB started and restore it after GDB quits. A toggle button is also provided under 'Gud -- GDB-Windows'. +++ *** gdb-mi now has a better logic for displaying source buffers. Now GDB only uses one source window to display source file by default. Customize 'gdb-max-source-window-count' to use more than one window. Control source file display by 'gdb-display-source-buffer-action'. ** Gravatar --- *** New user option 'gravatar-service' for host to query for gravatars. Defaults to 'libravatar', with 'unicornify' and 'gravatar' as options. ** Compilation mode *** Regexp matching of messages is now case-sensitive by default. The variable 'compilation-error-case-fold-search' can be set for case-insensitive matching of messages when the old behaviour is required, but the recommended solution is to use a correctly matching regexp instead. ** Hi Lock mode --- *** Matching in 'hi-lock-mode' is case-sensitive when regexp contains upper case characters and 'search-upper-case' is non-nil. 'highlight-phrase' also uses 'search-whitespace-regexp' to substitute spaces in regexp search. --- *** The default value of 'hi-lock-highlight-range' was enlarged. The new default value is 2000000 (2 megabytes). ** Texinfo --- *** New user option 'texinfo-texi2dvi-options'. This is used when invoking 'texi2dvi' from 'texinfo-tex-buffer'. ** Rmail --- *** New user option 'rmail-re-abbrevs'. Its default value matches localized abbreviations of the "reply" prefix on the Subject line in various languages. ** Apropos *** New commands 'apropos-next-symbol' and 'apropos-previous-symbol'. These new navigation commands are bound to 'n' and 'p' in 'apropos-mode'. ** CC mode *** Added support for Doxygen documentation style. 'doxygen' is now a valid 'c-doc-comment-style' which recognises all comment styles supported by Doxygen (namely '///', '//!', '/** … */' and '/*! … */'. 'gtkdoc' remains the default for C and C++ modes; to use 'doxygen' by default one might evaluate: (setq-default c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) (c-mode . doxygen) (c++-mode . doxygen))) or use it in a custom 'c-style'. *** Added support to line up '?' and ':' of a ternary operator. The new 'c-lineup-ternary-bodies' function can be used as a lineup function to align question mark and colon which are part of a ternary operator ('?:'). For example: return arg % 2 == 0 ? arg / 2 : (3 * arg + 1); To enable, add it to appropriate entries in 'c-offsets-alist', e.g.: (c-set-offset 'arglist-cont '(c-lineup-ternary-bodies c-lineup-gcc-asm-reg)) (c-set-offset 'arglist-cont-nonempty '(c-lineup-ternary-bodies c-lineup-gcc-asm-reg c-lineup-arglist)) (c-set-offset 'statement-cont '(c-lineup-ternary-bodies +)) ** browse-url *** Added support for custom URL handlers. There is a new variable 'browse-url-default-handlers' and a user option 'browse-url-handlers' being alists with '(REGEXP-OR-PREDICATE . FUNCTION)' entries allowing to define different browsing FUNCTIONs depending on the URL to be browsed. The variable is for default handlers provided by Emacs itself or external packages, the user option is for the user (and allows for overriding the default handlers). Formerly, one could do the same by setting 'browse-url-browser-function' to such an alist. This usage is still supported but deprecated. *** Categorization of browsing functions in internal vs. external. All standard browsing functions such as 'browse-url-firefox', 'browse-url-mail', or 'eww' have been categorized into internal (URL is browsed in Emacs) or external (an external application is spawned with the URL). This is done by adding a 'browse-url-browser-kind' symbol property to the browsing functions. With a new command 'browse-url-with-browser-kind', an URL can explicitly be browsed with either an internal or external browser. *** Support for the conkeror browser is now obsolete. ** SHR --- *** The command 'shr-browse-url' now supports custom mailto handlers. Clicking on or otherwise following a 'mailto:' link in a HTML buffer rendered by SHR previously invoked the command 'browse-url-mailto'. This is still the case by default, but if you customize 'browse-url-mailto-function' or 'browse-url-handlers' to call some other function, it will now be called instead of the default. ** EWW --- *** The command 'eww-follow-link' now supports custom mailto handlers. The function that is invoked when clicking on or otherwise following a 'mailto:' link in an EWW buffer can now be customized. For more information, see the related entry about 'shr-browse-url' above. ** Project *** New user option 'project-vc-merge-submodules'. *** Previously used project directories are now suggested by all commands that prompt for a project directory. +++ *** New commands 'project-dired', 'project-vc-dir', 'project-shell', 'project-eshell'. These commands run Dired/VC-Dir and Shell/Eshell in a project's root directory, respectively. *** New command 'project-compile', which runs compilation. +++ *** New command 'project-switch-project'. This command lets you "switch" to another project and run a project command chosen from a dispatch menu. *** New user option 'project-list-file'. ** json.el --- *** JSON number parsing is now stricter. Numbers with a leading plus sign, leading zeros, or a missing integer component are now rejected by 'json-read' and friends. This makes them more compliant with the JSON specification and consistent with the native JSON parsing functions. ** xml.el *** XML serialization functions now reject invalid characters. Previously 'xml-print' would produce invalid XML when given a string with characters that are not valid in XML (see https://www.w3.org/TR/xml/#charsets). Now it rejects such strings. ** The metamail.el library is now marked obsolete. * New Modes and Packages in Emacs 28.1 ** Lisp Data mode The new command 'lisp-data-mode' enables a major mode for buffers composed of Lisp symbolic expressions that do not form a computer program. The ".dir-locals.el" file is automatically set to use this mode, as are other data files produced by Emacs. * Incompatible Editing Changes in Emacs 28.1 ** In 'nroff-mode', 'center-line' is now bound to 'M-o M-s'. The original key binding was 'M-s', which interfered with I-search, since the latter uses 'M-s' as a prefix key of the search prefix map. ** 'vc-print-branch-log' shows the change log for BRANCH from its root directory instead of the default directory. * Incompatible Lisp Changes in Emacs 28.1 ** 'equal' no longer examines some contents of window configurations. Instead, it considers window configurations to be equal only if they are 'eq'. To compare contents, use 'compare-window-configurations' instead. This change helps fix a bug in 'sxhash-equal', which returned incorrect hashes for window configurations and some other objects. --- ** The obsolete function 'thread-alive-p' has been removed. ** 'dns-query' now consistently uses Lisp integers to represent integers. Formerly it made an exception for integer components of SOA records, because SOA serial numbers can exceed fixnum ranges on 32-bit platforms. Emacs now supports bignums so this old glitch is no longer needed. ** The Lisp variables 'previous-system-messages-locale' and 'previous-system-time-locale' have been removed, as they were created by mistake and were not useful to Lisp code. ** The 'load-dangerous-libraries' variable is now obsolete. It was used to allow loading Lisp libraries compiled by XEmacs, a modified version of Emacs which is no longer actively maintained. This is no longer supported, and setting this variable has no effect. +++ ** The macro 'with-displayed-buffer-window' is now obsolete. Use macro 'with-current-buffer-window' with action alist entry 'body-function'. --- ** Some libraries obsolete since Emacs 23 have been removed: 'ledit.el', 'lmenu.el', 'lucid.el and 'old-whitespace.el'. * Lisp Changes in Emacs 28.1 +++ ** New function 'file-modes-number-to-symbolic' to convert a numeric file mode specification into symbolic form. ** New macro 'dlet' to dynamically bind variables. ** The variable 'force-new-style-backquotes' has been removed. This removes the final remaining trace of old-style backquotes. ** The module header 'emacs-module.h' now contains type aliases 'emacs_function' and 'emacs_finalizer' for module functions and finalizers, respectively. ** Module functions can now install an optional finalizer that is called when the function object is garbage-collected. Use 'set_function_finalizer' to set the finalizer and 'get_function_finalizer' to retrieve it. ** Modules can now open a channel to an existing pipe process using the new module function 'open_channel'. Modules can use this functionality to asynchronously send data back to Emacs. ** 'file-modes', 'set-file-modes', and 'set-file-times' now have an optional argument specifying whether to follow symbolic links. ** 'parse-time-string' can now parse ISO 8601 format strings, such as "2020-01-15T16:12:21-08:00". +++ ** The new function 'dom-remove-attribute' has been added. --- ** 'make-network-process', 'make-serial-process' ':coding' behavior change. Previously, passing ':coding nil' to either of these functions would override any non-nil binding for 'coding-system-for-read' and 'coding-system-for-write'. For consistency with 'make-process' and 'make-pipe-process', passing ':coding nil' is now ignored. No code in Emacs depended on the previous behavior; if you really want the process' coding-system to be nil, use 'set-process-coding-system' after the process has been created, or pass in ':coding '(nil nil)'. +++ ** 'open-network-stream' now accepts a ':coding' argument. This allows specifying the coding systems used by a network process for encoding and decoding without having to bind 'coding-system-for-{read,write}' or call 'set-process-coding-system'. +++ ** 'open-gnutls-stream' now also accepts a ':coding' argument. +++ ** New user option 'process-file-return-signal-string'. It controls, whether 'process-file' returns a string when a remote process is interrupted by a signal. * Changes in Emacs 28.1 on Non-Free Operating Systems +++ ** On macOS, Emacs can now load dynamic modules with a ".dylib" suffix. 'module-file-suffix' now has the value ".dylib" on macOS, but the ".so" suffix is supported as well. +++ ** On MS-Windows, Emacs can now toggle the IME. A new function 'w32-set-ime-open-status' can now be used to disable and enable the MS-Windows native Input Method Editor (IME) at run time. A companion function 'w32-get-ime-open-status' returns the current IME activation status. +++ ** On MS-Windows, Emacs can now use the native image API to display images. Emacs can now use the MS-Windows GDI+ library to load and display images in JPEG, PNG, GIF and TIFF formats. This support is enabled unless Emacs was configured '--without-native-image-api'. This feature is experimental, and needs to be turned on to be used. To turn this on, set the variable 'w32-use-native-image-API' to a non-nil value. Please report any bugs you find while using the native image API via 'M-x report-emacs-bug'. ---------------------------------------------------------------------- This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . Local variables: coding: utf-8 mode: outline paragraph-separate: "[ ]*$" end: