commit d044ca25d03523f0d9444013d2e778f67c24aa4e Author: Eli Zaretskii Date: Sat Jul 25 08:31:29 2026 +0300 ; * etc/NEWS: Fix typo and wording of recently-added entry. diff --git a/etc/NEWS b/etc/NEWS index b54057c433b..6282d8cf9f6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -151,11 +151,11 @@ customize the new user option 'vc-dir-process-output-limit' to control how early to stop, and to disable this feature. --- -*** M-x VC-Dir resolves symbolic link only if the directory has no backend -When called interatively, 'vc-dir' checks if the passed directory has no -VC backend. And if its truename does and 'vc-follow-symlinks' is -non-nil, the truename is used instead. Before this change, the truename -was used unconditionally. +*** VC-Dir resolves symbolic links only if the directory has no backend. +When called interactively, 'M-x vc-dir' checks if the passed directory +has a VC backend. If it doesn't, but the directory's truename does +have a backend, and 'vc-follow-symlinks' is non-nil, the truename is +used instead. Previously, the truename was used unconditionally. +++ *** Improved creation of commit log entry from ChangeLog. commit 3735384b193617a912fbf6d25844041ed288bf28 Author: Yuan Fu Date: Wed May 20 00:00:21 2026 -0700 Add comment-start-line-regexp (bug#80837) * doc/emacs/programs.texi (Options for Comments): Document it. * etc/NEWS: Announce it. * lisp/newcomment.el (comment-start-line-regexp): New variable. * lisp/progmodes/c-ts-common.el (c-ts-common-comment-start-line-regexp): New variable. (c-ts-common-comment-setup): Set the new variable. * lisp/progmodes/cmake-ts-mode.el (cmake-ts-mode): * lisp/progmodes/dockerfile-ts-mode.el (dockerfile-ts-mode): * lisp/progmodes/elixir-ts-mode.el (elixir-ts-mode): * lisp/progmodes/go-ts-mode.el (go-work-ts-mode): * lisp/progmodes/json-ts-mode.el (json-ts-mode): * lisp/progmodes/lua-ts-mode.el (lua-ts-mode): * lisp/progmodes/php-ts-mode.el (php-ts-mode--comment-setup): * lisp/progmodes/python.el (python-base-mode): * lisp/progmodes/ruby-mode.el (ruby-base-mode): * lisp/progmodes/sh-script.el (sh-base-mode): * lisp/textmodes/toml-ts-mode.el (toml-ts-mode): * lisp/textmodes/yaml-ts-mode.el (yaml-ts-mode): Set the new variable. * lisp/textmodes/mhtml-ts-mode.el (mhtml-ts-mode--comment-setup): Reset the new variable when switching to HTML or CSS. * lisp/treesit.el (treesit--likely-line-comment-p): New function. (treesit-forward-comment): Distinguish between line and block comments: stop right after a block comment, and skip the trailing newline after a line comment. Co-Authored-By: Claude Fable 5 diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi index 7cf7b2ff96f..d5738d684a2 100644 --- a/doc/emacs/programs.texi +++ b/doc/emacs/programs.texi @@ -1385,6 +1385,12 @@ comments also. (Note that @samp{\\} is needed in Lisp syntax to include a @samp{\} in the string, which is needed to deny the first star its special meaning in regexp syntax. @xref{Regexp Backslash}.) +@vindex comment-start-line-regexp + Modes that support both line and block comments should also set +@code{comment-start-line-regexp} to a regexp that matches only line +comment starters. This lets Emacs distinguish between the two kinds of +comments. + @vindex comment-start @vindex comment-end When a comment command makes a new comment, it inserts the value of diff --git a/etc/NEWS b/etc/NEWS index 653dedda04b..b54057c433b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -265,6 +265,12 @@ buffer as if it were newly created. +++ ** The new function 'markers-in' returns the set of markers in a region. ++++ +** New buffer-local variable 'comment-start-line-regexp'. +Modes that support both line and block comments should set this +variable to a regexp that matches only the start of line comments, so +Emacs can distinguish between line and block comments. + --- ** New variable 'completion-frontend-properties'. This variable generalizes the 'completion-lazy-hilit' variable added in diff --git a/lisp/newcomment.el b/lisp/newcomment.el index 1f8a38b586e..8db8d2969a5 100644 --- a/lisp/newcomment.el +++ b/lisp/newcomment.el @@ -128,6 +128,19 @@ by the close of the first pair.") ;;;###autoload (put 'comment-start-skip 'safe-local-variable 'stringp) +;;;###autoload +(defvar comment-start-line-regexp nil + "Regexp matching the start of a line comment. + +Unlike `comment-start-skip', which matches the start of any comment, +this regexp matches only the start of line comments (as opposed to block +comments), so it can be used to distinguish between the two. + +Modes that support both line and block comments should set this +variable.") +;;;###autoload +(put 'comment-start-line-regexp 'safe-local-variable 'stringp) + ;;;###autoload (defvar comment-end-skip nil "Regexp to match the end of a comment plus everything back to its body.") diff --git a/lisp/progmodes/c-ts-common.el b/lisp/progmodes/c-ts-common.el index d5e6b012fe7..461b6852a26 100644 --- a/lisp/progmodes/c-ts-common.el +++ b/lisp/progmodes/c-ts-common.el @@ -60,6 +60,11 @@ (* (syntax whitespace))) "The `comment-start-skip' used by `c-ts-common-comment-setup'.") +(defvar c-ts-common-comment-start-line-regexp + (rx (seq "/" (+ "/")) + (* (syntax whitespace))) + "The `comment-start-line-regexp' used by `c-ts-common-comment-setup'.") + (defun c-ts-common-looking-at-star (_n _p bol &rest _) "A tree-sitter simple indent matcher. Matches if there is a \"*\" after BOL." @@ -287,6 +292,7 @@ Set up: - `comment-start' - `comment-end' - `comment-start-skip' + - `comment-start-line-regexp' - `comment-end-skip' - `adaptive-fill-mode' - `adaptive-fill-first-line-regexp' @@ -298,6 +304,7 @@ Set up: (setq-local comment-start "// ") (setq-local comment-end "") (setq-local comment-start-skip c-ts-common-comment-start-skip) + (setq-local comment-start-line-regexp c-ts-common-comment-start-line-regexp) (setq-local comment-end-skip (rx (* (syntax whitespace)) (group (or (syntax comment-end) diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el index 6abd92b5e1a..678f3b09678 100644 --- a/lisp/progmodes/cmake-ts-mode.el +++ b/lisp/progmodes/cmake-ts-mode.el @@ -229,6 +229,7 @@ Return nil if there is no name or if NODE is not a defun node." (setq-local comment-start "# ") (setq-local comment-end "") (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) + (setq-local comment-start-line-regexp comment-start-skip) ;; Defuns. (setq-local treesit-defun-type-regexp (rx (or "function" "macro") diff --git a/lisp/progmodes/dockerfile-ts-mode.el b/lisp/progmodes/dockerfile-ts-mode.el index b97ec89b99a..551bd1bcaee 100644 --- a/lisp/progmodes/dockerfile-ts-mode.el +++ b/lisp/progmodes/dockerfile-ts-mode.el @@ -176,6 +176,7 @@ Return nil if there is no name or if NODE is not a stage node." (setq-local comment-start "# ") (setq-local comment-end "") (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) + (setq-local comment-start-line-regexp comment-start-skip) ;; Imenu. (setq-local treesit-simple-imenu-settings diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index 9bda7f0046f..b040113b3dc 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -724,6 +724,7 @@ Return nil if NODE is not a defun node or doesn't have a name." (setq-local comment-start "# ") (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) + (setq-local comment-start-line-regexp comment-start-skip) (setq-local comment-end "") (setq-local comment-end-skip diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el index 8de6d0e0700..d7563c3bbf6 100644 --- a/lisp/progmodes/go-ts-mode.el +++ b/lisp/progmodes/go-ts-mode.el @@ -725,6 +725,7 @@ what the parent of the node would be if it were a node." (setq-local comment-start "// ") (setq-local comment-end "") (setq-local comment-start-skip (rx "//" (* (syntax whitespace)))) + (setq-local comment-start-line-regexp comment-start-skip) ;; Indent. (setq-local indent-tabs-mode t diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el index 9575eaf6cf0..b2ffccecd76 100644 --- a/lisp/progmodes/json-ts-mode.el +++ b/lisp/progmodes/json-ts-mode.el @@ -198,6 +198,7 @@ PATH is a list of keys (strings) and indices (numbers)." ;; Comments. (setq-local comment-start "// ") (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *") + (setq-local comment-start-line-regexp "//+\\s *") (setq-local comment-end "") ;; Electric diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index 2963d5a96af..a9666c97788 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -683,6 +683,10 @@ Calls REPORT-FN directly." ;; Comments. (setq-local comment-start "--") (setq-local comment-start-skip "--\\s-*") + (setq-local comment-start-line-regexp + (rx (seq "--" (or (not (any "[")) + (seq "[" (zero-or-more "=") + (not (any "=["))))))) (setq-local comment-end "") ;; Pairs. diff --git a/lisp/progmodes/php-ts-mode.el b/lisp/progmodes/php-ts-mode.el index dee26915a31..452a0bffc2f 100644 --- a/lisp/progmodes/php-ts-mode.el +++ b/lisp/progmodes/php-ts-mode.el @@ -1405,6 +1405,9 @@ If FORCE is t setup comment for PHP. Depends on (seq "/" (+ "/")) (seq "/" (+ "*"))) (* (syntax whitespace))) + comment-start-line-regexp + (rx (or (seq "#" (or eol (not (any "[")))) + (seq "/" (+ "/")))) ;; reset the state of mhtml-ts-mode--comment-setup mhtml-ts-mode--comment-current-lang nil)) ;; otherwise set comment style for other languages. diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 962f9c5a031..093a8049fdd 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -7358,6 +7358,7 @@ implementations: `python-mode' and `python-ts-mode'." (setq-local comment-start "# ") (setq-local comment-start-skip "#+\\s-*") + (setq-local comment-start-line-regexp comment-start-skip) (setq-local parse-sexp-lookup-properties t) (setq-local parse-sexp-ignore-comments t) diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index f2e38e0af46..ff33f0554ba 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -2693,6 +2693,7 @@ Currently there are `ruby-mode' and `ruby-ts-mode'." (setq-local comment-end "") (setq-local comment-column ruby-comment-column) (setq-local comment-start-skip "#+ *") + (setq-local comment-start-line-regexp comment-start-skip) (setq-local parse-sexp-ignore-comments t) (setq-local parse-sexp-lookup-properties t) diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index f9d4310f367..79180da8718 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -1475,6 +1475,7 @@ implementations. Currently there are two: `sh-mode' and (setq-local paragraph-separate (concat paragraph-start "\\|#!/")) (setq-local comment-start "# ") (setq-local comment-start-skip "#+[\t ]*") + (setq-local comment-start-line-regexp comment-start-skip) (setq-local local-abbrev-table sh-mode-abbrev-table) (setq-local comint-dynamic-complete-functions sh-dynamic-complete-functions) diff --git a/lisp/textmodes/mhtml-ts-mode.el b/lisp/textmodes/mhtml-ts-mode.el index d53d74e220a..f126fbcac0d 100644 --- a/lisp/textmodes/mhtml-ts-mode.el +++ b/lisp/textmodes/mhtml-ts-mode.el @@ -362,11 +362,13 @@ Return nil if there is no name or if NODE is not a defun node." ('html (setq-local comment-start "") (setq-local comment-end-skip nil)) ('css (setq-local comment-start "/*") (setq-local comment-start-skip "/\\*+[ \t]*") + (setq-local comment-start-line-regexp nil) (setq-local comment-end "*/") (setq-local comment-end-skip "[ \t]*\\*+/")) ('javascript diff --git a/lisp/textmodes/toml-ts-mode.el b/lisp/textmodes/toml-ts-mode.el index 63e3f60edd9..b121d8917d1 100644 --- a/lisp/textmodes/toml-ts-mode.el +++ b/lisp/textmodes/toml-ts-mode.el @@ -146,6 +146,7 @@ Return nil if there is no name or if NODE is not a defun node." ;; Comments (setq-local comment-start "# ") (setq-local comment-end "") + (setq-local comment-start-line-regexp "#+ *") ;; Indent. (setq-local treesit-simple-indent-rules toml-ts-mode--indent-rules) diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el index 37925f69782..95fd4b6a78a 100644 --- a/lisp/textmodes/yaml-ts-mode.el +++ b/lisp/textmodes/yaml-ts-mode.el @@ -271,6 +271,7 @@ Calls REPORT-FN directly." (setq-local comment-start "# ") (setq-local comment-end "") (setq-local comment-start-skip "#+ *") + (setq-local comment-start-line-regexp comment-start-skip) ;; Indentation. (setq-local indent-tabs-mode nil) diff --git a/lisp/treesit.el b/lisp/treesit.el index 43544160cb3..f318e08a565 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -59,6 +59,7 @@ (require 'font-lock) (require 'seq) (require 'prog-mode) ; For `prog--text-at-point-or-region-p'. +(require 'newcomment) ; For `comment-start-line-regexp'. ;;; Function declarations @@ -3764,7 +3765,20 @@ by `text' and `sentence' in `treesit-thing-settings'." (max (point-min) (previous-single-char-property-change (point) 'treesit-parser))))))) -(defun treesit-forward-comment (&optional count) +(defun treesit--likely-line-comment-p (node) + "Return non-nil if NODE is likely a line comment." + (save-excursion + (goto-char (treesit-node-start node)) + (if comment-start-line-regexp + (looking-at-p comment-start-line-regexp) + ;; Without `comment-start-line-regexp', it's kind of best-effort. + (and comment-start + ;; If `comment-end' is non-empty, `comment-start' must be + ;; paired with it. + (string-empty-p (string-trim (or comment-end ""))) + (looking-at-p (regexp-quote (string-trim-right comment-start))))))) + +(defun treesit-forward-comment (count) "Tree-sitter `forward-comment-function' implementation. COUNT is the same as in `forward-comment'." @@ -3774,7 +3788,15 @@ COUNT is the same as in `forward-comment'." (setq thing (treesit-thing-at (point) 'comment)) (if (and thing (eq (point) (treesit-node-start thing))) (progn - (goto-char (min (1+ (treesit-node-end thing)) (point-max))) + (goto-char (treesit-node-end thing)) + ;; For line comments, go to the next line. This is + ;; important because a) for navigation convenience, and b) + ;; many functions expect `forward-comment' to behave this + ;; way (bug#80837). + (when (treesit--likely-line-comment-p thing) + (skip-chars-forward " \t") + (when (looking-at-p "\n") + (forward-char))) (setq count (1- count))) (setq count 0 res nil))) (while (< count 0) commit 0a714557ebd1c88a01e006fc1419b61d9807a76a Author: Dmitry Gutov Date: Sat Jul 25 06:45:00 2026 +0300 vc-dir: Don't resolve DIR to truename unnecessarily * lisp/vc/vc-dir.el (vc-dir): Use DIR without resolving truename if the responsible VC backend is found. (https://lists.gnu.org/archive/html/emacs-devel/2026-07/msg00147.html) diff --git a/etc/NEWS b/etc/NEWS index d8d1daaef95..653dedda04b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -150,6 +150,13 @@ includes a message saying so, with a button to override it. You can customize the new user option 'vc-dir-process-output-limit' to control how early to stop, and to disable this feature. +--- +*** M-x VC-Dir resolves symbolic link only if the directory has no backend +When called interatively, 'vc-dir' checks if the passed directory has no +VC backend. And if its truename does and 'vc-follow-symlinks' is +non-nil, the truename is used instead. Before this change, the truename +was used unconditionally. + +++ *** Improved creation of commit log entry from ChangeLog. When VC detects that all log entries for the current changeset come from diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index 0b0671a8030..e71e91e3c0a 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1995,14 +1995,21 @@ These are the commands available for use in the file status buffer: (interactive (list - ;; When you hit C-x v d in a visited VC file, - ;; the *vc-dir* buffer visits the directory under its truename; - ;; therefore it makes sense to always do that. - ;; Otherwise if you do C-x v d -> C-x C-f -> C-x v d - ;; you may get a new *vc-dir* buffer, different from the original - (file-truename (read-directory-name "VC status for directory: " - (vc-root-dir) nil t - nil)) + (let ((dir (read-directory-name "VC status for directory: " + (vc-root-dir) nil t + nil)) + truename) + ;; Try to match the result of `vc-refresh-state' in a file buffer. + ;; Otherwise if you do C-x v d -> C-x C-f -> C-x v d you may get a + ;; new *vc-dir* buffer, different from the original. + ;; If DIR has no VC backend but its truename does, use that + ;; instead of DIR. + (if (and vc-follow-symlinks + (not (vc-responsible-backend dir t)) + (not (equal dir (setq truename (file-truename dir)))) + (vc-responsible-backend truename t)) + truename + dir)) (if current-prefix-arg (intern (completing-read commit ba331c27f14adb429ef21fdf3d5c62febb7564d3 Author: Paul Eggert Date: Fri Jul 24 12:31:27 2026 -0700 Port some timestamp tests to 32-bit time_t * test/lisp/calendar/icalendar-recur-tests.el: (ict:recur-tz-observance-on): * test/lisp/gnus/gnus-icalendar-tests.el (gnus-icalendary-byday): Skip these tests, which use timestamps before 1970, if the platform does not support that, e.g., unsigned 32-bit time_t, or signed 32-bit time_t for timestamps before 1901. diff --git a/test/lisp/calendar/icalendar-recur-tests.el b/test/lisp/calendar/icalendar-recur-tests.el index 77e6f89744f..c864b8c15fa 100644 --- a/test/lisp/calendar/icalendar-recur-tests.el +++ b/test/lisp/calendar/icalendar-recur-tests.el @@ -1286,7 +1286,8 @@ from 1967 to at least 2026.") (let* ((dt (ical:make-date-time :year 1900 :month 1 :day 1 :hour 12 :minute 0 :second 0 :zone ict:est :dst nil)) - (ts (encode-time dt))) + (ts (ignore-errors (encode-time dt)))) + (skip-unless ts) ; Skip the test on platforms that can't represent 1900. (should (null (icr:tz-observance-on dt ict:tz-eastern))) (should (null (icr:tz-observance-on ts ict:tz-eastern)))) diff --git a/test/lisp/gnus/gnus-icalendar-tests.el b/test/lisp/gnus/gnus-icalendar-tests.el index e668becd54d..7b26da3a3cf 100644 --- a/test/lisp/gnus/gnus-icalendar-tests.el +++ b/test/lisp/gnus/gnus-icalendar-tests.el @@ -116,6 +116,11 @@ END:VCALENDAR ;; FIXME: is "icalendary" (not "icalendar") intentional, here and below? (ert-deftest gnus-icalendary-byday () "" + ;; Skip the test if encode-time rejects old dates. + ;; This test assumes underlying timekeeping works for dates in the 1600s, + ;; but POSIX requires only dates starting in 1970. + (skip-unless (ignore-errors (encode-time '(0 0 0 1 1 1601 1 nil -18000)))) + (let* ((tz (getenv "TZ")) (icalendar-pre-parsing-hook ;; clean up " " addresses so the parser doesn't choke... commit 0e8fbd63e96b9b775d386b19f2a64d89d91cc6e3 Author: Eli Zaretskii Date: Fri Jul 24 13:54:51 2026 +0300 Avoid errors in 'dabbrev-expand' * lisp/dabbrev.el (dabbrev-expand): Fix use of 'dabbrev--last-buffer-found': it could be a killed buffer. (Bug#81452) diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el index 9fe2904c415..be4fbae9434 100644 --- a/lisp/dabbrev.el +++ b/lisp/dabbrev.el @@ -601,7 +601,7 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion]." (message nil)) ;; To get correct further expansions we have to be sure to use the ;; buffer containing the already found expansions. - (when dabbrev--last-buffer-found + (when (buffer-live-p dabbrev--last-buffer-found) (setq buf dabbrev--last-buffer-found)) ;; If the buffer where we called dabbrev-expand differs from the ;; buffer containing the expansion, make sure copy-marker is commit 706828afa17b5be60dcaba31636599c524c16b6d Author: Michael Albinus Date: Fri Jul 24 12:20:41 2026 +0200 ; * etc/NEWS: Presentational fixes and improvements. diff --git a/etc/NEWS b/etc/NEWS index 6664bb18b80..d8d1daaef95 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -59,7 +59,7 @@ set similarly to 'setopt-local'; i.e., if a user option has a defcustom --- ** New user option 'setopt-local-type-mismatch'. This option controls what 'setopt-local' does when it detects a type -mismatch between the specified value and the :type specification of a +mismatch between the specified value and the ':type' specification of a user option. Its backward-compatible default is nil which emits a warning and accepts the type-mismatched value. You can control this by customizing 'setopt-local-type-mismatch' to a non-nil value: the value @@ -69,12 +69,12 @@ type-mismatched values; any other non-nil value prompts you whether to accept or ignore the value. --- -** Specifying a minor mode as a local variables enables that mode, -unconditionally. The previous behavior, toggling the mode, was -neither reliable nor generally desirable. +** Specifying a minor mode as a local variable enables that mode. +The previous behavior, toggling the mode, was neither reliable nor +generally desirable. +++ -** Emacs tries to display overlay arrow in the left margin. +** Emacs tries to display the overlay arrow in the left margin. On a non-graphical display (or when the left fringe is not shown), if a left margin is present, Emacs will now display the overlay arrow into this margin. Edebug is now using this feature by explicitly setting up @@ -120,41 +120,42 @@ are now buttonized, allowing using mouse or 'RET' to follow them. ** Woman --- -*** The variable 'woman-topic-history' is now obsolete +*** The variable 'woman-topic-history' is now obsolete. Use 'Man-topic-history' instead. ** VC +++ -*** VC-Dir outgoing revisions count is now asynchronous. + +*** VC Directory outgoing revisions count is now asynchronous. This means it won't get in your way even if it's slow for your repository. As such, the 'vc-dir-show-outgoing-count' option is now obsolete. --- -*** VC-Dir now shows key binding hints. +*** VC Directory now shows key binding hints. To hide these, you can customize the new user option 'vc-dir-show-key-binding-hints' to nil. Backends can supply additional hints using the new 'dir-extra-hints' backend method. --- -*** VC-Dir doesn't process very large status output by default. -If the VCS status process used to populate the VC-Dir buffer produces a -very large amount of output, it often means that you did something -accidental like renaming a subdirectory containing thousands of files, -and Emacs can become unresponsive while trying to process all the -output. Now Emacs stops early. When this happens, VC-Dir includes a -message saying so, with a button to override it. You can customize the -new user option 'vc-dir-process-output-limit' to control how early to -stop, and to disable this feature. +*** VC Directory doesn't process very large status output by default. +If the VCS status process used to populate the VC Directory buffer +produces a very large amount of output, it often means that you did +something accidental like renaming a subdirectory containing thousands +of files, and Emacs can become unresponsive while trying to process all +the output. Now Emacs stops early. When this happens, VC Directory +includes a message saying so, with a button to override it. You can +customize the new user option 'vc-dir-process-output-limit' to control +how early to stop, and to disable this feature. +++ *** Improved creation of commit log entry from ChangeLog. When VC detects that all log entries for the current changeset come from the same ChangeLog file or buffer, it now inserts the entire body of the -ChangeLog entry into the *vc-log* buffer. If the ChangeLog entry -contains a summary line, VC inserts it into the *vc-log* Summary header. +ChangeLog entry into the "*vc-log*" buffer. If the ChangeLog entry +contains a summary line, VC inserts it into the "*vc-log*" Summary header. If VC detects that the set of changed files listed in the ChangeLog entry differs from the current VC fileset, it displays a warning. @@ -171,7 +172,7 @@ A generic 'outline-search-function' implementation driven by 'outline-regexp' but do not need a custom search strategy. Install it with: - (setq-local outline-search-function #'outline-search-from-regexp) + (setq-local outline-search-function #'outline-search-from-regexp) --- *** 'outline-search-function' is now a user option. @@ -184,8 +185,8 @@ as well as the default nil and arbitrary user functions. --- *** New command to copy the URL of the selected newsticker item. -The new command 'newsticker-copy-url', bound to 'w', adds the URL of -the currently selected item in the list view to the kill-ring. +The new command 'newsticker-treeview-copy-url', bound to 'w', adds the +URL of the currently selected item in the list view to the kill ring. ** Rmail @@ -194,12 +195,13 @@ the currently selected item in the list view to the kill-ring. You can now visit such files in Rmail mode using ordinary file-visiting commands, such as 'C-x C-f'. -** timeclock +** Timeclock --- -*** New variable 'timeclock-use-24hr-format'. -If this variable is set to non-nil, displayed times (clocked in/out +*** New user option 'timeclock-use-24hr-format'. +If this option is set to non-nil, displayed times (clocked in/out since, time to leave) will use 24-hour clock instead of 12-hour clock. + * New Modes and Packages in Emacs 32.1 @@ -220,23 +222,23 @@ To install the grammars, use 'M-x markdown-ts-mode-install-parsers'. ** Pcase +++ -*** Add 'pcase-let*-strict' +*** Add 'pcase-let*-strict'. This macro is like 'pcase-let*', but signals an error if a 'pcase' pattern does not match its corresponding value. This can be useful for destructuring values when you do not wish to continue if the corresponding value is not as expected. +++ -** The transition variable 'current-time-list' now defaults to nil, -so timestamps now default to (TICKS . HZ) form instead of the older -(HIGH LOW USEC PSEC) form. +** The transition variable 'current-time-list' now defaults to nil. +Therefore, timestamps now default to '(TICKS . HZ)' form instead of the +older '(HIGH LOW USEC PSEC)' form. * Lisp Changes in Emacs 32.1 +++ -** 'ignore' is now also a place, acting as a "blackhole" like /dev/null. -E.g. (push (new-elem) (pcase (foo) (0 var1) (1 var2) (_ (ignore)))) +** 'ignore' is now also a place, acting as a "blackhole" like "/dev/null". +E.g., '(push (new-elem) (pcase (foo) (0 var1) (1 var2) (_ (ignore))))'. +++ ** 'kill-all-local-variables' can kill locals silently and reset the buffer. @@ -271,10 +273,10 @@ The HANDLER argument of 'dbus-call-method-asynchronously' can be a cons cell '(HANDLER . ERROR-HANDLER)'. ERROR-HANDLER is invoked if the method call returns with a D-Bus error; the error is passed as argument. -** elisp-scope.el +** Elisp Scope *** Custom analyzers can be associated with multiple functions. -'elisp-scope' macros that define custom analyzer functions, such as +Elisp Scope macros that define custom analyzer functions, such as 'elisp-scope-define-function-analyzer' and 'elisp-scope-define-macro-analyzer', can now take a list of symbols to which the defined analyzer should apply (or a single symbol, as before). @@ -282,7 +284,7 @@ This makes it easy to specify the same analyzer for multiple functions. *** New macro 'elisp-scope-define-function-spec'. This macro in a declarative alternative to -'elisp-scope-define-function-analyzer'. It lets you tell 'elisp-scope' +'elisp-scope-define-function-analyzer'. It lets you tell Elisp Scope how to analyze the arguments of a function by declaring the specification of each argument, rather than implementing an analyzer function as you would with 'elisp-scope-define-function-analyzer'. @@ -292,7 +294,6 @@ function as you would with 'elisp-scope-define-function-analyzer'. +++ *** Emacs has been updated to target Android 17. - Emacs has been updated to require the SDK for Android 17 (API level 37) during compilation, and to target that version of the operating system. A corollary of this change is that on Android 17 and later systems, it commit 57c5967828f0415604a393b244bd62be93262f30 Author: Paul Eggert Date: Thu Jul 23 23:02:55 2026 -0700 current-time-list now defaults to nil Change the default value from current-time-list from t to nil. This continues the transition that was begun in Emacs 29, so that functions like current-time generate timestamps in the more-efficient and more-consistent (TICKS . HZ) form. * src/timefns.c: Default to false. diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi index fc1da41af8b..cedd757555e 100644 --- a/doc/lispintro/emacs-lisp-intro.texi +++ b/doc/lispintro/emacs-lisp-intro.texi @@ -15206,12 +15206,13 @@ nil 100 @end group @group -(20615 27034 579989 697000) -(17905 55681 0 0) -(20615 26327 734791 805000)@footnote{If @code{current-time-list} is -@code{nil} the three timestamps are @code{(1351051674579989697 -. 1000000000)}, @code{(1173477761000000000 . 1000000000)}, and -@code{(1351050967734791805 . 1000000000)}, respectively.} +(1351051674579989697 . 1000000000) +(1173477761000000000 . 1000000000) +(1351050967734791805 . 1000000000)@footnote{If @code{current-time-list} is +@code{t} the three timestamps are +@code{(20615 27034 579989 697000)}, +@code{(17905 55681 0 0)}, and +@code{(20615 26327 734791 805000)}, respectively.} 13188 "-rw-r--r--" @end group diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index f86a18fd896..5c516c0b0d1 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -1467,20 +1467,20 @@ is owned by the user with name @samp{lh}. @item "users" is in the group with name @samp{users}. -@item (20614 64019 50040 152000) +@item (1351023123050040152 . 1000000000) was last accessed on October 23, 2012, at 20:12:03.050040152 UTC@. -(This timestamp is @code{(1351023123050040152 . 1000000000)} -if @code{current-time-list} is @code{nil}.) +(This timestamp is @code{(20614 64019 50040 152000)} +if @code{current-time-list} is @code{t}.) -@item (20000 23 0 0) +@item (1310720023000000000 . 1000000000) was last modified on July 15, 2001, at 08:53:43.000000000 UTC@. -(This timestamp is @code{(1310720023000000000 . 1000000000)} -if @code{current-time-list} is @code{nil}.) +(This timestamp is @code{(20000 23 0 0)} +if @code{current-time-list} is @code{t}.) -@item (20614 64555 902289 872000) +@item (1351023659902289872 . 1000000000) last had its status changed on October 23, 2012, at 20:20:59.902289872 UTC@. -(This timestamp is @code{(1351023659902289872 . 1000000000)} -if @code{current-time-list} is @code{nil}.) +(This timestamp is @code{(20614 64555 902289 872000)} +if @code{current-time-list} is @code{t}.) @item 122295 is 122295 bytes long. (It may not contain 122295 characters, though, diff --git a/doc/lispref/intro.texi b/doc/lispref/intro.texi index cc0cbfaf980..f73db91a379 100644 --- a/doc/lispref/intro.texi +++ b/doc/lispref/intro.texi @@ -504,11 +504,11 @@ if the information is not available. @example @group emacs-build-time - @result{} (25194 55894 8547 617000) + @result{} (1651169878008547617 . 1000000000) @end group @end example -(This timestamp is @code{(1651169878008547617 . 1000000000)} -if @code{current-time-list} was @code{nil} when Emacs was built.) +(This timestamp is @code{(25194 55894 8547 617000)} +if @code{current-time-list} was @code{t} when Emacs was built.) @end defvar @defvar emacs-version diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi index fb2a481c7a3..04ca0241622 100644 --- a/doc/lispref/os.texi +++ b/doc/lispref/os.texi @@ -1447,15 +1447,13 @@ The operating system limits the range of time and zone values. @end defun @defvar current-time-list -This boolean variable is a transition aid. If @code{t}, -@code{current-time} and related functions return timestamps in list -form, typically @code{(@var{high} @var{low} @var{micro} @var{pico})}; -otherwise, they use @code{(@var{ticks} . @var{hz})} form. Currently -this variable defaults to @code{t}, for behavior compatible with -previous Emacs versions. Developers are encouraged to test -timestamp-related code with this variable set to @code{nil}, as it -will default to @code{nil} in a future Emacs version, and will be -removed in some version after that. +This boolean variable is a transition aid. If @code{nil} (the default), +@code{current-time} and related functions return timestamps in +@code{(@var{ticks} . @var{hz})} form. If @code{t}, these functions +return in list form, typically @code{(@var{high} @var{low} @var{micro} +@var{pico})}, for behavior compatible with previous Emacs versions. +As it is merely a transition aid, this variable is planned to be removed +in some future Emacs version. @end defvar @defun current-time diff --git a/etc/NEWS b/etc/NEWS index 10feed8e388..6664bb18b80 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -226,6 +226,11 @@ pattern does not match its corresponding value. This can be useful for destructuring values when you do not wish to continue if the corresponding value is not as expected. ++++ +** The transition variable 'current-time-list' now defaults to nil, +so timestamps now default to (TICKS . HZ) form instead of the older +(HIGH LOW USEC PSEC) form. + * Lisp Changes in Emacs 32.1 diff --git a/src/timefns.c b/src/timefns.c index 88f5504fe35..f3471a3ce1a 100644 --- a/src/timefns.c +++ b/src/timefns.c @@ -66,11 +66,9 @@ enum { TM_YEAR_BASE = 1900 }; # define FASTER_TIMEFNS 1 #endif -/* current-time-list defaults to t, typically generating (HI LO US PS) - timestamps. To change the default to nil, generating (TICKS . HZ) - timestamps, compile with -DCURRENT_TIME_LIST=0. */ +/* current-time-list defaults to nil, generating (TICKS . HZ) timestamps. */ #ifndef CURRENT_TIME_LIST -enum { CURRENT_TIME_LIST = true }; +enum { CURRENT_TIME_LIST = false }; #endif #if FASTER_TIMEFNS && !FIXNUM_OVERFLOW_P (1000000000) @@ -2112,14 +2110,12 @@ syms_of_timefns (void) DEFVAR_BOOL ("current-time-list", current_time_list, doc: /* Whether `current-time' should return list or (TICKS . HZ) form. -This boolean variable is a transition aid. If t, `current-time' and -related functions return timestamps in list form, typically -\(HIGH LOW USEC PSEC); otherwise, they use (TICKS . HZ) form. -Currently this variable defaults to t, for behavior compatible with -previous Emacs versions. 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 in some -version after that. */); +This boolean variable is a transition aid. If nil (the default), +`current-time' and related functions return timestamps in (TICKS . HZ) +form. If t, these functions return in list form, typically (HIGH LOW +USEC PSEC), for behavior compatible with previous Emacs versions. As it +is merely a transition aid, this variable is planned to be removed in +some future Emacs version. */); current_time_list = CURRENT_TIME_LIST; defsubr (&Scurrent_time); commit 21c979ee6088da645636f8751ad873c38dad830f Author: Sean Whitton Date: Thu Jul 23 20:12:33 2026 +0100 vc-dir-mode: Tidy handling of read-only status * lisp/vc/vc-dir.el (vc-dir-mode): Delete unneeded binding of buffer-read-only in :after-hook. Bind inhibit-read-only instead of buffer-read-only. diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index deac4cde4a9..0b0671a8030 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1479,7 +1479,7 @@ the *vc-dir* buffer. ;; modes are activated before the calls to `substitute-command-keys' ;; in `vc-dir-headers'. Then any bindings shadowed by minor modes ;; won't be included in the key binding hints. - :after-hook (let (buffer-read-only) (vc-dir-refresh)) + :after-hook (vc-dir-refresh) (setq-local vc-dir-backend use-vc-backend) (setq-local desktop-save-buffer 'vc-dir-desktop-buffer-misc-data) (setq-local bookmark-make-record-function #'vc-dir-bookmark-make-record) @@ -1487,7 +1487,7 @@ the *vc-dir* buffer. (setq buffer-read-only t) (when (boundp 'tool-bar-map) (setq-local tool-bar-map vc-dir-tool-bar-map)) - (let (buffer-read-only) + (let ((inhibit-read-only t)) (erase-buffer) (setq-local vc-dir-process-buffer nil) (setq-local vc-ewoc (ewoc-create #'vc-dir-printer)) commit 492dd426331aab3e8571fa56967ae149900693a4 Author: Paul Eggert Date: Thu Jul 23 11:23:36 2026 -0700 Pacify gcc -Wanalyzer-null-dereference in load_comp_init This pacifies gcc 16.1.1 20260515 (Red Hat 16.1.1-2) when Emacs is configured with --enable-gcc-warnings. * src/comp.c (load_comp_unit): Change eassert to eassume. diff --git a/src/comp.c b/src/comp.c index 80910cb3896..3f2d1ad6281 100644 --- a/src/comp.c +++ b/src/comp.c @@ -5244,7 +5244,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, comp_u->loaded_once = !NILP (*saved_cu); Lisp_Object *data_eph_relocs = find_relocs (handle, DATA_RELOC_EPHEMERAL_ADDR_SYM); - eassert (data_eph_relocs); + eassume (data_eph_relocs); /* While resurrecting from an image dump loading more than once the same compilation unit does not make any sense. */ commit 53e564eebb64e8a2816bc038dff7b9fbc22a7b8c Author: Paul Eggert Date: Thu Jul 23 11:28:04 2026 -0700 Insulate doc against N. American timezone changes Recent changes to the meaning of "Pacific Time" in western Canada, along with possible broader changes to US timekeeping in the US Sunshine Protection bill (H.R. 139), make it advisable to avoid using examples like "PST" in Emacs documentation as these abbreviations are too likely to be ambiguous. Use more-stable abbreviations like "IST" and "JST". diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi index 59e0fe90a46..fb2a481c7a3 100644 --- a/doc/lispref/os.texi +++ b/doc/lispref/os.texi @@ -1534,9 +1534,10 @@ in. The value has the form @code{(@var{offset} @var{abbr})}. Here @var{offset} is an integer giving the number of seconds ahead of Universal Time (east of Greenwich). A negative value means west of Greenwich. The -second element, @var{abbr}, is a string giving an abbreviation for the -time zone, e.g., @samp{"CST"} for China Standard Time or for -U.S. Central Standard Time. Both elements can change when daylight +second element, @var{abbr}, is a string giving a possibly-ambiguous +abbreviation for the time zone, e.g., @samp{"IST"} for India Standard +Time, Irish Standard Time, or Israel Standard Time. +Both elements can change when daylight saving time begins or ends; if the user has specified a time zone that does not use a seasonal time adjustment, then the value is constant through time. @@ -1981,7 +1982,7 @@ This stands for the year without century (00--99). @item %Y This stands for the year with century. @item %Z -This stands for the time zone abbreviation (e.g., @samp{EST}). +This stands for the time zone abbreviation (e.g., @samp{IST}). @item %z This stands for the time zone numerical offset. The @samp{z} can be preceded by one, two, or three colons; if plain @samp{%z} stands for diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi index 72690e8d286..636b024d50c 100644 --- a/doc/misc/calc.texi +++ b/doc/misc/calc.texi @@ -17367,8 +17367,8 @@ and @kbd{t U}, the normal argument is then taken from the second-to-top stack position.) This allows you to give a non-integer time zone adjustment. The time-zone argument can also be an HMS form, or it can be a variable which is a time zone name in upper- or lower-case. -For example @samp{tzone(PST) = tzone(8)} and @samp{tzone(pdt) = tzone(7)} -(for Pacific standard and daylight saving times, respectively). +For example @samp{tzone(JST) = tzone(-9)} and @samp{tzone(gmt) = tzone(0)} +(for Japan standard and Greenwich mean time, respectively). North American and European time zone names are defined as follows. These names are obsolescent and new code should not rely on them: @@ -17399,13 +17399,13 @@ To define time zone names that do not appear in the above table, you must modify the Lisp variable @code{math-tzone-names}. This is a list of lists describing the different time zone names; its structure is best explained by an example. The three entries for -circa-2025 US Pacific Time look like this: +circa-2026 time in Sydney, Australia might look like this: @smallexample @group -( ( "PST" 8 0 ) ; Name as an upper-case string, then standard - ( "PDT" 8 -1 ) ; adjustment, then daylight saving adjustment. - ( "PGT" 8 "PST" "PDT" ) ) ; Generalized time zone. +(("AEST" -10 0) ; Name as an upper-case string, then standard + ("AEDT" -10 -1) ; adjustment, then daylight saving adjustment. + ("AEGT" -10 "AEST" "AEDT")) ; Generalized time zone. @end group @end smallexample diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index f80d49ca343..00644c2c997 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -150,7 +150,7 @@ This string specifies the format of the timestamp being echoed in the minibuffer." :type '(choice (const :tag "Timestamped Monday, 15:04:05" "Timestamped %A, %H:%M:%S") - (const :tag "2006-01-02 15:04:05 MST" "%F %T %Z") + (const :tag "2026-07-21 15:04:05 JST" "%F %T %Z") string)) (defcustom erc-echo-timestamp-zone nil diff --git a/lisp/gnus/nndiary.el b/lisp/gnus/nndiary.el index eef00938453..8c7f815652f 100644 --- a/lisp/gnus/nndiary.el +++ b/lisp/gnus/nndiary.el @@ -345,7 +345,8 @@ all. This may very well take some time.") ;; The list of time zone values is obsolescent, and new code should ;; not rely on it. Many of the time zone abbreviations are wrong; ;; in particular, all single-letter abbreviations other than "Z" have - ;; been wrong since Internet RFC 2822 (2001). However, the + ;; been wrong since Internet RFC 2822 (2001), and abbreviations like "PST" + ;; do not match current practice in some locations. However, the ;; abbreviations have not been changed due to backward compatibility ;; concerns. ) diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el index df5acfa629a..d2bb7acc470 100644 --- a/lisp/time-stamp.el +++ b/lisp/time-stamp.el @@ -57,7 +57,7 @@ with %, which are converted as follows: %S seconds %w day number of week, Sunday is 0 %Y 4-digit year %y 2-digit year -%Z time zone name: `EST' +%Z time zone name: `JST' %-z zone offset with hour: `-08' %:::z adds colons as needed: `+05:30' %5z zone offset with mins: `-0800' %:z adds colon: `-08:00' commit b1a5151dbbe1579c77fbc61f11f39ae3f709cf23 Author: Michael Albinus Date: Thu Jul 23 18:39:16 2026 +0200 ; Fix last change, again diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 4246e82080f..eb0bc649d69 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2257,8 +2257,7 @@ without a visible progress reporter." ;; Stop progress reporter. (when (and tm pr) (cancel-timer tm) - (cl-letf (((symbol-function #'progress-reporter-echo-area) - #'ignore)) + (let (message-log-max) (progress-reporter-done pr))) (tramp-message ,vec ,level "%s...%s" ,message cookie))))) commit 7e0a44946469539eb5bb6b342b452c323d6c4a19 Author: Sean Whitton Date: Thu Jul 23 17:35:06 2026 +0100 vc-dir-mode: Delay call to vc-dir-refresh until after mode hooks * lisp/vc/vc-dir.el (vc-dir-mode): Delay call to vc-dir-refresh until after mode hooks, using :after-hook. diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index b95e613ec2d..deac4cde4a9 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1475,6 +1475,11 @@ commands act on the child files of that directory that are displayed in the *vc-dir* buffer. \\{vc-dir-mode-map}" + ;; Delay the initial refresh until after mode hooks so that any minor + ;; modes are activated before the calls to `substitute-command-keys' + ;; in `vc-dir-headers'. Then any bindings shadowed by minor modes + ;; won't be included in the key binding hints. + :after-hook (let (buffer-read-only) (vc-dir-refresh)) (setq-local vc-dir-backend use-vc-backend) (setq-local desktop-save-buffer 'vc-dir-desktop-buffer-misc-data) (setq-local bookmark-make-record-function #'vc-dir-bookmark-make-record) @@ -1482,7 +1487,7 @@ the *vc-dir* buffer. (setq buffer-read-only t) (when (boundp 'tool-bar-map) (setq-local tool-bar-map vc-dir-tool-bar-map)) - (let ((buffer-read-only nil)) + (let (buffer-read-only) (erase-buffer) (setq-local vc-dir-process-buffer nil) (setq-local vc-ewoc (ewoc-create #'vc-dir-printer)) @@ -1492,8 +1497,7 @@ the *vc-dir* buffer. ;; Make sure that if the directory buffer is killed, the update ;; process running in the background is also killed. (add-hook 'kill-buffer-query-functions #'vc-dir-kill-query nil t) - (hack-dir-local-variables-non-file-buffer) - (vc-dir-refresh))) + (hack-dir-local-variables-non-file-buffer))) (defvar-keymap vc-dir-outgoing-revisions-map :doc "Local keymap for viewing outgoing revisions." commit 389be0b24781bdf81679beb39042ff2bd9a1c275 Author: Stefan Monnier Date: Thu Jul 23 11:22:54 2026 -0400 (itree_remove): Use `itree_validate` (bug#81448) * src/itree.c (itree_contains): Don't use ITREE_FOREACH. It has side-effects (makes some nodes clean) which is undesirable for this function that is used only in assertions. Suggested by Helmut Eller . (itree_remove): Use `itree_validate`. diff --git a/src/itree.c b/src/itree.c index e7cfd57705d..ac5578684a4 100644 --- a/src/itree.c +++ b/src/itree.c @@ -380,7 +380,7 @@ itree_inherit_offset (uintmax_t otick, struct itree_node *node) } /* The only thing that matters about 'otick' is whether it's equal to that of the tree. We could also "blindly" inherit from parent->otick, - but we need to tree's 'otick' anyway for when there's no parent. */ + but we need the tree's 'otick' anyway for when there's no parent. */ if (node->parent == NULL || node->parent->otick == otick) node->otick = otick; } @@ -767,12 +767,16 @@ static bool itree_contains (struct itree_tree *tree, struct itree_node *node) { eassert (node); - struct itree_node *other; - ITREE_FOREACH (other, tree, node->begin, PTRDIFF_MAX, ASCENDING) - if (other == node) - return true; - - return false; + struct itree_node *root = tree->root; + while (node != root) + { + struct itree_node *parent = node->parent; + if (!parent) + return false; + eassert (parent->left == node || parent->right == node); + node = parent; + } + return true; } static bool @@ -964,10 +968,15 @@ itree_remove (struct itree_tree *tree, struct itree_node *node) eassert (itree_contains (tree, node)); eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ + /* We can get here straight from, say, 'move-overlay', so NODE may be dirty. + Strictly speaking, we could propagate NODE's offset to its children + locally (and thus leave it dirty if there are pending offsets higher + up the tree), but it's not clear it's worth the added complexity + in the resulting invariants. */ + itree_validate (tree, node); /* Find 'splice', the leaf node to splice out of the tree. When 'node' has at most one child this is 'node' itself. Otherwise, it is the in order successor of 'node'. */ - itree_inherit_offset (tree->otick, node); struct itree_node *splice = (node->left == NULL || node->right == NULL) ? node commit 5df6b1ad65ea80a4f6fdd91df83531c22a307b3b Author: Aaron L. Zeng Date: Wed Jul 22 16:25:30 2026 -0400 VC: Prevent outgoing revision count process from querying on exit * lisp/vc/vc-dir.el (vc-dir--count-outgoing): Set query-on-exit flag for this process to nil (bug#81454). Copyright-paperwork-exempt: yes diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index 1ba834d94cc..b95e613ec2d 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1542,6 +1542,7 @@ uses OVERLAY." (current-buffer) '(log-outgoing short)) (setq proc (get-buffer-process (current-buffer))) + (set-process-query-on-exit-flag proc nil) (overlay-put overlay 'proc proc) (vc-run-delayed (unwind-protect commit e4df903f6b5946fde7ecb3619c2b7ef8bc2331ce Author: Michael Albinus Date: Thu Jul 23 15:56:02 2026 +0200 ; Fix last change * lisp/net/tramp.el (with-tramp-progress-reporter): Deactivate `progress-reporter-echo-area' when calling `progress-reporter-done'. We call `tramp-message' instead. * lisp/net/tramp-fuse.el (tramp-fuse-handle-insert-directory): * lisp/net/tramp-sh.el (tramp-sh-handle-insert-directory): Use progress reporter. diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el index f7abddab1a1..8cf2b939f4f 100644 --- a/lisp/net/tramp-fuse.el +++ b/lisp/net/tramp-fuse.el @@ -108,11 +108,16 @@ (defun tramp-fuse-handle-insert-directory (filename switches &optional wildcard full-directory-p) "Like `insert-directory' for Tramp files." - (insert-directory - (tramp-fuse-local-file-name filename) switches wildcard full-directory-p) - (goto-char (point-min)) - (while (search-forward (tramp-fuse-local-file-name filename) nil 'noerror) - (replace-match filename))) + (with-tramp-progress-reporter + (tramp-dissect-file-name filename) + 0 (format "Opening directory %s" filename) + (insert-directory + (tramp-fuse-local-file-name filename) + switches wildcard full-directory-p) + (goto-char (point-min)) + (while + (search-forward (tramp-fuse-local-file-name filename) nil 'noerror) + (replace-match filename)))) (defun tramp-fuse-handle-make-directory (dir &optional parents) "Like `make-directory' for Tramp files." diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index f939635cfb5..f567a221342 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2775,174 +2775,183 @@ The method used must be an out-of-band method." (unless wildcard (access-file filename "Reading directory")) (with-parsed-tramp-file-name (expand-file-name filename) nil - (let ((dired (tramp-get-ls-command-with v "--dired"))) - (when (stringp switches) - (setq switches (split-string switches))) - ;; Newer coreutils versions of ls (9.5 and up) imply long format - ;; output when "--dired" is given. Suppress this implicit rule. - (when dired - (let ((tem switches) - case-fold-search) - (catch 'long - (while tem - (when (and (not (string-match-p "--" (car tem))) - (string-match-p "l" (car tem))) - (throw 'long nil)) - (setq tem (cdr tem))) - (setq dired nil)))) - (setq switches - (append switches (split-string (tramp-sh--quoting-style-options v)) - (when dired `(,dired)))) - (unless dired - (setq switches (seq-difference switches '("-N" "--dired"))))) - (when wildcard - (setq wildcard (tramp-run-real-handler - #'file-name-nondirectory (list localname))) - (setq localname (tramp-run-real-handler - #'file-name-directory (list localname)))) - (unless (or full-directory-p (member "-d" switches)) - (setq switches (append switches '("-d")))) - (setq switches (seq-uniq switches) - switches (mapconcat #'tramp-shell-quote-argument switches " ")) - (when wildcard - (setq switches (concat switches " " wildcard))) - (tramp-message - v 4 "Inserting directory `ls %s %s', wildcard %s, fulldir %s" - switches filename (if wildcard "yes" "no") - (if full-directory-p "yes" "no")) - ;; If `full-directory-p', we just say `ls -l FILENAME'. Else we - ;; chdir to the parent directory, then say `ls -ld BASENAME'. - (if full-directory-p + (with-tramp-progress-reporter + v 0 (format "Opening directory %s" filename) + (let ((dired (tramp-get-ls-command-with v "--dired"))) + (when (stringp switches) + (setq switches (split-string switches))) + ;; Newer coreutils versions of ls (9.5 and up) imply long + ;; format output when "--dired" is given. Suppress this + ;; implicit rule. + (when dired + (let ((tem switches) + case-fold-search) + (catch 'long + (while tem + (when (and (not (string-match-p "--" (car tem))) + (string-match-p "l" (car tem))) + (throw 'long nil)) + (setq tem (cdr tem))) + (setq dired nil)))) + (setq switches + (append switches + (split-string (tramp-sh--quoting-style-options v)) + (when dired `(,dired)))) + (unless dired + (setq switches (seq-difference switches '("-N" "--dired"))))) + (when wildcard + (setq wildcard (tramp-run-real-handler + #'file-name-nondirectory (list localname))) + (setq localname (tramp-run-real-handler + #'file-name-directory (list localname)))) + (unless (or full-directory-p (member "-d" switches)) + (setq switches (append switches '("-d")))) + (setq switches (seq-uniq switches) + switches (mapconcat #'tramp-shell-quote-argument switches " ")) + (when wildcard + (setq switches (concat switches " " wildcard))) + (tramp-message + v 4 "Inserting directory `ls %s %s', wildcard %s, fulldir %s" + switches filename (if wildcard "yes" "no") + (if full-directory-p "yes" "no")) + ;; If `full-directory-p', we just say `ls -l FILENAME'. Else + ;; we chdir to the parent directory, then say `ls -ld + ;; BASENAME'. + (if full-directory-p + (tramp-send-command + v (format "%s %s %s 2>%s" + (tramp-get-ls-command v) + switches + (if wildcard + localname + (tramp-shell-quote-argument (concat localname "."))) + (tramp-get-remote-null-device v))) + (tramp-barf-unless-okay + v (format "cd %s" (tramp-shell-quote-argument + (tramp-run-real-handler + #'file-name-directory (list localname)))) + "Couldn't `cd %s'" + (tramp-shell-quote-argument + (tramp-run-real-handler #'file-name-directory (list localname)))) (tramp-send-command v (format "%s %s %s 2>%s" (tramp-get-ls-command v) switches - (if wildcard - localname - (tramp-shell-quote-argument (concat localname "."))) - (tramp-get-remote-null-device v))) - (tramp-barf-unless-okay - v (format "cd %s" (tramp-shell-quote-argument - (tramp-run-real-handler - #'file-name-directory (list localname)))) - "Couldn't `cd %s'" - (tramp-shell-quote-argument - (tramp-run-real-handler #'file-name-directory (list localname)))) - (tramp-send-command - v (format "%s %s %s 2>%s" - (tramp-get-ls-command v) - switches - (if (or wildcard - (tramp-string-empty-or-nil-p - (tramp-run-real-handler - #'file-name-nondirectory (list localname)))) - "" - (tramp-shell-quote-argument - (tramp-run-real-handler - #'file-name-nondirectory (list localname)))) - (tramp-get-remote-null-device v)))) - - (let ((beg-marker (copy-marker (point) nil)) - (end-marker (copy-marker (point) t)) - (emc enable-multibyte-characters)) - ;; We cannot use `insert-buffer-substring' because the Tramp - ;; buffer changes its contents before insertion due to calling - ;; `expand-file-name' and alike. - (insert (tramp-get-buffer-string (tramp-get-buffer v))) - - ;; We must enable unibyte strings, because the "--dired" - ;; output counts in bytes. - (set-buffer-multibyte nil) - (save-restriction - (narrow-to-region beg-marker end-marker) - ;; Check for "--dired" output. - (when (search-backward-regexp - (rx bol "//DIRED//" (+ blank) (group (+ nonl)) eol) - nil 'noerror) - (let ((beg (match-beginning 1)) - (end (match-end 0))) - ;; Now read the numeric positions of file names. - (goto-char beg) - (while (< (point) end) - (let ((start (+ (point-min) (read (current-buffer)))) - (end (+ (point-min) (read (current-buffer))))) - (if (memq (char-after end) '(?\n ?\ )) - ;; End is followed by \n or by " -> ". - (put-text-property start end 'dired-filename t)))))) - ;; Remove trailing lines. - (goto-char (point-max)) - (while (search-backward-regexp (rx bol "//") nil 'noerror) - (forward-line 1) - (delete-region (match-beginning 0) (point)))) - ;; Reset multibyte if needed. - (set-buffer-multibyte emc) - - (save-restriction - (narrow-to-region beg-marker end-marker) - ;; Some busyboxes are reluctant to discard colors. - (unless (string-search - "color" (tramp-get-connection-property v "ls" "")) - (goto-char (point-min)) - (while (search-forward-regexp ansi-color-control-seq-regexp nil t) - (replace-match ""))) - - ;; Now decode what read if necessary. Stolen from `insert-directory'. - (let ((coding (or coding-system-for-read - file-name-coding-system - default-file-name-coding-system - 'undecided)) - coding-no-eol - val pos) - (when (and enable-multibyte-characters - (not (memq (coding-system-base coding) - '(raw-text no-conversion)))) - ;; If no coding system is specified or detection is - ;; requested, detect the coding. - (if (eq (coding-system-base coding) 'undecided) - (setq coding (detect-coding-region (point-min) (point) t))) - (unless (eq (coding-system-base coding) 'undecided) - (setq coding-no-eol - (coding-system-change-eol-conversion coding 'unix)) - (goto-char (point-min)) - (while (not (eobp)) - (setq pos (point) - val (get-text-property (point) 'dired-filename)) - (goto-char (next-single-property-change - (point) 'dired-filename nil (point-max))) - ;; Force no eol conversion on a file name, so that - ;; CR is preserved. - (decode-coding-region - pos (point) (if val coding-no-eol coding)) - (if val (put-text-property pos (point) 'dired-filename t)))))) - - ;; The inserted file could be from somewhere else. - (when (and (not wildcard) (not full-directory-p)) + (if (or wildcard + (tramp-string-empty-or-nil-p + (tramp-run-real-handler + #'file-name-nondirectory (list localname)))) + "" + (tramp-shell-quote-argument + (tramp-run-real-handler + #'file-name-nondirectory (list localname)))) + (tramp-get-remote-null-device v)))) + + (let ((beg-marker (copy-marker (point) nil)) + (end-marker (copy-marker (point) t)) + (emc enable-multibyte-characters)) + ;; We cannot use `insert-buffer-substring' because the Tramp + ;; buffer changes its contents before insertion due to + ;; calling `expand-file-name' and alike. + (insert (tramp-get-buffer-string (tramp-get-buffer v))) + + ;; We must enable unibyte strings, because the "--dired" + ;; output counts in bytes. + (set-buffer-multibyte nil) + (save-restriction + (narrow-to-region beg-marker end-marker) + ;; Check for "--dired" output. + (when (search-backward-regexp + (rx bol "//DIRED//" (+ blank) (group (+ nonl)) eol) + nil 'noerror) + (let ((beg (match-beginning 1)) + (end (match-end 0))) + ;; Now read the numeric positions of file names. + (goto-char beg) + (while (< (point) end) + (let ((start (+ (point-min) (read (current-buffer)))) + (end (+ (point-min) (read (current-buffer))))) + (if (memq (char-after end) '(?\n ?\ )) + ;; End is followed by \n or by " -> ". + (put-text-property start end 'dired-filename t)))))) + ;; Remove trailing lines. (goto-char (point-max)) - (when (file-symlink-p filename) - (goto-char (search-backward "->" (point-min) 'noerror))) - (search-backward - (if (directory-name-p filename) - "." - (file-name-nondirectory filename)) - (point-min) 'noerror) - (replace-match (file-relative-name filename) t)) - - ;; Try to insert the amount of free space. - (goto-char (point-min)) - ;; First find the line to put it on. - (when-let* (((search-forward-regexp - (rx bol (group (* blank) "total")) nil t)) - ;; Emacs 29.1 or later. - ((not (fboundp 'dired--insert-disk-space))) - (available (get-free-disk-space "."))) - ;; Replace "total" with "total used", to avoid confusion. - (replace-match "\\1 used in directory") - (end-of-line) - (insert " available " available))) - - (prog1 (goto-char end-marker) - (set-marker beg-marker nil) - (set-marker end-marker nil)))))) + (while (search-backward-regexp (rx bol "//") nil 'noerror) + (forward-line 1) + (delete-region (match-beginning 0) (point)))) + ;; Reset multibyte if needed. + (set-buffer-multibyte emc) + + (save-restriction + (narrow-to-region beg-marker end-marker) + ;; Some busyboxes are reluctant to discard colors. + (unless (string-search + "color" (tramp-get-connection-property v "ls" "")) + (goto-char (point-min)) + (while + (search-forward-regexp ansi-color-control-seq-regexp nil t) + (replace-match ""))) + + ;; Now decode what read if necessary. Stolen from + ;; `insert-directory'. + (let ((coding (or coding-system-for-read + file-name-coding-system + default-file-name-coding-system + 'undecided)) + coding-no-eol + val pos) + (when (and enable-multibyte-characters + (not (memq (coding-system-base coding) + '(raw-text no-conversion)))) + ;; If no coding system is specified or detection is + ;; requested, detect the coding. + (if (eq (coding-system-base coding) 'undecided) + (setq coding + (detect-coding-region (point-min) (point) t))) + (unless (eq (coding-system-base coding) 'undecided) + (setq coding-no-eol + (coding-system-change-eol-conversion coding 'unix)) + (goto-char (point-min)) + (while (not (eobp)) + (setq pos (point) + val (get-text-property (point) 'dired-filename)) + (goto-char (next-single-property-change + (point) 'dired-filename nil (point-max))) + ;; Force no eol conversion on a file name, so that + ;; CR is preserved. + (decode-coding-region + pos (point) (if val coding-no-eol coding)) + (when val + (put-text-property pos (point) 'dired-filename t)))))) + + ;; The inserted file could be from somewhere else. + (when (and (not wildcard) (not full-directory-p)) + (goto-char (point-max)) + (when (file-symlink-p filename) + (goto-char (search-backward "->" (point-min) 'noerror))) + (search-backward + (if (directory-name-p filename) + "." + (file-name-nondirectory filename)) + (point-min) 'noerror) + (replace-match (file-relative-name filename) t)) + + ;; Try to insert the amount of free space. + (goto-char (point-min)) + ;; First find the line to put it on. + (when-let* (((search-forward-regexp + (rx bol (group (* blank) "total")) nil t)) + ;; Emacs 29.1 or later. + ((not (fboundp 'dired--insert-disk-space))) + (available (get-free-disk-space "."))) + ;; Replace "total" with "total used", to avoid confusion. + (replace-match "\\1 used in directory") + (end-of-line) + (insert " available " available))) + + (prog1 (goto-char end-marker) + (set-marker beg-marker nil) + (set-marker end-marker nil))))))) ;; Canonicalization of file names. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index b461f8b3cd1..4246e82080f 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2236,13 +2236,14 @@ without a visible progress reporter." (progn ,@body) (tramp-message ,vec ,level "%s..." ,message) (let* ((cookie "failed") + ;; We create a pulsing progress reporter when there is no + ;; other progress reporter running, and when there is a + ;; minimum level. (pr (and (null tramp-inhibit-progress-reporter) (<= ,level (min tramp-verbose 3)) (make-progress-reporter ,message))) + ;; We start it after 3 seconds. (tm - ;; We start a pulsing progress reporter after 3 seconds. - ;; Start only when there is no other progress reporter - ;; running, and when there is a minimum level. (when pr (run-at-time 3 0.1 #'tramp-progress-reporter-update pr)))) (unwind-protect @@ -2254,8 +2255,11 @@ without a visible progress reporter." ,@body) (setq cookie "done")) ;; Stop progress reporter. - (when tm (cancel-timer tm)) - (when pr (progress-reporter-done pr)) + (when (and tm pr) + (cancel-timer tm) + (cl-letf (((symbol-function #'progress-reporter-echo-area) + #'ignore)) + (progress-reporter-done pr))) (tramp-message ,vec ,level "%s...%s" ,message cookie))))) (defmacro with-tramp-timeout (list &rest body) commit 1f9a492aeace12c0e49cf8ac3e0b09fb8a82ddb3 Author: Stéphane Marks Date: Wed Jul 22 17:03:23 2026 -0400 Fix 'with-tramp-progress-reporter' (bug#81455) Clear stateful progress reporters like 'system-taskbar'. * lisp/net/tramp.el (with-tramp-progress-reporter): Call 'progress-reporter-done' in 'unwind-protect'. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 41dcffd8b19..b461f8b3cd1 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2235,15 +2235,16 @@ without a visible progress reporter." `(if (or noninteractive inhibit-message) (progn ,@body) (tramp-message ,vec ,level "%s..." ,message) - (let ((cookie "failed") - (tm - ;; We start a pulsing progress reporter after 3 seconds. - ;; Start only when there is no other progress reporter - ;; running, and when there is a minimum level. - (when-let* ((pr (and (null tramp-inhibit-progress-reporter) - (<= ,level (min tramp-verbose 3)) - (make-progress-reporter ,message)))) - (run-at-time 3 0.1 #'tramp-progress-reporter-update pr)))) + (let* ((cookie "failed") + (pr (and (null tramp-inhibit-progress-reporter) + (<= ,level (min tramp-verbose 3)) + (make-progress-reporter ,message))) + (tm + ;; We start a pulsing progress reporter after 3 seconds. + ;; Start only when there is no other progress reporter + ;; running, and when there is a minimum level. + (when pr + (run-at-time 3 0.1 #'tramp-progress-reporter-update pr)))) (unwind-protect ;; Execute the body. (prog1 @@ -2253,7 +2254,8 @@ without a visible progress reporter." ,@body) (setq cookie "done")) ;; Stop progress reporter. - (if tm (cancel-timer tm)) + (when tm (cancel-timer tm)) + (when pr (progress-reporter-done pr)) (tramp-message ,vec ,level "%s...%s" ,message cookie))))) (defmacro with-tramp-timeout (list &rest body) commit 301cb3218f1e510df92f94def757ed885e612e05 Merge: 6bb54378700 7726d55ea0b Author: Sean Whitton Date: Thu Jul 23 13:58:56 2026 +0100 Merge from origin/emacs-31 7726d55ea0b ; * admin/make-tarball.txt: Don't use "regenerate" in one... 3bd3dd6a27d ; * admin/make-tarball.txt: Streamline the process in sev... commit 6bb54378700b67d67e8a29682d0bd33ddf3bdc7d Merge: cef2206c974 57581b8bc2f Author: Sean Whitton Date: Thu Jul 23 13:58:56 2026 +0100 ; Merge from origin/emacs-31 The following commits were skipped: 57581b8bc2f ; Update ldefs-boot.el. 60da04d1792 Bump Emacs version to 31.0.91 commit cef2206c9742e117c8e775e9c5ec88c1b0d7cfc4 Merge: baf195d1eb9 d8af3181182 Author: Sean Whitton Date: Thu Jul 23 13:58:56 2026 +0100 Merge from origin/emacs-31 d8af3181182 ; Update exported ChangeLog files and etc/AUTHORS 1bd56ff9327 ; Fix last change. 76c8065bf63 VC-Annotate menu: Fix inserting "Span NN.NN days" entries 7822f2d5ea7 Fix typo in Fmatch_end's doc string d365328e6d9 Fix false positive warnings in 'elisp-flymake-checkdoc' w... 58e4dc3c53a Fix void-function on push-button in goto-address-mode 429336b409e Fix perl-calculate-indent fc3ba094015 * admin/notes/documentation: Describe quoting of key names. ade36467bf5 Fix 'url-parse-query-string' 94ee683d63e markdown-ts-mode: Fix code-block fontification leak commit 7726d55ea0b5017f608b663e2cc2dffca3bbd677 Author: Sean Whitton Date: Thu Jul 23 13:58:19 2026 +0100 ; * admin/make-tarball.txt: Don't use "regenerate" in one place. diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt index eb245ae1f1b..51908478877 100644 --- a/admin/make-tarball.txt +++ b/admin/make-tarball.txt @@ -137,8 +137,8 @@ General steps (for each step, check for possible errors): ; Update exported ChangeLog files and etc/AUTHORS - * ChangeLog.N: Update. - * etc/AUTHORS: Regenerate. + * ChangeLog.N: + * etc/AUTHORS: Update. (i.e. these changes should be merged to master -- don't say "regenerate" or "re-generate" so they aren't skipped). commit 3bd3dd6a27db35031266e0bac055b6449a4ce1d0 Author: Sean Whitton Date: Thu Jul 23 13:56:24 2026 +0100 ; * admin/make-tarball.txt: Streamline the process in several ways. diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt index 8299668a8a6..eb245ae1f1b 100644 --- a/admin/make-tarball.txt +++ b/admin/make-tarball.txt @@ -1,14 +1,14 @@ Instructions to create pretest or release tarballs. -*- coding: utf-8 -*- --- originally written by Gerd Möllmann, amended by Francesco Potortì - with the initial help of Eli Zaretskii +-- originally written by Gerd Möllmann; amended by Francesco Potortì + with the initial help of Eli Zaretskii; amended by Sean Whitton Preparations: 0. In order to upload to the GNU FTP server, you must be registered as an Emacs maintainer and have your GPG key acknowledged by the FTP - people. Do this as soon as possible to avoid lead time. For - instructions, see: + people. Do this as soon as possible to avoid lead time. + For instructions, see: . Steps to take before starting on the first pretest in any release sequence: @@ -16,57 +16,64 @@ Steps to take before starting on the first pretest in any release sequence: 0. The release branch (e.g. emacs-31) should already have been made and you should use it for all that follows. Diffs from this branch should be going to the emacs-diffs mailing list. + Check that it builds and that 'make check' passes. + + If there has been a change in who is the Emacs maintainer since the + last release, update doc/misc/ack.texi and admin/MAINTAINERS to + reflect this. You can commit this separately. 1. Decide on versions of m4 and autoconf, and ensure you will have them available for the duration of the release process. -2. Remove any old pretests from . - You can use 'gnupload --delete' (see below for more gnupload details). +2. Ensure you have the gnulib script + "build-aux/gnupload" available (/usr/share/gnulib/build-aux/gnupload + on Debian and its derivatives with the 'gnulib' and 'ncftp' packages + installed). 3. Check that all new Lisp libraries belong to sensible packages. Run "make -C lisp finder-data" and check the diff of the generated file against the previously released Emacs version to see what has changed. -4. If this is an emergency release without a prior pretest, inform the - maintainers of the bundled packages which are developed separately - to make sure they install adjustments required for an official - release. Currently, these packages include: +4. If this is an emergency release without a prior pretest, inform the + maintainers of the bundled packages which are developed separately + to make sure they install adjustments required for an official + release. Currently, these packages include: - . Tramp + . Tramp General steps (for each step, check for possible errors): -1. git pull # fetch from the repository - git status # check for locally modified files +1. Ensure that you have a clean, unmodified Git state. The easiest way + is to use a new Git worktree. First switch branches in your + existing worktrees so that you don't have the emacs-NN branch + checked out anywhere. Then, from a buffer with default-directory in + one of those worktrees, + + C-x v w c ~/src/emacs/tarballs/ RET emacs-NN RET - Ensure that you have a clean, unmodified state. - If you switched in-place from another branch to the release branch, - there could be inappropriate generated ignored files left over. - You might want to use "git status --ignored" to check for such files, - or some form of "git clean -x". It's probably simpler and safer to - make a new working directory exclusively for the release branch. + If this worktree already exists then either delete with 'C-x v w x' + and recreate, or do a full clean -- this sequence will delete all + untracked *and ignored* files, so first make sure you don't have any + valuable work in the worktree (that's why we suggest a new one): - If the working directory has subdirectories created when making - previous releases or pretests, remove those subdirectories, as the - command which updates the ChangeLog file might attempt to recurse - there and scan any ChangeLog.* files there. + git reset + git checkout . + git clean -xdff - Make sure the tree is built, or at least configured. That's - because some of the commands below run Make, so they need - Makefiles to be present. + Configure the tree: - ./autogen.sh - ./configure --without-native-compilation && make + ./autogen.sh autoconf + ./configure --without-native-compilation - For a release (as opposed to pretest), visit etc/NEWS and use the +2. For a release (as opposed to pretest), visit etc/NEWS and use the "M-x emacs-news-delete-temporary-markers" command to delete any left-over "---" and "+++" markers from etc/NEWS, as well as the "Temporary note" section at the beginning of that file, and commit etc/NEWS if it was modified. For a bug fix release (e.g. 31.2), delete any empty headlines too. -2. Regenerate the versioned ChangeLog.N and etc/AUTHORS files. +3. Regenerate the versioned ChangeLog.N and etc/AUTHORS files. The "M-x authors" command below will first update the current versioned ChangeLog.N file. For this to work correctly, make sure @@ -126,14 +133,23 @@ General steps (for each step, check for possible errors): Save the "*Authors*" buffer as etc/AUTHORS. Check the diff looks reasonable. Maybe add more entries to authors-ambiguous-files or authors-aliases, and repeat. - Commit any fixes to authors.el. + Commit and push any fixes to authors.el with a message like this: + + ; Update exported ChangeLog files and etc/AUTHORS + + * ChangeLog.N: Update. + * etc/AUTHORS: Regenerate. + + (i.e. these changes should be merged to master -- don't say + "regenerate" or "re-generate" so they aren't skipped). 3. Set the version number (M-x load-file RET admin/admin.el RET, then M-x set-version RET). For a pretest, start at version .90. After - .99, use .990 (so that it sorts). Commit the resulting changes - as one, with nothing else included, and using a log message + .99, use .990 (so that it sorts). 'C-x s' and commit the changes + as one, with nothing else included, using a log message of the format "Bump Emacs version to ...", so that the commit can - be skipped when merging branches (see admin/gitmerge.el). + be skipped when merging branches (see admin/gitmerge.el; i.e., these + changes should *not* be merged to master). Push. If this is a final pretest before the release: @@ -170,13 +186,28 @@ General steps (for each step, check for possible errors): Never replace an existing tarfile! If you need to fix something, always upload it with a different name. -4. autoreconf -i -I m4 --force - make bootstrap +4. autoreconf -i -I m4 --force && make bootstrap + + Copy lisp/loaddefs.el to lisp/ldefs-boot.el. + Edit ldefs-boot.el to add + + ;; no-byte-compile: t + + to its file-local variables section. I.e. your changes to + ldefs-boot.el should not include any changes to its file-local + variables block. Commit with a message like + + ; Update ldefs-boot.el. + + Do not merge to master. - Then do this: + and push. - make -C etc/refcards - make -C etc/refcards clean + If someone else makes a commit and you pull it, repeat from this + step onwards. Or you can just continue and allow that commit to be + part of the next pretest/release. + +5. make -C etc/refcards && make -C etc/refcards clean If some of the etc/refcards, especially the non-English ones, fail to build, you probably need to install some TeX/LaTeX packages, in @@ -187,39 +218,7 @@ General steps (for each step, check for possible errors): messages from TeX, but those seem to be harmless, as the result looks just fine.) -5. Copy lisp/loaddefs.el to lisp/ldefs-boot.el. After copying, edit - ldefs-boot.el to add - - ;; no-byte-compile: t - - to its file-local variables section, otherwise make-dist will - complain. - - Commit ChangeLog.N, etc/AUTHORS, lisp/ldefs-boot.el, and the files - changed by M-x set-version. Note that the set-version changes - should be committed separately, as described in step 3 above, to - avoid them being merged to master. The lisp/ldefs-boot.el file - should not be merged to master either, so it could be added to the - same commit or committed separately. To make sure the changes to - ChangeLog.N and etc/AUTHORS are _not_ skipped, do NOT describe their - updates as "regenerate" or "re-generate", since gitmerge.el by - default skips such commits; instead, use "update" or some such. - - The easiest way of doing that is "C-x v d ROOT-DIR RET", then go - to the first modified file, press 'M' to mark all modified files, - and finally 'v' to commit them. Make sure the commit log message - mentions all the changes in all modified files, as by default 'v' - doesn't necessarily do so. - - If someone else made a commit between step 1 and now, - you need to repeat from step 4 onwards. (You can commit the files - from step 2 and 3 earlier to reduce the chance of this.) - -6. If there has been a change in who is the Emacs maintainer since - the last release, update doc/misc/ack.texi and admin/MAINTAINERS - to reflect this. You can commit this separately. - -7. ./make-dist --snapshot --no-compress +7. ./make-dist --snapshot --no-compress Check the contents of the new tar with admin/diff-tar-files against the previous release (if this is the first pretest) or the @@ -227,7 +226,7 @@ General steps (for each step, check for possible errors): yourself, find it at . Releases are at . - ./admin/diff-tar-files emacs-OLD.tar emacs-NEW.tar + ./admin/diff-tar-files .../emacs-OLD.tar emacs-NEW.tar Alternatively, if you want to do this manually using the compressed tarballs: @@ -249,21 +248,22 @@ General steps (for each step, check for possible errors): tarball than the one you get from find. 8. tar xf emacs-NEW.tar; cd emacs-NEW - ./configure --prefix=/tmp/emacs && make check && make install + ./configure --prefix=/tmp/emacs && make -j1 check && make -j1 install - Use 'script' or M-x compile to save the compilation log in + Use script(1) or M-x compile to save the compilation log in compile-NEW.log and compare it against an old one. The easiest way to do that is to visit the old log in Emacs, change the version number of the old Emacs to __, do the same with the new log and do - M-x ediff. Especially check that Info files aren't built, and that - no autotools (autoconf etc) run. + 'M-x ediff'. Doing a non-parallel build (the '-j1') should make the + diff smaller but it is not strictly necessary. + + Especially check that Info files aren't built, and that no autotools + (autoconf etc.) run. -9. You can now tag the release/pretest and push it together with the - last commit: +9. You can now tag the release/pretest: - cd EMACS_ROOT_DIR && git tag -s TAG -m "Emacs STR" - git push - git push --tags + git tag -s TAG -m "Emacs STR" + git push origin tag TAG Here TAG is emacs-XX.Y.ZZ for a pretest, emacs-XX.Y for a release. For STR see below. For a release, if you are producing a release @@ -273,11 +273,11 @@ General steps (for each step, check for possible errors): safer to use the SHA1 of the last commit which went into the release tarball, in case there were some intervening commits since then: - git tag -s TAG -m "Emacs TAG STR" SHA1 - git push --tags + git tag -s TAG -m "Emacs STR" SHA1 + git push origin tag TAG In the past, we were not always consistent with the annotation - (i.e. -m "Emacs TAG"). The preferred format is like this for a + (i.e. the -m "Emacs STR"). The preferred format is like this for a pretest, release candidate and final release: git tag -s emacs-31.0.90 -m "Emacs 31.0.90 pretest" @@ -293,20 +293,19 @@ General steps (for each step, check for possible errors): xz -c emacs-NEW.tar > emacs-NEW.tar.xz For pretests, just xz is probably fine (saves bandwidth). - Now you should upload the files to the GNU FTP server; your - GPG key must already be accepted as described above. - The simplest method of uploading is with the gnulib - script "build-aux/gnupload" - (/usr/share/gnulib/build-aux/gnupload on Debian and its derivatives - with the 'gnulib' and 'ncftp' packages installed): + Now we will upload the files to the GNU FTP server. In the case of + a pretest we will also remove the previous pretest; if there are + other old ones still there, explicitly list those too before the + '--' in order to remove them. For a pretest or release candidate: gnupload [--user your@gpg.key.email] --to alpha.gnu.org:emacs/pretest \ - FILE.gz FILE.xz ... + --delete OLD_FILE.gz OLD_FILE.xz \ + -- NEW_FILE.gz NEW_FILE.xz ... For a release: gnupload [--user your@gpg.key.email] --to ftp.gnu.org:emacs \ - FILE.gz FILE.xz ... + NEW_FILE.gz NEW_FILE.xz ... You only need the --user part if you have multiple GPG keys and do not want to use the default. Instead of "your@gpg.key.email" you @@ -333,10 +332,11 @@ General steps (for each step, check for possible errors): 12. After five minutes, verify that the files are visible at for a pretest, or - for a release. + for a release. If uploading a + pretest, the delete of the previous pretest a few minutes before the + creation of the new file. Download them and check the signatures and SHA1/SHA256 checksums. - Check they build (./configure --with-native-compilation). 13. Send an announcement to: emacs-devel, and bcc: info-gnu-emacs@gnu.org. For a pretest, also bcc: platform-testers@gnu.org. @@ -344,8 +344,7 @@ General steps (for each step, check for possible errors): (The reason for using bcc: is to make it less likely that people will followup on the wrong list.) See the info-gnu-emacs mailing list archives for the form - of past announcements. The first pretest announcement, and the - release announcement, should have more detail. + of past announcements. Use the emacs-devel topic 'emacs-announce'. The best way to do this is to add a header "Keywords: emacs-announce" to your mail. (You can also put it in the Subject, but this is not as good commit 57581b8bc2f73229d1f03dd5655aabb4a6de6183 Author: Sean Whitton Date: Thu Jul 23 12:27:40 2026 +0100 ; Update ldefs-boot.el. Do not merge to master. diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index f35ff6e28ec..c66dd44240d 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -9995,7 +9995,7 @@ Argument BOTTOM is the bottom margin in number of lines or percent of window. ;;; Generated autoloads from progmodes/eglot.el -(push '(eglot 1 23) package--builtin-versions) +(push '(eglot 1 24) package--builtin-versions) (define-obsolete-function-alias 'eglot-update #'eglot-upgrade-eglot "29.1") (autoload 'eglot "eglot" "Start LSP server for PROJECT's buffers under MANAGED-MAJOR-MODES. @@ -10638,13 +10638,17 @@ or penultimate step during initialization. (autoload 'emacs-lock-mode "emacs-lock" "Toggle Emacs Lock mode in the current buffer. +When a buffer is locked, it cannot be killed and/or Emacs cannot exit +unless the buffer is unlocked first. This protects buffers from +being accidentally killed or lost. + If called with a plain prefix argument, ask for the locking mode -to be used. +to be used in the buffer. Initially, if the user does not pass an explicit locking mode, it defaults to `emacs-lock-default-locking-mode' (which see); afterwards, the locking mode most recently set on the buffer is -used instead. +used as the default instead. When called from Elisp code, ARG can be any locking mode: @@ -10652,7 +10656,7 @@ When called from Elisp code, ARG can be any locking mode: kill -- the buffer cannot be killed, but Emacs can exit as usual all -- the buffer is locked against both actions -Other values are interpreted as usual. +Other values are interpreted as usual for turning modes on/off. See also `emacs-lock-unlockable-modes', which exempts buffers under some major modes from being locked under some circumstances. @@ -20126,7 +20130,7 @@ penultimate step during initialization. ;;; Generated autoloads from jsonrpc.el -(push '(jsonrpc 1 0 28) package--builtin-versions) +(push '(jsonrpc 1 0 29) package--builtin-versions) (register-definition-prefixes "jsonrpc" '("jsonrpc-")) @@ -22924,19 +22928,13 @@ QUALITY can be: ;;; Generated autoloads from emacs-lisp/multisession.el -(autoload 'define-multisession-variable "multisession" -"Make NAME into a multisession variable initialized from INITIAL-VALUE. -DOC should be a doc string, and ARGS are keywords as applicable to -`make-multisession'. - -(fn NAME INITIAL-VALUE &optional DOC &rest ARGS)" nil t) (autoload 'list-multisession-values "multisession" "List all values in the \"multisession\" database. If CHOOSE-STORAGE (interactively, the prefix), query for the storage method to list. (fn &optional CHOOSE-STORAGE)" t) -(register-definition-prefixes "multisession" '("multisession-")) +(register-definition-prefixes "multisession" '("define-multisession-variable" "multisession-")) ;;; Generated autoloads from mwheel.el @@ -24008,7 +24006,7 @@ penultimate step during initialization." t) ;;; Generated autoloads from org/org.el -(push '(org 9 8 5) package--builtin-versions) +(push '(org 9 8 7) package--builtin-versions) (autoload 'org-babel-do-load-languages "org" "Load the languages defined in `org-babel-load-languages'. @@ -26940,7 +26938,7 @@ If MODE is `mem' or `cpu+mem', start profiler that samples CPU ;;; Generated autoloads from progmodes/project.el -(push '(project 0 11 2) package--builtin-versions) +(push '(project 0 12 0) package--builtin-versions) (autoload 'project-current "project" "Return the project instance in DIRECTORY, defaulting to `default-directory'. @@ -33636,6 +33634,7 @@ if it matches the first line of the file, The command `tex-file' runs TeX on the file specified by `tex-main-file' if the variable is non-nil.") (custom-autoload 'tex-main-file "tex-mode" t) +(put 'tex-main-file 'safe-local-variable (lambda (x) (or (stringp x) (null x)))) (defvar tex-offer-save t "If non-nil, ask about saving modified buffers before \\[tex-file] is run.") (custom-autoload 'tex-offer-save "tex-mode" t) @@ -35263,7 +35262,7 @@ Interactively, with a prefix argument, prompt for a different method." t) ;;; Generated autoloads from net/trampver.el -(push '(tramp 2 8 2 -1) package--builtin-versions) +(push '(tramp 2 8 2 31 1) package--builtin-versions) (register-definition-prefixes "trampver" '("tramp-")) @@ -40203,87 +40202,118 @@ mode. ;;; Generated autoloads from window-x.el -(autoload 'window-layout-rotate-anticlockwise "window-x" -"Rotate window layout of WINDOW counterclockwise by 90 degrees. - -If WINDOW is nil, it defaults to the root window of the selected frame. +(autoload 'window-layout-rotate-clockwise "window-x" +"Rotate layout of WINDOW's child windows clockwise by 90 degrees. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, rotate clockwise +the layout of the child windows of the selected window's parent. Signal +an error if WINDOW is not a parent window. -Interactively, a prefix argument says to rotate the parent window of the -selected window. +Recursively rotate the entire layout of WINDOW's child windows clockwise +by 90 degrees. Do not change the selected window of WINDOW's frame. If +you want to rotate windows within their frame's layout, consider using +`rotate-windows' instead. (fn &optional WINDOW)" t) -(autoload 'window-layout-rotate-clockwise "window-x" -"Rotate window layout under WINDOW clockwise by 90 degrees. - -If WINDOW is nil, it defaults to the root window of the selected frame. +(autoload 'window-layout-rotate-anticlockwise "window-x" +"Rotate layout of WINDOW's child windows counterclockwise by 90 degrees. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, rotate +counterclockwise the layout of the child windows of the selected +window's parent. Signal an error if WINDOW is not a parent window. -Interactively, a prefix argument says to rotate the parent window of the -selected window. +Recursively rotate the entire layout of WINDOW's child windows +counterclockwise by 90 degrees. Do not change the selected window of +WINDOW's frame. If you want to rotate windows within their frame's +layout, consider using `rotate-windows-back' instead. (fn &optional WINDOW)" t) (autoload 'window-layout-flip-leftright "window-x" -"Horizontally flip windows under WINDOW. - -Flip the window layout so that the window on the right becomes the -window on the left, and vice-versa. - -If WINDOW is nil, it defaults to the root window of the selected frame. +"Flip WINDOW's child windows horizontally. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, flip +horizontally the layout of the child windows of the selected window's +parent. Signal an error if WINDOW is not a parent window. -Interactively, a prefix argument says to flip the parent window of the -selected window. +Recursively flip the layout of WINDOW's child windows so that a child +window on the right becomes a child window on the left and vice-versa. (fn &optional WINDOW)" t) (autoload 'window-layout-flip-topdown "window-x" -"Vertically flip windows under WINDOW. +"Flip WINDOW's child windows vertically. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, flip vertically +the layout of the child windows of the selected window's parent. Signal +an error if WINDOW is not a parent window. -Flip the window layout so that the top window becomes the bottom window, -and vice-versa. - -If WINDOW is nil, it defaults to the root window of the selected frame. - -Interactively, a prefix argument says to flip the parent window of the -selected window. +Recursively flip the layout of WINDOW's child windows so that a child +window on the top becomes a child window on the bottom and vice-versa. (fn &optional WINDOW)" t) (autoload 'window-layout-transpose "window-x" -"Transpose windows under WINDOW. - -Reorganize the windows under WINDOW so that every horizontal split -becomes a vertical split, and vice versa. This is equivalent to -diagonally flipping. +"Transpose child windows of WINDOW. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, transpose the +layout of the child windows of the selected window's parent. Signal an +error if WINDOW is not a parent window. -If WINDOW is nil, it defaults to the root window of the selected frame. - -Interactively, a prefix argument says to transpose the parent window of -the selected window. - -(fn &optional WINDOW)" t) -(autoload 'rotate-windows-back "window-x" -"Rotate windows under WINDOW backward in cyclic ordering. - -If WINDOW is nil, it defaults to the root window of the selected frame. - -Interactively, a prefix argument says to rotate the parent window of the -selected window. +Recursively reorganize WINDOW's child windows so that each horizontal +split becomes a vertical split and vice versa. (fn &optional WINDOW)" t) (autoload 'rotate-windows "window-x" -"Rotate windows under WINDOW in cyclic ordering. - -Optional argument REVERSE says to rotate windows backward, in reverse -cyclic order. - -If WINDOW is nil, it defaults to the root window of the selected frame. - -Interactively, a prefix argument says to rotate the parent window of the -selected window. +"Rotate child windows of WINDOW in cyclic ordering. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, rotate the child +windows of the selected window's parent. + +Optional argument REVERSE non-nil means to rotate windows backwards, in +reverse cyclic order. Signal an error if WINDOW is not a parent window, +all descendants of WINDOW are dedicated or some windows are of fixed +size or atomic. + +Rotating windows leaves the way a frame layout has been produced via +splitting, deleting and resizing windows unaltered. It only \"moves\" +windows within that layout such that the space formerly occupied by any +window is now occupied by the window preceding (following if REVERSE is +non-nil) it in the cycling ordering. + +If you want to rotate the entire layout of windows, consider using the +function `window-layout-rotate-clockwise' instead. If you want to +rotate a layout twice in a row in order to have a window on the bottom +appear on the top and a window on the right appear on the left (or +vice-versa), consider running `window-layout-flip-leftright' and +`window-layout-flip-topdown' instead. (fn &optional WINDOW REVERSE)" t) +(autoload 'rotate-windows-back "window-x" +"Rotate child windows of WINDOW backwards in cyclic ordering. +WINDOW must be a parent window and defaults to the main window of the +selected frame. Interactively, with a prefix argument, rotate backwards +the child windows of the selected window's parent. Signal an error if +WINDOW is not a parent window, all descendants of WINDOW are dedicated +or some of them are of fixed size or atomic. + +Rotating windows backwards leaves the way a frame layout has been +produced via splitting, deleting and resizing windows unaltered. It +only \"moves\" windows within that layout such that the space formerly +occupied by any window is now occupied by the window following it in +the cycling ordering. + +If you want to rotate the entire layout of windows backwards, consider +using the function `window-layout-rotate-anticlockwise' instead. If you +want to rotate a layout backwards twice in a row, consider running +`window-layout-flip-leftright' and `window-layout-flip-topdown' +instead. + +(fn &optional WINDOW)" t) (autoload 'merge-frames "window-x" "Merge the main window of FRAME2 into FRAME1. Split the main window of FRAME1 and make the new window display the main -window of FRAME2. Both FRAME1 and FRAME2 must be live frames. If -VERTICAL is non-nil, make the new window below the old main window of +window of FRAME2. Both FRAME1 and FRAME2 must be live frames. FRAME1 +defaults to the selected frame and FRAME2 to the frame that follows FRAME1 +in the frame list. +If VERTICAL is non-nil, make the new window below the old main window of FRAME1. Otherwise, make the new window on the right of FRAME1's main window. Interactively, VERTICAL is the prefix argument, FRAME1 is the selected frame and FRAME2 is the frame following FRAME1 in the frame commit 60da04d179256cf7fd3d71104b66f7e2aec93b22 Author: Sean Whitton Date: Thu Jul 23 12:07:08 2026 +0100 Bump Emacs version to 31.0.91 * README: * configure.ac: * exec/configure.ac: * java/AndroidManifest.xml.in (Version-code): * msdos/sed2v2.inp: * nt/README.W32: Bump Emacs version to 31.0.91. diff --git a/README b/README index 7708ed28ec7..5ebfde93c54 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ Copyright (C) 2001-2026 Free Software Foundation, Inc. See the end of the file for license conditions. -This directory tree holds version 31.0.90 of GNU Emacs, the extensible, +This directory tree holds version 31.0.91 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/configure.ac b/configure.ac index e5f496cfa11..d28da6e54d1 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ dnl along with GNU Emacs. If not, see . AC_PREREQ([2.65]) dnl Note this is parsed by (at least) make-dist and lisp/cedet/ede/emacs.el. -AC_INIT([GNU Emacs], [31.0.90], [bug-gnu-emacs@gnu.org], [], +AC_INIT([GNU Emacs], [31.0.91], [bug-gnu-emacs@gnu.org], [], [https://www.gnu.org/software/emacs/]) if test "$XCONFIGURE" = "android"; then diff --git a/exec/configure.ac b/exec/configure.ac index 6716f2ecb9d..489c8aca3cc 100644 --- a/exec/configure.ac +++ b/exec/configure.ac @@ -22,7 +22,7 @@ dnl You should have received a copy of the GNU General Public License dnl along with GNU Emacs. If not, see . AC_PREREQ([2.65]) -AC_INIT([libexec], [31.0.90], [bug-gnu-emacs@gnu.org], [], +AC_INIT([libexec], [31.0.91], [bug-gnu-emacs@gnu.org], [], [https://www.gnu.org/software/emacs/]) AH_TOP([/* Copyright (C) 2026 Free Software Foundation, Inc. diff --git a/java/AndroidManifest.xml.in b/java/AndroidManifest.xml.in index c7775abee0f..44f142fd337 100644 --- a/java/AndroidManifest.xml.in +++ b/java/AndroidManifest.xml.in @@ -350,6 +350,6 @@ repositories require an incrementing numeric version code to detect upgrades, which is provided here and is altered by admin/admin.el. Refer to e.g. https://forum.f-droid.org/t/emacs-packaging/30424/25. -Version-code: 310090000 +Version-code: 310091000 --> diff --git a/msdos/sed2v2.inp b/msdos/sed2v2.inp index cce277cc06a..8da3c7f8316 100644 --- a/msdos/sed2v2.inp +++ b/msdos/sed2v2.inp @@ -66,7 +66,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 "31.0.90"/ +/^#undef PACKAGE_VERSION/s/^.*$/#define PACKAGE_VERSION "31.0.91"/ /^#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 76ef4036008..8dce0c0aed1 100644 --- a/nt/README.W32 +++ b/nt/README.W32 @@ -1,7 +1,7 @@ Copyright (C) 2001-2026 Free Software Foundation, Inc. See the end of the file for license conditions. - Emacs version 31.0.90 for MS-Windows + Emacs version 31.0.91 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 commit d8af3181182d3dd48b42a93db2b6865cc9528aa2 Author: Sean Whitton Date: Thu Jul 23 12:03:31 2026 +0100 ; Update exported ChangeLog files and etc/AUTHORS * ChangeLog.5: Update. * etc/AUTHORS: Regenerate. diff --git a/ChangeLog.5 b/ChangeLog.5 index dc4ae192870..909b2fed865 100644 --- a/ChangeLog.5 +++ b/ChangeLog.5 @@ -1,3 +1,712 @@ +2026-07-22 Sean Whitton + + VC-Annotate menu: Fix inserting "Span NN.NN days" entries + + * lisp/vc/vc-annotate.el (vc-annotate-mode-menu): Generate + entries based on vc-annotate-color-map using a :filter function, + instead of using whatever value that variable happened to have + at load time. + +2026-07-22 Donjuanplatinum (tiny change) + + Fix typo in Fmatch_end's doc string + + * src/search.c (Fmatch_end): Fix "start position" to "end position". + (Bug#81447) + +2026-07-21 James Cherti + + Fix false positive warnings in 'elisp-flymake-checkdoc' when narrowed + + * lisp/progmodes/elisp-mode.el (elisp-flymake-checkdoc): Temporarily + widen the buffer before calling 'checkdoc-current-buffer'. This + prevents checkdoc from reporting missing file-level structural + elements when the user has narrowed the buffer. (Bug#81258) + +2026-07-20 Aaron L. Zeng (tiny change) + + Fix void-function on push-button in goto-address-mode + + * lisp/net/goto-addr.el (goto-address--button-action): + New function (bug#81419). + (goto-address-fontify): Use it as the button action. + +2026-07-19 Petteri Hintsanen + + Fix perl-calculate-indent + + * lisp/progmodes/perl-mode.el (perl-calculate-indent): Ensure that + the value from (nth 3 state) is a character before passing it to + char-equal. + +2026-07-19 Michael Albinus + + * admin/notes/documentation: Describe quoting of key names. + +2026-07-19 Eli Zaretskii + + Fix 'url-parse-query-string' + + * lisp/url/url-util.el (url-parse-query-string): Fix use of + 'match-beginning' and 'match-end'. (Bug#81430) + +2026-07-18 Eshel Yaron + + markdown-ts-mode: Fix code-block fontification leak + + * lisp/textmodes/markdown-ts-mode.el + (markdown-ts--fontify-non-ts-collect-faces): Prevent + 'font-lock-ensure' from widening and fontifying outside the + intended code-block (bug#81412). + +2026-07-18 Eli Zaretskii + + Revert "; * admin/authors.el (authors-aliases): Fix Borys Buliha's name." + + This reverts commit cf6918c189e11a891facdac4a9baea3316a39c59. + It was a mistake, as Boris prefers the other spelling. + +2026-07-18 Eli Zaretskii + + Fix 'mouse-drag-copy-region' = 'non-empty' + + * lisp/mouse.el (mouse-save-then-kill): Fix conditions for copying + when 'mouse-drag-copy-region' is 'non-empty'. (Bug#81366) + +2026-07-16 Michael Albinus + + Fix `with-tramp-local-environment' + + * lisp/net/tramp.el (with-tramp-local-environment): Do not change the + global environment. Reported by Daniel Kraus . + (Bug#81409) + +2026-07-16 Dmitry Gutov + + project.el: Bump version to 0.12 + + Do not merge to master. + +2026-07-15 Paul Eggert + + Port pdumper to m68k + + Problem reported by John Paul Adrian Glaubitz (bug#44531). + * src/pdumper.c (DUMP_RELOCATION_ALIGNMENT_BITS): Remove. It’s + not needed for optimization, as today’s compilers deduce that + multiplying and dividing by the alignment can be done with shifts. + All uses changed to use DUMP_RELOCATION_ALIGNMENT. + (DUMP_RELOCATION_ALIGNMENT) [__mc68000__]: + Now min (4, alignof (Lisp_Object)), not 4. + (dump_reloc_set_offset): Change eassert to eassume to help + the compiler. + +2026-07-14 Mark Hindley (tiny change) + + browse-url-with-browser-kind: Use strings for DEF + + * lisp/net/browse-url.el (browse-url-with-browser-kind): Use + strings for DEF argument to completing-read (bug#81369). + +2026-07-14 Martin Rudalics + + Fix issues related to window layout changes (Bug#81406) + + * src/window.c (Vwindow_combination_resize): In doc-string say + that binding this to nil may be necessary to produce specific, + predefined frame layouts (Bug#81406). + * lisp/window-x.el (window-layout-rotate-clockwise) + (window-layout-rotate-anticlockwise) + (window-layout-flip-leftright, window-layout-flip-topdown) + (window-layout-transpose, rotate-windows-change-selected) + (rotate-windows, rotate-windows-back): Rewrite doc-strings. + Make sure that non-interactive calls with nil or absent WINDOW + argument work on the frame's main window. Fix infinite loop + when 'rotate-windows' is called for a non-selected frame. + * doc/lispref/windows.texi (Recombining Windows): Say that + binding 'window-combination-resize' to nil may be necessary to + produce specific, predefined frame layouts (Bug#81406). + (Changing Window Layouts): Minor rewrite. + * etc/NEWS: Announce names of new commands to change window + layout (Bug#81406). + +2026-07-13 Martin Rudalics + + Turn off combination resizing in 'window--transpose-1' (Bug#81406) + + * lisp/window-x.el (window--transpose-1): Bind + 'window-combination-resize' to nil around splitting (Bug#81406). + +2026-07-13 Eli Zaretskii + + Fix copy-by-mouse in *Backtrace* buffers + + * lisp/emacs-lisp/backtrace.el (backtrace--filter-visible): + Support BEG and END in reverse order. Patch by Jakub + T. Jankiewicz . (Bug#81365) + +2026-07-11 Kisaragi Hiu + + Support javascript "using" keyword (bug#81351) + + * lisp/progmodes/js.el: + (js--keyword-re): Add "using" as a JavaScript keyword. + (js--font-lock-keywords-3, js--declaration-keyword-re): + Add "using" as a variable declaration keyword, like "const". + (js--treesit-optional-keywords): New variable, for keywords that may not + yet be supported by many versions of tree-sitter-javascript. + (js--treesit-font-lock-settings): Use it. + (js--treesit-defun-name, js--treesit-valid-imenu-entry) + (js--treesit-sentence-nodes, js--treesit-simple-imenu-settings) + (js--treesit-defun-type-regexp): Add using_declaration as an alternative + to lexical_declaration (let and const) and variable_declaration (var). + + * lisp/progmodes/typescript-ts-mode.el (typescript-ts-mode--keywords): + Add "using" as a TypeScript keyword. + +2026-07-10 Juri Linkov + + Ensure the correct current buffer in completions--background-update + + * lisp/minibuffer.el (completions--background-update): + Add new arg 'buffer' and compare it with 'current-buffer'. + (completions--start-background-update): Run an idle timer + for 'completions--background-update' with a new arg + set to 'current-buffer' that ensures that the timer function + is run in the same buffer (bug#81349). + +2026-07-09 Daniel Mendler + + Improve eldoc-help-at-pt docstrings + + * lisp/emacs-lisp/eldoc.el (eldoc-help-at-pt, eldoc-show-help-at-pt): + Improve docstrings. (Bug#81356) + +2026-07-09 Daniel Mendler + + Fix 'eldoc-show-help-at-pt' + + * lisp/emacs-lisp/eldoc.el (eldoc-show-help-at-pt): Don't test + 'eldoc-help-at-pt'. (Bug#81356) + +2026-07-07 Paul Eggert + + Fix uninit read in Android TrueType font scan + + Problem reported privately by Michal Majchrowicz and Marcin + Wyczechowski, members of the AFINE Team. + * src/sfnt.c (sfnt_read_table_directory): + Fix typo where wrong size was used. + +2026-07-07 Paul Eggert + + Fix OOB read in Android TrueType font scan + + Problem reported privately by Michal Majchrowicz and Marcin + Wyczechowski, members of the AFINE Team. + * src/sfnt.c (sfnt_vary_simple_glyph, sfnt_vary_compound_glyph): + Reject indexes equal exactly to sizes. + +2026-07-07 Martin Rudalics + + Have 'replace-buffer-in-windows' remove BUFFER-OR-NAME everywhere (Bug#81370) + + * lisp/window.el (replace-buffer-in-windows): Unrecord + BUFFER-OR-NAME and thus remove it from the lists of previous and + next buffers in all live windows regardless of whether they + currently show BUFFER-OR-NAME or not (Bug#81370). + +2026-07-07 Juri Linkov + + Fix test breakage in files-tests + + * test/lisp/files-tests.el (files-tests--with-buffer-offer-save): + Redefine 'read-key-sequence-vector' instead of 'read-key' + after recent changes in 'map-y-or-n-p' (bug#81168). + +2026-07-07 Juri Linkov + + Check for a live buffer in 'quit-restore-window' + + * lisp/window.el (quit-restore-window): + Check with 'buffer-live-p' when finding a prev buffer + in 'window-prev-buffers' (bug#81370). + +2026-07-07 Daniel Mendler + + Fix blinking Eldoc messages + + Ensure that `global-eldoc-mode' does not enable `eldoc-mode' in + ephemeral Eldoc buffers and accidentally reset `eldoc-last-message'. + This caused Eldoc message blinking (bug#81356). + + * lisp/emacs-lisp/eldoc.el (eldoc--supported-p): Exclude ephemeral Eldoc + buffers to avoid blinking. + (eldoc-help-at-pt): Add custom :set function. + (eldoc-documentation-functions): Do not register `eldoc-show-help-at-pt' + by default. + +2026-07-06 Paul Eggert + + Fix undefined behavior in pbm_load + + int*int problem reported by Tristan Madani in: + https://bugs.gnu.org/81344 + * src/image.c (pbm_load): Avoid undefined behavior when + multiplying ints, or when adding pointer to int. + +2026-07-05 Philip Kaludercic + + Avoid destructively modifying 'package--builtin-alist' + + * lisp/emacs-lisp/package.el (package--upgradeable-packages): + Use 'append' instead of 'nconc' to not append the contents of + 'package-alist' to 'package--builtin-alist'. (Bug#81242) + +2026-07-05 Kyle Meyer + + Update to Org 9.8.7 + +2026-07-05 Michael Albinus + + Ensure, that `buffer-file-name' is expanded in tramp-archive + + * lisp/net/tramp-archive.el (tramp-archive-handle-insert-file-contents): + Ensure, that `buffer-file-name' is expanded. + +2026-07-04 Eli Zaretskii + + Fix min-width in mode-line constructs + + * src/xdisp.c (handle_display_prop): To handle min-width's end on + the mode line, call display_min_width also when starting a new + string. This is needed because mode line supports :propertize + application to a list of strings, and we only need to apply the + effect of min-width at the end of the last element. (Bug#81354) + +2026-07-03 Binbin Ye (tiny change) + + Fix syntax of tsx tag angle brackets to use matching pairs + + The matching characters for JSX tag angle brackets were + self-referential ('<' matched '<', and '>' matched '>') rather than + pointing at each other. Tools that check the matching character, such + as 'show-paren-mode' and the rainbow-delimiters package, therefore + treated every JSX closing '>' as a mismatched delimiter. Use the same + descriptors as 'sgml-make-syntax-table', where '<' is closed by '>' + and '>' by '<' (bug#81348). + + * lisp/progmodes/typescript-ts-mode.el + (tsx-ts--syntax-propertize-captures): Give '<' the syntax descriptor + "(>" and '>' the descriptor ")<". + +2026-07-03 Samuele FAVAZZA (tiny change) + + Fix Tramp container name completion + + * lisp/net/tramp-container.el (tramp-container--completion-function): + Use "<>" as separator instead of "\t", which could be modified in + the shell. + +2026-07-03 Sean Whitton + + server-tests/can-create-frames-p: Check for TERM=dumb-emacs-ansi + + * test/lisp/server-tests.el (server-tests/can-create-frames-p): + Check for TERM=dumb-emacs-ansi. + +2026-07-03 Sean Whitton + + Disable failing SCCS tests on the release branch + + These are broken and we don't have an SCCS expert to fix them at + present. This shouldn't block the Emacs 31 release because SCCS + is a relatively obscure VCS. + + * test/lisp/vc/vc-tests/vc-tests.el (vc-test-sccs05-rename-file) + (vc-test-sccs10-rename-directory): Mark as expected to fail. + Do not merge to master. + +2026-07-03 Sean Whitton + + Finish reverting experiment with proportional font on mode line + + This change + + Author: Lars Ingebrigtsen + AuthorDate: Thu Dec 23 11:43:47 2021 +0100 + + Revert back to using monospaced fonts in the mode line + + * lisp/faces.el (mode-line-active, mode-line-inactive): Revert + back to using monospaced fonts on the mode line (for now). The + main remaining usability problem is clicking on the very small "-" + characters in "U:--". + + didn't also undo these changes to bindings.el that were + introduced along with the proportional font experiment, leading + to bug#81336. + + * lisp/bindings.el (mode-line-position) + (standard-mode-line-format): Don't set display minimum widths (bug#81336). + +2026-07-03 Alan Mackenzie + + CC Mode: Fix erroneous type: arguments to two defcustoms. + + This allows customize to set the variables directly to regular + expressions as an alternative to a list of identifiers. It + fixes bug#81339. + * lisp/progmodes/cc-vars.el (c-noise-macro-with-parens-names) + (c-noise-macro-names): Correct the type: arguments to defcustom + to two `choice' constructs. + +2026-07-02 Spencer Baugh + + Fix initials completion style after // in file name + + * lisp/minibuffer.el (completion-initials-expand): Change the + heuristic to check for an empty previous field, not total string + length (bug#81241). + * test/lisp/minibuffer-tests.el (completion-initials): New test. + +2026-07-02 Spencer Baugh + + Fix c-pcm-try-completion with boundaries completion + + PCM try-completion could behavior incorrectly with completion + tables using boundaries, such as file name completion. It would + "grow" earlier path components as if point was at the end of + each path component (rather than at its true location), which + meant all path components would "grow" not only from the left + \(which is correct) but also from the right (which can only work + when point is there). + + * lisp/minibuffer.el (completion-pcm--find-all-completions): + Drop the sub-pattern's trailing `point' (bug#80914). + * test/lisp/minibuffer-tests.el (completion-pcm-test-9): New + test. + +2026-07-02 haiyang miao (tiny change) + + In pgtk_free_frame_resources transfer keyboard focus to parent (Bug#64625) + + * src/pgtkterm.c (pgtk_new_focus_frame): Declare static. + (pgtk_free_frame_resources): If this frame currently holds + keyboard focus, explicitly transfer focus to its parent frame + before releasing resources (Bug#64625). + +2026-07-02 Johan Myréen (tiny change) + + Fix fullscreen state handling for PGTK (Bug#81165, Bug#81320) + + * src/pgtkterm.c (set_fullscreen_state): Unfullscreen frame in + the FULLSCREEN_HEIGHT/_WIDTH case (Bug#81165, Bug#81320). + +2026-07-02 Dmitry Gutov + + * lisp/progmodes/project.el: Update Commentary. + +2026-07-02 Dmitry Gutov + + Localize cache invalidation to project-try-vc + + With other functions only using the cached values or populating + when necessary. + + * lisp/progmodes/project.el: Update commentary (bug#81317). + (project--get-cached): Add explicit parameter TIMEOUT, use it. + (project-try-vc): Build its value from 'non-essential' and the + values of two timeout variables. And pass them on. + (project-try-vc--search, project--vc-merge-submodules-p) + (project--value-in-dir): Also add TIMEOUT. + (project-files, vc-git-project-list-files) + (vc-hg-project-list-files, project-ignores, project-buffers) + (project-name, project-uniquify-dirname-transform): Remove the + binding of 'non-essential' as now redundant for cache duration. + + * test/lisp/progmodes/project-tests.el (project-try-vc-uses-cache) + (project-try-vc-invalidates-cache) + (project-name--reuses-cache) + (project-name--obeys-cache-invalidation): New tests. + (project-vc-supports-project-in-different-dir) + (project-vc-ignores-in-external-directory): Use + 'project--clear-cache' as the more reliable option. + +2026-07-02 Dmitry Gutov + + Fix project--clear-cache and project--value-in-dir in special case + + * lisp/progmodes/project.el (project--clear-cache): Make sure to + clear the 'project-vc-dir-locals' keys too. + (project--value-in-dir): Predicate the cache lookup (and most + importantly, write) on whether enable-dir-local-variables is + non-nil. So its uses inside recursive 'project-try-vc--search' + call do not not bust the value (bug#81317). + +2026-07-01 Michael Albinus + + * admin/notes/jargon: Add TTTT. + +2026-07-01 Michael Albinus + + Fix error handling in Tramp delete-{file,directory} + + * lisp/net/tramp-smb.el (tramp-smb-handle-delete-directory): + * lisp/net/tramp.el (tramp-skeleton-delete-directory): Fail if + DIRECTORY is missing. + (tramp-skeleton-delete-file): Don't fail if DIRECTORY is missing. + + * test/lisp/net/tramp-tests.el (tramp-test14-delete-directory): + Adapt test. + +2026-07-01 Michael Albinus + + Change Tramp version integrated in Emacs 31.1 (don't merge) + + * doc/misc/trampver.texi: + * lisp/net/trampver.el (tramp-version): Adapt Tramp versions. + + * lisp/net/trampver.el (customize-package-emacs-version-alist): + Change Tramp version integrated in Emacs 31.1. + +2026-07-01 Yuan Fu + + Correct cursor range in Ftreesit_query_capture (bug#81297) + + * src/treesit.c (Ftreesit_query_capture): Always explicitly set + cursor's range. + +2026-06-30 Sean Whitton + + vc-dir-update: Remove assertion invalid on this branch + + * lisp/vc/vc-dir.el (vc-dir-update): Remove assertion invalid on + the emacs-31 branch. Do not merge to master. + +2026-06-30 Martin Rudalics + + Don't use window manager activation when a child frame has focus (Bug#81326) + + * src/xterm.c (x_get_toplevel_parent): Remove. + (x_focus_frame): Never call x_ewmh_activate_frame when a child + frame has focus (Bug#81326). + +2026-06-29 Philip Kaludercic + + Compile User Lisp files after adjusting 'load-path' + + * lisp/startup.el (prepare-user-lisp): Collect Lisp files in a + list and process these after traversing the file system. This + is necessary to prevent the compiler from failing to + byte-compile files that depend on other files in the User Lisp + directory because their neighboring dependencies cannot be + located. (Bug#81304) + +2026-06-29 Sean Whitton + + Fix strange logic in vc-git-incoming-revision + + I think that I didn't fully update this function in this change: + + commit e915646b8944d8b611ab7094d9eb305ed162ff27 + Author: Sean Whitton + Date: Wed Feb 18 11:35:16 2026 +0000 + + vc-git-pull, vc-git-incoming-revision: Use push remotes + + * lisp/vc/vc-git.el (vc-git-pull, vc-git-incoming-revision): Use + configured push remotes. + * etc/NEWS: Announce change to vc-git-pull. + + * lisp/vc/vc-git.el (vc-git-incoming-revision): Don't duplicate + looking for a branch remote after just having called + vc-git--branch-remotes (bug#81328). + +2026-06-28 Eli Zaretskii + + Fix 'format-mode-line' when faces are in format string + + * src/xdisp.c (store_mode_line_string): Don't assume that PROPS + can only specify the face for LISP_STRING; if PROPS don't specify + a face, fall back on the 'face' property of LISP_STRING. + (Bug#81316) + + * test/src/xdisp-tests.el (xdisp-test-format-mode-line): Add a + test for this issue. + +2026-06-28 Martin Rudalics + + Restore frame's fullheight/fullwidth after exiting from fullboth (Bug#81165) + + * src/xterm.c (do_ewmh_fullscreen): Try to restore + fullheight/fullwidth states after exiting from fullboth state + (Bug#81165). + +2026-06-27 Zhengyi Fu (tiny change) + + Fix interactive mode spec of `xwidget-webkit-end-edit-textarea' + + * lisp/xwidget.el (xwidget-webkit-end-edit-textarea): Remove + `xwidget-webkit-mode' condition from the interactive mode spec. + This command is intended to be invoked in the 'textarea' buffer, + which is created by `xwidget-webkit-begin-edit-textarea', and + that buffer is in Fundamental mode. (Bug#81306) + +2026-06-27 Andrea Alberti + + Fix pixels-vs-columns confusion in margin face fill (bug#81109) + + * src/xdisp.c (extend_face_to_end_of_line): WINDOW_LEFT/RIGHT_MARGIN_WIDTH + is a pixel value (columns times the frame column width). Compare the + margin glyph count against WINDOW_LEFT/RIGHT_MARGIN_COLS instead, and use + the *_WIDTH value directly for remaining_pixels rather than multiplying it + by FRAME_COLUMN_WIDTH a second time. The old code worked on text + terminals, where the column width is one pixel, but computed wrong widths + on GUI frames. + +2026-06-27 Richard Lawrence + + Fix ISO date insertion in diary + + See Bug#81263. Diary's 'iso' dates should use ISO8601 YYYY-MM-DD + format. This change fixes the format used by `diary-insert-entry'. + + * lisp/calendar/calendar.el (diary-iso-date-insertion-form): Use + YYYY-MM-DD format (not YYYY/M/D) when inserting ISO dates. + * test/lisp/calendar/diary-icalendar-resources/import-bug-11473.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-bug-22092.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-bug-33277.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-legacy-vars.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-multiple-vcalendars.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-non-recurring-1.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-non-recurring-all-day.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-non-recurring-another-example.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-non-recurring-folded-summary.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-non-recurring-long-summary.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-time-format-12hr-blank.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-with-attachment.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-with-timezone.diary-iso: + * test/lisp/calendar/diary-icalendar-resources/import-with-uid.diary-iso: + Update tests. + +2026-06-27 Eli Zaretskii + + Minor fix for 'format-mode-line' + + * src/xdisp.c (Fformat_mode_line): Treat 'default' exactly like + nil. (Bug#81307) + +2026-06-26 Juri Linkov + + Improve the previous fix in toggle-window-dedicated + + * lisp/window.el (toggle-window-dedicated): + Don't select the window by mouse click in another window. + This keeps the currently selected window like for + toggling other indicators on the mode-line (bug#81178). + +2026-06-25 Sean Whitton + + VC-Dir: Fix removing empty directory entries + + * lisp/vc/vc-dir.el (vc-dir-refresh-files): Do another pass to + remove directory entries with no children. Do not merge to + master. + +2026-06-25 Juri Linkov + + Fix interactive spec of some commands bound on the mode line + + Use interactive spec '@' for two commands bound on the mode line + that should select the window associated with the mouse click + to avoid toggling the status of the wrong window or buffer. + + * lisp/progmodes/elisp-mode.el (elisp-enable-lexical-binding): + Add interactive spec '@' (bug#81178). + + * lisp/window.el (toggle-window-dedicated): Add interactive + spec '@' and replace 'current-buffer' with 'window-buffer' + to not assume that it operates on the current buffer. + +2026-06-25 Sean Whitton + + vc-dir--count-outgoing: Bind enable-local-variables + + * lisp/vc/vc-dir.el (vc-dir--count-outgoing): Bind + enable-local-variables (bug#81233). Do not merge to master. + +2026-06-25 Michael Albinus + + Support tramp-rpc in filenotify-tests.el + + * test/lisp/filenotify-tests.el (top, file-notify--test-monitor) + (file-notify-test03-events, file-notify-test12-unmount): + Handle also tramp-rpc. + +2026-06-25 Alan Mackenzie + + CC Mode: Set parse-sexp-lookup-properties for every mode + + This fixes a bug reported and diagnosed by Campbell Barton + on the emacs-devel list. + + * lisp/progmodes/cc-mode.el (c-basic-common-init): Set + parse-sexp-lookup-properties or (for XEmacs) lookup-syntax-properties + for every CC Mode mode. + +2026-06-25 Dirk-Jan C. Binnema (tiny change) + + Disable DMABUF and Compositing for xwidget + + Webkit does not support DMABUF or accelerated compositing in the + offscreen widgets Emacs uses for xwidget. Disable both for non-pgtk + GTK3 builds (Bug#80834). + * src/xterm.c (init_xterm): Set WEBKIT_DISABLE_DMABUF_RENDERER and + WEBKIT_DISABLE_COMPOSITING_MODE when built with xwidgets and not pgtk. + +2026-06-25 Eli Zaretskii + + Fix failure code in 'run-hook-query-error-with-timeout' + + * lisp/subr.el (run-hook-query-error-with-timeout): Fix incorrect + call to 'error'. (Bug#81292) + +2026-06-25 Zhengyi Fu (tiny change) + + Use default-value in project--value-in-dir + + When in a VC project whose dir-locals file specifies `project-vc-name', + the function `project--value-in-dir' previously used `symbol-value' to + retrieve the variable value, causing `project-name' to return the same + name for all VC projects without an explicit `project-vc-name'. Use + `default-value' instead to correctly fall back to the default value. + + * lisp/progmodes/project.el (project--value-in-dir): Replace `symbol-value' + with `default-value' (bug#81293). + +2026-06-24 Dmitry Gutov + + etags-regen--maybe-generate: No error when no project found + + * lisp/progmodes/etags-regen.el (etags-regen--maybe-generate): + When no project found, abort cleanly with a message. + +2026-06-24 Stephen Berman + + Mark ChangeLog entry as tiny change + + * ChangeLog.5: Mark an entry as a tiny change, because the + "Copyright-paperwork-exempt: yes" line was mistakenly omitted from + the commit log entry. + +2026-06-24 Sean Whitton + + VC revert: When un-adding, clear vc-backend property + + * lisp/vc/vc.el (vc-revert-file, vc-revert-files): When + un-adding, clear vc-backend property (bug#81291). + 2026-06-24 Martin Rudalics Document new option 'delete-frame-choose-selected' (Bug#80397) @@ -66498,7 +67207,7 @@ This file records repository revisions from commit 1cda0967b4d3c815fc610794ad6a8fc2b913a3c5 (exclusive) to -commit 884d7a198c9eff1cf0a9cc6e2a021f7d82cb57c6 (inclusive). +commit 1bd56ff93273f754e72e9a50cbefae3b218d2260 (inclusive). See ChangeLog.4 for earlier changes. ;; Local Variables: diff --git a/etc/AUTHORS b/etc/AUTHORS index 150f5ee6527..fce94721cd4 100644 --- a/etc/AUTHORS +++ b/etc/AUTHORS @@ -17,7 +17,7 @@ Aaron Jensen: changed nsterm.m frameset.el ruby-bracketed-args-indent.rb Aaron Larson: co-wrote bibtex.el Aaron L. Zeng: changed savehist.el emacs-module-tests.el emacs-module.c - eval.c lisp.h vc-hg.el + eval.c goto-addr.el lisp.h vc-hg.el Aaron S. Hawley: wrote lisp-tests.el undo-tests.el and changed simple.el files.texi isearch.el morse.el sgml-mode.el @@ -258,6 +258,8 @@ Alfred M. Szmidt: changed rmail.el vc-svn.el html2text.el openbsd.h Alfredo Finelli: changed TUTORIAL.it +Al Haji-Ali: changed latexenc.el + Ali Bahrami: changed configure configure.ac sol2-10.h Alin C. Soare: changed lisp-mode.el hexl.el @@ -311,7 +313,8 @@ and changed nsterm.m nsfns.m nsmenu.m nsterm.h font-lock.el nsimage.m Anders Waldenborg: changed emacsclient.c -Andrea Alberti: changed xdisp.c dispextern.h faces.el xfaces.c +Andrea Alberti: changed xdisp.c xfaces.c dispextern.h display.texi + faces.el nsterm.m Andrea Corallo: wrote [native compilation of Emacs Lisp] comp-common.el comp-cstr-tests.el comp-cstr.el comp-run.el comp-tests.el comp.c @@ -502,9 +505,9 @@ Antonin Houska: changed newcomment.el Antonio Ruiz: changed handwrite.el Arash Esbati: changed reftex-vars.el efaq-w32.texi reftex-cite.el - reftex-tests.el reftex.texi reftex-parse.el reftex.el gnus.texi - ispell.el reftex-auc.el reftex-dcr.el reftex-ref.el tex-mode.el - align.el eglot.el ffap.el latexenc.el maintaining.texi nnmaildir.el + reftex-tests.el reftex.texi reftex-parse.el reftex.el tex-mode.el + gnus.texi ispell.el reftex-auc.el reftex-dcr.el reftex-ref.el align.el + eglot.el ffap.el latexenc.el maintaining.texi nnmaildir.el reftex-global.el reftex-toc.el Arik Mitschang: changed smime.el @@ -583,9 +586,9 @@ Augustin Chéneau: changed c-ts-mode.el treesit.el Augusto Stoffel: co-wrote ansi-osc.el and changed progmodes/python.el eglot.el isearch.el comint.el eldoc.el progmodes/compile.el project.el README.md bookmark.el dired.el - dockerfile-ts-mode.el files.el font-lock.el glasses.el gnutls.el man.el - message.el message.texi misc.texi modes.texi outline.el - and 17 other files + dockerfile-ts-mode.el emacsbug.el files.el font-lock.el glasses.el + gnutls.el man.el message.el message.texi misc.texi modes.texi + and 19 other files Aurélien Aptel: changed alloc.c emacs-module.h lisp.h Makefile configure.ac cus-face.el data.c dispextern.h display.texi dynlib.c @@ -735,6 +738,7 @@ Billy Lei: wrote burmese.el Billy Zheng: changed README.md eglot.el Binbin Ye: changed json-ts-mode-tests.el json-ts-mode.el + typescript-ts-mode.el Bjarte Johansen: wrote ob-sed.el and changed use-package-bind-key.el @@ -979,7 +983,7 @@ and co-wrote longlines.el tango-dark-theme.el tango-theme.el and changed simple.el display.texi xdisp.c files.el frames.texi cus-edit.el files.texi custom.el subr.el text.texi faces.el keyboard.c startup.el package.el misc.texi emacs.texi modes.texi mouse.el - custom.texi image.c window.el and 920 other files + custom.texi image.c window.el and 903 other files Chris Chase: co-wrote idlw-shell.el idlwave.el @@ -1301,10 +1305,10 @@ Daniel McClanahan: changed lisp-mode.el Daniel M Coffman: changed arc-mode.el Daniel Mendler: co-wrote compat.el -and changed minibuffer.el simple.el browse-url.el ibuffer.el crm.el - eww.el minibuf.texi project.el buffer-tests.el buffer.c buffer.h +and changed minibuffer.el simple.el browse-url.el eldoc.el ibuffer.el + crm.el eww.el minibuf.texi project.el buffer-tests.el buffer.c buffer.h dispextern.h display.texi faces.el frame.c frame.h package.el - picture.el subr-tests.el subr.el window.c and 30 other files + picture.el subr-tests.el subr.el and 30 other files Daniel M German: co-wrote org-protocol.el @@ -1441,7 +1445,7 @@ and changed cedet/semantic.el db.el insert.el semantic/complete.el c.by c.el db-el.el db-file.el db-find.el ede-grammar.el eieio-opt.el eieio.el eieio.texi gnus.texi registry.el srecode/compile.el wisent/python.el analyze.el bovine/el.el bovine/grammar.el - decorate/mode.el and 88 other files + decorate/mode.el and 87 other files Davide Pola: changed comp-cstr.el comp-run.el @@ -1673,7 +1677,7 @@ Dionisio E Alonso: changed eglot.el Dirk Herrmann: co-wrote bibtex.el Dirk-Jan C. Binnema: changed xwidget.c configure.ac org-agenda.el - process.c process.h + process.c process.h xterm.c Dirk Ullrich: changed ispell.el @@ -1698,8 +1702,8 @@ Dmitry Gutov: wrote elisp-mode-tests.el etags-regen.el jit-lock-tests.el and changed project.el xref.el ruby-mode.el vc-git.el ruby-ts-mode.el vc.el elisp-mode.el js.el etags.el ruby-mode-tests.el vc-hg.el package.el minibuffer.el maintaining.texi simple.el symref/grep.el - progmodes/python.el ruby-ts-mode-tests.el treesit.el dired-aux.el - project-tests.el and 189 other files + progmodes/python.el project-tests.el ruby-ts-mode-tests.el treesit.el + dired-aux.el and 190 other files Dmitry Kurochkin: changed isearch.el @@ -1814,7 +1818,7 @@ and co-wrote help-tests.el and changed xdisp.c display.texi w32.c msdos.c simple.el w32fns.c files.el fileio.c keyboard.c configure.ac emacs.c text.texi dispnew.c w32term.c frames.texi files.texi w32proc.c xfaces.c process.c window.c - dispextern.h and 1453 other files + dispextern.h and 1441 other files Eliza Velasquez: changed server.el simple.el @@ -1917,7 +1921,7 @@ and changed c.srt ede.texi info.el rmail.el speedbspec.el cedet.el ede-autoconf.srt ede-make.srt eieio.texi gud.el sb-dir-minus.xpm sb-dir-plus.xpm sb-dir.xpm sb-mail.xpm sb-pg-minus.xpm sb-pg-plus.xpm sb-pg.xpm sb-tag-gt.xpm sb-tag-minus.xpm sb-tag-plus.xpm - and 35 other files + and 34 other files Eric Schulte: wrote ob-awk.el ob-calc.el ob-comint.el ob-css.el ob-dot.el ob-emacs-lisp.el ob-eval.el ob-forth.el ob-gnuplot.el ob-haskell.el @@ -1975,7 +1979,7 @@ and changed completion-preview-tests.el programs.texi eglot.el elisp-mode.el emacs.texi emoji.el eww.el help-fns.el info.el minibuffer-tests.el minibuffer.el text-mode.el window.c xdisp.c xref.el bookmark.el dictionary.el display.texi easy-mmode.el eldoc.el - elec-pair.el and 21 other files + elec-pair.el and 24 other files Espen Skoglund: wrote pascal.el @@ -2316,7 +2320,7 @@ and changed configure.ac Makefile.in src/Makefile.in calendar.el lisp/Makefile.in diary-lib.el files.el make-dist rmail.el progmodes/f90.el bytecomp.el admin.el misc/Makefile.in simple.el authors.el startup.el emacs.texi lib-src/Makefile.in display.texi - ack.texi subr.el and 1771 other files + ack.texi subr.el and 1753 other files Glynn Clements: wrote gamegrid.el snake.el tetris.el @@ -2399,6 +2403,8 @@ Guy Geens: changed gnus-score.el Gwern Branwen: changed browse-url.el +Haiyang Miao: changed pgtkterm.c + Håkan Granath: changed dired.el Håkon Malmedal: changed calendar.el holidays.el @@ -2706,7 +2712,7 @@ and changed org-lparse.el org.el org.texi ox.el icomplete.el etags.el htmlfontify.el ido.el indian.el iswitchb.el org-bbdb.el org-compat.el and 5 other files -James Cherti: changed sh-script.el eldoc.el outline.el +James Cherti: changed sh-script.el eldoc.el elisp-mode.el outline.el progmodes/python.el yaml-ts-mode.el James Clark: wrote nxml-enc.el nxml-maint.el nxml-mode.el nxml-ns.el @@ -2853,10 +2859,10 @@ Jay McCarthy: changed org-colview.el Jay Sachs: changed gnus-score.el gnus-win.el J.D. Smith: co-wrote idlw-help.el idlw-shell.el idlwave.el -and changed idlw-rinfo.el comint.el idlwave.texi loaddefs-gen.el vc.el - bibtex.el byte-run.el cl-generic.el configure.ac easy-mmode.el eglot.el - files.texi functions.texi hideshow.el inline.el loading.texi misc.texi - mouse.el os.texi pcase.el repeat.el and 10 other files +and changed idlw-rinfo.el comint.el configure.ac idlwave.texi + loaddefs-gen.el vc.el bibtex.el byte-run.el cl-generic.el easy-mmode.el + eglot.el files.texi functions.texi hideshow.el inline.el loading.texi + misc.texi mouse.el os.texi pcase.el repeat.el and 10 other files Jean Abou Samra: changed scheme.el @@ -3123,6 +3129,8 @@ Johan Claesson: changed cl.texi filecache.el files-x.el help-fns.el Johan Euphrosine: changed ibuf-ext.el +Johan Myréen: changed pgtkterm.c + Johannes Weiner: changed browse-url.el keyboard.c configure.ac lisp-mode.el lisp.h pp.el sound.c w32term.c xfaces.c xterm.c @@ -3345,7 +3353,7 @@ and co-wrote help-tests.el keymap-tests.el and changed subr.el desktop.el w32fns.c bs.el faces.el simple.el emacsclient.c files.el server.el help-fns.el xdisp.c org.el w32term.c w32.c buffer.c keyboard.c ido.el image.c window.c eval.c allout.el - and 1206 other files + and 1191 other files Juan Pechiar: changed ob-octave.el @@ -3395,10 +3403,11 @@ and changed callproc.c eglot.el tramp-gvfs.el tramp-sh.el comint.el Juri Linkov: wrote compose.el emoji.el files-x.el misearch.el repeat-tests.el replace-tests.el tab-bar-tests.el tab-bar.el tab-line.el -and changed isearch.el simple.el replace.el info.el dired.el treesit.el - minibuffer.el dired-aux.el window.el outline.el progmodes/grep.el - subr.el diff-mode.el repeat.el vc.el mouse.el files.el image-mode.el - menu-bar.el project.el display.texi and 528 other files +and changed isearch.el simple.el replace.el info.el dired.el + minibuffer.el treesit.el dired-aux.el window.el outline.el + progmodes/grep.el subr.el diff-mode.el repeat.el vc.el mouse.el + files.el image-mode.el menu-bar.el project.el display.texi + and 527 other files Jussi Lahdenniemi: changed w32fns.c ms-w32.h msdos.texi w32.c w32.h w32console.c w32heap.c w32inevt.c w32term.h @@ -3428,7 +3437,7 @@ and co-wrote longlines.el tramp-sh.el tramp.el and changed message.el gnus-agent.el gnus-sum.el files.el nnmail.el tramp.texi nntp.el gnus.el simple.el ange-ftp.el dired.el paragraphs.el bindings.el files.texi gnus-art.el gnus-group.el man.el INSTALL - Makefile.in crisp.el fileio.c and 45 other files + Makefile.in crisp.el fileio.c and 44 other files Kailash C. Chowksey: changed HELLO ind-util.el kannada.el knd-util.el lisp/Makefile.in loadup.el @@ -3560,7 +3569,7 @@ and co-wrote ps-def.el ps-mule.el ps-print.el ps-samp.el quail.el and changed coding.c mule-cmds.el mule.el fontset.c charset.c xdisp.c font.c fontset.el xterm.c fileio.c mule-conf.el ftfont.c characters.el fns.c mule-diag.el coding.h charset.h ccl.c xfaces.c editfns.c - composite.c and 385 other files + composite.c and 370 other files Kenichi Okada: co-wrote sasl-cram.el sasl-digest.el @@ -3661,6 +3670,8 @@ Kirill A. Korinskiy: changed fortune.el Kirk Kelsey: changed make-mode.el vc-hg.el +Kisaragi Hiu: changed js.el typescript-ts-mode.el + Kiso Katsuyuki: changed tab-line.el Kjartan Óli Ágústsson: changed doc-view.el @@ -3787,7 +3798,7 @@ and co-wrote gnus-kill.el gnus-mh.el gnus-msg.el gnus-score.el and changed subr.el simple.el gnus.texi files.el display.texi process.c help-fns.el text.texi image.c dired.el help.el image.el package.el edebug.el shortdoc.el dired-aux.el gnutls.c minibuffer.el subr-x.el - auth-source.el smtpmail.el and 1051 other files + auth-source.el smtpmail.el and 1050 other files Lars Rasmusson: changed ebrowse.c @@ -3923,7 +3934,7 @@ Luc Teirlinck: wrote help-at-pt.el and changed files.el autorevert.el cus-edit.el subr.el simple.el frames.texi startup.el display.texi files.texi dired.el comint.el modes.texi custom.texi emacs.texi fns.c frame.el ielm.el minibuf.texi - variables.texi buffers.texi commands.texi and 211 other files + variables.texi buffers.texi commands.texi and 210 other files Ludovic Courtès: wrote nnregistry.el and changed configure.ac gnus.texi loadup.el @@ -4067,6 +4078,8 @@ Mark Diekhans: changed files.el ispell.el progmodes/compile.el subr.el Mark E. Shoulson: changed org.el org-entities.el +Mark Hindley: changed browse-url.el + Mark Hood: changed gnus-uu.el Mark H. Weaver: changed comint.el @@ -4163,9 +4176,9 @@ Martin Neitzel: changed supercite.el Martin Pohlack: changed iimage.el pc-select.el Martin Rudalics: co-wrote window-x.el -and changed window.el window.c windows.texi frame.c xdisp.c frames.texi +and changed window.el window.c windows.texi frame.c frames.texi xdisp.c xterm.c w32fns.c frame.el w32term.c xfns.c frame.h display.texi - cus-start.el buffer.c help.el keyboard.c mouse.el window.h dispnew.c + cus-start.el help.el buffer.c keyboard.c mouse.el window.h dispnew.c gtkutil.c and 220 other files Martin Stjernholm: wrote cc-bytecomp.el @@ -4339,7 +4352,8 @@ Michael Albinus: wrote autorevert-tests.el dbus-tests.el dbus.el tramp-gvfs.el tramp-integration.el tramp-message.el tramp-rclone.el tramp-smb.el tramp-sshfs.el tramp-sudoedit.el tramp-tests.el url-tramp-tests.el url-tramp.el zeroconf.el -and co-wrote tramp-cache.el tramp-sh.el tramp.el vc-tests.el +and co-wrote tramp-cache.el tramp-sh.el tramp.el vc-tests-helpers.el + vc-tests.el and changed tramp.texi tramp-adb.el trampver.el trampver.texi gitlab-ci.yml files.el dbusbind.c files.texi ange-ftp.el Dockerfile.emba dbus.texi file-notify-tests.el autorevert.el @@ -4425,7 +4439,7 @@ Michael Olson: changed erc.el erc-backend.el Makefile erc-track.el erc-log.el erc-stamp.el erc-autoaway.el erc-dcc.el erc-goodies.el erc-list.el erc-compat.el erc-identd.el erc.texi erc-bbdb.el erc-match.el erc-notify.el erc-ibuffer.el erc-services.el remember.el - erc-button.el erc-nicklist.el and 54 other files + erc-button.el erc-nicklist.el and 53 other files Michael Orlitzky: changed tex-mode.el @@ -4866,6 +4880,8 @@ and changed dired-aux.el outline.el checkdoc.el files.el subr.el buffer.c Oleksandr Gavenko: changed generic-x.el progmodes/grep.el +Oleksandr Makhmudov: changed eglot.el + Olin Shivers: wrote cmuscheme.el inf-lisp.el and co-wrote comint.el shell.el @@ -5085,12 +5101,12 @@ Peter Münster: changed image-dired.el gnus-delay.el gnus-demon.el Peter O'Gorman: changed configure.ac frame.h hpux10-20.h termhooks.h -Peter Oliver: changed emacsclient.desktop emacs.metainfo.xml - emacsclient-mail.desktop Makefile.in emacs-mail.desktop - treesit-admin.el configure.ac dired-tests.el efaq.texi misc.texi - server.el term.c AndroidManifest.xml.in Dockerfile.emba admin.el - compat-template.html ediff-diff.el emacs.c emacs.desktop emacsclient.1 - perl-mode.el and 6 other files +Peter Oliver: changed emacsclient.desktop emacs.metainfo.xml Makefile.in + emacsclient-mail.desktop emacs-mail.desktop treesit-admin.el + configure.ac dired-tests.el efaq.texi misc.texi server.el term.c + AndroidManifest.xml.in Dockerfile.emba admin.el compat-template.html + ediff-diff.el emacs.c emacs.desktop emacsclient.1 perl-mode.el + and 6 other files Peter Povinec: changed term.el @@ -5131,7 +5147,7 @@ Petr Salinger: changed configure.ac gnu-kfreebsd.h Petteri Hintsanen: changed sequences.texi tab-bar.el Makefile.in bindat.el emacs/Makefile.in lispintro/Makefile.in lispref/Makefile.in - misc/Makefile.in + misc/Makefile.in perl-mode.el Phil Hagelberg: wrote ert-x-tests.el and changed package.el pcmpl-unix.el eglot.el subr.el @@ -5148,7 +5164,7 @@ Philip Kaludercic: wrote epa-ks.el newcomers-presets-theme.el and co-wrote compat.el and changed package.el rcirc.el package.texi rcirc.texi vc.el sgml-mode.el vc-git.el project.el which-key.el package-autosuggest.eld - package-activate.el startup.el message.el subr.el custom.texi eglot.el + startup.el package-activate.el message.el subr.el custom.texi eglot.el simple.el bytecomp.el cus-edit.el custom.el help.el and 94 other files Philippe Altherr: changed sh-script.el sh-script-tests.el shell.sh @@ -5237,10 +5253,10 @@ Piotr Trojanek: changed gnutls.c process.c Piotr Zieliński: wrote org-mouse.el Pip Cet: wrote image-circular-tests.el -and changed pdumper.c comp.c lisp.h xdisp.c alloc.c xterm.c fns.c - configure.ac emacs.c eval.c image.c comp.el frame.c print.c - src/Makefile.in byte-opt.el conf_post.h data.c doc.c ftcrfont.c - gtkutil.c and 119 other files +and changed pdumper.c comp.c lisp.h xdisp.c alloc.c xterm.c eval.c fns.c + configure.ac emacs.c image.c comp.el frame.c print.c src/Makefile.in + byte-opt.el conf_post.h data.c doc.c ftcrfont.c gtkutil.c + and 123 other files Platon Pronko: changed tramp.el @@ -5270,10 +5286,9 @@ Protesilaos Stavrou: wrote modus-operandi-deuteranopia-theme.el modus-vivendi-deuteranopia-theme.el modus-vivendi-theme.el modus-vivendi-tinted-theme.el modus-vivendi-tritanopia-theme.el and changed modus-themes.org eww.el vc-dir.el TUTORIAL.el_GR log-view.el - modus-themes.texi time.el vc-git.el appt.el apropos.el custom.el - diff-mode.el flymake.el ibuffer.el language/greek.el log-edit.el - minibuffer.el package.el perl-mode.el shortdoc.el shr.el - and 6 other files + time.el vc-git.el appt.el apropos.el custom.el diff-mode.el flymake.el + ibuffer.el language/greek.el log-edit.el minibuffer.el package.el + perl-mode.el shortdoc.el shr.el vc-cvs.el and 5 other files Przemsyław Kryger: wrote package-vc-tests.el @@ -5443,9 +5458,9 @@ and changed calendar.el diary-icalendar-tests.el icalendar-recur-tests.el icalendar-parser-tests.el icalendar-tests.el .gitattributes cal-dst.el cal-move.el cond-star.el diary-icalendar-resources emacs.texi gnus-icalendar-tests.el icalendar-ast-tests.el - import-legacy-function.ics import-legacy-vars.ics - import-non-recurring-all-day.ics import-rrule-anniversary.ics - and 8 other files + import-bug-11473.diary-iso import-bug-22092.diary-iso + import-bug-33277.diary-iso import-legacy-function.ics + and 22 other files Richard Levitte: changed vc-mtn.el @@ -5690,6 +5705,8 @@ and changed progmodes/compile.el cl-indent.el simple.el vc-cvs.el vc.el Samuel Bronson: changed custom.el emacsclient.c keyboard.c progmodes/grep.el semantic/format.el unexmacosx.c +Samuele Favazza: changed tramp-container.el + Samuel Freilich: changed simple.el Samuel Loury: changed org.el @@ -5765,11 +5782,11 @@ Sean Sieger: changed emacs-lisp-intro.texi Sean Whitton: wrote em-elecslash.el em-extpipe-tests.el em-extpipe.el vc-test-misc.el -and co-wrote vc-tests.el +and co-wrote vc-tests-helpers.el vc-tests.el and changed vc.el vc-git.el vc-dispatcher.el vc-hg.el vc-dir.el diff-mode.el vc-hooks.el vc1-xtra.texi log-view.el maintaining.texi subr.el project.el log-edit.el files.texi server.el simple.el window.el - cond-star.el dired-aux.el keyboard.c vc/vc-bzr.el and 333 other files + cond-star.el dired-aux.el keyboard.c vc/vc-bzr.el and 334 other files Sebastian Fieber: changed gnus-art.el mm-decode.el mm-view.el @@ -5964,7 +5981,7 @@ Sławomir Nowaczyk: changed emacs.py progmodes/python.el TUTORIAL.pl Spencer Baugh: wrote map-ynp-tests.el uniquify-tests.el which-func-tests.el -and changed minibuffer.el project.el minibuffer-tests.el simple.el +and changed minibuffer.el minibuffer-tests.el project.el simple.el flymake.el process.c progmodes/grep.el startup.el vc-hg.el crm.el mini.texi uniquify.el comint.el data-tests.el dired-aux.el easy-mmode.el eglot.el elisp-mode.el ffap.el flymake.texi keymap.c @@ -5998,7 +6015,7 @@ and co-wrote help-tests.el keymap-tests.el and changed subr.el package.el image-dired.el checkdoc.el efaq.texi cperl-mode.el help.el simple.el progmodes/python.el dired.el files.el bookmark.el browse-url.el gnus.texi keymap.c dired-x.el erc.el image.c - cl-macs.el message.el subr-tests.el and 1948 other files + cl-macs.el message.el subr-tests.el and 1947 other files Stefan Merten: co-wrote rst.el @@ -6015,7 +6032,7 @@ and co-wrote font-lock.el gitmerge.el pcvs.el visual-wrap.el and changed subr.el simple.el cl-macs.el bytecomp.el files.el keyboard.c lisp.h vc.el eval.c xdisp.c alloc.c help-fns.el buffer.c sh-script.el package.el tex-mode.el progmodes/compile.el lread.c keymap.c window.c - easy-mmode.el and 1745 other files + easy-mmode.el and 1744 other files Stefano Facchini: changed gtkutil.c @@ -6042,10 +6059,10 @@ Steinar Bang: changed gnus-setup.el imap.el Stéphane Boucher: changed replace.el Stephane Marks: wrote savehist-tests.el system-sleep.el system-taskbar.el -and changed frame.el frames.texi nsfns.m tab-bar.el bookmark.el frame.c - nsterm.m markdown-ts-mode.el project.el recentf.el savehist.el subr.el - vtable.el w32fns.c display.texi ibuf-macs.el os.texi saveplace.el - shell.el treesit.el vtable-tests.el and 32 other files +and changed frame.el markdown-ts-mode.el frames.texi nsfns.m tab-bar.el + bookmark.el frame.c nsterm.m subr.el project.el display.texi recentf.el + savehist.el vtable.el w32fns.c ibuf-macs.el os.texi saveplace.el + shell.el subr-x.el treesit.el and 34 other files Stephane Zermatten: changed term-tests.el term.el ansi-osc.el @@ -6056,11 +6073,11 @@ Stephen A. Wood: changed fortran.el Stephen Berman: wrote todo-mode-tests.el and co-wrote todo-mode.el visual-wrap.el -and changed dired.el wid-edit.el wdired.el dired-tests.el files.el +and changed dired.el wid-edit.el dired-tests.el wdired.el files.el todo-mode.texi dabbrev-tests.el wdired-tests.el diary-lib.el menu-bar.el minibuffer.el dabbrev.el dired-aux.el doc-view.el info.el outline.el simple.el todo-test-1.todo widget.texi INSTALL_BEGIN - allout.el and 90 other files + allout.el and 89 other files Stephen C. Gilardi: changed configure.ac @@ -6252,7 +6269,7 @@ and changed spam.el gnus.el nnimap.el gnus.texi gnutls.c gnus-sum.el auth.texi cfengine.el gnus-sync.el gnus-util.el gnus-start.el netrc.el gnutls.h message.el spam-stat.el .gitlab-ci.yml encrypt.el mail-source.el nnir.el nnmail.el auth-source-tests.el - and 125 other files + and 124 other files Terje Rosten: changed xfns.c version.el xterm.c xterm.h @@ -6865,8 +6882,9 @@ Xi Lu: changed etags.c htmlfontify.el ruby-mode.el CTAGS.good_crlf CTAGS.good_update Makefile TUTORIAL.cn crlf eww.el filesets.el man-tests.el man.el shortdoc.el tramp-sh.el -Xiyue Deng: changed emacs-lisp-intro.texi strings.texi smtpmail.el - functions.texi package.el package.texi symbols.texi +Xiyue Deng: changed emacs-lisp-intro.texi strings.texi package.el + smtpmail.el functions.texi package-activate.el package-tests.el + package.texi symbols.texi Xuan Wang: changed warnings.el @@ -7008,7 +7026,7 @@ Zhang Weize: wrote ob-plantuml.el Zhehao Lin: changed xfaces.c Zhengyi Fu: changed bookmark.el executable.el progmodes/grep.el - replace.el + project.el replace.el xwidget.el Zhiwei Chen: changed hideif.el @@ -7029,8 +7047,8 @@ and changed fontset.el HELLO language/indian.el quail/indian.el loadup.el BidiBrackets.txt BidiMirroring.txt Blocks.txt IVD_Sequences.txt IdnaMappingTable.txt NormalizationTest.txt PropertyValueAliases.txt ScriptExtensions.txt Scripts.txt SpecialCasing.txt UnicodeData.txt - characters.el confusables.txt copyright.html emoji-data.txt - emoji-sequences.txt and 8 other files + c-ts-mode.el characters.el confusables.txt copyright.html + emoji-data.txt and 10 other files উৎসব রায়: changed quail/indian.el commit baf195d1eb9222154fa7e156a4f7917d58377838 Author: Eli Zaretskii Date: Thu Jul 23 10:09:46 2026 +0300 ; Fix extra whitespace in 'report-emacs-bug' * lisp/mail/emacsbug.el (report-emacs-bug--os-description): Account for 'os' being nil. (Bug#81437) diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el index d69fd106e5c..e43e982c04b 100644 --- a/lisp/mail/emacsbug.el +++ b/lisp/mail/emacsbug.el @@ -127,7 +127,9 @@ This requires either the macOS \"open\" command, or the freedesktop (goto-char (point-min)) (if (re-search-forward (format "^%s\\s-*:\\s-+\\(.*\\)$" s) nil t) - (setq os (concat os " " (match-string 1))))))) + (setq os (concat os + (if os " ") + (match-string 1))))))) os)) ((eq system-type 'windows-nt) (or report-emacs-bug--os-description commit 556b803339d2bf72f361851f4a6fae3954d14652 Author: Eli Zaretskii Date: Thu Jul 23 09:53:26 2026 +0300 ; Fix last change * src/keyboard.c (Fposn_point): Doc and commentary fixes. * test/src/keyboard-tests.el (keyboard-tests-keymap-property): New test, taken from reproduction recipe by Spencer Baugh . (Bug#81386) diff --git a/src/keyboard.c b/src/keyboard.c index 8eb2e84b280..970023f1157 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -13100,7 +13100,7 @@ DEFUN ("posn-point", Fposn_point, Sposn_point, 1, 1, 0, doc: /* Return the buffer location in POSITION. POSITION should be a list of the form returned by the `event-start' and `event-end' functions. -Returns nil if POSITION does not correspond to any buffer location (e.g. +Return nil if POSITION does not correspond to any buffer location (e.g., a click on a scroll bar). */) (Lisp_Object position) { @@ -13109,12 +13109,12 @@ a click on a scroll bar). */) return posn; /* POSITION is a short position list (such as returned by `event--posn-at-point') without a POSN_BUFFER_POSN; fall back to - the location in POSN_POSN. */ + the location in POSN_POSN. */ posn = POSN_POSN (position); if (CONSP (posn)) return XCAR (posn); - /* Apparently this can also be `vertical-scroll-bar' (bug#13979). */ - if (INTEGERP (posn)) + /* Apparently, POSN can also be `vertical-scroll-bar' (bug#13979). */ + if (FIXNUMP (posn)) return posn; return Qnil; } diff --git a/test/src/keyboard-tests.el b/test/src/keyboard-tests.el index b64b20fb6cb..6b64503fe8c 100644 --- a/test/src/keyboard-tests.el +++ b/test/src/keyboard-tests.el @@ -476,5 +476,20 @@ even if `input-decode-map' has not yet scanned the tail." (keyboard-tests--rks-execute (list ?\C-c ?\C-h) map) (should called))) +(ert-deftest keyboard-tests-keymap-property () + "Test `describe-key' when keymap is a text property." + (defvar-keymap my-test-map "" #'forward-line) + (with-temp-buffer + (pop-to-buffer (current-buffer)) + (save-excursion (insert "hello world")) + (put-text-property (point-min) (point-max) 'keymap my-test-map) + (describe-key (list (cons (kbd "") (kbd "")))) + (with-current-buffer "*Help*" + (goto-char (point-min)) + (should (string-match-p "(found in my-test-map)" + (buffer-substring + (line-beginning-position) + (line-end-position))))))) + (provide 'keyboard-tests) ;;; keyboard-tests.el ends here commit 0c83d2cdbb121698fa3c4685ad68bd918a08b81a Author: Spencer Baugh Date: Thu Jul 9 14:19:19 2026 -0400 Fix 'current-active-maps' for 4-element position list 'current-active-maps' called POSN_BUFFER_POSN to get the buffer location out of a position list. But POSN_BUFFER_POSN is not correct: to get the buffer location you need the more complicated logic in 'posn-point', you can't just take the 5th element of POSN. Fix it by calling 'posn-point' instead, which is now moved to C for this purpose. * src/keyboard.c (Fposn_point): New function, moved from subr.el. (syms_of_keyboard): Defsubr it. * lisp/subr.el (posn-point): Delete; moved to C. * lisp/emacs-lisp/byte-opt.el (side-effect-free-fns): Add the new C implementation of 'posn-point'. * src/keymap.c (Fcurrent_active_maps): Call 'posn-point' instead of 'POSN_BUFFER_POSN'. (Bug#81386) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 7ed71346451..a596dee6844 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1771,7 +1771,7 @@ See Info node `(elisp) Integer Basics'." ;; json.c json-serialize json-parse-string ;; keyboard.c - posn-at-point posn-at-x-y + posn-at-point posn-at-x-y posn-point ;; keymap.c copy-keymap keymap-parent keymap-prompt make-keymap make-sparse-keymap ;; lread.c diff --git a/lisp/subr.el b/lisp/subr.el index 16e91934382..60a57688f73 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2013,19 +2013,6 @@ and `event-end' functions." (nth 1 position)))) (and (symbolp area) area))) -(defun posn-point (position) - "Return the buffer location in POSITION. -POSITION should be a list of the form returned by the `event-start' -and `event-end' functions. -Returns nil if POSITION does not correspond to any buffer location (e.g. -a click on a scroll bar)." - (declare (side-effect-free t)) - (or (nth 5 position) - (let ((pt (nth 1 position))) - (or (car-safe pt) - ;; Apparently this can also be `vertical-scroll-bar' (bug#13979). - (if (integerp pt) pt))))) - (defun posn-set-point (position) "Move point to POSITION. Select the corresponding window as well." diff --git a/src/keyboard.c b/src/keyboard.c index 3d18d20b56e..8eb2e84b280 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -13096,6 +13096,29 @@ The `posn-' functions access elements of such lists. */) return tem; } +DEFUN ("posn-point", Fposn_point, Sposn_point, 1, 1, 0, + doc: /* Return the buffer location in POSITION. +POSITION should be a list of the form returned by the `event-start' +and `event-end' functions. +Returns nil if POSITION does not correspond to any buffer location (e.g. +a click on a scroll bar). */) + (Lisp_Object position) +{ + Lisp_Object posn = POSN_BUFFER_POSN (position); + if (!NILP (posn)) + return posn; + /* POSITION is a short position list (such as returned by + `event--posn-at-point') without a POSN_BUFFER_POSN; fall back to + the location in POSN_POSN. */ + posn = POSN_POSN (position); + if (CONSP (posn)) + return XCAR (posn); + /* Apparently this can also be `vertical-scroll-bar' (bug#13979). */ + if (INTEGERP (posn)) + return posn; + return Qnil; +} + /* Set up a new kboard object with reasonable initial values. TYPE is a window system for which this keyboard is used. */ @@ -13731,6 +13754,7 @@ This is effective only in `noninteractive' sessions. */); defsubr (&Scurrent_input_mode); defsubr (&Sposn_at_point); defsubr (&Sposn_at_x_y); + defsubr (&Sposn_point); defsubr (&Sread_char); defsubr (&Sread_char_exclusive); diff --git a/src/keymap.c b/src/keymap.c index a42cec854dd..ec0b966d435 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -1742,7 +1742,7 @@ means to return the active maps for that window's buffer. */) } } - Lisp_Object buffer_posn = POSN_BUFFER_POSN (position); + Lisp_Object buffer_posn = Fposn_point (position); /* Then, if the click was in the buffer, get the local text-property keymap of the place clicked on. */ @@ -3481,6 +3481,7 @@ that describe key bindings. That is why the default is nil. */); DEFSYM (Qkey_parse, "key-parse"); DEFSYM (Qkey_valid_p, "key-valid-p"); + DEFSYM (Qposn_point, "posn-point"); DEFSYM (Qnon_key_event, "non-key-event"); DEFSYM (Qprinc, "princ"); DEFSYM (Qsuppress_keymap, "suppress-keymap"); commit 074cdea573ed21c8b92d45e4aca5cd2b9e05bbaf Author: Petteri Hintsanen Date: Wed Jul 22 21:21:22 2026 +0300 timeclock: Optionally use 24-hour clock * lisp/calendar/timeclock.el (timeclock-use-24hr-format): New defcustom. (timeclock-time-format): New function. (timeclock-status-string, timeclock-when-to-leave-string) (timeclock-generate-report): Call timeclock-time-format to format displayed times. (Bug#81440) * etc/NEWS: Document the change. * test/lisp/calendar/timeclock-tests.el: New file. diff --git a/etc/NEWS b/etc/NEWS index 85d1af8d71c..10feed8e388 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -194,6 +194,12 @@ the currently selected item in the list view to the kill-ring. You can now visit such files in Rmail mode using ordinary file-visiting commands, such as 'C-x C-f'. +** timeclock + +--- +*** New variable 'timeclock-use-24hr-format'. +If this variable is set to non-nil, displayed times (clocked in/out +since, time to leave) will use 24-hour clock instead of 12-hour clock. * New Modes and Packages in Emacs 32.1 diff --git a/lisp/calendar/timeclock.el b/lisp/calendar/timeclock.el index acdf99f77ae..5ff938c3925 100644 --- a/lisp/calendar/timeclock.el +++ b/lisp/calendar/timeclock.el @@ -136,6 +136,11 @@ This variable only has effect if set with \\[customize]." (set symbol value)) :type 'boolean) +(defcustom timeclock-use-24hr-format nil + "If non-nil, use 24-hour clock when displaying times. +Otherwise use 12-hour clock with AM/PM suffix." + :type 'boolean) + (defvar timeclock-update-timer nil "The timer used to update `timeclock-mode-string'.") @@ -411,11 +416,8 @@ worked today, ignoring the time worked on previous days." (status (format "Currently %s since %s (%s), %s %s, leave at %s" (if last-in "IN" "OUT") - (if show-seconds - (format-time-string "%-I:%M:%S %p" - (nth 1 timeclock-last-event)) - (format-time-string "%-I:%M %p" - (nth 1 timeclock-last-event))) + (format-time-string (timeclock-time-format show-seconds) + (nth 1 timeclock-last-event)) (or (nth 2 timeclock-last-event) (if last-in "**UNKNOWN**" "workday over")) (timeclock-seconds-to-string remainder show-seconds t) @@ -539,10 +541,8 @@ relative only to the time worked today, and not to past time." ;; Should today-only be removed in favor of timeclock-relative? - gm (interactive) (let* ((then (timeclock-when-to-leave today-only)) - (string - (if show-seconds - (format-time-string "%-I:%M:%S %p" then) - (format-time-string "%-I:%M %p" then)))) + (string (format-time-string (timeclock-time-format show-seconds) + then))) (if (called-interactively-p 'interactive) (message "%s" string) string))) @@ -1171,7 +1171,9 @@ HTML-P is non-nil, HTML markup is added." (setq done t)) (insert "OUT"))) (unless done - (insert " since " (format-time-string "%Y/%m/%d %-I:%M %p" begin)) + (insert " since " (format-time-string + (concat "%Y/%m/%d " (timeclock-time-format)) + begin)) (if html-p (insert "
\n") (insert "\n*")) @@ -1322,6 +1324,14 @@ HTML-P is non-nil, HTML markup is added." (interactive) (find-file-other-window timeclock-file)) +(defun timeclock-time-format (&optional seconds) + "Return a time format string suitable for format-time-string. +Use 24-hour clock if `timeclock-use-24hr-format' is non-nil, otherwise +use 12-hour clock. Include seconds field if SECONDS is non-nil." + (if timeclock-use-24hr-format + (if seconds "%-H:%M:%S" "%-H:%M") + (if seconds "%-I:%M:%S %p" "%-I:%M %p"))) + (provide 'timeclock) (run-hooks 'timeclock-load-hook) diff --git a/test/lisp/calendar/timeclock-tests.el b/test/lisp/calendar/timeclock-tests.el new file mode 100644 index 00000000000..f289f0d11ef --- /dev/null +++ b/test/lisp/calendar/timeclock-tests.el @@ -0,0 +1,37 @@ +;;; timeclock-tests.el --- Test suite for timeclock.el -*- lexical-binding:t -*- + +;; Copyright (C) 2026 Free Software Foundation, Inc. + +;; Author: Petteri Hintsanen + +;; 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 . + +;;; Commentary: + +;;; Code: + +(require 'ert) +(require 'timeclock) + +(ert-deftest test-timeclock-time-format () + (setopt timeclock-use-24hr-format nil) + (should (equal (timeclock-time-format) "%-I:%M %p")) + (should (equal (timeclock-time-format t) "%-I:%M:%S %p")) + (setopt timeclock-use-24hr-format t) + (should (equal (timeclock-time-format) "%-H:%M")) + (should (equal (timeclock-time-format t) "%-H:%M:%S"))) + +(provide 'timeclock-tests) commit 1bd56ff93273f754e72e9a50cbefae3b218d2260 Author: Sean Whitton Date: Wed Jul 22 21:53:52 2026 +0100 ; Fix last change. diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el index 9b5c9df210b..42dbbbbe9d2 100644 --- a/lisp/vc/vc-annotate.el +++ b/lisp/vc/vc-annotate.el @@ -291,7 +291,7 @@ cover the range from the oldest annotation to the newest." :style toggle :selected (eql vc-annotate-display-mode ,days) ])) vc-annotate-menu-elements) - . ,(cddr items)))) + . ,(cdr items)))) ["By Color Map Range" (unless (null vc-annotate-display-mode) (setq vc-annotate-display-mode nil) (vc-annotate-display-select)) commit 6c74a7a1e71ca63acfbd8344837b3b5fa2b0b201 Author: Helmut Eller Date: Thu Jun 4 17:41:24 2026 +0200 Avoid a GOT indirection for constants in native code on ELF Make the d_reloc variable internal instead of external. For Lisp code like (defun foo () 'abc) the generated code used to look like // Pseudo code: extern Lisp_Object d_reloc[NCONST]; Lisp_Object foo (void) { return d_reloc[OFFSET_OF_ABC]; } // Assembler code: 0000000000001100 : 1100: mov 0x2ec1(%rip),%rax # 3fc8 1107: mov (%rax),%rax 110a: ret the new version looks like: // Pseudo code: static Lisp_Object d_reloc[NCONST]; extern Lisp_Object *d_reloc_addr (void) { return d_reloc; } Lisp_Object foo (void) { return d_reloc[OFFSET_OF_ABC]; } // Assembler code: 0000000000001120 : 1120: mov 0x3059(%rip),%rax # 4180 1127: ret where the function d_reloc_addr is used to initialize the d_reloc array and comp_unit->data_relocs. Note that the assembler code has one load less in the new version. (This is only true for ELF; PE and Mach-O don't need the indirection in the old version.) * src/comp.c (DATA_RELOC_ADDR_SYM, DATA_RELOC_EPHEMERAL_ADDR_SYM): New symbols. (declare_imported_data_relocs): Create the internal variable and the external function. (declare_imported_data): Supply the symbols for the functions. (find_relocs): New function. (check_comp_unit_relocs, load_comp_unit): Use it instead of a plain dynlib_sym. (ABI_VERSION): Bump version to 13. diff --git a/src/comp.c b/src/comp.c index b2b4fb6f222..80910cb3896 100644 --- a/src/comp.c +++ b/src/comp.c @@ -468,7 +468,7 @@ load_gccjit_if_necessary (bool mandatory) /* Increase this number to force a new Vcomp_abi_hash to be generated. */ -#define ABI_VERSION "12" +#define ABI_VERSION "13" /* Length of the hashes used for eln file naming. */ #define HASH_LENGTH 8 @@ -477,7 +477,9 @@ load_gccjit_if_necessary (bool mandatory) #define CURRENT_THREAD_RELOC_SYM "current_thread_reloc" #define F_SYMBOLS_WITH_POS_ENABLED_RELOC_SYM "f_symbols_with_pos_enabled_reloc" #define DATA_RELOC_SYM "d_reloc" +#define DATA_RELOC_ADDR_SYM "d_reloc_addr" #define DATA_RELOC_EPHEMERAL_SYM "d_reloc_eph" +#define DATA_RELOC_EPHEMERAL_ADDR_SYM "d_reloc_eph_addr" #define FUNC_LINK_TABLE_SYM "freloc_link_table" #define LINK_TABLE_HASH_SYM "freloc_hash" @@ -2850,31 +2852,42 @@ emit_static_object (const char *name, Lisp_Object obj) #pragma GCC diagnostic pop static reloc_array_t -declare_imported_data_relocs (Lisp_Object container, const char *code_symbol, +declare_imported_data_relocs (Lisp_Object container, + const char *code_symbol, + const char *addr_fun_symbol, const char *text_symbol) { /* Imported objects. */ - reloc_array_t res; - res.len = + EMACS_INT len = XFIXNUM (CALLNI (hash-table-count, CALLNI (comp-data-container-idx, container))); Lisp_Object d_reloc = CALLNI (comp-data-container-l, container); d_reloc = Fvconcat (1, &d_reloc); - res.r_val = - gcc_jit_lvalue_as_rvalue ( - gcc_jit_context_new_global ( - comp.ctxt, - NULL, - GCC_JIT_GLOBAL_EXPORTED, - gcc_jit_context_new_array_type (comp.ctxt, - NULL, - comp.lisp_obj_type, - res.len), - code_symbol)); - emit_static_object (text_symbol, d_reloc); + gcc_jit_type *d_reloc_type + = gcc_jit_context_new_array_type (comp.ctxt, NULL, + comp.lisp_obj_type, len); + gcc_jit_lvalue *d_reloc_lval + = gcc_jit_context_new_global (comp.ctxt, NULL, + GCC_JIT_GLOBAL_INTERNAL, + d_reloc_type, code_symbol); + gcc_jit_rvalue *d_reloc_rval + = gcc_jit_lvalue_as_rvalue (d_reloc_lval); + gcc_jit_rvalue *addr_rval + = gcc_jit_lvalue_get_address (d_reloc_lval, NULL); + gcc_jit_type *addr_rval_type = gcc_jit_rvalue_get_type (addr_rval); + gcc_jit_function *get_addr_fun + = gcc_jit_context_new_function (comp.ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + addr_rval_type, addr_fun_symbol, + 0, NULL, false); + gcc_jit_block *block + = gcc_jit_function_new_block (get_addr_fun, NULL); + gcc_jit_block_end_with_return (block, NULL, addr_rval); + + reloc_array_t res = { .len = len, .r_val = d_reloc_rval }; return res; } @@ -2885,10 +2898,12 @@ declare_imported_data (void) comp.data_relocs = declare_imported_data_relocs (CALLNI (comp-ctxt-d-default, Vcomp_ctxt), DATA_RELOC_SYM, + DATA_RELOC_ADDR_SYM, TEXT_DATA_RELOC_SYM); comp.data_relocs_ephemeral = declare_imported_data_relocs (CALLNI (comp-ctxt-d-ephemeral, Vcomp_ctxt), DATA_RELOC_EPHEMERAL_SYM, + DATA_RELOC_EPHEMERAL_ADDR_SYM, TEXT_DATA_RELOC_EPHEMERAL_SYM); } @@ -5170,13 +5185,25 @@ load_static_obj (struct Lisp_Native_Comp_Unit *comp_u, const char *name) } +static Lisp_Object * +find_relocs (dynlib_handle_ptr handle, const char *fun_sym) +{ + Lisp_Object *(*fun) (void) = dynlib_sym (handle, fun_sym); + if (!fun) + return NULL; + return fun (); +} + /* Return false when something is wrong or true otherwise. */ static bool check_comp_unit_relocs (struct Lisp_Native_Comp_Unit *comp_u) { dynlib_handle_ptr handle = comp_u->handle; - Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM); + Lisp_Object *data_relocs + = find_relocs (handle, DATA_RELOC_ADDR_SYM); + if (!data_relocs) + return false; EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec)); @@ -5215,8 +5242,9 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, if (!saved_cu) xsignal1 (Qnative_lisp_file_inconsistent, comp_u->file); comp_u->loaded_once = !NILP (*saved_cu); - Lisp_Object *data_eph_relocs = - dynlib_sym (handle, DATA_RELOC_EPHEMERAL_SYM); + Lisp_Object *data_eph_relocs + = find_relocs (handle, DATA_RELOC_EPHEMERAL_ADDR_SYM); + eassert (data_eph_relocs); /* While resurrecting from an image dump loading more than once the same compilation unit does not make any sense. */ @@ -5254,7 +5282,8 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump, /* Always set data_imp_relocs pointer in the compilation unit (in can be used in 'dump_do_dump_relocation'). */ - comp_u->data_relocs = dynlib_sym (handle, DATA_RELOC_SYM); + comp_u->data_relocs = find_relocs (handle, DATA_RELOC_ADDR_SYM); + eassert (comp_u->data_relocs); if (!comp_u->loaded_once) { commit 6faf3cb68be73090d36cc110d4ab8044a5d8b7f8 Author: Helmut Eller Date: Thu Jul 16 08:28:58 2026 +0200 Improve diff-unified->context Preserve comments in hunk headers (usually a function name). * lisp/vc/diff-mode.el (diff-unified->context): Parse the comment in the hunk header and insert it in the corresponding hunk header in the context diff. (diff-context->unified): Change analogously. * test/lisp/vc/diff-mode-tests.el (diff-mode-tests-undo-unified->context): New test. (diff-mode-tests--context-patch, diff-mode-tests--unified-patch): New variables. diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 0ee055424c8..c27abda1af9 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -1293,7 +1293,7 @@ else cover the whole buffer." (goto-char start) (while (and (re-search-forward (concat "^\\(\\(---\\) .+\n\\(\\+\\+\\+\\) .+\\|" - diff-hunk-header-re-unified ".*\\)$") + diff-hunk-header-re-unified "\\( .*\\)?\\)$") nil t) (< (point) end)) (combine-after-change-calls @@ -1308,13 +1308,14 @@ else cover the whole buffer." (lines1 (or (match-string 5) "1")) (line2 (match-string 6)) (lines2 (or (match-string 7) "1")) + (comment (match-string 8)) ;; Variables to use the special undo function. (old-undo buffer-undo-list) (old-end (marker-position end)) (start (match-beginning 0)) (reversible t)) (replace-match - (concat "***************\n*** " line1 "," + (concat "***************" comment "\n*** " line1 "," (number-to-string (+ (string-to-number line1) (string-to-number lines1) -1)) @@ -1417,7 +1418,7 @@ With a prefix argument, convert unified format to context format." (inhibit-read-only t)) (save-excursion (goto-char start) - (while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}.*\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)\\(?: \\(.*\\)\\|$\\)" nil t) + (while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}\\( .*\\)?\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)$" nil t) (< (point) end)) (combine-after-change-calls (if (match-beginning 2) @@ -1427,15 +1428,14 @@ With a prefix argument, convert unified format to context format." (replace-match "+++" t t nil 3) (replace-match "---" t t nil 2)) ;; we matched a hunk header - (let ((line1s (match-string 4)) - (line1e (match-string 5)) + (let ((comment (match-string 4)) + (line1s (match-string 5)) + (line1e (match-string 6)) (pt1 (match-beginning 0)) ;; Variables to use the special undo function. (old-undo buffer-undo-list) (old-end (marker-position end)) - ;; We currently throw away the comment that can follow - ;; the hunk header. FIXME: Preserve it instead! - (reversible (not (match-end 6)))) + (reversible t)) (replace-match "") (unless (re-search-forward diff-context-mid-hunk-header-re nil t) @@ -1490,7 +1490,8 @@ With a prefix argument, convert unified format to context format." " +" line2s "," (number-to-string (- (string-to-number line2e) (string-to-number line2s) - -1)) " @@")) + -1)) + " @@" (or comment ""))) (set-marker pt2 nil) ;; The whole procedure succeeded, let's replace the myriad ;; of undo elements with just a single special one. diff --git a/test/lisp/vc/diff-mode-tests.el b/test/lisp/vc/diff-mode-tests.el index 36291fee0a5..875f5cf8bfe 100644 --- a/test/lisp/vc/diff-mode-tests.el +++ b/test/lisp/vc/diff-mode-tests.el @@ -792,5 +792,74 @@ index 0000000..3456789 (should (equal call-initial "created.txt")) (should (equal call-mustmatch nil))))))) +(defvar diff-mode-tests--unified-patch + "--- /tmp/a.el 2026-07-14 08:27:52.751202012 +0200 ++++ /tmp/b.el 2026-07-14 08:28:01.087191220 +0200 +@@ -2,7 +2,7 @@ (defun foo () + x + y + z +- a) ++ b) + ;; + ;; + ;; +@@ -19,4 +19,4 @@ (defun bar () + x + y + z +- aa) ++ bb) +") + +(defvar diff-mode-tests--context-patch + "*** /tmp/a.el 2026-07-14 08:27:52.751202012 +0200 +--- /tmp/b.el 2026-07-14 08:28:01.087191220 +0200 +*************** (defun foo () +*** 2,8 **** + x + y + z +! a) + ;; + ;; + ;; +--- 2,8 ---- + x + y + z +! b) + ;; + ;; + ;; +*************** (defun bar () +*** 19,22 **** + x + y + z +! aa) +--- 19,22 ---- + x + y + z +! bb) +") + +(ert-deftest diff-mode-tests-undo-unified->context () + (let* ((unified diff-mode-tests--unified-patch) + (context diff-mode-tests--context-patch) + (b (generate-new-buffer "test.diff"))) + (unwind-protect + (with-current-buffer b + (insert unified) + (diff-mode) + (undo-boundary) + (diff-unified->context (point-min) (point-max)) + (should (equal (buffer-string) context)) + (undo-boundary) + (undo) + (should (equal (buffer-string) unified))) + (kill-buffer b)))) + (provide 'diff-mode-tests) ;;; diff-mode-tests.el ends here commit 76c8065bf63f843f56449f3d3e3cf0b8d2e9e849 Author: Sean Whitton Date: Wed Jul 22 15:40:25 2026 +0100 VC-Annotate menu: Fix inserting "Span NN.NN days" entries * lisp/vc/vc-annotate.el (vc-annotate-mode-menu): Generate entries based on vc-annotate-color-map using a :filter function, instead of using whatever value that variable happened to have at load time. diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el index 83b5185a4b4..9b5c9df210b 100644 --- a/lisp/vc/vc-annotate.el +++ b/lisp/vc/vc-annotate.el @@ -277,22 +277,25 @@ cover the range from the oldest annotation to the newest." (- current newest)) (format "Spanned to %.1f days old" (- current oldest)))))) -;; Menu -- Using easymenu.el (easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map - "VC Annotate Display Menu." + "Menu for VC-Annotate buffers." `("VC-Annotate" + :filter ,(lambda (items) + (let ((o-i-m (vc-annotate-oldest-in-map + (default-value 'vc-annotate-color-map)))) + `(,(car items) + ,@(mapcar (lambda (element) + (let ((days (* element o-i-m))) + `[,(format "Span %.1f days" days) + (vc-annotate-display-select nil ,days) + :style toggle :selected + (eql vc-annotate-display-mode ,days) ])) + vc-annotate-menu-elements) + . ,(cddr items)))) ["By Color Map Range" (unless (null vc-annotate-display-mode) (setq vc-annotate-display-mode nil) (vc-annotate-display-select)) :style toggle :selected (null vc-annotate-display-mode)] - ,@(let ((oldest-in-map (vc-annotate-oldest-in-map vc-annotate-color-map))) - (mapcar (lambda (element) - (let ((days (* element oldest-in-map))) - `[,(format "Span %.1f days" days) - (vc-annotate-display-select nil ,days) - :style toggle :selected - (eql vc-annotate-display-mode ,days) ])) - vc-annotate-menu-elements)) ["Span ..." (vc-annotate-display-select nil (float (string-to-number (read-string "Span how many days? "))))] commit ad2335691079345f1b747ac4d7d1a7c21b467fec Author: Harald Jörg Date: Wed Jul 22 15:02:46 2026 +0200 ;cperl-mode.el: Do not take "=end" as an end of POD Discovered by choroba, reported via GitHub: https://github.com/HaraldJoerg/cperl-mode/issues/28 * lisp/progmodes/cperl-mode.el (cperl-electric-pod, cperl-linefeed, cperl-find-pods-heres): Remove "=end" from regular expressions. "=end" is the end-of-POD indicator in Raku (formerly called Perl6) but not in Perl. diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 91e2e46fdba..22d312d6be1 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -959,7 +959,6 @@ Unless KEEP, removes the old indentation." ("foreachmy" cperl-electric-keyword) ("do" cperl-electric-keyword) ("=pod" cperl-electric-pod) - ("=begin" cperl-electric-pod t) ("=over" cperl-electric-pod) ("=head1" cperl-electric-pod) ("=head2" cperl-electric-pod) @@ -2302,7 +2301,6 @@ to nil." (save-excursion (or (not (re-search-backward "^=" nil t)) (or (looking-at "=cut") - (looking-at "=end") (and cperl-use-syntax-table-text-property (not (eq (get-text-property (point) 'syntax-type) @@ -2378,7 +2376,7 @@ Go to POS which defaults to the current point after processing." (get-text-property (point) 'in-pod) (cperl-after-expr-p nil "{;:") (and (re-search-backward "\\(\\`\n?\\|^\n\\)=\\sw+" (point-min) t) - (not (or (looking-at "\n*=cut") (looking-at "\n*=end"))) + (not (looking-at "\n*=cut")) (or (not cperl-use-syntax-table-text-property) (eq (get-text-property (point) 'syntax-type) 'pod)))))) (progn @@ -2436,7 +2434,6 @@ to nil." beg t))) (save-excursion (or (not (re-search-backward "^=" nil t)) (looking-at "=cut") - (looking-at "=end") (and cperl-use-syntax-table-text-property (not (eq (get-text-property (point) 'syntax-type) @@ -2536,7 +2533,7 @@ If in POD, insert appropriate lines." ;; We are after \n now, so look for the rest (if (looking-at "\\(\\`\n?\\|\n\\)=\\sw+") (progn - (setq cut (looking-at "\\(\\`\n?\\|\n\\)=\\(cut\\|end\\)\\>")) + (setq cut (looking-at "\\(\\`\n?\\|\n\\)=cut\\>")) (setq over (looking-at "\\(\\`\n?\\|\n\\)=over\\>")) t))) (if (and over @@ -4496,7 +4493,7 @@ recursive calls in starting lines of here-documents." state-point b nil nil state) state-point b) (if (or (nth 3 state) (nth 4 state) - (looking-at "\\(cut\\|end\\)\\>")) + (looking-at "cut\\>")) (if (or (nth 3 state) (nth 4 state) ignore-max) nil ; Doing a chunk only (setq warning-message "=cut is not preceded by a POD section") @@ -4509,10 +4506,10 @@ recursive calls in starting lines of here-documents." b1 nil) ; error condition ;; We do not search to max, since we may be called from ;; some hook of fontification, and max is random - (or (re-search-forward "^\n=\\(cut\\|end\\)\\>" stop-point 'toend) + (or (re-search-forward "^\n=cut\\>" stop-point 'toend) (progn (goto-char b) - (if (re-search-forward "\n=\\(cut\\|end\\)\\>" stop-point 'toend) + (if (re-search-forward "\n=cut\\>" stop-point 'toend) (progn (setq warning-message "=cut is not preceded by an empty line") (setq b1 t) commit 7822f2d5ea7e0995db27009717ea16980480e3da Author: Donjuanplatinum Date: Wed Jul 22 00:00:19 2026 +0800 Fix typo in Fmatch_end's doc string * src/search.c (Fmatch_end): Fix "start position" to "end position". (Bug#81447) Copyright-paperwork-exempt: yes diff --git a/src/search.c b/src/search.c index 6d906df1b90..2b721a4367a 100644 --- a/src/search.c +++ b/src/search.c @@ -2801,7 +2801,7 @@ Return value is undefined if the last search failed. */) DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0, doc: /* Return position of end of text matched by last search. SUBEXP, a number, specifies the parenthesized subexpression in the last - regexp for which to return the start position. + regexp for which to return the end position. Value is nil if SUBEXPth subexpression didn't match, or there were fewer than SUBEXP subexpressions. SUBEXP zero means the entire text matched by the whole regexp or whole commit d365328e6d9992d080e0a564d5811dc5e0a5ce4a Author: James Cherti Date: Wed Jun 17 11:37:27 2026 -0400 Fix false positive warnings in 'elisp-flymake-checkdoc' when narrowed * lisp/progmodes/elisp-mode.el (elisp-flymake-checkdoc): Temporarily widen the buffer before calling 'checkdoc-current-buffer'. This prevents checkdoc from reporting missing file-level structural elements when the user has narrowed the buffer. (Bug#81258) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index be98e03d342..c293789cee3 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -2618,11 +2618,12 @@ Calls REPORT-FN directly." (generate-new-buffer " *checkdoc-temp*"))) (unwind-protect (save-excursion - ;; checkdoc-current-buffer can error if there are - ;; unbalanced parens, for example, but this shouldn't - ;; disable the backend (bug#29176). - (ignore-errors - (checkdoc-current-buffer t))) + (without-restriction + ;; checkdoc-current-buffer can error if there are + ;; unbalanced parens, for example, but this shouldn't + ;; disable the backend (bug#29176). + (ignore-errors + (checkdoc-current-buffer t)))) (kill-buffer checkdoc-diagnostic-buffer))) (funcall report-fn (cl-loop for (text start end _unfixable) in commit 58e4dc3c53ab5f685d5077ec6a592e27e141cb08 Author: Aaron L. Zeng Date: Wed Jul 15 15:10:01 2026 -0400 Fix void-function on push-button in goto-address-mode * lisp/net/goto-addr.el (goto-address--button-action): New function (bug#81419). (goto-address-fontify): Use it as the button action. Copyright-paperwork-exempt: yes diff --git a/lisp/net/goto-addr.el b/lisp/net/goto-addr.el index 09166fe1d5b..fccfa4b7438 100644 --- a/lisp/net/goto-addr.el +++ b/lisp/net/goto-addr.el @@ -191,6 +191,7 @@ and `goto-address-fontify-p'." (overlay-put this-overlay 'keymap goto-address-highlight-keymap) (overlay-put this-overlay 'button this-overlay) + (overlay-put this-overlay 'action #'goto-address--button-action) (overlay-put this-overlay 'category 'goto-address) (overlay-put this-overlay 'goto-address t)))) (goto-char (or start (point-min))) @@ -250,6 +251,12 @@ using `browse-url-secondary-browser-function' instead." (browse-url-button-open-url url) (error "No e-mail address or URL found")))))) +(defun goto-address--button-action (button) + "Open the URL represented by BUTTON." + (save-excursion + (goto-char (overlay-start button)) + (goto-address-at-point))) + (defun goto-address-find-address-at-point () "Find e-mail address around or before point. Then search backwards to beginning of line for the start of an e-mail commit 429336b409eb2f6e0350b572426302697e50fec6 Author: Petteri Hintsanen Date: Sun Jul 12 13:15:38 2026 +0300 Fix perl-calculate-indent * lisp/progmodes/perl-mode.el (perl-calculate-indent): Ensure that the value from (nth 3 state) is a character before passing it to char-equal. diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el index 61988d85027..26dfc9e97c8 100644 --- a/lisp/progmodes/perl-mode.el +++ b/lisp/progmodes/perl-mode.el @@ -1021,7 +1021,7 @@ Returns (parse-state) if line starts inside a string." (containing-sexp (nth 1 state)) ;; Don't auto-indent in a quoted string or a here-document. (unindentable (or (nth 3 state) (eq 2 (nth 7 state)))) - (format (and (nth 3 state) + (format (and (characterp (nth 3 state)) (char-equal (nth 3 state) ?\n)))) (when (and (eq t (nth 3 state)) (save-excursion commit fc3ba094015fffb5edc3b026a0316a623ccefdcb Author: Michael Albinus Date: Sun Jul 19 10:35:59 2026 +0200 * admin/notes/documentation: Describe quoting of key names. diff --git a/admin/notes/documentation b/admin/notes/documentation index f6fa321b217..cb69269693c 100644 --- a/admin/notes/documentation +++ b/admin/notes/documentation @@ -145,6 +145,10 @@ This results in clickable Lisp symbols when the NEWS file is visited via follow this rule, like 'TAB' or ':type'. Exception: the symbols t and nil are not quoted. +Key names are embedded in angle brackets like '', except keys that +have a special shorthand syntax: 'NUL', 'RET', 'TAB', 'LFD', 'ESC', +'SPC' and 'DEL'. + Arguments of a function are written in capital letters LIKE-THIS, and they are not quoted. commit ade36467bf5130935e6a83ba916227340a3068c3 Author: Eli Zaretskii Date: Sun Jul 19 09:33:26 2026 +0300 Fix 'url-parse-query-string' * lisp/url/url-util.el (url-parse-query-string): Fix use of 'match-beginning' and 'match-end'. (Bug#81430) diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el index d091092783c..fb70d553768 100644 --- a/lisp/url/url-util.el +++ b/lisp/url/url-util.el @@ -230,10 +230,12 @@ Will not do anything if `url-show-status' is nil." (setq cur (concat cur "="))) (when (string-match "=" cur) - (setq key (url-unhex-string (substring cur 0 (match-beginning 0)) - allow-newlines)) - (setq val (url-unhex-string (substring cur (match-end 0) nil) - allow-newlines)) + (let ((beg (match-beginning 0)) + (end (match-end 0))) + (setq key (url-unhex-string (substring cur 0 beg) + allow-newlines)) + (setq val (url-unhex-string (substring cur end nil) + allow-newlines))) (if downcase (setq key (downcase key))) (setq cur (assoc key retval)) commit 94ee683d63e0f0edcfc29c617b1eb5668183c19b Author: Eshel Yaron Date: Sat Jul 18 15:58:51 2026 +0200 markdown-ts-mode: Fix code-block fontification leak * lisp/textmodes/markdown-ts-mode.el (markdown-ts--fontify-non-ts-collect-faces): Prevent 'font-lock-ensure' from widening and fontifying outside the intended code-block (bug#81412). diff --git a/lisp/textmodes/markdown-ts-mode.el b/lisp/textmodes/markdown-ts-mode.el index a27255ca645..d01b8c09a3c 100644 --- a/lisp/textmodes/markdown-ts-mode.el +++ b/lisp/textmodes/markdown-ts-mode.el @@ -2989,7 +2989,7 @@ content as a standalone markdown document, which is what we want." 'markdown-ts-inhibit-code-block-mode-warnings (delay-mode-hooks (funcall mode))) (narrow-to-region beg end) - (font-lock-ensure) + (let ((font-lock-dont-widen t)) (font-lock-ensure)) (let ((pos (point-min))) (while (< pos (point-max)) (let ((next (next-single-property-change