GNU Emacs NEWS -- history of user-visible changes. Copyright (C) 2021 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 29. See file HISTORY for a list of GNU Emacs versions and release dates. See files NEWS.28, NEWS.27, ..., 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 29.1 ** Emacs now installs the ".pdmp" file using a unique fingerprint in the name. The file is typically installed using a file name akin to "...dir/libexec/emacs/29.1/x86_64-pc-linux-gnu/emacs-.pdmp". If a constant file name is required, the file can be renamed to "emacs.pdmp", and Emacs will find it during startup anyway. * Startup Changes in Emacs 29.1 +++ ** Emacs now has a '--fingerprint' option. This will output a string identifying the current Emacs build. +++ ** New hook 'after-pdump-load-hook'. This is run at the end of the Emacs startup process, and it meant to be used to reinitialize structures that would normally be done at load time. * Changes in Emacs 29.1 ** Emoji +++ *** Emacs now has several new methods for inserting Emojis. The Emoji commands are under the new 'C-x 8 e' prefix. +++ *** New command 'emoji-insert' (bound to 'C-x 8 e e' and 'C-x 8 e i'). This command guides you through various Emoji categories and combinations in a graphical menu system. +++ *** New command 'emoji-search' (bound to 'C-x 8 e s'). This command lets you search for Emojis based on names. +++ *** New command 'emoji-list' (bound to 'C-x 8 e l'). This command lists all Emojis (categorized by themes) in a special buffer and lets you choose one of them. --- *** New command 'emoji-recent' (bound to 'C-x 8 e r'). This command lets you choose among the Emojis you have recently inserted. +++ *** New command 'emoji-describe' (bound to 'C-x 8 e d'). This command will tell you the name of the Emoji at point. (This command also works for non-Emoji characters.) ** Help --- *** 'C-h b' uses outlining by default. Set 'describe-bindings-outline' to nil to get the old behaviour. --- *** Jumping to function/variable source now saves mark before moving point. Jumping to source from "*Help*" buffer moves the point when the source buffer is already open. Now, the old point is pushed to mark ring. +++ *** New key bindings in *Help* buffers: 'n' and 'p'. These will take you (respectively) to the next and previous "page". --- *** 'describe-char' now also outputs the name of emoji combinations. ** Outline Minor Mode +++ *** New user option 'outline-minor-mode-use-buttons'. If non-nil, Outline Minor Mode will use buttons to hide/show outlines in addition to the ellipsis. --- *** New user option 'outline-minor-mode-buttons'. This is a list of pairs of open/close strings used to display buttons. ** Fonts --- *** Emacs now supports "medium" fonts. Emacs previously didn't distinguish between the "regular" weight and the "medium" weight, but it now also supports the (heavier) "medium" weight. +++ ** Support for the WebP image format. This support is built by default when the libwebp library is available. To disable it, use the '--without-webp' configure flag. Image specifiers can now use ':type webp'. ** Windows +++ *** 'display-buffer' now can set up the body size of the chosen window. For example, an alist entry as '(window-width . (body-columns . 40))' will make the body of the chosen window 40 columns wide. ** Better detection of text suspiciously reordered on display. The function 'bidi-find-overridden-directionality' has been extended to detect reordering effects produced by embeddings and isolates (started by directional formatting control characters such as RLO and LRI). The new command 'highlight-confusing-reorderings' finds and highlights segments of buffer text whose reordering for display is suspicious and could be malicious. ** Emacs server and client changes +++ *** New command-line option '-r' for emacsclient. With this command-line option, Emacs reuses an existing graphical client frame if one exists; otherwise it creates a new frame. * Editing Changes in Emacs 29.1 --- ** Indentation of 'cl-flet' and 'cl-labels' has changed. These forms now indent like this: (cl-flet ((bla (x) (* x x))) (bla 42)) This change also affects 'cl-macrolet', 'cl-flet*' and 'cl-symbol-macrolet'. +++ ** New user option 'translate-upper-case-key-bindings'. This can be set to nil to inhibit translating upper case keys to lower case keys. +++ ** New command 'ensure-empty-lines'. This command increases (or decreases) the number of empty lines before point. --- *** Improved mouse behavior with auto-scrolling modes. When clicking inside the 'scroll-margin' or 'hscroll-margin' region the point is now moved only when releasing the mouse button. This no longer results in a bogus selection, unless the mouse has been effectively dragged. +++ ** 'kill-ring-max' now defaults to 120. --- ** New user option 'yank-menu-max-items'. Customize this option to limit the amount of entries in the menu "Edit->Paste from Kill Menu". The default is 60. ** show-paren-mode +++ *** New user option 'show-paren-context-when-offscreen'. When non-nil, if the point is in a closing delimiter and the opening delimiter is offscreen, shows some context around the opening delimiter in the echo area. ** Comint +++ *** 'comint-term-environment' is now aware of connection-local variables. The user option 'comint-terminfo-terminal' and variable 'system-uses-terminfo' can now be set as connection-local variables to change the terminal used on a remote host. * Changes in Specialized Modes and Packages in Emacs 29.1 ** vc --- *** 'C-x v v' on an unregistered file will now use the most specific backend. Previously, if you had an SVN-covered ~/ directory, and a Git-covered directory in ~/foo/bar, using 'C-x v v' on a new, unregistered file ~/foo/bar/zot would register it in the SVN repository in ~/ instead of in the Git repository in ~/foo/bar. This makes this command consistent with 'vc-responsible-backend'. ** Message --- *** New user option 'mml-attach-file-at-the-end'. If non-nil, 'C-c C-a' will put attached files at the end of the message. --- *** Message Mode now supports image yanking. --- *** HTML Mode now supports text/html and image/* yanking. ** eww +++ *** New user option 'eww-url-transformers'. These are used to alter an URL before using it. By default it removes the common utm_ trackers from URLs. ** Gnus +++ *** New user option 'gnus-treat-emojize-symbols'. If non-nil, symbols that have an emoji representation will be displayed as emojis. +++ *** New command 'gnus-article-emojize-symbols'. This is bound to 'W D e' and will display symbols that have emoji representation as emojis. ** EIEIO +++ *** New command 'C-x t C-r' to open file read-only in the other tab. *** The tab bar now supports more mouse commands. Clicking 'mouse-2' closes the tab, 'mouse-3' displays the context menu with items that operate on the clicked tab. Dragging the tab with 'mouse-1' moves it to another position on the tab bar. Mouse wheel scrolling switches to the previous/next tab, and holding the Shift key during scrolling moves the tab to the left/right. +++ *** Frame-specific appearance of the tab bar when 'tab-bar-show' is a number. When 'tab-bar-show' is a number, the tab bar on different frames can be shown or hidden independently, as determined by the number of tabs on each frame compared to the numerical value of 'tab-bar-show'. +++ *** New command 'toggle-frame-tab-bar'. It can be used to enable/disable the tab bar on the currently selected frame regardless of the values of 'tab-bar-mode' and 'tab-bar-show'. This allows enabling/disabling the tab bar independently on different frames. --- *** New user option 'tab-bar-format' defines a list of tab bar items. When it contains 'tab-bar-format-global' (possibly appended after 'tab-bar-format-align-right'), then after enabling 'display-time-mode' (or any other mode that uses 'global-mode-string') it displays time aligned to the right on the tab bar instead of on the mode line. When 'tab-bar-format-tabs' is replaced with 'tab-bar-format-tabs-groups', the tab bar displays tab groups. --- *** New optional key binding for 'tab-last'. If you customize the user option 'tab-bar-select-tab-modifiers' to allow selecting tabs using their index numbers, the '-9' key is bound to 'tab-last', and switches to the last tab. Here is any of the modifiers in the list that is the value of 'tab-bar-select-tab-modifiers'. You can also use negative indices, which count from the last tab: -1 is the last tab, -2 the one before that, etc. --- *** New command 'tab-duplicate' bound to 'C-x t n'. --- *** 'C-x t N' creates a new tab at the specified absolute position. The position is provided as prefix arg, and specifies an index that starts at 1. Negative values count from the end of the tab bar. --- *** 'C-x t M' moves the current tab to the specified absolute position. The position is provided as prefix arg, whose interpretation is as in 'C-x t N'. --- *** 'C-x t G' assigns a tab to a named group of tabs. 'tab-close-group' closes all tabs that belong to the selected group. The user option 'tab-bar-new-tab-group' defines the default group of new tabs. After customizing 'tab-bar-tab-post-change-group-functions' to 'tab-bar-move-tab-to-group', changing the group of a tab will also move it closer to other tabs in the same group. --- *** New user option 'tab-bar-tab-name-format-function'. --- *** New user option 'tab-line-tab-name-format-function'. ** align --- *** Alignment in 'text-mode' has changed. Previously, 'M-x align' didn't do anything, and you had to say 'C-u M-x align' for it to work. This has now been changed. The default regexp for 'C-u M-x align-regexp' has also been changed to be easier for inexperienced users to use. ** eww +++ *** New user option to automatically rename EWW buffers. The 'eww-auto-rename-buffer' user option can be configured to rename rendered web pages by using their title, URL, or a user-defined function which returns a string. For the first two cases, the length of the resulting name is controlled by 'eww-buffer-name-length'. By default, no automatic renaming is performed. ** Help *** New user option 'help-link-key-to-documentation'. When this option is non-nil, key bindings displayed in the "*Help*" buffer will be linked to the documentation for the command they are bound to. This does not affect listings of key bindings and functions (such as 'C-h b'). ** info-look --- *** info-look specs can now be expanded at run time instead of a load time. The new ':doc-spec-function' element can be used to compute the ':doc-spec' element when the user asks for info on that particular mode (instead of at load time). ** subr-x +++ *** New macro 'with-memoization' provides a very primitive form of memoization. ** ansi-color --- *** Support for ANSI 256-color and 24-bit colors. 256-color and 24-bit color codes are now handled by ANSI color filters and displayed with the specified color. ** term-mode --- *** Support for ANSI 256-color and 24-bit colors, italic and other fonts. Term-mode can now display 256-color and 24-bit color codes. It can also handle ANSI codes for faint, italic and blinking text, displaying it with new 'term-{faint,italic,slow-blink,fast-blink}' faces. ** Xref *** 'project-find-file' and 'project-or-external-find-file' now accept a prefix argument which is interpreted to mean "include all files". +++ *** New command 'xref-go-forward'. It is bound to 'C-M-,' and jumps to the location where 'xref-go-back' ('M-,', also known as 'xref-pop-marker-stack') was invoked previously. ** File notifications +++ *** The new command 'file-notify-rm-all-watches' removes all file notifications. ** Sql --- *** Sql now supports sending of passwords in-process. To improve security, if an sql product has ':password-in-comint' set to t, a password supplied via the minibuffer will be sent in-process, as opposed to via the command-line. ** Image Mode +++ *** New command 'image-transform-fit-to-window'. This command fits the image to the current window by scaling down or up as necessary. Unlike 'image-transform-fit-both', this does not only scale the image down, but up as well. It is bound to "s w" in Image Mode by default. +++ *** 'image-transform-fit-to-(height|width)' are now obsolete. Use the new command 'image-transform-fit-to-window' instead. The keybinding for 'image-transform-fit-to-width' is now 's i'. --- *** User option 'image-auto-resize' can now be set to 'fit-window'. This works like 'image-transform-fit-to-window'. *** New user option 'image-auto-resize-max-scale-percent'. The new 'fit-window' options will never scale an image more than this much (in percent). It is nil by default. ** Image-Dired +++ *** 'image-dired-display-image-mode' is now based on 'image-mode'. This avoids converting images in the background, and makes Image-Dired noticeably faster. New keybindings from 'image-mode' are now available in the "*image-dired-display-image*" buffer; press '?' or 'h' in that buffer to see the full list. Finally, some commands and user options that are no longer needed are now obsolete: 'image-dired-cmd-create-temp-image-options', 'image-dired-cmd-create-temp-image-program', 'image-dired-display-current-image-full', 'image-dired-display-current-image-sized', 'image-dired-display-window-height-correction', 'image-dired-display-window-width-correction', 'image-dired-temp-image-file'. --- *** Reduce dependency on external "exiftool" command. The 'image-dired-copy-with-exif-file-name' no longer requires an external "exiftool" command to be available. The user options 'image-dired-cmd-read-exif-data-program' and 'image-dired-cmd-read-exif-data-options' are now obsolete. --- *** New command for the thumbnail buffer. The new command 'image-dired-unmark-all-marks' has been added. It is bound to "U" in the thumbnail buffer. --- *** Support Thumbnail Managing Standard v0.9.0 (Dec 2020). This standard allows sharing generated thumbnails across different programs. Version 0.9.0 adds two larger thumbnail sizes: 512x512 and 1024x1024 pixels. See the user option `image-dired-thumbnail-storage' to use it; it is not enabled by default. --- *** Support GraphicsMagick command line tools. Support for the GraphicsMagick command line tool ("gm") has been added, and is used instead of ImageMagick when it is available. --- *** New face 'image-dired-thumb-flagged'. If 'image-dired-thumb-mark' is non-nil (the default), this face is used for images that are flagged for deletion in the Dired buffer associated with Image-Dired. --- *** Support for bookmark.el. The command 'bookmark-set' (bound to 'C-x r m') is now supported in the thumbnail view, and will create a bookmark that opens the current directory in Image-Dired. +++ *** 'image-dired-show-all-from-dir-max-files' has been increased to 500. This option controls asking for confirmation when starting Image-Dired in a directory with many files. However, Image-Dired creates thumbnails in the background these days, so this is not as important as it used to be, back when entering a large directory could lock up Emacs for tens of seconds. In addition, you can now customize this option to nil to disable this confirmation completely. --- *** Make 'image-dired-rotate-thumbnail-(left|right)' obsolete. Instead, use 'M-x image-dired-refresh-thumb' to generate a new thumbnail, or 'M-x image-rotate' to rotate the thumbnail without updating the thumbnail file. ** Dired --- *** New user option 'dired-make-directory-clickable'. If non-nil (which is the default), hitting 'RET' or 'mouse-1' on the directory components at the directory displayed at the start of the buffer will take you to that directory. ** Exif *** New function 'exif-field'. This is a convenience function to extract the field data from 'exif-parse-file' and 'exif-parse-buffer'. ** Xwidgets +++ *** New minor mode `xwidget-webkit-edit-mode'. When this mode is enabled, self-inserting characters and other common web browser shotcut keys are redefined to send themselves to the WebKit widget. +++ *** New minor mode `xwidget-webkit-isearch-mode'. This mode acts similarly to incremental search, and allows to search the contents of a WebKit widget. In xwidget-webkit mode, it is bound to `C-s' and `C-r'. --- *** On X11, the WebKit inspector is now available inside xwidgets. To access the inspector, right click on the widget and select "Inspect Element". --- *** "Open in New Window" in a WebKit widget's context menu now works. The newly created buffer will be displayed via display-buffer, which can be customized through the usual mechanism of display-buffer-alist and friends. * New Modes and Packages in Emacs 29.1 +++ ** New mode 'erts-mode'. This mode is used to edit files geared towards testing actions in Emacs buffers, like indentation and the like. The new ert function 'ert-test-erts-file' is used to parse these files. * Incompatible Lisp Changes in Emacs 29.1 ** Keymap descriptions have changed. 'help--describe-command', 'C-h b' and associated functions that output keymap descriptions have changed. In particular, prefix commands are not output at all, and instead of "??" for closures/functions, "[closure]"/"[lambda]" is output. --- ** 'downcase' details have changed slightly. In certain locales, changing the case of an ASCII-range character may turn it into a multibyte character, most notably with "I" in Turkish (the lowercase is "ı", 0x0131). Previously, 'downcase' on a unibyte string was buggy, and would mistakenly just return the lower byte of this, 0x31 (the digit "1"). 'downcase' on a unibyte string has now been changed to downcase such characters as if they were ASCII. To get proper locale-dependent downcasing, the string has to be converted to multibyte first. (This goes for the other case-changing functions, too.) --- ** 'def' indentation changes. In 'emacs-lisp-mode', forms with a symbol with a name that start with "def" have been automatically indented as if they were 'defun'-like forms, for instance: (defzot 1 2 3) This heuristic has now been removed, and all functions/macros that want to be indented this way have to be marked with (declare (indent defun)) or the like. If the function/macro definition itself can't be changed, the indentation can also be adjusted by saying something like: (put 'defzot 'lisp-indent-function 'defun) --- ** The 'inhibit-changing-match-data' variable is now obsolete. Instead, functions like 'string-match' and 'looking-at' now take an optional 'inhibit-modify' argument. --- ** 'gnus-define-keys' is now obsolete. Use 'define-keymap' instead. --- ** MozRepl has been removed from js.el. MozRepl was removed from Firefox in 2017, so this code doesn't work with recent versions of Firefox. --- ** The function 'image-dired-get-exif-data' is now obsolete. Use 'exif-parse-file' and 'exif-field' instead. * Lisp Changes in Emacs 29.1 *** New command 'yank-media'. This command supports yanking non-plain-text media like images and HTML from other applications into Emacs. It is only supported in modes that have registered support for it. +++ *** New text property 'inhibit-isearch'. If set, 'isearch' will skip these areas, which can be useful (for instance) when covering huge amounts of data (that has no meaningful searchable data, like image data) with a 'display' text property. +++ *** 'insert-image' now takes an INHIBIT-ISEARCH optional parameter. It marks the image with the 'inhibit-isearch' text parameter, which inhibits 'isearch' matching the STRING parameter. --- *** New user option 'pp-use-max-width'. If non-nil, 'pp' will attempt to limit the line length when formatting long lists and vectors. --- *** New function 'pp-emacs-lisp-code'. 'pp' formats general Lisp sexps. This function does much the same, but applies formatting rules appropriate for Emacs Lisp code. +++ *** New function 'file-has-changed-p'. This convenience function is useful when writing code that parses files at run-time, and allows Lisp programs to re-parse files only when they have changed. --- *** New function 'font-has-char-p'. This can be used to check whether a specific font has a glyph for a character. ** XDG support *** New function 'xdg-state-home' returns $XDG_STATE_HOME. This new location, introduced in the XDG Base Directory Specification version 0.8 (8th May 2021), "contains state data that should persist between (application) restarts, but that is not important or portable enough to the user that it should be stored in $XDG_DATA_HOME". +++ ** New macro 'with-delayed-message'. This macro is like 'progn', but will output the specified message if the body takes longer to execute than the specified timeout. --- ** New function 'funcall-with-delayed-message'. This function is like 'funcall', but will output the specified message is the function take longer to execute that the specified timeout. ** Locale --- *** New variable 'current-locale-environment'. This holds the value of the previous call to 'set-locale-environment'. --- *** New macro 'with-locale-environment'. This macro can be used to change the locale temporarily while executing code. ** Tabulated List Mode +++ *** A column can now be set to an image descriptor. The `tabulated-list-entries' variable now supports using an image descriptor, which means to insert an image in that column instead of text. See the documentation string of that variable for details. +++ ** 'define-key' now understands a new strict 'kbd' representation for keys. The '(define-key map ["C-c M-f"] #'some-command)' syntax is now supported, and is like the 'kbd' representation, but is stricter. If the string doesn't represent a valid key sequence, an error is signalled (both when evaluating and byte compiling). +++ ** :keys in 'menu-item' can now be a function. If so, it is called whenever the menu is computed, and can be used to calculate the keys dynamically. +++ ** New major mode 'clean-mode'. This is a new major mode meant for debugging. It kills absolutely all local variables and removes overlays and text properties. +++ ** 'kill-all-local-variables' can now kill all local variables. If given the new optional KILL-PERMANENT argument, also kill permanent local variables. +++ ** Third 'mapconcat' argument SEPARATOR is now optional. An explicit nil always meant the empty string, now it can be left out. --- ** Themes can now be made obsolete. Using 'make-obsolete' on a theme is now supported. This will make 'load-theme' issue a warning when loading the theme. +++ ** New function 'define-keymap'. This function allows defining a number of keystrokes with one form. +++ ** New macro 'defvar-keymap'. This macro allows defining keymap variables more conveniently. --- ** 'kbd' can now be used in built-in, preloaded libraries. It no longer depends on edmacro.el and cl-lib.el. +++ ** New function 'kbd-valid-p'. The 'kbd' function is quite permissive, and will try to return something usable even if the syntax of the argument isn't completely correct. The 'kbd-valid-p' predicate does a stricter check of the syntax. +++ ** New function 'image-at-point-p'. This function returns t if point is on a valid image, and nil otherwise. +++ ** New function 'string-pixel-width'. This returns the width of a string in pixels. This can be useful when dealing with variable pitch fonts and glyphs that have widths that aren't integer multiples of the default font. +++ ** New function 'string-glyph-split'. This function splits a string into a list of strings representing separate glyphs. This takes into account combining characters and grapheme clusters. --- ** 'lookup-key' is more allowing when searching for extended menu items. In Emacs 28.1, the behavior of 'lookup-key' was changed: when looking for a menu item '[menu-bar Foo-Bar]', first try to find an exact match, then look for the lowercased '[menu-bar foo-bar]'. This has been extended, so that when looking for a menu item with a symbol containing spaces, as in '[menu-bar Foo\ Bar]', first look for an exact match, then the lowercased '[menu-bar foo\ bar]' and finally '[menu-bar foo-bar]'. This further improves backwards-compatibility when converting menus to use 'easy-menu-define'. +++ ** New function `xwidget-perform-lispy-event'. This function allows you to send events to xwidgets. Usually, some equivalent of the event will be sent, but there is no guarantee of what the widget will actually receive. On GTK+, only key and function key events are implemented. +++ ** New functions for performing searches on WebKit xwidgets. Some new functions, such as `xwidget-webkit-search', have been added for performing searches on WebKit xwidgets. +++ ** `load-changed' xwidget events are now more detailed. In particular, they can now have different arguments based on the state of the WebKit widget. `load-finished' is sent when a load has completed, `load-started' when a load first starts, `load-redirected' after a redirect, and `load-committed' when the WebKit widget first commits to the load. +++ ** New event type `xwidget-display-event'. These events are sent whenever an xwidget requests that Emacs display another. The only argument to this event is the xwidget that should be displayed. * Changes in Emacs 29.1 on Non-Free Operating Systems ** MS-Windows +++ *** Emacs now supports system dark mode. On Windows 10 (version 1809 and higher) and Windows 11, Emacs will now follow the system's dark mode: GUI frames use the appropriate light or dark title bar and scroll bars, based on the user's Windows-wide color settings. ---------------------------------------------------------------------- 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: