diff options
47 files changed, 6082 insertions, 5560 deletions
@@ -2,7 +2,7 @@ Copyright (C) 2001-2022 Free Software Foundation, Inc. See the end of the file for license conditions. -This directory tree holds version 29.0.60 of GNU Emacs, the extensible, +This directory tree holds version 30.0.50 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor. The file INSTALL in this directory says how to build and install GNU diff --git a/admin/admin.el b/admin/admin.el index 4743d776918..6a67f172e2c 100644 --- a/admin/admin.el +++ b/admin/admin.el @@ -110,7 +110,7 @@ Root must be the root of an Emacs source tree." (submatch (1+ (in "0-9.")))))) (set-version-in-file root "configure.ac" version (rx (and "AC_INIT" (1+ (not (in ?,))) - ?, (0+ space) ?\[ + ?, (0+ space) (submatch (1+ (in "0-9.")))))) (set-version-in-file root "nt/README.W32" version (rx (and "version" (1+ space) diff --git a/admin/notes/git-workflow b/admin/notes/git-workflow index 265a106bad5..d33f49a1aca 100644 --- a/admin/notes/git-workflow +++ b/admin/notes/git-workflow @@ -16,14 +16,14 @@ Initial setup Then we want to clone the repository. We normally want to have both the current master and (if there is one) the active release branch -(eg emacs-28). +(eg emacs-29). mkdir ~/emacs cd ~/emacs git clone <membername>@git.sv.gnu.org:/srv/git/emacs.git master cd master git config push.default current -git worktree add ../emacs-28 emacs-28 +git worktree add ../emacs-29 emacs-29 You now have both branches conveniently accessible, and you can do "git pull" in them once in a while to keep updated. @@ -67,7 +67,7 @@ which will look like commit 958b768a6534ae6e77a8547a56fc31b46b63710b -cd ~/emacs/emacs-28 +cd ~/emacs/emacs-29 git cherry-pick -xe 958b768a6534ae6e77a8547a56fc31b46b63710b and add "Backport:" to the commit string. Then @@ -109,7 +109,7 @@ up-to-date by doing a pull. Then start Emacs with emacs -l admin/gitmerge.el -f gitmerge You'll be asked for the branch to merge, which will default to -(eg) 'origin/emacs-28', which you should accept. Merging a local tracking +(eg) 'origin/emacs-29', which you should accept. Merging a local tracking branch is discouraged, since it might not be up-to-date, or worse, contain commits from you which are not yet pushed upstream. diff --git a/configure.ac b/configure.ac index 432638f8721..6e37d56d316 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ dnl along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. AC_PREREQ([2.65]) dnl Note this is parsed by (at least) make-dist and lisp/cedet/ede/emacs.el. -AC_INIT([GNU Emacs], [29.0.60], [bug-gnu-emacs@gnu.org], [], +AC_INIT([GNU Emacs], [30.0.50], [bug-gnu-emacs@gnu.org], [], [https://www.gnu.org/software/emacs/]) dnl Set emacs_config_options to the options of 'configure', quoted for the shell, @@ -3933,21 +3933,10 @@ if test "${HAVE_X11}" = "yes"; then if test "${HAVE_XCB}" = "yes"; then AC_CHECK_LIB([X11-xcb], [XGetXCBConnection], [HAVE_X11_XCB=yes]) if test "${HAVE_X11_XCB}" = "yes"; then - AC_CHECK_LIB([xcb-util], [xcb_aux_sync], [HAVE_XCB_UTIL=yes]) - if test "${HAVE_XCB_UTIL}" = "yes"; then - AC_DEFINE([USE_XCB], [1], + AC_DEFINE([USE_XCB], [1], [Define to 1 if you have the XCB library and X11-XCB library for mixed - X11/XCB programming.]) - XCB_LIBS="-lX11-xcb -lxcb -lxcb-util" - else - AC_CHECK_LIB([xcb-aux], [xcb_aux_sync], [HAVE_XCB_AUX=yes]) - if test "${HAVE_XCB_AUX}" = "yes"; then - AC_DEFINE([USE_XCB], [1], -[Define to 1 if you have the XCB library and X11-XCB library for mixed - X11/XCB programming.]) - XCB_LIBS="-lX11-xcb -lxcb -lxcb-aux" - fi - fi +X11/XCB programming.]) + XCB_LIBS="-lX11-xcb -lxcb" fi fi fi @@ -4216,11 +4205,13 @@ AC_SUBST_FILE([module_env_snippet_26]) AC_SUBST_FILE([module_env_snippet_27]) AC_SUBST_FILE([module_env_snippet_28]) AC_SUBST_FILE([module_env_snippet_29]) +AC_SUBST_FILE([module_env_snippet_30]) module_env_snippet_25="$srcdir/src/module-env-25.h" module_env_snippet_26="$srcdir/src/module-env-26.h" module_env_snippet_27="$srcdir/src/module-env-27.h" module_env_snippet_28="$srcdir/src/module-env-28.h" module_env_snippet_29="$srcdir/src/module-env-29.h" +module_env_snippet_30="$srcdir/src/module-env-30.h" emacs_major_version="${PACKAGE_VERSION%%.*}" AC_SUBST([emacs_major_version]) @@ -4702,7 +4693,7 @@ AC_SUBST([XINERAMA_LIBS]) ### Use Xfixes (-lXfixes) if available HAVE_XFIXES=no if test "${HAVE_X11}" = "yes"; then - XFIXES_REQUIRED=4.0.0 + XFIXES_REQUIRED=1.0.0 XFIXES_MODULES="xfixes >= $XFIXES_REQUIRED" EMACS_CHECK_MODULES([XFIXES], [$XFIXES_MODULES]) if test $HAVE_XFIXES = no; then diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi index 29c0bed19c0..702c72bac25 100644 --- a/doc/emacs/misc.texi +++ b/doc/emacs/misc.texi @@ -1808,31 +1808,28 @@ you can give each daemon its own server name like this: emacs --daemon=foo @end example -@findex server-stop-automatically +@vindex server-stop-automatically The Emacs server can optionally be stopped automatically when -certain conditions are met. To do this, call the function -@code{server-stop-automatically} in your init file (@pxref{Init -File}), with one of the following arguments: +certain conditions are met. To do this, set the option +@code{server-stop-automatically} to one of the following values: -@itemize -@item -With the argument @code{empty}, the server is stopped when it has no -clients, no unsaved file-visiting buffers and no running processes -anymore. - -@item -With the argument @code{delete-frame}, when the last client frame is -being closed, you are asked whether each unsaved file-visiting buffer -must be saved and each unfinished process can be stopped, and if so, -the server is stopped. - -@item -With the argument @code{kill-terminal}, when the last client frame is -being closed with @kbd{C-x C-c} (@code{save-buffers-kill-terminal}), -you are asked whether each unsaved file-visiting buffer must be saved -and each unfinished process can be stopped, and if so, the server is +@table @code +@item empty +This value causes the server to be stopped when it has no clients, no +unsaved file-visiting buffers and no running processes anymore. + +@item delete-frame +This value means that when the last client frame is being closed, you +are asked whether each unsaved file-visiting buffer must be saved and +each unfinished process can be stopped, and if so, the server is stopped. -@end itemize + +@item kill-terminal +This value means that when the last client frame is being closed with +@kbd{C-x C-c} (@code{save-buffers-kill-terminal}), you are asked +whether each unsaved file-visiting buffer must be saved and each +unfinished process can be stopped, and if so, the server is stopped. +@end table @findex server-eval-at If you have defined a server by a unique server name, it is possible diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 8aa160d84eb..1383b412ce7 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -1028,14 +1028,15 @@ necessary. Its value is @code{@var{emacs-version},eshell}. @section Aliases @vindex $* +@findex eshell-expand-history-references Aliases are commands that expand to a longer input line. For example, @command{ll} is a common alias for @code{ls -l}, and would be defined with the command invocation @kbd{alias ll 'ls -l $*'}; with this defined, running @samp{ll foo} in Eshell will actually run @samp{ls -l foo}. Aliases defined (or deleted) by the @command{alias} command are automatically written to the file named by @code{eshell-aliases-file}, -which you can also edit directly (although you will have to manually -reload it). +which you can also edit directly. After doing so, use @w{@kbd{M-x +eshell-read-aliases-list}} to load the edited aliases. @vindex $1, $2, @dots{} Note that unlike aliases in Bash, arguments must be handled diff --git a/doc/misc/transient.texi b/doc/misc/transient.texi index e5e7cccbe8d..2b106bb7141 100644 --- a/doc/misc/transient.texi +++ b/doc/misc/transient.texi @@ -31,7 +31,7 @@ General Public License for more details. @finalout @titlepage @title Transient User and Developer Manual -@subtitle for version 0.3.7 +@subtitle for version 0.3.7.50 @author Jonas Bernoulli @page @vskip 0pt plus 1filll @@ -65,7 +65,7 @@ Calling a suffix command usually causes the transient to be exited but suffix commands can also be configured to not exit the transient. @noindent -This manual is for Transient version 0.3.7. +This manual is for Transient version 0.3.7.50. @insertcopying @end ifnottex @@ -447,10 +447,10 @@ session. Save the value of the active transient persistently across Emacs sessions. -@item @kbd{C-x C-k} (@code{transient-save}) +@item @kbd{C-x C-k} (@code{transient-reset}) @kindex C-x C-k -@findex transient-save -Clear the set and saved value of the active transient. +@findex transient-reset +Clear the set and saved values of the active transient. @end table @defopt transient-values-file @@ -911,7 +911,6 @@ means the former. @xref{Suffix Specifications}. @var{SUFFIX} may also be a group in the same form as expected by @code{transient-define-prefix}. @xref{Group Specifications}. - @item @var{LOC} is a command, a key vector, a key description (a string as returned by @code{key-description}), or a list specifying coordinates (the @@ -1044,6 +1043,18 @@ For example, the scope of the @code{magit-branch-configure} transient is the branch whose variables are being configured. @end defmac +It is possible to define one or more groups independently of a prefix +definition, which is useful when those groups are to be used by more +than just one prefix command. + +@defmac transient-define-groups name group... +This macro defines one or more groups of infix and suffix commands +and stores them in a property of the symbol @var{NAME}. @var{GROUP} has the +same form as for @code{transient-define-prefix}. Subsequently @var{NAME} can +be used in a @var{GROUP} of @code{transient-define-prefix}, as described in the +next section. +@end defmac + @node Binding Suffix and Infix Commands @section Binding Suffix and Infix Commands @@ -1139,11 +1150,17 @@ suffixes, which assumes that a predicate like this is used: @item The value of @code{:setup-children}, if non-@code{nil}, is a function that takes -two arguments the group object itself and a list of children. -The children are given as a (potentially empty) list consisting -of either group or suffix specifications. It can make arbitrary -changes to the children including constructing new children from -scratch. Also see @code{transient-setup-children}. +one argument, a potentially list of children, and must return a list +of children or an empty list. This can either be used to somehow +transform the group's children that were defined the normal way, or +to dynamically create the children from scratch. + +The returned children must have the same form as stored in the +prefix's @code{transient--layout} property, but it is often more convenient +to use the same form as understood by @code{transient-define-prefix}, +described below. If you use the latter approach, you can use the +@code{transient-parse-child} and @code{transient-parse-children} functions to +transform them from the convenient to the expected form. @item The boolean @code{:pad-keys} argument controls whether keys of all suffixes @@ -1151,23 +1168,35 @@ contained in a group are right padded, effectively aligning the descriptions. @end itemize -The @var{ELEMENT}s are either all subgroups (vectors), or all suffixes -(lists) and strings. (At least currently no group type exists that -would allow mixing subgroups with commands at the same level, though -in principle there is nothing that prevents that.) +The @var{ELEMENT}s are either all subgroups, or all suffixes and strings. +(At least currently no group type exists that would allow mixing +subgroups with commands at the same level, though in principle there +is nothing that prevents that.) If the @var{ELEMENT}s are not subgroups, then they can be a mixture of lists -that specify commands and strings. Strings are inserted verbatim. -The empty string can be used to insert gaps between suffixes, which is -particularly useful if the suffixes are outlined as a table. - -Variables are supported inside group specifications. For example in -place of a direct subgroup specification, a variable can be used whose -value is a vector that qualifies as a group specification. Likewise, -a variable can be used where a suffix specification is expected. -Lists of group or suffix specifications are also supported. Indirect -specifications are resolved when the transient prefix is being -defined. +that specify commands and strings. Strings are inserted verbatim into +the buffer. The empty string can be used to insert gaps between +suffixes, which is particularly useful if the suffixes are outlined as +a table. + +Inside group specifications, including inside contained suffix +specifications, nothing has to be quoted and quoting anyway is +invalid. + +How symbols are treated, depends on context. Inside suffix +specifications they often name functions. However if they appear in +a place where a group is expected, then they are treated as indirect +group specifications. Such a symbol must have an associated group +specification, created using @code{transient-define-groups}. + +Likewise a symbol can appear in a place where a suffix specification +is expected. The value of the @code{transient--layout} property of that +symbol must be a single suffix specification or a list of such +specifications. Currently no macro exist that would create such a +symbol, and this feature should usually not be used. + +The value following a keyword, can be explicitly unquoted using @code{,}. +This feature is experimental and should be avoided as well. The form of suffix specifications is documented in the next node. @@ -1232,7 +1261,7 @@ Any command will do; it does not need to have an object associated with it (as would be the case if @code{transient-define-suffix} or @code{transient-define-infix} were used to define it). -Anonymous, dynamically defined suffix commands are also support. +Anonymous, dynamically defined suffix commands are also supported. See information about the @code{:setup-children} function in @ref{Group Specifications}. As mentioned above, the object that is associated with a command can @@ -1515,7 +1544,18 @@ Call the command without exporting variables and stay transient. @anchor{Pre-commands for Suffixes} @subheading Pre-commands for Suffixes -The default for suffixes is @code{transient--do-exit}. +By default, invoking a suffix causes the transient to be exited. + +If you want a different default behavior for a certain transient +prefix command, then set its @code{:transient-suffix} slot. The value can be +a boolean, answering the question "does the transient stay active, +when a suffix command is invoked?" @code{t} means that the transient stays +active, while @code{nil} means that invoking a suffix exits the transient. +In either case, the exact behavior depends on whether the suffix is +itself a prefix (i.e., a sub-prefix), an infix or a regular suffix. + +The behavior for an individual suffix command can be changed by +setting its @code{transient} slot to one of the following pre-commands. @defun transient--do-exit Call the command after exporting variables and exit the transient. @@ -1566,21 +1606,32 @@ be added to @code{transient-predicate-map}. @anchor{Pre-commands for Non-Suffixes} @subheading Pre-commands for Non-Suffixes -The default for non-suffixes, i.e., commands that are bound in other -keymaps beside the transient keymap, is @code{transient--do-warn}. Silently -ignoring the user-error is also an option, though probably not a good -one. +By default, non-suffixes (commands that are bound in other keymaps +beside the transient keymap) cannot be invoked. Trying to invoke +such a command results in a warning and the transient stays active. -If you want to let the user invoke non-suffix commands, then use -@code{transient--do-stay} as the value of the prefix's @code{transient-non-suffix} -slot. +If you want a different behavior, then set the @code{:transient-non-suffix} +slot of the transient prefix command. The value can be a boolean, +answering the question, "is it allowed to invoke non-suffix commands?" + +If the value is @code{t} or @code{transient--do-stay}, then non-suffixes can be +invoked, when it is @code{nil} or @code{transient--do-warn} (the default) then they +cannot be invoked. + +The only other recommended value is @code{transient--do-leave}. If that is +used, then non-suffixes can be invoked, but if one is invoked, then +that exits the transient. @defun transient--do-warn Call @code{transient-undefined} and stay transient. @end defun -@defun transient--do-noop -Call @code{transient-noop} and stay transient. +@defun transient--do-stay +Call the command without exporting variables and stay transient. +@end defun + +@defun transient--do-leave +Call the command without exporting variables and exit the transient. @end defun @anchor{Special Pre-Commands} @@ -1810,7 +1861,7 @@ indicates that all remaining arguments are files. @item Classes used for infix commands that represent variables should -derived from the abstract @code{transient-variables} class. +derived from the abstract @code{transient-variable} class. @end itemize Magit defines additional classes, which can serve as examples for the @@ -2045,7 +2096,7 @@ called with no argument and returns a string. @item @code{show-help} A function used to display help for the suffix. If -unspecified, the prefix controls how hlep is displayed for its +unspecified, the prefix controls how help is displayed for its suffixes. @end itemize @@ -6,10 +6,10 @@ 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. +This file is about changes in Emacs version 30. 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 +See files NEWS.29, NEWS.28, ..., 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' @@ -22,3051 +22,62 @@ When you add a new item, use the appropriate mark if you are sure it applies, and please also update docstrings as needed. -* Installation Changes in Emacs 29.1 - ---- -** Ahead-of-time native compilation can now be specified via configure. -Use '--with-native-compilation=aot' to specify that all the Lisp files -in the Emacs tree should be natively compiled ahead of time. (This is -slow on most machines.) - -+++ -** 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. - -+++ -** 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'. - -+++ -** 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. - ---- -** Emacs now installs the ".pdmp" file using a unique fingerprint in the name. -The file is typically installed using a file name akin to -"...dir/libexec/emacs/29.1/x86_64-pc-linux-gnu/emacs-<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. - ---- -** Emacs 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. - ---- -** 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 JA_DIC_NO_REDUCTION_OPTION='' - -after deleting "lisp/leim/ja-dic/ja-dic.el". - -+++ -** 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 do not recommend -that you use this configuration, unless you are running a window -system that's supported by GDK other than X. 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'. - ---- -** 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. However, no 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. - ---- -** The docstrings of preloaded files are not in "etc/DOC" any more. -Instead, they're fetched as needed from the corresponding ".elc" file, -as was already the case for all the non-preloaded files. +* Installation Changes in Emacs 30.1 -* Startup Changes in Emacs 29.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. - -+++ -** 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. - -+++ -** Emacs now supports setting 'user-emacs-directory' via '--init-directory'. - -+++ -** Emacs now has a '--fingerprint' option. -This will output a string identifying the current Emacs build. - -+++ -** New hook 'after-pdump-load-hook'. -This is run at the end of the Emacs startup process, and is meant to -be used to reinitialize structures that would normally be done at load -time. - -** Native Compilation - -+++ -*** New variable 'inhibit-automatic-native-compilation'. -If set, Emacs will inhibit native compilation (and won't write -anything to the eln cache automatically). The variable is initialized -from the 'EMACS_INHIBIT_AUTOMATIC_NATIVE_COMPILATION' environment -variable on Emacs startup. - ---- -*** New command 'native-compile-prune-cache'. -This command deletes older eln cache entries (but not the ones for -the current Emacs version). - ---- -*** 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'. +* Startup Changes in Emacs 30.1 -* Incompatible changes in Emacs 29.1 - -+++ -** The image commands have changed key bindings. -In previous Emacs versions, images have had the '+', '-' and 'r' keys -bound when point is over an image. In Emacs 29.1, additional commands -were added, and this made it more likely that users would trigger the -image commands by mistake. To avoid this, all image commands have -moved to the 'i' 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. - -+++ -** Emacs now picks the correct coding system for X input methods. -Previously, Emacs would use the 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. - -Now, Emacs 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. - -+++ -** 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. - ---- -** '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 get -back to how things worked in Emacs 28.1, put the following in your -init file: - - (setopt show-paren-predicate t) - -+++ -** 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'. - ---- -** 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. - -** Dired - ---- -*** '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". - ---- -*** 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. - -+++ -** Warning about "eager macro-expansion failure" is changed into an error. - ---- -** 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. - -+++ -** 'E' in 'query-replace' now edits the replacement with exact case. -Previously, this command did the same as 'e'. - ---- -** '/ a' in "*Packages*" buffer now limits by archive name(s) instead of regexp. - -+++ -** 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'. - ---- -** 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. - ---- -** Sorting commands no longer necessarily change modification status. -In earlier Emacs versions, commands like 'M-x 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 changing the contents -of the buffer. - ---- -** 'string-lines' handles trailing newlines differently. -It no longer returns an empty final string if the string ends with a -newline. - ---- -** '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. - ---- -** '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. - ---- -** '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) - ---- -** New user option 'term-clear-full-screen-programs'. -By default, term 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. - ---- -** Support for old EIEIO functions is not autoloaded any more. -You need an explicit '(require 'eieio-compat)' to use 'defmethod' -and 'defgeneric' (which have been made obsolete in Emacs 25.1 with -'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). - ---- -** '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. - ---- -** 'C-x 8 =' 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 ='. - -** Eshell - -*** 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 system, instead of using -the PATH environment variable directly. - ---- -*** '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. - -+++ -*** 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. - -+++ -*** Eshell pipelines now only pipe stdout by default. -To pipe both stdout and stderr, use the '|&' operator instead of '|'. - ---- -** 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. - -+++ -** '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. - ---- -** 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. - -+++ -** 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. - -+++ -** 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'. - ---- -** 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 after -upgrading (usually "~/.emacs.d/image-dired/"). +* Changes in Emacs 30.1 ---- -** 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". - ---- -** 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. - ---- -** 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". - ---- -** 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) - ---- -** The thumbs.el library is now obsolete. -We recommend using 'M-x image-dired' instead. - ---- -** 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. -It is believed to no longer be useful. - ---- -** The quickurl.el library is now obsolete. -Use 'abbrev', 'skeleton' or 'tempo' instead. - ---- -** The rlogin.el library, and the 'rsh' command are now obsolete. -Use something like 'M-x shell RET ssh <host> RET' instead. - ---- -** The url-about.el library is now obsolete. - ---- -** The autoload.el library is now obsolete. -It is superseded by the loaddefs-gen.el library. - ---- -** The netrc.el library is now obsolete. -Use the 'auth-source-netrc-parse-all' function in auth-source.el -instead. - ---- -** The url-dired.el library is now obsolete. - ---- -** 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. +** X selection requests are now handled much faster and asynchronously. +This means it should be less necessary to disable the likes of +`select-active-regions' when Emacs is running over a slow network +connection. -* Changes in Emacs 29.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') without having to use 'defalias', which can have -undesirable side effects. -This applies to all modes specified via 'auto-mode-alist', file-local -variables, etc. - ---- -** Emacs now supports Unicode Standard version 15.0. - ---- -** New user option 'electric-quote-replace-consecutive'. - ---- -** 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. - -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'. - -Note that the display optimizations in these cases may cause the -buffer to be occasionally mis-fontified. - -The new function 'long-line-optimizations-p' returns non-nil when -these optimizations are in effect in the current buffer. - -+++ -** 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, e.g. '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. - -** 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 (tho 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) - ---- -** 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'. - -+++ -** 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) 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. - ---- -** Interactively, 'kill-buffer' will now offer to save the buffer if unsaved. - ---- -** 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. - ---- -** Files with the ".eld" extension are now visited in 'lisp-data-mode'. - -+++ -** '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]) - -+++ -** 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'. - -+++ -** 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). - -+++ -** 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'. - -+++ -** New command 'rename-visited-file'. -This command renames the file visited by the current buffer by moving -it to a new location, and also makes the buffer visit this new file. - -** Menus - ---- -*** 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. - ---- -** '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. - -+++ -** 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 parameters to restart instead of just killing the current -process. - -+++ -** 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). - -+++ -** 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. - ---- -** 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. - -+++ -*** 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. - -+++ -** 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. - -+++ -** 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. - -+++ -** 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. - -+++ -** New function 'command-query'. -This function makes its argument command prompt the user for -confirmation before executing. - -+++ -** 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. - ---- -** '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. - -+++ -** 'count-words' will now report sentence count when used interactively. - -** New user option 'set-message-functions'. -It allows selecting more functions for 'set-message-function' -in addition to the default function that handles messages -in the active minibuffer. The most useful are 'inhibit-message' -that allows specifying a list of messages to inhibit via -'inhibit-message-regexps', and 'set-multi-message' that -accumulates recent messages and displays them stacked -in the echo area. - ---- -** 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. - -+++ -** 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. - ---- -** '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. - -+++ -** New user option 'process-error-pause-time'. -This determines how long to pause Emacs after a process -filter/sentinel error has been handled. - -+++ -** 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-number-face', -'font-lock-misc-punctuation-face', 'font-lock-operator-face', -'font-lock-property-face', and 'font-lock-punctuation-face'. - -+++ -** 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. - -+++ -** 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'). - -+++ -** 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. - -+++ -** New X resource: "borderThickness". -This controls the thickness of the external borders of the menu bars -and pop-up menus. - -+++ -** New X resource: "inputStyle". -This controls the style of the pre-edit and status areas of X input -methods. - -+++ -** New X resources: "highlightForeground" and "highlightBackground". -Only in the Lucid build, this controls colors used for highlighted -menu item widgets. - -+++ -** 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". - -+++ -** 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'. - -+++ -** New frame parameter 'alpha-background' and X resource "alphaBackground". -This controls the opacity of the text background when running on a -composited display. - -+++ -** 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. - ---- -** 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. - -+++ -** 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. - -+++ -** 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. - ---- -** 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. - -** Terminal Emacs - ---- -*** 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". - -*** 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. - ---- -*** 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. It 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. - ---- -*** 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. - -** ERT - -+++ -*** 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. - ---- -*** 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. - -+++ -*** ERT can generate JUnit test reports. -When environment variable 'EMACS_TEST_JUNIT_REPORT' is set, ERT -generates a JUnit test report under this file name. This is useful -for Emacs integration into CI/CD test environments. - ---- -*** Unbound test symbols now signal an 'ert-test-unbound' error. -This affects the 'ert-select-tests' function and its callers. - -** Emoji - -+++ -*** Emacs now has several new methods for inserting Emojis. -The Emoji commands are under the new 'C-x 8 e' prefix. - -+++ -*** New command 'emoji-insert' (bound to 'C-x 8 e e' and 'C-x 8 e i'). -This command guides you through various Emoji categories and -combinations in a graphical menu system. - -+++ -*** New command 'emoji-search' (bound to 'C-x 8 e s'). -This command lets you search for Emojis based on names. - -+++ -*** New command 'emoji-list' (bound to 'C-x 8 e l'). -This command lists all Emojis (categorized by themes) in a special -buffer and lets you choose one of them. - ---- -*** New command 'emoji-recent' (bound to 'C-x 8 e r'). -This command lets you choose among the Emojis you have recently -inserted. - -+++ -*** New command 'emoji-describe' (bound to 'C-x 8 e d'). -This command will tell you the name of the Emoji at point. (This -command also works for non-Emoji characters.) - ---- -*** 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. - ---- -*** New input method 'emoji'. -This allows you to enter emoji using short strings, eg ':face_palm:' -or ':scream:'. - -** Help - ---- -*** Variable values displayed by 'C-h v' in "*Help*" are now font-locked. - -+++ -*** New user option 'help-clean-buttons'. -If non-nil, link buttons in "*Help*" will have any surrounding quotes -removed. - ---- -*** 'M-x apropos-variable' output now includes values of variables. - -+++ -*** 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, the new -"\\+`like-this'" syntax can be used. - -+++ -*** New user option 'help-window-keep-selected'. -If non-nil, commands to show the info manual and the source will reuse -the same window the "*Help*" buffer is shown in. - ---- -*** 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... - -+++ -*** The 'C-h .' command now accepts a prefix argument. -'C-u C-h .' would previously inhibit displaying a warning message if -there's no local help at point. This has been changed to call -'button-describe'/'widget-describe' and display button/widget help -instead. - ---- -*** 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's easy to make an edit that yields an invalid result. - ---- -*** 'C-h b' uses outlining by default. -Set 'describe-bindings-outline' to nil to get the old behavior. - ---- -*** Jumping to function/variable source now saves mark before moving point. -Jumping to source from "*Help*" buffer moves the point when the source -buffer is already open. Now, the old point is pushed to mark ring. - -+++ -*** New key bindings in "*Help*" buffers: 'n' and 'p'. -These will take you (respectively) to the next and previous "page". - ---- -*** 'describe-char' now also outputs the name of emoji combinations. - -+++ -*** New key binding in "*Help*" buffer: 'I'. -This will take you to the Emacs Lisp manual entry for the item -displayed, if any. - ---- -*** 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. - -+++ -*** 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. - ---- -*** 'describe-keymap' now considers the symbol at point. -If the symbol at point is a keymap, 'describe-keymap' suggests it as -the default candidate. - ---- -*** 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 q'. - -** Emacs 29.1 comes with Org v9.6. -See the file ORG-NEWS for user-visible changes in Org. - -** Outline Mode - -+++ -*** Support for customizing the default visibility state of headings. -Customize the user option 'outline-default-state' to define what -headings will be visible after Outline mode is turned on. When equal -to 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. - -** Outline Minor Mode - -+++ -*** New user option 'outline-minor-mode-use-buttons'. -If non-nil, Outline Minor Mode will use buttons to hide/show outlines -in addition to the ellipsis. The default is nil, but in 'help-mode' -it has the value 'insert' that inserts the buttons directly to the -buffer where you can use 'RET' to cycle outline visibility. When -the value is 'in-margins', Outline Minor Mode uses the window margins -to hide/show outlines. - -** Windows - -+++ -*** 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 on the 'C-x w' prefix. - -+++ -*** New user option 'display-buffer-avoid-small-windows'. -If non-nil, this should be a window height, a number. Windows smaller -than this will be avoided by 'display-buffer', if possible. - -+++ -*** New display action 'display-buffer-full-frame'. -This action removes other windows on the frame when displaying a -buffer. - -+++ -*** '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' in combination with 'body-lines'. - ---- -*** You can customize which window 'scroll-other-window' operates on. -This is controlled by the new 'other-window-scroll-default' user option. - -** Frames - -+++ -*** 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. - -** Tab Bars and Tab Lines - ---- -*** 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. - ---- -*** 'C-x t RET' creates a new tab when the provided tab name doesn't exist. - ---- -*** 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. - ---- -** Better detection of text suspiciously reordered on display. -The function 'bidi-find-overridden-directionality' has been extended -to detect reordering effects produced by embeddings and isolates -(started by directional formatting control characters such as RLO and -LRI). The new command 'highlight-confusing-reorderings' finds and -highlights segments of buffer text whose reordering for display is -suspicious and could be malicious. - -** Emacs server and client changes - -+++ -*** New command-line option '-r'/'--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. - -+++ -*** 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. - -+++ -*** '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 given by the argument, which can be -'empty', 'delete-frame' or 'kill-terminal'. - -** Rcirc - -+++ -*** New command 'rcirc-when'. - -+++ -*** New user option 'rcirc-cycle-completion-flag'. -Rcirc will use 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. - -+++ -*** 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: - - (setq 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 - ---- -*** 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 bold. - -** Imenu - -+++ -*** 'imenu' is now bound to 'M-g i' globally. - ---- -*** 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. - -+++ -** 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. - -* Editing Changes in Emacs 29.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'. - ---- -** '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 -'case-fold-search' value. - ---- -** '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 a customizations in that other window. These -functions now check whether they have been rebound in the buffer 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. - ---- -** Indentation of 'cl-flet' and 'cl-labels' has changed. -These forms now indent like this: - - (cl-flet ((bla (x) - (* x x))) - (bla 42)) - -This change also affects 'cl-macrolet', 'cl-flet*' and -'cl-symbol-macrolet'. - -+++ -** New user option 'translate-upper-case-key-bindings'. -Set this option to nil to inhibit translating upper case keys to lower -case keys. - -+++ -** New command 'ensure-empty-lines'. -This command increases (or decreases) the number of empty lines before -point. - ---- -** Improved mouse behavior with auto-scrolling modes. -When clicking inside the 'scroll-margin' or 'hscroll-margin' region, -point is now moved only when releasing the mouse button. This no -longer results in a bogus selection, unless the mouse has been -effectively dragged. - -+++ -** 'kill-ring-max' now defaults to 120. - ---- -** New user option 'yank-menu-max-items'. -Customize this option to limit the number of entries in the menu -"Edit->Paste from Kill Menu". The default is 60. - -+++ -** Performing a pinch gesture on a touchpad now increases the text scale. - -** show-paren-mode - -+++ -*** New user option 'show-paren-context-when-offscreen'. -When non-nil, if the point is in a closing delimiter and the opening -delimiter is offscreen, shows some context around the opening -delimiter in the echo area. The default is nil. - -May 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. - -** Comint - -+++ -*** '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. - ---- -*** 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 past behavior. - ---- -*** 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. - -** Mwheel - ---- -*** New user options for alternate wheel events. -The options 'mouse-wheel-down-alternate-event', -'mouse-wheel-up-alternate-event', '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. - -** Internationalization changes - -*** The <Delete> function key now allows deleting the entire composed sequence. -For the details, see the item about the 'delete-forward-char' command -above. - -*** 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 sequence. - ---- -*** 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 - ---- -*** 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. - ---- -*** 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. - ---- -*** New Ukrainian translation of the Emacs Tutorial. - ---- -*** 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'. - ---- -*** New tamil99 input method for the Tamil language. -This supports the keyboard layout specifically designed for the Tamil -language. - ---- -*** New input method 'slovak-qwerty'. -This is a variant of the 'slovak' input method, which corresponds to -the QWERTY Slovak keyboards. +* Editing Changes in Emacs 30.1 -* Changes in Specialized Modes and Packages in Emacs 29.1 - -** Ecomplete - ---- -*** New commands 'ecomplete-edit' and 'ecomplete-remove'. -These allow you to (respectively) edit and bulk-remove entries from -the ecomplete database. - ---- -*** New user option 'ecomplete-auto-select'. -If non-nil and there's only one matching option, auto-select that. - ---- -*** New user option 'ecomplete-filter-regexp'. -If non-nil, this user option describes what entries not to add to the -database stored on disk. - -** Auth-Source - -+++ -*** 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. - -** Dired - -+++ -*** '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. - ---- -*** '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'. - -+++ -*** 'dired-do-relsymlink' moved from dired-x to dired. -The corresponding key 'Y' is now bound by default in Dired. - -+++ -*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. -The corresponding key '% Y' is now bound by default in Dired. - ---- -*** 'M-G' is now bound to 'dired-goto-subdir'. -Before, that binding was only available if the dired-x package was -loaded. - -+++ -*** '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)) - ---- -*** New command 'dired-do-eww'. -This command visits the file on the current line with EWW. - -** Elisp - ---- -*** 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. - ---- -*** 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. - -** Games - ---- -*** New user option 'tetris-allow-repetitions'. -This controls how randomness is implemented (whether to use pure -randomness as before or whether to use a bag). - -** Battery - -+++ -*** New user option 'battery-update-functions'. -This can be used to trigger actions based on the battery status. - -** Enriched Mode - -+++ -*** New command 'enriched-toggle-markup'. -This allows you to see the markup in 'enriched-mode' buffers (e.g., -the "HELLO" file). - -** Shell Script Mode - +* Changes in Specialized Modes and Packages in Emacs 30.1 --- -*** New user option 'sh-indent-statement-after-and'. -This controls how statements like the following are indented: +** Variable order and truncation can now be configured in gdb-many-window mode. +The new variable 'gdb-locals-table-row-config' allows users to +configure the order and max length of various properties in the local +variables buffer when using 'gdb-many-windows'. - foo && - bar +By default, this variable is set to write the properties in the order: +name, type and value, where the name and type are truncated to 20 +characters, and the value is truncated according to the value of +'gdb-locals-value-limit'. -*** New Flymake backend using the ShellCheck program. -It is enabled by default, but requires that the external "shellcheck" -command is installed. - -** CC Mode - ---- -*** C++ Mode now supports most of the new features in the C++20 standard. - -** Cperl Mode - ---- -*** 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. +If you want to get back the old behavior, set +'gdb-locals-table-row-config' to the value -** Gud - ---- -*** 'gud-go' is now bound to 'C-c C-v'. -If given a prefix, it will query the user for an argument to use for -the run/continue command. - ---- -*** '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. - -** Customize - ---- -*** New command 'custom-toggle-hide-all-widgets'. -This is bound to 'H' and toggles whether to hide or show the widget -contents. - -** Diff mode - ---- -*** 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 from previous Emacs versions. - -+++ -*** New user option 'diff-add-log-use-relative-names'. -If non-nil insert file names in ChangeLog skeletons relative to the -VC root directory. - -** Ispell - ---- -*** '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'. - -** Dabbrev - ---- -*** New function 'dabbrev-capf' for use on 'completion-at-point-functions'. - -+++ -*** 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'. - -** Package - -+++ -*** New command 'package-update'. -This command allows you to upgrade packages without using 'M-x -list-packages'. - -+++ -*** New command 'package-update-all'. -This command allows updating all packages without any queries. - -+++ -*** 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). - -+++ -*** 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. - -+++ -*** New command 'package-vc-install'. -Packages can now be installed directly from source by cloning from a -repository. - -+++ -*** 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. - -+++ -*** New command 'package-vc-checkout'. -Used to fetch the source of a package by cloning a repository without -activating the package. - -+++ -*** New command 'package-vc-prepare-patch'. -This command allows you to send patches to package maintainers, for -packages checked out using 'package-vc-install'. - -+++ -*** New command 'package-report-bug'. -This command helps you compose an email for sending bug reports to -package maintainers. - -+++ -*** New user option 'package-vc-selected-packages'. -By customizing this user option you can specify specific packages to -install. - -** Emacs Sessions (Desktop) - -+++ -*** 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. - -** Miscellaneous - -+++ -*** 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. - -** Debugging - ---- -*** '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. - -+++ -*** 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. - -+++ -*** '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. - -+++ -*** '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. - -+++ -*** 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. - -** Compile - -+++ -*** New user option 'compilation-hidden-output'. -This can be used to make specific parts of compilation output -invisible. - -+++ -*** 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). - -+++ -*** New user option 'compilation-max-output-line-length'. -Lines longer than this will have the ends hidden, with a button to -reveal the hidden text. This speeds up operations like grepping on -files that have few newlines. - -** Flymake - -+++ -*** New user option 'flymake-mode-line-lighter'. - -+++ -** 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'. - ---- -** New mode, 'emacs-news-mode', for editing the NEWS file. -This mode adds some highlighting, fixes the 'M-q' command, and has -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. - ---- -** 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). - ---- -** savehist.el can now truncate variables that are too long. -An element of '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. - -** Minibuffer and Completions - -+++ -*** 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. - -+++ -*** 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. - ---- -*** New user option 'completion-auto-wrap'. -When non-nil, the commands 'next-completion', 'previous-completion', -'next-line-completion' and 'previous-line-completion' automatically -wrap around on reaching the beginning or the end of the "*Completions*" -buffer. - -+++ -*** 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. - -*** 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. - -+++ -*** User option 'minibuffer-eldef-shorten-default' is now obsolete. -Customize the user option 'minibuffer-default-prompt-format' instead. - -+++ -*** 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. - -+++ -*** New user option 'completions-max-height'. -This option limits the height of the "*Completions*" buffer. - -+++ -*** New user option 'completions-header-format'. -This is a string to control the heading 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 heading line is not shown. - -+++ -*** 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. - -+++ -*** 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 to the minibuffer, -but doesn't exit the minibuffer. - -+++ -*** You can now define abbrevs for the fundamental minibuffer modes. -'minibuffer-mode-abbrev-table' and -'minibuffer-inactive-mode-abbrev-table' are now defined. - -** Isearch and Replace - -+++ -*** 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. - -+++ -*** 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. - -+++ -*** New user option 'char-fold-override'. -Non-nil means that the default definitions of equivalent characters -are overridden. - -*** New command 'describe-char-fold-equivalences'. -It displays character equivalences used by 'char-fold-to-regexp'. - -+++ -*** 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. - -** Glyphless characters - -+++ -*** New minor mode 'glyphless-display-mode'. -This allows an easy way to toggle seeing all glyphless characters in -the current buffer. - ---- -*** 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. - -+++ -*** "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. - -** Registers - -+++ -*** 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*")) - -** Pixel-fill - -+++ -*** This is a new package that deals with filling variable-pitch text. - -+++ -*** New function 'pixel-fill-region'. -This fills the region to be no wider than a specified pixel width. - -** Info - -+++ -*** 'M-x info-apropos' now takes a prefix argument to search for regexps. - ---- -*** 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. - -** Shortdoc - ---- -*** New command 'shortdoc-copy-function-as-kill' bound to 'w'. -It copies the name of the function near point into the kill ring. - ---- -*** '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'. + ((type . 0)(name . 0)(value . ,gdb-locals-value-limit)). ** VC --- -*** New command 'vc-pull-and-push'. -This commands first does a "pull" command, and if that is successful, -do a "push" command afterwards. - -+++ -*** '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. - -+++ -*** New command '%' ('vc-dir-mark-by-regexp'). -This command marks files based on a regexp. If given a prefix -argument, unmark instead. - -+++ -*** 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. - ---- -*** '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, e.g. 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. - ---- -*** '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'. - ---- -*** Log Edit now font locks 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'. +*** New user option 'vc-git-shortlog-switches'. +This is a string or a list of strings that specifies the Git log +switches for shortlogs, such as the one produced by 'C-x v L'. +'vc-git-log-switches' is no longer used for shortlogs. ---- -*** New 'log-edit-headers-separator' face. -It is used to style the line that separates the 'log-edit' headers -from the 'log-edit' summary. - ---- -*** 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'. +** bs --- -*** New function 'vc-read-multiple-revisions'. -This function invokes 'vc-read-revision' with a non-nil value for -MULTIPLE. +*** New user option 'bs-default-action-list'. +You can now configure how to display the "*buffer-selection*" buffer +using this new option. (Or set 'display-buffer-alist' directly.) +++ -*** 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'. - -** Message - ---- -*** New user option 'mml-attach-file-at-the-end'. -If non-nil, 'C-c C-a' will put attached files at the end of the message. - ---- -*** Message Mode now supports image yanking. - -+++ -*** New user option 'message-server-alist'. -This controls automatic insertion of the "X-Message-SMTP-Method" -header before sending a message. - -** HTML Mode - ---- -*** HTML Mode now supports "text/html" and "image/*" yanking. - -** Texinfo Mode - ---- -*** 'texinfo-mode' now has a specialized 'narrow-to-defun' definition. -It narrows to the current node. - -** EUDC - -+++ -*** 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. - -+++ -*** 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"). - -+++ -*** 'eudc-expansion-overwrites-query' to 'eudc-expansion-save-query-as-kill'. -'eudc-expansion-overwrites-query' is renamed to -'eudc-expansion-save-query-as-kill' to reflect the actual behavior of -the user option. - -+++ -*** 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. - -+++ -*** 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 to produce 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. - -+++ -*** 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'. - -+++ -*** 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. - -+++ -*** 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. - -+++ -*** New back-end for mailabbrev. -A new back-end for mailabbrev allows information from that database to -be queried by EUDC, too. The attributes 'email', 'name', and 'firstname' -are supported only. - -** EWW/SHR - -+++ -*** New user option to automatically rename EWW buffers. -The 'eww-auto-rename-buffer' user option can be configured to rename -rendered web pages by using their title, URL, or a user-defined -function which returns a string. For the first two cases, the length -of the resulting name is controlled by 'eww-buffer-name-length'. By -default, no automatic renaming is performed. - -+++ -*** New user option 'shr-allowed-images'. -This complements 'shr-blocked-images', but allows specifying just the -allowed images. - -+++ -*** 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. - -+++ -*** 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. - -** Find-Dired - ---- -*** 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. - -** Gnus - -+++ -*** 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. - ---- -*** '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. - ---- -*** 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) - ---- -*** The default value of 'gnus-treat-fold-headers' is now 'head'. - ---- -*** New face 'gnus-header'. -All other 'gnus-header-*' faces inherit from this face now. - -+++ -*** 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. - -+++ -*** New command 'gnus-article-emojize-symbols'. -This is bound to 'W D e' and will display symbols that have emoji -representation as emojis. - -+++ -*** New mu backend for gnus-search. -Configuration is very similar to the notmuch and namazu backends. It -supports the unified search syntax. - ---- -*** '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. - -** Rmail - ---- -*** 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. - ---- -*** 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. - -** EIEIO - -+++ -*** 'slot-value' can now be used to access slots of 'cl-defstruct' objects. - -** Align - ---- -*** Alignment in 'text-mode' has changed. -Previously, 'M-x align' didn't do anything, and you had to say 'C-u -M-x align' for it to work. This has now been changed. The default -regexp for 'C-u M-x align-regexp' has also been changed to be easier -for inexperienced users to use. - -** Help - ---- -*** 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. - ---- -*** 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'). - -** Info-look - ---- -*** info-look specs can now be expanded at run time instead of a load time. -The new ':doc-spec-function' element can be used to compute the -':doc-spec' element when the user asks for info on that particular -mode (instead of at load time). - -** Ansi-color - ---- -*** Support for ANSI 256-color and 24-bit colors. -256-color and 24-bit color codes are now handled by ANSI color -filters and displayed with the specified color. - -** Term-mode - ---- -*** 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. - ---- -*** 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. - -** Project - -+++ -*** '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". - -+++ -*** New command 'project-list-buffers' bound to 'C-x p C-b'. -This command displays a list of buffers from the current project. - -+++ -*** '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. - -*** 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'. - -** Xref - -+++ -*** New command 'xref-go-forward'. -It is bound to 'C-M-,' and jumps to the location where 'xref-go-back' -('M-,', also known as 'xref-pop-marker-stack') was invoked previously. - -+++ -*** '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. - -+++ -*** New command 'xref-find-references-and-replace' to rename one identifier. - ---- -*** New variable 'xref-current-item' (renamed from a private version). - ---- -*** New function 'xref-show-xrefs'. - -** File notifications - -+++ -*** The new command 'file-notify-rm-all-watches' removes all file notifications. - -** Sql - ---- -*** Sql now supports sending of passwords in-process. -To improve security, if an sql product has ':password-in-comint' set -to t, a password supplied via the minibuffer will be sent in-process, -as opposed to via the command-line. - -** Image Mode - -+++ -*** New command 'image-transform-fit-to-window'. -This command fits the image to the current window by scaling down or -up as necessary. Unlike 'image-transform-fit-both', this does not -only scale the image down, but up as well. It is bound to 's w' in -Image Mode by default. - ---- -*** New command 'image-mode-wallpaper-set'. -This command sets the desktop background to the current image. It is -bound to 'W' by default. - -+++ -*** 'image-transform-fit-to-{height,width}' are now obsolete. -Use the new command 'image-transform-fit-to-window' instead. -The keybinding for 'image-transform-fit-to-width' is now 's i'. - ---- -*** User option 'image-auto-resize' can now be set to 'fit-window'. -This works like 'image-transform-fit-to-window'. - ---- -*** New user option 'image-auto-resize-max-scale-percent'. -The new 'fit-window' option will never scale an image more than this -much (in percent). It is nil by default, which means no limit. - ---- -*** New user option 'image-text-based-formats'. -This controls whether or not to show a message when opening certain -image formats saying how to edit it as text. The default is to show -this message for SVG and XPM. - -+++ -*** 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. - -+++ -*** New command 'image-transform-set-percent'. -It allows setting the image size to a percentage of its original size, -and is bound to 's p' in Image mode. - -+++ -*** 'image-transform-original' renamed to 'image-transform-reset-to-original'. -The old name was confusing, and is now an obsolete function alias. - -+++ -*** 'image-transform-reset' renamed to 'image-transform-reset-to-initial'. -The old name was confusing, and is now an obsolete function alias. - -** Images - -+++ -*** Users can now add special image conversion functions. -This is done via 'image-converter-add-handler'. - -** Image-Dired - -+++ -*** '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. - ---- -*** 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' - ---- -*** 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. - ---- -*** 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. - ---- -*** 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. - ---- -*** 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. - ---- -*** '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. - ---- -*** 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. - ---- -*** 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. - ---- -*** 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. - ---- -*** 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") - ---- -*** 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' - ---- -*** 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. - ---- -*** Support GraphicsMagick command line tools. -Support for the GraphicsMagick command line tool ("gm") has been -added, and is used instead of ImageMagick when it is available. - ---- -*** 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. - ---- -*** Reduce dependency on external "exiftool" command. -The 'image-dired-copy-with-exif-file-name' no longer requires an -external "exiftool" command to be available. The user options -'image-dired-cmd-read-exif-data-program' and -'image-dired-cmd-read-exif-data-options' are now obsolete. - ---- -*** 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. - ---- -*** 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. - -+++ -*** '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. - ---- -*** 'image-dired-thumb-size' increased to 128. - -+++ -*** 'image-dired-db-file' renamed to 'image-dired-tags-db-file'. - ---- -*** 'image-dired-display-image-mode' renamed to 'image-dired-image-mode'. -The corresponding keymap is now named 'image-dired-image-mode-map'. - -+++ -*** 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. - ---- -*** 'image-dired-thumb-{height,width}' are now obsolete. -Customize 'image-dired-thumb-size' instead, which will set both the -height and width. - ---- -*** 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'. - ---- -*** '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. - -+++ -*** 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'. - -** Dired - ---- -*** 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. - -+++ -*** 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. - -+++ -*** 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: - - (setq dired-free-space 'separate) - ---- -*** 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. - ---- -*** 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). - -** Bookmarks - ---- -*** 'list-bookmarks' now includes a type column. -Types are registered via a 'bookmark-handler-type' symbol property on -the jumping function. - -+++ -*** 'bookmark-sort-flag' can now be set to 'last-modified'. -This will display bookmark list from most recently set to least -recently set. - ---- -*** When editing a bookmark annotation, 'C-c C-k' will now cancel. -It is bound to the new command 'bookmark-edit-annotation-cancel'. - ---- -*** 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). - -** Exif - ---- -*** New function 'exif-field'. -This is a convenience function to extract the field data from -'exif-parse-file' and 'exif-parse-buffer'. - -** Xwidgets - ---- -*** New user option 'xwidget-webkit-buffer-name-format'. -This option controls how xwidget-webkit buffers are named. - ---- -*** 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. - -+++ -*** 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. - -+++ -*** 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'. - -+++ -*** 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. - ---- -*** On X, the WebKit inspector is now available inside xwidgets. -To access the inspector, right click on the widget and select "Inspect -Element". - ---- -*** "Open in New Window" in a WebKit widget's context menu now works. -The newly created buffer will be displayed via 'display-buffer', which -can be customized through the usual mechanism of 'display-buffer-alist' -and friends. - -** Tramp - -+++ -*** New connection methods "docker", "podman" and "kubernetes". -They allow accessing environments provided by Docker and similar -programs. - ---- -*** 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:~". - -+++ -*** 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. - -+++ -*** 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. - -+++ -*** 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. - -** Browse URL - ---- -*** 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. - ---- -*** New user option 'browse-url-irc-function'. -This option specifies a function for opening "irc://" links. It -defaults to the new function 'browse-url-irc'. - ---- -*** New function 'browse-url-irc'. -This multipurpose autoloaded function can be used for opening "irc://" -and "ircs://" URLS by any caller that passes a URL string as an initial -arg. - ---- -*** 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. - ---- -*** 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. - ---- -*** Support for the Mozilla web browser is now obsolete. -Note that this historical web browser is different from Mozilla -Firefox; it is its predecessor. - -** Python Mode - -+++ -*** 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. - -** Ruby Mode - ---- -*** New user option 'ruby-toggle-block-space-before-parameters'. - -** Eshell - -+++ -*** 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) Input/Output". - -+++ -*** 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. - -+++ -*** 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. - -+++ -*** 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'. - -+++ -*** 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. - -+++ -*** 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. - -+++ -*** 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. - ---- -*** 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. - ---- -*** 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). - -+++ -*** 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. - -** Shell - ---- -*** New user option 'shell-kill-buffer-on-exit'. -Enabling this will automatically kill a "*shell*" buffer as soon as -the shell session terminates. - ---- -*** 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. - -** Calc - -+++ -*** New user option 'calc-kill-line-numbering'. -Set it to nil to exclude line numbering from kills and copies. - -** Hierarchy - -+++ -*** 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. - -** Proced - ---- -*** 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. - ---- -*** 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. - -** Miscellaneous - ---- -*** 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. - -+++ -*** New user option 'font-lock-ignore'. -This option provides a mechanism to selectively disable font-lock -keyword-driven fontifications. - ---- -*** 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. - ---- -*** 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. - -+++ -*** 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. - ---- -*** 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. - -*** 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. - -+++ -*** 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. - ---- -*** '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. - ---- -*** New command 'recentf-open'. -This command prompts for a recently opened file in the minibuffer, and -visits it. - ---- -*** '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. - ---- -*** The 'run-dig' command is now obsolete; use 'dig' instead. - ---- -*** 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' - ---- -*** 'outlineify-sticky' command is renamed to 'allout-outlinify-sticky'. -The old name is still available as an obsolete function alias. - ---- -*** The url-irc library now understands "ircs://" links. - ---- -*** New command 'world-clock-copy-time-as-kill' for 'M-x world-clock'. -It copies the current line into the kill ring. - ---- -*** 'edit-abbrevs' now uses font-locking. -The new face 'abbrev-table-name' is used to display the abbrev table -name. - ---- -*** New key binding 'O' in 'M-x list-buffers'. -This key is now bound to 'Buffer-menu-view-other-window', which will -view this line's buffer in View mode in another window. +*** 'eshell-read-aliases-list' is now an interactive command. +After manually editing 'eshell-aliases-file', you can use +'M-x eshell-read-aliases-list' to load the edited aliases. -* New Modes and Packages in Emacs 29.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). - -+++ -*** use-package: Declarative package configuration. -use-package is 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. - -+++ -** 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. - ---- -** 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'. - -+++ -** New package 'oclosure'. -Allows the creation of "functions with slots" or "function objects" -via the macros 'oclosure-define' and 'oclosure-lambda'. - -+++ -*** 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. - ---- -** New theme 'leuven-dark'. -This is a dark version of the 'leuven' theme. - -+++ -** 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. - ---- -** New major mode 'js-json-mode'. -This is a lightweight variant of 'js-mode' that is used by default -when visiting JSON files. - -** New major mode 'typescript-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the TypeScript language. It includes support for font-locking, -indentation, and navigation. This mode will be auto-enabled for -files with the ".ts" extension. - -** 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. It includes -support for font-locking, indentation, and navigation. This mode -will be auto-enabled for files with the ".tsx" extension. - -** New major mode 'c-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the C language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'c++-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the C++ language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'java-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the Java language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'python-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the Python language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'css-ts-mode'. -A major mode based on the tree-sitter library for editing CSS -(Cascading Style Sheets). It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'json-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the JSON language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'csharp-ts-mode'. -A major mode based on the tree-sitter library for editing programs -in the C# language. It includes support for font-locking, -indentation, Imenu, which-func, and navigation. - -** New major mode 'csharp-mode'. -A major mode based on CC Mode for editing programs in the C# language. - -** New major mode 'bash-ts-mode'. -A major mode based on the tree-sitter library for editing Bash shell -scripts. It includes support for font-locking, indentation, Imenu, -which-func, and navigation. +* New Modes and Packages in Emacs 30.1 ** New major mode 'dockerfile-ts-mode'. A major mode based on the tree-sitter library for editing @@ -3074,1408 +85,13 @@ Dockerfiles. It includes support for font-locking, indentation, Imenu, and which-func. -* Incompatible Lisp Changes in Emacs 29.1 - -+++ -** '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. - -+++ -** New function 'substitute-quotes'. -This function works like 'substitute-command-keys' but only -substitutes quote characters. - ---- -** '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.) - -+++ -** Changes to "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'. - -+++ -** "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 "loaddef.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 -normal. - ---- -** 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. - -+++ -** '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. - ---- -** '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. - ---- -** '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". - -+++ -** Remapping 'mode-line' 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'. - -+++ -** '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'. - ---- -** 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. - -** Fonts - ---- -*** 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 previously specified -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. - ---- -** Keymap descriptions have changed. -'help--describe-command', 'C-h b' and associated functions that output -keymap descriptions have changed. In particular, prefix commands are -not output at all, and instead of "??" for closures/functions, -"[closure]"/"[lambda]" is output. - ---- -** 'downcase' details have changed slightly. -In certain locales, changing the case of an ASCII-range character may -turn it into a multibyte character, most notably with "I" in Turkish -(the lowercase is "ı", 0x0131). Previously, 'downcase' on a unibyte -string was buggy, and would mistakenly just return the lower byte of -this, 0x31 (the digit "1"). 'downcase' on a unibyte string has now -been changed to downcase such characters as if they were ASCII. To -get proper locale-dependent downcasing, the string has to be converted -to multibyte first. (This goes for the other case-changing functions, -too.) - ---- -** 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. - ---- -** 'def' indentation changes. -In 'emacs-lisp-mode', forms with a symbol with a name that start with -"def" have been automatically indented as if they were 'defun'-like -forms, for instance: - - (defzot 1 - 2 3) - -This heuristic has now been removed, and all functions/macros that -want to be indented this way have to be marked with - - (declare (indent defun)) - -or the like. If the function/macro definition itself can't be -changed, the indentation can also be adjusted by saying something -like: - - (put 'defzot 'lisp-indent-function 'defun) - ---- -** The 'inhibit-changing-match-data' variable is now obsolete. -Instead, functions like 'string-match' and 'looking-at' now take an -optional INHIBIT-MODIFY argument. - ---- -** 'gnus-define-keys' is now obsolete. -Use 'define-keymap' instead. - ---- -** MozRepl has been removed from js.el. -MozRepl was removed from Firefox in 2017, so this code doesn't work -with recent versions of Firefox. - ---- -** The function 'image-dired-get-exif-data' is now obsolete. -Use 'exif-parse-file' and 'exif-field' instead. - ---- -** 'insert-directory' alternatives should not change the free disk space line. -This change is now applied in 'dired-insert-directory'. - ---- -** 'compilation-last-buffer' is (finally) declared obsolete. -It's been obsolete since Emacs-22.1, actually. - ---- -** 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. - ---- -** 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', '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-function', -'mail-completion-at-point-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'. - ---- -** 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'. - ---- -** 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'. - -+++ -** New generic function 'function-documentation'. -Can dynamically generate a raw docstring depending on the type of -a function. -Used mainly for docstrings of OClosures. - -+++ -** 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 encoded text. - -+++ -** 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. - ---- -** '?\' at the end of a line now signals an error. -Previously, it produced a nonsense value, -1, that was never intended. - ---- -** 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. - -+++ -** 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'. +* Incompatible Lisp Changes in Emacs 30.1 -* Lisp Changes in Emacs 29.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 'read'able because -of an un'read'able value in an unrelated lexical variable. - -+++ -** 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. - -+++ -** New macro 'while-let'. -This is like 'when-let', but repeats until a binding form is nil. - -+++ -** 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. - -+++ -** 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). - -+++ -** 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. - ---- -** '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. - -+++ -** New 'declare' form 'interactive-args'. -This can be used to specify what forms to put into 'command-history' -when executing commands interactively. - -+++ -** The FORM arg 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. - -+++ -** 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. - -+++ -** 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'. - -** Connection-local variables - -+++ -*** 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. - -+++ -*** New function 'connection-local-update-profile-variables'. -This function allows to modify the settings of an existing -connection-local profile. - -+++ -*** New macro 'with-connection-local-application-variables'. -This macro works like 'with-connection-local-variables', but it allows -to use another application but 'tramp'. This is useful when running -code in a buffer where Tramp has already set some connection-local -variables. - -+++ -*** 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. - -+++ -** 'plist-get', 'plist-put' and 'plist-member' are no longer limited to 'eq'. -These function now take an optional comparison predicate argument. - -+++ -** 'read-multiple-choice' can now use long-form answers. - -+++ -** 'M-c' in 'read-regexp' now toggles case folding. - -+++ -** 'completing-read' now allows a function as its REQUIRE-MATCH argument. -This function is called to see whether what the user has typed in is a -match. This is also available from functions that call -'completing-read', like 'read-file-name'. - -+++ -** 'posn-col-row' can now give position data based on windows. -Previously, it reported data only based on the frame. - -+++ -** 'file-expand-wildcards' can now also take a regexp as PATTERN argument. - ---- -** vc-mtn (the backend for Monotone) has been made obsolete. - -+++ -** 'gui-set-selection' can now 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. - ---- -** 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'. - -+++ -** '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. - -+++ -** New function 'string-equal-ignore-case'. -This compares strings ignoring case differences. - -** '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. - -+++ -** New macro 'with-memoization' provides a very primitive form of memoization. - -+++ -** '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. - -** seq - -+++ -** New function 'seq-split'. -This returns a list of sub-sequences of the specified sequence. - -+++ -** New function 'seq-remove-at-position'. -This function returns a copy of the specified sequence where the -element at a given (zero-based) index got removed. - -+++ -** New function 'seq-positions'. -This returns a list of the (zero-based) indices of elements matching a -given predicate in the specified sequence. - -+++ -** New function 'seq-keep'. -This is like 'seq-map', but removes all nil results from the returned -list. - -** Themes - ---- -*** New hooks 'enable-theme-functions' and 'disable-theme-functions'. -These are run after enabling and disabling a theme, respectively. - ---- -*** Themes can now be made obsolete. -Using 'make-obsolete' on a theme is now supported. This will make -'load-theme' issue a warning when loading the theme. - -+++ -** New hook 'display-monitors-changed-functions'. -It is called whenever the configuration of different monitors on a -display changes. - -+++ -** 'prin1' and 'prin1-to-string' now take an optional OVERRIDES parameter. -This parameter can be used to override values of print-related settings. - -+++ -** New minor mode 'header-line-indent-mode'. -This is meant to be used in modes that have a header line that should -be kept aligned with the buffer contents when the user switches -'display-line-numbers-mode' on or off. - -+++ -** New minor mode 'lost-selection-mode'. -This minor mode makes Emacs deactivate the mark in all buffers when -the primary selection is obtained by another program. - ---- -** 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. - -+++ -** New predicate 'char-uppercase-p'. -This returns non-nil if its argument its an uppercase character. - -** Byte compilation - ---- -*** 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 seems -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 -"\=". - ---- -*** Byte compilation will now warn about some malformed 'defcustom' types. -It's 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. - -+++ -** '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. - ---- -** 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. - -+++ -** 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. - ---- -** 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. - ---- -** 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. - ---- -** 'x-show-tip' no longer hard-codes a timeout default. -The new 'x-show-tooltip-timeout' variable allows the user to alter -this for packages that don't use 'tooltip-show', but instead call the -lower level function directly. - ---- -** New function 'current-cpu-time'. -It gives access to the CPU time used by the Emacs process, for -example for benchmarking purposes. - ---- -** New function 'string-edit'. -This is meant to be used when the user has to edit a (potentially) -long string. It pops you to a new buffer where you can edit the -string, and a callback is called when the user types 'C-c C-c'. - -+++ -** New function 'read-string-from-buffer'. -This is a modal version of 'string-edit', and can be used as an -alternative to 'read-string'. - -+++ -** 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. - -+++ -** 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). - -+++ -** New function 'flush-standard-output'. -This enables you to display incomplete lines from batch-based Emacs -scripts. - -+++ -** New convenience function 'buttonize-region'. -This works like 'buttonize', but for a region instead of a string. - -+++ -** 'macroexp-let2*' can omit TEST arg and use single-var bindings. - -+++ -** New macro-writing macros, 'cl-with-gensyms' and 'cl-once-only'. -See the "(cl) Macro-Writing Macros" manual section for descriptions. - -+++ -** 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. - -+++ -** 'track-mouse' can be 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. - -+++ -** 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. - ---- -** 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. - -+++ -** 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. - -+++ -** 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. - -+++ -** New variable 'messages-buffer-name'. -This variable (defaulting to "*Messages*") allows packages to override -where messages are logged. - -+++ -** New function 'readablep'. -This function says whether an object can be written out and then -read back by the Emacs Lisp reader. - -+++ -** New variable 'print-unreadable-function'. -This variable allows changing how Emacs prints unreadable objects. - ---- -** 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. - ---- -** New function 'bidi-string-strip-control-characters'. -This utility function is meant for displaying strings when it's -essential that there's no bidirectional context. - ---- -** The Gnus range functions have been moved to a new library, range.el. -All the old names have been made obsolete. - -+++ -** New function 'function-alias-p'. -This predicate says whether an object is a function alias, and if it -is, the alias chain is returned. - -+++ -** New variable 'lisp-directory' holds the directory of Emacs's own Lisp files. - -+++ -** 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. - -+++ -** New function 'get-display-property'. -This is like 'get-text-property', but works on the 'display' text -property. - -+++ -** New function 'add-display-text-property'. -This is like 'put-text-property', but works on the 'display' text -property. - -+++ -** New 'min-width' 'display' property. -This allows setting a minimum display width for a region of text. - -+++ -** 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. - -+++ -** 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. - -+++ -** 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. - -+++ -** 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. - ---- -** New hook 'post-select-region-hook'. -This hook is run immediately after 'select-active-regions' causes the -region to be set as the primary selection. - -+++ -** 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 combined with a condition like -'(and "\\`\\*.+\\*\\'" (major-mode . special-mode))'. - -+++ -** New function 'match-buffers'. -Use 'buffer-match-p' to gather a list of buffers that match a -condition. - ---- -** 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. - -** Text security and suspiciousness - -+++ -*** 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 contain bidirectional (or other) formatting characters that -may be used to confuse a user. - -+++ -*** 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 aren't -performed. - -+++ -*** 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. - -** Keymaps and key definitions - -+++ -*** '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'. - -+++ -*** New functions for defining and manipulating keystrokes. -These all take the syntax defined by 'key-valid-p'. None of the older -functions have been deprecated or altered, but they are now -de-emphasized in the documentation. - -+++ -*** Use 'keymap-set' instead of 'define-key'. - -+++ -*** Use 'keymap-global-set' instead of 'global-set-key'. - -+++ -*** Use 'keymap-local-set' instead of 'local-set-key'. - -+++ -*** Use 'keymap-global-unset' instead of 'global-unset-key'. - -+++ -*** Use 'keymap-local-unset' instead of 'local-unset-key'. - -+++ -*** Use 'keymap-substitute' instead of 'substitute-key-definition'. - -+++ -*** Use 'keymap-set-after' instead of 'define-key-after'. - -+++ -*** Use 'keymap-lookup' instead of 'lookup-keymap' and 'key-binding'. - -+++ -*** Use 'keymap-local-lookup' instead of 'local-key-binding'. - -+++ -*** Use 'keymap-global-lookup' instead of 'global-key-binding'. - -+++ -*** '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). - -+++ -*** 'read-multiple-choice' now takes an optional SHOW-HELP argument. -If non-nil, show the help buffer immediately, before any user input. - -+++ -*** 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. - ---- -*** New function 'key-parse'. -This is like 'kbd', but only returns vectors instead of a mix of -vectors and strings. - -+++ -*** 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. - -+++ -** 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'. - -+++ -** New function 'file-name-split'. -This returns a list of all the components of a file name. - -+++ -** New function 'file-name-parent-directory'. -This returns the parent directory of a file name. - -+++ -** New macro 'with-undo-amalgamate'. -It records a particular sequence of operations as a single undo step. - -+++ -** 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. - -+++ -** 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. - -+++ -** New variable 'yank-transform-functions'. -This variable allows the user to alter the string to be inserted. - ---- -** New command 'yank-in-context'. -This command tries to preserve string/comment syntax when yanking. - ---- -** 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. - -+++ -** New text property 'inhibit-isearch'. -If set, 'isearch' will skip these areas, which can be useful (for -instance) when covering huge amounts of data (that has no meaningful -searchable data, like image data) with a 'display' text property. - -+++ -** 'insert-image' now takes an INHIBIT-ISEARCH optional parameter. -It marks the image with the 'inhibit-isearch' text property, which -inhibits 'isearch' matching the STRING parameter. - ---- -** 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. - ---- -** 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. - ---- -** New user option 'pp-use-max-width'. -If non-nil, 'pp' will attempt to limit the line length when formatting -long lists and vectors. - ---- -** New function 'pp-emacs-lisp-code'. -'pp' formats general Lisp sexps. This function does much the same, -but applies formatting rules appropriate for Emacs Lisp code. - -+++ -** New function 'file-has-changed-p'. -This convenience function is useful when writing code that parses -files at run-time, and allows Lisp programs to re-parse files only -when they have changed. - -+++ -** 'abbreviate-file-name' now respects magic file name handlers. - ---- -** New function 'font-has-char-p'. -This can be used to check whether a specific font has a glyph for a -character. - -+++ -** '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. - -+++ -** '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. - -+++ -** '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. - -+++ -** '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. - -** XDG support - ---- -*** New function 'xdg-state-home'. -It returns the new 'XDG_STATE_HOME' 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 $XDG_DATA_HOME". -(This variable was introduced in the XDG Base Directory Specification -version 0.8 released on May 8, 2021.) - ---- -*** New function 'xdg-current-desktop'. -It returns a list of strings, corresponding to the colon-separated -list of names in the 'XDG_CURRENT_DESKTOP' environment variable, which -identify the current desktop environment. -(This variable was introduced in XDG Desktop Entry Specification -version 1.2.) - ---- -*** New function 'xdg-session-type'. -It returns the 'XDG_SESSION_TYPE' environment variable. (This is not -part of any official standard; see the man page pam_systemd(8) for -more information.) - -+++ -** New macro 'with-delayed-message'. -This macro is like 'progn', but will output the specified message if -the body takes longer to execute than the specified timeout. - ---- -** New function 'funcall-with-delayed-message'. -This function is like 'funcall', but will output the specified message -if the function takes longer to execute than the specified timeout. - -** Locale - ---- -*** New variable 'current-locale-environment'. -This holds the value of the previous call to 'set-locale-environment'. - ---- -*** New macro 'with-locale-environment'. -This macro can be used to change the locale temporarily while -executing code. - -** table.el - ---- -*** New user option 'table-latex-environment'. -This allows switching between "table" and "tabular". - -** Tabulated List Mode - -+++ -*** A column can now be set to an image descriptor. -The 'tabulated-list-entries' variable now supports using an image -descriptor, which means to insert an image in that column instead of -text. See the documentation string of that variable for details. - -+++ -** ':keys' in 'menu-item' can now be a function. -If so, it is called whenever the menu is computed, and can be used to -calculate the keys dynamically. - -+++ -** New major mode 'clean-mode'. -This is a new major mode meant for debugging. It kills absolutely all -local variables and removes overlays and text properties. - -+++ -** 'kill-all-local-variables' can now kill all local variables. -If given the new optional KILL-PERMANENT argument, also kill permanent -local variables. - -+++ -** Third 'mapconcat' argument SEPARATOR is now optional. -An explicit nil always meant the empty string, now it can be left out. - -+++ -** New function 'define-keymap'. -This function allows defining a number of keystrokes with one form. - -+++ -** New macro 'defvar-keymap'. -This macro allows defining keymap variables more conveniently. - -** '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 ...))' - ---- -** 'kbd' can now be used in built-in, preloaded libraries. -It no longer depends on edmacro.el and cl-lib.el. - -+++ -** New function 'image-at-point-p'. -This function returns t if point is on a valid image, and nil -otherwise. - -+++ -** New function 'buffer-text-pixel-size'. -This is similar to 'window-text-pixel-size', but can be used when the -buffer isn't displayed. - -+++ -** New function 'string-pixel-width'. -This returns the width of a string in pixels. This can be useful when -dealing with variable pitch fonts and glyphs that have widths that -aren't integer multiples of the default font. - -+++ -** New function 'string-glyph-split'. -This function splits a string into a list of strings representing -separate glyphs. This takes into account combining characters and -grapheme clusters. - ---- -** 'lookup-key' is more 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'. - -** xwidgets - -+++ -*** 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. - -+++ -*** New function 'xwidget-perform-lispy-event'. -This function allows you to send events to xwidgets. Usually, some -equivalent of the event will be sent, but there is no guarantee of -what the widget will actually receive. - -On GTK+, only key and function key events are implemented. - -+++ -*** New 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'. - -+++ -*** 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. - -+++ -*** New function 'xwidget-webkit-back-forward-list'. -This function returns the history of page-loads in a WebKit xwidget. - -+++ -*** New function 'xwidget-webkit-estimated-load-progress'. -This function returns the estimated progress of page loading in a -WebKit xwidget. - -+++ -*** New function 'xwidget-webkit-stop-loading'. -This function terminates all data transfer during page loads in a -WebKit xwidget. - -+++ -*** 'load-changed' xwidget events are now more detailed. -In particular, they can now have different arguments based on the -state of the WebKit widget. 'load-finished' is sent when a load has -completed, 'load-started' when a load first starts, 'load-redirected' -after a redirect, and 'load-committed' when the WebKit widget first -commits to the load. - -+++ -*** New event type 'xwidget-display-event'. -These events are sent whenever an xwidget requests that Emacs display -another xwidget. The only arguments to this event are the xwidget -that should be displayed, and the xwidget that asked to display it. - -+++ -*** 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. - ---- -** New variable 'help-buffer-under-preparation'. -This variable is bound to t during the preparation of a "*Help*" buffer. - -+++ -** 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. - -+++ -** '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))'. - -+++ -** 'date-to-time' now assumes earliest 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. - -+++ -** '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". - -+++ -** 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. - -+++ -** 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. - -+++ -** 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. - -+++ -** 'defalias' records a more precise history of definitions. -This is recorded in the 'function-history' symbol property. - ---- -** New hook 'save-place-after-find-file-hook'. -This is called at the end of 'save-place-find-file-hook'. - ---- -** 'indian-tml-base-table' no longer translates digits. -Use 'indian-tml-base-digits-table' if you want digits translation. - ---- -** 'indian-tml-itrans-v5-hash' no longer translates digits. -Use 'indian-tml-itrans-digits-v5-hash' if you want digits -translation. - -+++ -** 'shell-quote-argument' has a new optional parameter POSIX. -This is useful when quoting shell arguments for a remote shell -invocation. Such shells are POSIX conformant by default. - -+++ -** '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', e.g. '(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'. - -+++ -** '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'. - -+++ -** 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)) - -+++ -** 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. - ---- -** 'string-split' is now an alias for 'split-string'. - -+++ -** '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. - -+++ -** 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. - -** 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'. +* Lisp Changes in Emacs 30.1 -* Changes in Emacs 29.1 on Non-Free Operating Systems - -** MS-Windows - ---- -*** 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))) - -+++ -*** 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. - ---- -*** 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. - -+++ -*** 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. - -** Cygwin - ---- -*** 'process-attributes' is now implemented. +* Changes in Emacs 30.1 on Non-Free Operating Systems ---------------------------------------------------------------------- diff --git a/etc/NEWS.29 b/etc/NEWS.29 new file mode 100644 index 00000000000..e4a19e29869 --- /dev/null +++ b/etc/NEWS.29 @@ -0,0 +1,4498 @@ +GNU Emacs NEWS -- history of user-visible changes. + +Copyright (C) 2021-2022 Free Software Foundation, Inc. +See the end of the file for license conditions. + +Please send Emacs bug reports to 'bug-gnu-emacs@gnu.org'. +If possible, use 'M-x report-emacs-bug'. + +This file is about changes in Emacs version 29. + +See file HISTORY for a list of GNU Emacs versions and release dates. +See files NEWS.28, NEWS.27, ..., NEWS.18, and NEWS.1-17 for changes +in older Emacs versions. + +You can narrow news to a specific version by calling 'view-emacs-news' +with a prefix argument or by typing 'C-u C-h C-n'. + +Temporary note: ++++ indicates that all relevant manuals in doc/ have been updated. +--- means no change in the manuals is needed. +When you add a new item, use the appropriate mark if you are sure it +applies, and please also update docstrings as needed. + + +* Installation Changes in Emacs 29.1 + +--- +** Ahead-of-time native compilation can now be specified via configure. +Use '--with-native-compilation=aot' to specify that all the Lisp files +in the Emacs tree should be natively compiled ahead of time. (This is +slow on most machines.) + ++++ +** 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. + ++++ +** 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'. + ++++ +** 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. + +--- +** Emacs now installs the ".pdmp" file using a unique fingerprint in the name. +The file is typically installed using a file name akin to +"...dir/libexec/emacs/29.1/x86_64-pc-linux-gnu/emacs-<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. + +--- +** Emacs 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. + +--- +** 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 JA_DIC_NO_REDUCTION_OPTION='' + +after deleting "lisp/leim/ja-dic/ja-dic.el". + ++++ +** 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 do not recommend +that you use this configuration, unless you are running a window +system that's supported by GDK other than X. 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'. + +--- +** 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. However, no 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. + +--- +** The docstrings of preloaded files are not in "etc/DOC" any more. +Instead, they're fetched as needed from the corresponding ".elc" file, +as was already the case for all the non-preloaded files. + + +* Startup Changes in Emacs 29.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. + ++++ +** 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. + ++++ +** Emacs now supports setting 'user-emacs-directory' via '--init-directory'. + ++++ +** Emacs now has a '--fingerprint' option. +This will output a string identifying the current Emacs build. + ++++ +** New hook 'after-pdump-load-hook'. +This is run at the end of the Emacs startup process, and is meant to +be used to reinitialize structures that would normally be done at load +time. + +** Native Compilation + ++++ +*** New variable 'inhibit-automatic-native-compilation'. +If set, Emacs will inhibit native compilation (and won't write +anything to the eln cache automatically). The variable is initialized +from the 'EMACS_INHIBIT_AUTOMATIC_NATIVE_COMPILATION' environment +variable on Emacs startup. + +--- +*** New command 'native-compile-prune-cache'. +This command deletes older eln cache entries (but not the ones for +the current Emacs version). + +--- +*** 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'. + + +* Incompatible changes in Emacs 29.1 + ++++ +** The image commands have changed key bindings. +In previous Emacs versions, images have had the '+', '-' and 'r' keys +bound when point is over an image. In Emacs 29.1, additional commands +were added, and this made it more likely that users would trigger the +image commands by mistake. To avoid this, all image commands have +moved to the 'i' 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. + ++++ +** Emacs now picks the correct coding system for X input methods. +Previously, Emacs would use the 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. + +Now, Emacs 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. + ++++ +** 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. + +--- +** '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 get +back to how things worked in Emacs 28.1, put the following in your +init file: + + (setopt show-paren-predicate t) + ++++ +** 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'. + +--- +** 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. + +** Dired + +--- +*** '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". + +--- +*** 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. + ++++ +** Warning about "eager macro-expansion failure" is changed into an error. + +--- +** 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. + ++++ +** 'E' in 'query-replace' now edits the replacement with exact case. +Previously, this command did the same as 'e'. + +--- +** '/ a' in "*Packages*" buffer now limits by archive name(s) instead of regexp. + ++++ +** 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'. + +--- +** 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. + +--- +** Sorting commands no longer necessarily change modification status. +In earlier Emacs versions, commands like 'M-x 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 changing the contents +of the buffer. + +--- +** 'string-lines' handles trailing newlines differently. +It no longer returns an empty final string if the string ends with a +newline. + +--- +** '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. + +--- +** '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. + +--- +** '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) + +--- +** New user option 'term-clear-full-screen-programs'. +By default, term 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. + +--- +** Support for old EIEIO functions is not autoloaded any more. +You need an explicit '(require 'eieio-compat)' to use 'defmethod' +and 'defgeneric' (which have been made obsolete in Emacs 25.1 with +'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). + +--- +** '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. + +--- +** 'C-x 8 =' 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 ='. + +** Eshell + +*** 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 system, instead of using +the PATH environment variable directly. + +--- +*** '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. + ++++ +*** 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. + ++++ +*** Eshell pipelines now only pipe stdout by default. +To pipe both stdout and stderr, use the '|&' operator instead of '|'. + +--- +** 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. + ++++ +** '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. + +--- +** 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. + ++++ +** 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. + ++++ +** 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'. + +--- +** 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 after +upgrading (usually "~/.emacs.d/image-dired/"). + +--- +** 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". + +--- +** 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. + +--- +** 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". + +--- +** 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) + +--- +** The thumbs.el library is now obsolete. +We recommend using 'M-x image-dired' instead. + +--- +** 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. +It is believed to no longer be useful. + +--- +** The quickurl.el library is now obsolete. +Use 'abbrev', 'skeleton' or 'tempo' instead. + +--- +** The rlogin.el library, and the 'rsh' command are now obsolete. +Use something like 'M-x shell RET ssh <host> RET' instead. + +--- +** The url-about.el library is now obsolete. + +--- +** The autoload.el library is now obsolete. +It is superseded by the loaddefs-gen.el library. + +--- +** The netrc.el library is now obsolete. +Use the 'auth-source-netrc-parse-all' function in auth-source.el +instead. + +--- +** The url-dired.el library is now obsolete. + +--- +** 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. + + +* Changes in Emacs 29.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') without having to use 'defalias', which can have +undesirable side effects. +This applies to all modes specified via 'auto-mode-alist', file-local +variables, etc. + +--- +** Emacs now supports Unicode Standard version 15.0. + +--- +** New user option 'electric-quote-replace-consecutive'. + +--- +** 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. + +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'. + +Note that the display optimizations in these cases may cause the +buffer to be occasionally mis-fontified. + +The new function 'long-line-optimizations-p' returns non-nil when +these optimizations are in effect in the current buffer. + ++++ +** 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, e.g. '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. + +** 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 (tho 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) + +--- +** 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'. + ++++ +** 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) 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. + +--- +** Interactively, 'kill-buffer' will now offer to save the buffer if unsaved. + +--- +** 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. + +--- +** Files with the ".eld" extension are now visited in 'lisp-data-mode'. + ++++ +** '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]) + ++++ +** 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'. + ++++ +** 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). + ++++ +** 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'. + ++++ +** New command 'rename-visited-file'. +This command renames the file visited by the current buffer by moving +it to a new location, and also makes the buffer visit this new file. + +** Menus + +--- +*** 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. + +--- +** '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. + ++++ +** 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 parameters to restart instead of just killing the current +process. + ++++ +** 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). + ++++ +** 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. + +--- +** 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. + ++++ +*** 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. + ++++ +** 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. + ++++ +** 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. + ++++ +** 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. + ++++ +** New function 'command-query'. +This function makes its argument command prompt the user for +confirmation before executing. + ++++ +** 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. + +--- +** '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. + ++++ +** 'count-words' will now report sentence count when used interactively. + +** New user option 'set-message-functions'. +It allows selecting more functions for 'set-message-function' +in addition to the default function that handles messages +in the active minibuffer. The most useful are 'inhibit-message' +that allows specifying a list of messages to inhibit via +'inhibit-message-regexps', and 'set-multi-message' that +accumulates recent messages and displays them stacked +in the echo area. + +--- +** 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. + ++++ +** 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. + +--- +** '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. + ++++ +** New user option 'process-error-pause-time'. +This determines how long to pause Emacs after a process +filter/sentinel error has been handled. + ++++ +** 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-number-face', +'font-lock-misc-punctuation-face', 'font-lock-operator-face', +'font-lock-property-face', and 'font-lock-punctuation-face'. + ++++ +** 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. + ++++ +** 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'). + ++++ +** 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. + ++++ +** New X resource: "borderThickness". +This controls the thickness of the external borders of the menu bars +and pop-up menus. + ++++ +** New X resource: "inputStyle". +This controls the style of the pre-edit and status areas of X input +methods. + ++++ +** New X resources: "highlightForeground" and "highlightBackground". +Only in the Lucid build, this controls colors used for highlighted +menu item widgets. + ++++ +** 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". + ++++ +** 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'. + ++++ +** New frame parameter 'alpha-background' and X resource "alphaBackground". +This controls the opacity of the text background when running on a +composited display. + ++++ +** 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. + +--- +** 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. + ++++ +** 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. + ++++ +** 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. + +--- +** 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. + +** Terminal Emacs + +--- +*** 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". + +*** 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. + +--- +*** 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. It 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. + +--- +*** 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. + +** ERT + ++++ +*** 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. + +--- +*** 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. + ++++ +*** ERT can generate JUnit test reports. +When environment variable 'EMACS_TEST_JUNIT_REPORT' is set, ERT +generates a JUnit test report under this file name. This is useful +for Emacs integration into CI/CD test environments. + +--- +*** Unbound test symbols now signal an 'ert-test-unbound' error. +This affects the 'ert-select-tests' function and its callers. + +** Emoji + ++++ +*** Emacs now has several new methods for inserting Emojis. +The Emoji commands are under the new 'C-x 8 e' prefix. + ++++ +*** New command 'emoji-insert' (bound to 'C-x 8 e e' and 'C-x 8 e i'). +This command guides you through various Emoji categories and +combinations in a graphical menu system. + ++++ +*** New command 'emoji-search' (bound to 'C-x 8 e s'). +This command lets you search for Emojis based on names. + ++++ +*** New command 'emoji-list' (bound to 'C-x 8 e l'). +This command lists all Emojis (categorized by themes) in a special +buffer and lets you choose one of them. + +--- +*** New command 'emoji-recent' (bound to 'C-x 8 e r'). +This command lets you choose among the Emojis you have recently +inserted. + ++++ +*** New command 'emoji-describe' (bound to 'C-x 8 e d'). +This command will tell you the name of the Emoji at point. (This +command also works for non-Emoji characters.) + +--- +*** 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. + +--- +*** New input method 'emoji'. +This allows you to enter emoji using short strings, eg ':face_palm:' +or ':scream:'. + +** Help + +--- +*** Variable values displayed by 'C-h v' in "*Help*" are now font-locked. + ++++ +*** New user option 'help-clean-buttons'. +If non-nil, link buttons in "*Help*" will have any surrounding quotes +removed. + +--- +*** 'M-x apropos-variable' output now includes values of variables. + ++++ +*** 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, the new +"\\+`like-this'" syntax can be used. + ++++ +*** New user option 'help-window-keep-selected'. +If non-nil, commands to show the info manual and the source will reuse +the same window the "*Help*" buffer is shown in. + +--- +*** 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... + ++++ +*** The 'C-h .' command now accepts a prefix argument. +'C-u C-h .' would previously inhibit displaying a warning message if +there's no local help at point. This has been changed to call +'button-describe'/'widget-describe' and display button/widget help +instead. + +--- +*** 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's easy to make an edit that yields an invalid result. + +--- +*** 'C-h b' uses outlining by default. +Set 'describe-bindings-outline' to nil to get the old behavior. + +--- +*** Jumping to function/variable source now saves mark before moving point. +Jumping to source from "*Help*" buffer moves the point when the source +buffer is already open. Now, the old point is pushed to mark ring. + ++++ +*** New key bindings in "*Help*" buffers: 'n' and 'p'. +These will take you (respectively) to the next and previous "page". + +--- +*** 'describe-char' now also outputs the name of emoji combinations. + ++++ +*** New key binding in "*Help*" buffer: 'I'. +This will take you to the Emacs Lisp manual entry for the item +displayed, if any. + +--- +*** 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. + ++++ +*** 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. + +--- +*** 'describe-keymap' now considers the symbol at point. +If the symbol at point is a keymap, 'describe-keymap' suggests it as +the default candidate. + +--- +*** 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 q'. + +** Emacs 29.1 comes with Org v9.6. +See the file ORG-NEWS for user-visible changes in Org. + +** Outline Mode + ++++ +*** Support for customizing the default visibility state of headings. +Customize the user option 'outline-default-state' to define what +headings will be visible after Outline mode is turned on. When equal +to 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. + +** Outline Minor Mode + ++++ +*** New user option 'outline-minor-mode-use-buttons'. +If non-nil, Outline Minor Mode will use buttons to hide/show outlines +in addition to the ellipsis. The default is nil, but in 'help-mode' +it has the value 'insert' that inserts the buttons directly to the +buffer where you can use 'RET' to cycle outline visibility. When +the value is 'in-margins', Outline Minor Mode uses the window margins +to hide/show outlines. + +** Windows + ++++ +*** 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 on the 'C-x w' prefix. + ++++ +*** New user option 'display-buffer-avoid-small-windows'. +If non-nil, this should be a window height, a number. Windows smaller +than this will be avoided by 'display-buffer', if possible. + ++++ +*** New display action 'display-buffer-full-frame'. +This action removes other windows on the frame when displaying a +buffer. + ++++ +*** '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' in combination with 'body-lines'. + +--- +*** You can customize which window 'scroll-other-window' operates on. +This is controlled by the new 'other-window-scroll-default' user option. + +** Frames + ++++ +*** 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. + +** Tab Bars and Tab Lines + +--- +*** 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. + +--- +*** 'C-x t RET' creates a new tab when the provided tab name doesn't exist. + +--- +*** 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. + +--- +** Better detection of text suspiciously reordered on display. +The function 'bidi-find-overridden-directionality' has been extended +to detect reordering effects produced by embeddings and isolates +(started by directional formatting control characters such as RLO and +LRI). The new command 'highlight-confusing-reorderings' finds and +highlights segments of buffer text whose reordering for display is +suspicious and could be malicious. + +** Emacs server and client changes + ++++ +*** New command-line option '-r'/'--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. + ++++ +*** 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. + ++++ +*** '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 given by the argument, which can be +'empty', 'delete-frame' or 'kill-terminal'. + +** Rcirc + ++++ +*** New command 'rcirc-when'. + ++++ +*** New user option 'rcirc-cycle-completion-flag'. +Rcirc will use 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. + ++++ +*** 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: + + (setq 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 + +--- +*** 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 bold. + +** Imenu + ++++ +*** 'imenu' is now bound to 'M-g i' globally. + +--- +*** 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. + ++++ +** 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. + +* Editing Changes in Emacs 29.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'. + +--- +** '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 +'case-fold-search' value. + +--- +** '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 a customizations in that other window. These +functions now check whether they have been rebound in the buffer 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. + +--- +** Indentation of 'cl-flet' and 'cl-labels' has changed. +These forms now indent like this: + + (cl-flet ((bla (x) + (* x x))) + (bla 42)) + +This change also affects 'cl-macrolet', 'cl-flet*' and +'cl-symbol-macrolet'. + ++++ +** New user option 'translate-upper-case-key-bindings'. +Set this option to nil to inhibit translating upper case keys to lower +case keys. + ++++ +** New command 'ensure-empty-lines'. +This command increases (or decreases) the number of empty lines before +point. + +--- +** Improved mouse behavior with auto-scrolling modes. +When clicking inside the 'scroll-margin' or 'hscroll-margin' region, +point is now moved only when releasing the mouse button. This no +longer results in a bogus selection, unless the mouse has been +effectively dragged. + ++++ +** 'kill-ring-max' now defaults to 120. + +--- +** New user option 'yank-menu-max-items'. +Customize this option to limit the number of entries in the menu +"Edit->Paste from Kill Menu". The default is 60. + ++++ +** Performing a pinch gesture on a touchpad now increases the text scale. + +** show-paren-mode + ++++ +*** New user option 'show-paren-context-when-offscreen'. +When non-nil, if the point is in a closing delimiter and the opening +delimiter is offscreen, shows some context around the opening +delimiter in the echo area. The default is nil. + +May 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. + +** Comint + ++++ +*** '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. + +--- +*** 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 past behavior. + +--- +*** 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. + +** Mwheel + +--- +*** New user options for alternate wheel events. +The options 'mouse-wheel-down-alternate-event', +'mouse-wheel-up-alternate-event', '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. + +** Internationalization changes + +*** The <Delete> function key now allows deleting the entire composed sequence. +For the details, see the item about the 'delete-forward-char' command +above. + +*** 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 sequence. + +--- +*** 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 + +--- +*** 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. + +--- +*** 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. + +--- +*** New Ukrainian translation of the Emacs Tutorial. + +--- +*** 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'. + +--- +*** New tamil99 input method for the Tamil language. +This supports the keyboard layout specifically designed for the Tamil +language. + +--- +*** New input method 'slovak-qwerty'. +This is a variant of the 'slovak' input method, which corresponds to +the QWERTY Slovak keyboards. + + +* Changes in Specialized Modes and Packages in Emacs 29.1 + +** Ecomplete + +--- +*** New commands 'ecomplete-edit' and 'ecomplete-remove'. +These allow you to (respectively) edit and bulk-remove entries from +the ecomplete database. + +--- +*** New user option 'ecomplete-auto-select'. +If non-nil and there's only one matching option, auto-select that. + +--- +*** New user option 'ecomplete-filter-regexp'. +If non-nil, this user option describes what entries not to add to the +database stored on disk. + +** Auth-Source + ++++ +*** 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. + +** Dired + ++++ +*** '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. + +--- +*** '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'. + ++++ +*** 'dired-do-relsymlink' moved from dired-x to dired. +The corresponding key 'Y' is now bound by default in Dired. + ++++ +*** 'dired-do-relsymlink-regexp' moved from dired-x to dired. +The corresponding key '% Y' is now bound by default in Dired. + +--- +*** 'M-G' is now bound to 'dired-goto-subdir'. +Before, that binding was only available if the dired-x package was +loaded. + ++++ +*** '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)) + +--- +*** New command 'dired-do-eww'. +This command visits the file on the current line with EWW. + +** Elisp + +--- +*** 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. + +--- +*** 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. + +** Games + +--- +*** New user option 'tetris-allow-repetitions'. +This controls how randomness is implemented (whether to use pure +randomness as before or whether to use a bag). + +** Battery + ++++ +*** New user option 'battery-update-functions'. +This can be used to trigger actions based on the battery status. + +** Enriched Mode + ++++ +*** New command 'enriched-toggle-markup'. +This allows you to see the markup in 'enriched-mode' buffers (e.g., +the "HELLO" file). + +** Shell Script Mode + +--- +*** New user option 'sh-indent-statement-after-and'. +This controls how statements like the following are indented: + + foo && + bar + +*** New Flymake backend using the ShellCheck program. +It is enabled by default, but requires that the external "shellcheck" +command is installed. + +** CC Mode + +--- +*** C++ Mode now supports most of the new features in the C++20 standard. + +** Cperl Mode + +--- +*** 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. + +** Gud + +--- +*** 'gud-go' is now bound to 'C-c C-v'. +If given a prefix, it will query the user for an argument to use for +the run/continue command. + +--- +*** '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. + +** Customize + +--- +*** New command 'custom-toggle-hide-all-widgets'. +This is bound to 'H' and toggles whether to hide or show the widget +contents. + +** Diff mode + +--- +*** 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 from previous Emacs versions. + ++++ +*** New user option 'diff-add-log-use-relative-names'. +If non-nil insert file names in ChangeLog skeletons relative to the +VC root directory. + +** Ispell + +--- +*** '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'. + +** Dabbrev + +--- +*** New function 'dabbrev-capf' for use on 'completion-at-point-functions'. + ++++ +*** 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'. + +** Package + ++++ +*** New command 'package-update'. +This command allows you to upgrade packages without using 'M-x +list-packages'. + ++++ +*** New command 'package-update-all'. +This command allows updating all packages without any queries. + ++++ +*** 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). + ++++ +*** 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. + ++++ +*** New command 'package-vc-install'. +Packages can now be installed directly from source by cloning from a +repository. + ++++ +*** 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. + ++++ +*** New command 'package-vc-checkout'. +Used to fetch the source of a package by cloning a repository without +activating the package. + ++++ +*** New command 'package-vc-prepare-patch'. +This command allows you to send patches to package maintainers, for +packages checked out using 'package-vc-install'. + ++++ +*** New command 'package-report-bug'. +This command helps you compose an email for sending bug reports to +package maintainers. + ++++ +*** New user option 'package-vc-selected-packages'. +By customizing this user option you can specify specific packages to +install. + +** Emacs Sessions (Desktop) + ++++ +*** 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. + +** Miscellaneous + ++++ +*** 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. + +** Debugging + +--- +*** '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. + ++++ +*** 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. + ++++ +*** '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. + ++++ +*** '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. + ++++ +*** 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. + +** Compile + ++++ +*** New user option 'compilation-hidden-output'. +This can be used to make specific parts of compilation output +invisible. + ++++ +*** 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). + ++++ +*** New user option 'compilation-max-output-line-length'. +Lines longer than this will have the ends hidden, with a button to +reveal the hidden text. This speeds up operations like grepping on +files that have few newlines. + +** Flymake + ++++ +*** New user option 'flymake-mode-line-lighter'. + ++++ +** 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'. + +--- +** New mode, 'emacs-news-mode', for editing the NEWS file. +This mode adds some highlighting, fixes the 'M-q' command, and has +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. + +--- +** 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). + +--- +** savehist.el can now truncate variables that are too long. +An element of '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. + +** Minibuffer and Completions + ++++ +*** 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. + ++++ +*** 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. + +--- +*** New user option 'completion-auto-wrap'. +When non-nil, the commands 'next-completion', 'previous-completion', +'next-line-completion' and 'previous-line-completion' automatically +wrap around on reaching the beginning or the end of the "*Completions*" +buffer. + ++++ +*** 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. + +*** 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. + ++++ +*** User option 'minibuffer-eldef-shorten-default' is now obsolete. +Customize the user option 'minibuffer-default-prompt-format' instead. + ++++ +*** 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. + ++++ +*** New user option 'completions-max-height'. +This option limits the height of the "*Completions*" buffer. + ++++ +*** New user option 'completions-header-format'. +This is a string to control the heading 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 heading line is not shown. + ++++ +*** 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. + ++++ +*** 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 to the minibuffer, +but doesn't exit the minibuffer. + ++++ +*** You can now define abbrevs for the fundamental minibuffer modes. +'minibuffer-mode-abbrev-table' and +'minibuffer-inactive-mode-abbrev-table' are now defined. + +** Isearch and Replace + ++++ +*** 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. + ++++ +*** 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. + ++++ +*** New user option 'char-fold-override'. +Non-nil means that the default definitions of equivalent characters +are overridden. + +*** New command 'describe-char-fold-equivalences'. +It displays character equivalences used by 'char-fold-to-regexp'. + ++++ +*** 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. + +** Glyphless characters + ++++ +*** New minor mode 'glyphless-display-mode'. +This allows an easy way to toggle seeing all glyphless characters in +the current buffer. + +--- +*** 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. + ++++ +*** "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. + +** Registers + ++++ +*** 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*")) + +** Pixel-fill + ++++ +*** This is a new package that deals with filling variable-pitch text. + ++++ +*** New function 'pixel-fill-region'. +This fills the region to be no wider than a specified pixel width. + +** Info + ++++ +*** 'M-x info-apropos' now takes a prefix argument to search for regexps. + +--- +*** 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. + +** Shortdoc + +--- +*** New command 'shortdoc-copy-function-as-kill' bound to 'w'. +It copies the name of the function near point into the kill ring. + +--- +*** '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'. + +** VC + +--- +*** New command 'vc-pull-and-push'. +This commands first does a "pull" command, and if that is successful, +do a "push" command afterwards. + ++++ +*** '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. + ++++ +*** New command '%' ('vc-dir-mark-by-regexp'). +This command marks files based on a regexp. If given a prefix +argument, unmark instead. + ++++ +*** 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. + +--- +*** '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, e.g. 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. + +--- +*** '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'. + +--- +*** Log Edit now font locks 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'. + +--- +*** New 'log-edit-headers-separator' face. +It is used to style the line that separates the 'log-edit' headers +from the 'log-edit' summary. + +--- +*** 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'. + +--- +*** New function 'vc-read-multiple-revisions'. +This function invokes 'vc-read-revision' with a non-nil value for +MULTIPLE. + ++++ +*** 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'. + +** Message + +--- +*** New user option 'mml-attach-file-at-the-end'. +If non-nil, 'C-c C-a' will put attached files at the end of the message. + +--- +*** Message Mode now supports image yanking. + ++++ +*** New user option 'message-server-alist'. +This controls automatic insertion of the "X-Message-SMTP-Method" +header before sending a message. + +** HTML Mode + +--- +*** HTML Mode now supports "text/html" and "image/*" yanking. + +** Texinfo Mode + +--- +*** 'texinfo-mode' now has a specialized 'narrow-to-defun' definition. +It narrows to the current node. + +** EUDC + ++++ +*** 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. + ++++ +*** 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"). + ++++ +*** 'eudc-expansion-overwrites-query' to 'eudc-expansion-save-query-as-kill'. +'eudc-expansion-overwrites-query' is renamed to +'eudc-expansion-save-query-as-kill' to reflect the actual behavior of +the user option. + ++++ +*** 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. + ++++ +*** 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 to produce 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. + ++++ +*** 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'. + ++++ +*** 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. + ++++ +*** 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. + ++++ +*** New back-end for mailabbrev. +A new back-end for mailabbrev allows information from that database to +be queried by EUDC, too. The attributes 'email', 'name', and 'firstname' +are supported only. + +** EWW/SHR + ++++ +*** New user option to automatically rename EWW buffers. +The 'eww-auto-rename-buffer' user option can be configured to rename +rendered web pages by using their title, URL, or a user-defined +function which returns a string. For the first two cases, the length +of the resulting name is controlled by 'eww-buffer-name-length'. By +default, no automatic renaming is performed. + ++++ +*** New user option 'shr-allowed-images'. +This complements 'shr-blocked-images', but allows specifying just the +allowed images. + ++++ +*** 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. + ++++ +*** 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. + +** Find-Dired + +--- +*** 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. + +** Gnus + ++++ +*** 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. + +--- +*** '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. + +--- +*** 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) + +--- +*** The default value of 'gnus-treat-fold-headers' is now 'head'. + +--- +*** New face 'gnus-header'. +All other 'gnus-header-*' faces inherit from this face now. + ++++ +*** 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. + ++++ +*** New command 'gnus-article-emojize-symbols'. +This is bound to 'W D e' and will display symbols that have emoji +representation as emojis. + ++++ +*** New mu backend for gnus-search. +Configuration is very similar to the notmuch and namazu backends. It +supports the unified search syntax. + +--- +*** '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. + +** Rmail + +--- +*** 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. + +--- +*** 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. + +** EIEIO + ++++ +*** 'slot-value' can now be used to access slots of 'cl-defstruct' objects. + +** Align + +--- +*** Alignment in 'text-mode' has changed. +Previously, 'M-x align' didn't do anything, and you had to say 'C-u +M-x align' for it to work. This has now been changed. The default +regexp for 'C-u M-x align-regexp' has also been changed to be easier +for inexperienced users to use. + +** Help + +--- +*** 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. + +--- +*** 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'). + +** Info-look + +--- +*** info-look specs can now be expanded at run time instead of a load time. +The new ':doc-spec-function' element can be used to compute the +':doc-spec' element when the user asks for info on that particular +mode (instead of at load time). + +** Ansi-color + +--- +*** Support for ANSI 256-color and 24-bit colors. +256-color and 24-bit color codes are now handled by ANSI color +filters and displayed with the specified color. + +** Term-mode + +--- +*** 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. + +--- +*** 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. + +** Project + ++++ +*** '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". + ++++ +*** New command 'project-list-buffers' bound to 'C-x p C-b'. +This command displays a list of buffers from the current project. + ++++ +*** '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. + +*** 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'. + +** Xref + ++++ +*** New command 'xref-go-forward'. +It is bound to 'C-M-,' and jumps to the location where 'xref-go-back' +('M-,', also known as 'xref-pop-marker-stack') was invoked previously. + ++++ +*** '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. + ++++ +*** New command 'xref-find-references-and-replace' to rename one identifier. + +--- +*** New variable 'xref-current-item' (renamed from a private version). + +--- +*** New function 'xref-show-xrefs'. + +** File notifications + ++++ +*** The new command 'file-notify-rm-all-watches' removes all file notifications. + +** Sql + +--- +*** Sql now supports sending of passwords in-process. +To improve security, if an sql product has ':password-in-comint' set +to t, a password supplied via the minibuffer will be sent in-process, +as opposed to via the command-line. + +** Image Mode + ++++ +*** New command 'image-transform-fit-to-window'. +This command fits the image to the current window by scaling down or +up as necessary. Unlike 'image-transform-fit-both', this does not +only scale the image down, but up as well. It is bound to 's w' in +Image Mode by default. + +--- +*** New command 'image-mode-wallpaper-set'. +This command sets the desktop background to the current image. It is +bound to 'W' by default. + ++++ +*** 'image-transform-fit-to-{height,width}' are now obsolete. +Use the new command 'image-transform-fit-to-window' instead. +The keybinding for 'image-transform-fit-to-width' is now 's i'. + +--- +*** User option 'image-auto-resize' can now be set to 'fit-window'. +This works like 'image-transform-fit-to-window'. + +--- +*** New user option 'image-auto-resize-max-scale-percent'. +The new 'fit-window' option will never scale an image more than this +much (in percent). It is nil by default, which means no limit. + +--- +*** New user option 'image-text-based-formats'. +This controls whether or not to show a message when opening certain +image formats saying how to edit it as text. The default is to show +this message for SVG and XPM. + ++++ +*** 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. + ++++ +*** New command 'image-transform-set-percent'. +It allows setting the image size to a percentage of its original size, +and is bound to 's p' in Image mode. + ++++ +*** 'image-transform-original' renamed to 'image-transform-reset-to-original'. +The old name was confusing, and is now an obsolete function alias. + ++++ +*** 'image-transform-reset' renamed to 'image-transform-reset-to-initial'. +The old name was confusing, and is now an obsolete function alias. + +** Images + ++++ +*** Users can now add special image conversion functions. +This is done via 'image-converter-add-handler'. + +** Image-Dired + ++++ +*** '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. + +--- +*** 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' + +--- +*** 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. + +--- +*** 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. + +--- +*** 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. + +--- +*** 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. + +--- +*** '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. + +--- +*** 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. + +--- +*** 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. + +--- +*** 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. + +--- +*** 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") + +--- +*** 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' + +--- +*** 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. + +--- +*** Support GraphicsMagick command line tools. +Support for the GraphicsMagick command line tool ("gm") has been +added, and is used instead of ImageMagick when it is available. + +--- +*** 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. + +--- +*** Reduce dependency on external "exiftool" command. +The 'image-dired-copy-with-exif-file-name' no longer requires an +external "exiftool" command to be available. The user options +'image-dired-cmd-read-exif-data-program' and +'image-dired-cmd-read-exif-data-options' are now obsolete. + +--- +*** 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. + +--- +*** 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. + ++++ +*** '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. + +--- +*** 'image-dired-thumb-size' increased to 128. + ++++ +*** 'image-dired-db-file' renamed to 'image-dired-tags-db-file'. + +--- +*** 'image-dired-display-image-mode' renamed to 'image-dired-image-mode'. +The corresponding keymap is now named 'image-dired-image-mode-map'. + ++++ +*** 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. + +--- +*** 'image-dired-thumb-{height,width}' are now obsolete. +Customize 'image-dired-thumb-size' instead, which will set both the +height and width. + +--- +*** 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'. + +--- +*** '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. + ++++ +*** 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'. + +** Dired + +--- +*** 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. + ++++ +*** 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. + ++++ +*** 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: + + (setq dired-free-space 'separate) + +--- +*** 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. + +--- +*** 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). + +** Bookmarks + +--- +*** 'list-bookmarks' now includes a type column. +Types are registered via a 'bookmark-handler-type' symbol property on +the jumping function. + ++++ +*** 'bookmark-sort-flag' can now be set to 'last-modified'. +This will display bookmark list from most recently set to least +recently set. + +--- +*** When editing a bookmark annotation, 'C-c C-k' will now cancel. +It is bound to the new command 'bookmark-edit-annotation-cancel'. + +--- +*** 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). + +** Exif + +--- +*** New function 'exif-field'. +This is a convenience function to extract the field data from +'exif-parse-file' and 'exif-parse-buffer'. + +** Xwidgets + +--- +*** New user option 'xwidget-webkit-buffer-name-format'. +This option controls how xwidget-webkit buffers are named. + +--- +*** 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. + ++++ +*** 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. + ++++ +*** 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'. + ++++ +*** 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. + +--- +*** On X, the WebKit inspector is now available inside xwidgets. +To access the inspector, right click on the widget and select "Inspect +Element". + +--- +*** "Open in New Window" in a WebKit widget's context menu now works. +The newly created buffer will be displayed via 'display-buffer', which +can be customized through the usual mechanism of 'display-buffer-alist' +and friends. + +** Tramp + ++++ +*** New connection methods "docker", "podman" and "kubernetes". +They allow accessing environments provided by Docker and similar +programs. + +--- +*** 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:~". + ++++ +*** 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. + ++++ +*** 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. + ++++ +*** 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. + +** Browse URL + +--- +*** 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. + +--- +*** New user option 'browse-url-irc-function'. +This option specifies a function for opening "irc://" links. It +defaults to the new function 'browse-url-irc'. + +--- +*** New function 'browse-url-irc'. +This multipurpose autoloaded function can be used for opening "irc://" +and "ircs://" URLS by any caller that passes a URL string as an initial +arg. + +--- +*** 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. + +--- +*** 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. + +--- +*** Support for the Mozilla web browser is now obsolete. +Note that this historical web browser is different from Mozilla +Firefox; it is its predecessor. + +** Python Mode + ++++ +*** 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. + +** Ruby Mode + +--- +*** New user option 'ruby-toggle-block-space-before-parameters'. + +** Eshell + ++++ +*** 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) Input/Output". + ++++ +*** 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. + ++++ +*** 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. + ++++ +*** 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'. + ++++ +*** 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. + ++++ +*** 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. + ++++ +*** 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. + +--- +*** 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. + +--- +*** 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). + ++++ +*** 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. + +** Shell + +--- +*** New user option 'shell-kill-buffer-on-exit'. +Enabling this will automatically kill a "*shell*" buffer as soon as +the shell session terminates. + +--- +*** 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. + +** Calc + ++++ +*** New user option 'calc-kill-line-numbering'. +Set it to nil to exclude line numbering from kills and copies. + +** Hierarchy + ++++ +*** 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. + +** Proced + +--- +*** 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. + +--- +*** 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. + +** Miscellaneous + +--- +*** 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. + ++++ +*** New user option 'font-lock-ignore'. +This option provides a mechanism to selectively disable font-lock +keyword-driven fontifications. + +--- +*** 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. + +--- +*** 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. + ++++ +*** 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. + +--- +*** 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. + +*** 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. + ++++ +*** 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. + +--- +*** '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. + +--- +*** New command 'recentf-open'. +This command prompts for a recently opened file in the minibuffer, and +visits it. + +--- +*** '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. + +--- +*** The 'run-dig' command is now obsolete; use 'dig' instead. + +--- +*** 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' + +--- +*** 'outlineify-sticky' command is renamed to 'allout-outlinify-sticky'. +The old name is still available as an obsolete function alias. + +--- +*** The url-irc library now understands "ircs://" links. + +--- +*** New command 'world-clock-copy-time-as-kill' for 'M-x world-clock'. +It copies the current line into the kill ring. + +--- +*** 'edit-abbrevs' now uses font-locking. +The new face 'abbrev-table-name' is used to display the abbrev table +name. + +--- +*** New key binding 'O' in 'M-x list-buffers'. +This key is now bound to 'Buffer-menu-view-other-window', which will +view this line's buffer in View mode in another window. + + +* New Modes and Packages in Emacs 29.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). + ++++ +*** use-package: Declarative package configuration. +use-package is 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. + ++++ +** 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. + +--- +** 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'. + ++++ +** New package 'oclosure'. +Allows the creation of "functions with slots" or "function objects" +via the macros 'oclosure-define' and 'oclosure-lambda'. + ++++ +*** 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. + +--- +** New theme 'leuven-dark'. +This is a dark version of the 'leuven' theme. + ++++ +** 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. + +--- +** New major mode 'js-json-mode'. +This is a lightweight variant of 'js-mode' that is used by default +when visiting JSON files. + +** New major mode 'typescript-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the TypeScript language. It includes support for font-locking, +indentation, and navigation. This mode will be auto-enabled for +files with the ".ts" extension. + +** 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. It includes +support for font-locking, indentation, and navigation. This mode +will be auto-enabled for files with the ".tsx" extension. + +** New major mode 'c-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the C language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'c++-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the C++ language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'java-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the Java language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'python-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the Python language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'css-ts-mode'. +A major mode based on the tree-sitter library for editing CSS +(Cascading Style Sheets). It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'json-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the JSON language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'csharp-ts-mode'. +A major mode based on the tree-sitter library for editing programs +in the C# language. It includes support for font-locking, +indentation, Imenu, which-func, and navigation. + +** New major mode 'csharp-mode'. +A major mode based on CC Mode for editing programs in the C# language. + +** New major mode 'bash-ts-mode'. +A major mode based on the tree-sitter library for editing Bash shell +scripts. It includes support for font-locking, indentation, Imenu, +which-func, and navigation. + + +* Incompatible Lisp Changes in Emacs 29.1 + ++++ +** '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. + ++++ +** New function 'substitute-quotes'. +This function works like 'substitute-command-keys' but only +substitutes quote characters. + +--- +** '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.) + ++++ +** Changes to "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'. + ++++ +** "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 "loaddef.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 +normal. + +--- +** 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. + ++++ +** '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. + +--- +** '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. + +--- +** '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". + ++++ +** Remapping 'mode-line' 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'. + ++++ +** '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'. + +--- +** 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. + +** Fonts + +--- +*** 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 previously specified +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. + +--- +** Keymap descriptions have changed. +'help--describe-command', 'C-h b' and associated functions that output +keymap descriptions have changed. In particular, prefix commands are +not output at all, and instead of "??" for closures/functions, +"[closure]"/"[lambda]" is output. + +--- +** 'downcase' details have changed slightly. +In certain locales, changing the case of an ASCII-range character may +turn it into a multibyte character, most notably with "I" in Turkish +(the lowercase is "ı", 0x0131). Previously, 'downcase' on a unibyte +string was buggy, and would mistakenly just return the lower byte of +this, 0x31 (the digit "1"). 'downcase' on a unibyte string has now +been changed to downcase such characters as if they were ASCII. To +get proper locale-dependent downcasing, the string has to be converted +to multibyte first. (This goes for the other case-changing functions, +too.) + +--- +** 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. + +--- +** 'def' indentation changes. +In 'emacs-lisp-mode', forms with a symbol with a name that start with +"def" have been automatically indented as if they were 'defun'-like +forms, for instance: + + (defzot 1 + 2 3) + +This heuristic has now been removed, and all functions/macros that +want to be indented this way have to be marked with + + (declare (indent defun)) + +or the like. If the function/macro definition itself can't be +changed, the indentation can also be adjusted by saying something +like: + + (put 'defzot 'lisp-indent-function 'defun) + +--- +** The 'inhibit-changing-match-data' variable is now obsolete. +Instead, functions like 'string-match' and 'looking-at' now take an +optional INHIBIT-MODIFY argument. + +--- +** 'gnus-define-keys' is now obsolete. +Use 'define-keymap' instead. + +--- +** MozRepl has been removed from js.el. +MozRepl was removed from Firefox in 2017, so this code doesn't work +with recent versions of Firefox. + +--- +** The function 'image-dired-get-exif-data' is now obsolete. +Use 'exif-parse-file' and 'exif-field' instead. + +--- +** 'insert-directory' alternatives should not change the free disk space line. +This change is now applied in 'dired-insert-directory'. + +--- +** 'compilation-last-buffer' is (finally) declared obsolete. +It's been obsolete since Emacs-22.1, actually. + +--- +** 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. + +--- +** 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', '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-function', +'mail-completion-at-point-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'. + +--- +** 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'. + +--- +** 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'. + ++++ +** New generic function 'function-documentation'. +Can dynamically generate a raw docstring depending on the type of +a function. +Used mainly for docstrings of OClosures. + ++++ +** 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 encoded text. + ++++ +** 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. + +--- +** '?\' at the end of a line now signals an error. +Previously, it produced a nonsense value, -1, that was never intended. + +--- +** 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. + ++++ +** 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'. + + +* Lisp Changes in Emacs 29.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 'read'able because +of an un'read'able value in an unrelated lexical variable. + ++++ +** 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. + ++++ +** New macro 'while-let'. +This is like 'when-let', but repeats until a binding form is nil. + ++++ +** 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. + ++++ +** 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). + ++++ +** 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. + +--- +** '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. + ++++ +** New 'declare' form 'interactive-args'. +This can be used to specify what forms to put into 'command-history' +when executing commands interactively. + ++++ +** The FORM arg 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. + ++++ +** 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. + ++++ +** 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'. + +** Connection-local variables + ++++ +*** 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. + ++++ +*** New function 'connection-local-update-profile-variables'. +This function allows to modify the settings of an existing +connection-local profile. + ++++ +*** New macro 'with-connection-local-application-variables'. +This macro works like 'with-connection-local-variables', but it allows +to use another application but 'tramp'. This is useful when running +code in a buffer where Tramp has already set some connection-local +variables. + ++++ +*** 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. + ++++ +** 'plist-get', 'plist-put' and 'plist-member' are no longer limited to 'eq'. +These function now take an optional comparison predicate argument. + ++++ +** 'read-multiple-choice' can now use long-form answers. + ++++ +** 'M-c' in 'read-regexp' now toggles case folding. + ++++ +** 'completing-read' now allows a function as its REQUIRE-MATCH argument. +This function is called to see whether what the user has typed in is a +match. This is also available from functions that call +'completing-read', like 'read-file-name'. + ++++ +** 'posn-col-row' can now give position data based on windows. +Previously, it reported data only based on the frame. + ++++ +** 'file-expand-wildcards' can now also take a regexp as PATTERN argument. + +--- +** vc-mtn (the backend for Monotone) has been made obsolete. + ++++ +** 'gui-set-selection' can now 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. + +--- +** 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'. + ++++ +** '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. + ++++ +** New function 'string-equal-ignore-case'. +This compares strings ignoring case differences. + +** '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. + ++++ +** New macro 'with-memoization' provides a very primitive form of memoization. + ++++ +** '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. + +** seq + ++++ +** New function 'seq-split'. +This returns a list of sub-sequences of the specified sequence. + ++++ +** New function 'seq-remove-at-position'. +This function returns a copy of the specified sequence where the +element at a given (zero-based) index got removed. + ++++ +** New function 'seq-positions'. +This returns a list of the (zero-based) indices of elements matching a +given predicate in the specified sequence. + ++++ +** New function 'seq-keep'. +This is like 'seq-map', but removes all nil results from the returned +list. + +** Themes + +--- +*** New hooks 'enable-theme-functions' and 'disable-theme-functions'. +These are run after enabling and disabling a theme, respectively. + +--- +*** Themes can now be made obsolete. +Using 'make-obsolete' on a theme is now supported. This will make +'load-theme' issue a warning when loading the theme. + ++++ +** New hook 'display-monitors-changed-functions'. +It is called whenever the configuration of different monitors on a +display changes. + ++++ +** 'prin1' and 'prin1-to-string' now take an optional OVERRIDES parameter. +This parameter can be used to override values of print-related settings. + ++++ +** New minor mode 'header-line-indent-mode'. +This is meant to be used in modes that have a header line that should +be kept aligned with the buffer contents when the user switches +'display-line-numbers-mode' on or off. + ++++ +** New minor mode 'lost-selection-mode'. +This minor mode makes Emacs deactivate the mark in all buffers when +the primary selection is obtained by another program. + +--- +** 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. + ++++ +** New predicate 'char-uppercase-p'. +This returns non-nil if its argument its an uppercase character. + +** Byte compilation + +--- +*** 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 seems +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 +"\=". + +--- +*** Byte compilation will now warn about some malformed 'defcustom' types. +It's 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. + ++++ +** '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. + +--- +** 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. + ++++ +** 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. + +--- +** 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. + +--- +** 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. + +--- +** 'x-show-tip' no longer hard-codes a timeout default. +The new 'x-show-tooltip-timeout' variable allows the user to alter +this for packages that don't use 'tooltip-show', but instead call the +lower level function directly. + +--- +** New function 'current-cpu-time'. +It gives access to the CPU time used by the Emacs process, for +example for benchmarking purposes. + +--- +** New function 'string-edit'. +This is meant to be used when the user has to edit a (potentially) +long string. It pops you to a new buffer where you can edit the +string, and a callback is called when the user types 'C-c C-c'. + ++++ +** New function 'read-string-from-buffer'. +This is a modal version of 'string-edit', and can be used as an +alternative to 'read-string'. + ++++ +** 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. + ++++ +** 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). + ++++ +** New function 'flush-standard-output'. +This enables you to display incomplete lines from batch-based Emacs +scripts. + ++++ +** New convenience function 'buttonize-region'. +This works like 'buttonize', but for a region instead of a string. + ++++ +** 'macroexp-let2*' can omit TEST arg and use single-var bindings. + ++++ +** New macro-writing macros, 'cl-with-gensyms' and 'cl-once-only'. +See the "(cl) Macro-Writing Macros" manual section for descriptions. + ++++ +** 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. + ++++ +** 'track-mouse' can be 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. + ++++ +** 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. + +--- +** 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. + ++++ +** 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. + ++++ +** 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. + ++++ +** New variable 'messages-buffer-name'. +This variable (defaulting to "*Messages*") allows packages to override +where messages are logged. + ++++ +** New function 'readablep'. +This function says whether an object can be written out and then +read back by the Emacs Lisp reader. + ++++ +** New variable 'print-unreadable-function'. +This variable allows changing how Emacs prints unreadable objects. + +--- +** 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. + +--- +** New function 'bidi-string-strip-control-characters'. +This utility function is meant for displaying strings when it's +essential that there's no bidirectional context. + +--- +** The Gnus range functions have been moved to a new library, range.el. +All the old names have been made obsolete. + ++++ +** New function 'function-alias-p'. +This predicate says whether an object is a function alias, and if it +is, the alias chain is returned. + ++++ +** New variable 'lisp-directory' holds the directory of Emacs's own Lisp files. + ++++ +** 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. + ++++ +** New function 'get-display-property'. +This is like 'get-text-property', but works on the 'display' text +property. + ++++ +** New function 'add-display-text-property'. +This is like 'put-text-property', but works on the 'display' text +property. + ++++ +** New 'min-width' 'display' property. +This allows setting a minimum display width for a region of text. + ++++ +** 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. + ++++ +** 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. + ++++ +** 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. + ++++ +** 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. + +--- +** New hook 'post-select-region-hook'. +This hook is run immediately after 'select-active-regions' causes the +region to be set as the primary selection. + ++++ +** 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 combined with a condition like +'(and "\\`\\*.+\\*\\'" (major-mode . special-mode))'. + ++++ +** New function 'match-buffers'. +Use 'buffer-match-p' to gather a list of buffers that match a +condition. + +--- +** 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. + +** Text security and suspiciousness + ++++ +*** 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 contain bidirectional (or other) formatting characters that +may be used to confuse a user. + ++++ +*** 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 aren't +performed. + ++++ +*** 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. + +** Keymaps and key definitions + ++++ +*** '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'. + ++++ +*** New functions for defining and manipulating keystrokes. +These all take the syntax defined by 'key-valid-p'. None of the older +functions have been deprecated or altered, but they are now +de-emphasized in the documentation. + ++++ +*** Use 'keymap-set' instead of 'define-key'. + ++++ +*** Use 'keymap-global-set' instead of 'global-set-key'. + ++++ +*** Use 'keymap-local-set' instead of 'local-set-key'. + ++++ +*** Use 'keymap-global-unset' instead of 'global-unset-key'. + ++++ +*** Use 'keymap-local-unset' instead of 'local-unset-key'. + ++++ +*** Use 'keymap-substitute' instead of 'substitute-key-definition'. + ++++ +*** Use 'keymap-set-after' instead of 'define-key-after'. + ++++ +*** Use 'keymap-lookup' instead of 'lookup-keymap' and 'key-binding'. + ++++ +*** Use 'keymap-local-lookup' instead of 'local-key-binding'. + ++++ +*** Use 'keymap-global-lookup' instead of 'global-key-binding'. + ++++ +*** '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). + ++++ +*** 'read-multiple-choice' now takes an optional SHOW-HELP argument. +If non-nil, show the help buffer immediately, before any user input. + ++++ +*** 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. + +--- +*** New function 'key-parse'. +This is like 'kbd', but only returns vectors instead of a mix of +vectors and strings. + ++++ +*** 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. + ++++ +** 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'. + ++++ +** New function 'file-name-split'. +This returns a list of all the components of a file name. + ++++ +** New function 'file-name-parent-directory'. +This returns the parent directory of a file name. + ++++ +** New macro 'with-undo-amalgamate'. +It records a particular sequence of operations as a single undo step. + ++++ +** 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. + ++++ +** 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. + ++++ +** New variable 'yank-transform-functions'. +This variable allows the user to alter the string to be inserted. + +--- +** New command 'yank-in-context'. +This command tries to preserve string/comment syntax when yanking. + +--- +** 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. + ++++ +** New text property 'inhibit-isearch'. +If set, 'isearch' will skip these areas, which can be useful (for +instance) when covering huge amounts of data (that has no meaningful +searchable data, like image data) with a 'display' text property. + ++++ +** 'insert-image' now takes an INHIBIT-ISEARCH optional parameter. +It marks the image with the 'inhibit-isearch' text property, which +inhibits 'isearch' matching the STRING parameter. + +--- +** 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. + +--- +** 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. + +--- +** New user option 'pp-use-max-width'. +If non-nil, 'pp' will attempt to limit the line length when formatting +long lists and vectors. + +--- +** New function 'pp-emacs-lisp-code'. +'pp' formats general Lisp sexps. This function does much the same, +but applies formatting rules appropriate for Emacs Lisp code. + ++++ +** New function 'file-has-changed-p'. +This convenience function is useful when writing code that parses +files at run-time, and allows Lisp programs to re-parse files only +when they have changed. + ++++ +** 'abbreviate-file-name' now respects magic file name handlers. + +--- +** New function 'font-has-char-p'. +This can be used to check whether a specific font has a glyph for a +character. + ++++ +** '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. + ++++ +** '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. + ++++ +** '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. + ++++ +** '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. + +** XDG support + +--- +*** New function 'xdg-state-home'. +It returns the new 'XDG_STATE_HOME' 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 $XDG_DATA_HOME". +(This variable was introduced in the XDG Base Directory Specification +version 0.8 released on May 8, 2021.) + +--- +*** New function 'xdg-current-desktop'. +It returns a list of strings, corresponding to the colon-separated +list of names in the 'XDG_CURRENT_DESKTOP' environment variable, which +identify the current desktop environment. +(This variable was introduced in XDG Desktop Entry Specification +version 1.2.) + +--- +*** New function 'xdg-session-type'. +It returns the 'XDG_SESSION_TYPE' environment variable. (This is not +part of any official standard; see the man page pam_systemd(8) for +more information.) + ++++ +** New macro 'with-delayed-message'. +This macro is like 'progn', but will output the specified message if +the body takes longer to execute than the specified timeout. + +--- +** New function 'funcall-with-delayed-message'. +This function is like 'funcall', but will output the specified message +if the function takes longer to execute than the specified timeout. + +** Locale + +--- +*** New variable 'current-locale-environment'. +This holds the value of the previous call to 'set-locale-environment'. + +--- +*** New macro 'with-locale-environment'. +This macro can be used to change the locale temporarily while +executing code. + +** table.el + +--- +*** New user option 'table-latex-environment'. +This allows switching between "table" and "tabular". + +** Tabulated List Mode + ++++ +*** A column can now be set to an image descriptor. +The 'tabulated-list-entries' variable now supports using an image +descriptor, which means to insert an image in that column instead of +text. See the documentation string of that variable for details. + ++++ +** ':keys' in 'menu-item' can now be a function. +If so, it is called whenever the menu is computed, and can be used to +calculate the keys dynamically. + ++++ +** New major mode 'clean-mode'. +This is a new major mode meant for debugging. It kills absolutely all +local variables and removes overlays and text properties. + ++++ +** 'kill-all-local-variables' can now kill all local variables. +If given the new optional KILL-PERMANENT argument, also kill permanent +local variables. + ++++ +** Third 'mapconcat' argument SEPARATOR is now optional. +An explicit nil always meant the empty string, now it can be left out. + ++++ +** New function 'define-keymap'. +This function allows defining a number of keystrokes with one form. + ++++ +** New macro 'defvar-keymap'. +This macro allows defining keymap variables more conveniently. + +** '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 ...))' + +--- +** 'kbd' can now be used in built-in, preloaded libraries. +It no longer depends on edmacro.el and cl-lib.el. + ++++ +** New function 'image-at-point-p'. +This function returns t if point is on a valid image, and nil +otherwise. + ++++ +** New function 'buffer-text-pixel-size'. +This is similar to 'window-text-pixel-size', but can be used when the +buffer isn't displayed. + ++++ +** New function 'string-pixel-width'. +This returns the width of a string in pixels. This can be useful when +dealing with variable pitch fonts and glyphs that have widths that +aren't integer multiples of the default font. + ++++ +** New function 'string-glyph-split'. +This function splits a string into a list of strings representing +separate glyphs. This takes into account combining characters and +grapheme clusters. + +--- +** 'lookup-key' is more 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'. + +** xwidgets + ++++ +*** 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. + ++++ +*** New function 'xwidget-perform-lispy-event'. +This function allows you to send events to xwidgets. Usually, some +equivalent of the event will be sent, but there is no guarantee of +what the widget will actually receive. + +On GTK+, only key and function key events are implemented. + ++++ +*** New 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'. + ++++ +*** 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. + ++++ +*** New function 'xwidget-webkit-back-forward-list'. +This function returns the history of page-loads in a WebKit xwidget. + ++++ +*** New function 'xwidget-webkit-estimated-load-progress'. +This function returns the estimated progress of page loading in a +WebKit xwidget. + ++++ +*** New function 'xwidget-webkit-stop-loading'. +This function terminates all data transfer during page loads in a +WebKit xwidget. + ++++ +*** 'load-changed' xwidget events are now more detailed. +In particular, they can now have different arguments based on the +state of the WebKit widget. 'load-finished' is sent when a load has +completed, 'load-started' when a load first starts, 'load-redirected' +after a redirect, and 'load-committed' when the WebKit widget first +commits to the load. + ++++ +*** New event type 'xwidget-display-event'. +These events are sent whenever an xwidget requests that Emacs display +another xwidget. The only arguments to this event are the xwidget +that should be displayed, and the xwidget that asked to display it. + ++++ +*** 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. + +--- +** New variable 'help-buffer-under-preparation'. +This variable is bound to t during the preparation of a "*Help*" buffer. + ++++ +** 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. + ++++ +** '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))'. + ++++ +** 'date-to-time' now assumes earliest 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. + ++++ +** '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". + ++++ +** 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. + ++++ +** 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. + ++++ +** 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. + ++++ +** 'defalias' records a more precise history of definitions. +This is recorded in the 'function-history' symbol property. + +--- +** New hook 'save-place-after-find-file-hook'. +This is called at the end of 'save-place-find-file-hook'. + +--- +** 'indian-tml-base-table' no longer translates digits. +Use 'indian-tml-base-digits-table' if you want digits translation. + +--- +** 'indian-tml-itrans-v5-hash' no longer translates digits. +Use 'indian-tml-itrans-digits-v5-hash' if you want digits +translation. + ++++ +** 'shell-quote-argument' has a new optional parameter POSIX. +This is useful when quoting shell arguments for a remote shell +invocation. Such shells are POSIX conformant by default. + ++++ +** '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', e.g. '(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'. + ++++ +** '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'. + ++++ +** 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)) + ++++ +** 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. + +--- +** 'string-split' is now an alias for 'split-string'. + ++++ +** '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. + ++++ +** 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. + +** 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'. + + +* Changes in Emacs 29.1 on Non-Free Operating Systems + +** MS-Windows + +--- +*** 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))) + ++++ +*** 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. + +--- +*** 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. + ++++ +*** 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. + +** Cygwin + +--- +*** 'process-attributes' is now implemented. + + +---------------------------------------------------------------------- +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/>. + + +Local variables: +coding: utf-8 +mode: outline +mode: emacs-news +paragraph-separate: "[ ]" +end: diff --git a/etc/PROBLEMS b/etc/PROBLEMS index 2169ed0f80b..68f7cdb0560 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -1227,6 +1227,20 @@ you should use an Emacs input method instead. * X runtime problems +** X security problems + +*** Emacs faces trouble when running as an untrusted client. + +When Emacs is running as an untrusted client under X servers with the +Security extension, it is unable to use some window manager features +but reports them to the window manager anyway. This can lead to +constant prompting by the window manager about Emacs being +unresponsive. To resolve the problem, place: + + (setq x-detect-server-trust t) + +in your early-init.el. + ** X keyboard problems *** `x-focus-frame' fails to activate the frame. diff --git a/etc/refcards/ru-refcard.tex b/etc/refcards/ru-refcard.tex index 40af6414680..50a22891a6b 100644 --- a/etc/refcards/ru-refcard.tex +++ b/etc/refcards/ru-refcard.tex @@ -40,7 +40,7 @@ \newlength{\ColThreeWidth} \setlength{\ColThreeWidth}{25mm} -\newcommand{\versionemacs}[0]{29} % version of Emacs this is for +\newcommand{\versionemacs}[0]{30} % version of Emacs this is for \newcommand{\cyear}[0]{2022} % copyright year \newcommand\shortcopyrightnotice[0]{\vskip 1ex plus 2 fill diff --git a/lisp/bindings.el b/lisp/bindings.el index c1ad5f7520e..a3f51ebb315 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -670,6 +670,8 @@ or not." "Return the value of symbol VAR if it is bound, else nil. Note that if `lexical-binding' is in effect, this function isn't meaningful if it refers to a lexically bound variable." + (unless (symbolp var) + (signal 'wrong-type-argument (list 'symbolp var))) `(and (boundp (quote ,var)) ,var)) ;; Use mode-line-mode-menu for local minor-modes only. diff --git a/lisp/bs.el b/lisp/bs.el index 1fd31fb3b85..d7eed8f661d 100644 --- a/lisp/bs.el +++ b/lisp/bs.el @@ -420,9 +420,6 @@ naming a sort behavior. Default is \"by nothing\" which means no sorting." Non-nil means to show all buffers. Otherwise show buffers defined by current configuration `bs-current-configuration'.") -(defvar bs--window-config-coming-from nil - "Window configuration before starting Buffer Selection Menu.") - (defvar bs--intern-show-never "^ \\|\\*buffer-selection\\*" "Regular expression specifying which buffers never to show. A buffer whose name matches this regular expression will never be @@ -491,7 +488,22 @@ Used internally, only.") "<mouse-2>" #'bs-mouse-select "<mouse-3>" #'bs-mouse-select-other-frame) -;; ---------------------------------------------------------------------- +(defcustom bs-default-action-list '((display-buffer-below-selected) + (window-height . window-min-height)) + "Default action list for showing the '*bs-selection*' buffer. + +This list will be passed to `pop-to-buffer' as its ACTION argument. +It should be a cons cell (FUNCTIONS . ALIST), where FUNCTIONS is +an action function or a list of action functions and ALIST is an +action alist. Each such action function should accept two +arguments: a buffer to display and an alist of the same form as +ALIST. See `display-buffer' for details." + :type display-buffer--action-custom-type + :risky t + :version "30.1" + :group 'bs) + +; ---------------------------------------------------------------------- ;; Functions ;; ---------------------------------------------------------------------- @@ -668,20 +680,11 @@ apply it. (add-hook 'kill-buffer-hook 'bs--remove-hooks nil t) (add-hook 'change-major-mode-hook 'bs--remove-hooks nil t)) -(defun bs--restore-window-config () - "Restore window configuration on the current frame." - (when bs--window-config-coming-from - (let ((frame (selected-frame))) - (unwind-protect - (set-window-configuration bs--window-config-coming-from) - (select-frame frame))) - (setq bs--window-config-coming-from nil))) - (defun bs-kill () "Let buffer disappear and reset window configuration." (interactive) (bury-buffer (current-buffer)) - (bs--restore-window-config)) + (quit-window)) (defun bs-abort () "Ding and leave Buffer Selection Menu without a selection." @@ -742,7 +745,7 @@ Leave Buffer Selection Menu." (interactive) (let ((buffer (bs--current-buffer))) (bury-buffer (current-buffer)) - (bs--restore-window-config) + (quit-window) (switch-to-buffer buffer) (when bs--marked-buffers ;; Some marked buffers for selection @@ -765,7 +768,7 @@ Leave Buffer Selection Menu." (interactive) (let ((buffer (bs--current-buffer))) (bury-buffer (current-buffer)) - (bs--restore-window-config) + (quit-window) (switch-to-buffer-other-window buffer))) (defun bs-tmp-select-other-window () @@ -781,7 +784,7 @@ Leave Buffer Selection Menu." (interactive) (let ((buffer (bs--current-buffer))) (bury-buffer (current-buffer)) - (bs--restore-window-config) + (quit-window) (switch-to-buffer-other-frame buffer))) (defun bs-mouse-select-other-frame (event) @@ -1166,7 +1169,18 @@ Select buffer *buffer-selection* and display buffers according to current configuration `bs-current-configuration'. Set window height, fontify buffer and move point to current buffer." (setq bs-current-list list) - (switch-to-buffer (get-buffer-create "*buffer-selection*")) + (let* ((window-combination-limit 'window-size) + (bs-buf (get-buffer-create "*buffer-selection*")) + (bs-win (progn + (pop-to-buffer bs-buf bs-default-action-list) + (selected-window)))) + ;; Delete other windows showing *buffer-selection*. + ;; Done after pop-to-buffer, instead of just calling delete-windows-on, + ;; to allow display-buffer-reuse(-mode)?-window to be used in ALIST. + (dolist (w (get-buffer-window-list bs-buf 'not t)) + (unless (eq w bs-win) + (with-demoted-errors "Error deleting window: %S" + (delete-window w))))) (bs-mode) (let* ((inhibit-read-only t) (map-fun (lambda (entry) @@ -1438,21 +1452,8 @@ for buffer selection." ;; Only when not in buffer *buffer-selection* ;; we have to set the buffer we started the command (setq bs--buffer-coming-from (current-buffer))) - (let ((liste (bs-buffer-list)) - (active-window (get-window-with-predicate - (lambda (w) - (string= (buffer-name (window-buffer w)) - "*buffer-selection*")) - nil (selected-frame)))) - (if active-window - (select-window active-window) - (bs--restore-window-config) - (setq bs--window-config-coming-from (current-window-configuration)) - (when (> (window-height) 7) - ;; Errors would mess with the window configuration (bug#10882). - (ignore-errors (select-window (split-window-below))))) - (bs-show-in-buffer liste) - (bs-message-without-log "%s" (bs--current-config-message))))) + (bs-show-in-buffer (bs-buffer-list)) + (bs-message-without-log "%s" (bs--current-config-message)))) (defun bs--configuration-name-for-prefix-arg (prefix) "Convert prefix argument PREFIX to a name of a buffer configuration. diff --git a/lisp/calc/calc-units.el b/lisp/calc/calc-units.el index 42156b94606..cc1f5085a7c 100644 --- a/lisp/calc/calc-units.el +++ b/lisp/calc/calc-units.el @@ -319,28 +319,28 @@ that the combined units table will be rebuilt.") (defvar math-unit-prefixes '( ( ?Q (^ 10 30) "quetta" ) ( ?R (^ 10 27) "ronna" ) - ( ?Y (^ 10 24) "Yotta" ) - ( ?Z (^ 10 21) "Zetta" ) - ( ?E (^ 10 18) "Exa" ) - ( ?P (^ 10 15) "Peta" ) - ( ?T (^ 10 12) "Tera" ) - ( ?G (^ 10 9) "Giga" ) - ( ?M (^ 10 6) "Mega" ) - ( ?k (^ 10 3) "Kilo" ) - ( ?K (^ 10 3) "Kilo" ) - ( ?h (^ 10 2) "Hecto" ) - ( ?H (^ 10 2) "Hecto" ) - ( ?D (^ 10 1) "Deka" ) + ( ?Y (^ 10 24) "yotta" ) + ( ?Z (^ 10 21) "zetta" ) + ( ?E (^ 10 18) "exa" ) + ( ?P (^ 10 15) "peta" ) + ( ?T (^ 10 12) "tera" ) + ( ?G (^ 10 9) "giga" ) + ( ?M (^ 10 6) "mega" ) + ( ?k (^ 10 3) "kilo" ) + ( ?K (^ 10 3) "kilo" ) + ( ?h (^ 10 2) "hecto" ) + ( ?H (^ 10 2) "hecto" ) + ( ?D (^ 10 1) "deka" ) ( 0 (^ 10 0) nil ) - ( ?d (^ 10 -1) "Deci" ) - ( ?c (^ 10 -2) "Centi" ) - ( ?m (^ 10 -3) "Milli" ) - ( ?u (^ 10 -6) "Micro" ) - ( ?μ (^ 10 -6) "Micro" ) - ( ?n (^ 10 -9) "Nano" ) - ( ?p (^ 10 -12) "Pico" ) - ( ?f (^ 10 -15) "Femto" ) - ( ?a (^ 10 -18) "Atto" ) + ( ?d (^ 10 -1) "deci" ) + ( ?c (^ 10 -2) "centi" ) + ( ?m (^ 10 -3) "milli" ) + ( ?u (^ 10 -6) "micro" ) + ( ?μ (^ 10 -6) "micro" ) + ( ?n (^ 10 -9) "nano" ) + ( ?p (^ 10 -12) "pico" ) + ( ?f (^ 10 -15) "femto" ) + ( ?a (^ 10 -18) "atto" ) ( ?z (^ 10 -21) "zepto" ) ( ?y (^ 10 -24) "yocto" ) ( ?r (^ 10 -27) "ronto" ) diff --git a/lisp/comint.el b/lisp/comint.el index f0bb8da4355..7ba423e65de 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -4121,9 +4121,15 @@ function called, or nil, if no function was called (if BEG = END)." (save-restriction (let ((beg2 beg1) (end2 end1)) - (when (= beg2 beg) + (when (and (= beg2 beg) + (> beg2 (point-min)) + (eq is-output + (eq (get-text-property (1- beg2) 'field) 'output))) (setq beg2 (field-beginning beg2))) - (when (= end2 end) + (when (and (= end2 end) + (< end2 (point-max)) + (eq is-output + (eq (get-text-property (1+ end2) 'field) 'output))) (setq end2 (field-end end2))) ;; Narrow to the whole field surrounding the region (narrow-to-region beg2 end2)) diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 0e09e99da95..94a9165453f 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -1238,7 +1238,7 @@ Show the buffer in another window, but don't select it." (unless (eq symbol basevar) (message "`%s' is an alias for `%s'" symbol basevar)))) -(defvar customize-changed-options-previous-release "28.2" +(defvar customize-changed-options-previous-release "29.1" "Version for `customize-changed' to refer back to by default.") ;; Packages will update this variable, so make it available. diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 43a2ed92059..95e78ceab6a 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -2052,7 +2052,8 @@ info node `(cl) Function Bindings' for details. (dolist (binding bindings) (let ((var (make-symbol (format "--cl-%s--" (car binding)))) (args-and-body (cdr binding))) - (if (and (= (length args-and-body) 1) (symbolp (car args-and-body))) + (if (and (= (length args-and-body) 1) + (macroexp-copyable-p (car args-and-body))) ;; Optimize (cl-flet ((fun var)) body). (setq var (car args-and-body)) (push (list var (if (= (length args-and-body) 1) diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index 2df390ecbeb..7d54a84687b 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -417,6 +417,8 @@ No problems result if this variable is not bound. `(defvar ,keymap-sym (let ((m ,keymap)) (cond ((keymapp m) m) + ;; FIXME: `easy-mmode-define-keymap' is obsolete, + ;; so this form should also be obsolete somehow. ((listp m) (with-suppressed-warnings ((obsolete easy-mmode-define-keymap)) @@ -682,6 +684,7 @@ Valid keywords and arguments are: :group Ignored. :suppress Non-nil to call `suppress-keymap' on keymap, `nodigits' to suppress digits as prefix arguments." + (declare (obsolete define-keymap "29.1")) (let (inherit dense suppress) (while args (let ((key (pop args)) @@ -722,9 +725,7 @@ The M, BS, and ARGS arguments are as per that function. DOC is the constant's documentation. This macro is deprecated; use `defvar-keymap' instead." - ;; FIXME: Declare obsolete in favor of `defvar-keymap'. It is still - ;; used for `gud-menu-map' and `gud-minor-mode-map', so fix that first. - (declare (doc-string 3) (indent 1)) + (declare (doc-string 3) (indent 1) (obsolete defvar-keymap "29.1")) `(defconst ,m (easy-mmode-define-keymap ,bs nil (if (boundp ',m) ,m) ,(cons 'list args)) ,doc)) diff --git a/lisp/eshell/em-alias.el b/lisp/eshell/em-alias.el index 9ad218d5988..9b75c7a1237 100644 --- a/lisp/eshell/em-alias.el +++ b/lisp/eshell/em-alias.el @@ -183,7 +183,9 @@ file named by `eshell-aliases-file'.") (pcomplete-here (eshell-alias-completions pcomplete-stub))) (defun eshell-read-aliases-list () - "Read in an aliases list from `eshell-aliases-file'." + "Read in an aliases list from `eshell-aliases-file'. +This is useful after manually editing the contents of the file." + (interactive) (let ((file eshell-aliases-file)) (when (file-readable-p file) (setq eshell-command-aliases-list diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el index 48ac3e2bd4d..cfec04e183d 100644 --- a/lisp/eshell/esh-arg.el +++ b/lisp/eshell/esh-arg.el @@ -377,20 +377,24 @@ after are both returned." (when (eshell-looking-at-backslash-return (point)) (throw 'eshell-incomplete ?\\)) (forward-char 2) ; Move one char past the backslash. - (if (eq (char-before) ?\n) - ;; Escaped newlines are extra-special: they expand to an empty - ;; token to allow for continuing Eshell commands across - ;; multiple lines. - 'eshell-empty-token - ;; If the char is in a quote, backslash only has special meaning - ;; if it is escaping a special char. - (if eshell-current-quoted - (if (memq (char-before) eshell-special-chars-inside-quoting) - (list 'eshell-escape-arg (char-to-string (char-before))) - (concat "\\" (char-to-string (char-before)))) - (if (memq (char-before) eshell-special-chars-outside-quoting) - (list 'eshell-escape-arg (char-to-string (char-before))) - (char-to-string (char-before))))))) + (let ((special-chars (if eshell-current-quoted + eshell-special-chars-inside-quoting + eshell-special-chars-outside-quoting))) + (cond + ;; Escaped newlines are extra-special: they expand to an empty + ;; token to allow for continuing Eshell commands across + ;; multiple lines. + ((eq (char-before) ?\n) + 'eshell-empty-token) + ((memq (char-before) special-chars) + (list 'eshell-escape-arg (char-to-string (char-before)))) + ;; If the char is in a quote, backslash only has special + ;; meaning if it is escaping a special char. Otherwise, the + ;; result is the literal string "\c". + (eshell-current-quoted + (concat "\\" (char-to-string (char-before)))) + (t + (char-to-string (char-before))))))) (defun eshell-parse-literal-quote () "Parse a literally quoted string. Nothing has special meaning!" diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index fb89baf0949..1c049107f00 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -1944,85 +1944,6 @@ Major mode for editing BibTeX style files. (register-definition-prefixes "bibtex-style" '("bibtex-style-")) -;;; Generated autoloads from use-package/bind-key.el - -(push (purecopy '(bind-key 2 4 1)) package--builtin-versions) -(autoload 'bind-key "bind-key" "\ -Bind KEY-NAME to COMMAND in KEYMAP (`global-map' if not passed). - -KEY-NAME may be a vector, in which case it is passed straight to -`define-key'. Or it may be a string to be interpreted as -spelled-out keystrokes, e.g., \"C-c C-z\". See the documentation -of `edmacro-mode' for details. - -COMMAND must be an interactive function or lambda form. - -KEYMAP, if present, should be a keymap variable or symbol. -For example: - - (bind-key \"M-h\" #\\='some-interactive-function my-mode-map) - - (bind-key \"M-h\" #\\='some-interactive-function \\='my-mode-map) - -If PREDICATE is non-nil, it is a form evaluated to determine when -a key should be bound. It must return non-nil in such cases. -Emacs can evaluate this form at any time that it does redisplay -or operates on menu data structures, so you should write it so it -can safely be called at any time. - -(fn KEY-NAME COMMAND &optional KEYMAP PREDICATE)" nil t) -(autoload 'unbind-key "bind-key" "\ -Unbind the given KEY-NAME, within the KEYMAP (if specified). -See `bind-key' for more details. - -(fn KEY-NAME &optional KEYMAP)" nil t) -(autoload 'bind-key* "bind-key" "\ -Similar to `bind-key', but overrides any mode-specific bindings. - -(fn KEY-NAME COMMAND &optional PREDICATE)" nil t) -(autoload 'bind-keys "bind-key" "\ -Bind multiple keys at once. - -Accepts keyword arguments: -:map MAP - a keymap into which the keybindings should be - added -:prefix KEY - prefix key for these bindings -:prefix-map MAP - name of the prefix map that should be created - for these bindings -:prefix-docstring STR - docstring for the prefix-map variable -:menu-name NAME - optional menu string for prefix map -:repeat-docstring STR - docstring for the repeat-map variable -:repeat-map MAP - name of the repeat map that should be created - for these bindings. If specified, the - `repeat-map' property of each command bound - (within the scope of the `:repeat-map' keyword) - is set to this map. -:exit BINDINGS - Within the scope of `:repeat-map' will bind the - key in the repeat map, but will not set the - `repeat-map' property of the bound command. -:continue BINDINGS - Within the scope of `:repeat-map' forces the - same behavior as if no special keyword had - been used (that is, the command is bound, and - it's `repeat-map' property set) -:filter FORM - optional form to determine when bindings apply - -The rest of the arguments are conses of keybinding string and a -function symbol (unquoted). - -(fn &rest ARGS)" nil t) -(autoload 'bind-keys* "bind-key" "\ -Bind multiple keys at once, in `override-global-map'. -Accepts the same keyword arguments as `bind-keys' (which see). - -This binds keys in such a way that bindings are not overridden by -other modes. See `override-global-mode'. - -(fn &rest ARGS)" nil t) -(autoload 'describe-personal-keybindings "bind-key" "\ -Display all the personal keybindings defined by `bind-key'." t) -(register-definition-prefixes "bind-key" '("bind-key" "compare-keybindings" "get-binding-description" "override-global-m" "personal-keybindings")) - - ;;; Generated autoloads from emacs-lisp/bindat.el (register-definition-prefixes "bindat" '("bindat-")) @@ -2920,11 +2841,9 @@ and corresponding effects. ;;; Generated autoloads from progmodes/c-ts-mode.el -(autoload 'c-ts-base-mode "c-ts-mode" "\ +(autoload 'c-ts-mode--base-mode "c-ts-mode" "\ Major mode for editing C, powered by tree-sitter. -\\{c-ts-mode-map} - (fn)" t) (autoload 'c-ts-mode "c-ts-mode" "\ Major mode for editing C, powered by tree-sitter. @@ -2934,7 +2853,7 @@ Major mode for editing C, powered by tree-sitter. Major mode for editing C++, powered by tree-sitter. (fn)" t) -(register-definition-prefixes "c-ts-mode" '("c-ts-mode-")) +(register-definition-prefixes "c-ts-mode" '("c-ts-")) ;;; Generated autoloads from calendar/cal-bahai.el @@ -7978,16 +7897,6 @@ it is disabled. (register-definition-prefixes "doc-view" '("doc-view-")) -;;; Generated autoloads from progmodes/dockerfile-ts-mode.el - -(add-to-list 'auto-mode-alist '("\\(?:Dockerfile\\(?:\\..*\\)?\\|\\.[Dd]ockerfile\\)$" . dockerfile-ts-mode)) -(autoload 'dockerfile-ts-mode "dockerfile-ts-mode" "\ -Major mode for editing Dockerfiles, powered by tree-sitter. - -(fn)" t) -(register-definition-prefixes "dockerfile-ts-mode" '("dockerfile-ts-mode--")) - - ;;; Generated autoloads from play/doctor.el (autoload 'doctor "doctor" "\ @@ -8187,6 +8096,7 @@ Valid keywords and arguments are: `nodigits' to suppress digits as prefix arguments. (fn BS &optional NAME M ARGS)") +(make-obsolete 'easy-mmode-define-keymap 'define-keymap "29.1") (autoload 'easy-mmode-defmap "easy-mmode" "\ Define a constant M whose value is the result of `easy-mmode-define-keymap'. The M, BS, and ARGS arguments are as per that function. DOC is @@ -8197,6 +8107,7 @@ This macro is deprecated; use `defvar-keymap' instead. (fn M BS DOC &rest ARGS)" nil t) (function-put 'easy-mmode-defmap 'doc-string-elt 3) (function-put 'easy-mmode-defmap 'lisp-indent-function 1) +(make-obsolete 'easy-mmode-defmap 'defvar-keymap "29.1") (autoload 'easy-mmode-defsyntax "easy-mmode" "\ Define variable ST as a syntax-table. CSS contains a list of syntax specifications of the form (CHAR . SYNTAX). @@ -11366,12 +11277,6 @@ This is used only in conjunction with `expand-add-abbrevs'." t) (register-definition-prefixes "srecode/expandproto" '("srecode-")) -;;; Generated autoloads from external-completion.el - -(push (purecopy '(external-completion 0 1)) package--builtin-versions) -(register-definition-prefixes "external-completion" '("external-completion-")) - - ;;; Generated autoloads from cedet/srecode/extract.el (register-definition-prefixes "srecode/extract" '("srecode-extract")) @@ -23472,11 +23377,11 @@ regular package, but it will not remove a VC package. (autoload 'package-vc-checkout "package-vc" "\ Clone the sources for PKG-DESC into DIRECTORY and visit that directory. Unlike `package-vc-install', this does not yet set up the package -for use with Emacs; use `package-vc-install-from-checkout' for -setting the package up after this function finishes. Optional -argument REV means to clone a specific version of the package; it -defaults to the last version available from the package's -repository. If REV has the special value +for use with Emacs; use `package-vc-link-directory' for setting +the package up after this function finishes. +Optional argument REV means to clone a specific version of the +package; it defaults to the last version available from the +package's repository. If REV has the special value `:last-release' (interactively, the prefix argument), that stands for the last released version of the package. @@ -25065,7 +24970,7 @@ Open profile FILENAME. ;;; Generated autoloads from progmodes/project.el -(push (purecopy '(project 0 9 2)) package--builtin-versions) +(push (purecopy '(project 0 8 3)) package--builtin-versions) (autoload 'project-current "project" "\ Return the project instance in DIRECTORY, defaulting to `default-directory'. @@ -25077,8 +24982,8 @@ project instance. The \"transient\" project instance is a special kind of value which denotes a project rooted in that directory and includes all -the files under the directory except for those that match entries -in `vc-directory-exclusion-list' or `grep-find-ignored-files'. +the files under the directory except for those that should be +ignored (per `project-ignores'). See the doc string of `project-find-functions' for the general form of the project instance object. @@ -32970,19 +32875,11 @@ FRAC should be the inverse of the fractional value; for example, a value of ;;; Generated autoloads from progmodes/typescript-ts-mode.el (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-ts-mode)) -(add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode)) -(autoload 'typescript-ts-base-mode "typescript-ts-mode" "\ -Major mode for editing TypeScript. - -(fn)" t) +(add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-ts-mode)) (autoload 'typescript-ts-mode "typescript-ts-mode" "\ Major mode for editing TypeScript. (fn)" t) -(autoload 'tsx-ts-mode "typescript-ts-mode" "\ -Major mode for editing TypeScript. - -(fn)" t) (register-definition-prefixes "typescript-ts-mode" '("typescript-ts-mode-")) @@ -33709,195 +33606,6 @@ is \"www.fsf.co.uk\". (register-definition-prefixes "url-vars" '("url-")) -;;; Generated autoloads from use-package/use-package.el - -(push (purecopy '(use-package 2 4 4)) package--builtin-versions) - - -;;; Generated autoloads from use-package/use-package-bind-key.el - -(autoload 'use-package-autoload-keymap "use-package-bind-key" "\ -Load PACKAGE and bind key sequence invoking this function to KEYMAP-SYMBOL. -Then simulate pressing the same key sequence a again, so that the -next key pressed is routed to the newly loaded keymap. - -This function supports use-package's :bind-keymap keyword. It -works by binding the given key sequence to an invocation of this -function for a particular keymap. The keymap is expected to be -defined by the package. In this way, loading the package is -deferred until the prefix key sequence is pressed. - -(fn KEYMAP-SYMBOL PACKAGE OVERRIDE)") -(autoload 'use-package-normalize-binder "use-package-bind-key" "\ - - -(fn NAME KEYWORD ARGS)") -(defalias 'use-package-normalize/:bind 'use-package-normalize-binder) -(defalias 'use-package-normalize/:bind* 'use-package-normalize-binder) -(defalias 'use-package-autoloads/:bind 'use-package-autoloads-mode) -(defalias 'use-package-autoloads/:bind* 'use-package-autoloads-mode) -(autoload 'use-package-handler/:bind "use-package-bind-key" "\ - - -(fn NAME KEYWORD ARGS REST STATE &optional BIND-MACRO)") -(defalias 'use-package-normalize/:bind-keymap 'use-package-normalize-binder) -(defalias 'use-package-normalize/:bind-keymap* 'use-package-normalize-binder) -(autoload 'use-package-handler/:bind-keymap "use-package-bind-key" "\ - - -(fn NAME KEYWORD ARGS REST STATE &optional OVERRIDE)") -(autoload 'use-package-handler/:bind-keymap* "use-package-bind-key" "\ - - -(fn NAME KEYWORD ARG REST STATE)") -(register-definition-prefixes "use-package-bind-key" '("use-package-handler/:bind*")) - - -;;; Generated autoloads from use-package/use-package-core.el - -(autoload 'use-package "use-package-core" "\ -Declare an Emacs package by specifying a group of configuration options. - -For the full documentation, see Info node `(use-package) top'. -Usage: - - (use-package package-name - [:keyword [option]]...) - -:init Code to run before PACKAGE-NAME has been loaded. -:config Code to run after PACKAGE-NAME has been loaded. Note that - if loading is deferred for any reason, this code does not - execute until the lazy load has occurred. -:preface Code to be run before everything except `:disabled'; this - can be used to define functions for use in `:if', or that - should be seen by the byte-compiler. - -:mode Form to be added to `auto-mode-alist'. -:magic Form to be added to `magic-mode-alist'. -:magic-fallback Form to be added to `magic-fallback-mode-alist'. -:interpreter Form to be added to `interpreter-mode-alist'. - -:commands Define autoloads for commands that will be defined by the - package. This is useful if the package is being lazily - loaded, and you wish to conditionally call functions in your - `:init' block that are defined in the package. -:autoload Similar to :commands, but it for no-interactive one. -:hook Specify hook(s) to attach this package to. - -:bind Bind keys, and define autoloads for the bound commands. -:bind* Bind keys, and define autoloads for the bound commands, - *overriding all minor mode bindings*. -:bind-keymap Bind a key prefix to an auto-loaded keymap defined in the - package. This is like `:bind', but for keymaps. -:bind-keymap* Like `:bind-keymap', but overrides all minor mode bindings - -:defer Defer loading of a package -- this is implied when using - `:commands', `:bind', `:bind*', `:mode', `:magic', `:hook', - `:magic-fallback', or `:interpreter'. This can be an integer, - to force loading after N seconds of idle time, if the package - has not already been loaded. -:demand Prevent the automatic deferred loading introduced by constructs - such as `:bind' (see `:defer' for the complete list). - -:after Delay the effect of the use-package declaration - until after the named libraries have loaded. - Before they have been loaded, no other keyword - has any effect at all, and once they have been - loaded it is as if `:after' was not specified. - -:if EXPR Initialize and load only if EXPR evaluates to a non-nil value. -:disabled The package is ignored completely if this keyword is present. -:defines Declare certain variables to silence the byte-compiler. -:functions Declare certain functions to silence the byte-compiler. -:load-path Add to the `load-path' before attempting to load the package. -:diminish Support for diminish.el (if installed). -:delight Support for delight.el (if installed). -:custom Call `Custom-set' or `set-default' with each variable - definition without modifying the Emacs `custom-file'. - (compare with `custom-set-variables'). -:custom-face Call `custom-set-faces' with each face definition. -:ensure Loads the package using package.el if necessary. -:pin Pin the package to an archive. - -(fn NAME &rest ARGS)" nil t) -(function-put 'use-package 'lisp-indent-function 'defun) -(register-definition-prefixes "use-package-core" '("use-package-")) - - -;;; Generated autoloads from use-package/use-package-delight.el - -(autoload 'use-package-normalize/:delight "use-package-delight" "\ -Normalize arguments to delight. - -(fn NAME KEYWORD ARGS)") -(autoload 'use-package-handler/:delight "use-package-delight" "\ - - -(fn NAME KEYWORD ARGS REST STATE)") -(register-definition-prefixes "use-package-delight" '("use-package-normalize-delight")) - - -;;; Generated autoloads from use-package/use-package-diminish.el - -(autoload 'use-package-normalize/:diminish "use-package-diminish" "\ - - -(fn NAME KEYWORD ARGS)") -(autoload 'use-package-handler/:diminish "use-package-diminish" "\ - - -(fn NAME KEYWORD ARG REST STATE)") -(register-definition-prefixes "use-package-diminish" '("use-package-normalize-diminish")) - - -;;; Generated autoloads from use-package/use-package-ensure.el - -(autoload 'use-package-normalize/:ensure "use-package-ensure" "\ - - -(fn NAME KEYWORD ARGS)") -(autoload 'use-package-handler/:ensure "use-package-ensure" "\ - - -(fn NAME KEYWORD ENSURE REST STATE)") -(register-definition-prefixes "use-package-ensure" '("use-package-")) - - -;;; Generated autoloads from use-package/use-package-ensure-system-package.el - -(push (purecopy '(use-package-ensure-system-package 0 2)) package--builtin-versions) -(autoload 'use-package-normalize/:ensure-system-package "use-package-ensure-system-package" "\ -Turn ARGS into a list of conses of the form (PACKAGE-NAME . INSTALL-COMMAND). - -(fn NAME-SYMBOL KEYWORD ARGS)") -(autoload 'use-package-handler/:ensure-system-package "use-package-ensure-system-package" "\ -Execute the handler for `:ensure-system-package' keyword in `use-package'. - -(fn NAME KEYWORD ARG REST STATE)") -(register-definition-prefixes "use-package-ensure-system-package" '("use-package-ensure-system-package-")) - - -;;; Generated autoloads from use-package/use-package-jump.el - -(autoload 'use-package-jump-to-package-form "use-package-jump" "\ -Attempt to find and jump to the `use-package' form that loaded PACKAGE. -This will only find the form if that form actually required -PACKAGE. If PACKAGE was previously required then this function -will jump to the file that originally required PACKAGE instead. - -(fn PACKAGE)" t) -(register-definition-prefixes "use-package-jump" '("use-package-find-require")) - - -;;; Generated autoloads from use-package/use-package-lint.el - -(autoload 'use-package-lint "use-package-lint" "\ -Check for errors in `use-package' declarations. -For example, if the module's `:if' condition is met, but even -with the specified `:load-path' the module cannot be found." t) -(register-definition-prefixes "use-package-lint" '("use-package-lint-declaration")) - - ;;; Generated autoloads from userlock.el (put 'create-lockfiles 'safe-local-variable 'booleanp) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index e8d8f9104e4..eb0e5b0481c 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -1113,13 +1113,13 @@ no input, and GDB is waiting for input." (process-live-p proc) (not gud-running) (= (point) (marker-position (process-mark proc)))) - ;; Sending an EOF does not work with GDB-MI; submit an - ;; explicit quit command. - (progn - (if (> gdb-control-level 0) - (process-send-eof proc) - (insert "quit") - (comint-send-input t t))) + ;; Exit a recursive reading loop or quit. + (if (> gdb-control-level 0) + (process-send-eof proc) + ;; Sending an EOF does not work with GDB-MI; submit an + ;; explicit quit command. + (insert "quit") + (comint-send-input t t)) (delete-char arg)))) (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") @@ -4355,6 +4355,24 @@ member." :group 'gud :version "29.1") +(defcustom gdb-locals-table-row-config `((name . 20) + (type . 20) + (value . ,gdb-locals-value-limit)) + "Configuration for table rows in the local variable display. + +An alist that controls the display of the name, type and value of +local variables inside the currently active stack-frame. The key +controls which column to change whereas the value determines the +maximum number of characters to display in each column. A value +of 0 means there is no limit. + +Additionally, the order the element in the alist determines the +left-to-right display order of the properties." + :type '(alist :key-type 'symbol :value-type 'integer) + :group 'gud + :version "30.1") + + (defvar gdb-locals-values-table (make-hash-table :test #'equal) "Mapping of local variable names to a string with their value.") @@ -4384,12 +4402,9 @@ member." (defun gdb-locals-value-filter (value) "Filter function for the local variable VALUE." - (let* ((no-nl (replace-regexp-in-string "\n" " " value)) - (str (replace-regexp-in-string "[[:space:]]+" " " no-nl)) - (limit gdb-locals-value-limit)) - (if (>= (length str) limit) - (concat (substring str 0 limit) "...") - str))) + (let* ((no-nl (replace-regexp-in-string "\n" " " (or value "<Unknown>"))) + (str (replace-regexp-in-string "[[:space:]]+" " " no-nl))) + str)) (defun gdb-edit-locals-value (&optional event) "Assign a value to a variable displayed in the locals buffer." @@ -4403,6 +4418,22 @@ member." (gud-basic-call (concat "-gdb-set variable " var " = " value))))) + +(defun gdb-locals-table-columns-list (alist) + "Format and arrange the columns in locals display based on ALIST." + (let (columns) + (dolist (config gdb-locals-table-row-config columns) + (let* ((key (car config)) + (max (cdr config)) + (prop (alist-get key alist))) + (when prop + (if (and (> max 0) (length> prop max)) + (push (propertize (string-truncate-left prop max) 'help-echo prop) + columns) + (push prop columns))))) + (nreverse columns))) + + ;; Complex data types are looked up in `gdb-locals-values-table'. (defun gdb-locals-handler-custom () "Handler to rebuild the local variables table buffer." @@ -4431,12 +4462,14 @@ member." help-echo "mouse-2: edit value" local-map ,gdb-edit-locals-map-1) value)) + (setf (gdb-table-right-align table) t) + (setq name (propertize name 'font-lock-face font-lock-variable-name-face)) + (setq type (propertize type 'font-lock-face font-lock-type-face)) (gdb-table-add-row table - (list - (propertize type 'font-lock-face font-lock-type-face) - (propertize name 'font-lock-face font-lock-variable-name-face) - value) + (gdb-locals-table-columns-list `((name . ,name) + (type . ,type) + (value . ,value))) `(gdb-local-variable ,local)))) (insert (gdb-table-string table " ")) (setq mode-name @@ -5124,6 +5157,8 @@ This arrangement depends on the values of variable (defun gdb-reset () "Exit a debugging session cleanly. Kills the gdb buffers, and resets variables and the source buffers." + ;; Save GDB history + (comint-write-input-ring) ;; The gdb-inferior buffer has a pty hooked up to the main gdb ;; process. This pty must be deleted explicitly. (let ((pty (get-process "gdb-inferior"))) diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el index 143fa8c6798..6ffcf497b93 100644 --- a/lisp/progmodes/gud.el +++ b/lisp/progmodes/gud.el @@ -159,143 +159,96 @@ Used to gray out relevant toolbar icons.") (t (comint-interrupt-subjob))))) -(easy-mmode-defmap gud-menu-map - '(([help] "Info (debugger)" . gud-goto-info) - ([tooltips] menu-item "Show GUD tooltips" gud-tooltip-mode - :enable (and (not emacs-basic-display) - (display-graphic-p) - (fboundp 'x-show-tip)) - :visible (memq gud-minor-mode - '(gdbmi guiler dbx sdb xdb pdb)) - :button (:toggle . gud-tooltip-mode)) - ([refresh] "Refresh" . gud-refresh) - ([run] menu-item "Run" gud-run - :enable (not gud-running) - :visible (or (memq gud-minor-mode '(gdb dbx jdb)) - (and (eq gud-minor-mode 'gdbmi) - (or (not (gdb-show-run-p)) - (bound-and-true-p - gdb-active-process))))) - ([go] . (menu-item (if (bound-and-true-p gdb-active-process) - "Continue" "Run") - gud-go - :visible (and (eq gud-minor-mode 'gdbmi) - (gdb-show-run-p)))) - ([stop] menu-item "Stop" gud-stop-subjob - :visible (or (not (memq gud-minor-mode '(gdbmi pdb))) - (and (eq gud-minor-mode 'gdbmi) - (gdb-show-stop-p)))) - ([until] menu-item "Continue to selection" gud-until - :enable (not gud-running) - :visible (and (memq gud-minor-mode '(gdbmi gdb perldb)) - (gud-tool-bar-item-visible-no-fringe))) - ([remove] menu-item "Remove Breakpoint" gud-remove - :enable (not gud-running) - :visible (gud-tool-bar-item-visible-no-fringe)) - ([tbreak] menu-item "Temporary Breakpoint" gud-tbreak - :enable (not gud-running) - :visible (memq gud-minor-mode - '(gdbmi gdb sdb xdb))) - ([break] menu-item "Set Breakpoint" gud-break - :enable (not gud-running) - :visible (gud-tool-bar-item-visible-no-fringe)) - ([up] menu-item "Up Stack" gud-up - :enable (not gud-running) - :visible (memq gud-minor-mode - '(gdbmi gdb guiler dbx xdb jdb pdb))) - ([down] menu-item "Down Stack" gud-down - :enable (not gud-running) - :visible (memq gud-minor-mode - '(gdbmi gdb guiler dbx xdb jdb pdb))) - ([pp] menu-item "Print S-expression" gud-pp - :enable (and (not gud-running) - (bound-and-true-p gdb-active-process)) - :visible (and (string-equal - (buffer-local-value - 'gud-target-name gud-comint-buffer) - "emacs") - (eq gud-minor-mode 'gdbmi))) - ([print*] . (menu-item (if (eq gud-minor-mode 'jdb) - "Dump object" - "Print Dereference") - gud-pstar - :enable (not gud-running) - :visible (memq gud-minor-mode '(gdbmi gdb jdb)))) - ([print] menu-item "Print Expression" gud-print - :enable (not gud-running)) - ([watch] menu-item "Watch Expression" gud-watch - :enable (not gud-running) - :visible (eq gud-minor-mode 'gdbmi)) - ([finish] menu-item "Finish Function" gud-finish - :enable (not gud-running) - :visible (memq gud-minor-mode - '(gdbmi gdb guiler xdb jdb pdb))) - ([stepi] menu-item "Step Instruction" gud-stepi - :enable (not gud-running) - :visible (memq gud-minor-mode '(gdbmi gdb dbx))) - ([nexti] menu-item "Next Instruction" gud-nexti - :enable (not gud-running) - :visible (memq gud-minor-mode '(gdbmi gdb dbx))) - ([step] menu-item "Step Line" gud-step - :enable (not gud-running)) - ([next] menu-item "Next Line" gud-next - :enable (not gud-running)) - ([cont] menu-item "Continue" gud-cont - :enable (not gud-running) - :visible (not (eq gud-minor-mode 'gdbmi)))) - "Menu for `gud-mode'." - :name "Gud") - -(easy-mmode-defmap gud-minor-mode-map - (append - `(([menu-bar debug] . ("Gud" . ,gud-menu-map))) - ;; Get tool bar like functionality from the menu bar on a text only - ;; terminal. - (unless window-system - `(([menu-bar down] - . (,(propertize "down" 'face 'font-lock-doc-face) . gud-down)) - ([menu-bar up] - . (,(propertize "up" 'face 'font-lock-doc-face) . gud-up)) - ([menu-bar finish] - . (,(propertize "finish" 'face 'font-lock-doc-face) . gud-finish)) - ([menu-bar step] - . (,(propertize "step" 'face 'font-lock-doc-face) . gud-step)) - ([menu-bar next] - . (,(propertize "next" 'face 'font-lock-doc-face) . gud-next)) - ([menu-bar until] menu-item - ,(propertize "until" 'face 'font-lock-doc-face) gud-until - :visible (memq gud-minor-mode '(gdbmi gdb perldb))) - ([menu-bar cont] menu-item - ,(propertize "cont" 'face 'font-lock-doc-face) gud-cont - :visible (not (eq gud-minor-mode 'gdbmi))) - ([menu-bar run] menu-item - ,(propertize "run" 'face 'font-lock-doc-face) gud-run - :visible (memq gud-minor-mode '(gdbmi gdb dbx jdb))) - ([menu-bar go] menu-item - ,(propertize " go " 'face 'font-lock-doc-face) gud-go - :visible (and (eq gud-minor-mode 'gdbmi) - (gdb-show-run-p))) - ([menu-bar stop] menu-item - ,(propertize "stop" 'face 'font-lock-doc-face) gud-stop-subjob - :visible (or (and (eq gud-minor-mode 'gdbmi) - (gdb-show-stop-p)) - (not (eq gud-minor-mode 'gdbmi)))) - ([menu-bar print] - . (,(propertize "print" 'face 'font-lock-doc-face) . gud-print)) - ([menu-bar tools] . undefined) - ([menu-bar buffer] . undefined) - ([menu-bar options] . undefined) - ([menu-bar edit] . undefined) - ([menu-bar file] . undefined)))) - "Map used in visited files.") +(defvar-keymap gud-mode-map + ;; Will inherit from comint-mode via define-derived-mode. + :doc "`gud-mode' keymap.") -(setf (alist-get 'gud-minor-mode minor-mode-map-alist) - gud-minor-mode-map) +(defvar-keymap gud-minor-mode-map + :parent gud-mode-map) -(defvar gud-mode-map - ;; Will inherit from comint-mode via define-derived-mode. - (make-sparse-keymap) - "`gud-mode' keymap.") +(easy-menu-define gud-menu-map gud-mode-map + "Menu for `gud-mode'." + '("Gud" + ["Continue" gud-cont + :enable (not gud-running) + :visible (not (eq gud-minor-mode 'gdbmi))] + ["Next Line" gud-next + :enable (not gud-running)] + ["Step Line" gud-step + :enable (not gud-running)] + ["Next Instruction" gud-nexti + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb dbx))] + ["Step Instruction" gud-stepi + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb dbx))] + ["Finish Function" gud-finish + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb guiler xdb jdb pdb))] + ["Watch Expression" gud-watch + :enable (not gud-running) + :visible (eq gud-minor-mode 'gdbmi)] + ["Print Expression" gud-print + :enable (not gud-running)] + ["Dump object-Derefenrece" gud-pstar + :label (if (eq gud-minor-mode 'jdb) + "Dump object" + "Print Dereference") + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb jdb))] + ["Print S-expression" gud-pp + :enable (and (not gud-running) + (bound-and-true-p gdb-active-process)) + :visible (and (string-equal + (buffer-local-value + 'gud-target-name gud-comint-buffer) + "emacs") + (eq gud-minor-mode 'gdbmi))] + ["Down Stack" gud-down + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb guiler dbx xdb jdb pdb))] + ["Up Stack" gud-up + :enable (not gud-running) + :visible (memq gud-minor-mode + '(gdbmi gdb guiler dbx xdb jdb pdb))] + ["Set Breakpoint" gud-break + :enable (not gud-running) + :visible (gud-tool-bar-item-visible-no-fringe)] + ["Temporary Breakpoint" gud-tbreak + :enable (not gud-running) + :visible (memq gud-minor-mode '(gdbmi gdb sdb xdb))] + ["Remove Breakpoint" gud-remove + :enable (not gud-running) + :visible (gud-tool-bar-item-visible-no-fringe)] + ["Continue to selection" gud-until + :enable (not gud-running) + :visible (and (memq gud-minor-mode '(gdbmi gdb perldb)) + (gud-tool-bar-item-visible-no-fringe))] + ["Stop" gud-stop-subjob + :visible (or (not (memq gud-minor-mode '(gdbmi pdb))) + (and (eq gud-minor-mode 'gdbmi) + (gdb-show-stop-p)))] + ["Continue-Run" gud-go + :label (if (bound-and-true-p gdb-active-process) + "Continue" "Run") + :visible (and (eq gud-minor-mode 'gdbmi) + (gdb-show-run-p))] + ["Run" gud-run + :enable (not gud-running) + :visible (or (memq gud-minor-mode '(gdb dbx jdb)) + (and (eq gud-minor-mode 'gdbmi) + (or (not (gdb-show-run-p)) + (bound-and-true-p + gdb-active-process))))] + ["Refresh" gud-refresh] + ["Show GUD tooltips" gud-tooltip-mode + :enable (and (not emacs-basic-display) + (display-graphic-p) + (fboundp 'x-show-tip)) + :visible (memq gud-minor-mode + '(gdbmi guiler dbx sdb xdb pdb)) + :button (:toggle . gud-tooltip-mode)] + ["Info (debugger)" gud-goto-info])) (setf (alist-get 'gud-minor-mode minor-mode-map-alist) gud-minor-mode-map) diff --git a/lisp/server.el b/lisp/server.el index fd740d126df..8f4ca4cbc6c 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -273,6 +273,11 @@ If nil, no instructions are displayed." :version "28.1" :type 'boolean) +(defvar server-stop-automatically) ; Defined below to avoid recursive load. + +(defvar server-stop-automatically--timer nil + "The timer object for `server-stop-automatically--maybe-kill-emacs'.") + ;; We do not use `temporary-file-directory' here, because emacsclient ;; does not read the init file. (defvar server-socket-dir @@ -636,7 +641,8 @@ anyway." (setq stopped-p t server-process nil server-mode nil - global-minor-modes (delq 'server-mode global-minor-modes))) + global-minor-modes (delq 'server-mode global-minor-modes)) + (server-apply-stop-automatically)) (unwind-protect ;; Delete the socket files made by previous server ;; invocations. @@ -757,6 +763,7 @@ the `server-process' variable." (list :family 'local :service server-file :plist '(:authenticated t))))) + (server-apply-stop-automatically) (unless server-process (error "Could not start server process")) (server-log "Started server") (process-put server-process :server-file server-file) @@ -1769,9 +1776,6 @@ be a cons cell (LINENUMBER . COLUMNNUMBER)." (when server-raise-frame (select-frame-set-input-focus (window-frame))))) -(defvar server-stop-automatically nil - "Internal status variable for `server-stop-automatically'.") - ;;;###autoload (defun server-save-buffers-kill-terminal (arg) ;; Called from save-buffers-kill-terminal in files.el. @@ -1779,11 +1783,19 @@ be a cons cell (LINENUMBER . COLUMNNUMBER)." With ARG non-nil, silently save all file-visiting buffers, then kill. If emacsclient was started with a list of filenames to edit, then -only these files will be asked to be saved." - (let ((proc (frame-parameter nil 'client))) +only these files will be asked to be saved. + +When running Emacs as a daemon and with +`server-stop-automatically' (which see) set to `kill-terminal' or +`delete-frame', this function may call `save-buffers-kill-emacs' +if there are no other active clients." + (let ((stop-automatically + (and (daemonp) + (memq server-stop-automatically '(kill-terminal delete-frame)))) + (proc (frame-parameter nil 'client))) (cond ((eq proc 'nowait) ;; Nowait frames have no client buffer list. - (if (length> (frame-list) (if server-stop-automatically 2 1)) + (if (length> (frame-list) (if stop-automatically 2 1)) ;; If there are any other frames, only delete this one. ;; When `server-stop-automatically' is set, don't count ;; the daemon frame. @@ -1792,7 +1804,7 @@ only these files will be asked to be saved." ;; If we're the last frame standing, kill Emacs. (save-buffers-kill-emacs arg))) ((processp proc) - (if (or (not server-stop-automatically) + (if (or (not stop-automatically) (length> server-clients 1) (seq-some (lambda (frame) @@ -1818,31 +1830,14 @@ only these files will be asked to be saved." (save-buffers-kill-emacs arg))) (t (error "Invalid client frame"))))) -(defun server-stop-automatically--handle-delete-frame (frame) - "Handle deletion of FRAME when `server-stop-automatically' is used." - (when server-stop-automatically - (if (if (and (processp (frame-parameter frame 'client)) - (eq this-command 'save-buffers-kill-terminal)) - (progn - (dolist (f (frame-list)) - (when (and (eq (frame-parameter frame 'client) - (frame-parameter f 'client)) - (not (eq frame f))) - (set-frame-parameter f 'client nil) - (let ((server-stop-automatically nil)) - (delete-frame f)))) - (if (cddr (frame-list)) - (let ((server-stop-automatically nil)) - (delete-frame frame) - nil) - t)) - (null (cddr (frame-list)))) - (let ((server-stop-automatically nil)) - (save-buffers-kill-emacs) - (delete-frame frame))))) +(defun server-stop-automatically--handle-delete-frame (_frame) + "Handle deletion of FRAME when `server-stop-automatically' is `delete-frame'." + (when (null (cddr (frame-list))) + (let ((server-stop-automatically nil)) + (save-buffers-kill-emacs)))) (defun server-stop-automatically--maybe-kill-emacs () - "Handle closing of Emacs daemon when `server-stop-automatically' is used." + "Handle closing of Emacs daemon when `server-stop-automatically' is `empty'." (unless (cdr (frame-list)) (when (and (not (memq t (mapcar (lambda (b) @@ -1856,41 +1851,70 @@ only these files will be asked to be saved." (process-list))))) (kill-emacs)))) -;;;###autoload -(defun server-stop-automatically (arg) - "Automatically stop server as specified by ARG. - -If ARG is the symbol `empty', stop the server when it has no +(defun server-apply-stop-automatically () + "Apply the current value of `server-stop-automatically'. +This function adds or removes the necessary helpers to manage +stopping the Emacs server automatically, depending on the whether +the server is running or not. This function only applies when +running Emacs as a daemon." + (when (daemonp) + (let (empty-timer-p delete-frame-p) + (when server-process + (pcase server-stop-automatically + ('empty (setq empty-timer-p t)) + ('delete-frame (setq delete-frame-p t)))) + ;; Start or stop the timer. + (if empty-timer-p + (unless server-stop-automatically--timer + (setq server-stop-automatically--timer + (run-with-timer + 10 2 + #'server-stop-automatically--maybe-kill-emacs))) + (when server-stop-automatically--timer + (cancel-timer server-stop-automatically--timer) + (setq server-stop-automatically--timer nil))) + ;; Add or remove the delete-frame hook. + (if delete-frame-p + (add-hook 'delete-frame-functions + #'server-stop-automatically--handle-delete-frame) + (remove-hook 'delete-frame-functions + #'server-stop-automatically--handle-delete-frame)))) + ;; Return the current value of `server-stop-automatically'. + server-stop-automatically) + +(defcustom server-stop-automatically nil + "If non-nil, stop the server under the requested conditions. + +If this is the symbol `empty', stop the server when it has no remaining clients, no remaining unsaved file-visiting buffers, and no running processes with a `query-on-exit' flag. -If ARG is the symbol `delete-frame', ask the user when the last +If this is the symbol `delete-frame', ask the user when the last frame is deleted whether each unsaved file-visiting buffer must be saved and each running process with a `query-on-exit' flag can be stopped, and if so, stop the server itself. -If ARG is the symbol `kill-terminal', ask the user when the +If this is the symbol `kill-terminal', ask the user when the terminal is killed with \\[save-buffers-kill-terminal] \ whether each unsaved file-visiting buffer must be saved and each running process with a `query-on-exit' -flag can be stopped, and if so, stop the server itself. - -Any other value of ARG will cause this function to signal an error. +flag can be stopped, and if so, stop the server itself." + :type '(choice + (const :tag "Never" nil) + (const :tag "When no clients, unsaved files, or processes" + empty) + (const :tag "When killing last terminal" kill-terminal) + (const :tag "When killing last terminal or frame" delete-frame)) + :set (lambda (symbol value) + (set-default symbol value) + (server-apply-stop-automatically)) + :version "29.1") -This function is meant to be called from the user init file." - (when (daemonp) - (setq server-stop-automatically arg) - (cond - ((eq arg 'empty) - (setq server-stop-automatically nil) - (run-with-timer 10 2 - #'server-stop-automatically--maybe-kill-emacs)) - ((eq arg 'delete-frame) - (add-hook 'delete-frame-functions - #'server-stop-automatically--handle-delete-frame)) - ((eq arg 'kill-terminal)) - (t - (error "Unexpected argument"))))) +;;;###autoload +(defun server-stop-automatically (value) + "Automatically stop the Emacs server as specified by VALUE. +This sets the variable `server-stop-automatically' (which see)." + (setopt server-stop-automatically value)) (define-key ctl-x-map "#" 'server-edit) diff --git a/lisp/transient.el b/lisp/transient.el index 0919c2c3ef0..1cab697eecb 100644 --- a/lisp/transient.el +++ b/lisp/transient.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/magit/transient ;; Keywords: extensions -;; Package-Version: 0.3.7 +;; Package-Version: 0.3.7.50 ;; Package-Requires: ((emacs "26.1")) ;; SPDX-License-Identifier: GPL-3.0-or-later @@ -2199,7 +2199,7 @@ value. Otherwise return CHILDREN as is." (delayed (if transient--exitp (apply-partially #'transient--post-exit this-command) #'transient--resume-override)) - post-command abort-minibuffer) + outside-interactive post-command abort-minibuffer) (unless abort-only (setq post-command (lambda () "@transient--delay-post-command" @@ -2211,7 +2211,9 @@ value. Otherwise return CHILDREN as is." (equal (ignore-errors (string-to-multibyte (this-command-keys))) - (format "\M-x%s\r" this-command)))))) + (format "\M-x%s\r" this-command)) + ;; Minibuffer used outside `interactive'. + (and outside-interactive 'post-cmd))))) (transient--debug 'post-command-hook "act: %s" act) (when act (remove-hook 'transient--post-command-hook post-command) @@ -2220,12 +2222,15 @@ value. Otherwise return CHILDREN as is." (add-hook 'transient--post-command-hook post-command)) (setq abort-minibuffer (lambda () "@transient--delay-post-command" - (let ((act (and (or (memq this-command transient--abort-commands) - (equal (this-command-keys) "")) - (= (minibuffer-depth) depth)))) + (let ((act (and (= (minibuffer-depth) depth) + (or (memq this-command transient--abort-commands) + (equal (this-command-keys) "") + (prog1 nil + (setq outside-interactive t)))))) (transient--debug 'abort-minibuffer - "mini: %s|%s, act %s" (minibuffer-depth) depth act) + "mini: %s|%s, act: %s" (minibuffer-depth) depth + (or act (and outside-interactive '->post-cmd))) (when act (remove-hook 'transient--post-command-hook post-command) (remove-hook 'minibuffer-exit-hook abort-minibuffer) @@ -2407,6 +2412,10 @@ If there is no parent prefix, then behave like `transient--do-exit'." (transient--stack-zap) transient--exit) +(defun transient--do-leave () + "Call the command without exporting variables and exit the transient." + transient--stay) + (defun transient--do-push-button () "Call the command represented by the activated button. Use that command's pre-command to determine transient behavior." @@ -3376,7 +3385,7 @@ have a history of their own.") (insert ?\n) (insert (propertize " " 'display `(space :align-to (,(nth (1+ c) cc))))))) - (insert (make-string (- (nth c cc) (current-column)) ?\s)) + (insert (make-string (max 1 (- (nth c cc) (current-column))) ?\s)) (when-let ((cell (nth r (nth c columns)))) (insert cell)) (when (= c (1- cs)) @@ -4119,7 +4128,10 @@ we stop there." 'face 'transient-value)) (cl-defmethod transient-prompt ((obj transient-lisp-variable)) - (format "Set %s: " (oref obj variable))) + (if (and (slot-boundp obj 'prompt) + (oref obj prompt)) + (cl-call-next-method obj) + (format "Set %s: " (oref obj variable)))) (defun transient-lisp-variable--reader (prompt initial-input _history) (read--expression prompt initial-input)) diff --git a/lisp/use-package/bind-key.el b/lisp/use-package/bind-key.el index a5d6a5f45bb..0d4c3de5d11 100644 --- a/lisp/use-package/bind-key.el +++ b/lisp/use-package/bind-key.el @@ -447,7 +447,7 @@ This binds keys in such a way that bindings are not overridden by other modes. See `override-global-mode'." (macroexp-progn (bind-keys-form args 'override-global-map))) -(defun get-binding-description (elem) +(defun bind-key--get-binding-description (elem) (cond ((listp elem) (cond @@ -474,7 +474,7 @@ other modes. See `override-global-mode'." (t "#<byte-compiled lambda>"))) -(defun compare-keybindings (l r) +(defun bind-key--compare-keybindings (l r) (let* ((regex bind-key-segregation-regexp) (lgroup (and (string-match regex (caar l)) (match-string 0 (caar l)))) @@ -517,7 +517,7 @@ other modes. See `override-global-mode'." (setq personal-keybindings (sort personal-keybindings (lambda (l r) - (car (compare-keybindings l r)))))) + (car (bind-key--compare-keybindings l r)))))) (if (not (eq (cdar last-binding) (cdar binding))) (princ (format "\n\n%s: %s\n%s\n\n" @@ -525,7 +525,7 @@ other modes. See `override-global-mode'." (make-string (+ 21 (car bind-key-column-widths) (cdr bind-key-column-widths)) ?-))) (if (and last-binding - (cdr (compare-keybindings last-binding binding))) + (cdr (bind-key--compare-keybindings last-binding binding))) (princ "\n"))) (let* ((key-name (caar binding)) @@ -534,10 +534,10 @@ other modes. See `override-global-mode'." (read-kbd-macro key-name))) (command (nth 1 binding)) (was-command (nth 2 binding)) - (command-desc (get-binding-description command)) + (command-desc (bind-key--get-binding-description command)) (was-command-desc (and was-command - (get-binding-description was-command))) - (at-present-desc (get-binding-description at-present))) + (bind-key--get-binding-description was-command))) + (at-present-desc (bind-key--get-binding-description at-present))) (let ((line (format (format "%%-%ds%%-%ds%%s\n" (car bind-key-column-widths) @@ -555,6 +555,11 @@ other modes. See `override-global-mode'." (setq last-binding binding))))) +(define-obsolete-function-alias 'get-binding-description + 'bind-key--get-binding-description "30.1") +(define-obsolete-function-alias 'compare-keybindings + 'bind-key--compare-keybindings "30.1") + (provide 'bind-key) ;; Local Variables: diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 38e9d5f9c91..83138a6d107 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -136,12 +136,19 @@ If nil, use the value of `vc-annotate-switches'. If t, use no switches." ;;;###autoload(put 'vc-git-annotate-switches 'safe-local-variable (lambda (switches) (equal switches "-w"))) (defcustom vc-git-log-switches nil - "String or list of strings specifying switches for Git log under VC." + "String or list of strings giving Git log switches for non-shortlogs." :type '(choice (const :tag "None" nil) (string :tag "Argument String") (repeat :tag "Argument List" :value ("") string)) :version "28.1") +(defcustom vc-git-shortlog-switches nil + "String or list of strings giving Git log switches for shortlogs." + :type '(choice (const :tag "None" nil) + (string :tag "Argument String") + (repeat :tag "Argument List" :value ("") string)) + :version "30.1") + (defcustom vc-git-resolve-conflicts t "When non-nil, mark conflicted file as resolved upon saving. That is performed after all conflict markers in it have been @@ -1325,7 +1332,8 @@ If LIMIT is a revision string, use it as an end-revision." ,(format "--pretty=tformat:%s" (car vc-git-root-log-format)) "--abbrev-commit")) - (ensure-list vc-git-log-switches) + (ensure-list + (if shortlog vc-git-shortlog-switches vc-git-log-switches)) (when (numberp limit) (list "-n" (format "%s" limit))) (when start-revision @@ -1340,16 +1348,16 @@ If LIMIT is a revision string, use it as an end-revision." (defun vc-git-log-outgoing (buffer remote-location) (vc-setup-buffer buffer) - (vc-git-command - buffer 'async nil - "log" - "--no-color" "--graph" "--decorate" "--date=short" - (format "--pretty=tformat:%s" (car vc-git-root-log-format)) - "--abbrev-commit" - (concat (if (string= remote-location "") - "@{upstream}" - remote-location) - "..HEAD"))) + (apply #'vc-git-command buffer 'async nil + `("log" + "--no-color" "--graph" "--decorate" "--date=short" + ,(format "--pretty=tformat:%s" (car vc-git-root-log-format)) + "--abbrev-commit" + ,@(ensure-list vc-git-shortlog-switches) + ,(concat (if (string= remote-location "") + "@{upstream}" + remote-location) + "..HEAD")))) (defun vc-git-log-incoming (buffer remote-location) (vc-setup-buffer buffer) @@ -1359,15 +1367,15 @@ If LIMIT is a revision string, use it as an end-revision." ;; so remove everything except a repository name. (replace-regexp-in-string "/.*" "" remote-location))) - (vc-git-command - buffer 'async nil - "log" - "--no-color" "--graph" "--decorate" "--date=short" - (format "--pretty=tformat:%s" (car vc-git-root-log-format)) - "--abbrev-commit" - (concat "HEAD.." (if (string= remote-location "") - "@{upstream}" - remote-location)))) + (apply #'vc-git-command buffer 'async nil + `("log" + "--no-color" "--graph" "--decorate" "--date=short" + ,(format "--pretty=tformat:%s" (car vc-git-root-log-format)) + "--abbrev-commit" + ,@(ensure-list vc-git-shortlog-switches) + ,(concat "HEAD.." (if (string= remote-location "") + "@{upstream}" + remote-location))))) (defun vc-git-log-search (buffer pattern) "Search the log of changes for PATTERN and output results into BUFFER. @@ -1378,6 +1386,7 @@ Display all entries that match log messages in long format. With a prefix argument, ask for a command to run that will output log entries." (let ((args `("log" "--no-color" "-i" + ,@(ensure-list vc-git-log-switches) ,(format "--grep=%s" (or pattern ""))))) (when current-prefix-arg (setq args (cdr (split-string @@ -1425,11 +1434,11 @@ log entries." `((,log-view-message-re (1 'change-log-acknowledgment))) ;; Handle the case: ;; user: foo@bar - '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)" + '(("^\\(?:Author\\|Commit\\):[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)" (1 'change-log-email)) ;; Handle the case: ;; user: FirstName LastName <foo@bar> - ("^Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]" + ("^\\(?:Author\\|Commit\\):[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]" (1 'change-log-name) (2 'change-log-email)) ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)" @@ -1440,7 +1449,7 @@ log entries." ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)" (1 'change-log-acknowledgment) (2 'change-log-acknowledgment)) - ("^\\(?:Date: \\|AuthorDate: \\)\\(.+\\)" (1 'change-log-date)) + ("^\\(?:Date: \\|AuthorDate: \\|CommitDate: \\)\\(.+\\)" (1 'change-log-date)) ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))) @@ -1462,7 +1471,11 @@ or BRANCH^ (where \"^\" can be repeated)." (defun vc-git-expanded-log-entry (revision) (with-temp-buffer - (apply #'vc-git-command t nil nil (list "log" revision "-1" "--no-color" "--")) + (apply #'vc-git-command t nil nil + `("log" + ,revision + "-1" "--no-color" ,@(ensure-list vc-git-log-switches) + "--")) (goto-char (point-min)) (unless (eobp) ;; Indent the expanded log entry. diff --git a/msdos/sed2v2.inp b/msdos/sed2v2.inp index 4abea2ec597..9e178ac1435 100644 --- a/msdos/sed2v2.inp +++ b/msdos/sed2v2.inp @@ -67,7 +67,7 @@ /^#undef PACKAGE_NAME/s/^.*$/#define PACKAGE_NAME ""/ /^#undef PACKAGE_STRING/s/^.*$/#define PACKAGE_STRING ""/ /^#undef PACKAGE_TARNAME/s/^.*$/#define PACKAGE_TARNAME ""/ -/^#undef PACKAGE_VERSION/s/^.*$/#define PACKAGE_VERSION "29.0.60"/ +/^#undef PACKAGE_VERSION/s/^.*$/#define PACKAGE_VERSION "30.0.50"/ /^#undef SYSTEM_TYPE/s/^.*$/#define SYSTEM_TYPE "ms-dos"/ /^#undef HAVE_DECL_GETENV/s/^.*$/#define HAVE_DECL_GETENV 1/ /^#undef SYS_SIGLIST_DECLARED/s/^.*$/#define SYS_SIGLIST_DECLARED 1/ diff --git a/nt/README.W32 b/nt/README.W32 index 840da905dab..30f33ca706f 100644 --- a/nt/README.W32 +++ b/nt/README.W32 @@ -1,7 +1,7 @@ Copyright (C) 2001-2022 Free Software Foundation, Inc. See the end of the file for license conditions. - Emacs version 29.0.60 for MS-Windows + Emacs version 30.0.50 for MS-Windows This README file describes how to set up and run a precompiled distribution of the latest version of GNU Emacs for MS-Windows. You diff --git a/src/alloc.c b/src/alloc.c index 980085d3292..e443acd72fa 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6220,6 +6220,7 @@ garbage_collect (void) #ifdef HAVE_X_WINDOWS mark_xterm (); + mark_xselect (); #endif #ifdef HAVE_NS @@ -6553,7 +6554,7 @@ mark_buffer (struct buffer *buffer) if (!BUFFER_LIVE_P (buffer)) mark_object (BVAR (buffer, undo_list)); - if (buffer->overlays) + if (!itree_empty_p (buffer->overlays)) mark_overlays (buffer->overlays->root); /* If this is an indirect buffer, mark its base buffer. */ diff --git a/src/buffer.h b/src/buffer.h index 80b3fd81e09..7c3d1903140 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -1266,8 +1266,7 @@ set_buffer_intervals (struct buffer *b, INTERVAL i) INLINE bool buffer_has_overlays (void) { - return current_buffer->overlays - && (current_buffer->overlays->root != NULL); + return !itree_empty_p (current_buffer->overlays); } /* Functions for accessing a character or byte, diff --git a/src/emacs-module.h.in b/src/emacs-module.h.in index bef89b059fc..d485de5aa18 100644 --- a/src/emacs-module.h.in +++ b/src/emacs-module.h.in @@ -183,6 +183,21 @@ struct emacs_env_29 @module_env_snippet_29@ }; +struct emacs_env_30 +{ +@module_env_snippet_25@ + +@module_env_snippet_26@ + +@module_env_snippet_27@ + +@module_env_snippet_28@ + +@module_env_snippet_29@ + +@module_env_snippet_30@ +}; + /* Every module should define a function as follows. */ extern int emacs_module_init (struct emacs_runtime *runtime) EMACS_NOEXCEPT diff --git a/src/frame.c b/src/frame.c index 05106a6c759..7d902dabd4f 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1892,12 +1892,61 @@ other_frames (struct frame *f, bool invisible, bool force) if (f != f1) { + /* The following code is defined out because it is + responsible for a performance drop under X connections + over a network, and its purpose is unclear. XSync does + not handle events (or call any callbacks defined by + Emacs), and as such it should not note any "recent change + in visibility". + + When writing new code, please try as hard as possible to + avoid calls that require a roundtrip to the X server. + When such calls are inevitable, use the XCB library to + handle multiple consecutive requests with a data reply in + a more asynchronous fashion. The following code + demonstrates why: + + rc = XGetWindowProperty (dpyinfo->display, window, ... + status = XGrabKeyboard (dpyinfo->display, ... + + here, `XGetWindowProperty' will wait for a reply from the + X server before returning, and thus allowing Emacs to + make the XGrabKeyboard request, which in itself also + requires waiting a reply. When XCB is available, this + code could be written: + +#ifdef HAVE_XCB + xcb_get_property_cookie_t cookie1; + xcb_get_property_reply_t *reply1; + xcb_grab_keyboard_cookie_t cookie2; + xcb_grab_keyboard_reply_t *reply2; + + cookie1 = xcb_get_property (dpyinfo->xcb_connection, window, ... + cookie2 = xcb_grab_keyboard (dpyinfo->xcb_connection, ... + reply1 = xcb_get_property_reply (dpyinfo->xcb_connection, + cookie1); + reply2 = xcb_grab_keyboard_reply (dpyinfo->xcb_connection, + cookie2); +#endif + + In this code, the GetProperty and GrabKeyboard requests + are made simultaneously, and replies are then obtained + from the server at once, avoiding the extraneous + roundtrip to the X server after the call to + `XGetWindowProperty'. + + However, please keep an alternative implementation + available for use when Emacs is built without XCB. */ + +#if 0 /* Verify that we can still talk to the frame's X window, and note any recent change in visibility. */ #ifdef HAVE_X_WINDOWS if (FRAME_WINDOW_P (f1)) x_sync (f1); #endif +#endif + if (!FRAME_TOOLTIP_P (f1) /* Tooltips and child frames count neither for invisibility nor for deletions. */ diff --git a/src/frame.h b/src/frame.h index d6fd62b2ac2..dcd32036b86 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1718,7 +1718,6 @@ extern void x_wm_set_icon_position (struct frame *, int, int); #if !defined USE_X_TOOLKIT extern const char *x_get_resource_string (const char *, const char *); #endif -extern void x_sync (struct frame *); #endif /* HAVE_X_WINDOWS */ #if !defined (HAVE_NS) && !defined (HAVE_PGTK) diff --git a/src/gtkutil.c b/src/gtkutil.c index a6bba096a43..592bb497749 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -2103,7 +2103,7 @@ xg_frame_restack (struct frame *f1, struct frame *f2, bool above_flag) gdk_window_restack (gwin1, gwin2, above_flag); #ifndef HAVE_PGTK - x_sync (f1); + XSync (FRAME_X_DISPLAY (f1), False); #else gdk_flush (); #endif @@ -4793,7 +4793,7 @@ xg_update_scrollbar_pos (struct frame *f, here to get some events. */ #ifndef HAVE_PGTK - x_sync (f); + XSync (FRAME_X_DISPLAY (f), False); #else gdk_flush (); #endif @@ -4894,7 +4894,7 @@ xg_update_horizontal_scrollbar_pos (struct frame *f, } #ifndef HAVE_PGTK - x_sync (f); + XSync (FRAME_X_DISPLAY (f), False); #else gdk_flush (); #endif diff --git a/src/itree.h b/src/itree.h index c0c7060ac71..f1e2bf3bfde 100644 --- a/src/itree.h +++ b/src/itree.h @@ -25,6 +25,8 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #include "lisp.h" +INLINE_HEADER_BEGIN + /* The tree and node structs are mainly here, so they can be allocated. @@ -114,6 +116,11 @@ extern void itree_node_set_region (struct itree_tree *, struct itree_node *, ptrdiff_t, ptrdiff_t); extern struct itree_tree *itree_create (void); extern void itree_destroy (struct itree_tree *); +INLINE bool +itree_empty_p (struct itree_tree *tree) +{ + return !tree || !tree->root; +} extern intmax_t itree_size (struct itree_tree *); extern void itree_clear (struct itree_tree *); extern void itree_insert (struct itree_tree *, struct itree_node *, @@ -178,4 +185,6 @@ struct itree_iterator #define ITREE_FOREACH_NARROW(beg, end) \ itree_iterator_narrow (itree_iter_, beg, end) +INLINE_HEADER_END + #endif diff --git a/src/module-env-29.h b/src/module-env-29.h index 6ca03773181..e69de29bb2d 100644 --- a/src/module-env-29.h +++ b/src/module-env-29.h @@ -1,3 +0,0 @@ - /* Add module environment functions newly added in Emacs 29 here. - Before Emacs 29 is released, remove this comment and start - module-env-30.h on the master branch. */ diff --git a/src/module-env-30.h b/src/module-env-30.h new file mode 100644 index 00000000000..6ca03773181 --- /dev/null +++ b/src/module-env-30.h @@ -0,0 +1,3 @@ + /* Add module environment functions newly added in Emacs 29 here. + Before Emacs 29 is released, remove this comment and start + module-env-30.h on the master branch. */ diff --git a/src/nsterm.m b/src/nsterm.m index c09f743ec7f..507f2a9e7da 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -6703,16 +6703,8 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action) - (void)resetCursorRects { - NSRect visible; - NSCursor *currentCursor; - - /* On macOS 13, [resetCursorRects:] could be called even after the - window is closed. */ - if (! emacsframe || ! FRAME_OUTPUT_DATA (emacsframe)) - return; - - visible = [self visibleRect]; - currentCursor = FRAME_POINTER_TYPE (emacsframe); + NSRect visible = [self visibleRect]; + NSCursor *currentCursor = FRAME_POINTER_TYPE (emacsframe); NSTRACE ("[EmacsView resetCursorRects]"); if (currentCursor == nil) diff --git a/src/pdumper.c b/src/pdumper.c index 263343f60be..e1c55d07ac3 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2862,7 +2862,7 @@ dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer) DUMP_FIELD_COPY (out, buffer, inhibit_buffer_hooks); DUMP_FIELD_COPY (out, buffer, long_line_optimizations_p); - if (buffer->overlays && buffer->overlays->root != NULL) + if (!itree_empty_p (buffer->overlays)) /* We haven't implemented the code to dump overlays. */ emacs_abort (); else diff --git a/src/xdisp.c b/src/xdisp.c index d14cd468191..66584e4d73a 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -26311,16 +26311,17 @@ display_menu_bar (struct window *w) it.first_visible_x = 0; it.last_visible_x = FRAME_PIXEL_WIDTH (f); #elif defined (HAVE_X_WINDOWS) /* X without toolkit. */ + struct window *menu_window = NULL; + struct face *face = FACE_FROM_ID (f, MENU_FACE_ID); + if (FRAME_WINDOW_P (f)) { /* Menu bar lines are displayed in the desired matrix of the dummy window menu_bar_window. */ - struct window *menu_w; - menu_w = XWINDOW (f->menu_bar_window); - init_iterator (&it, menu_w, -1, -1, menu_w->desired_matrix->rows, + menu_window = XWINDOW (f->menu_bar_window); + init_iterator (&it, menu_window, -1, -1, + menu_window->desired_matrix->rows, MENU_FACE_ID); - it.first_visible_x = 0; - it.last_visible_x = FRAME_PIXEL_WIDTH (f); } else #endif /* not USE_X_TOOLKIT and not USE_GTK */ @@ -26374,6 +26375,50 @@ display_menu_bar (struct window *w) /* Compute the total height of the lines. */ compute_line_metrics (&it); + it.glyph_row->full_width_p = true; + it.glyph_row->continued_p = false; + it.glyph_row->truncated_on_left_p = false; + it.glyph_row->truncated_on_right_p = false; + +#if defined (HAVE_X_WINDOWS) && !defined (USE_X_TOOLKIT) && !defined (USE_GTK) + /* Make a 3D menu bar have a shadow at its right end. */ + extend_face_to_end_of_line (&it); + if (face->box != FACE_NO_BOX) + { + struct glyph *last = (it.glyph_row->glyphs[TEXT_AREA] + + it.glyph_row->used[TEXT_AREA] - 1); + int box_thickness = face->box_vertical_line_width; + last->right_box_line_p = true; + /* Add back the space for the right box line we subtracted in + init_iterator, since the right_box_line_p flag will make the + glyph wider. We actually add only as much space as is + available for the last glyph of the menu bar and whatever + space is left beyond it, since that glyph could be only + partially visible. */ + if (box_thickness > 0) + last->pixel_width += max (0, (box_thickness + - (it.current_x - it.last_visible_x))); + } + + /* With the non-toolkit version, modify the menu bar window height + accordingly. */ + if (FRAME_WINDOW_P (it.f) && menu_window) + { + struct glyph_row *row; + int delta_height; + + row = it.glyph_row; + delta_height + = ((row->y + row->height) + - WINDOW_BOX_HEIGHT_NO_MODE_LINE (menu_window)); + + if (delta_height != 0) + { + FRAME_MENU_BAR_HEIGHT (it.f) += delta_height; + adjust_frame_size (it.f, -1, -1, 3, false, Qmenu_bar_lines); + } + } +#endif } /* Deep copy of a glyph row, including the glyphs. */ diff --git a/src/xfns.c b/src/xfns.c index 36b51a30112..2bf282fd243 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -43,7 +43,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #ifdef USE_XCB #include <xcb/xcb.h> #include <xcb/xproto.h> -#include <xcb/xcb_aux.h> #endif #include "bitmaps/gray.xbm" @@ -2643,12 +2642,18 @@ append_wm_protocols (struct x_display_info *dpyinfo, if (existing) XFree (existing); - if (!found_wm_ping) - protos[num_protos++] = dpyinfo->Xatom_net_wm_ping; + if (!dpyinfo->untrusted) + { + /* Untrusted clients cannot use these protocols which require + communicating with the window manager. */ + + if (!found_wm_ping) + protos[num_protos++] = dpyinfo->Xatom_net_wm_ping; #if !defined HAVE_GTK3 && defined HAVE_XSYNC - if (!found_wm_sync_request && dpyinfo->xsync_supported_p) - protos[num_protos++] = dpyinfo->Xatom_net_wm_sync_request; + if (!found_wm_sync_request && dpyinfo->xsync_supported_p) + protos[num_protos++] = dpyinfo->Xatom_net_wm_sync_request; #endif + } if (num_protos) XChangeProperty (dpyinfo->display, @@ -5723,13 +5728,13 @@ x_get_net_workarea (struct x_display_info *dpyinfo, XRectangle *rect) = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) dpyinfo->root_window, (xcb_atom_t) dpyinfo->Xatom_net_current_desktop, - XCB_ATOM_CARDINAL, 0, 1); + XA_CARDINAL, 0, 1); workarea_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) dpyinfo->root_window, (xcb_atom_t) dpyinfo->Xatom_net_workarea, - XCB_ATOM_CARDINAL, 0, UINT32_MAX); + XA_CARDINAL, 0, UINT32_MAX); reply = xcb_get_property_reply (dpyinfo->xcb_connection, current_desktop_cookie, &error); @@ -5740,7 +5745,7 @@ x_get_net_workarea (struct x_display_info *dpyinfo, XRectangle *rect) else { if (xcb_get_property_value_length (reply) != 4 - || reply->type != XCB_ATOM_CARDINAL || reply->format != 32) + || reply->type != XA_CARDINAL || reply->format != 32) rc = false; else current_workspace = *(uint32_t *) xcb_get_property_value (reply); @@ -5755,7 +5760,7 @@ x_get_net_workarea (struct x_display_info *dpyinfo, XRectangle *rect) free (error), rc = false; else { - if (rc && reply->type == XCB_ATOM_CARDINAL && reply->format == 32 + if (rc && reply->type == XA_CARDINAL && reply->format == 32 && (xcb_get_property_value_length (reply) / sizeof (uint32_t) >= current_workspace + 4)) { @@ -7079,8 +7084,8 @@ that mouse buttons are being held down, such as immediately after a /* Catch errors since interning lots of targets can potentially generate a BadAlloc error. */ x_catch_errors (FRAME_X_DISPLAY (f)); - XInternAtoms (FRAME_X_DISPLAY (f), target_names, - ntargets, False, target_atoms); + x_intern_atoms (FRAME_DISPLAY_INFO (f), target_names, + ntargets, target_atoms); x_check_errors (FRAME_X_DISPLAY (f), "Failed to intern target atoms: %s"); x_uncatch_errors_after_check (); @@ -7377,20 +7382,6 @@ If TERMINAL is omitted or nil, that stands for the selected frame's display. */ return Qnil; } -/* Wait for responses to all X commands issued so far for frame F. */ - -void -x_sync (struct frame *f) -{ - block_input (); -#ifndef USE_XCB - XSync (FRAME_X_DISPLAY (f), False); -#else - xcb_aux_sync (FRAME_DISPLAY_INFO (f)->xcb_connection); -#endif - unblock_input (); -} - /*********************************************************************** Window properties @@ -7484,7 +7475,7 @@ silently ignored. */) elsize = element_format == 32 ? sizeof (long) : element_format >> 3; data = xnmalloc (nelements, elsize); - x_fill_property_data (FRAME_X_DISPLAY (f), value, data, nelements, + x_fill_property_data (FRAME_DISPLAY_INFO (f), value, data, nelements, element_format); } else diff --git a/src/xftfont.c b/src/xftfont.c index 6043ef9f94f..b9686db2a73 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -628,6 +628,12 @@ xftfont_shape (Lisp_Object lgstring, Lisp_Object direction) static int xftfont_end_for_frame (struct frame *f) { + /* XftDrawDestroy tries to access dpyinfo->display, which could've + been destroyed by now, causing Emacs to crash. The alternative + is to leak the XftDraw, but that's better than a crash. */ + if (!FRAME_X_DISPLAY (f)) + return 0; + block_input (); XftDraw *xft_draw; diff --git a/src/xselect.c b/src/xselect.c index 844ef7220a9..191f0770337 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -16,7 +16,6 @@ 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/>. */ - /* Rewritten by jwz */ #include <config.h> @@ -44,7 +43,7 @@ struct prop_location; struct selection_data; static void x_decline_selection_request (struct selection_input_event *); -static bool x_convert_selection (Lisp_Object, Lisp_Object, Atom, bool, +static bool x_convert_selection (Lisp_Object, Lisp_Object, Atom, struct x_display_info *, bool); static bool waiting_for_other_props_on_window (Display *, Window); static struct prop_location *expect_property_change (Display *, Window, @@ -77,18 +76,20 @@ static void x_send_client_event (Lisp_Object, Lisp_Object, Lisp_Object, #define TRACE0(fmt) (void) 0 #define TRACE1(fmt, a0) (void) 0 #define TRACE2(fmt, a0, a1) (void) 0 +#define TRACE3(fmt, a0, a1, a2) (void) 0 #endif /* Bytes needed to represent 'long' data. This is as per libX11; it is not necessarily sizeof (long). */ #define X_LONG_SIZE 4 -/* If this is a smaller number than the max-request-size of the display, - emacs will use INCR selection transfer when the selection is larger - than this. The max-request-size is usually around 64k, so if you want - emacs to use incremental selection transfers when the selection is - smaller than that, set this. I added this mostly for debugging the - incremental transfer stuff, but it might improve server performance. +/* If this is a smaller number than the max-request-size of the + display, Emacs will use INCR selection transfer when the selection + is larger than this. The max-request-size is usually around 64k, + so if you want emacs to use incremental selection transfers when + the selection is smaller than that, set this. I added this mostly + for debugging the incremental transfer stuff, but it might improve + server performance. This value cannot exceed INT_MAX / max (X_LONG_SIZE, sizeof (long)) because it is multiplied by X_LONG_SIZE and by sizeof (long) in @@ -101,7 +102,9 @@ static void x_send_client_event (Lisp_Object, Lisp_Object, Lisp_Object, static int selection_quantum (Display *display) { - long mrs = XExtendedMaxRequestSize (display); + long mrs; + + mrs = XExtendedMaxRequestSize (display); if (!mrs) mrs = XMaxRequestSize (display); @@ -281,10 +284,8 @@ x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value, timestamp = dpyinfo->last_user_time; block_input (); - x_catch_errors (display); - XSetSelectionOwner (display, selection_atom, selecting_window, timestamp); - x_check_errors (display, "Can't set selection: %s"); - x_uncatch_errors_after_check (); + XSetSelectionOwner (display, selection_atom, selecting_window, + timestamp); unblock_input (); /* Now update the local cache */ @@ -472,19 +473,62 @@ x_decline_selection_request (struct selection_input_event *event) struct selection_data { + /* Pointer to the selection data. */ unsigned char *data; + + /* A Lisp_Object containing the selection data. This is either + Qnil, or `data' is NULL. If non-nil, then this must be a string + whose contents will be written out verbatim. */ + Lisp_Object string; + + /* The size, in number of items, of the selection data. + The value is meaningless if string is non-nil. */ ptrdiff_t size; + + /* The format of the selection data. */ int format; + + /* The type of the selection data. */ Atom type; - bool nofree; + + /* The property describing the selection data. */ Atom property; - /* This can be set to non-NULL during x_reply_selection_request, if - the selection is waiting for an INCR transfer to complete. Don't - free these; that's done by unexpect_property_change. */ - struct prop_location *wait_object; + + /* The next piece of selection data in the current selection request + stack frame. This can be NULL. */ struct selection_data *next; }; +/* Structure representing a single outstanding selection request (or + subrequest if MULTIPLE is being used.) */ + +struct transfer +{ + /* The requestor of this transfer. */ + Window requestor; + + /* The current offset in items into the selection data, and the + number of items to send with each ChangeProperty request. */ + size_t offset, items_per_request; + + /* The display info associated with the transfer. */ + struct x_display_info *dpyinfo; + + /* The converted selection data. */ + struct selection_data data; + + /* The next and last selection transfers on this list. */ + struct transfer *next, *last; + + /* The atimer for the timeout. */ + struct atimer *timeout; + + /* Flags. */ + int flags; +}; + +#define SELECTED_EVENTS 1 + struct x_selection_request { /* The last element in this stack. */ @@ -499,9 +543,6 @@ struct x_selection_request /* Linked list of the above (in support of MULTIPLE targets). */ struct selection_data *converted_selections; - /* "Data" to send a requestor for a failed MULTIPLE subtarget. */ - Atom conversion_fail_tag; - /* Whether or not conversion was successful. */ bool converted; }; @@ -511,6 +552,46 @@ struct x_selection_request struct x_selection_request *selection_request_stack; +/* List of all outstanding selection transfers which are currently + being processed. */ + +struct transfer outstanding_transfers; + + + +struct prop_location +{ + int identifier; + Display *display; + Window window; + Atom property; + int desired_state; + bool arrived; + struct prop_location *next; +}; + +static int prop_location_identifier; + +static Lisp_Object property_change_reply; + +static struct prop_location *property_change_reply_object; + +static struct prop_location *property_change_wait_list; + +static void +set_property_change_object (struct prop_location *location) +{ + /* Input must be blocked so we don't get the event before we set + these. */ + if (! input_blocked_p ()) + emacs_abort (); + + XSETCAR (property_change_reply, Qnil); + property_change_reply_object = location; +} + + + static void x_push_current_selection_request (struct selection_input_event *se, struct x_display_info *dpyinfo) @@ -523,7 +604,6 @@ x_push_current_selection_request (struct selection_input_event *se, frame->request = se; frame->dpyinfo = dpyinfo; frame->converted_selections = NULL; - frame->conversion_fail_tag = None; selection_request_stack = frame; } @@ -554,7 +634,7 @@ x_selection_request_lisp_error (void) for (cs = frame->converted_selections; cs; cs = next) { next = cs->next; - if (! cs->nofree && cs->data) + if (cs->data) xfree (cs->data); xfree (cs); } @@ -564,250 +644,404 @@ x_selection_request_lisp_error (void) x_decline_selection_request (frame->request); } -static void -x_catch_errors_unwind (void) + + +static size_t +c_size_for_format (int format) { - block_input (); - x_uncatch_errors (); - unblock_input (); + switch (format) + { + case 8: + return sizeof (char); + + case 16: + return sizeof (short); + + case 32: + return sizeof (long); + } + + emacs_abort (); } - -/* This stuff is so that INCR selections are reentrant (that is, so we can - be servicing multiple INCR selection requests simultaneously.) I haven't - actually tested that yet. */ +static size_t +x_size_for_format (int format) +{ + switch (format) + { + case 8: + return 1; -/* Keep a list of the property changes that are awaited. */ + case 16: + return 2; -struct prop_location + case 32: + return 4; + } + + emacs_abort (); +} + +/* Return a pointer to the remaining part of the selection data, given + a pointer to a struct selection_data and an offset in items. Place + the number of items remaining in REMAINING. Garbage collection + must not happen, or the returned pointer becomes invalid. */ + +static unsigned char * +selection_data_for_offset (struct selection_data *data, + long offset, size_t *remaining) { - int identifier; - Display *display; - Window window; - Atom property; - int desired_state; - bool arrived; - struct prop_location *next; -}; + unsigned char *base; + size_t size; -static int prop_location_identifier; + if (!NILP (data->string)) + { + base = SDATA (data->string); + size = SBYTES (data->string); + } + else + { + base = data->data; + size = data->size; + } -static Lisp_Object property_change_reply; + if (offset >= size) + { + *remaining = 0; + return NULL; + } -static struct prop_location *property_change_reply_object; + base += (offset * c_size_for_format (data->format)); + *remaining = size - offset; + return base; +} -static struct prop_location *property_change_wait_list; +/* Return the size, in bytes transferred to the X server, of + data->size items of selection data in data->format-bit + quantities. */ -static void -set_property_change_object (struct prop_location *location) +static size_t +selection_data_size (struct selection_data *data) { - /* Input must be blocked so we don't get the event before we set these. */ - if (! input_blocked_p ()) - emacs_abort (); - XSETCAR (property_change_reply, Qnil); - property_change_reply_object = location; + size_t scratch; + + if (!NILP (data->string)) + return SBYTES (data->string); + + switch (data->format) + { + case 8: + return (size_t) data->size; + + case 16: + if (INT_MULTIPLY_WRAPV (data->size, 2, &scratch)) + return SIZE_MAX; + + return scratch; + + case 32: + if (INT_MULTIPLY_WRAPV (data->size, 4, &scratch)) + return SIZE_MAX; + + return scratch; + } + + /* The specified format is invalid. */ + emacs_abort (); } - -/* Send the reply to a selection request event EVENT. */ +/* Return whether or not another outstanding selection transfer is + still selecting for events on the specified requestor window. */ -#ifdef TRACE_SELECTION -static int x_reply_selection_request_cnt; -#endif /* TRACE_SELECTION */ +static bool +transfer_selecting_event (struct x_display_info *dpyinfo, + Window requestor) +{ + struct transfer *next; + + next = outstanding_transfers.next; + for (; next != &outstanding_transfers; next = next->next) + { + if (next->requestor == requestor + && next->dpyinfo == dpyinfo) + return true; + } + + return false; +} + +/* Cancel the specified selection transfer. When called by + `start_transfer', the transfer may be partially formed. */ static void -x_reply_selection_request (struct selection_input_event *event, - struct x_display_info *dpyinfo) +x_cancel_selection_transfer (struct transfer *transfer) { - XEvent reply_base; - XSelectionEvent *reply = &(reply_base.xselection); - Display *display = SELECTION_EVENT_DISPLAY (event); - Window window = SELECTION_EVENT_REQUESTOR (event); - ptrdiff_t bytes_remaining; - int max_bytes = selection_quantum (display); - specpdl_ref count = SPECPDL_INDEX (); - struct selection_data *cs; - struct x_selection_request *frame; + xfree (transfer->data.data); - frame = selection_request_stack; + if (transfer->next) + { + transfer->next->last = transfer->last; + transfer->last->next = transfer->next; + } - reply->type = SelectionNotify; - reply->display = display; - reply->requestor = window; - reply->selection = SELECTION_EVENT_SELECTION (event); - reply->time = SELECTION_EVENT_TIME (event); - reply->target = SELECTION_EVENT_TARGET (event); - reply->property = SELECTION_EVENT_PROPERTY (event); - if (reply->property == None) - reply->property = reply->target; + if (transfer->flags & SELECTED_EVENTS + && !transfer_selecting_event (transfer->dpyinfo, + transfer->requestor) + /* This can be called from x_delete_display. */ + && transfer->dpyinfo->display) + { + /* Ignore errors generated by the change window request in case + the window has gone away. */ + block_input (); + x_ignore_errors_for_next_request (transfer->dpyinfo); + XSelectInput (transfer->dpyinfo->display, + transfer->requestor, NoEventMask); + x_stop_ignoring_errors (transfer->dpyinfo); + unblock_input (); + } - block_input (); - /* The protected block contains wait_for_property_change, which can - run random lisp code (process handlers) or signal. Therefore, we - put the x_uncatch_errors call in an unwind. */ - record_unwind_protect_void (x_catch_errors_unwind); - x_catch_errors (display); + cancel_atimer (transfer->timeout); + xfree (transfer); +} - /* Loop over converted selections, storing them in the requested - properties. If data is large, only store the first N bytes - (section 2.7.2 of ICCCM). Note that we store the data for a - MULTIPLE request in the opposite order; the ICCM says only that - the conversion itself must be done in the same order. */ - for (cs = frame->converted_selections; cs; cs = cs->next) - { - if (cs->property == None) - continue; +static void +x_selection_transfer_timeout (struct atimer *atimer) +{ + struct transfer *transfer; - bytes_remaining = cs->size; - bytes_remaining *= cs->format >> 3; - if (bytes_remaining <= max_bytes) - { - /* Send all the data at once, with minimal handshaking. */ - TRACE1 ("Sending all %"pD"d bytes", bytes_remaining); - XChangeProperty (display, window, cs->property, - cs->type, cs->format, PropModeReplace, - cs->data, cs->size); - } - else - { - /* Send an INCR tag to initiate incremental transfer. */ - long value[1]; - - TRACE2 ("Start sending %"pD"d bytes incrementally (%s)", - bytes_remaining, XGetAtomName (display, cs->property)); - cs->wait_object - = expect_property_change (display, window, cs->property, - PropertyDelete); - - /* XChangeProperty expects an array of long even if long is - more than 32 bits. */ - value[0] = min (bytes_remaining, X_LONG_MAX); - XChangeProperty (display, window, cs->property, - dpyinfo->Xatom_INCR, 32, PropModeReplace, - (unsigned char *) value, 1); - XSelectInput (display, window, PropertyChangeMask); - } + transfer = atimer->client_data; + x_cancel_selection_transfer (transfer); +} + +/* Start a selection transfer to write the specified selection data to + its requestor. If the data is small enough, write it to the + requestor window and return. Otherwise, start INCR transfer and + begin listening for PropertyNotify events on the requestor. */ + +static void +x_start_selection_transfer (struct x_display_info *dpyinfo, Window requestor, + struct selection_data *data) +{ + struct transfer *transfer; + intmax_t timeout; + intmax_t secs; + int nsecs; + size_t remaining, max_size; + unsigned char *xdata; + unsigned long data_size; + + timeout = max (0, x_selection_timeout); + secs = timeout / 1000; + nsecs = (timeout % 1000) * 1000000; + + transfer = xzalloc (sizeof *transfer); + transfer->requestor = requestor; + transfer->dpyinfo = dpyinfo; + + transfer->timeout = start_atimer (ATIMER_RELATIVE, + make_timespec (secs, nsecs), + x_selection_transfer_timeout, + transfer); + + /* Note that DATA is copied into transfer. DATA->data is then set + to NULL, giving the struct transfer ownership over the selection + data. */ + + transfer->data = *data; + data->data = NULL; + + /* Finally, transfer now holds a reference to data->string, if it is + present. GC cannot be allowed to happen until this function + returns. */ + data->string = Qnil; + + /* Now, try to write the selection data. If it is bigger than + selection_quantum (dpyinfo->display), start incremental transfer + and link the transfer onto the list of pending selections. + Otherwise, write the transfer at once. */ + + max_size = selection_quantum (dpyinfo->display); + + TRACE3 (" x_start_selection_transfer: transferring to 0x%lx. " + "transfer consists of %zu bytes, quantum being %zu", + requestor, selection_data_size (&transfer->data), + max_size); + + if (selection_data_size (&transfer->data) > max_size) + { + /* Begin incremental selection transfer. First, calculate how + many elements it is ok to write for every ChangeProperty + request. */ + transfer->items_per_request + = (max_size / x_size_for_format (transfer->data.format)); + TRACE1 (" x_start_selection_transfer: starting incremental" + " selection transfer, with %zu items per request", + transfer->items_per_request); + + /* Next, link the transfer onto the list of pending selection + transfers. */ + transfer->next = outstanding_transfers.next; + transfer->last = &outstanding_transfers; + transfer->next->last = transfer; + transfer->last->next = transfer; + + /* Now, write the INCR property to begin incremental selection + transfer. offset is currently 0. */ + + data_size = selection_data_size (&transfer->data); + + x_ignore_errors_for_next_request (dpyinfo); + XChangeProperty (dpyinfo->display, requestor, + transfer->data.property, + dpyinfo->Xatom_INCR, 32, PropModeReplace, + (unsigned char *) &data_size, 1); + + /* This assumes that Emacs is not selecting for any other events + from the requestor! + + If the holder of some manager selections (i.e. the settings + manager) asks Emacs for selection data, things will subtly go + wrong. */ + XSelectInput (dpyinfo->display, requestor, PropertyChangeMask); + transfer->flags |= SELECTED_EVENTS; + x_stop_ignoring_errors (dpyinfo); + } + else + { + /* Write the property data now. */ + xdata = selection_data_for_offset (&transfer->data, + 0, &remaining); + eassert (remaining <= INT_MAX); + + TRACE1 (" x_start_selection_transfer: writing" + " %zu elements directly to requestor window", + remaining); + + x_ignore_errors_for_next_request (dpyinfo); + XChangeProperty (dpyinfo->display, requestor, + transfer->data.property, + transfer->data.type, + transfer->data.format, + PropModeReplace, xdata, remaining); + x_stop_ignoring_errors (dpyinfo); + + /* Next, get rid of the transfer. */ + x_cancel_selection_transfer (transfer); } +} - /* Now issue the SelectionNotify event. */ - XSendEvent (display, window, False, 0, &reply_base); - XFlush (display); +/* Write out the next piece of data that is part of the specified + selection transfer. If no more data remains to be written, write + the EOF property and complete the transfer. */ -#ifdef TRACE_SELECTION - { - char *sel = XGetAtomName (display, reply->selection); - char *tgt = XGetAtomName (display, reply->target); - TRACE3 ("Sent SelectionNotify: %s, target %s (%d)", - sel, tgt, ++x_reply_selection_request_cnt); - if (sel) XFree (sel); - if (tgt) XFree (tgt); - } -#endif /* TRACE_SELECTION */ +static void +x_continue_selection_transfer (struct transfer *transfer) +{ + size_t remaining; + unsigned char *xdata; - /* Finish sending the rest of each of the INCR values. This should - be improved; there's a chance of deadlock if more than one - subtarget in a MULTIPLE selection requires an INCR transfer, and - the requestor and Emacs loop waiting on different transfers. */ - for (cs = frame->converted_selections; cs; cs = cs->next) - if (cs->wait_object) - { - int format_bytes = cs->format / 8; - bool had_errors_p = x_had_errors_p (display); + xdata = selection_data_for_offset (&transfer->data, + transfer->offset, + &remaining); + remaining = min (remaining, transfer->items_per_request); - /* Must set this inside block_input (). unblock_input may read - events and setting property_change_reply in - wait_for_property_change is then too late. */ - set_property_change_object (cs->wait_object); - unblock_input (); + if (!remaining) + { + /* The transfer is finished. Write zero-length property data to + signal EOF and remove the transfer. */ + TRACE0 (" x_continue_selection_transfer: writing 0 items to" + " indicate EOF"); + x_ignore_errors_for_next_request (transfer->dpyinfo); + XChangeProperty (transfer->dpyinfo->display, + transfer->requestor, + transfer->data.property, + transfer->data.type, + transfer->data.format, + PropModeReplace, + NULL, 0); + x_stop_ignoring_errors (transfer->dpyinfo); + TRACE0 (" x_continue_selection_transfer: done sending incrementally"); + + x_cancel_selection_transfer (transfer); + } + else + { + TRACE2 (" x_continue_selection_transfer: writing %zu items" + "; current offset is %zu", remaining, transfer->offset); + eassert (remaining <= INT_MAX); + + x_ignore_errors_for_next_request (transfer->dpyinfo); + XChangeProperty (transfer->dpyinfo->display, + transfer->requestor, + transfer->data.property, + transfer->data.type, + transfer->data.format, + PropModeReplace, xdata, + remaining); + x_stop_ignoring_errors (transfer->dpyinfo); + transfer->offset += remaining; + } +} - bytes_remaining = cs->size; - bytes_remaining *= format_bytes; +void +x_remove_selection_transfers (struct x_display_info *dpyinfo) +{ + struct transfer *next, *last; - /* Wait for the requestor to ack by deleting the property. - This can run Lisp code (process handlers) or signal. */ - if (! had_errors_p) - { - TRACE1 ("Waiting for ACK (deletion of %s)", - XGetAtomName (display, cs->property)); - wait_for_property_change (cs->wait_object); - } - else - unexpect_property_change (cs->wait_object); + next = outstanding_transfers.next; + while (next != &outstanding_transfers) + { + last = next; + next = next->next; - while (bytes_remaining) - { - int i = ((bytes_remaining < max_bytes) - ? bytes_remaining - : max_bytes) / format_bytes; - block_input (); - - cs->wait_object - = expect_property_change (display, window, cs->property, - PropertyDelete); - - TRACE1 ("Sending increment of %d elements", i); - TRACE1 ("Set %s to increment data", - XGetAtomName (display, cs->property)); - - /* Append the next chunk of data to the property. */ - XChangeProperty (display, window, cs->property, - cs->type, cs->format, PropModeAppend, - cs->data, i); - bytes_remaining -= i * format_bytes; - cs->data += i * ((cs->format == 32) ? sizeof (long) - : format_bytes); - XFlush (display); - had_errors_p = x_had_errors_p (display); - /* See comment above about property_change_reply. */ - set_property_change_object (cs->wait_object); - unblock_input (); - - if (had_errors_p) break; - - /* Wait for the requestor to ack this chunk by deleting - the property. This can run Lisp code or signal. */ - TRACE1 ("Waiting for increment ACK (deletion of %s)", - XGetAtomName (display, cs->property)); - wait_for_property_change (cs->wait_object); - } + if (last->dpyinfo == dpyinfo) + x_cancel_selection_transfer (last); + } +} - /* Now write a zero-length chunk to the property to tell the - requestor that we're done. */ - block_input (); - if (! waiting_for_other_props_on_window (display, window)) - XSelectInput (display, window, 0); - - TRACE1 ("Set %s to a 0-length chunk to indicate EOF", - XGetAtomName (display, cs->property)); - XChangeProperty (display, window, cs->property, - cs->type, cs->format, PropModeReplace, - cs->data, 0); - TRACE0 ("Done sending incrementally"); - } +/* Send the reply to a selection request event EVENT. */ - /* rms, 2003-01-03: I think I have fixed this bug. */ - /* The window we're communicating with may have been deleted - in the meantime (that's a real situation from a bug report). - In this case, there may be events in the event queue still - referring to the deleted window, and we'll get a BadWindow error - in XTread_socket when processing the events. I don't have - an idea how to fix that. gerd, 2001-01-98. */ - /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are - delivered before uncatch errors. */ - XSync (display, False); - unblock_input (); +static void +x_reply_selection_request (struct selection_input_event *event, + struct x_display_info *dpyinfo) +{ + XEvent message; + struct selection_data *cs; + struct x_selection_request *frame; - /* GTK queues events in addition to the queue in Xlib. So we - UNBLOCK to enter the event loop and get possible errors delivered, - and then BLOCK again because x_uncatch_errors requires it. */ block_input (); - /* This calls x_uncatch_errors. */ - unbind_to (count, Qnil); + frame = selection_request_stack; + + message.xselection.type = SelectionNotify; + message.xselection.display = dpyinfo->display; + message.xselection.requestor = SELECTION_EVENT_REQUESTOR (event); + message.xselection.selection = SELECTION_EVENT_SELECTION (event); + message.xselection.time = SELECTION_EVENT_TIME (event); + message.xselection.target = SELECTION_EVENT_TARGET (event); + message.xselection.property = SELECTION_EVENT_PROPERTY (event); + + if (message.xselection.property == None) + message.xselection.property = message.xselection.target; + + /* For each of the converted selections, start a write transfer from + Emacs to the requestor. */ + for (cs = frame->converted_selections; cs; cs = cs->next) + x_start_selection_transfer (dpyinfo, + SELECTION_EVENT_REQUESTOR (event), + cs); + + + /* Send the SelectionNotify event to the requestor, telling it that + the property data has arrived. */ + x_ignore_errors_for_next_request (dpyinfo); + XSendEvent (dpyinfo->display, SELECTION_EVENT_REQUESTOR (event), + False, NoEventMask, &message); + x_stop_ignoring_errors (dpyinfo); unblock_input (); } - -/* Handle a SelectionRequest event EVENT. - This is called from keyboard.c when such an event is found in the queue. */ + +/* Handle a SelectionRequest event EVENT. This is called from + keyboard.c when such an event is found in the queue. */ static void x_handle_selection_request (struct selection_input_event *event) @@ -892,7 +1126,9 @@ x_handle_selection_request (struct selection_input_event *event) ptrdiff_t j, nselections; struct selection_data cs; - if (property == None) goto DONE; + if (property == None) + goto DONE; + multprop = x_get_window_property_as_lisp_data (dpyinfo, requestor, property, QMULTIPLE, selection, true); @@ -904,23 +1140,24 @@ x_handle_selection_request (struct selection_input_event *event) /* Perform conversions. This can signal. */ for (j = 0; j < nselections; j++) { - Lisp_Object subtarget = AREF (multprop, 2*j); + Lisp_Object subtarget = AREF (multprop, 2 * j); Atom subproperty = symbol_to_x_atom (dpyinfo, AREF (multprop, 2*j+1)); bool subsuccess = false; if (subproperty != None) subsuccess = x_convert_selection (selection_symbol, subtarget, - subproperty, true, dpyinfo, + subproperty, dpyinfo, use_alternate); if (!subsuccess) - ASET (multprop, 2*j+1, Qnil); + ASET (multprop, 2 * j + 1, Qnil); } + /* Save conversion results */ lisp_data_to_selection_data (dpyinfo, multprop, &cs); - /* If cs.type is ATOM, change it to ATOM_PAIR. This is because - the parameters to a MULTIPLE are ATOM_PAIRs. */ + /* If cs.type is ATOM, change it to ATOM_PAIR. This is + because the parameters to a MULTIPLE are ATOM_PAIRs. */ if (cs.type == XA_ATOM) cs.type = dpyinfo->Xatom_ATOM_PAIR; @@ -929,27 +1166,29 @@ x_handle_selection_request (struct selection_input_event *event) cs.type, cs.format, PropModeReplace, cs.data, cs.size); success = true; + + xfree (cs.data); } else { if (property == None) property = SELECTION_EVENT_TARGET (event); + success = x_convert_selection (selection_symbol, target_symbol, property, - false, dpyinfo, - use_alternate); + dpyinfo, use_alternate); } DONE: - if (pushed) - selection_request_stack->converted = true; - if (success) x_reply_selection_request (event, dpyinfo); else x_decline_selection_request (event); + if (pushed) + selection_request_stack->converted = true; + /* Run the `x-sent-selection-functions' abnormal hook. */ if (!NILP (Vx_sent_selection_functions) && !BASE_EQ (Vx_sent_selection_functions, Qunbound)) @@ -960,19 +1199,18 @@ x_handle_selection_request (struct selection_input_event *event) REALLY_DONE: unbind_to (count, Qnil); + return; } /* Perform the requested selection conversion, and write the data to the converted_selections linked list, where it can be accessed by - x_reply_selection_request. If FOR_MULTIPLE, write out - the data even if conversion fails, using conversion_fail_tag. + x_reply_selection_request. Return true if successful. */ static bool -x_convert_selection (Lisp_Object selection_symbol, - Lisp_Object target_symbol, Atom property, - bool for_multiple, struct x_display_info *dpyinfo, +x_convert_selection (Lisp_Object selection_symbol, Lisp_Object target_symbol, + Atom property, struct x_display_info *dpyinfo, bool use_alternate) { Lisp_Object lisp_selection; @@ -988,33 +1226,16 @@ x_convert_selection (Lisp_Object selection_symbol, /* A nil return value means we can't perform the conversion. */ if (NILP (lisp_selection) || (CONSP (lisp_selection) && NILP (XCDR (lisp_selection)))) - { - if (for_multiple) - { - cs = xmalloc (sizeof *cs); - cs->data = ((unsigned char *) - &selection_request_stack->conversion_fail_tag); - cs->size = 1; - cs->format = 32; - cs->type = XA_ATOM; - cs->nofree = true; - cs->property = property; - cs->wait_object = NULL; - cs->next = frame->converted_selections; - frame->converted_selections = cs; - } - - return false; - } + return false; /* Otherwise, record the converted selection to binary. */ cs = xmalloc (sizeof *cs); cs->data = NULL; - cs->nofree = true; + cs->string = Qnil; cs->property = property; - cs->wait_object = NULL; cs->next = frame->converted_selections; frame->converted_selections = cs; + lisp_data_to_selection_data (dpyinfo, lisp_selection, cs); return true; } @@ -1274,6 +1495,10 @@ void x_handle_property_notify (const XPropertyEvent *event) { struct prop_location *rest; + struct transfer *next; +#ifdef TRACE_SELECTION + char *name; +#endif for (rest = property_change_wait_list; rest; rest = rest->next) { @@ -1283,9 +1508,16 @@ x_handle_property_notify (const XPropertyEvent *event) && rest->display == event->display && rest->desired_state == event->state) { +#ifdef TRACE_SELECTION + name = XGetAtomName (event->display, event->atom); + TRACE2 ("Expected %s of property %s", (event->state == PropertyDelete ? "deletion" : "change"), - XGetAtomName (event->display, event->atom)); + name ? name : "unknown"); + + if (name) + XFree (name); +#endif rest->arrived = true; @@ -1297,6 +1529,26 @@ x_handle_property_notify (const XPropertyEvent *event) return; } } + + /* Look for a property change for an outstanding selection + transfer. */ + next = outstanding_transfers.next; + while (next != &outstanding_transfers) + { + if (next->dpyinfo->display == event->display + && next->requestor == event->window + && next->data.property == event->atom + && event->state == PropertyDelete) + { + TRACE1 ("Expected PropertyDelete event arrived from the" + " requestor window %lx", next->requestor); + + x_continue_selection_transfer (next); + return; + } + + next = next->next; + } } static void @@ -1450,10 +1702,10 @@ x_get_window_property (Display *display, Window window, Atom property, /* Maximum value for TOTAL_SIZE. It cannot exceed PTRDIFF_MAX - 1 and SIZE_MAX - 1, for an extra byte at the end. And it cannot exceed LONG_MAX * X_LONG_SIZE, for XGetWindowProperty. */ - ptrdiff_t total_size_max = - ((min (PTRDIFF_MAX, SIZE_MAX) - 1) / x_long_size < LONG_MAX - ? min (PTRDIFF_MAX, SIZE_MAX) - 1 - : LONG_MAX * x_long_size); + ptrdiff_t total_size_max + = ((min (PTRDIFF_MAX, SIZE_MAX) - 1) / x_long_size < LONG_MAX + ? min (PTRDIFF_MAX, SIZE_MAX) - 1 + : LONG_MAX * x_long_size); block_input (); @@ -1946,10 +2198,14 @@ static void lisp_data_to_selection_data (struct x_display_info *dpyinfo, Lisp_Object obj, struct selection_data *cs) { - Lisp_Object type = Qnil; + Lisp_Object type; + char **name_buffer; + + USE_SAFE_ALLOCA; + + type = Qnil; eassert (cs != NULL); - cs->nofree = false; if (CONSP (obj) && SYMBOLP (XCAR (obj))) { @@ -1959,8 +2215,10 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, obj = XCAR (obj); } + /* This is not the same as declining. */ + if (EQ (obj, QNULL) || (EQ (type, QNULL))) - { /* This is not the same as declining */ + { cs->format = 32; cs->size = 0; cs->data = NULL; @@ -1971,12 +2229,14 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, if (SCHARS (obj) < SBYTES (obj)) /* OBJ is a multibyte string containing a non-ASCII char. */ signal_error ("Non-ASCII string must be encoded in advance", obj); + if (NILP (type)) type = QSTRING; + cs->format = 8; - cs->size = SBYTES (obj); - cs->data = SDATA (obj); - cs->nofree = true; + cs->size = -1; + cs->data = NULL; + cs->string = obj; } else if (SYMBOLP (obj)) { @@ -2048,8 +2308,19 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, x_atoms = data; cs->format = 32; cs->size = size; - for (i = 0; i < size; i++) - x_atoms[i] = symbol_to_x_atom (dpyinfo, AREF (obj, i)); + + if (size == 1) + x_atoms[0] = symbol_to_x_atom (dpyinfo, AREF (obj, i)); + else + { + SAFE_NALLOCA (name_buffer, sizeof *x_atoms, size); + + for (i = 0; i < size; i++) + name_buffer[i] = SSDATA (SYMBOL_NAME (AREF (obj, i))); + + x_intern_atoms (dpyinfo, name_buffer, size, + x_atoms); + } } else /* This vector is an INTEGER set, or something like it */ @@ -2091,6 +2362,8 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, signal_error (/* Qselection_error */ "Unrecognized selection data", obj); cs->type = symbol_to_x_atom (dpyinfo, type); + + SAFE_FREE (); } static Lisp_Object @@ -2618,8 +2891,8 @@ x_check_property_data (Lisp_Object data) XClientMessageEvent). */ void -x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, - int nelements_max, int format) +x_fill_property_data (struct x_display_info *dpyinfo, Lisp_Object data, + void *ret, int nelements_max, int format) { unsigned long val; unsigned long *d32 = (unsigned long *) ret; @@ -2654,7 +2927,7 @@ x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, else if (STRINGP (o)) { block_input (); - val = XInternAtom (dpy, SSDATA (o), False); + val = x_intern_cached_atom (dpyinfo, SSDATA (o), false); unblock_input (); } else @@ -2942,7 +3215,7 @@ x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from, memset (event.xclient.data.l, 0, sizeof (event.xclient.data.l)); /* event.xclient.data can hold 20 chars, 10 shorts, or 5 longs. */ - x_fill_property_data (dpyinfo->display, values, event.xclient.data.b, + x_fill_property_data (dpyinfo, values, event.xclient.data.b, 5 * 32 / event.xclient.format, event.xclient.format); @@ -3002,10 +3275,11 @@ syms_of_xselect (void) reading_selection_reply = Fcons (Qnil, Qnil); staticpro (&reading_selection_reply); - staticpro (&property_change_reply); - /* FIXME: Duplicate definition in nsselect.c. */ + outstanding_transfers.next = &outstanding_transfers; + outstanding_transfers.last = &outstanding_transfers; + DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist, doc: /* An alist associating X Windows selection-types with functions. These functions are called to convert the selection, with three args: @@ -3120,9 +3394,43 @@ Note that this does not affect setting or owning selections. */); static void syms_of_xselect_for_pdumper (void) { + outstanding_transfers.next = &outstanding_transfers; + outstanding_transfers.last = &outstanding_transfers; + reading_selection_window = 0; reading_which_selection = 0; property_change_wait_list = 0; prop_location_identifier = 0; property_change_reply = Fcons (Qnil, Qnil); } + +void +mark_xselect (void) +{ + struct transfer *next; + struct x_selection_request *frame; + struct selection_data *cs; + + /* Mark all the strings being used as selection data. A string that + is still reachable is always reachable via either the selection + request stack or the list of outstanding transfers. */ + + next = outstanding_transfers.next; + + if (!next) + /* syms_of_xselect has not yet been called. */ + return; + + while (next != &outstanding_transfers) + { + mark_object (next->data.string); + next = next->next; + } + + frame = selection_request_stack; + for (; frame; frame = frame->last) + { + for (cs = frame->converted_selections; cs; cs = cs->next) + mark_object (cs->string); + } +} diff --git a/src/xterm.c b/src/xterm.c index 44fad6e8d59..38775c3f52e 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -574,7 +574,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #ifdef USE_XCB #include <xcb/xproto.h> #include <xcb/xcb.h> -#include <xcb/xcb_aux.h> #endif /* If we have Xfixes extension, use it for pointer blanking. */ @@ -1052,6 +1051,20 @@ static const struct x_atom_ref x_atom_refs[] = /* Old OffiX (a.k.a. old KDE) drop protocol support. */ ATOM_REFS_INIT ("DndProtocol", Xatom_DndProtocol) ATOM_REFS_INIT ("_DND_PROTOCOL", Xatom_DND_PROTOCOL) + /* Here are some atoms that are not actually used from C, just + defined to make replying to selection requests fast. */ + ATOM_REFS_INIT ("text/plain;charset=utf-8", Xatom_text_plain_charset_utf_8) + ATOM_REFS_INIT ("LENGTH", Xatom_LENGTH) + ATOM_REFS_INIT ("FILE_NAME", Xatom_FILE_NAME) + ATOM_REFS_INIT ("CHARACTER_POSITION", Xatom_CHARACTER_POSITION) + ATOM_REFS_INIT ("LINE_NUMBER", Xatom_LINE_NUMBER) + ATOM_REFS_INIT ("COLUMN_NUMBER", Xatom_COLUMN_NUMBER) + ATOM_REFS_INIT ("OWNER_OS", Xatom_OWNER_OS) + ATOM_REFS_INIT ("HOST_NAME", Xatom_HOST_NAME) + ATOM_REFS_INIT ("USER", Xatom_USER) + ATOM_REFS_INIT ("CLASS", Xatom_CLASS) + ATOM_REFS_INIT ("NAME", Xatom_NAME) + ATOM_REFS_INIT ("SAVE_TARGETS", Xatom_SAVE_TARGETS) }; enum @@ -3058,7 +3071,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo) 0, 0); get_property_cookies[i] = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) toplevels[i], - (xcb_atom_t) dpyinfo->Xatom_wm_state, XCB_ATOM_ANY, + (xcb_atom_t) dpyinfo->Xatom_wm_state, 0, 0, 2); xm_property_cookies[i] = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) toplevels[i], @@ -3069,7 +3082,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo) = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) toplevels[i], (xcb_atom_t) dpyinfo->Xatom_net_frame_extents, - XCB_ATOM_CARDINAL, 0, 4); + XA_CARDINAL, 0, 4); get_geometry_cookies[i] = xcb_get_geometry (dpyinfo->xcb_connection, (xcb_window_t) toplevels[i]); @@ -3197,7 +3210,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo) { if (xcb_get_property_value_length (extent_property_reply) == 16 && extent_property_reply->format == 32 - && extent_property_reply->type == XCB_ATOM_CARDINAL) + && extent_property_reply->type == XA_CARDINAL) { fextents = xcb_get_property_value (extent_property_reply); frame_extents[0] = fextents[0]; @@ -3571,13 +3584,13 @@ x_dnd_get_proxy_proto (struct x_display_info *dpyinfo, Window wdesc, xdnd_proxy_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) wdesc, (xcb_atom_t) dpyinfo->Xatom_XdndProxy, - XCB_ATOM_WINDOW, 0, 1); + XA_WINDOW, 0, 1); if (proto_out) xdnd_proto_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) wdesc, (xcb_atom_t) dpyinfo->Xatom_XdndAware, - XCB_ATOM_ATOM, 0, 1); + XA_ATOM, 0, 1); if (proxy_out) { @@ -3589,7 +3602,7 @@ x_dnd_get_proxy_proto (struct x_display_info *dpyinfo, Window wdesc, else { if (reply->format == 32 - && reply->type == XCB_ATOM_WINDOW + && reply->type == XA_WINDOW && (xcb_get_property_value_length (reply) >= 4)) *proxy_out = *(xcb_window_t *) xcb_get_property_value (reply); @@ -3607,7 +3620,7 @@ x_dnd_get_proxy_proto (struct x_display_info *dpyinfo, Window wdesc, else { if (reply->format == 32 - && reply->type == XCB_ATOM_ATOM + && reply->type == XA_ATOM && (xcb_get_property_value_length (reply) >= 4)) *proto_out = (int) *(xcb_atom_t *) xcb_get_property_value (reply); @@ -3791,15 +3804,15 @@ x_dnd_get_wm_state_and_proto (struct x_display_info *dpyinfo, wmstate_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) window, (xcb_atom_t) dpyinfo->Xatom_wm_state, - XCB_ATOM_ANY, 0, 2); + 0, 0, 2); xdnd_proto_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) window, (xcb_atom_t) dpyinfo->Xatom_XdndAware, - XCB_ATOM_ATOM, 0, 1); + XA_ATOM, 0, 1); xdnd_proxy_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) window, (xcb_atom_t) dpyinfo->Xatom_XdndProxy, - XCB_ATOM_WINDOW, 0, 1); + XA_WINDOW, 0, 1); xm_style_cookie = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) window, (xcb_atom_t) dpyinfo->Xatom_MOTIF_DRAG_RECEIVER_INFO, @@ -3846,7 +3859,7 @@ x_dnd_get_wm_state_and_proto (struct x_display_info *dpyinfo, else { if (reply->format == 32 - && reply->type == XCB_ATOM_WINDOW + && reply->type == XA_WINDOW && (xcb_get_property_value_length (reply) >= 4)) *proxy_out = *(xcb_window_t *) xcb_get_property_value (reply); @@ -10991,6 +11004,31 @@ x_clear_frame (struct frame *f) unblock_input (); } +/* Send a message to frame F telling the event loop to track whether + or not an hourglass is being displayed. This is required to ignore + the right events when the hourglass is mapped without callig XSync + after displaying or hiding the hourglass. */ + +static void +x_send_hourglass_message (struct frame *f, bool hourglass_enabled) +{ + struct x_display_info *dpyinfo; + XEvent msg; + + dpyinfo = FRAME_DISPLAY_INFO (f); + memset (&msg, 0, sizeof msg); + + msg.xclient.type = ClientMessage; + msg.xclient.message_type + = dpyinfo->Xatom_EMACS_TMP; + msg.xclient.format = 8; + msg.xclient.window = FRAME_X_WINDOW (f); + msg.xclient.data.b[0] = hourglass_enabled ? 1 : 0; + + XSendEvent (dpyinfo->display, FRAME_X_WINDOW (f), + False, NoEventMask, &msg); +} + /* RIF: Show hourglass cursor on frame F. */ static void @@ -11011,14 +11049,14 @@ x_show_hourglass (struct frame *f) if (popup_activated ()) return; + x_send_hourglass_message (f, true); + #ifdef USE_X_TOOLKIT if (x->widget) #else if (FRAME_OUTER_WINDOW (f)) #endif { - x->hourglass_p = true; - if (!x->hourglass_window) { #ifndef USE_XCB @@ -11085,15 +11123,11 @@ x_hide_hourglass (struct frame *f) { #ifndef USE_XCB XUnmapWindow (FRAME_X_DISPLAY (f), x->hourglass_window); - /* Sync here because XTread_socket looks at the - hourglass_p flag that is reset to zero below. */ - XSync (FRAME_X_DISPLAY (f), False); #else xcb_unmap_window (FRAME_DISPLAY_INFO (f)->xcb_connection, (xcb_window_t) x->hourglass_window); - xcb_aux_sync (FRAME_DISPLAY_INFO (f)->xcb_connection); #endif - x->hourglass_p = false; + x_send_hourglass_message (f, false); } } @@ -11217,21 +11251,32 @@ XTflash (struct frame *f) static void XTring_bell (struct frame *f) { - if (FRAME_X_DISPLAY (f)) + struct x_display_info *dpyinfo; + + if (!FRAME_X_DISPLAY (f)) + return; + + dpyinfo = FRAME_DISPLAY_INFO (f); + + if (visible_bell) + XTflash (f); + else { - if (visible_bell) - XTflash (f); - else - { - block_input (); + /* When Emacs is untrusted, Bell requests sometimes generate + Access errors. This is not in the security extension + specification but seems to be a bug in the X consortium XKB + implementation. */ + + block_input (); + x_ignore_errors_for_next_request (dpyinfo); #ifdef HAVE_XKB - XkbBell (FRAME_X_DISPLAY (f), None, 0, None); + XkbBell (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), 0, None); #else - XBell (FRAME_X_DISPLAY (f), 0); + XBell (FRAME_X_DISPLAY (f), 0); #endif - XFlush (FRAME_X_DISPLAY (f)); - unblock_input (); - } + XFlush (FRAME_X_DISPLAY (f)); + x_stop_ignoring_errors (dpyinfo); + unblock_input (); } } @@ -11564,7 +11609,7 @@ x_new_focus_frame (struct x_display_info *dpyinfo, struct frame *frame) x_frame_rehighlight (dpyinfo); } -#ifdef HAVE_XFIXES +#if defined HAVE_XFIXES && XFIXES_VERSION >= 40000 /* True if the display in DPYINFO supports a version of Xfixes sufficient for pointer blanking. */ @@ -11576,11 +11621,12 @@ x_fixes_pointer_blanking_supported (struct x_display_info *dpyinfo) && dpyinfo->xfixes_major >= 4); } -#endif /* HAVE_XFIXES */ +#endif /* HAVE_XFIXES && XFIXES_VERSION >= 40000 */ /* Toggle mouse pointer visibility on frame F using the XFixes extension. */ -#ifdef HAVE_XFIXES +#if defined HAVE_XFIXES && XFIXES_VERSION >= 40000 + static void xfixes_toggle_visible_pointer (struct frame *f, bool invisible) @@ -11591,6 +11637,7 @@ xfixes_toggle_visible_pointer (struct frame *f, bool invisible) XFixesShowCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f)); f->pointer_invisible = invisible; } + #endif /* HAVE_XFIXES */ /* Create invisible cursor on the X display referred by DPYINFO. */ @@ -11639,7 +11686,7 @@ x_toggle_visible_pointer (struct frame *f, bool invisible) if (dpyinfo->invisible_cursor == None) dpyinfo->invisible_cursor = make_invisible_cursor (dpyinfo); -#ifndef HAVE_XFIXES +#if !defined HAVE_XFIXES || XFIXES_VERSION < 40000 if (dpyinfo->invisible_cursor == None) invisible = false; #else @@ -11672,7 +11719,7 @@ static void XTtoggle_invisible_pointer (struct frame *f, bool invisible) { block_input (); -#ifdef HAVE_XFIXES +#if defined HAVE_XFIXES && XFIXES_VERSION >= 40000 if (FRAME_DISPLAY_INFO (f)->fixes_pointer_blanking && x_fixes_pointer_blanking_supported (FRAME_DISPLAY_INFO (f))) xfixes_toggle_visible_pointer (f, invisible); @@ -12261,6 +12308,13 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction, struct xi_device_t *device; #endif + if (FRAME_DISPLAY_INFO (f)->untrusted) + /* Untrusted clients cannot send messages to trusted clients or + read the window tree, so drag and drop will likely not work at + all. */ + error ("Drag-and-drop is not possible when the client is" + " not trusted by the X server."); + base = SPECPDL_INDEX (); /* Bind this here to avoid juggling bindings and SAFE_FREE in @@ -18604,6 +18658,16 @@ handle_one_xevent (struct x_display_info *dpyinfo, } } + if (event->xclient.message_type == dpyinfo->Xatom_EMACS_TMP + && event->xclient.format == 8) + { + /* This is actually an hourglass message. Set whether or + not events from here on have the hourglass enabled. */ + + if (any) + FRAME_X_OUTPUT (any)->hourglass_p = event->xclient.data.b[0]; + } + if (event->xclient.message_type == dpyinfo->Xatom_wm_protocols && event->xclient.format == 32) { @@ -19192,7 +19256,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, = xcb_get_property (dpyinfo->xcb_connection, 0, (xcb_window_t) FRAME_OUTER_WINDOW (f), (xcb_atom_t) dpyinfo->Xatom_net_wm_window_opacity, - XCB_ATOM_CARDINAL, 0, 1); + XA_CARDINAL, 0, 1); opacity_reply = xcb_get_property_reply (dpyinfo->xcb_connection, opacity_cookie, &error); @@ -19201,9 +19265,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, free (error), rc = false; else rc = (opacity_reply->format == 32 - && (opacity_reply->type == XCB_ATOM_CARDINAL - || opacity_reply->type == XCB_ATOM_ATOM - || opacity_reply->type == XCB_ATOM_WINDOW) + && (opacity_reply->type == XA_CARDINAL + || opacity_reply->type == XA_ATOM + || opacity_reply->type == XA_WINDOW) && (xcb_get_property_value_length (opacity_reply) >= 4)); if (rc) @@ -25984,9 +26048,11 @@ For details, see etc/PROBLEMS.\n", if (!ioerror && dpyinfo) { /* Dump the list of error handlers for debugging - purposes. */ + purposes if the list exists. */ - fprintf (stderr, "X error handlers currently installed:\n"); + if ((dpyinfo->failable_requests + != dpyinfo->next_failable_request) || x_error_message) + fprintf (stderr, "X error handlers currently installed:\n"); for (failable = dpyinfo->failable_requests; failable < dpyinfo->next_failable_request; @@ -26718,6 +26784,12 @@ x_wm_supports_1 (struct x_display_info *dpyinfo, Atom want_atom) if (!NILP (Vx_no_window_manager)) return false; + /* If the window system says Emacs is untrusted, there will be no + way to send any information to the window manager, making any + hints useless. */ + if (dpyinfo->untrusted) + return false; + block_input (); x_catch_errors (dpy); @@ -27188,13 +27260,12 @@ do_ewmh_fullscreen (struct frame *f) static void XTfullscreen_hook (struct frame *f) { - if (FRAME_VISIBLE_P (f)) - { - block_input (); - x_check_fullscreen (f); - x_sync (f); - unblock_input (); - } + if (!FRAME_VISIBLE_P (f)) + return; + + block_input (); + x_check_fullscreen (f); + unblock_input (); } @@ -27288,10 +27359,7 @@ x_check_fullscreen (struct frame *f) if (FRAME_VISIBLE_P (f)) x_wait_for_event (f, ConfigureNotify); else - { - change_frame_size (f, width, height, false, true, false); - x_sync (f); - } + change_frame_size (f, width, height, false, true, false); } /* `x_net_wm_state' might have reset the fullscreen frame parameter, @@ -27505,8 +27573,6 @@ x_set_window_size_1 (struct frame *f, bool change_gravity, adjust_frame_size (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, width), FRAME_PIXEL_TO_TEXT_HEIGHT (f, height), 5, 0, Qx_set_window_size_1); - - x_sync (f); } } @@ -27892,12 +27958,17 @@ x_focus_frame (struct frame *f, bool noactivate) struct x_display_info *dpyinfo; Time time; + dpyinfo = FRAME_DISPLAY_INFO (f); + + if (dpyinfo->untrusted) + /* The X server ignores all input focus related requests from + untrusted clients. */ + return; + /* The code below is not reentrant wrt to dpyinfo->x_focus_frame and friends being set. */ block_input (); - dpyinfo = FRAME_DISPLAY_INFO (f); - if (FRAME_X_EMBEDDED_P (f)) /* For Xembedded frames, normally the embedder forwards key events. See XEmbed Protocol Specification at @@ -28263,7 +28334,7 @@ x_make_frame_invisible (struct frame *f) error ("Can't notify window manager of window withdrawal"); } - x_sync (f); + XSync (FRAME_X_DISPLAY (f), False); /* We can't distinguish this from iconification just by the event that we get from the server. @@ -28861,6 +28932,53 @@ x_get_atom_name (struct x_display_info *dpyinfo, Atom atom, return value; } +/* Intern an array of atoms, and do so quickly, avoiding extraneous + roundtrips to the X server. + + Avoid sending atoms that have already been found to the X server. + This cannot do anything that will end up triggering garbage + collection. */ + +void +x_intern_atoms (struct x_display_info *dpyinfo, char **names, int count, + Atom *atoms_return) +{ + int i, j, indices[256]; + char *new_names[256]; + Atom results[256], candidate; + + if (count > 256) + /* Atoms array too big to inspect reasonably, just send it to the + server and back. */ + XInternAtoms (dpyinfo->display, new_names, count, False, atoms_return); + else + { + for (i = 0, j = 0; i < count; ++i) + { + candidate = x_intern_cached_atom (dpyinfo, names[i], + true); + + if (candidate) + atoms_return[i] = candidate; + else + { + indices[j++] = i; + new_names[j - 1] = names[i]; + } + } + + if (!j) + return; + + /* Now, get the results back from the X server. */ + XInternAtoms (dpyinfo->display, new_names, j, False, + results); + + for (i = 0; i < j; ++i) + atoms_return[indices[i]] = results[i]; + } +} + #ifndef USE_GTK /* Set up XEmbed for F, and change its save set to handle the parent @@ -29409,6 +29527,7 @@ struct x_display_info * x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) { Display *dpy; + XKeyboardState keyboard_state; struct terminal *terminal; struct x_display_info *dpyinfo; XrmDatabase xrdb; @@ -29628,6 +29747,32 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) dpyinfo = xzalloc (sizeof *dpyinfo); terminal = x_create_terminal (dpyinfo); + if (!NILP (Vx_detect_server_trust)) + { + /* Detect whether or not the X server trusts this client, which + is done by making a SetKeyboardControl request and checking + for an Access error. */ + XGrabServer (dpy); + XGetKeyboardControl (dpy, &keyboard_state); + + x_catch_errors (dpy); + + /* At this point, the display is not on x_display_list, so + x_uncatch_errors won't sync. However, that's okay because + x_had_errors_p will. */ + + if (keyboard_state.global_auto_repeat + == AutoRepeatModeOn) + XAutoRepeatOn (dpy); + else + XAutoRepeatOff (dpy); + + if (x_had_errors_p (dpy)) + dpyinfo->untrusted = true; + x_uncatch_errors_after_check (); + XUngrabServer (dpy); + } + dpyinfo->next_failable_request = dpyinfo->failable_requests; { @@ -30272,7 +30417,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) 1, 0, 1); dpyinfo->invisible_cursor = make_invisible_cursor (dpyinfo); -#ifdef HAVE_XFIXES +#if defined HAVE_XFIXES && XFIXES_VERSION >= 40000 dpyinfo->fixes_pointer_blanking = egetenv ("EMACS_XFIXES"); #endif @@ -30600,8 +30745,13 @@ x_delete_display (struct x_display_info *dpyinfo) last = ie; } + /* Delete selection requests bound for dpyinfo from the keyboard + buffer. */ x_delete_selection_requests (dpyinfo); + /* And remove any outstanding selection transfers. */ + x_remove_selection_transfers (dpyinfo); + if (next_noop_dpyinfo == dpyinfo) next_noop_dpyinfo = dpyinfo->next; @@ -31699,4 +31849,14 @@ select text over slow X connections. If that is still too slow, setting this variable to the symbol `really-fast' will make Emacs return only cached values. */); Vx_use_fast_mouse_position = Qnil; + + DEFVAR_LISP ("x-detect-server-trust", Vx_detect_server_trust, + doc: /* If non-nil, Emacs should detect whether or not it is trusted by X. + +If non-nil, Emacs will make an X request at connection startup that is +prohibited to untrusted clients under the X Security Extension and +check whether or not a resulting Access error is generated by the X +server. If the X server reports the error, Emacs will disable certain +features that do not work for untrusted clients. */); + Vx_detect_server_trust = Qnil; } diff --git a/src/xterm.h b/src/xterm.h index ee429e9c68d..a888f57823f 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -21,6 +21,22 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #define XTERM_H #include <X11/Xlib.h> + +#ifdef HAVE_XFIXES +#include <X11/extensions/Xfixes.h> + +#if defined HAVE_XINPUT2 && XFIXES_MAJOR < 5 +/* XI2 headers need PointerBarrier, which is not defined in old + versions of the fixes library. Define that type here. */ +typedef XID PointerBarrier; +#endif +#if defined HAVE_XCOMPOSITE && XFIXES_MAJOR < 2 +/* Recent Composite headers need XserverRegion, which is not defined + in old versions of the fixes library. Define that type here. */ +typedef XID XserverRegion; +#endif +#endif + #include <X11/cursorfont.h> /* Include Xutil.h after keysym.h to work around a bug that prevents @@ -360,6 +376,10 @@ struct x_display_info /* Number of frames that are on this display. */ int reference_count; + /* True if this display connection cannot communicate with the + window manager because it is not trusted by the X server. */ + bool untrusted; + /* The Screen this connection is connected to. */ Screen *screen; @@ -406,7 +426,7 @@ struct x_display_info Unused if this display supports Xfixes extension. */ Cursor invisible_cursor; -#ifdef HAVE_XFIXES +#if defined HAVE_XFIXES && XFIXES_VERSION >= 40000 /* Whether or not to use Xfixes for pointer blanking. */ bool fixes_pointer_blanking; #endif @@ -537,6 +557,12 @@ struct x_display_info KDE" protocol in x-dnd.el). */ Atom Xatom_DndProtocol, Xatom_DND_PROTOCOL; + /* Atoms to make x_intern_cached_atom fast. */ + Atom Xatom_text_plain_charset_utf_8, Xatom_LENGTH, Xatom_FILE_NAME, + Xatom_CHARACTER_POSITION, Xatom_LINE_NUMBER, Xatom_COLUMN_NUMBER, + Xatom_OWNER_OS, Xatom_HOST_NAME, Xatom_USER, Xatom_CLASS, + Xatom_NAME, Xatom_SAVE_TARGETS; + /* The frame (if any) which has the X window that has keyboard focus. Zero if none. This is examined by Ffocus_frame in xfns.c. Note that a mere EnterNotify event can set this; if you need to know the @@ -1717,6 +1743,11 @@ extern Lisp_Object x_handle_translate_coordinates (struct frame *, Lisp_Object, extern Bool x_query_pointer (Display *, Window, Window *, Window *, int *, int *, int *, int *, unsigned int *); +extern Atom x_intern_cached_atom (struct x_display_info *, const char *, + bool); +extern void x_intern_atoms (struct x_display_info *, char **, int, Atom *); +extern char *x_get_atom_name (struct x_display_info *, Atom, bool *) + ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC_FREE; #ifdef HAVE_GTK3 extern void x_scroll_bar_configure (GdkEvent *); @@ -1798,6 +1829,8 @@ extern void x_handle_property_notify (const XPropertyEvent *); extern void x_handle_selection_notify (const XSelectionEvent *); extern void x_handle_selection_event (struct selection_input_event *); extern void x_clear_frame_selections (struct frame *); +extern void x_remove_selection_transfers (struct x_display_info *); + extern Lisp_Object x_atom_to_symbol (struct x_display_info *, Atom); extern Atom symbol_to_x_atom (struct x_display_info *, Lisp_Object); @@ -1807,11 +1840,8 @@ extern bool x_handle_dnd_message (struct frame *, struct input_event *, bool, int, int); extern int x_check_property_data (Lisp_Object); -extern void x_fill_property_data (Display *, - Lisp_Object, - void *, - int, - int); +extern void x_fill_property_data (struct x_display_info *, Lisp_Object, + void *, int, int); extern Lisp_Object x_property_data_to_lisp (struct frame *, const unsigned char *, Atom, @@ -1824,10 +1854,10 @@ extern Lisp_Object x_timestamp_for_selection (struct x_display_info *, Lisp_Object); extern void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Time); -extern Atom x_intern_cached_atom (struct x_display_info *, const char *, - bool); -extern char *x_get_atom_name (struct x_display_info *, Atom, bool *) - ATTRIBUTE_MALLOC ATTRIBUTE_DEALLOC_FREE; + +extern void mark_xselect (void); + +/* Misc definitions. */ #ifdef USE_GTK extern bool xg_set_icon (struct frame *, Lisp_Object); diff --git a/test/infra/test-jobs.yml b/test/infra/test-jobs.yml index 55ce590af89..51707c181b1 100644 --- a/test/infra/test-jobs.yml +++ b/test/infra/test-jobs.yml @@ -493,23 +493,6 @@ test-lisp-url-inotify: target: emacs-inotify make_params: "-k -C test check-lisp-url" -test-lisp-use-package-inotify: - stage: normal - extends: [.job-template, .test-template] - needs: - - job: build-image-inotify - optional: true - rules: - - if: '$CI_PIPELINE_SOURCE == "schedule"' - when: never - - changes: - - lisp/use-package/*.el - - test/lisp/use-package/*.el - - test/lisp/use-package/*resources/** - variables: - target: emacs-inotify - make_params: "-k -C test check-lisp-use-package" - test-lisp-vc-inotify: stage: normal extends: [.job-template, .test-template] |