Emacs NEWS.29

Table of Contents

GNU Emacs NEWS – history of user-visible changes.

Copyright (C) 2021-2023 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'.

1. Installation Changes in Emacs 29.1

1.1. Ahead-of-time native compilation can now be requested via configure.

Use '–with-native-compilation=aot' to request that all the Lisp files in the Emacs tree should be natively compiled ahead of time. (This is slow on most machines.)

This feature existed in Emacs 28.1, but was less easy to request.

1.2. Emacs can be built with the tree-sitter parsing library.

This library, together with separate grammar libraries for each language, provides incremental parsing capabilities for several popular programming languages and other formatted files. Emacs built with this library offers major modes, described elsewhere in this file, that are based on the tree-sitter's parsers. If you have the tree-sitter library installed, the configure script will automatically include it in the build; use '–without-tree-sitter' at configure time to disable that.

Emacs modes based on the tree-sitter library require an additional grammar library for each mode. These grammar libraries provide the tree-sitter library with language-specific lexical analysis and parsing capabilities, and are developed separately from the tree-sitter library itself. If you don't have a grammar library required by some Emacs major mode, and your distro doesn't provide it as an installable package, you can compile and install such a library yourself. Many libraries can be downloaded from the tree-sitter site:

https://github.com/tree-sitter

Emacs provides a user command, treesit-install-language-grammar, that automates the download and build process of a grammar library. It prompts for the language, the URL of the language grammar's VCS repository, and then uses the installed C/C++ compiler to build the library and install it.

You can also do this manually. To compile such a library after cloning its Git repository, compile the files "scanner.c" and "parser.c" (sometimes named "scanner.cc" and "parser.cc") in the "src" subdirectory of the library's source tree using the C or C++ compiler, then link these two files into a shared library named "libtree-sitter-LANG.so" ("libtree-sitter-LANG.dll" on MS-Windows, "libtree-sitter-LANG.dylib" on macOS), where LANG is the name of the language supported by the grammar as it is expected by the Emacs major mode (for example, "c" for c-ts-mode, "cpp" for 'c++-ts-mode', "python" for python-ts-mode, etc.). Then place the shared library you've built in the same directory where you keep the other shared libraries used by Emacs, or in the "tree-sitter" subdirectory of your user-emacs-directory, or in a directory mentioned in the variable treesit-extra-load-path.

You only need to install language grammar libraries required by the Emacs modes you will use, as Emacs loads these libraries only when the corresponding mode is turned on in some buffer for the first time in an Emacs session.

We generally recommend to use the latest versions of grammar libraries available from their sites, as these libraries are in constant development and occasionally add features and fix important bugs to follow the advances in the programming languages they support.

1.3. Emacs can be built with built-in support for accessing SQLite databases.

This uses the popular sqlite3 library, and can be disabled by using the '–without-sqlite3' option to the configure script.

1.4. Support for the WebP image format.

This support is built by default when the libwebp library is available, and includes support for animated WebP images. To disable WebP support, use the '–without-webp' configure flag. Image specifiers can now use ':type webp'.

1.5. 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/x8664-pc-linux-gnu/emacs-<fingerprint>.pdmp". If a constant file name is required, the file can be renamed to "emacs.pdmp", and Emacs will find it during startup anyway.

1.6. Emacs on X now uses XInput 2 for input events.

If your X server has support and you have the XInput 2 development headers installed, Emacs will use the X Input Extension for handling input. If this causes problems, you can configure Emacs with the option '–without-xinput2' to disable this support.

'(featurep 'xinput2)' can be used to test for the presence of XInput 2 support from Lisp programs.

1.7. Emacs can now be optionally built with the Cairo XCB backend.

Configure Emacs with the '–with-cairo-xcb' option to use the Cairo XCB backend; the default is not to use it. This backend makes Emacs moderately faster when running over X connections with high latency, but is currently known to crash when Emacs repeatedly closes and opens a display connection to the same terminal; this could happen, for example, if you repeatedly visit files via emacsclient in a single client frame, each time deleting the frame with 【C-x C-c】.

1.8. Emacs now supports being built with pure GTK.

To use this option, make sure the GTK 3 (version 3.22.23 or later) and Cairo development files are installed, and configure Emacs with the option '–with-pgtk'. Unlike the default X and GTK build, the resulting Emacs binary will work on any underlying window system supported by GDK, such as Wayland and Broadway. We recommend that you use this configuration only if you are running a window system other than X that's supported by GDK. Running this configuration on X is known to have problems, such as undesirable frame positioning and various issues with keyboard input of sequences such as 'C-;' and C-S-u. Running this on WSL is also known to have problems.

Note that, unlike the X build of Emacs, the PGTK build cannot automatically switch to text-mode interface (thus emulating -nw) if it cannot determine the default display; it will instead complain and ask you to invoke it with the explicit -nw option.

1.9. Emacs has been ported to the Haiku operating system.

The configuration process should automatically detect and build for Haiku. There is also an optional window-system port to Haiku, which can be enabled by configuring Emacs with the option '–with-be-app', which will require the Haiku Application Kit development headers and a C++ compiler to be present on your system. If Emacs is not built with the option '–with-be-app', the resulting Emacs will only run in text-mode terminals.

To enable Cairo support, ensure that the Cairo and FreeType development files are present on your system, and configure Emacs with '–with-be-cairo'.

Unlike X, there is no compile-time option to enable or disable double-buffering; it is always enabled. To disable it, change the frame parameter inhibit-double-buffering instead.

1.10. Emacs no longer reduces the size of the Japanese dictionary.

Building Emacs includes generation of a Japanese dictionary, which is used by Japanese input methods. Previously, the build included a step of reducing the size of this dictionary's vocabulary. This vocabulary reduction is now optional, by default off. If you need the Emacs build to include the vocabulary reduction, configure Emacs with the option '–with-small-ja-dic'. In an Emacs source tree already configured without that option, you can force the vocabulary reduction by saying

make -C leim generate-ja-dic JADICNOREDUCTIONOPTION=''

after deleting "lisp/leim/ja-dic/ja-dic.el".

1.11. The docstrings of preloaded files are not in "etc/DOC" any more.

Instead, they're fetched as needed from the corresponding ".elc" files, as was already the case for all the non-preloaded files.

2. Startup Changes in Emacs 29.1

2.1. '–batch' and '–script' now adjust the garbage collection levels.

These switches now set gc-cons-percentage to 1.0 (up from the default of 0.1). This means that batch processes will typically use more memory than before, but use less time doing garbage collection. Batch jobs that are supposed to run for a long time should adjust the limit back down again.

2.2. Emacs can now be used more easily in an executable script.

If you start an executable script with

#!/usr/bin/emacs -x

Emacs will start without reading any init files (like with '–quick'), and then execute the rest of the script file as Emacs Lisp. When it reaches the end of the script, Emacs will exit with an exit code from the value of the final form.

2.3. Emacs now supports setting user-emacs-directory via '–init-directory'.

Use the '–init-directory' command-line option to set user-emacs-directory.

2.4. Emacs now has a '–fingerprint' option.

This will output a string identifying the current Emacs build, and exit.

2.5. New hook after-pdump-load-hook.

This is run at the end of the Emacs startup process, and is meant to be used to reinitialize data structures that would normally be done at load time.

2.6. Native Compilation

2.6.1. New command native-compile-prune-cache.

This command deletes old subdirectories of the eln cache (but not the ones for the current Emacs version). Note that subdirectories of the system directory where the "*.eln" files are installed (usually, the last entry in native-comp-eln-load-path) are not deleted.

2.6.2. New function startup-redirect-eln-cache.

This function can be called in your init files to change the user-specific directory where Emacs stores the "*.eln" files produced by native compilation of Lisp packages Emacs loads. The default eln cache directory is unchanged: it is the "eln-cache" subdirectory of user-emacs-directory.

3. Incompatible changes in Emacs 29.1

3.1. The image commands have changed key bindings.

In previous Emacs versions, the 【+】 , 【-】 and 【r】 keys were bound when point was over an image. In Emacs 29.1, additional commands have been added, and this made it more likely that users would trigger the image commands by mistake. To avoid this, all image commands have been moved to the i prefix keymap, so 【+】 is now 'i +', 【-】 is now 'i -', and 【r】 is now 'i r'. In addition, these commands are now repeating, so you can rotate an image twice by saying 'i r r', for instance.

3.2. Emacs now picks the correct coding-system for X input methods.

Previously, Emacs would use locale-coding-system for input methods, which could in some circumstances be incorrect, especially when the input method chose to fall back to some other coding system.

Emacs now automatically detects the coding-system used by input methods, and uses that to decode input in preference to the value of locale-coding-system. This unfortunately means that users who have changed the coding system used to decode X keyboard input must adjust their customizations to locale-coding-system to the variable x-input-coding-system instead.

3.3. Bookmarks no longer include context for encrypted files.

If you're visiting an encrypted file, setting a bookmark no longer includes excerpts from that buffer in the bookmarks file. This is implemented by the new hook bookmark-inhibit-context-functions, where packages can register a function which returns non-nil for file names to be excluded from adding such excerpts.

3.4. show-paren-mode is now disabled in special-mode buffers.

In Emacs versions previous to Emacs 28.1, show-paren-mode defaulted off. In Emacs 28.1, the mode was switched on in all buffers. In Emacs 29.1, this was changed to be switched on in all editing-related buffers, but not in buffers that inherit from special-mode. To go back to how things worked in Emacs 28.1, put the following in your init file:

(setopt show-paren-predicate t)

3.5. Explicitly-set read-only state is preserved when reverting a buffer.

If you use the 【C-x C-q】 command to change the read-only state of the buffer and then revert it, Emacs would previously use the file permission bits to determine whether the buffer should be read-only after reverting the buffer. Emacs now remembers the decision made in 【C-x C-q】.

3.6. The Gtk selection face is no longer used for the region.

The combination of a Gtk-controlled background and a foreground color controlled by the internal Emacs machinery led to low-contrast faces in common default setups. Emacs now uses the same region face on Gtk and non-Gtk setups.

3.7. 【C-h f】 and 【C-h x】 may now require confirmation when you press RET.

If the text in the minibuffer cannot be completed to a single function or command, typing RET will not automatically complete to the shortest candidate, but will instead ask for confirmation. Typing TAB will complete as much as possible, and another TAB will show all the possible completions. This allows you to insist on the functions name even if Help doesn't appear to know about it, by confirming with a second RET.

3.8. Dired

3.8.1. w (dired-copy-filename-as-kill) has changed behavior.

If there are several files marked, file names containing space and quote characters will be quoted "like this".

3.8.2. The d command now more consistently skips dot files.

In previous Emacs versions, commands like 【C-u 10 d】 would put the "D" mark on the next ten files, no matter whether they were dot files (i.e., "." and "..") or not, while marking the next ten lines with the mouse (in transient-mark-mode) and then hitting d would skip dot files. These now work equivalently.

3.9. Warning about "eager macro-expansion failure" is now an error.

3.10. Previously, the X "reverseVideo" value at startup was heeded for all frames.

This meant that if you had a "reverseVideo" resource on the initial display, and then opened up a new frame on a display without any explicit "reverseVideo" setting, it would get heeded there, too. (This included terminal frames.) In Emacs 29, the "reverseVideo" X resource is handled like all the other X resources, and set on a per-frame basis.

3.11. E in query-replace now edits the replacement with exact case.

Previously, this command did the same as e.

3.12. '/ a' in "Packages" buffer now limits by archive name(s) instead of regexp.

3.13. Setting the goal columns now also affects '<prior>' and '<next>'.

Previously, 【C-x C-n】 only affected next-line and previous-line, but it now also affects scroll-up-command and scroll-down-command.

3.14. Isearch in "Help" and "info" now char-folds quote characters by default.

This means that you can say 'C-s `foo' (GRAVE ACCENT) if the buffer contains "‘foo" (LEFT SINGLE QUOTATION MARK) and the like. These quotation characters look somewhat similar in some fonts. To switch this off, disable the new isearch-fold-quotes-mode minor mode.

3.15. Sorting commands no longer necessarily change modification status.

In earlier Emacs versions, commands like sort-lines would always change buffer modification status to "modified", whether they changed something in the buffer or not. This has been changed: the buffer is marked as modified only if the sorting ended up actually changing the contents of the buffer.

3.16. string-lines handles trailing newlines differently.

It no longer returns an empty final string if the string ends with a newline.

3.17. TAB and '<backtab>' are now bound in button-map.

This means that if point is on a button, TAB will take you to the next button, even if the mode has bound it to something else. This also means that TAB on a button in an outline-minor-mode heading will move point instead of collapsing the outline.

3.18. outline-minor-mode-cycle-map is now parent of outline-minor-mode.

Instead of adding text property keymap with outline-minor-mode-cycle on outline headings in outline-minor-mode, the keymap outline-minor-mode-cycle is now active in the whole buffer. But keybindings in outline-minor-mode-cycle still take effect only on outline headings because they are bound with the help of 'outline-minor-mode-cycle–bind' that checks if point is on a heading.

3.19. Info-default-directory-list is no longer populated at Emacs startup.

If you have code in your init file that removes directories from Info-default-directory-list, this will no longer work.

3.20. C-k no longer deletes files in ido-mode.

To get the previous action back, put something like the following in your Init file:

(require 'ido) (keymap-set ido-file-completion-map "C-k" #'ido-delete-file-at-head)

3.21. New user option term-clear-full-screen-programs.

By default, term.el will now work like most terminals when displaying full-screen programs: When they exit, the output is cleared, leaving what was displayed in the window before the programs started. Set this user option to nil to revert back to the old behavior.

3.22. Support for old EIEIO functions is not autoloaded any more.

You need an explicit '(require 'eieio-compat)' to use defmethod and defgeneric (which were made obsolete in Emacs 25.1 by cl-defmethod and cl-defgeneric). Similarly you might need to '(require 'eieio-compat)' before loading files that were compiled with an old EIEIO (Emacs<25).

3.23. 【C-x 8 .】 has been moved to 【C-x 8 . .】.

This is to open up the 【C-x 8 .】 map to bind further characters there.

3.24. 【C-x 8 =】 has been moved to 【C-x 8 = =】.

You can now use 【C-x 8 =】 to insert several characters with macron; for example, 【C-x 8 = a】 will insert U+0101 LATIN SMALL LETTER A WITH MACRON. To insert a lone macron, type 【C-x 8 = =】 instead of the previous 【C-x =】.

3.25. Eshell

3.25.1. Eshell's PATH is now derived from exec-path.

For consistency with remote connections, Eshell now uses exec-path to determine the execution path on the local or remote system, instead of using the PATH environment variable directly.

3.25.2. source and '.' no longer accept the '–help' option.

This is for compatibility with the shell versions of these commands, which don't handle options like '–help' in any special way.

3.25.3. String delimiters in argument predicates/modifiers are more restricted.

Previously, some argument predicates/modifiers allowed arbitrary characters as string delimiters. To provide more unified behavior across all predicates/modifiers, the list of allowed delimiters has been restricted to "…", '…', , |…|, (…), […], <…>, and {…}. See the "(eshell) Argument Predication and Modification" node in the Eshell manual for more details.

3.25.4. Eshell pipelines now only pipe stdout by default.

To pipe both stdout and stderr, use the '|&' operator instead of '|'.

3.26. The delete-forward-char command now deletes by grapheme clusters.

This command is by default bound to the '<Delete>' function key (a.k.a. '<deletechar>'). When invoked without a prefix argument or with a positive prefix numeric argument, the command will now delete complete grapheme clusters produced by character composition. For example, if point is before an Emoji sequence, pressing '<Delete>' will delete the entire sequence, not just a single character at its beginning.

3.27. load-history does not treat autoloads specially any more.

An autoload definition appears just as a '(defun . NAME)' and the '(t . NAME)' entries are not generated any more.

3.28. The Tamil input methods no longer insert Tamil digits.

The input methods tamil-itrans and tamil-inscript no longer insert the Tamil digits, as those digit characters are not used nowadays by speakers of the Tamil language. To get back the previous behavior, use the new tamil-itrans-digits and tamil-inscript-digits input methods instead.

3.29. New variable current-time-list governing default timestamp form.

Functions like current-time now yield '(TICKS . HZ)' timestamps if this new variable is nil. The variable defaults to t, which means these functions default to timestamps of the forms '(HI LO US PS)', '(HI LO US)' or '(HI LO)', which are less regular and less efficient. This is part of a long-planned change first documented in Emacs 27. Developers are encouraged to test timestamp-related code with this variable set to nil, as it will default to nil in a future Emacs version and will be removed some time after that.

3.30. Functions that recreate the "scratch" buffer now also initialize it.

When functions like other-buffer and server-execute recreate "scratch", they now also insert initial-scratch-message and set the major mode according to initial-major-mode, like at Emacs startup. Previously, these functions ignored initial-scratch-message and left "scratch" in fundamental-mode.

3.31. Naming of Image-Dired thumbnail files has changed.

Names of thumbnail files generated when image-dired-thumbnail-storage is image-dired now always end in ".jpg". This fixes various issues on different platforms, but means that thumbnails generated in Emacs 28 will not be used in Emacs 29, and vice-versa. If disk space is an issue, consider deleting the image-dired-dir directory (usually "~/.emacs.d/image-dired/") after upgrading to Emacs 29.

3.32. The rlogin method in the URL library is now obsolete.

Emacs will now display a warning if you request a URL like "rlogin://foo@example.org".

3.33. Setting url-gateway-method to rlogin is now obsolete.

Emacs will now display a warning when setting it to that value. The user options url-gateway-rlogin-host, url-gateway-rlogin-parameters, and url-gateway-rlogin-user-name are also obsolete.

3.34. The user function url-irc-function now takes a SCHEME argument.

The user option url-irc-function is now called with a sixth argument corresponding to the scheme portion of the target URL. For example, this would be "ircs" for a URL like "ircs://irc.libera.chat".

3.35. The linum.el library is now obsolete.

We recommend using either the built-in display-line-numbers-mode, or the nlinum package from GNU ELPA instead. The former has better performance, but the latter is closer to a drop-in replacement.

  1. To use display-line-numbers-mode, add something like this to your init file:

    (global-display-line-numbers-mode 1) ;; Alternatively, to use it only in programming modes: (add-hook 'prog-mode-hook #'display-line-numbers-mode)

  2. To use nlinum, add this to your Init file:

    (package-install 'nlinum) (global-nlinum-mode 1) ;; Alternatively, to use it only in programming modes: (add-hook 'prog-mode-hook #'nlinum-mode)

  3. To continue using the obsolete package linum, add this line to your Init file, in addition to any existing customizations:

    (require 'linum)

3.36. The thumbs.el library is now obsolete.

We recommend using the image-dired command instead.

3.37. The autoarg.el library is now marked obsolete.

This library provides the autoarg-mode and autoarg-kp-mode minor modes to emulate the behavior of the historical editor Twenex Emacs. We believe it is no longer useful.

3.38. The quickurl.el library is now obsolete.

Use abbrev, skeleton or tempo instead.

3.39. The rlogin.el library, and the rsh command are now obsolete.

Use something like 'M-x shell RET ssh <host> RET' instead.

3.40. The url-about.el library is now obsolete.

3.41. The autoload.el library is now obsolete.

It is superseded by the new loaddefs-gen.el library.

3.42. The netrc.el library is now obsolete.

Use the auth-source-netrc-parse-all function in auth-source.el instead.

3.43. The url-dired.el library is now obsolete.

3.44. The fast-lock.el and lazy-lock.el libraries have been removed.

They have been obsolete since Emacs 22.1.

The variable font-lock-support-mode is occasionally useful for debugging purposes. It is now a regular variable (instead of a user option) and can be set to nil to disable Just-in-time Lock mode.

3.45. The utf-8-auto coding-system now produces BOM on encoding.

This is actually a bugfix, since this is how utf-8-auto was documented from day one; it just didn't behave according to documentation. It turns out some Lisp programs were using this coding-system on the wrong assumption that the "auto" part means some automagic handling of the end-of-line (EOL) format conversion; those programs will now start to fail, because BOM signature in UTF-8 encoded text is rarely expected. That is the reason we mention this bugfix here.

In general, this coding-system should probably never be used for encoding, only for decoding.

4. Changes in Emacs 29.1

4.1. New user option major-mode-remap-alist to specify favorite major modes.

This user option lets you remap the default modes (e.g. perl-mode or latex-mode) to your favorite ones (e.g. cperl-mode or LaTeX-mode) instead of having to use defalias, which can have undesirable side effects. This applies to all modes specified via auto-mode-alist, file-local variables, etc.

4.2. Emacs now supports Unicode Standard version 15.0.

4.3. New user option electric-quote-replace-consecutive.

This allows you to disable the default behavior of consecutive single quotes being replaced with a double quote.

4.4. Emacs is now capable of editing files with very long lines.

The display of long lines has been optimized, and Emacs should no longer choke when a buffer on display contains long lines. The variable long-line-threshold controls whether and when these display optimizations are in effect.

A companion variable large-hscroll-threshold controls when another set of display optimizations are in effect, which are aimed specifically at speeding up display of long lines that are truncated on display.

If you still experience slowdowns while editing files with long lines, this may be due to line truncation, or to one of the enabled minor modes, or to the current major mode. Try turning off line truncation with 【C-x x t】, or try disabling all known slow minor modes with 'M-x so-long-minor-mode', or try disabling both known slow minor modes and the major mode with 'M-x so-long-mode', or visit the file with 'M-x find-file-literally' instead of the usual 【C-x C-f】.

In buffers in which these display optimizations are in effect, the fontification-functions, pre-command-hook and post-command-hook hooks are executed on a narrowed portion of the buffer, whose size is controlled by the variables long-line-optimizations-region-size and long-line-optimizations-bol-search-limit, as if they were in a with-restriction form. This may, in particular, cause occasional mis-fontifications in these buffers. Modes which are affected by these optimizations and by the fact that the buffer is narrowed, should adapt and either modify their algorithm so as not to expect the entire buffer to be accessible, or, if accessing outside of the narrowed region doesn't hurt performance, use the without-restriction form to temporarily lift the restriction and access portions of the buffer outside of the narrowed region.

The new function long-line-optimizations-p returns non-nil when these optimizations are in effect in the current buffer.

4.5. New command to change the font size globally.

To increase the font size, type 【C-x C-M-+】 or 【C-x C-M-=】; to decrease it, type 【C-x C-M--】; to restore the font size, type 'C-x C-M-0'. The final key in these commands may be repeated without the leading C-x and without the modifiers, example: 【C-x C-M-+ C-M-+ C-M-+】 and 【C-x C-M-+ + +】 increase the font size by three steps. When mouse-wheel-mode is enabled, C-M-wheel-up and C-M-wheel-down also increase and decrease the font size globally. Additionally, the user option global-text-scale-adjust-resizes-frames controls whether the frames are resized when the font size is changed.

4.6. New config variable syntax-wholeline-max to reduce the cost of long lines.

This variable is used by some operations (mostly syntax-propertization and font-locking) to treat lines longer than this variable as if they were made up of various smaller lines. This can help reduce the slowdowns seen in buffers made of a single long line, but can also cause misbehavior in the presence of such long lines (though most of that misbehavior should usually be limited to mis-highlighting). You can recover the previous behavior with:

(setq syntax-wholeline-max most-positive-fixnum)

4.7. New bindings in find-function-setup-keys for find-library.

When find-function-setup-keys is enabled, 【C-x L】 is now bound to find-library, 【C-x 4 L】 is now bound to find-library-other-window and 【C-x 5 L】 is now bound to find-library-other-frame.

4.8. New key binding after M-x or M-X: M-X.

Emacs allows different completion predicates to be used with M-x (i.e., execute-extended-command) via the read-extended-command-predicate user option. Emacs also has the M-X (note upper case X) command, which only displays commands especially relevant to the current buffer. Emacs now allows toggling between these modes while the user is inputting a command by hitting M-X while in the minibuffer.

4.9. Interactively, kill-buffer will now offer to save the buffer if unsaved.

4.10. New commands duplicate-line and duplicate-dwim.

duplicate-line duplicates the current line the specified number of times. duplicate-dwim duplicates the region if it is active. If not, it works like duplicate-line. An active rectangular region is duplicated on its right-hand side. The new user option duplicate-line-final-position specifies where to move point after duplicating a line.

4.11. Files with the ".eld" extension are now visited in lisp-data-mode.

4.12. network-lookup-address-info can now check numeric IP address validity.

Specifying numeric as the new optional HINTS argument makes it check if the passed address is a valid IPv4/IPv6 address (without DNS traffic).

(network-lookup-address-info "127.1" 'ipv4 'numeric) => ([127 0 0 1 0])

4.13. New command find-sibling-file.

This command jumps to a file considered a "sibling file", which is determined according to the new user option find-sibling-rules.

4.14. New user option delete-selection-temporary-region.

When non-nil, delete-selection-mode will only delete the temporary regions (usually set by mouse-dragging or shift-selection).

4.15. New user option switch-to-prev-buffer-skip-regexp.

This should be a regexp or a list of regexps; buffers whose names match those regexps will be ignored by switch-to-prev-buffer and switch-to-next-buffer.

4.16. New command rename-visited-file.

This command renames the file visited by the current buffer by moving it to a new name or location, and also makes the buffer visit this new file.

4.17. Menus

4.17.1. The entries following the buffers in the "Buffers" menu can now be altered.

Change the menu-bar-buffers-menu-command-entries variable to alter the entries that follow the buffer list.

4.18. delete-process is now a command.

When called interactively, it will kill the process running in the current buffer (if any). This can be useful if you have runaway output in the current buffer (from a process or a network connection), and want to stop it.

4.19. New command restart-emacs.

This is like save-buffers-kill-emacs, but instead of just killing the current Emacs process at the end, it starts a new Emacs process (using the same command line arguments as the running Emacs process). kill-emacs and save-buffers-kill-emacs have also gained new optional arguments to restart instead of just killing the current process.

4.20. Drag and Drop

4.20.1. New user option mouse-drag-mode-line-buffer.

If non-nil, dragging on the buffer name part of the mode-line will drag the buffer's associated file to other programs. This option is currently only available on X, Haiku and Nextstep (GNUstep or macOS).

4.20.2. New user option mouse-drag-and-drop-region-cross-program.

If non-nil, this option allows dragging text in the region from Emacs to another program.

4.20.3. New user option mouse-drag-and-drop-region-scroll-margin.

If non-nil, this option allows scrolling a window while dragging text around without a scroll wheel.

4.20.4. The value of mouse-drag-copy-region can now be the symbol non-empty.

This prevents mouse drag gestures from putting empty strings onto the kill ring.

4.20.5. New user options dnd-indicate-insertion-point and dnd-scroll-margin.

These options allow adjusting point and scrolling a window when dragging items from another program.

4.20.6. The X Direct Save (XDS) protocol is now supported.

This means dropping an image or file link from programs such as Firefox will no longer create a temporary file in a random directory, instead asking you where to save the file first.

4.21. New user option record-all-keys.

If non-nil, this option will force recording of all input keys, including those typed in response to passwords prompt (this was the previous behavior). The default is nil, which inhibits recording of passwords.

4.22. New function command-query.

This function makes its argument command prompt the user for confirmation before executing.

4.23. The disabled property of a command's symbol can now be a list.

The first element of the list should be the symbol query, which will cause the command disabled this way prompt the user with a y/n or a yes/no question before executing. The new function command-query is a convenient method of making commands disabled in this way.

4.24. count-words will now report buffer totals if given a prefix.

Without a prefix, it will only report the word count for the narrowed part of the buffer.

4.25. count-words will now report sentence count when used interactively.

4.26. New user option set-message-functions.

It allows more flexible control of how echo-area messages are displayed by adding functions to this list. The default value is a list of one element: set-minibuffer-message, which displays echo-area messages at the end of the minibuffer text when the minibuffer is active. Other useful functions include inhibit-message, which allows specifying, via inhibit-message-regexps, the list of messages whose display should be inhibited; and set-multi-message that accumulates recent messages and displays them stacked together.

4.27. New user option find-library-include-other-files.

If set to nil, commands like find-library will only include library files in the completion candidates. The default is t, which preserves previous behavior, whereby non-library files could also be included.

4.28. New command sqlite-mode-open-file for examining an sqlite3 file.

This uses the new sqlite-mode which allows listing the tables in a DB file, and examining and modifying the columns and the contents of those tables.

4.29. write-file will now copy some file mode bits.

If the current buffer is visiting a file that is executable, the 【C-x C-w】 command will now make the new file executable, too.

4.30. New user option process-error-pause-time.

This determines how long to pause Emacs after a process filter/sentinel error has been handled.

4.31. New faces for font-lock.

These faces are primarily meant for use with tree-sitter. They are: font-lock-bracket-face, font-lock-delimiter-face, font-lock-escape-face, font-lock-function-call-face, font-lock-misc-punctuation-face, font-lock-number-face, font-lock-operator-face, font-lock-property-name-face, font-lock-property-use-face, font-lock-punctuation-face, font-lock-regexp-face, and font-lock-variable-use-face.

4.32. New face variable-pitch-text.

This face is like variable-pitch (from which it inherits), but is slightly larger, which should help with the visual size differences between the default, non-proportional font and proportional fonts when mixed.

4.33. New face mode-line-active.

This inherits from the mode-line face, but is the face actually used on the mode lines (along with mode-line-inactive).

4.34. New face attribute pseudo-value reset.

This value stands for the value of the corresponding attribute of the default face. It can be used to reset attribute values produced by inheriting from other faces.

4.35. New X resource "borderThickness".

This controls the thickness of the external borders of the menu bars and pop-up menus.

4.36. New X resource "inputStyle".

This controls the style of the pre-edit and status areas of X input methods.

4.37. New X resources "highlightForeground" and "highlightBackground".

Only in the Lucid build, this controls colors used for highlighted menu item widgets.

4.38. On X, Emacs now tries to synchronize window resize with the window manager.

This leads to less flicker and empty areas of a frame being displayed when a frame is being resized. Unfortunately, it does not work on some ancient buggy window managers, so if Emacs appears to freeze, but is still responsive to input, you can turn it off by setting the X resource "synchronizeResize" to "off".

4.39. On X, Emacs can optionally synchronize display with the graphics hardware.

When this is enabled by setting the X resource "synchronizeResize" to "extended", frame content "tearing" is drastically reduced. This is only supported on the Motif, Lucid, and no-toolkit builds, and requires an X compositing manager supporting the extended frame synchronization protocol (see https://fishsoup.net/misc/wm-spec-synchronization.html).

This behavior can be toggled on and off via the frame parameter use-frame-synchronization.

4.40. New frame parameter alpha-background and X resource "alphaBackground".

This controls the opacity of the text background when running on a composited display.

4.41. New frame parameter shaded.

With window managers which support this, it controls whether or not a frame's contents will be hidden, leaving only the title bar on display.

4.42. New user option x-gtk-use-native-input.

This controls whether or not GTK input methods are used by Emacs, instead of XIM input methods. Defaults to nil.

4.43. New user option use-system-tooltips.

This controls whether to use the toolkit tooltips, or Emacs's own native implementation of tooltips as small frames. This option is only meaningful if Emacs was built with GTK+, Nextstep, or Haiku support, and defaults to t, which makes Emacs use the toolkit tooltips. The existing GTK-specific option x-gtk-use-system-tooltips is now an alias of this new option.

4.44. Non-native tooltips are now supported on Nextstep.

This means Emacs built with GNUstep or built on macOS is now able to display different faces and images inside tooltips when the use-system-tooltips user option is nil.

4.45. New minor mode pixel-scroll-precision-mode.

When enabled, and if your mouse supports it, you can scroll the display up or down at pixel resolution, according to what your mouse wheel reports. Unlike pixel-scroll-mode, this mode scrolls the display pixel-by-pixel, as opposed to only animating line-by-line scrolls.

4.46. Terminal Emacs

4.46.1. Emacs will now use 24-bit colors on terminals that support "Tc" capability.

This is in addition to previously-supported ways of discovering 24-bit color support: either via the "RGB" or "setf24" capabilities, or if the COLORTERM environment variable is set to the value "truecolor".

4.46.2. Select active regions with xterm selection support.

On terminals with xterm "setSelection" support, the active region may be saved to the X primary selection, following the select-active-regions variable. This support is enabled when tty-select-active-regions is non-nil.

4.46.3. New command to set up display of unsupported characters.

The new command standard-display-by-replacement-char produces Lisp code that sets up the standard-display-table to use a replacement character for display of characters that the text-mode terminal doesn't support. This code is intended to be used in your init files. This feature is most useful with the Linux console and similar terminals, where Emacs has a reliable way of determining which characters have glyphs in the font loaded into the terminal's memory.

4.46.4. New functions to set terminal output buffer size.

The new functions 'tty–set-output-buffer-size' and 'tty–output-buffer-size' allow setting and retrieving the output buffer size of a terminal device. The default buffer size is and has always been BUFSIZ, which is defined in your system's stdio.h. When you set a buffer size with 'tty–set-output-buffer-size', this also prevents Emacs from explicitly flushing the tty output stream, except at the end of display update.

4.47. ERT

4.47.1. New ERT variables ert-batch-print-length and ert-batch-print-level.

These variables will override print-length and print-level when printing Lisp values in ERT batch test results.

4.47.2. Redefining an ERT test in batch mode now signals an error.

Executing ert-deftest with the same name as an existing test causes the previous definition to be discarded, which was probably not intended when this occurs in batch mode. To remedy the error, rename tests so that they all have unique names.

4.47.3. ERT can generate JUnit test reports.

When environment variable 'EMACSTESTJUNITREPORT' is set, ERT generates a JUnit test report under this file name. This is useful for Emacs integration into CI/CD test environments.

4.47.4. Unbound test symbols now signal an ert-test-unbound error.

This affects the ert-select-tests function and its callers.

4.48. Emoji

4.48.1. Emacs now has several new methods for inserting Emoji.

The Emoji commands are under the new 【C-x 8 e】 prefix.

4.48.2. 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.

4.48.3. New command emoji-search (bound to 【C-x 8 e s】).

This command lets you search for and insert an Emoji based on names.

4.48.4. New command emoji-list (bound to 【C-x 8 e l】).

This command lists all Emoji (categorized by themes) in a special buffer and lets you choose one of them to insert.

4.48.5. New command emoji-recent (bound to 【C-x 8 e r】).

This command lets you choose among the Emoji you have recently inserted and insert it.

4.48.6. New command emoji-describe (bound to 【C-x 8 e d】).

This command will tell you the name of the Emoji at point. (It also works for non-Emoji characters.)

4.48.7. New commands emoji-zoom-increase and emoji-zoom-decrease.

These are bound to 【C-x 8 e +】 and 【C-x 8 e -】, respectively. They can be used on any character, but are mainly useful for Emoji.

4.48.8. New command emoji-zoom-reset.

This is bound to 【C-x 8 e 0】, and undoes any size changes performed by emoji-zoom-increase and emoji-zoom-decrease.

4.48.9. New input method emoji.

This allows you to enter Emoji using short strings, eg ':facepalm:' or ':scream:'.

4.49. Help

4.49.1. Variable values displayed by 【C-h v】 in "Help" are now fontified.

4.49.2. New user option help-clean-buttons.

If non-nil, link buttons in "Help" buffers will have any surrounding quotes removed.

4.49.3. 'M-x apropos-variable' output now includes values of variables.

Such an apropos buffer is more easily viewed with outlining after enabling outline-minor-mode in apropos-mode.

4.49.4. New docstring syntax to indicate that symbols shouldn't be links.

When displaying docstrings in "Help" buffers, strings that are "`like-this'" are made into links (if they point to a bound function/variable). This can lead to false positives when talking about values that are symbols that happen to have the same names as functions/variables. To inhibit this buttonification, use the new "\\+`like-this'" syntax.

4.49.5. New user option help-window-keep-selected.

If non-nil, commands to show the info manual and the source will reuse the same window in which the "Help" buffer is shown.

4.49.6. Commands like 【C-h f】 have changed how they describe menu bindings.

For instance, previously a command might be described as having the following bindings:

It is bound to <open>, C-x C-f, <menu-bar> <file> <new-file>.

This has been changed to:

It is bound to <open> and C-x C-f. It can also be invoked from the menu: File → Visit New File…

4.49.7. The 'C-h .' command now accepts a prefix argument.

'C-u C-h .' would previously inhibit displaying a warning message if there was no local help at point. This has been changed to call button-describe/widget-describe and display button/widget help instead.

4.49.8. New user option help-enable-variable-value-editing.

If enabled, e on a value in "Help" will pop you to a new buffer where you can edit the value. This is not enabled by default, because it is easy to make an edit that yields an invalid result.

4.49.9. 【C-h b】 uses outlining by default.

Set describe-bindings-outline to nil to get back the old behavior.

4.49.10. Jumping to function/variable source now saves mark before moving point.

Jumping to source from a "Help" buffer moves point when the source buffer is already open. Now, the old point is pushed onto mark ring.

4.49.11. New key bindings in "Help" buffers: n and p.

These will take you (respectively) to the next and previous "page".

4.49.12. describe-char now also outputs the name of Emoji sequences.

4.49.13. New key binding in "Help" buffer: I.

This will take you to the Emacs Lisp manual entry for the item displayed, if any.

4.49.14. The 【C-h m】 (describe-mode) "Help" buffer has been reformatted.

It now only includes local minor modes at the start, and the global minor modes are listed after the major mode.

4.49.15. The user option help-window-select now affects apropos commands.

The apropos commands will now select the apropos window if help-window-select is non-nil.

4.49.16. describe-keymap now considers the symbol at point.

If the symbol at point is a keymap, describe-keymap suggests it as the default candidate.

4.49.17. New command help-quick displays an overview of common commands.

The command pops up a buffer at the bottom of the screen with a few helpful commands for various tasks. You can toggle the display using 'C-h C-q'.

4.50. Emacs now comes with Org v9.6.

See the file "etc/ORG-NEWS" for user-visible changes in Org.

4.51. Outline Mode

4.51.1. Support for customizing the default visibility state of headings.

Customize the user option outline-default-state to define what headings will be visible initially, after Outline mode is turned on. When the value is a number, the user option outline-default-rules determines the visibility of the subtree starting at the corresponding level. Values are provided to control showing a heading subtree depending on whether the heading matches a regexp, or on whether its subtree has long lines or is itself too long.

4.52. Outline Minor Mode

4.52.1. 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. The default is nil, but in help-mode it has the value insert that inserts the buttons directly into the buffer, and you can use RET to cycle outline visibility. When the value is in-margins, Outline Minor Mode uses the window margins for buttons that hide/show outlines.

4.52.2. Buttons and headings now have their own keymaps.

outline-button-icon-map, outline-overlay-button-map, and outline-inserted-button-map are now available as defined keymaps instead of being anonymous keymaps.

4.53. Windows

4.53.1. New commands split-root-window-below and split-root-window-right.

These commands split the root window in two, and are bound to 【C-x w 2】 and 【C-x w 3】, respectively. A number of other useful window-related commands are now available with key sequences that start with the 【C-x w】 prefix.

4.53.2. New display action display-buffer-full-frame.

This action removes other windows from the frame when displaying a buffer on that frame.

4.53.3. display-buffer now can set up the body size of the chosen window.

For example, a display-buffer-alist entry of

(window-width . (body-columns . 40))

will make the body of the chosen window 40 columns wide. For the height use window-height and body-lines, respectively.

4.53.4. display-buffer provides more options for using an existing window.

The display buffer action functions display-buffer-use-some-window and display-buffer-use-least-recent-window now honor the action alist entry window-min-height as well as the entries listed below to make the display of several buffers in a row more amenable.

4.53.5. New buffer display action alist entry lru-frames.

This allows specifying which frames display-buffer should consider when using a window that shows another buffer. It is interpreted as per the ALL-FRAMES argument of get-lru-window.

4.53.6. New buffer display action alist entry lru-time.

display-buffer will ignore windows with a use time higher than this when using a window that shows another buffer.

4.53.7. New buffer display action alist entry bump-use-time.

This has display-buffer bump the use time of any window it returns, making it a less likely candidate for displaying another buffer.

4.53.8. New buffer display action alist entry window-min-width.

This allows specifying a preferred minimum width of the window used to display a buffer.

4.53.9. You can specify on which window scroll-other-window operates.

This is controlled by the new other-window-scroll-default variable, which should be set to a function that returns a window. When this variable is nil, next-window is used.

4.54. Frames

4.54.1. Deleted frames can now be undeleted.

The 16 most recently deleted frames can be undeleted with 【C-x 5 u】 when undelete-frame-mode is enabled. Without a prefix argument, undelete the most recently deleted frame. With a numerical prefix argument between 1 and 16, where 1 is the most recently deleted frame, undelete the corresponding deleted frame.

4.54.2. The variable icon-title-format can now have the value t.

That value means to use frame-title-format for iconified frames. This is useful with some window managers and desktop environments which treat changes in frame's title as requests to raise the frame and/or give it input focus, or if you want the frame's title to be the same no matter if the frame is iconified or not.

4.55. Tab Bars and Tab Lines

4.55.1. New user option tab-bar-auto-width to automatically determine tab width.

This option is non-nil by default, which resizes tab-bar tabs so that their width is evenly distributed across the tab bar. A companion option tab-bar-auto-width-max controls the maximum width of a tab before its name on display is truncated.

4.55.2. 【C-x t RET】 creates a new tab when the provided tab name doesn't exist.

It prompts for the name of a tab and switches to it, creating a new tab if no tab exists by that name.

4.55.3. New keymap tab-bar-history-mode-map.

By default, it contains 'C-c <left>' and 'C-c <right>' to browse the history of tab window configurations back and forward.

4.56. 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.

4.57. Emacs Server and Client

4.57.1. New command-line option -r/'–reuse-frame' for emacsclient.

With this command-line option, Emacs reuses an existing graphical client frame if one exists; otherwise it creates a new frame.

4.57.2. New command-line option '-w N'/'–timeout=N' for emacsclient.

With this command-line option, emacsclient will exit if Emacs does not respond within N seconds. The default is to wait forever.

4.57.3. server-stop-automatically can be used to automatically stop the server.

The Emacs server will be automatically stopped when certain conditions are met. The conditions are determined by the argument to server-stop-automatically, which can be empty, delete-frame or kill-terminal.

4.58. Rcirc

4.58.1. New command rcirc-when.

This shows the reception time of the message at point (if available).

4.58.2. New user option rcirc-cycle-completion-flag.

Rcirc now uses the default completion-at-point mechanism. The conventional IRC behavior of completing by cycling through the available options can be restored by enabling this option.

4.58.3. New user option rcirc-bridge-bot-alist.

If you are in a channel where a bot is responsible for bridging between networks, you can use this variable to make these messages appear more native. For example, you might set the option to:

(setopt rcirc-bridge-bot-alist '(("bridge" . "{\\(.+?\\)}[[:space:]]+")))

for messages like

09:47 <bridge> {john} I am not on IRC

to be reformatted into

09:47 <john> I am not on IRC

4.58.4. New formatting commands.

Most IRC clients (including rcirc) support basic formatting using control codes. Under the 'C-c C-f' prefix a few commands have been added to insert these automatically. For example, if a region is active and 'C-c C-f C-b' is invoked, markup is inserted for the region to be highlighted in bold.

4.59. Imenu

4.59.1. imenu is now bound to 【M-g i】 globally.

4.59.2. New function imenu-flush-cache.

Use it if you want Imenu to forget the buffer's index alist and recreate it anew next time imenu is invoked.

4.60. Emacs is now capable of abandoning a window's redisplay that takes too long.

This is controlled by the new variable max-redisplay-ticks. If that variable is set to a non-zero value, display of a window will be aborted after that many low-level redisplay operations, thus preventing Emacs from becoming wedged when visiting files with very long lines. The default is zero, which disables the feature: Emacs will wait forever for redisplay to finish. (We believe you won't need this feature, given the ability to display buffers with very long lines.)

5. Editing Changes in Emacs 29.1

5.1. M-SPC is now bound to cycle-spacing.

Formerly it invoked just-one-space. The actions performed by cycle-spacing and their order can now be customized via the user option cycle-spacing-actions.

5.2. zap-to-char and zap-up-to-char are case-sensitive for upper-case chars.

These commands now behave as case-sensitive for interactive calls when they are invoked with an uppercase character, regardless of the value of case-fold-search.

5.3. scroll-other-window and scroll-other-window-down now respect remapping.

These commands (bound to C-M-v and C-M-V) used to scroll the other windows without looking at customizations in that other window. These functions now check whether they have been rebound in the buffer shown in that other window, and then call the remapped function instead. In addition, these commands now also respect the scroll-error-top-bottom user option.

5.4. 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.

5.5. New user option translate-upper-case-key-bindings.

Set this option to nil to inhibit the default translation of upper case keys to their lower case variants.

5.6. New command ensure-empty-lines.

This command increases (or decreases) the number of empty lines before point.

5.7. Improved mouse behavior with auto-scrolling modes.

When clicking inside the scroll-margin or hscroll-margin region, point is now moved only when releasing the mouse button. This no longer results in a bogus selection, unless the mouse has also been dragged.

5.8. kill-ring-max now defaults to 120.

5.9. New user option yank-menu-max-items.

Customize this option to limit the number of entries in the menu "Edit → Paste from Kill Menu". The default is 60.

5.10. New user option copy-region-blink-predicate.

By default, when copying a region with kill-ring-save, Emacs only blinks point and mark when the region is not denoted visually, that is, when either the region is inactive, or the region face is indistinguishable from the default face.

Users who would rather enable blinking unconditionally can now set this user option to always. To disable blinking unconditionally, either set this option to ignore, or set copy-region-blink-delay to 0.

5.11. Performing a pinch gesture on a touchpad now increases the text scale.

5.12. Show Paren Mode

5.12.1. 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. The default is nil.

This option can also be set to the symbols overlay or child-frame, in which case the context is shown in an overlay or child-frame at the top-left of the current window. The latter option requires a graphical frame. On non-graphical frames, the context is shown in the echo area.

5.13. Comint

5.13.1. comint-term-environment is now aware of connection-local variables.

The user option comint-terminfo-terminal and the variable system-uses-terminfo can now be set as connection-local variables to change the terminal used on a remote host.

5.13.2. New user option comint-delete-old-input.

When nil, this prevents comint from deleting the current input when inserting previous input using '<mouse-2>'. The default is t, to preserve previous behavior.

5.13.3. New minor mode comint-fontify-input-mode.

This minor mode is enabled by default in "shell" and "ielm" buffers. It fontifies input text according to shell-mode or emacs-lisp-mode font-lock rules. Customize the user options shell-fontify-input-enable and ielm-fontify-input-enable to nil if you don't want to enable input fontification by default.

5.14. Mwheel

5.14.1. New user options for alternate wheel events.

The user options mouse-wheel-down-alternate-event and mouse-wheel-up-alternate-event as well as the variables mouse-wheel-left-alternate-event and mouse-wheel-right-alternate-event have been added to better support systems where two kinds of wheel events can be received.

5.15. Internationalization

5.15.1. The '<Delete>' function key now allows deleting the entire composed sequence.

For the details, see the item about the delete-forward-char command above.

5.15.2. New user option composition-break-at-point.

Setting it to a non-nil value temporarily disables automatic composition of character sequences at point, and thus makes it easier to edit such sequences by allowing point to "enter" the composed sequence.

5.15.3. Support for many old scripts and writing systems.

Emacs now supports, and has language-environments and input methods, for several dozens of old scripts that were used in the past for various languages. For each such script Emacs now has font-selection and character composition rules, a language environment, and an input method. The newly-added scripts and the corresponding language environments are:

Tai Tham script and the Northern Thai language environment

Brahmi script and language environment

Kaithi script and language environment

Tirhuta script and language environment

Sharada script and language environment

Siddham script and language environment

Syloti Nagri script and language environment

Modi script and language environment

Baybayin script and Tagalog language environment

Hanunoo script and language environment

Buhid script and language environment

Tagbanwa script and language environment

Limbu script and language environment

Balinese script and language environment

Javanese script and language environment

Sundanese script and language environment

Batak script and language environment

Rejang script and language environment

Makasar script and language environment

Lontara script and language environment

Hanifi Rohingya script and language environment

Grantha script and language environment

Kharoshthi script and language environment

Lepcha script and language environment

Meetei Mayek script and language environment

Adlam script and language environment

Mende Kikakui script and language environment

Wancho script and language environment

Toto script and language environment

Gothic script and language environment

Coptic script and language environment

Mongolian-traditional script and language environment

Mongolian-cyrillic language environment

5.15.4. The "Oriya" language environment was renamed to "Odia".

This is to follow the change in the official name of the script. The oriya input method was also renamed to odia. However, the old name of the language environment and the input method are still supported.

5.15.5. New Greek translation of the Emacs tutorial.

Type 'C-u C-h t' to select it in case your language setup does not do so automatically.

5.15.6. New Ukrainian translation of the Emacs tutorial.

5.15.7. New Farsi/Persian translation of the Emacs tutorial.

5.15.8. New default phonetic input method for the Tamil language environment.

The default input method for the Tamil language environment is now "tamil-phonetic" which is a customizable phonetic input method. To change the input method's translation rules, customize the user option tamil-translation-rules.

5.15.9. New tamil99 input method for the Tamil language.

This supports the keyboard layout specifically designed for the Tamil language.

5.15.10. New input method slovak-qwerty.

This is a variant of the slovak input method, which corresponds to the QWERTY Slovak keyboards.

5.15.11. New input method cyrillic-chuvash.

This input method is based on the russian-computer input method, and is intended for typing in the Chuvash language written in the Cyrillic script.

5.15.12. New input method cyrillic-mongolian.

This input method is for typing in the Mongolian language using the Cyrillic script. It is the default input method for the new Mongolian-cyrillic language environment, see above.

6. Changes in Specialized Modes and Packages in Emacs 29.1

6.1. Ecomplete

6.1.1. New commands ecomplete-edit and ecomplete-remove.

These allow you to (respectively) edit and bulk-remove entries from the ecomplete database.

6.1.2. New user option ecomplete-auto-select.

If non-nil and there's only one matching option, auto-select that.

6.1.3. New user option ecomplete-filter-regexp.

If non-nil, this user option describes what entries not to add to the database stored on disk.

6.2. Auth Source

6.2.1. New user option auth-source-pass-extra-query-keywords.

Whether to recognize additional keyword params, like ':max' and ':require', as well as accept lists of query terms paired with applicable keywords. This disables most known behavioral quirks unique to auth-source-pass, such as wildcard subdomain matching.

6.3. Dired

6.3.1. dired-guess-shell-command moved from dired-x to dired.

This means that dired-do-shell-command will now provide smarter defaults without first having to require dired-x. See the node "(emacs) Shell Command Guessing" in the Emacs manual for more details.

6.3.2. dired-clean-up-buffers-too moved from dired-x to dired.

This means that Dired now offers to kill buffers visiting files and dirs when they are deleted in Dired. Before, you had to require dired-x to enable this behavior. To disable this behavior, customize the user option dired-clean-up-buffers-too to nil. The related user option dired-clean-confirm-killing-deleted-buffers (which see) has also been moved to dired.

6.3.3. dired-do-relsymlink moved from dired-x to dired.

The corresponding key Y is now bound by default in Dired.

6.3.4. dired-do-relsymlink-regexp moved from dired-x to dired.

The corresponding key sequence '% Y' is now bound by default in Dired.

6.3.5. M-G is now bound to dired-goto-subdir.

Before, that binding was only available if the dired-x package was loaded.

6.3.6. dired-info and dired-man moved from dired-x to dired.

The dired-info and dired-man commands have been moved from the dired-x package to dired. They have also been renamed to dired-do-info and dired-do-man; the old command names are obsolete aliases.

The keys I (dired-do-info) and N (dired-do-man) are now bound in Dired mode by default. The user options dired-bind-man and dired-bind-info no longer have any effect and are obsolete.

To get the old behavior back and unbind these keys in Dired mode, add the following to your Init file:

(with-eval-after-load 'dired (keymap-set dired-mode-map "N" nil) (keymap-set dired-mode-map "I" nil))

6.3.7. New command dired-do-eww.

This command visits the file on the current line with EWW.

6.3.8. browse-url-of-dired-file can now call the secondary browser.

When invoked with a prefix arg, this will now call browse-url-secondary-browser-function instead of the default browser. browse-url-of-dired-file is bound to W by default in dired mode.

6.3.9. New user option dired-omit-lines.

This is used by dired-omit-mode, and now allows you to hide based on other things than just the file names.

6.3.10. New user option dired-mouse-drag-files.

If non-nil, dragging file names with the mouse in a Dired buffer will initiate a drag-and-drop session allowing them to be opened in other programs.

6.3.11. New user option dired-free-space.

Dired will now, by default, include the free space in the first line instead of having it on a separate line. To get the previous behavior back, say:

(setopt dired-free-space 'separate)

6.3.12. 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.

6.3.13. Search and replace in Dired/Wdired supports more regexps.

For example, the regexp ".*" will match only characters that are part of the file name. Also "^.*$" can be used to match at the beginning of the file name and at the end of the file name. This is used only when searching on file names. In Wdired this can be used when the new user option wdired-search-replace-filenames is non-nil (which is the default).

6.4. Elisp

6.4.1. New command elisp-eval-region-or-buffer (bound to 'C-c C-e').

This command evals the forms in the active region or in the whole buffer.

6.4.2. New commands elisp-byte-compile-file and elisp-byte-compile-buffer.

These commands (bound to 'C-c C-f' and 'C-c C-b', respectively) byte-compile the visited file and the current buffer, respectively.

6.5. Games

6.5.1. New user option tetris-allow-repetitions.

This controls how randomness is implemented (whether to use pure randomness as before, or to use a bag).

6.6. Battery

6.6.1. New user option battery-update-functions.

This can be used to trigger actions based on the battery status.

6.7. DocView

6.7.1. doc-view can now generate SVG images when viewing PDF files.

If Emacs is built with SVG support, doc-view can generate SVG files when using MuPDF as the converter for PDF files, which generally leads to sharper images (especially when zooming), and allows customization of background and foreground color of the page via the new user options doc-view-svg-background and doc-view-svg-foreground. To activate this behavior, set doc-view-mupdf-use-svg to non-nil if your Emacs has SVG support. Note that, with some versions of MuPDF, SVG generation is known to sometimes produce SVG files that are buggy or can take a long time to render.

6.8. Enriched Mode

6.8.1. New command enriched-toggle-markup.

This allows you to see the markup in enriched-mode buffers (e.g., the "HELLO" file). Bound to 【M-o m】 by default.

6.9. Shell Script Mode

6.9.1. New user option sh-indent-statement-after-and.

This controls how statements like the following are indented:

foo && bar

6.9.2. New Flymake backend using the ShellCheck program.

It is enabled by default, but requires that the external "shellcheck" command is installed.

6.10. CC Mode

6.10.1. C++ Mode now supports most of the new features in the C++20 Standard.

6.10.2. In Objective-C Mode, no extra types are recognized by default.

The default value of objc-font-lock-extra-types has been changed to nil, since too many identifiers were getting misfontified as types. This may cause some actual types not to get fontified. To get the old behavior back, customize the user option to the value suggested in its doc string.

6.11. Cperl Mode

6.11.1. New user option cperl-file-style.

This option determines the indentation style to be used. It can also be used as a file-local variable.

6.12. Gud

6.12.1. gud-go is now bound to 'C-c C-v'.

If given a prefix, it will prompt for an argument to use for the run/continue command.

6.12.2. perldb now recognizes -E.

As of Perl 5.10, 'perl -E 0' behaves like 'perl -e 0' but also activates all optional features of the Perl version in use. perldb now uses this invocation as its default.

6.13. Customize

6.13.1. New command custom-toggle-hide-all-widgets.

This is bound to H and toggles whether to hide or show the widget contents.

6.14. Diff Mode

6.14.1. New user option diff-whitespace-style.

Sets the value of the buffer-local variable whitespace-style in diff-mode buffers. By default, this variable is '(face trailing)', which preserves behavior of previous Emacs versions.

6.14.2. New user option diff-add-log-use-relative-names.

If non-nil insert file names in ChangeLog skeletons relative to the VC root directory.

6.15. Ispell

6.15.1. ispell-region and ispell-buffer now push the mark.

These commands push onto the mark ring the location of the last misspelled word where corrections were offered, so that you can then skip back to that location with 【C-x C-x】.

6.16. Dabbrev

6.16.1. New function dabbrev-capf for use on completion-at-point-functions.

6.16.2. New user option dabbrev-ignored-buffer-modes.

Buffers with major modes in this list will be ignored. By default, this includes "binary" buffers like archive-mode and image-mode.

6.17. Package

6.17.1. New command package-upgrade.

This command allows you to upgrade packages without using list-packages. A package that comes with the Emacs distribution can only be upgraded after you install, once, a newer version from ELPA via the package-menu displayed by list-packages.

6.17.2. New command package-upgrade-all.

This command allows upgrading all packages without any queries. A package that comes with the Emacs distribution will only be upgraded by this command after you install, once, a newer version of that package from ELPA via the package-menu displayed by list-packages.

6.17.3. New commands package-recompile and package-recompile-all.

These commands can be useful if the ".elc" files are out of date (invalid byte code and macros).

6.17.4. New DWIM action on x in "Packages" buffer.

If no packages are marked, x will install the package under point if it isn't already, and remove it if it is installed. Customize the new option package-menu-use-current-if-no-marks to the nil value to get back the old behavior of signaling an error in that case.

6.17.5. New command package-vc-install.

Packages can now be installed directly from source by cloning from their repository.

6.17.6. New command package-vc-install-from-checkout.

An existing checkout can now be loaded via package.el, by creating a symbolic link from the usual package directory to the checkout.

6.17.7. New command package-vc-checkout.

Used to fetch the source of a package by cloning a repository without activating the package.

6.17.8. New command package-vc-prepare-patch.

This command allows you to send patches to package maintainers, for packages checked out using package-vc-install.

6.17.9. New command package-report-bug.

This command helps you compose an email for sending bug reports to package maintainers, and is bound to b in the "Packages" buffer.

6.17.10. New user option package-vc-selected-packages.

By customizing this user option you can specify specific packages to install.

6.17.11. New user option package-install-upgrade-built-in.

When enabled, package-install will include in the list of upgradeable packages those built-in packages (like Eglot and use-package, for example) for which a newer version is available in package archives, and will allow installing those newer versions. By default, this is disabled; however, if package-install is invoked with a prefix argument, it will act as if this new option were enabled.

In addition, when this option is non-nil, built-in packages for which a new version is available in archives can be upgraded via the package menu produced by list-packages. If you do set this option non-nil, we recommend not to use the U command, but instead to use '/ u' to show the packages which can be upgraded, and then decide which ones of them you actually want to update from the archives.

If you customize this option, we recommend you place its non-default setting in your early-init file.

6.18. Emacs Sessions (Desktop)

6.18.1. New user option to load a locked desktop if locking Emacs is not running.

The option desktop-load-locked-desktop can now be set to the value check-pid, which means to allow loading a locked ".emacs.desktop" file if the Emacs process which locked it is no longer running on the local machine. This allows avoiding questions about locked desktop files when the Emacs session which locked it crashes, or was otherwise interrupted and didn't exit gracefully. See the "(emacs) Saving Emacs Sessions" node in the Emacs manual for more details.

6.19. Miscellaneous

6.19.1. New command scratch-buffer.

This command switches to the "scratch" buffer. If "scratch" doesn't exist, the command creates it first. You can use this command if you inadvertently delete the "scratch" buffer.

6.20. Debugging

6.20.1. q in a "Backtrace" buffer no longer clears the buffer.

Instead it just buries the buffer and switches the mode from debugger-mode to backtrace-mode, since commands like e are no longer available after exiting the recursive edit.

6.20.2. New user option debug-allow-recursive-debug.

This user option controls whether the e (in a "Backtrace" buffer or while edebugging) and 【C-x C-e】 (while edebugging) commands lead to a (further) backtrace. By default, this variable is nil, which is a change in behavior from previous Emacs versions.

6.20.3. e in edebug can now take a prefix arg to pretty-print the results.

When invoked with a prefix argument, as in 【C-u e】, this command will pop up a new buffer and show the full pretty-printed value there.

6.20.4. 【C-x C-e】 now interprets a non-zero prefix arg to pretty-print the results.

When invoked with a non-zero prefix argument, as in 'C-u C-x C-e', this command will pop up a new buffer and show the full pretty-printed value there.

6.20.5. You can now generate a backtrace from Lisp errors in redisplay.

To do this, set the new variable backtrace-on-redisplay-error to a non-nil value. The backtrace will be written to a special buffer named "Redisplay-trace". This buffer will not be automatically displayed in a window.

6.21. Compile

6.21.1. New user option compilation-hidden-output.

This regular expression can be used to make specific parts of compilation output invisible.

6.21.2. The compilation-auto-jump-to-first-error user option has been extended.

It can now have the additional values if-location-known (which will only jump if the location of the first error is known), and first-known (which will jump to the first known error location).

6.21.3. New user option compilation-max-output-line-length.

Lines longer than the value of this option will have their ends hidden, with a button to reveal the hidden text. This speeds up operations like grepping on files that have few newlines. The default value is 400; set to nil to disable hiding.

6.22. Flymake

6.22.1. New user option flymake-mode-line-lighter.

6.23. New minor mode word-wrap-whitespace-mode for extending word-wrap.

This mode switches word-wrap on, and breaks on all the whitespace characters instead of just SPC and TAB.

6.24. New mode, emacs-news-mode, for editing the NEWS file.

This mode adds some highlighting, makes the M-q command aware of the format of NEWS entries, and has special commands for doing maintenance of the Emacs NEWS files. In addition, this mode turns on outline-minor-mode, and thus displays customizable icons (see icon-preference) in the margins. To disable these icons, set outline-minor-mode-use-buttons to a nil value.

6.25. Kmacro

Kmacros are now OClosures and have a new constructor kmacro which uses the key-parse syntax. It replaces the old kmacro-lambda-form (which is now declared obsolete).

6.26. savehist.el can now truncate variables that are too long.

An element of user option savehist-additional-variables can now be of the form '(VARIABLE . MAX-ELTS)', which means to truncate the VARIABLE's value to at most MAX-ELTS elements (if the value is a list) before saving the value.

6.27. Minibuffer and Completions

6.27.1. New commands for navigating completions from the minibuffer.

When the minibuffer is the current buffer, typing 'M-<up>' or 'M-<down>' selects a previous/next completion candidate from the "Completions" buffer and inserts it to the minibuffer. When the user option minibuffer-completion-auto-choose is nil, 'M-<up>' and 'M-<down>' do the same, but without inserting a completion candidate to the minibuffer, then M-RET can be used to choose the currently active candidate from the "Completions" buffer and exit the minibuffer. With a prefix argument, 'C-u M-RET' inserts the currently active candidate to the minibuffer, but doesn't exit the minibuffer. These keys are also available for in-buffer completion, but they don't insert candidates automatically, you need to type M-RET to insert the selected candidate to the buffer.

6.27.2. Choosing a completion with a prefix argument doesn't exit the minibuffer.

This means that typing 【C-u RET】 on a completion candidate in the "Completions" buffer inserts the completion into the minibuffer, but doesn't exit the minibuffer.

6.27.3. The "Completions" buffer can now be automatically selected.

To enable this behavior, customize the user option completion-auto-select to t, then pressing TAB will switch to the "Completions" buffer when it pops up that buffer. If the value is second-tab, then the first TAB will display "Completions", and the second one will switch to the "Completions" buffer.

6.27.4. New user option completion-auto-wrap.

When non-nil, the commands next-completion and previous-completion automatically wrap around on reaching the beginning or the end of the "Completions" buffer.

6.27.5. New values for the completion-auto-help user option.

There are two new values to control the way the "Completions" buffer behaves after pressing a TAB if completion is not unique. The value always updates or shows the "Completions" buffer after any attempt to complete. The value visual is like always, but only updates the completions if they are already visible. The default value t always hides the completion buffer after some completion is made.

6.27.6. New commands to complete the minibuffer history.

minibuffer-complete-history (【C-x <up>】) is like minibuffer-complete but completes on the history items instead of the default completion table. minibuffer-complete-defaults (【C-x <down>】) completes on the list of default items.

6.27.7. User option minibuffer-eldef-shorten-default is now obsolete.

Customize the user option minibuffer-default-prompt-format instead.

6.27.8. New user option completions-sort.

This option controls the sorting of the completion candidates in the "Completions" buffer. Available styles are no sorting, alphabetical (the default), or a custom sort function.

6.27.9. New user option completions-max-height.

This option limits the height of the "Completions" buffer.

6.27.10. New user option completions-header-format.

This is a string to control the header line to show in the "Completions" buffer before the list of completions. If it contains "%s", that is replaced with the number of completions. If nil, the header line is not shown.

6.27.11. New user option completions-highlight-face.

When this user option names a face, the current candidate in the "Completions" buffer is highlighted with that face. The nil value disables this highlighting. The default is to highlight using the completions-highlight face.

6.27.12. You can now define abbrevs for the minibuffer modes.

minibuffer-mode-abbrev-table and minibuffer-inactive-mode-abbrev-table are now defined.

6.28. Isearch and Replace

6.28.1. Changes in how Isearch responds to mouse-yank-at-point.

If a user does C-s and then uses '<mouse-2>' (mouse-yank-primary) outside the echo area, Emacs will, by default, end the Isearch and yank the text at mouse cursor. But if mouse-yank-at-point is non-nil, the text will now be added to the Isearch instead.

6.28.2. Changes for values no and no-ding of isearch-wrap-pause.

Now with these values the search will wrap around not only on repeating with 'C-s C-s', but also after typing a character.

6.28.3. New user option char-fold-override.

Non-nil means that the default definitions of equivalent characters are overridden.

6.28.4. New command describe-char-fold-equivalences.

It displays character equivalences used by char-fold-to-regexp.

6.28.5. New command isearch-emoji-by-name.

It is bound to 【C-x 8 e RET】 during an incremental search. The command accepts the Unicode name of an Emoji (for example, "smiling face" or "heart with arrow"), like 【C-x 8 e e】, with minibuffer completion, and adds the Emoji into the search string.

6.29. GDB/MI

6.29.1. New user option gdb-debuginfod-enable-setting.

On capable platforms, GDB 10.1 and later can download missing source and debug info files from special-purpose servers, called "debuginfod servers". Use this new option to control whether 【M-x gdb】 instructs GDB to download missing files from debuginfod servers when you debug the corresponding programs. The default is to ask you at the beginning of each debugging session whether to download the files for that session.

6.30. Glyphless Characters

6.30.1. New minor mode glyphless-display-mode.

This allows an easy way to toggle seeing all glyphless characters in the current buffer.

6.30.2. The extra slot of glyphless-char-display can now have cons values.

The extra slot of the glyphless-char-display char-table can now have values that are cons cells, specifying separate values for text-mode and GUI terminals.

6.30.3. "Replacement character" feature for undisplayable characters on TTYs.

The acronym method of displaying glyphless characters on text-mode frames treats single-character acronyms specially: they are displayed without the surrounding '[..]' "box", thus in effect treating such "acronyms" as replacement characters.

6.31. Registers

6.31.1. Buffer names can now be stored in registers.

For instance, to enable jumping to the "Messages" buffer with 【C-x r j m】:

(set-register ?m '(buffer . "Messages"))

6.32. Pixel Fill

6.32.1. This is a new package that deals with filling variable-pitch text.

6.32.2. New function pixel-fill-region.

This fills the region to be no wider than a specified pixel width.

6.33. Info

6.33.1. Command info-apropos now takes a prefix argument to search for regexps.

6.33.2. New command Info-goto-node-web and key binding G.

This will take you to the "gnu.org" web server's version of the current info node. This command only works for the Emacs and Emacs Lisp manuals.

6.34. Shortdoc

6.34.1. New command shortdoc-copy-function-as-kill bound to w.

It copies the name of the function near point into the kill ring.

6.34.2. N and P are now bound to 'shortdoc-{next,previous}-section'.

This is in addition to the old keybindings 'C-c C-n' and 'C-c C-p'.

6.35. VC

6.35.1. New command vc-pull-and-push.

This commands first does a "pull" command, and if that is successful, does a "push" command afterwards. Currently supported in Git and Bzr.

6.35.2. 【C-x v b】 prefix key is used now for branch commands.

vc-print-branch-log is bound to 【C-x v b l】, and new commands are vc-create-branch (【C-x v b c】) and vc-switch-branch (【C-x v b s】). The VC Directory buffer now uses the prefix b for these branch-related commands.

6.35.3. New command vc-dir-mark-by-regexp bound to '% m' and '* %'.

This command marks files based on a regexp. If given a prefix argument, unmark instead.

6.35.4. New command 【C-x v !】 (vc-edit-next-command).

This prefix command requests editing of the next VC shell command before execution. For example, in a Git repository, you can produce a log of more than one branch by typing 【C-x v ! C-x v b l】 and then appending additional branch names to the 'git log' command.

The intention is that this command can be used to access a wide variety of version control system-specific functionality from VC without complexifying either the VC command set or the backend API.

6.35.5. 【C-x v v】 in a diffs buffer allows to commit only some of the changes.

This command is intended to allow you to commit only some of the changes you have in your working tree. Begin by creating a buffer with the changes against the last commit, example: with 【C-x v D】 (vc-root-diff). Then edit the diffs to remove the hunks you don't want to commit. Finally, type 【C-x v v】 in that diff buffer to commit only part of your changes, those whose hunks were left in the buffer.

6.35.6. 【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.

6.35.7. Log Edit now fontifies long Git commit summary lines.

Writing shorter summary lines avoids truncation in contexts in which Git commands display summary lines. See the two new user options vc-git-log-edit-summary-target-len and vc-git-log-edit-summary-max-len.

6.35.8. New log-edit-headers-separator face.

It is used to style the line that separates the log-edit headers from the log-edit summary.

6.35.9. The function vc-read-revision accepts a new MULTIPLE argument.

If non-nil, multiple revisions can be queried. This is done using completing-read-multiple.

6.35.10. New function vc-read-multiple-revisions.

This function invokes vc-read-revision with a non-nil value for MULTIPLE.

6.35.11. New command vc-prepare-patch.

Patches for any version control system can be prepared using VC. The command will query what commits to send and will compose messages for your mail user agent. The behavior of vc-prepare-patch can be modified by the user options vc-prepare-patches-separately and vc-default-patch-addressee.

6.36. Message

6.36.1. 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.

6.36.2. Message Mode now supports image yanking.

6.36.3. New user option message-server-alist.

This controls automatic insertion of the "X-Message-SMTP-Method" header before sending a message.

6.37. HTML Mode

6.37.1. HTML Mode now supports "text/html" and "image/*" yanking.

6.38. Texinfo Mode

6.38.1. texinfo-mode now has a specialized narrow-to-defun definition.

It narrows to the current node.

6.39. EUDC

6.39.1. Deprecations planned for next release.

After Emacs 29.1, some aspects of EUDC will be deprecated. The goal of these deprecations is to simplify EUDC server configuration by making eudc-server-hotlist the only place to add servers. There will not be a need to set the server using the eudc-set-server command. Instead, the eudc-server-hotlist user option should be customized to have an entry for the server. The plan is to obsolete the eudc-hotlist package since Customize is sufficient for changing eudc-server-hotlist. How the eudc-server user option works in this context is to-be-determined; it can't be removed, because that would break compatibility, but it may become synchronized with eudc-server-hotlist so that eudc-server is always equal to '(car eudc-server-hotlist)'. The first entry in eudc-server-hotlist is the first server tried by eudc-expand-try-all. The hotlist simplification will allow eudc-query-form to show a drop down of possible servers, instead of requiring a call to eudc-set-server like it does in this release. The default value of eudc-ignore-options-file will be changed from nil to t.

6.39.2. New user option eudc-ignore-options-file that defaults to nil.

The eudc-ignore-options-file user option can be configured to ignore the eudc-options-file (typically "~/.emacs.d/eudc-options"). Most users should configure this to t and put EUDC configuration in the main Emacs initialization file ("~/.emacs" or "~/.emacs.d/init.el").

6.39.3. eudc-expansion-overwrites-query to eudc-expansion-save-query-as-kill.

The user option eudc-expansion-overwrites-query is renamed to eudc-expansion-save-query-as-kill to reflect the actual behavior of the user option. The former is kept as alias.

6.39.4. New command eudc-expand-try-all.

This command can be used in place of eudc-expand-inline. It takes a prefix argument that causes eudc-expand-try-all to return matches from all servers instead of just the matches from the first server to return any. This is useful for example, if one wants to search LDAP for a name that happens to match a contact in one's BBDB.

6.39.5. New behavior and default for user option eudc-inline-expansion-format.

EUDC inline expansion result formatting defaulted to

("%s %s <%s>" firstname name email)

Since email address specifications need to comply with RFC 5322 in order to be useful in messages, there was a risk of producing syntax which was standard with RFC 822, but is marked as obsolete syntax by its successor RFC 5322. Also, the first and last name part was never enclosed in double quotes, potentially producing invalid address specifications, which may be rejected by a receiving MTA. Thus, this variable can now additionally be set to nil (the new default), or a function. In both cases, the formatted result will be in compliance with RFC 5322. When set to nil, a default format very similar to the old default will be produced. When set to a function, that function is called, and the returned values are used to populate the phrase and comment parts (see RFC 5322 for definitions). In both cases, the phrase part will be automatically quoted if necessary.

6.39.6. New function eudc-capf-complete with message-mode integration.

EUDC can now contribute email addresses to completion-at-point by adding the new function eudc-capf-complete to completion-at-point-functions in message-mode.

6.39.7. Additional attributes of query and results in eudcb-macos-contacts.el.

The EUDC back-end for the macOS Contacts app now provides a wider set of attributes to use for queries, and delivers more attributes in query results.

6.39.8. New back-end for ecomplete.

A new back-end for ecomplete allows information from that database to be queried by EUDC, too. The attributes present in the EUDC query are used to select the entry type in the ecomplete database.

6.39.9. New back-end for mailabbrev.

A new back-end for mailabbrev allows information from that database to be queried by EUDC, too. Only the attributes email, name, and firstname are supported.

6.40. EWW/SHR

6.40.1. 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 the user option eww-buffer-name-length. By default, no automatic renaming is performed.

6.40.2. New user option shr-allowed-images.

This complements shr-blocked-images, but allows specifying just the allowed images.

6.40.3. New user option shr-use-xwidgets-for-media.

If non-nil (and Emacs has been built with support for xwidgets), display <video> elements with an xwidget. Note that this is experimental; it is known to crash Emacs on some systems, and just doesn't work on other systems. Also see etc/PROBLEMS.

6.40.4. 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.

6.41. Find Dired

6.41.1. New command find-dired-with-command.

This enables users to run find-dired with an arbitrary command, enabling running commands previously unsupported and also enabling new commands to be built on top.

6.42. Gnus

6.42.1. Tool bar changes in Gnus/Message.

There were previously two styles of tool bars available in Gnus and Message, referred to as gnus-summary-tool-bar-retro, gnus-group-tool-bar-retro and message-tool-bar-retro, and gnus-summary-tool-bar-gnome, gnus-group-tool-bar-gnome and message-tool-bar-gnome. The "retro" tool bars have been removed (as well as the icons used), and the "gnome" tool bars are now the only pre-defined toolbars.

6.42.2. gnus-summary-up-thread and gnus-summary-down-thread bindings removed.

The gnus-summary-down-thread binding to M-C-d was shadowed by gnus-summary-read-document, and these commands are also available on 'T u' and 'T d' respectively.

6.42.3. Gnus now uses a variable-pitch font in the headers by default.

To get the monospace font back, you can put something like the following in your ".gnus" file:

(set-face-attribute 'gnus-header nil :inherit 'unspecified)

6.42.4. The default value of gnus-treat-fold-headers is now head.

6.42.5. New face gnus-header.

All other 'gnus-header-*' faces inherit from this face now.

6.42.6. New user option gnus-treat-emojize-symbols.

If non-nil, symbols that have an Emoji representation will be displayed as emojis. The default is nil.

6.42.7. New command gnus-article-emojize-symbols.

This is bound to 'W D e' and will display symbols that have Emoji representation as Emoji.

6.42.8. New mu backend for gnus-search.

Configuration is very similar to the notmuch and namazu backends. It supports the unified search syntax.

6.42.9. gnus-html-image-cache-ttl is now a seconds count.

Formerly it was a pair of numbers '(A B)' that represented 65536*A + B, to cater to older Emacs implementations that lacked bignums. The older form still works but is undocumented.

6.43. Rmail

6.43.1. Rmail partial summaries can now be applied one on top of the other.

You can now narrow the set of messages selected by Rmail summary's criteria (recipients, topic, senders, etc.) by making a summary of the already summarized messages. For example, invoking rmail-summary-by-senders, followed by rmail-summary-by-topic will produce a summary where both the senders and the topic are according to your selection. The new user option rmail-summary-progressively-narrow controls whether the stacking of the filters is in effect; customize it to a non-nil value to enable this feature.

6.43.2. New Rmail summary: by thread.

The new command rmail-summary-by-thread produces a summary of messages that belong to a single thread of discussion.

6.44. EIEIO

6.44.1. slot-value can now be used to access slots of cl-defstruct objects.

6.45. Align

6.45.1. 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.

6.46. Help

6.46.1. New mode, emacs-news-view-mode, for viewing the NEWS file.

This mode is used by the 【C-h N】 command, and adds buttons to manual entries and symbol references.

6.46.2. New user option help-link-key-to-documentation.

When this option is non-nil (which is the default), 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】).

6.47. Info Look

6.47.1. 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).

6.48. Ansi Color

6.48.1. 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.

6.49. Term Mode

6.49.1. New user option term-bind-function-keys.

If non-nil, term-mode will pass the function keys on to the underlying shell instead of using the normal Emacs bindings.

6.49.2. 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.

6.50. Project

6.50.1. project-find-file and project-or-external-find-file can include all.

The commands project-find-file and project-or-external-find-file now accept a prefix argument, which is interpreted to mean "include all files".

6.50.2. New command project-list-buffers bound to 【C-x p C-b】.

This command displays a list of buffers from the current project.

6.50.3. project-kill-buffers can display the list of buffers to kill.

Customize the user option project-kill-buffers-display-buffer-list to enable the display of the buffer list.

6.50.4. New user option project-vc-extra-root-markers.

Use it to add detection of nested projects (inside a VCS repository), or projects outside of VCS repositories.

As a consequence, the 'VC project backend' is formally renamed to 'VC-aware project backend'.

6.50.5. New user option project-vc-include-untracked.

If non-nil, files untracked by a VCS are considered to be part of the project by a VC project based on that VCS.

6.51. Xref

6.51.1. New command xref-go-forward.

It is bound to 'C-M-,' and jumps to the location where you previously invoked xref-go-back ('M-,', also known as xref-pop-marker-stack).

6.51.2. The depth of the Xref marker stack is now infinite.

The implementation of the Xref marker stack was changed in a way that allows as many places to be saved on the stack as needed, limited only by the available memory. Therefore, the variables find-tag-marker-ring-length and xref-marker-ring-length are now obsolete and unused; setting them has no effect.

6.51.3. xref-query-replace-in-results prompting change.

This command no longer prompts for FROM when called without prefix argument. This makes the most common case faster: replacing entire matches.

6.51.4. New command xref-find-references-and-replace to rename one identifier.

6.51.5. New variable xref-current-item (renamed from a private version).

6.51.6. New function xref-show-xrefs.

6.51.7. outline-minor-mode is supported in Xref buffers.

You can enable outlining by adding outline-minor-mode to xref-after-update-hook.

6.52. File Notifications

6.52.1. The new command file-notify-rm-all-watches removes all file notifications.

6.53. Sql

6.53.1. 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.

6.54. Image Mode

6.54.1. 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 can scale the image up as well as down. It is bound to 's w' in Image Mode by default.

6.54.2. New command image-mode-wallpaper-set.

This command sets the desktop background to the current image. It is bound to W in Image Mode by default.

6.54.3. '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'.

6.54.4. User option image-auto-resize can now be set to fit-window.

This works like image-transform-fit-to-window.

6.54.5. New user option image-auto-resize-max-scale-percent.

The new fit-window option will never scale an image more than this much (in percent). It is nil by default, which means no limit.

6.54.6. New user option image-text-based-formats.

This controls whether or not to show a message, when opening certain image formats, explaining how to edit it as text. The default is to show this message for SVG and XPM.

6.54.7. New command image-transform-set-percent.

It allows resizing the image to a percentage of its original size, and is bound to 's p' in Image mode.

6.54.8. image-transform-original renamed to image-transform-reset-to-original.

The old name was confusing, and is now an obsolete function alias.

6.54.9. image-transform-reset renamed to image-transform-reset-to-initial.

The old name was confusing, and is now an obsolete function alias.

6.55. Images

6.55.1. New commands image-crop and image-cut.

These commands allow interactively cropping/cutting the image at point. The commands are bound to keys 'i c' and 'i x' (respectively) in the local keymap over images. They rely on external programs, by default "convert" from ImageMagick, to do the actual cropping/eliding of the image file.

6.55.2. New commands image-flip-horizontally and image-flip-vertically.

These commands horizontally and vertically flip the image under point, and are bound to 'i h' and 'i v', respectively.

6.55.3. Users can now add special image conversion functions.

This is done via image-converter-add-handler.

6.56. Image Dired

6.56.1. image-dired-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.

6.56.2. Navigation and marking commands now work in image display buffer.

The following new bindings have been added:

  • n, SPC => image-dired-display-next
  • p, DEL => image-dired-display-previous
  • m => image-dired-mark-thumb-original-file
  • d => image-dired-flag-thumb-original-file
  • u => image-dired-unmark-thumb-original-file

6.56.3. New command image-dired-unmark-all-marks.

It removes all marks from all files in the thumbnail and the associated Dired buffer, and is bound to U in the thumbnail and display buffer.

6.56.4. New command image-dired-do-flagged-delete.

It deletes all flagged files, and is bound to x in the thumbnail buffer. It replaces the command image-dired-delete-marked, which is now an obsolete alias.

6.56.5. New command image-dired-copy-filename-as-kill.

It copies the name of the marked or current image to the kill ring, and is bound to w in the thumbnail buffer.

6.56.6. New command image-dired-wallpaper-set.

This command sets the desktop background to the image at point in the thumbnail buffer. It is bound to W by default.

6.56.7. image-dired-slideshow-start is now bound to S.

It is bound in both the thumbnail and display buffer, and no longer prompts for a timeout; use a numerical prefix (e.g. 【C-u 8 S】) to set the timeout.

6.56.8. New user option image-dired-marking-shows-next.

If this option is non-nil (the default), marking, unmarking or flagging an image in either the thumbnail or display buffer shows the next image.

6.56.9. 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.

6.56.10. Image information is now shown in the header line of the thumbnail buffer.

This replaces the message that most navigation commands in the thumbnail buffer used to show at the bottom of the screen.

6.56.11. New specifiers for image-dired-display-properties-format.

This is used to format the new header line. The new specifiers are: "%d" for the name of the directory that the file is in, "%n" for file's number in the thumbnail buffer, and "%s" for the file size.

The default format has been updated to use this. If you prefer the old format, add this to your Init file:

(setopt image-dired-display-properties-format "%b: %f (%t): %c")

6.56.12. New faces for the header line of the thumbnail buffer.

These faces correspond to different parts of the header line, as specified in image-dired-display-properties-format:

  • image-dired-thumb-header-directory-name
  • image-dired-thumb-header-file-name
  • image-dired-thumb-header-file-size
  • image-dired-thumb-header-image-count

6.56.13. PDF support.

Image-Dired now displays thumbnails for PDF files. Type RET on a PDF file in the thumbnail buffer to visit the corresponding PDF.

6.56.14. Support GraphicsMagick command line tools.

Support for the GraphicsMagick command line tool ("gm") has been added, and is used when it is available instead of ImageMagick.

6.56.15. 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.

6.56.16. Reduce dependency on external "exiftool" program.

The image-dired-copy-with-exif-file-name command no longer requires an external "exiftool" program to be available. The user options image-dired-cmd-read-exif-data-program and image-dired-cmd-read-exif-data-options are now obsolete.

6.56.17. 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.

6.56.18. The image-dired-slideshow-start command no longer prompts.

It no longer inconveniently prompts for a number of images and a delay: it runs indefinitely, but stops automatically on any command. You can set the delay with a prefix argument, or a negative prefix argument to prompt for a delay. Customize the user option image-dired-slideshow-delay to change the default from 5 seconds.

6.56.19. image-dired-show-all-from-dir-max-files increased to 1000.

This user option controls asking for confirmation when starting Image-Dired in a directory with many files. Since Image-Dired creates thumbnails in the background in recent versions, this is not as important as it used to be. You can now also customize this option to nil to disable this confirmation completely.

6.56.20. image-dired-thumb-size increased to 128.

6.56.21. image-dired-db-file renamed to image-dired-tags-db-file.

6.56.22. image-dired-display-image-mode renamed to image-dired-image-mode.

The corresponding keymap is now named image-dired-image-mode-map.

6.56.23. Some commands have been renamed to be shorter.

  • image-dired-display-thumbnail-original-image has been renamed to image-dired-display-this.
  • image-dired-display-next-thumbnail-original has been renamed to image-dired-display-next.
  • image-dired-display-previous-thumbnail-original has been renamed to image-dired-display-previous.

The old names are now obsolete aliases.

6.56.24. 'image-dired-thumb-{height,width}' are now obsolete.

Customize image-dired-thumb-size instead, which will set both the height and width.

6.56.25. HTML image gallery generation is now obsolete.

The image-dired-gallery-generate command and these user options are now obsolete: image-dired-gallery-thumb-image-root-url, image-dired-gallery-hidden-tags, image-dired-gallery-dir, image-dired-gallery-image-root-url.

6.56.26. 'image-dired-rotate-thumbnail-{left,right}' are now obsolete.

Instead, use commands image-dired-refresh-thumb to generate a new thumbnail, or image-rotate to rotate the thumbnail without updating the thumbnail file.

6.56.27. Some commands and user options are now obsolete.

Since image-dired-display-image-mode is now based on image-mode, some commands and user options are no longer needed and 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.

6.57. Exif

6.57.1. New function exif-field.

This is a convenience function to extract the field data from exif-parse-file and exif-parse-buffer.

6.58. Bookmarks

6.58.1. list-bookmarks now includes a type column.

Types are registered via a bookmark-handler-type symbol property on the jumping function.

6.58.2. bookmark-sort-flag can now be set to last-modified.

This will display bookmark list from most recently set to least recently set.

6.58.3. When editing a bookmark annotation, 'C-c C-k' will now cancel.

It is bound to the new command bookmark-edit-annotation-cancel.

6.58.4. New user option bookmark-fringe-mark.

This option controls the bitmap used to indicate bookmarks in the fringe (or nil to disable showing this marker).

6.59. Xwidget

6.59.1. New user option xwidget-webkit-buffer-name-format.

This option controls how xwidget-webkit buffers are named.

6.59.2. New user option xwidget-webkit-cookie-file.

This option controls whether the xwidget-webkit buffers save cookies set by web pages, and if so, in which file to save them.

6.59.3. New minor mode xwidget-webkit-edit-mode.

When this mode is enabled, self-inserting characters and other common web browser shortcut keys are redefined to send themselves to the WebKit widget.

6.59.4. New minor mode xwidget-webkit-isearch-mode.

This mode acts similarly to incremental search, and allows searching the contents of a WebKit widget. In xwidget-webkit mode, it is bound to C-s and C-r.

6.59.5. New command xwidget-webkit-browse-history.

This command displays a buffer containing the page load history of the current WebKit widget, and allows you to navigate it.

6.59.6. On X, the WebKit inspector is now available inside xwidgets.

To access the inspector, right click on the widget and select "Inspect Element".

6.59.7. "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.

6.60. Tramp

6.60.1. New connection methods "docker", "podman" and "kubernetes".

They allow accessing containers provided by Docker and similar programs.

6.60.2. Tramp supports abbreviating remote home directories now.

When calling abbreviate-file-name on a Tramp file name, the result will abbreviate the user's home directory, for example by abbreviating "/ssh:user@host:/home/user" to "/ssh:user@host:~".

6.60.3. New user option tramp-use-scp-direct-remote-copying.

When set to non-nil, Tramp does not copy files between two remote hosts via a local copy in its temporary directory, but lets the scp command do this job.

6.60.4. Proper password prompts for methods "doas", "sudo" and "sudoedit".

The password prompts for these methods reflect now the credentials of the user requesting such a connection, and not of the user who is the target. This has always been needed, just the password prompt and the related auth-sources entry were wrong.

6.60.5. New user option tramp-completion-use-cache.

During user and host name completion in the minibuffer, results from Tramp's connection cache are taken into account. This can be disabled by setting the user option tramp-completion-use-cache to nil.

6.61. Browse URL

6.61.1. New user option browse-url-default-scheme.

This user option decides which URL scheme that browse-url and related functions will use by default. For example, you could customize this to "https" to always prefer HTTPS URLs.

6.61.2. New user option browse-url-irc-function.

This option specifies a function for opening "//" links. It defaults to the new function browse-url-irc.

6.61.3. New function browse-url-irc.

This multipurpose autoloaded function can be used for opening "//" and "ircs://" URLS by any caller that passes a URL string as an initial arg.

6.61.4. Support for the Netscape web browser has been removed.

This support has been obsolete since Emacs 25.1. The final version of the Netscape web browser was released in February, 2008.

6.61.5. Support for the Galeon web browser has been removed.

This support has been obsolete since Emacs 25.1. The final version of the Galeon web browser was released in September, 2008.

6.61.6. Support for the Mozilla web browser is now obsolete.

Note that this historical web browser is different from Mozilla Firefox; it is its predecessor.

6.62. Python Mode

6.62.1. Project shells and a new user option python-shell-dedicated.

When called with a prefix argument, run-python now offers the choice of creating a shell dedicated to the current project. This shell runs in the project root directory and is shared among all project buffers.

Without a prefix argument, the kind of shell (buffer-dedicated, project-dedicated or global) is specified by the new python-shell-dedicated user option.

6.63. Ruby Mode

6.63.1. New user option ruby-toggle-block-space-before-parameters.

6.63.2. Support for endless methods.

6.63.3. New user options that determine indentation logic.

ruby-method-params-indent, ruby-block-indent, ruby-after-operator-indent, ruby-method-call-indent, ruby-parenless-call-arguments-indent. See the docstrings for explanations and examples.

6.64. Eshell

6.64.1. New feature to easily bypass Eshell's own pipelining.

Prefixing '|', '<' or '>' with an asterisk, i.e. '*|', '*<' or '*>', will cause the whole command to be passed to the operating system shell. This is particularly useful to bypass Eshell's own pipelining support for pipelines which will move a lot of data. See section "Running Shell Pipelines Natively" in the Eshell manual, node "(eshell) Pipelines".

6.64.2. New module to help supplying absolute file names to remote commands.

After enabling the new eshell-elecslash module, typing a forward slash as the first character of a command line argument will automatically insert the Tramp prefix. The automatic insertion applies only when default-directory is remote and the command is a Lisp function. This frees you from having to keep track of whether commands are Lisp function or external when supplying absolute file name arguments. See the "(eshell) Electric forward slash" node in the Eshell manual for details.

6.64.3. Improved support for redirection operators in Eshell.

Eshell now supports a wider variety of redirection operators. For example, you can now redirect both stdout and stderr via '&>' or duplicate one output handle to another via 'NEW-FD>&OLD-FD'. For more information, see the "(eshell) Redirection" node in the Eshell manual.

6.64.4. New eshell built-in command doas.

The privilege-escalation program doas has been added to the existing su and sudo commands from the eshell-tramp module. The external command may still be accessed by using '*doas'.

6.64.5. Double-quoting an Eshell expansion now treats the result as a single string.

If an Eshell expansion like '$FOO' is surrounded by double quotes, the result will always be a single string, no matter the type that would otherwise be returned.

6.64.6. Concatenating Eshell expansions now works more similarly to other shells.

When concatenating an Eshell expansion that returns a list, "adjacent" elements of each operand are now concatenated together, e.g. '$(list "a" "b")c' returns '("a" "bc")'. See the "(eshell) Expansion" node in the Eshell manual for more details.

6.64.7. Eshell subcommands with multiline numeric output return lists of numbers.

If every line of the output of an Eshell subcommand like '${COMMAND}' is numeric, the result will be a list of numbers (or a single number if only one line of output). Previously, this only converted numbers when there was a single line of output.

6.64.8. Built-in Eshell commands now follow Posix/GNU argument syntax conventions.

Built-in commands in Eshell now accept command-line options with values passed as a single token, such as -oVALUE or '–option=VALUE'. New commands can take advantage of this with the eshell-eval-using-options macro. See "Defining new built-in commands" in the "(eshell) Built-ins" node of the Eshell manual.

6.64.9. Eshell globs ending with "/" now match only directories.

Additionally, globs ending with "**/" or "***/" no longer raise an error, and now expand to all directories recursively (following symlinks in the latter case).

6.64.10. Lisp forms in Eshell now treat a nil result as a failed exit status.

When executing a command that looks like '(lisp form)' and returns nil, Eshell will set the exit status (available in the '$?' variable) to 2. This allows commands like that to be used in conditionals. To change this behavior, customize the new eshell-lisp-form-nil-is-failure user option.

6.65. Shell

6.65.1. New user option shell-kill-buffer-on-exit.

Enabling this will automatically kill a "shell" buffer as soon as the shell session terminates.

6.65.2. New minor mode shell-highlight-undef-mode.

Customize shell-highlight-undef-enable to t if you want to enable this minor mode in "shell" buffers. It will highlight undefined commands with a warning face as you type.

6.66. Calc

6.66.1. New user option calc-kill-line-numbering.

Set it to nil to exclude line numbering from kills and copies.

6.67. Hierarchy

6.67.1. Tree Display can delay computation of children.

hierarchy-add-tree and hierarchy-add-trees have an optional argument which allows tree-widget display to be activated and computed only when the user expands the node.

6.68. Proced

6.68.1. proced.el shows system processes of remote hosts.

When default-directory is remote, and proced is invoked with a negative argument like 'C-u - proced', the system processes of that remote host are shown. Alternatively, the user option proced-show-remote-processes can be set to non-nil. proced-signal-function has been marked obsolete.

6.68.2. Proced can now optionally show process details in color.

New user option proced-enable-color-flag enables coloring of Proced buffers. This option is disabled by default; customize it to a non-nil value to enable colors.

6.69. Miscellaneous

6.69.1. New user option webjump-use-internal-browser.

When non-nil, WebJump will use an internal browser to open web pages, instead of the default external browser.

6.69.2. New user option font-lock-ignore.

This option provides a mechanism to selectively disable font-lock keyword-driven fontifications.

6.69.3. New user option auto-save-visited-predicate.

This user option is a predicate function which is called by auto-save-visited-mode to decide whether or not to save a buffer. You can use it to automatically save only specific buffers, for example buffers using a particular mode or in some directory.

6.69.4. New user option remote-file-name-inhibit-auto-save-visited.

If this user option is non-nil, auto-save-visited-mode will not auto-save remote buffers. The default is nil.

6.69.5. New package vtable.el for formatting tabular data.

This package allows formatting data using variable-pitch fonts. The resulting tables can display text in variable pitch fonts, text using fonts of different sizes, and images. See the "(vtable) Top" manual for more details.

6.69.6. New minor mode elide-head-mode.

Enabling this minor mode turns on hiding header material, like elide-head does; disabling it shows the header. The commands elide-head and elide-head-show are now obsolete.

6.69.7. New package ansi-osc.el.

Support for OSC ("Operating System Command") escape sequences has been extracted from comint.el in order to provide interpretation of OSC sequences in compilation buffers.

Adding the new function ansi-osc-compilation-filter to compilation-filter-hook enables interpretation of OSC escape sequences in compilation buffers. By default, all sequences are filtered out.

The list of handlers (already covering OSC 7 and 8) has been extended with a handler for OSC 2, the command to set a window title.

6.69.8. recentf-mode now uses abbreviated file names by default.

This means that e.g. "/home/foo/bar" is now displayed as "~/bar". Customize the user option recentf-filename-handlers to nil to get back the old behavior.

6.69.9. New command recentf-open.

This command prompts for a recently opened file in the minibuffer, and visits it.

6.69.10. ffap-machine-at-point no longer pings hosts by default.

It will now simply look at a hostname to determine if it is valid, instead of also trying to ping it. Customize the user option ffap-machine-p-known to ping to get the old behavior back.

6.69.11. The run-dig command is now obsolete; use dig instead.

6.69.12. Some bib-mode commands and variables have been renamed.

To respect Emacs naming conventions, the variable unread-bib-file has been renamed to bib-unread-file. The following commands have also been renamed: addbib to bib-add return-key-bib to bib-return-key mark-bib to bib-mark unread-bib to bib-unread

6.69.13. outlineify-sticky command is renamed to allout-outlinify-sticky.

The old name is still available as an obsolete function alias.

6.69.14. The url-irc library now understands "ircs://" links.

6.69.15. New command world-clock-copy-time-as-kill for world-clock-mode.

It copies the current line into the kill ring.

6.69.16. edit-abbrevs now uses font-locking.

The new face abbrev-table-name is used to display the abbrev table name.

6.69.17. New key binding O in "Buffer List".

This key is now bound to Buffer-menu-view-other-window, which will view this line's buffer in View mode in another window.

6.70. Scheme Mode

6.70.1. Auto-detection of Scheme library files.

Emacs now automatically enables the Scheme mode when opening R6RS Scheme Library Source (".sls") files and R7RS Scheme Library Definition (".sld") files.

6.70.2. Imenu members for R6RS and R7RS library members.

Imenu now lists the members directly nested in R6RS Scheme libraries (library) and R7RS libraries (define-library).

7. New Modes and Packages in Emacs 29.1

7.1. Eglot: Emacs Client for the Language Server Protocol.

Emacs now comes with the Eglot package, which enhances various Emacs features, such as completion, documentation, error detection, etc., based on data provided by language servers using the Language Server Protocol (LSP). See the new Info manual "(eglot) Top" for more. Also see "etc/EGLOT-NEWS".

If you want to be able to use package-install to upgrade Eglot to newer versions released on GNU ELPA, customize the new option package-install-upgrade-built-in to a non-nil value.

7.2. use-package: Declarative package configuration.

use-package is now shipped with Emacs. It provides the use-package macro, which allows you to isolate package configuration in your init file in a way that is declarative, tidy, and performance-oriented. See the new Info manual "(use-package) Top" for more.

If you want to be able to use package-install to upgrade use-package to newer versions released on GNU ELPA, customize the new option package-install-upgrade-built-in to a non-nil value.

7.3. New package wallpaper.

This package provides the command wallpaper-set, which sets the desktop background image. Depending on the system and the desktop, this may require an external program (such as "swaybg", "gm", "display" or "xloadimage"). If so, a suitable command should be detected automatically in most cases. It can also be customized manually if needed, using the new user options wallpaper-command and wallpaper-command-args.

7.4. New package oclosure.

This allows the creation of OClosures, which are "functions with slots" or "function objects" that expose additional information about themselves. Use the new macros oclosure-define and oclosure-lambda to create OClosures. See the "(elisp) OClosures" node for more information.

7.4.1. New generic function oclosure-interactive-form.

Used by interactive-form when called on an OClosure. This allows specific OClosure types to compute their interactive specs on demand rather than precompute them when created.

7.5. New theme leuven-dark.

This is a dark version of the leuven theme.

7.6. 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.

7.7. New major mode js-json-mode.

This is a lightweight variant of js-mode that is used by default when visiting JSON files.

7.8. New major mode csharp-mode.

A major mode based on CC Mode for editing programs in the C# language. This mode is auto-enabled for files with the ".cs" extension.

7.9. New major modes based on the tree-sitter library.

These new major modes are available if Emacs was built with the tree-sitter library. They provide support for font-locking, indentation, and navigation by defuns based on parsing the buffer text by a tree-sitter parser. Some major modes also offer support for Imenu and which-func.

The new modes based on tree-sitter are for now entirely optional, and you must turn them on manually, or load them in your init file, or customize auto-mode-alist to turn them on automatically for certain files. You can also customize major-mode-remap-alist to automatically turn on some tree-sitter based modes for the same files for which a "built-in" mode would be turned on. For example:

(add-to-list 'major-mode-remap-alist '(ruby-mode . ruby-ts-mode))

If you try these modes and don't like them, you can go back to the "built-in" modes by restarting Emacs. (If you use desktop.el to save and restore Emacs sessions, make sure no buffer under these modes is recorded in the desktop file, before restarting.) But please tell us why you didn't like the tree-sitter based modes, so that we could try improving them.

Each major mode based on tree-sitter needs a language grammar library, usually named "libtree-sitter-LANG.so" ("libtree-sitter-LANG.dll" on MS-Windows), where LANG is the corresponding language name. Emacs looks for these libraries in the following places:

. in the directories mentioned in the list treesit-extra-load-path . in the "tree-sitter" subdirectory of your user-emacs-directory (by default, "~/.emacs.d/tree-sitter") . in the standard system directories where other shared libraries are usually installed

We recommend to install these libraries in one of the standard system locations (the last place in the above list).

If a language grammar library required by a mode is not found in any of the above places, the mode will display a warning when you try to turn it on.

7.9.1. New major mode typescript-ts-mode.

A major mode based on the tree-sitter library for editing programs in the TypeScript language.

7.9.2. New major mode tsx-ts-mode.

A major mode based on the tree-sitter library for editing programs in the TypeScript language, with support for TSX.

7.9.3. New major mode c-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the C language.

7.9.4. New major mode 'c++-ts-mode'.

An optional major mode based on the tree-sitter library for editing programs in the C++ language.

7.9.5. New command 'c-or-c++-ts-mode'.

A command that automatically guesses the language of a header file, and enables either c-ts-mode or 'c++-ts-mode' accordingly.

7.9.6. New major mode java-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the Java language.

7.9.7. New major mode python-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the Python language.

7.9.8. New major mode css-ts-mode.

An optional major mode based on the tree-sitter library for editing CSS (Cascading Style Sheets).

7.9.9. New major mode json-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the JSON language.

7.9.10. New major mode csharp-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the C# language.

7.9.11. New major mode bash-ts-mode.

Am optional major mode based on the tree-sitter library for editing Bash shell scripts.

7.9.12. New major mode dockerfile-ts-mode.

A major mode based on the tree-sitter library for editing Dockerfiles.

7.9.13. New major mode cmake-ts-mode.

A major mode based on the tree-sitter library for editing CMake files.

7.9.14. New major mode toml-ts-mode.

An optional major mode based on the tree-sitter library for editing files written in TOML, a format for writing configuration files.

7.9.15. New major mode go-ts-mode.

A major mode based on the tree-sitter library for editing programs in the Go language.

7.9.16. New major mode go-mod-ts-mode.

A major mode based on the tree-sitter library for editing "go.mod" files.

7.9.17. New major mode yaml-ts-mode.

A major mode based on the tree-sitter library for editing files written in YAML.

7.9.18. New major mode rust-ts-mode.

A major mode based on the tree-sitter library for editing programs in the Rust language.

7.9.19. New major mode ruby-ts-mode.

An optional major mode based on the tree-sitter library for editing programs in the Ruby language.

8. Incompatible Lisp Changes in Emacs 29.1

8.1. The implementation of overlays has changed.

Emacs now uses an implementation of overlays that is much more efficient than the original one, and should speed up all the operations that involve overlays, especially when there are lots of them in a buffer.

As result of this, some minor incompatibilities in behavior could be observed, as described below. Except those minor incompatibilities, no other changes in behavior of overlays should be visible on the Lisp or user level, with the exception of better performance and the order of overlays returned by functions that don't promise any particular order.

8.1.1. The function overlay-recenter is now a no-op.

This function does nothing, and in particular has no effect on the value returned by overlay-lists. The purpose of overlay-recenter was to allow more efficient lookup of overlays around a certain buffer position; however with the new implementation the lookup of overlays is efficient regardless of their position, and there's no longer any need to "optimize" the lookup, nor any notion of a "center" of the overlays.

8.1.2. The function overlay-lists returns one unified list of overlays.

This function used to return a cons of two lists, one with overlays before the "center" position, the other after that "center". It now returns a list whose car is the list of all the buffer overlays, and whose cdr is always nil.

8.2. format-prompt now uses substitute-command-keys.

This means that both the prompt and minibuffer-default-prompt-format will have key definitions and single quotes handled specially.

8.3. New function substitute-quotes.

This function works like substitute-command-keys but only substitutes quote characters.

8.4. find-image now uses create-image.

This means that images found through find-image also have auto-scaling applied. (This only makes a difference on HiDPI displays.)

8.5. Changes in how "raw" in-memory XBM images are specified.

Some years back Emacs gained the ability to scale images, and you could then specify ':width' and ':height' when using create-image on all image types – except XBM images, because this format already used the ':width' and ':height' arguments to specify the width/height of the "raw" in-memory format. This meant that if you used these specifications on, for instance, XBM files, Emacs would refuse to display them. This has been changed, and ':width'/':height' now works as with all other image formats, and the way to specify the width/height of the "raw" in-memory format is now by using ':data-width' and ':data-height'.

8.6. "loaddefs.el" generation has been reimplemented.

The various "loaddefs.el" files in the Emacs tree (which contain information about autoloads, built-in packages and package prefixes) used to be generated by functions in autoloads.el. These are now generated by loaddefs-gen.el instead. This leads to functionally equivalent "loaddefs.el" files, but they do not use exactly the same syntax, so using 'M-x update-file-autoloads' no longer works. (This didn't work well in most files in the past, either, but it will now signal an error in any file.)

In addition, files are scanned in a slightly different way. Previously, ';;;###' specs inside a top-level form (i.e., something like '(when … ;;;### …)' would be ignored. They are now parsed as usual.

8.7. Themes have special autoload cookies.

All built-in themes are scraped for ';;;###theme-autoload' cookies that are loaded along with the regular auto-loaded code.

8.8. buffer-modified-p has been extended.

This function was previously documented to return only nil or t. This has been changed to nil/autosaved/non-nil. The new autosaved value means that the buffer is modified, but that it hasn't been modified since the time of last auto-save.

8.9. with-silent-modifications also restores buffer autosave status.

with-silent-modifications is a macro meant to be used by the font locking machinery to allow applying text properties without changing the modification status of the buffer. However, it didn't restore the buffer autosave status, so applying font locking to a modified buffer that had already been auto-saved would trigger another auto-saving. This is no longer the case.

8.10. prin1 doesn't always escape "." and "?" in symbols any more.

Previously, symbols like 'foo.bar' would be printed by prin1 as "foo\.bar". This now prints as "foo.bar" instead. The Emacs Lisp reader interprets these strings as referring to the same symbol, so this is virtually always backwards-compatible, but there may theoretically be code out there that expects a specific printed representation.

The same is the case with the "?" character: The 'foo?' symbol is now printed as "foo?" instead of "foo\?".

If the "." and "?" characters are the first character in the symbol, they will still be escaped, so the '.foo' symbol is still printed as "\.foo" and the '?bar' symbol is still printed as "\?bar".

8.11. Remapping mode-line face no longer works as expected.

mode-line is now the parent face of the new mode-line-active face, and remapping parent of basic faces does not work reliably. Instead of remapping mode-line, you have to remap mode-line-active.

8.12. make-process has been extended to support ptys when ':stderr' is set.

Previously, setting ':stderr' to a non-nil value would force the process's connection to use pipes. Now, Emacs will use a pty for stdin and stdout if requested no matter the value of ':stderr'.

8.13. User option mail-source-ignore-errors is now obsolete.

The whole mechanism for prompting users to continue in case of mail-source errors has been removed, so this option is no longer needed.

8.14. Fonts

8.14.1. Emacs now supports medium fonts.

Emacs previously didn't distinguish between the regular/normal weight and the medium weight, but it now also supports the (heavier) medium weight. However, this means that if you specify a weight of normal and the font doesn't have this weight, Emacs won't find the font spec. In these cases, replacing ":weight 'normal" with ":weight 'medium" should fix the issue.

8.15. Keymap descriptions by Help commands 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, these functions output "[closure]"/"[lambda]". You can get back the old behavior of including prefix commands by customizing the new option describe-bindings-show-prefix-commands to a non-nil value.

8.16. 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.)

8.17. Functions in tramp-foreign-file-name-handler-alist have changed.

Functions to determine which Tramp file name handler to use are now passed a file name in dissected form (via tramp-dissect-file-name) instead of in string form.

8.18. 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)

8.19. The inhibit-changing-match-data variable is now obsolete.

Instead, functions like string-match and looking-at now take an optional INHIBIT-MODIFY argument.

8.20. gnus-define-keys is now obsolete.

Use define-keymap instead.

8.21. 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.

8.22. The function image-dired-get-exif-data is now obsolete.

Use exif-parse-file and exif-field instead.

8.23. insert-directory alternatives should not change the free disk space line.

This change is now applied in dired-insert-directory.

8.24. compilation-last-buffer is (finally) declared obsolete.

It has been obsolete since Emacs 22.1, actually.

8.25. Calling lsh now elicits a byte-compiler warning.

lsh behaves in somewhat surprising and platform-dependent ways for negative arguments, and is generally slower than ash, which should be used instead. This warning can be suppressed by surrounding calls to lsh with the construct '(with-suppressed-warnings ((suspicious lsh)) …)', but switching to ash is generally much preferable.

8.26. Some functions and variables obsolete since Emacs 24 have been removed:

'Buffer-menu-buffer+size-width', Electric-buffer-menu-mode, Info-edit-map, allout-abbreviate-flattened-numbering, allout-exposure-change-hook, allout-mode-deactivate-hook, allout-structure-added-hook, allout-structure-deleted-hook, allout-structure-shifted-hook, ansi-color-unfontify-region, archive-extract-hooks, auth-source-forget-user-or-password, auth-source-hide-passwords, auth-source-user-or-password, automatic-hscrolling, automount-dir-prefix, bibtex-complete, bibtex-entry-field-alist, buffer-has-markers-at, buffer-substring-filters, byte-compile-disable-print-circle, c-prepare-bug-report-hooks, cfengine-mode-abbrevs, change-log-acknowledgement, chart-map, checkdoc-comment-style-hooks, 'comint–unquote&expand-filename', comint-dynamic-complete, comint-dynamic-complete-as-filename, comint-dynamic-simple-complete, comint-unquote-filename, command-history-map, compilation-parse-errors-function, completion-annotate-function, condition-case-no-debug, count-lines-region, crisp-mode-modeline-string, custom-print-functions, cvs-string-prefix-p, data-debug-map, deferred-action-function, deferred-action-list, dired-pop-to-buffer, dired-shrink-to-fit, dired-sort-set-modeline, dired-x-submit-report, display-buffer-function, ediff-choose-window-setup-function-automatically, eieio-defgeneric, eieio-defmethod, emacs-lock-from-exiting, erc-complete-word, erc-dcc-chat-filter-hook, eshell-add-to-window-buffer-names, eshell-cmpl-suffix-list, eshell-for, eshell-remove-from-window-buffer-names, eshell-status-in-modeline, filesets-cache-fill-content-hooks, font-list-limit, font-lock-maximum-size, font-lock-reference-face, gnus-carpal, gnus-debug-exclude-variables, gnus-debug-files, gnus-local-domain, gnus-outgoing-message-group, gnus-registry-user-format-function-M, gnus-secondary-servers, gnus-subscribe-newsgroup-hooks, gud-inhibit-global-bindings, hangul-input-method-inactivate, hfy-post-html-hooks, image-extension-data, image-library-alist, inactivate-current-input-method-function, inactivate-input-method, inhibit-first-line-modes-regexps, inhibit-first-line-modes-suffixes, input-method-inactivate-hook, intdos, javascript-generic-mode, javascript-generic-mode-hook, latex-string-prefix-p, macro-declaration-function (function), macro-declaration-function (variable), mail-complete, mail-complete-function, mail-mailer-swallows-blank-line, mail-sent-via, make-register, makefile-complete, menu-bar-kill-ring-save, meta-complete-symbol, meta-mode-map, mh-kill-folder-suppress-prompt-hooks, minibuffer-completing-symbol, minibuffer-local-filename-must-match-map, mode25, mode4350, mpc-string-prefix-p, msb-after-load-hooks, nndiary-request-accept-article-hooks, nndiary-request-create-group-hooks, nndiary-request-update-info-hooks, nnimap-split-rule, nntp-authinfo-file, ns-alternatives-map, ns-store-cut-buffer-internal, package-menu-view-commentary, pascal-last-completions, pascal-show-completions, pascal-toggle-completions, pcomplete-arg-quote-list, pcomplete-quote-argument, prolog-char-quote-workaround, python-buffer, python-guess-indent, python-indent, python-info-ppss-comment-or-string-p, python-info-ppss-context, python-info-ppss-context-type, python-preoutput-result, python-proc, python-send-receive, python-send-string, python-use-skeletons, quail-inactivate, quail-inactivate-hook, query-replace-interactive, rcirc-activity-hooks, rcirc-print-hooks, rcirc-receive-message-hooks, rcirc-sentinel-hooks, read-filename-at-point, redraw-modeline, reftex-index-map, reftex-index-phrases-map, reftex-select-bib-map, reftex-select-label-map, reftex-toc-map, register-name-alist, register-value, report-emacs-bug-info, report-emacs-bug-pretest-address, rmail-default-dont-reply-to-names, rmail-dont-reply-to, rmail-dont-reply-to-names, robin-inactivate, robin-inactivate-hook, rst-block-face, rst-comment-face, rst-definition-face, rst-directive-face, rst-emphasis1-face, rst-emphasis2-face, rst-external-face, rst-literal-face, rst-reference-face, semantic-change-hooks, semantic-edits-delete-change-hooks, semantic-edits-new-change-hooks, semantic-edits-reparse-change-hooks, semantic-grammar-map, semantic-grammar-syntax-table, semantic-lex-reset-hooks, semanticdb-elisp-sym-function-arglist, semanticdb-save-database-hooks, set-face-underline-p, set-register-value, sh-maybe-here-document, speedbar-key-map, speedbar-syntax-table, starttls-any-program-available, strokes-modeline-string, strokes-report-bug, term-default-bg-color, term-default-fg-color, tex-string-prefix-p, timeclock-modeline-display, timeclock-modeline-display, timeclock-update-modeline, toggle-emacs-lock, tooltip-use-echo-area, turn-on-cwarn-mode, turn-on-iimage-mode, ucs-input-inactivate, ucs-insert, url-recreate-url-attributes, user-variable-p, vc-string-prefix-p, vc-toggle-read-only, view-return-to-alist, view-return-to-alist-update, w32-default-color-map (function), which-func-mode (function), window-system-version, winner-mode-leave-hook, x-cut-buffer-or-selection-value.

8.27. Some functions and variables obsolete since Emacs 23 have been removed:

find-emacs-lisp-shadows, newsticker-cache-filename, process-filter-multibyte-p, redisplay-end-trigger-functions, set-process-filter-multibyte, set-window-redisplay-end-trigger, unify-8859-on-decoding-mode, unify-8859-on-encoding-mode, vc-arch-command, window-redisplay-end-trigger, x-selection.

8.28. Some functions and variables obsolete since Emacs 21 or 22 have been removed:

c-toggle-auto-state, find-file-not-found-hooks, ls-lisp-dired-ignore-case, query-replace-regexp-eval.

8.29. New generic function function-documentation.

It can dynamically generate a raw docstring depending on the type of a function. Used mainly for docstrings of OClosures.

8.30. Base64 encoding no longer tolerates latin-1 input.

The functions base64-encode-string, base64url-encode-string, base64-encode-region and base64url-encode-region no longer accept characters in the range U+0080..U+00FF as substitutes for single bytes in the range 128..255, but signal an error for all multibyte characters. The input must be unibyte encoded text.

8.31. The clone-indirect-buffer-hook is now run by make-indirect-buffer.

It was previously only run by clone-indirect-buffer and clone-indirect-buffer-other-window. Since make-indirect-buffer is called by both of these, the hook is now run by all 3 of these functions.

8.32. '?\' at the end of a line now signals an error.

Previously, it produced a nonsense value, -1, that was never intended.

8.33. Some libraries obsolete since Emacs 24.1 and 24.3 have been removed:

abbrevlist.el, assoc.el, complete.el, cust-print.el, erc-hecomplete.el, mailpost.el, mouse-sel.el, old-emacs-lock.el, patcomp.el, pc-mode.el, pc-select.el, s-region.el, and sregex.el.

8.34. Many seldom-used generalized variables have been made obsolete.

Emacs has a number of rather obscure generalized variables defined, that, for instance, allowed you to say things like:

(setf (point-min) 4)

These never caught on and have been made obsolete. The form above, for instance, is the same as saying

(narrow-to-region 4 (point-max))

The following generalized variables have been made obsolete: buffer-file-name, buffer-local-value, buffer-modified-p, buffer-name, buffer-string, buffer-substring, current-buffer, current-column, current-global-map, current-input-mode, current-local-map, current-window-configuration, default-file-modes, documentation-property, eq, frame-height, frame-width, frame-visible-p, global-key-binding, local-key-binding, mark, mark-marker, marker-position, mouse-position, point, point-marker, point-max, point-min, read-mouse-position, screen-height, screen-width, selected-frame, selected-screen, selected-window, standard-case-table, syntax-table, visited-file-modtime, window-height, window-width, and x-get-secondary-selection.

8.35. The dotimes loop variable can no longer be manipulated in the loop body.

Previously, the dotimes loop counter could be modified inside the loop body, but only in code using dynamic binding. Now the behavior is the same as when using lexical binding: changes to the loop variable have no effect on subsequent iterations. That is,

(dotimes (i 10) (print i) (setq i (+ i 6)))

now always prints the numbers 0 .. 9.

9. Lisp Changes in Emacs 29.1

9.1. Interpreted closures are "safe for space".

As was already the case for byte-compiled closures, instead of capturing the whole current lexical environment, interpreted closures now only capture the part of the environment that they need. The previous behavior could occasionally lead to memory leaks or to problems where a printed closure would not be readable because of an unreadable value in an unrelated lexical variable.

9.2. New accessor function file-attribute-file-identifier.

It returns the list of the inode number and device identifier retrieved by file-attributes. This value can be used to identify a file uniquely. The device identifier can be a single number or (for remote files) a cons of 2 numbers.

9.3. New macro while-let.

This is like when-let, but repeats until a binding form is nil.

9.4. New function make-obsolete-generalized-variable.

This can be used to mark setters used by setf as obsolete, and the byte-compiler will then warn about using them.

9.5. New functions pos-eol and pos-bol.

These are like line-end-position and line-beginning-position (respectively), but ignore fields (and are more efficient).

9.6. New function compiled-function-p.

This returns non-nil if its argument is either a built-in, or a byte-compiled, or a natively-compiled function object, or a function loaded from a dynamic module.

9.7. deactivate-mark can have new value dont-save.

This value means that Emacs should deactivate the mark as usual, but without setting the primary selection, if select-active-regions is enabled.

9.8. New declare form interactive-args.

This can be used to specify what forms to put into command-history when executing commands interactively.

9.9. The FORM argument of time-convert is mandatory.

time-convert can still be called without it, as before, but the compiler now emits a warning about this deprecated usage.

9.10. Emacs now supports user-customizable and themable icons.

These can be used for buttons in buffers and the like. See the "(elisp) Icons" and "(emacs) Icons" nodes in the manuals for details.

9.11. New arguments MESSAGE and TIMEOUT of set-transient-map.

MESSAGE specifies a message to display after activating the transient map, including a special formatting spec to list available keys. TIMEOUT is the idle time after which to deactivate the transient map. The default timeout value can be defined by the new variable set-transient-map-timeout.

9.12. New forms with-restriction and without-restriction.

These forms can be used as enhanced alternatives to the save-restriction form combined with, respectively, narrow-to-region and widen. They also accept an optional label argument, with which labeled narrowings can be created and lifted. See the "(elisp) Narrowing" node for details.

9.13. Connection Local Variables

9.13.1. Some connection-local variables are now user options.

The variables connection-local-profile-alist and connection-local-criteria-alist are now user options, in order to make it more convenient to inspect and modify them.

9.13.2. New function connection-local-update-profile-variables.

This function allows to modify the settings of an existing connection-local profile.

9.13.3. New macro with-connection-local-application-variables.

This macro works like with-connection-local-variables, but it allows using another application instead of tramp. This is useful when running code in a buffer where Tramp has already set some connection-local variables.

9.13.4. New macro setq-connection-local.

This allows dynamically setting variable values for a particular connection within the body of 'with-connection-local-{application-}variables'. See the "(elisp) Connection Local Variables" node in the Lisp Reference manual for more information.

9.14. plist-get, plist-put and plist-member are no longer limited to eq.

These function now take an optional comparison PREDICATE argument.

9.15. read-multiple-choice can now use long-form answers.

9.16. 【M-s c】 in read-regexp now toggles case folding.

9.17. completing-read now allows a function as its REQUIRE-MATCH argument.

This function is called to see whether what the user has typed is a match. This is also available from functions that call completing-read, like read-file-name.

9.18. posn-col-row can now give position data based on windows.

Previously, it reported data only based on the frame.

9.19. file-expand-wildcards can now also take a regexp as PATTERN argument.

9.20. vc-mtn (the VC backend for Monotone) has been made obsolete.

9.21. gui-set-selection can specify different values for different data types.

If DATA is a string, then its text properties are searched for values for each specific data type while the selection is being converted.

9.22. New eldoc function elisp-eldoc-var-docstring-with-value.

This function includes the current value of the variable in eldoc display and can be used as a more detailed alternative to elisp-eldoc-var-docstring.

9.23. save-some-buffers can now be extended to save other things.

Traditionally, save-some-buffers saved buffers, and also saved abbrevs. This has been generalized via the save-some-buffers-functions variable, and packages can now register things to be saved.

9.24. New function string-equal-ignore-case.

This compares strings ignoring case differences.

9.25. symbol-file can now report natively-compiled ".eln" files.

If Emacs was built with native-compilation enabled, Lisp programs can now call symbol-file with the new optional 3rd argument non-nil to request the name of the ".eln" file which defined a given symbol.

9.26. New macro with-memoization provides a very primitive form of memoization.

9.27. max-char can now report the maximum codepoint according to Unicode.

When called with a new optional argument UNICODE non-nil, max-char will now report the maximum valid codepoint defined by the Unicode Standard.

9.28. Seq

9.28.1. New function seq-split.

This returns a list of sub-sequences of the specified sequence.

9.28.2. New function seq-remove-at-position.

This function returns a copy of the specified sequence with the element at a given (zero-based) index removed.

9.28.3. New function seq-positions.

This returns a list of the (zero-based) indices of elements matching a given predicate in the specified sequence.

9.28.4. New function seq-keep.

This is like seq-map, but removes all nil results from the returned list.

9.29. Themes

9.29.1. New hooks enable-theme-functions and disable-theme-functions.

These are run after enabling and disabling a theme, respectively.

9.29.2. 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.

9.30. New hook display-monitors-changed-functions.

It is called whenever the configuration of different monitors on a display changes.

9.31. prin1 and prin1-to-string now take an optional OVERRIDES argument.

This argument can be used to override values of print-related settings.

9.32. New minor mode header-line-indent-mode.

This is meant to be used by Lisp programs that show a header line which should be kept aligned with the buffer contents when the user switches display-line-numbers-mode on or off, and when the width of line-number display changes. See the "(elisp) Header Lines" node in the Emacs Lisp Reference manual for more information.

9.33. New global minor mode lost-selection-mode.

This global minor mode makes Emacs deactivate the mark in all buffers when the primary selection is obtained by another program.

9.34. On X, Emacs will try to preserve selection ownership when a frame is deleted.

This means that if you make Emacs the owner of a selection, such as by selecting some text into the clipboard or primary selection, and then delete the current frame, you will still be able to insert the contents of that selection into other programs as long as another frame is open on the same display. This behavior can be disabled by setting the user option x-auto-preserve-selections to nil.

9.35. New predicate char-uppercase-p.

This returns non-nil if its argument its an uppercase character.

9.36. Byte Compilation

9.36.1. Byte compilation will now warn about some quoting mistakes in docstrings.

When writing code snippets that contains the "'" character (APOSTROPHE), that quote character has to be escaped to avoid Emacs displaying it as "’" (LEFT SINGLE QUOTATION MARK), which would make code examples like

(setq foo '(1 2 3))

invalid. Emacs will now warn during byte compilation if it sees something like that, and also warn about when using RIGHT/LEFT SINGLE QUOTATION MARK directly. In both these cases, if these characters should really be present in the docstring, they should be quoted with "\=".

9.36.2. Byte compilation will now warn about some malformed defcustom types.

It is very common to write defcustom types on the form:

:type '(choice (const :tag "foo" 'bar))

I.e., double-quoting the bar, which is almost never the correct value. The byte compiler will now issue a warning if it encounters these forms.

9.37. restore-buffer-modified-p can now alter buffer auto-save state.

With a FLAG value of autosaved, it will mark the buffer as having been auto-saved since the time of last modification.

9.38. New minor mode isearch-fold-quotes-mode.

This sets up search-default-mode so that quote characters are char-folded into each other. It is used, by default, in "Help" and "info" buffers.

9.39. New macro buffer-local-set-state.

This is a helper macro to be used by minor modes that wish to restore buffer-local variables back to their original states when the mode is switched off.

9.40. New macro with-buffer-unmodified-if-unchanged.

If the buffer is marked as unmodified, and code does modifications that, in total, means that the buffer is identical to the buffer before, mark the buffer as unmodified again.

9.41. New function malloc-trim.

This function allows returning unused memory back to the operating system, and is mainly meant as a debugging tool. It is currently available only when Emacs was built with glibc as the C library.

9.42. x-show-tip no longer hard-codes a timeout default.

The new variable x-show-tooltip-timeout allows the user to alter this for packages that don't use tooltip-show, but instead call the lower level function directly.

9.43. New function current-cpu-time.

It gives access to the CPU time used by the Emacs process, for example for benchmarking purposes.

9.44. New function string-edit.

This is meant to be used when the user has to edit a (potentially) long string. It pops up a new buffer where you can edit the string, and the provided callback is called when the user types 'C-c C-c'.

9.45. New function read-string-from-buffer.

This is a modal version of string-edit, and can be used as an alternative to read-string.

9.46. The return value of clear-message-function is not ignored anymore.

If the function returns dont-clear-message, then the message is not cleared, with the assumption that the function cleared it itself.

9.47. The local variables section now supports defining fallback modes.

This was previously only available when using a property line (i.e., putting the modes on the first line of a file).

9.48. New function flush-standard-output.

This enables display of lines that don't end in a newline from batch-based Emacs scripts.

9.49. New convenience function buttonize-region.

This works like buttonize, but for a region instead of a string.

9.50. 'macroexp-let2*' can omit TEST argument and use single-var bindings.

9.51. New macro-writing macros, cl-with-gensyms and cl-once-only.

See the "(cl) Macro-Writing Macros" manual section for descriptions.

9.52. New variable last-event-device and new function device-class.

On X Windows, last-event-device specifies the input extension device from which the last input event originated, and device-class can be used to determine the type of an input device.

9.53. Variable track-mouse can have a new value drag-source.

This means the same as dropping, but modifies the mouse position list in reported motion events if there is no frame underneath the mouse pointer.

9.54. New functions for dragging items from Emacs to other programs.

The new functions x-begin-drag, dnd-begin-file-drag, dnd-begin-drag-files, and dnd-direct-save allow dragging contents (such as files and text) from Emacs to other programs.

9.55. New function ietf-drums-parse-date-string.

This function parses RFC5322 (and RFC822) date strings, and should be used instead of parse-time-string when parsing data that's standards compliant.

9.56. New macro setopt.

This is like setq, but is meant to be used for user options instead of plain variables, and uses custom-set/set-default to set them.

9.57. New utility predicate mode-line-window-selected-p.

This is meant to be used from ':eval' mode line constructs to create different mode line looks for selected and unselected windows.

9.58. New variable messages-buffer-name.

This variable (defaulting to "Messages") allows packages to override where messages are logged.

9.59. New function readablep.

This function says whether an object can be written out and then read back by the Emacs Lisp reader.

9.60. New variable print-unreadable-function.

This variable allows changing how Emacs prints unreadable objects.

9.61. The user option polling-period now accepts floating point values.

This means Emacs can now poll for input during Lisp execution more frequently than once in a second.

9.62. New function bidi-string-strip-control-characters.

This utility function is meant for displaying strings when it is essential that there's no bidirectional context. It removes all the bidirectional formatting control characters (such as RLM, LRO, PDF, etc.) from its argument string. The characters it removes are listed in the value of bidi-control-characters.

9.63. The Gnus range functions have been moved to a new library, range.el.

All the old names have been made obsolete.

9.64. New function function-alias-p.

This predicate says whether an object is a function alias, and if it is, the alias chain is returned.

9.65. New variable lisp-directory holds the directory of Emacs's own Lisp files.

9.66. New facility for handling session state: multisession-value.

This can be used as a convenient way to store (simple) application state, and the command list-multisession-values allows users to list (and edit) this data.

9.67. New function get-display-property.

This is like get-text-property, but works on the display text property.

9.68. New function add-display-text-property.

This is like put-text-property, but works on the display text property.

9.69. New min-width display property.

This allows setting a minimum display width for a region of text.

9.70. New cursor-face text property.

This uses cursor-face instead of the default face when cursor is on or near the character and cursor-face-highlight-mode is enabled. The user option cursor-face-highlight-nonselected-window is similar to highlight-nonselected-windows, but for this property.

9.71. New event type touch-end.

This event is sent whenever the user's finger moves off the mouse wheel on some mice, or when the user's finger moves off the touchpad.

9.72. New event type pinch.

This event is sent when a user performs a pinch gesture on a touchpad, which is comprised of placing two fingers on the touchpad and moving them towards or away from each other.

9.73. New hook x-pre-popup-menu-hook.

This hook is run before x-popup-menu is about to display a deck-of-cards menu on screen.

9.74. New hook post-select-region-hook.

This hook is run immediately after select-active-regions. It causes the region to be set as the primary selection.

9.75. New function buffer-match-p.

Check if a buffer satisfies some condition. Some examples for conditions can be regular expressions that match a buffer name, a cons-cell like '(major-mode . shell-mode)' that matches any buffer where major-mode is shell-mode or a combination with a condition like '(and "\\`\\*.+\\*\\'" (major-mode . special-mode))'.

9.76. New function match-buffers.

It uses buffer-match-p to gather a list of buffers that match a condition.

9.77. New optional arguments TEXT-FACE and DEFAULT-FACE for tooltip-show.

They allow changing the faces used for the tooltip text and frame colors of the resulting tooltip frame from the default tooltip face.

9.78. Text Security and Suspiciousness

9.78.1. New library textsec.el.

This library contains a number of checks for whether a string is "suspicious". This usually means that the string contains characters that have glyphs that can be confused with other, more commonly used glyphs, or contains bidirectional (or other) formatting characters that may be used to confuse a user.

9.78.2. New user option textsec-check.

If non-nil (which is the default), Emacs packages that are vulnerable to attackers trying to confuse the users will use the textsec library to mark suspicious text. For instance shr/eww will mark suspicious URLs and links, Gnus will mark suspicious From addresses, and Message mode will query the user if the user is sending mail to a suspicious address. If this variable is nil, these checks are disabled.

9.78.3. New function textsec-suspicious-p.

This is the main function Emacs applications should be using to check whether a string is suspicious. It heeds the textsec-check user option.

9.79. Keymaps and Key Definitions

9.79.1. where-is-internal can now filter events marked as non key events.

If a command maps to a key binding like '[some-event]', and some-event has a symbol plist containing a non-nil non-key-event property, then that binding is ignored by where-is-internal.

9.79.2. New functions for defining and manipulating keystrokes.

These all take the syntax defined by key-valid-p, which is basically the same syntax as the one accepted by the kbd macro. None of the older functions have been deprecated or altered, but they are now de-emphasized in the documentation, and we encourage Lisp programs to switch to these new functions.

9.79.3. Use keymap-set instead of define-key.

9.79.4. Use keymap-global-set instead of global-set-key.

9.79.5. Use keymap-local-set instead of local-set-key.

9.79.6. Use keymap-global-unset instead of global-unset-key.

9.79.7. Use keymap-local-unset instead of local-unset-key.

9.79.8. Use keymap-substitute instead of substitute-key-definition.

9.79.9. Use keymap-set-after instead of define-key-after.

9.79.10. Use keymap-lookup instead of lookup-key and key-binding.

9.79.11. Use keymap-local-lookup instead of local-key-binding.

9.79.12. Use keymap-global-lookup instead of global-key-binding.

9.79.13. define-key now takes an optional REMOVE argument.

If non-nil, remove the definition from the keymap. This is subtly different from setting a definition to nil: when the keymap has a parent such a definition will shadow the parent's definition.

9.79.14. read-multiple-choice now takes an optional SHOW-HELP argument.

If non-nil, show the help buffer immediately, before any user input.

9.79.15. New function key-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 key-valid-p predicate does a stricter check of the syntax.

9.79.16. New function key-parse.

This is like kbd, but only returns vectors instead of a mix of vectors and strings.

9.79.17. New ':type' for defcustom for keys.

The new key type can be used for options that should be a valid key according to key-valid-p. The type key-sequence is now obsolete.

9.80. New function define-keymap.

This function allows defining a number of keystrokes with one form.

9.81. New macro defvar-keymap.

This macro allows defining keymap variables more conveniently.

9.82. defvar-keymap can specify repeat-mode behavior for the keymap.

Use ':repeat t' to have all bindings be repeatable or for more advanced usage:

:repeat (:enter (commands …) :exit (commands …))

9.83. kbd can now be used in built-in, preloaded libraries.

It no longer depends on edmacro.el and cl-lib.el.

9.84. New substitution in docstrings and substitute-command-keys.

Use \\`KEYSEQ' to insert a literal key sequence "KEYSEQ" (for example \\`C-k') in a docstring or when calling substitute-command-keys, which will use the same face as a command substitution. This should be used only when a key sequence has no corresponding command, for example when it is read directly with read-key-sequence. It must be a valid key sequence according to key-valid-p.

9.85. lookup-key is more permissive 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.

9.86. New function file-name-split.

This returns a list of all the components of a file name.

9.87. New function file-name-parent-directory.

This returns the parent directory of a file name.

9.88. New macro with-undo-amalgamate.

It records a particular sequence of operations as a single undo step.

9.89. 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, and only on capable platforms.

9.90. New command yank-media-types.

This command lets you examine all data in the current selection and the clipboard, and insert it into the buffer.

9.91. New variable yank-transform-functions.

This variable allows the user to alter the string to be inserted.

9.92. New command yank-in-context.

This command tries to preserve string/comment syntax when yanking.

9.93. New function minibuffer-lazy-highlight-setup.

This function allows setting up the minibuffer so that lazy highlighting of its content is applied in the original window.

9.94. 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.

9.95. insert-image now takes an INHIBIT-ISEARCH optional argument.

It marks the image with the inhibit-isearch text property, which inhibits isearch matching the STRING argument.

9.96. New variable replace-regexp-function.

Function to call to convert the entered FROM string to an Emacs regexp in query-replace and similar commands. It can be used to implement a different regexp syntax for search/replace.

9.97. New variables to customize defaults of FROM for 'query-replace*' commands.

The new variable query-replace-read-from-default can be set to a function that returns the default value of FROM when query-replace prompts for a string to be replaced. An example of such a function is find-tag-default.

The new variable query-replace-read-from-regexp-default can be set to a function (such as find-tag-default-as-regexp) that returns the default value of FROM when query-replace-regexp prompts for a regexp whose matches are to be replaced. If these variables are nil (which is the default), query-replace and query-replace-regexp take the default value from the previous FROM-TO pair.

9.98. Lisp pretty-printer (pp)

9.98.1. 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. Note that this could currently be quite slow, and is thus appropriate only for relatively small code fragments.

9.98.2. New user option pp-use-max-width.

If non-nil, pp and all 'pp-*' commands that format the results, will attempt to limit the line length when formatting long lists and vectors. This uses pp-emacs-lisp-code, and thus could be slow for large lists.

9.99. 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.

9.100. abbreviate-file-name now respects magic file name handlers.

9.101. New function font-has-char-p.

This can be used to check whether a specific font has a glyph for a character.

9.102. window-text-pixel-size now accepts a new argument IGNORE-LINE-AT-END.

This controls whether or not the last screen line of the text being measured will be counted for the purpose of calculating the text dimensions.

9.103. window-text-pixel-size understands a new meaning of FROM.

Specifying a cons as the FROM argument allows to start measuring text from a specified amount of pixels above or below a position.

9.104. window-body-width and window-body-height can use remapped faces.

Specifying remap as the PIXELWISE argument now checks if the default face was remapped, and if so, uses the remapped face to determine the character width/height.

9.105. set-window-vscroll now accepts a new argument PRESERVE-VSCROLL-P.

This means the vscroll will not be reset when set on a window that is "frozen" due to a mini-window being resized.

9.106. XDG Support

9.106.1. New function xdg-state-home.

It returns the new 'XDGSTATEHOME' environment variable. It should point to a file name that "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 $XDGDATAHOME". (This variable was introduced in the XDG Base Directory Specification version 0.8 released on May 8, 2021.)

9.106.2. New function xdg-current-desktop.

It returns a list of strings, corresponding to the colon-separated list of names in the 'XDGCURRENTDESKTOP' environment variable, which identify the current desktop environment. (This variable was introduced in XDG Desktop Entry Specification version 1.2.)

9.106.3. New function xdg-session-type.

It returns the 'XDGSESSIONTYPE' environment variable. (This is not part of any official standard; see the man page pamsystemd(8) for more information.)

9.107. 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.

9.108. New function funcall-with-delayed-message.

This function is like funcall, but will output the specified message if the function takes longer to execute than the specified timeout.

9.109. Locale

9.109.1. New variable current-locale-environment.

This holds the value of the previous call to set-locale-environment.

9.109.2. New macro with-locale-environment.

This macro can be used to change the locale temporarily while executing code.

9.110. Table

9.110.1. New user option table-latex-environment.

This allows switching between "table" and "tabular".

9.111. Tabulated List Mode

9.111.1. 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.

9.112. ':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.

9.113. 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.

9.114. kill-all-local-variables can now kill all local variables.

If given the new optional KILL-PERMANENT argument, it also kills permanent local variables.

9.115. Third mapconcat argument SEPARATOR is now optional.

An explicit nil always meant the empty string, now it can be left out.

9.116. New function image-at-point-p.

This function returns t if point is on a valid image, and nil otherwise.

9.117. New function buffer-text-pixel-size.

This is similar to window-text-pixel-size, but can be used when the buffer isn't displayed.

9.118. 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.

9.119. 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, by treating each sequence of characters composed on display as a single unit.

9.120. Xwidget

9.120.1. The function make-xwidget now accepts an optional RELATED argument.

This argument is used as another widget for the newly created WebKit widget to share settings and subprocesses with. It must be another WebKit widget.

9.120.2. 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.

9.120.3. New function xwidget-webkit-load-html.

This function is used to load HTML text into WebKit xwidgets directly, in contrast to creating a temporary file to hold the markup, and passing the URI of the file as an argument to xwidget-webkit-goto-uri.

9.120.4. 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.

9.120.5. New function xwidget-webkit-back-forward-list.

This function returns the history of page-loads in a WebKit xwidget.

9.120.6. New function xwidget-webkit-estimated-load-progress.

This function returns the estimated progress of page loading in a WebKit xwidget.

9.120.7. New function xwidget-webkit-stop-loading.

This function terminates all data transfer during page loads in a WebKit xwidget.

9.120.8. 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.

9.120.9. New event type xwidget-display-event.

These events are sent whenever an xwidget requests that Emacs displays another xwidget. The only arguments to this event are the xwidget that should be displayed, and the xwidget that asked to display it.

9.120.10. New function xwidget-webkit-set-cookie-storage-file.

This function is used to control where and if an xwidget stores cookies set by web pages on disk.

9.121. New variable help-buffer-under-preparation.

This variable is bound to t during the preparation of a "Help" buffer.

9.122. Timestamps like '(1 . 1000)' now work without warnings being generated.

For example, '(time-add nil '(1 . 1000))' no longer warns that the '(1 . 1000)' acts like '(1000 . 1000000)'. This warning, which was a temporary transition aid for Emacs 27, has served its purpose.

9.123. encode-time now also accepts a 6-element list with just time and date.

'(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR))' is now short for '(encode-time (list SECOND MINUTE HOUR DAY MONTH YEAR nil -1 nil))'.

9.124. date-to-time now accepts arguments that lack month, day, or time.

The function now assumes the earliest possible values if its argument lacks month, day, or time. For example, (date-to-time "2021-12-04") now assumes a time of "00:00" instead of signaling an error.

9.125. format-seconds now allows suppressing zero-value trailing elements.

The new "%x" non-printing control character will suppress zero-value elements that appear after "%x".

9.126. New events for taking advantage of touchscreen devices.

The events touchscreen-begin, touchscreen-update, and touchscreen-end have been added to take better advantage of touch-capable display panels.

9.127. New error symbol permission-denied.

This is a subcategory of file-error, and is signaled when some file operation fails because the OS doesn't allow Emacs to access a file or a directory.

9.128. The ':underline' face attribute now accepts a new property.

The property ':position' now specifies the position of the underline when used as part of a property list specification for the ':underline' attribute.

9.129. defalias records a more precise history of definitions.

This is recorded in the function-history symbol property.

9.130. New hook save-place-after-find-file-hook.

This is called at the end of save-place-find-file-hook.

9.131. indian-tml-base-table no longer translates digits.

Use indian-tml-base-digits-table if you want digits translation.

9.132. indian-tml-itrans-v5-hash no longer translates digits.

Use indian-tml-itrans-digits-v5-hash if you want digits translation.

9.133. shell-quote-argument has a new optional argument POSIX.

This is useful when quoting shell arguments for a remote shell invocation. Such shells are POSIX conformant by default.

9.134. make-process can set connection type independently for input and output.

When calling make-process, communication via pty can be enabled selectively for just input or output by passing a cons cell for ':connection-type', example: '(pipe . pty)'. When examining a process later, you can determine whether a particular stream for a process uses a pty by passing one of stdin, stdout, or stderr as the second argument to process-tty-name.

9.135. signal-process now consults the list signal-process-functions.

This is to determine which function has to be called in order to deliver the signal. This allows Tramp to send the signal to remote asynchronous processes. The hitherto existing implementation has been moved to internal-default-signal-process.

9.136. Some system information functions honor remote systems now.

list-system-processes returns remote process IDs. memory-info returns memory information of remote systems. process-attributes expects a remote process ID. This happens only when the current buffer's default-directory is remote. In order to preserve the old behavior, bind default-directory to a local directory, like

(let ((default-directory temporary-file-directory)) (list-system-processes))

9.137. New functions take and ntake.

'(take N LIST)' returns the first N elements of LIST; ntake does the same but works by modifying LIST destructively.

9.138. string-split is now an alias for split-string.

9.139. format-spec now accepts functions in the replacement.

The function is called only when used in the format string. This is useful to avoid side-effects such as prompting, when the value is not actually being used for anything.

9.140. The variable max-specpdl-size has been made obsolete.

Now max-lisp-eval-depth alone is used for limiting Lisp recursion and stack usage. max-specpdl-size is still present as a plain variable for compatibility but its limiting powers have been taken away.

9.141. New function external-completion-table.

This function returns a completion table designed to ease communication between Emacs's completion facilities and external tools offering completion services, particularly tools whose full working set is too big to transfer to Emacs every time a completion is needed. The table uses new external completion style exclusively and cannot work with regular styles such as basic or flex.

9.142. Magic file name handlers for make-directory-internal are no longer needed.

Instead, Emacs uses the already-existing make-directory handlers.

9.143. '(make-directory DIR t)' returns non-nil if DIR already exists.

This can let a caller know whether it created DIR. Formerly, make-directorys return value was unspecified.

10. Changes in Emacs 29.1 on Non-Free Operating Systems

10.1. MS-Windows

10.1.1. Emacs now supports double-buffering on MS-Windows to reduce display flicker.

(This was supported on Free systems since Emacs 26.1.)

To disable double-buffering (e.g., if it causes display problems), set the frame parameter inhibit-double-buffering to a non-nil value. You can do that either by adding

'(inhibit-double-buffering . t)

to default-frame-alist, or by modifying the frame parameters of the selected frame by evaluating

(modify-frame-parameters nil '((inhibit-double-buffering . t)))

10.1.2. 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.

10.1.3. Emacs now uses native image APIs to display some image formats.

On Windows 2000 and later, Emacs now defaults to using the native image APIs for displaying the BMP, GIF, JPEG, PNG, and TIFF images. This means Emacs on MS-Windows needs no longer use external image support libraries to display those images. Other image types – XPM, SVG, and WEBP – still need support libraries for Emacs to be able to display them.

The use of native image APIs is controlled by the variable w32-use-native-image-API, whose value now defaults to t on systems where those APIs are available.

10.1.4. Emacs now supports display of BMP images using native image APIs.

When w32-use-native-image-API is non-nil, Emacs on MS-Windows now has built-in support for displaying BMP images.

10.1.5. GUI Yes/No dialogs now include a "Cancel" button.

The "Cancel" button is in addition to "Yes" and "No", and is intended to allow users to quit the dialog, as an equivalent of C-g when Emacs asks a yes/no question via the echo area. This is controlled by the new variable w32-yes-no-dialog-show-cancel, by default t. Set it to nil to get back the old behavior of showing a modal dialog with only two buttons: "Yes" and "No".

10.2. Cygwin

10.2.1. process-attributes is now implemented.

10.3. macOS

10.3.1. The ns-popup-font-panel command has been removed.

Use the general command 'M-x menu-set-font' instead.


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 https://www.gnu.org/licenses/.

Created: 2023-08-03 Thu 12:47

Validate