GNU Emacs NEWS -- history of user-visible changes. Copyright (C) 2022-2026 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 32. See file HISTORY for a list of GNU Emacs versions and release dates. See files NEWS.31, NEWS.30, ..., NEWS.18, and NEWS.1-17 for changes in older Emacs versions. You can narrow news to a specific version by calling 'view-emacs-news' with a prefix argument or by typing 'C-u C-h C-n'. Temporary note: +++ indicates that all relevant manuals in doc/ have been updated. --- means no change in the manuals is needed. When you add a new item, use the appropriate mark if you are sure it applies, and please also update docstrings as needed. * Installation Changes in Emacs 32.1 * Startup Changes in Emacs 32.1 ** New terminal type 'Kmscon'. Emacs now supports the 'Kmscon' terminal emulator available on GNU/Linux systems. * Changes in Emacs 32.1 --- ** Emacs no longer kills child processes after EPIPE. Previously, Emacs would immediately kill a child process and set its exit status to 256 if sending input to that process returned EPIPE. Now when this happens, Emacs closes the file descriptor to write to the child process, but allows it to continue execution as normal. --- ** New variable 'tty-cursor-movement-use-TAB'. If this is set to the nil value, Emacs will not use TABs to optimize cursor motion on text-mode terminals. This is for the rare cases where the hardware tabs of the terminal were set to a non-default value by the 'tabs' command or similar, or if using TABs for cursor movement has any other undesired effects. The default is t, which preserves past behavior. If this variable is nil, 'tty-cursor-movement-use-TAB-BS' has no effect, and Emacs will never use TABs for any cursor-movement sequences. --- ** File- and directory-local variables respect user option setters. Values of variables that are user options mentioned in file-local variable sections and directory-locals via ".dir-locals.el" are now set similarly to 'setopt-local'; i.e., if a user option has a defcustom ':set' function, that function will be invoked. --- ** New user option 'setopt-local-type-mismatch'. This option controls what 'setopt-local' does when it detects a type mismatch between the specified value and the ':type' specification of a user option. Its backward-compatible default is nil which emits a warning and accepts the type-mismatched value. You can control this by customizing 'setopt-local-type-mismatch' to a non-nil value: the value 'accept' inhibits the warning and silently accepts type-mismatched values; the value 'discard' inhibits the warning and discards type-mismatched values; any other non-nil value prompts you whether to accept or ignore the value. --- ** Specifying a minor mode as a local variable enables that mode. The previous behavior, toggling the mode, was neither reliable nor generally desirable. +++ ** Emacs tries to display the overlay arrow in the left margin. On a non-graphical display (or when the left fringe is not shown), if a left margin is present, Emacs will now display the overlay arrow into this margin. Edebug is now using this feature by explicitly setting up a left margin for it. ** Mode Line *** Popup menus invoked from mode line select another window. Clicking mode line elements in inactive windows now first selects another window before displaying the menu, so the commands invoked from the menu will operate on the right buffer. You can restore the previous behavior by removing 'mode-line-window-select' from 'x-pre-popup-menu-hook'. ** Minibuffer --- *** The variable 'completion-ignore-case' is now customizable. --- *** 'icomplete-in-buffer' users need no longer advise 'completion-at-point'. The "*Completions*" buffer no longer pops up in addition to Icomplete's in-buffer display of completions, by default. Therefore, the instructions in the NEWS file for Emacs 30.1 to add (advice-add 'completion-at-point :after #'minibuffer-hide-completions) to your initialization file no longer apply, and you may remove it. If you still want to show the "*Completions*" buffer, then customize the user option 'icomplete-in-buffer' to the value 'with-completions-popup'. --- ** Improved Emoji support on text-only terminals. Emacs now composes Emoji sequences as two-column glyphs on text-mode terminals when 'auto-composition-mode' is enabled. This should correct a number of movement and display issues on Emoji-capable terminal emulators. However, the actual rendering of Emoji still depends on the capability of the terminal emulator: - If the terminal emulator does not support grapheme clusters at all, composed Emoji sequences will not work. In this case, disable 'auto-composition-mode'. - Non-compliant terminal emulators may not always render an Emoji sequence as a wide glyph, depending on the character width of the first code point in the sequence. In this case, it might help to set 'tty-display-emoji-force-wide' to nil. * Editing Changes in Emacs 32.1 +++ ** New user option 'query-replace-show-preview'. If non-nil, the replacement commands preview the replacement while you type it: the matches visible in the window are shown as they would look after the replacement. Only the matches that the command will replace are previewed: those after point, or those before it when replacing backward. The preview also appears at the first prompt, as soon as its input holds both halves, as it does after recalling a replacement from the history with 'M-p'. Replacements that use '\,' or '\#' are not previewed. The preview is off by default. The value can be the symbol 'replacement-only', which shows the replacement alone, the symbol 'both', which shows the match and the replacement side-by-side, or a custom function of the match and the replacement, returning the string to show in place of the match. ** Electric Pair mode *** Electric pair mode can restrict operation to nearby fields. This is particularly useful in comint-based modes (like 'M-x shell' or 'M-x run-python') and other situations where process output may contain unpaired delimiters, while keeping delimiters you insert balanced. The 'electric-pair-field-search-size' variable controls the search distance for nearby fields. * Changes in Specialized Modes and Packages in Emacs 32.1 ** Package --- *** Package-vc can copy local changes from existing installations. When installing the latest release of a package, 'package-vc' will propose copying files from an existing tarball installation of the same package with the same version. This is useful if you have started making local changes to your tarball installation, and then decided to check out the repository to prepare a patch for the package maintainer. ** Compilation mode --- *** Messages from Ansible are now recognized. ** Flymake +++ *** Overhauled inline diagnostics. A new user option 'flymake-inline-diagnostics' replaces 'flymake-show-diagnostics-at-end-of-line' and controls how Flymake annotates diagnostic text directly in the buffer. Besides the previous styles ('eol', 'short', and 'fancy'), it can be used to only display certain styles in certain situations, such as using a 'fancy' inline displays on nearby diagnostic only. The old variable is now an obsolete alias. In parallel, the user option 'flymake-diagnostic-format-alist' contains new options to configure exactly which parts of a diagnostic to show for each inline layout possibility. ** Man --- *** OSC 8 hyperlinks in man pages are now buttonized. When a man page contains OSC 8 hyperlink escape sequences, they are now buttonized, allowing using mouse or 'RET' to follow them. ** Woman --- *** The variable 'woman-topic-history' is now obsolete. Use 'Man-topic-history' instead. ** VC +++ *** VC Directory outgoing revisions count is now asynchronous. This means it won't get in your way even if it's slow for your repository. As such, the 'vc-dir-show-outgoing-count' option is now obsolete. --- *** VC Directory now shows key binding hints. To hide these, you can customize the new user option 'vc-dir-show-key-binding-hints' to nil. Backends can supply additional hints using the new 'dir-extra-hints' backend method. --- *** VC Directory doesn't process very large status output by default. If the VCS status process used to populate the VC Directory buffer produces a very large amount of output, it often means that you did something accidental like renaming a subdirectory containing thousands of files, and Emacs can become unresponsive while trying to process all the output. Now Emacs stops early. When this happens, VC Directory includes a message saying so, with a button to override it. You can customize the new user option 'vc-dir-process-output-limit' to control how early to stop, and to disable this feature. --- *** VC Directory resolves symbolic links only if the directory has no backend. When called interactively, 'M-x vc-dir' checks if the passed directory has a VC backend. If it doesn't, but the directory's truename does have a backend, and 'vc-follow-symlinks' is non-nil, the truename is used instead. Previously, the truename was used unconditionally. +++ *** Improved creation of commit log entry from ChangeLog. When VC detects that all log entries for the current changeset come from the same ChangeLog file or buffer, it now inserts the entire body of the ChangeLog entry into the "*vc-log*" buffer. If the ChangeLog entry contains a summary line, VC inserts it into the "*vc-log*" Summary header. If VC detects that the set of changed files listed in the ChangeLog entry differs from the current VC fileset, it displays a warning. --- *** The face 'log-edit-headers-separator' inherits from separator-line. The default definition of 'log-edit-headers-separator' now inherits its attributes from the face 'separator-line'. That changes the default color and makes it work better in the terminal. ** Outline mode *** New command 'outline-show-entry-and-parents'. It is bound to 'C-e' and reveals the current entry with its parent hierarchy. --- *** New function 'outline-search-from-regexp'. A generic 'outline-search-function' implementation driven by 'outline-regexp', suitable for modes or minor modes that customize 'outline-regexp' but do not need a custom search strategy. Install it with: (setq-local outline-search-function #'outline-search-from-regexp) --- *** 'outline-search-function' is now a user option. Previously a plain variable, it is now a 'defcustom' with named choices for the predefined search functions ('outline-search-from-regexp' and 'outline-search-level') as well as the default nil and arbitrary user functions. --- *** New options to recognize comment-prefixed outline headings. When the user option 'outline-use-comment-regexp' is non-nil, enabling 'outline-minor-mode' configures heading recognition so that outline headings prefixed by a comment are recognized, for example ";;; *", ";;; **", and so on in a buffer whose comment syntax is ";;". The heading level is the number of stars. The heading pattern is taken from the buffer-local variable 'outline-comment-regexp' when that is set; major modes and users can set it to customize recognition per mode. Otherwise, a pattern is built from 'comment-start' and the new option 'outline-comment-regexp-suffix'. --- *** New command 'outline-find-headings'. It finds all outline headings in the current buffer and displays them in an Xref buffer. Users can use that Xref buffer to navigate and edit the outline. It is bound to 'C-c @ M-o'. ** Xref +++ *** New command 'M-g .'/'M-g M-.' ('xref-find-by-kind'). This command allows you to jump to a specific kind of definition, such as a variable or face definition, or a constructor, instead of the function of the same name. The xref backend defines what kinds of definitions are available. ** CPerl mode *** Perl 5.44 support: Signatures with named parameters. Perl 5.44 allows to declare a signature like "sub subname (:$par)", see . CPerl mode now recognizes this as a variable declaration. ** Newsticker --- *** New command to copy the URL of the selected newsticker item. The new command 'newsticker-treeview-copy-url', bound to 'w', adds the URL of the currently selected item in the list view to the kill ring. ** Rmail +++ *** Files named "RMAIL" or ending in ".rmail" are now visited in Rmail mode. You can now visit such files in Rmail mode using ordinary file-visiting commands, such as 'C-x C-f'. ** Timeclock --- *** New user option 'timeclock-use-24hr-format'. If this option is set to non-nil, displayed times (clocked in/out since, time to leave) will use 24-hour clock instead of 12-hour clock. ** Eshell +++ *** Eshell now supports piping output to Lisp functions. You can now manipulate the output of other commands using the many Lisp functions provided in Emacs. For example, to uppercase the output of some other command: echo hi | #'upcase See the "(eshell) Lisp Pipelines" node in the Eshell manual for more details. --- *** New user option 'eshell-lexical-binding'. When enabled, this causes Eshell to evaluate commands in Lisp syntax using lexical binding. ** Dired *** The 'repeat-mode' key 'j' has been removed from 'dired-jump-map'. ** Viper --- *** New ex command: 'number' ('#'). Ex can now display line numbers when printing lines with the 'number' ('#') command. --- *** New ex command: 'list'. Ex can now display lines unambiguously when printing using the 'list' command. This means that certain characters such as 'TAB' will be shown with their literal equivalents i.e. '^I'. *** New ex command: 'z'. Ex can now print lines using the 'z' command which allows scrolling the output of the lines. * New Modes and Packages in Emacs 32.1 ** New major modes based on the tree-sitter library *** New major mode 'markdown-ts-mode'. A major mode based on the tree-sitter library for editing Markdown files. Markdown files are visited using this mode when the required tree-sitter grammars ('markdown' and 'markdown-inline') are available, or when the user has opted in via 'treesit-enabled-modes'. Otherwise, Markdown files fall back to 'text-mode'. To install the grammars, use 'M-x markdown-ts-mode-install-parsers'. ** Speedbar --- *** A nil value for 'speedbar-directory-unshown-regexp' means "show all". --- *** A nil value for 'speedbar-file-unshown-regexp' means "show all". +++ ** New library 'uuid'. This library provides useful code for handling Universally Unique Identifiers (UUIDs). It provides methods for generating UUIDs, parsing them, and outputting them as a string, a unibyte binary string, or as a number. * Incompatible Lisp Changes in Emacs 32.1 +++ ** 'intern' and 'intern-soft' ignore 'read-symbol-shorthands'. This means they revert to the behavior of Emacs < 28. In those cases where shorthands need to be obeyed, you now need to use 'shorthands-intern', 'shorthands-intern-soft', or 'shorthands-to-longhand'. And 'shorthands-of-symbol' provides the reverse mapping. ** Pcase +++ *** Add 'pcase-let*-strict'. This macro is like 'pcase-let*', but signals an error if a 'pcase' pattern does not match its corresponding value. This can be useful for destructuring values when you do not wish to continue if the corresponding value is not as expected. +++ ** The transition variable 'current-time-list' now defaults to nil. Therefore, timestamps now default to '(TICKS . HZ)' form instead of the older '(HIGH LOW USEC PSEC)' form. * Lisp Changes in Emacs 32.1 +++ ** Support for canvas image objects. Canvas images support efficient updating and refreshing. An image specifier with type 'canvas' creates a canvas image. The canvas has an associated writable pixel buffer. The dynamic module function 'canvas_data' provides access to the pixel buffer. After changing the ':data' vector or writing to the pixel buffer, a call to 'canvas-refresh' redraws the canvas image. +++ ** 'ignore' is now also a place, acting as a "blackhole" like "/dev/null". E.g., '(push (new-elem) (pcase (foo) (0 var1) (1 var2) (_ (ignore))))'. +++ ** 'kill-all-local-variables' can kill locals silently and reset the buffer. This function's KILL-PERMANENT argument now accepts the value 'permanent-local', which kills all locals ignoring any variable watchers. That argument can also be 'reset', which does what 'permanent-local' does, and also resets the buffer as if it were newly created. Use these with caution to avoid unexpected behavior such as 'default-directory' being reset to nil. --- ** 'with-work-buffer' kills all locals silently and resets its buffers. When this macro returns a buffer to its buffer pool, it now kills all buffer locals silently, ignoring any variable watchers, and resets the buffer as if it were newly created. +++ ** The new function 'markers-in' returns the set of markers in a region. +++ ** New buffer-local variable 'comment-start-line-regexp'. Modes that support both line and block comments should set this variable to a regexp that matches only the start of line comments, so Emacs can distinguish between line and block comments. --- ** New variable 'completion-frontend-properties'. This variable generalizes the 'completion-lazy-hilit' variable added in Emacs 30. It allows Lisp programs that present completion candidates ("completion frontends") to provide additional information which can be used to adjust or optimize completion candidates computation. ** D-Bus +++ *** Support error handler in asynchronous method calls. The HANDLER argument of 'dbus-call-method-asynchronously' can be a cons cell '(HANDLER . ERROR-HANDLER)'. ERROR-HANDLER is invoked if the method call returns with a D-Bus error; the error is passed as argument. ** Elisp Scope *** Custom analyzers can be associated with multiple functions. Elisp Scope macros that define custom analyzer functions, such as 'elisp-scope-define-function-analyzer' and 'elisp-scope-define-macro-analyzer', can now take a list of symbols to which the defined analyzer should apply (or a single symbol, as before). This makes it easy to specify the same analyzer for multiple functions. *** New macro 'elisp-scope-define-function-spec'. This macro in a declarative alternative to 'elisp-scope-define-function-analyzer'. It lets you tell Elisp Scope how to analyze the arguments of a function by declaring the specification of each argument, rather than implementing an analyzer function as you would with 'elisp-scope-define-function-analyzer'. +++ ** New variable 'display-buffer-default-alist'. Lisp programs may let-bind this variable to specify conditional actions for nested 'display-buffer' calls. +++ ** New button to diff failed erts-file test output in ERT. When a test fails, the erts-file tests buffer displayed by 'ert-results-pop-to-erts-file-tests-for-test-at-point' now includes a button labeled "diff". Pushing it displays a Diff mode buffer comparing the actual and expected output. +++ ** 'math-tzone-names' and 'timezone-world-timezones' are now marked obsolete. Strings should use numeric abbreviations like "-0600" instead of alphabetic abbreviations like "CST", which are too often ambiguous. * Changes in Emacs 32.1 on Non-Free Operating Systems +++ *** Emacs has been updated to target Android 17. Emacs has been updated to require the SDK for Android 17 (API level 37) during compilation, and to target that version of the operating system. A corollary of this change is that on Android 17 and later systems, it must be granted permission to access nearby devices from Settings in order to establish network connections to hosts on local networks. --- *** Emacs on MS-Windows now supports IME compositions on text-only frames. This support is only available on Windows versions of the NT family. ---------------------------------------------------------------------- This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . Local variables: coding: utf-8 mode: outline mode: emacs-news paragraph-separate: "[ ]" end: