commit b24ed25b39f346370e1b90eebe86fcacdd4e48e3 Author: Eli Zaretskii Date: Sat Jun 27 06:33:46 2026 -0400 ; Update ldefs-boot.el. diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index b8664c9693d..2f58a8ebc68 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -2561,8 +2561,9 @@ used instead of `browse-url-new-window-flag'. (make-obsolete 'browse-url-mozilla 'nil "29.1") (autoload 'browse-url-firefox "browse-url" "Ask the Firefox WWW browser to load URL. -Defaults to the URL around or before point. Passes the strings -in the variable `browse-url-firefox-arguments' to Firefox. +Defaults to the URL around or before point. Invokes the program +specified by `browse-url-firefox-program'. Passes the strings +in the variable `browse-url-firefox-arguments' to that program. Interactively, if the variable `browse-url-new-window-flag' is non-nil, loads the document in a new Firefox window. A non-nil prefix argument @@ -2578,9 +2579,9 @@ instead of `browse-url-new-window-flag'. (fn URL &optional NEW-WINDOW)" t) (autoload 'browse-url-chromium "browse-url" "Ask the Chromium WWW browser to load URL. -Default to the URL around or before point. The strings in -variable `browse-url-chromium-arguments' are also passed to -Chromium. +Default to the URL around or before point. Invokes the program +specified by `browse-url-chromium-program'. Passes the strings in +variable `browse-url-chromium-arguments' to that program. The optional argument NEW-WINDOW is not used. (fn URL &optional NEW-WINDOW)" t) @@ -6384,6 +6385,15 @@ even if it doesn't match the type.) " (fn VARIABLE VALUE)") +(defvar setopt-local-type-mismatch nil +"Behavior of `setopt-local’ if value's type doesn't match its definition. +If nil, emit a warning, but accept the mismatched value. +If the symbol `accept', ignore type mismatch warning and assign the value. +If the symbol `discard', ignore warning and discard the mismatched value. +If any other non-nil value, prompt whether to accept or discard the value. +Note: Accepting mismatched values may result in unexpected behavior.") +(custom-autoload 'setopt-local-type-mismatch "cus-edit" t) +(put 'setopt-local-type-mismatch 'safe-local-variable #'symbolp) (autoload 'setopt-local "cus-edit" "Set buffer local VARIABLE/VALUE pairs, and return the final VALUE. This is like `setq-local', but is meant for user options instead of @@ -6401,7 +6411,8 @@ Signal an error if a `custom-set' form does not support the (fn [VARIABLE VALUE]...)" nil t) (autoload 'setopt--set-local "cus-edit" -" +"Set a buffer local VARIABLE to VALUE. +Consult `setopt-local-type-mismatch'. (fn VARIABLE VALUE)") (autoload 'customize-save-variable "cus-edit" @@ -8407,6 +8418,38 @@ Linux console, for which Emacs has a reliable way of determining which characters can be displayed and which cannot. (fn &optional REPL FROM TO)" t) +(defvar prettify-special-glyphs-mode nil +"Non-nil if Prettify-Special-Glyphs mode is enabled. +See the `prettify-special-glyphs-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `prettify-special-glyphs-mode'.") +(custom-autoload 'prettify-special-glyphs-mode "disp-table" nil) +(autoload 'prettify-special-glyphs-mode "disp-table" +"Mode to display pretty special character glyphs. + +If you have already customized your special character glyphs, only the +`special-glyphs' face is applied to them. This mode only applies to the +`standard-display-table'. Window or buffer display table, if defined, +still take precedence. + +This is a global minor mode. If called interactively, toggle the +`Prettify-Special-Glyphs mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable the +mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='prettify-special-glyphs-mode)'. + +The mode's hook is called both when the mode is enabled and when it is +disabled. + +(fn &optional ARG)" t) (register-definition-prefixes "disp-table" '("display-table-print-array")) @@ -9962,7 +10005,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. @@ -10332,10 +10375,50 @@ Interactively, prompt for ROLE. Call CALLBACK for each analyzed symbol SYM with arguments ROLE, POS, SYM, ID and DEF, where ROLE is a symbol that specifies the semantics of SYM; POS is the position of SYM in STREAM; ID is an object that uniquely -identifies (co-)occurrences of SYM in the current defun; and DEF is the -position in which SYM is locally defined, or nil. If SYM is itself a -binding occurrence, then POS and DEF are equal. If SYM is not lexically -bound, then DEF is nil. +identifies the local reference of SYM in the current defun, so different +occurrences of SYM get the same ID (up to `equal') if and only if they +refer to the same object; and lastly, DEF is the position in which SYM +is locally defined, or nil. For the occurrence of SYM at the position +where it is locally defined (a.k.a. \"bound\"), the values of POS and +DEF are equal. If SYM is not lexically bound, then DEF is nil and so +is ID. + +CALLBACK should use ID by checking if it is nil or `equal' to other ID +values produced in the same call to this function. The specific value +of a given ID is otherwise meaningless. + +As an example, when this function analyzes the following form + + (lambda (mode) (let ((mode (or mode major-mode))) (symbol-name mode))) + +the CALLBACK function is invoked four times with SYM `mode': + +- Once for the `mode' in the `lambda' arguments list, with ROLE + `binding-variable', some non-nil ID value MODE-ID1, and with POS and + DEF both being the same position POS1 where this `mode' occurs. + +- Another time for the binder in the let form, with ROLE + `binding-variable' some non-nil ID value MODE-ID2 that is not `equal' + to MODE-ID1, and with POS and DEF both being the same position POS2. + +- Another for the first argument of `or', with ROLE `bound-variable' and + ID of MODE-ID1, since this occurrence of `mode' is bound by the + `lambda' argument `mode'. Similarly, DEF is POS1, and POS is now a + different position, POS3. + +- Finally, CALLBACK is also invoked for the `mode' that appears in the + body of `let' as the argument of `symbol-name', with ROLE set to + `bound-variable', ID set to MODE-ID2, and DEF set to POS3. + +In the above example, CALLBACK is also invoked for `lambda', `let', +`or', `major-mode' and `symbol-name'. Since those symbols do not have +local references (they refer to global functions/macros/variables), +CALLBACK gets nil ID and nil DEF. + +Note that if SYM is locally-bound, but has no specific binding position, +then DEF is nil while ID is non-nil. This is the case when SYM is bound +by a binder that is only introduced during macro expansion and does not +appear literally in the analyzed code. If STREAM is nil, it defaults to the current buffer. When reading from the current buffer, this function leaves point at the end of the form. @@ -10565,13 +10648,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: @@ -10579,7 +10666,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. @@ -10678,9 +10765,12 @@ Message buffer where you can explain more about the patch. ;;; Generated autoloads from international/emoji.el -(autoload 'emoji-insert "emoji") -(autoload 'emoji-recent "emoji") -(autoload 'emoji-search "emoji") +(autoload 'emoji-insert "emoji" nil t) +(autoload 'emoji-recent "emoji" nil t) +(autoload 'emoji-search "emoji" +" + +(fn GLYPH DERIVED)" t) (autoload 'emoji-list "emoji" "List Emoji and allow selecting and inserting one of them. If you are displaying Emoji on a text-only terminal, and some @@ -10700,7 +10790,10 @@ If called from Lisp, return the name as a string; return nil if the name is not known. (fn GLYPH &optional INTERACTIVE)" t) -(autoload 'emoji-list-select "emoji") +(autoload 'emoji-list-select "emoji" +" + +(fn EVENT)" '(emoji-list-mode)) (autoload 'emoji--init "emoji" " @@ -11093,7 +11186,7 @@ a single minimum version string. ;;; Generated autoloads from erc/erc.el -(push '(erc 5 6 2 -4) package--builtin-versions) +(push '(erc 5 7 -4) package--builtin-versions) (dolist (symbol '( erc-sasl erc-spelling ; 29 erc-imenu erc-nicks)) ; 30 (custom-add-load symbol symbol)) @@ -11310,7 +11403,7 @@ server name and search for a match in `erc-networks-alist'.") ;;; Generated autoloads from erc/erc-pcomplete.el -(register-definition-prefixes "erc-pcomplete" '("erc-pcomplet" "pcomplete")) +(register-definition-prefixes "erc-pcomplete" '("erc-" "pcomplete")) ;;; Generated autoloads from erc/erc-replace.el @@ -13851,8 +13944,6 @@ evaluate the variable `flymake-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -\\{flymake-mode-map} - (fn &optional ARG)" t) (autoload 'flymake-mode-on "flymake" "Turn Flymake mode on.") @@ -15031,11 +15122,6 @@ supported. (register-definition-prefixes "gnus-cus" '("category-fields" "gnus-")) - -;;; Generated autoloads from gnus/gnus-dbus.el - -(register-definition-prefixes "gnus-dbus" '("gnus-dbus-")) - ;;; Generated autoloads from gnus/gnus-delay.el @@ -20052,7 +20138,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-")) @@ -20427,7 +20513,7 @@ penultimate step during initialization." t) Dotted symbol is any symbol starting with a `.'. This macro creates let-bindings for dotted symbols that appear literally in BODY (whether or not they are actually used). It does not create bindings for dotted -symbols that are introdcued by macro-expansion in BODY. +symbols that are introduced by macro-expansion in BODY. A symbol of the form `.foo.N' where N is a natural number refers to the Nth element of the value that ALIST associates to key `foo'. @@ -20442,7 +20528,7 @@ For instance, the following code essentially expands to - (let ((.title.0 (nth 0 (cdr (assq \\='title alist)))) + (let ((.title.0 (elt (cdr (assq \\='title alist)) 0)) (.body (cdr (assq \\='body alist))) (.site (cdr (assq \\='site alist))) (.site.contents (cdr (assq \\='contents (cdr (assq \\='site alist)))))) @@ -21429,21 +21515,272 @@ for the current invocation. ;;; Generated autoloads from textmodes/markdown-ts-mode.el +(push '(markdown-ts-mode 1 0) package--builtin-versions) (autoload 'markdown-ts-mode "markdown-ts-mode" "Major mode for editing Markdown using tree-sitter grammar. +NOTE: See `markdown-ts--set-up-inline'. In addition to any hooks its parent mode `text-mode' might have run, this mode runs the hook `markdown-ts-mode-hook', as the final or penultimate step during initialization. \\{markdown-ts-mode-map}" t) +(autoload 'markdown-ts-view-mode "markdown-ts-mode" +"Major mode for read-only viewing Markdown using tree-sitter grammar. + +This mode runs the hook `markdown-ts-view-mode-hook', as the final or +penultimate step during initialization. + +\\{markdown-ts-view-mode-map}" t) +(autoload 'markdown-ts-buffer-string "markdown-ts-mode" +"Like `buffer-string', and convert overlay properties to text properties.") (autoload 'markdown-ts-mode-maybe "markdown-ts-mode" -"Enable `markdown-ts-mode' when its grammar is available. -Also propose to install the grammar when `treesit-enabled-modes' +"Enable `markdown-ts-mode' when its grammars are available. +Also propose to install the grammars when `treesit-enabled-modes' is t or contains the mode name.") -(when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-ts-mode-maybe)) (add-to-list 'treesit-major-mode-remap-alist '(markdown-mode . markdown-ts-mode))) +(when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("\\.mdx\\'" . markdown-ts-mode-maybe)) (add-to-list 'treesit-major-mode-remap-alist '(markdown-mode . markdown-ts-mode))) (register-definition-prefixes "markdown-ts-mode" '("markdown-ts-")) + +;;; Generated autoloads from textmodes/markdown-ts-mode-x.el + +(push '(markdown-ts-mode-x 1 0) package--builtin-versions) +(autoload 'markdown-ts-convert-file "markdown-ts-mode-x" +"Convert Markdown INPUT-FILE to FORMAT. +If optional DISPLAY is non-nil, show the output file in a buffer, if +possible, using the function `markdown-ts-convert-display-function'. + +With a prefix argument, DISPLAY will be non-nil. + +Optional FORMAT is a format/converter pair specified as a cons +\\='(format . converter) for example \\='(html . pandoc). See +`markdown-ts-converters'. If nil, prompt for the format and converter. + +If optional OVERWRITE is non-nil, silently overwrite OUTPUT-FILE if it +exists. + +If QUIET is non-nil, inhibit showing conversion warnings or errors. + +The external executable specified by a converter must be installed and +found; see the variable `exec-path'. + +(fn INPUT-FILE &optional FORMAT OUTPUT-FILE DISPLAY OVERWRITE QUIET)" t) +(autoload 'markdown-ts-convert "markdown-ts-mode-x" +"Convert a `markdown-ts-mode' buffer or file to FORMAT. +Convert INPUT-FILE to OUTPUT-FILE. + +If INPUT-FILE is nil, use the current buffer. + +If OUTPUT-FILE is nil, prompt for an output file. + +Optional FORMAT is a format/converter pair specified as a cons +\\='(format . converter) for example \\='(html . pandoc). See +`markdown-ts-converters'. If nil, prompt for the format and converter. + +If optional DISPLAY is non-nil, show the output file in a buffer, if +possible, using the function `markdown-ts-convert-display-function'. + +With a prefix argument, DISPLAY will be non-nil. + +If optional OVERWRITE is non-nil, silently overwrite OUTPUT-FILE if it +exists. + +If QUIET is non-nil, inhibit showing conversion warnings or errors. + +The external executable specified by a converter must be installed and +found; see the variable `exec-path'. + +(fn &optional INPUT-FILE OUTPUT-FILE FORMAT DISPLAY OVERWRITE QUIET)" t) +(autoload 'markdown-ts-toc-update-before-save-mode "markdown-ts-mode-x" +"If enabled, update `markdown-ts-mode' tables of contents before saving. + +This is a minor mode. If called interactively, toggle the +`Markdown-Ts-Toc-Update-Before-Save mode' mode. If the prefix argument +is positive, enable the mode, and if it is zero or negative, disable the +mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate the variable `markdown-ts-toc-update-before-save-mode'. + +The mode's hook is called both when the mode is enabled and when it is +disabled. + +(fn &optional ARG)" t) +(autoload 'markdown-ts-toc-clear-and-remove "markdown-ts-mode-x" +"Remove `markdown-ts-mode' table of contents bodies and templates. +Operate on the active region BEG to END, otherwise operate on the +buffer, which may be narrowed. + +(fn &optional BEG END)" t) +(autoload 'markdown-ts-toc-clear "markdown-ts-mode-x" +"Clear `markdown-ts-mode' table of contents bodies. +Operate on the active region BEG to END, otherwise operate on the +buffer, which may be narrowed. +If optional REMOVE is non-nil, remove tables including their templates. + +(fn &optional BEG END REMOVE)" t) +(autoload 'markdown-ts-toc-insert-template "markdown-ts-mode-x" +"Insert a `markdown-ts-mode` table of contents template at point. + +CHAR is the template type \"b\" for basic, \"c\" for complete. If CHAR +is nil and the command is run interactively, prompt for a template. + +The basic template uses all defaults and is likely the best choice for +most uses. The complete template illustrates all parameters set to +their defaults and is useful as a starting point to customize a table. + +(fn &optional CHAR)" t) +(autoload 'markdown-ts-toc-generate "markdown-ts-mode-x" +"Generate tables of contents in the current buffer. +`markdown-ts-mode' uses Markdown HTML comment elements to identify table +of contents (aka toc) insertion boundaries and the parameters for each +table. Derive table content from the Markdown elements in the current +buffer which are usually headings but can also be list items, setext +headers, named code blocks. + +Operate on the active region BEG to END, otherwise operate on the +buffer, which may be narrowed. + +Each time you run this command, existing tables of contents are cleared +and refreshed with new content. So don't place toc elements around +important text. + +The buffer can have one or more tocs. By default, populate each toc +with elements that appear in the buffer below the toc. Therefore, the +easiest way to insert a complete table of contents, is to put the toc +template near the top of your buffer. + +A basic empty toc template looks like this: + +Header text you want here. + + +Contents inserted between these elements. + + +Footer text you want here. + +Use the command `markdown-ts-toc-insert-template' to insert a table of +contents template. + +Use the command `markdown-ts-toc-clear' to clear table content, and the +command `markdown-ts-toc-clear-and-remove' to both clear and remove +table content and templates. + +By default, a toc includes headers at all levels below the toc which are +presented as list items with links. + +To ignore a Markdown element that would otherwise be included in the +toc, add a toc ignore element: + +## Ignore Me + +The starting toc element accepts parameters in the syntax of Emacs file +variables. + +For example, if you want to generate a table of contents limited to +headings two levels deep: + + + + +Or use only headings two and three levels deep. + + + + +These are the supported parameters which are optional. They each list +their defaults. + + min-depth: 1 ; an integer + max-depth: nil ; an integer + candidates: (heading) ; a list + from: below ; a symbol + style: item ; a symbol + indent: 1 ; a number + no-link: nil ; a boolean + relative-depth: nil ; a boolean + ignore: nil ; a boolean + +`min-depth' and `max-depth' both default to using all candidates at +every level. Use `min-depth' to ignore level 1 headings like \"# +Heading\", by using 2. Use `max-depth' to control how deep into the +heading hierarchy you need your toc to go. Use 3 to stop at level three +headings. + +Headings dictate the level of their children even if headings are +excluded from candidates. Other element types inherit the level of +their preceding heading. + +`candidates' is a list and can contain any of the following Markdown +element shortcut names. You can mix higher-level grouping symbols and +lower level symbols. + + all (includes everything) + heading (includes the below) + h1 h2 h3 h4 h5 h6 + setext (includes the below) + sh1 sh2 + item (includes the below) + minus plus star + numbered-item (includes the below) + dot paren + code (named code blocks) + +`from' controls the direction and scope from which candidates are +selected. Typically, a toc is placed at the beginning of a buffer and +`from' is `below' to capture entry candidates after the toc. If you set +`from' to `above', candidates are selected from above the toc. Use +`all' to capture every entry candidate. This is useful to create a +complete toc at the end of your buffer. + +The `style' parameter can be nil, `item', `number' or `number.'. Under +nil, entries have no decorations. If `item', entries are prefixed with +\"-\". If `bullet', prefix with \"*\". If `number', numeric prefixes +are generated, for example 1, 1.1, 2, 2.1, 2.1.1, 2.1.2. Use `number.' +to add a period to each entry's number. + +`indent' is an integer between 0 and 10. 0 means nothing should be +indented. Otherwise, each entry is indented by the number of spaces of +its Markdown level multiplied by this value. Candidates that have no +native level such as list items inherit the base indentation level of +its preceding header. List item hierarchies and code blocks indent +under that base. + +Set `no-link' to t if you do not want your entries to have header links. +By default, each entry derived from a heading is presented as a link to +its source heading. NOTE: The elements represented by `setext', `item', +`numbered-item', `code' do not support links. + +Use `relative-depth' to create a toc underneath a heading, limiting the +toc to heading depths underneath the preceding header and specify the +levels relative to that header. More concretely, if the preceding +header is a level 1 \"#\" header, `min-depth' 1 and `max-depth' 2 will +be interpreted to be 2 and 3. If you demote the header to level 2 +\"##\" they will be interpreted as 3 and 4. This is useful to avoid +fussing with toc configurations under headers when you change their +levels. + +For example: + + + + +Finally, if `ignore' is t, you can keep a toc element in place and skip +it. + +INTERACTIVE will be non-nil if this command was invoked interactively. + +See `markdown-ts-toc-generate-warn-if-none' to configure warnings about +tables not being processed when this function is called. + +(fn &optional INTERACTIVE BEG END)" t) +(register-definition-prefixes "markdown-ts-mode-x" '("markdown-ts-")) + ;;; Generated autoloads from master.el @@ -23940,7 +24277,7 @@ penultimate step during initialization." t) ;;; Generated autoloads from org/org.el -(push '(org 9 8 3) package--builtin-versions) +(push '(org 9 8 6) package--builtin-versions) (autoload 'org-babel-do-load-languages "org" "Load the languages defined in `org-babel-load-languages'. @@ -24701,6 +25038,17 @@ The arguments are the same as in `outline-search-text-property', except the hard-coded property name `outline-level'. This function is intended to be used in `outline-search-function'. +(fn &optional BOUND MOVE BACKWARD LOOKING-AT)") +(autoload 'outline-search-from-regexp "outline" +"Search for the next heading matching `outline-regexp'. +The arguments BOUND, MOVE, BACKWARD, and LOOKING-AT are described +in `outline-search-function'. This function is intended to be +used in `outline-search-function' by modes and minor modes that +customize `outline-regexp' but do not need a custom search strategy. +Install it with + + (setq-local outline-search-function #\\='outline-search-from-regexp) + (fn &optional BOUND MOVE BACKWARD LOOKING-AT)") (register-definition-prefixes "outline" '("outline-")) @@ -25081,9 +25429,9 @@ DESC must be a `package-desc' object. "List of the names of currently activated packages.") (defvar package--activated nil "Non-nil if `package-activate-all' has been run.") -(defun package-activate-all nil +(autoload 'package-activate-all "package-activate" "Activate all installed packages. -The variable `package-load-list' controls which packages to load." (setq package--activated t) (let* ((elc (concat package-quickstart-file "c")) (qs (if (file-readable-p elc) elc (if (file-readable-p package-quickstart-file) package-quickstart-file)))) (or (and qs (not (bound-and-true-p package-activated-list)) (with-demoted-errors "Error during quickstart: %S" (let ((load-source-file-function nil)) (unless (boundp 'package-activated-list) (setq package-activated-list nil)) (load qs nil 'nomessage) t))) (progn (require 'package) (with-no-warnings (package--activate-all)))))) +The variable `package-load-list' controls which packages to load.") (autoload 'package-installed-p "package-activate" "Return non-nil if PACKAGE, of MIN-VERSION or newer, is installed. If PACKAGE is a symbol, it is the package name and MIN-VERSION @@ -25396,10 +25744,9 @@ Emacs Lisp manual for more information and examples. (autoload 'pcase--make-docstring "pcase") (autoload 'pcase-exhaustive "pcase" "The exhaustive version of `pcase' (which see). -If EXP fails to match any of the patterns in CASES, an error is -signaled. +If EXP fails to match any of the patterns in CASES, signal an error. -In contrast, `pcase' will return nil if there is no match, but +In contrast, `pcase' will return nil if there is no match, but will not signal an error. (fn EXP &rest CASES)" nil t) @@ -28077,8 +28424,6 @@ evaluate the variable `rectangle-mark-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -\\{rectangle-mark-mode-map} - (fn &optional ARG)" t) (register-definition-prefixes "rect" '("apply-on-rectangle" "clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" "rectangle-" "spaces-string" "string-rectangle-")) @@ -29905,6 +30250,8 @@ ITEMS list is also populated by the resolved handler, but can be explicitly overridden. (fn &optional ITEMS)" t) +(autoload 'send-to--resolve-handler "send-to" +"Return first supported handler from `send-to-handlers'.") (register-definition-prefixes "send-to" '("send-to-")) @@ -32326,6 +32673,10 @@ as the new values of the bound variables in the recursive invocation. This construct can only be used with lexical binding. (fn NAME BINDINGS &rest BODY)" nil t) +(autoload 'work-buffer--release "subr-x" +"Release work BUFFER. + +(fn BUFFER)") (autoload 'with-work-buffer "subr-x" "Create a work buffer, and evaluate BODY there like `progn'. Like `with-temp-buffer', but reuse an already created temporary @@ -33565,6 +33916,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) @@ -34358,7 +34710,7 @@ If DATE is malformed, return a time value of zero. (fn DATE)") (autoload 'format-seconds "time-date" -"Use format control STRING to format the number SECONDS. +"Use format control STRING to format the time value SECONDS. The valid format specifiers are: %y is the number of (365-day) years. %d is the number of days. @@ -34560,7 +34912,7 @@ relative only to the time worked today, and not to past time. ;;; Generated autoloads from emacs-lisp/timeout.el -(push '(timeout 2 1) package--builtin-versions) +(push '(timeout 2 1 6) package--builtin-versions) (autoload 'timeout-debounce "timeout" "Debounce FUNC by making it run DELAY seconds after it is called. @@ -35192,13 +35544,13 @@ 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) package--builtin-versions) (register-definition-prefixes "trampver" '("tramp-")) ;;; Generated autoloads from transient.el -(push '(transient 0 13 0) package--builtin-versions) +(push '(transient 0 13 3) package--builtin-versions) (autoload 'transient-insert-suffix "transient" "Insert a SUFFIX into PREFIX before LOC. PREFIX is a prefix command, a symbol. @@ -36662,6 +37014,11 @@ If FILE-NAME is non-nil, save the result to FILE-NAME. (fn START END &optional FILE-NAME)") (register-definition-prefixes "uudecode" '("uudecode-")) + +;;; Generated autoloads from emacs-lisp/uuid.el + +(register-definition-prefixes "uuid" '("uuid-")) + ;;; Generated autoloads from vc/vc.el @@ -37899,7 +38256,7 @@ step during initialization." t) ;;; Generated autoloads from progmodes/verilog-mode.el -(push '(verilog-mode 2026 1 18 88738971) package--builtin-versions) +(push '(verilog-mode 2026 4 14 10117132) package--builtin-versions) (autoload 'verilog-mode "verilog-mode" "Major mode for editing Verilog code. \\ @@ -40211,8 +40568,10 @@ selected window. (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 e53f0b474977f3a7fbfe61a190b37e5b6da4c41e Merge: 4724964ad24 b365ef37b9b Author: Eli Zaretskii Date: Sat Jun 27 06:28:26 2026 -0400 Merge from origin/emacs-31 b365ef37b9b Fix pixels-vs-columns confusion in margin face fill (bug#... e0185b09076 Fix ISO date insertion in diary 3c9517300e9 ; Tag process-test-stderr-filter :unstable on emba 422bf368477 Minor fix for 'format-mode-line' 13814795727 Improve the previous fix in toggle-window-dedicated commit 4724964ad24294ad1637d6a3e9baf8c053adb694 Merge: b1dce84c0b8 f2c4c1029d7 Author: Eli Zaretskii Date: Sat Jun 27 06:28:26 2026 -0400 ; Merge from origin/emacs-31 The following commit was skipped: f2c4c1029d7 VC-Dir: Fix removing empty directory entries commit b1dce84c0b89063101d62e7316fcf854cecfe3c7 Merge: 6f6a33629e1 5d15b4522b7 Author: Eli Zaretskii Date: Sat Jun 27 06:28:26 2026 -0400 Merge from origin/emacs-31 5d15b4522b7 Fix interactive spec of some commands bound on the mode line commit 6f6a33629e1a5b1c3272dd8a2b1480206dff44ee Merge: fd969ace830 e050c74581c Author: Eli Zaretskii Date: Sat Jun 27 06:28:26 2026 -0400 ; Merge from origin/emacs-31 The following commit was skipped: e050c74581c vc-dir--count-outgoing: Bind enable-local-variables commit fd969ace830e4dedff4011d1ba84e766857632e5 Merge: 6ef0e6ba1a7 e486f2d975a Author: Eli Zaretskii Date: Sat Jun 27 06:28:20 2026 -0400 Merge from origin/emacs-31 e486f2d975a Support tramp-rpc in filenotify-tests.el f6a244333dd ; * etc/NEWS: Presentational fixes and improvements. c19e9ddd486 ; Improve documentation of 'emacs-lock' features 749ce42049b CC Mode: Set parse-sexp-lookup-properties for every mode def15c1b973 Disable DMABUF and Compositing for xwidget 2c5b4911b39 ; * doc/lispref/commands.texi (Interactive Codes): More e... ea87a99b843 ; Fix recent improvements in docs of splitting and mergin... 0ec6a3fd44d Fix failure code in 'run-hook-query-error-with-timeout' 72b8d88171a Use default-value in project--value-in-dir b34952ee947 etags-regen--maybe-generate: No error when no project found 30fc250a262 ; * doc/lispref/frames.texi (Deleting Frames): Fix typo i... 8679bdf0819 Mark ChangeLog entry as tiny change 070a3a356fc VC revert: When un-adding, clear vc-backend property c8a86c15610 ; make change-history-commit 884d7a198c9 Document new option 'delete-frame-choose-selected' (Bug#8... f0bfa330394 Document 'split-frame' and 'merge-frames' in Elisp manual 0d67e76b94e Eglot: release version 1.24 f52457d17ef Jsonrpc: release version 1.0.29 4f6b6f462c1 jsonrpc-shutdown: Ensure we wait whole timeout & increase... # Conflicts: # etc/NEWS commit b365ef37b9b4b6810a1b13f0f8aebe7908e00b63 Author: Andrea Alberti Date: Thu Jun 25 12:05:03 2026 +0200 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. diff --git a/src/xdisp.c b/src/xdisp.c index 2f02d9faa76..a88f7ce830a 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -24463,11 +24463,10 @@ extend_face_to_end_of_line (struct it *it) to fill the rest. */ if (WINDOW_LEFT_MARGIN_WIDTH (it->w) > 0 && (it->glyph_row->used[LEFT_MARGIN_AREA] - < WINDOW_LEFT_MARGIN_WIDTH (it->w))) + < WINDOW_LEFT_MARGIN_COLS (it->w))) { int used = it->glyph_row->used[LEFT_MARGIN_AREA]; - int remaining_pixels = (WINDOW_LEFT_MARGIN_WIDTH (it->w) - * FRAME_COLUMN_WIDTH (f)); + int remaining_pixels = WINDOW_LEFT_MARGIN_WIDTH (it->w); /* Subtract width of existing glyphs. */ struct glyph *g = it->glyph_row->glyphs[LEFT_MARGIN_AREA]; @@ -24502,11 +24501,10 @@ extend_face_to_end_of_line (struct it *it) to fill the rest. */ if (WINDOW_RIGHT_MARGIN_WIDTH (it->w) > 0 && (it->glyph_row->used[RIGHT_MARGIN_AREA] - < WINDOW_RIGHT_MARGIN_WIDTH (it->w))) + < WINDOW_RIGHT_MARGIN_COLS (it->w))) { int used = it->glyph_row->used[RIGHT_MARGIN_AREA]; - int remaining_pixels = (WINDOW_RIGHT_MARGIN_WIDTH (it->w) - * FRAME_COLUMN_WIDTH (f)); + int remaining_pixels = WINDOW_RIGHT_MARGIN_WIDTH (it->w); /* Subtract width of existing glyphs. */ struct glyph *g = it->glyph_row->glyphs[RIGHT_MARGIN_AREA]; commit e0185b09076272c6f45b06191d2df374a94f15bf Author: Richard Lawrence Date: Thu Jun 25 10:42:17 2026 +0200 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. diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el index b4390fd2191..e20c8ae95ec 100644 --- a/lisp/calendar/calendar.el +++ b/lisp/calendar/calendar.el @@ -918,7 +918,9 @@ including those inserted into the diary from the calendar with (defconst diary-european-date-insertion-form '(day "/" month "/" year) "Pseudo-pattern for European dates in `diary-date-insertion-form'") -(defconst diary-iso-date-insertion-form '(year "/" month "/" day) +(defconst diary-iso-date-insertion-form '((format "%s-%.2d-%.2d" year + (string-to-number month) + (string-to-number day))) "Pseudo-pattern for ISO dates in `diary-date-insertion-form'") (defcustom diary-date-insertion-form diff --git a/test/lisp/calendar/diary-icalendar-resources/import-bug-11473.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-bug-11473.diary-iso index 0e3a3fb8715..5b9a9ecc723 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-bug-11473.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-bug-11473.diary-iso @@ -1,4 +1,4 @@ -&2012/5/15 15:00-15:30 Query +&2012-05-15 15:00-15:30 Query Location: phone Status: confirmed Organizer: A. Luser diff --git a/test/lisp/calendar/diary-icalendar-resources/import-bug-22092.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-bug-22092.diary-iso index 9c45f848e76..08a84deb6a7 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-bug-22092.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-bug-22092.diary-iso @@ -1,4 +1,4 @@ -&2014/12/8 18:30-22:55 Norwegian til Tromsoe-Langnes - +&2014-12-08 18:30-22:55 Norwegian til Tromsoe-Langnes - Location: Stavanger-Sola Category: Appointment Access: public diff --git a/test/lisp/calendar/diary-icalendar-resources/import-bug-33277.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-bug-33277.diary-iso index faa7aeafeb5..8c05b0aaafb 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-bug-33277.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-bug-33277.diary-iso @@ -1 +1 @@ -&2018/11/5 21:00 event with same start/end time +&2018-11-05 21:00 event with same start/end time diff --git a/test/lisp/calendar/diary-icalendar-resources/import-legacy-vars.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-legacy-vars.diary-iso index f6d69805c19..dd0b4cef8bf 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-legacy-vars.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-legacy-vars.diary-iso @@ -1,4 +1,4 @@ -2025/9/19 09:00-11:30 Testing legacy `icalendar-import-format*' vars +2025-09-19 09:00-11:30 Testing legacy `icalendar-import-format*' vars CLASS=private DESCRIPTION=described LOCATION=somewhere diff --git a/test/lisp/calendar/diary-icalendar-resources/import-multiple-vcalendars.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-multiple-vcalendars.diary-iso index bbe009c200e..3b3ba5fe780 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-multiple-vcalendars.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-multiple-vcalendars.diary-iso @@ -1,7 +1,7 @@ -&2011/7/23 event-1 +&2011-07-23 event-1 -&2011/7/24 event-2 +&2011-07-24 event-2 -&2011/7/25 event-3a +&2011-07-25 event-3a -&2011/7/25 event-3b +&2011-07-25 event-3b diff --git a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-1.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-1.diary-iso index c7311286619..64c6092b487 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-1.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-1.diary-iso @@ -1 +1 @@ -&2003/9/19 09:00-11:30 non-recurring +&2003-09-19 09:00-11:30 non-recurring diff --git a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-all-day.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-all-day.diary-iso index f1c70ab34c3..016388887fd 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-all-day.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-all-day.diary-iso @@ -1 +1 @@ -&2003/9/19 non-recurring allday +&2003-09-19 non-recurring allday diff --git a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-another-example.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-another-example.diary-iso index d663965404b..32488eb55a7 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-another-example.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-another-example.diary-iso @@ -1,4 +1,4 @@ -&2004/11/23 14:45-15:45 another example +&2004-11-23 14:45-15:45 another example Status: tentative Access: private UID: 6161a312-3902-11d9-b512-f764153bb28b diff --git a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-folded-summary.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-folded-summary.diary-iso index 699358dc504..09e57dbf4a3 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-folded-summary.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-folded-summary.diary-iso @@ -1,4 +1,4 @@ -&2004/11/23 14:00-14:30 folded summary +&2004-11-23 14:00-14:30 folded summary Status: tentative Access: private UID: 04979712-3902-11d9-93dd-8f9f4afe08da diff --git a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-long-summary.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-long-summary.diary-iso index d2300522d9a..c0c5c845378 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-long-summary.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-non-recurring-long-summary.diary-iso @@ -1 +1 @@ -&2003/9/19 long summary +&2003-09-19 long summary diff --git a/test/lisp/calendar/diary-icalendar-resources/import-time-format-12hr-blank.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-time-format-12hr-blank.diary-iso index 0945cfc0b60..491faa3b214 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-time-format-12hr-blank.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-time-format-12hr-blank.diary-iso @@ -1 +1 @@ -&2003/9/19 9.00h-11.30h 12hr blank-padded +&2003-09-19 9.00h-11.30h 12hr blank-padded diff --git a/test/lisp/calendar/diary-icalendar-resources/import-with-attachment.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-with-attachment.diary-iso index b16022908d9..a77ce8fa6ea 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-with-attachment.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-with-attachment.diary-iso @@ -1,3 +1,3 @@ -&2003/9/19 09:00 Has an attachment +&2003-09-19 09:00 Has an attachment Attachment: R3Jl.plain UID: f9fee9a0-1231-4984-9078-f1357db352db diff --git a/test/lisp/calendar/diary-icalendar-resources/import-with-timezone.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-with-timezone.diary-iso index 56f91066f73..74c486f2e93 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-with-timezone.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-with-timezone.diary-iso @@ -1,3 +1,3 @@ -&2012/1/15 15:00-15:30 standardtime +&2012-01-15 15:00-15:30 standardtime -&2012/12/15 11:00-11:30 daylightsavingtime +&2012-12-15 11:00-11:30 daylightsavingtime diff --git a/test/lisp/calendar/diary-icalendar-resources/import-with-uid.diary-iso b/test/lisp/calendar/diary-icalendar-resources/import-with-uid.diary-iso index d372e5a3d1f..04548294a65 100644 --- a/test/lisp/calendar/diary-icalendar-resources/import-with-uid.diary-iso +++ b/test/lisp/calendar/diary-icalendar-resources/import-with-uid.diary-iso @@ -1,2 +1,2 @@ -&2003/9/19 09:00-11:30 non-recurring +&2003-09-19 09:00-11:30 non-recurring UID: 1234567890uid commit 6ef0e6ba1a78aa0c61a5a97d954a33ff4cadc049 Author: Lin Sun Date: Wed Jun 24 06:02:33 2026 +0000 Send systemd notification after 'kill-emacs-hook' * src/emacs.c (kill-emacs): Send systemd STOPPING notification only after calling 'kill-emacs-hook', because that hook could prevent Emacs from exiting. (Bug#81296) diff --git a/src/emacs.c b/src/emacs.c index 3a9c7458e49..703ceec1045 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -2998,13 +2998,6 @@ killed. */ } #endif -#ifdef HAVE_LIBSYSTEMD - /* Notify systemd we are shutting down, but only if we have notified - it about startup. */ - if (daemon_type == -1) - sd_notify(0, "STOPPING=1"); -#endif /* HAVE_LIBSYSTEMD */ - /* Fsignal calls emacs_abort () if it sees that waiting_for_input is set. */ waiting_for_input = 0; @@ -3016,6 +3009,13 @@ killed. */ calln (Qrun_hook_query_error_with_timeout, Qkill_emacs_hook); } +#ifdef HAVE_LIBSYSTEMD + /* Notify systemd we are shutting down, but only if we have notified + it about startup. */ + if (daemon_type == -1) + sd_notify (0, "STOPPING=1"); +#endif /* HAVE_LIBSYSTEMD */ + #ifdef HAVE_X_WINDOWS /* Transfer any clipboards we own to the clipboard manager. */ x_clipboard_manager_save_all (); commit a57a3fd1abcbc90aa263641bb4ad74e38027a224 Author: James Cherti Date: Wed Jun 17 11:08:02 2026 -0400 Set 'tab-width' to 2 in 'yaml-ts-mode' * lisp/textmodes/yaml-ts-mode.el (yaml-ts-mode): Set 'tab-width' to 2 locally, as YAML conventionally uses 2 space indentation. (Bug#81257) diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el index 5afd4d2d111..37925f69782 100644 --- a/lisp/textmodes/yaml-ts-mode.el +++ b/lisp/textmodes/yaml-ts-mode.el @@ -274,6 +274,7 @@ Calls REPORT-FN directly." ;; Indentation. (setq-local indent-tabs-mode nil) + (setq-local tab-width 2) ;; Font-lock. (setq-local treesit-font-lock-settings yaml-ts-mode--font-lock-settings) commit 3c9517300e9e0f0b4f84a29c69dd92aec059224e Author: Michael Albinus Date: Sat Jun 27 09:17:47 2026 +0200 ; Tag process-test-stderr-filter :unstable on emba * test/src/process-tests.el (process-test-stderr-filter): Tag it :unstable on emba. diff --git a/test/src/process-tests.el b/test/src/process-tests.el index ad6cb924943..025fba97bec 100644 --- a/test/src/process-tests.el +++ b/test/src/process-tests.el @@ -113,6 +113,7 @@ process to complete." (looking-at "hello stderr!")))))) (ert-deftest process-test-stderr-filter () + :tags (if (getenv "EMACS_EMBA_CI") '(:unstable)) (skip-unless (executable-find "bash")) (with-timeout (60 (ert-fail "Test timed out")) (let* ((stderr-sentinel-called nil) commit 422bf368477921a91000f72e759894acd1e4acd3 Author: Eli Zaretskii Date: Sat Jun 27 09:46:39 2026 +0300 Minor fix for 'format-mode-line' * src/xdisp.c (Fformat_mode_line): Treat 'default' exactly like nil. (Bug#81307) diff --git a/src/xdisp.c b/src/xdisp.c index 5080c5253a4..2f02d9faa76 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -29040,6 +29040,8 @@ are the selected window and the WINDOW's buffer). */) face = EQ (window, selected_window) ? Qmode_line_active : Qmode_line_inactive; + else if (EQ (face, Qdefault)) + face = Qnil; old_buffer = current_buffer; commit 13814795727e1ca23db6b70b83b459bbfbaa5579 Author: Juri Linkov Date: Fri Jun 26 18:37:07 2026 +0300 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). diff --git a/lisp/window.el b/lisp/window.el index 5f00801d55c..35b49a19a5e 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -7993,7 +7993,13 @@ variable to t, strong dedication will be used by default and \\[universal-argument] will make the window weakly dedicated. See the info node `(elisp)Dedicated Windows' for more details." - (interactive "@i\nP\np") + (interactive "i\nP\np") + + (when (and (not window) (mouse-event-p last-input-event)) + (let ((event-window (posn-window (event-start last-input-event)))) + (unless (eq (selected-window) event-window) + (setq window event-window)))) + (setq window (window-normalize-window window)) (setq flag (cond ((consp flag) commit f2c4c1029d7a1723f3e997a65085426aa768c47a Author: Sean Whitton Date: Thu Jun 25 18:25:20 2026 +0100 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. diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index 687968d5d24..df3bbd14b66 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1520,7 +1520,19 @@ specific headers." 'up-to-date)) (setf (vc-dir-fileinfo->state info) nil)) - (not (vc-dir-fileinfo->needs-update info)))))))))))) + (not (vc-dir-fileinfo->needs-update info)))) + ;; One more pass to remove directory entries with no children. + (let ((inhibit-read-only t) + (crt (ewoc-nth vc-ewoc -1)) + (first (ewoc-nth vc-ewoc 0))) + (while (not (eq crt first)) + (let ((prev (ewoc-prev vc-ewoc crt))) + (when (and (vc-dir-fileinfo->directory (ewoc-data crt)) + (let ((next (ewoc-next vc-ewoc crt))) + (or (null next) + (vc-dir-fileinfo->directory (ewoc-data next))))) + (ewoc-delete vc-ewoc crt)) + (setq crt prev)))))))))))) (defun vc-dir-revert-buffer-function (&optional _ignore-auto _noconfirm) (vc-dir-refresh) commit 5d15b4522b73b4cff099606cbdf820a60f7e3808 Author: Juri Linkov Date: Thu Jun 25 18:47:39 2026 +0300 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. diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index 5a550b33016..be98e03d342 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -694,7 +694,7 @@ happens in interactive invocations. When calling from Lisp, use nil or a positive number as the value of INTERACTIVE to enable `lexical-binding', a negative number to disable it." - (interactive "p") + (interactive "@p") (let* ((disable-lexbind (or (and (numberp interactive) (< interactive 0)) (if current-prefix-arg t))) diff --git a/lisp/window.el b/lisp/window.el index 601a2b18fe3..5f00801d55c 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -7993,7 +7993,7 @@ variable to t, strong dedication will be used by default and \\[universal-argument] will make the window weakly dedicated. See the info node `(elisp)Dedicated Windows' for more details." - (interactive "i\nP\np") + (interactive "@i\nP\np") (setq window (window-normalize-window window)) (setq flag (cond ((consp flag) @@ -8012,8 +8012,9 @@ See the info node `(elisp)Dedicated Windows' for more details." ((null status) "no longer") ((eq status t) "now strongly") (t "now"))) - (current-buffer)) - (force-mode-line-update))) + (window-buffer window)) + (with-current-buffer (window-buffer window) + (force-mode-line-update)))) (defconst display-buffer--action-function-custom-type '(choice :tag "Function" commit e050c74581cdb13315482d40e1aca3ac0bfc4ff4 Author: Sean Whitton Date: Thu Jun 25 14:12:48 2026 +0100 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. diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index 5408a89799e..687968d5d24 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1433,7 +1433,13 @@ therefore also disable the fetching." (defun vc-dir--count-outgoing (backend) "Call `vc--count-outgoing' with a delayed message and local quits." - (let ((inhibit-quit t)) + (let ((inhibit-quit t) + ;; Hack for bug#81233 for the Emacs 30 release. + (enable-local-variables + (if (memq enable-local-variables '(:safe :all nil)) + enable-local-variables + ;; Ignore other values that query. + :safe))) (prog1 (with-local-quit (with-delayed-message commit e486f2d975a360062a23878ea9a1ab4c08081e30 Author: Michael Albinus Date: Thu Jun 25 11:42:56 2026 +0200 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. diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el index fc826aba8d4..798253aeb0c 100644 --- a/test/lisp/filenotify-tests.el +++ b/test/lisp/filenotify-tests.el @@ -37,7 +37,7 @@ ;; a respective command. The first command found is used. In order to ;; use a dedicated one, the environment variable ;; $REMOTE_FILE_NOTIFY_LIBRARY shall be set, possible values are -;; "inotifywait", "gio", and "smb-notify". +;; "inotifywait", "gio", "smb-notify" and "tramp-rpc". ;; Local file-notify libraries are auto-detected during Emacs ;; configuration. This can be changed with a respective configuration @@ -60,7 +60,7 @@ ;; Filter suppressed remote file-notify libraries. (when (stringp (getenv "REMOTE_FILE_NOTIFY_LIBRARY")) - (dolist (lib '("inotifywait" "gio" "smb-notify")) + (dolist (lib '("inotifywait" "gio" "smb-notify" "tramp-rpc")) (unless (string-equal (getenv "REMOTE_FILE_NOTIFY_LIBRARY") lib) (add-to-list 'tramp-connection-properties `(nil ,lib nil))))) @@ -255,11 +255,16 @@ must be a valid watch descriptor." ;; - GKqueueFileMonitor (gfilenotify and gio on FreeBSD) ;; - GPollFileMonitor (gio on cygwin) ;; - SMBSamba (smb-notify on Samba server) - ;; - SMBWindows (smb-notify on MS Windows). + ;; - SMBWindows (smb-notify on MS Windows) + ;; - TrampRPCinotify (tramp-rpc on GNU/Linux) + ;; - TrampRPCkqueue (tramp-rpc on FreeBSD) + ;; - TrampRPCfsevent (tramp-rpc on macOS) + ;; - TrampRPCpoll (tramp-rpc). (if file-notify--test-desc (or (alist-get file-notify--test-desc file-notify--test-monitors) (when (member - (file-notify--test-library) '("gfilenotify" "gio" "smb-notify")) + (file-notify--test-library) + '("gfilenotify" "gio" "smb-notify" "tramp-rpc")) (add-to-list 'file-notify--test-monitors (cons file-notify--test-desc @@ -884,18 +889,15 @@ delivered." '(GFamFileMonitor GFamDirectoryMonitor GKqueueFileMonitor GPollFileMonitor)) '()) - ;; For GInotifyFileMonitor, `write-region' raises also an - ;; `attribute-changed' event on gio. - ((and (string-equal (file-notify--test-library) "gio") - (eq (file-notify--test-monitor) 'GInotifyFileMonitor)) - '(attribute-changed attribute-changed attribute-changed)) - ;; For kqueue, `write-region' raises also an `attribute-changed' - ;; event. - ((string-equal (file-notify--test-library) "kqueue") - '(attribute-changed attribute-changed attribute-changed)) - ;; For inotifywait, `write-region' raises also an + ;; For kqueue, inotifywait, GInotifyFileMonitor and + ;; TrampRPCinotify, `write-region' raises also an ;; `attribute-changed' event. - ((string-equal (file-notify--test-library) "inotifywait") + ((or (string-equal (file-notify--test-library) "kqueue") + (string-equal (file-notify--test-library) "inotifywait") + (and (string-equal (file-notify--test-library) "gio") + (eq (file-notify--test-monitor) 'GInotifyFileMonitor)) + (and (string-equal (file-notify--test-library) "tramp-rpc") + (eq (file-notify--test-monitor) 'TrampRPCinotify))) '(attribute-changed attribute-changed attribute-changed)) (t '(attribute-changed attribute-changed))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) @@ -1177,10 +1179,10 @@ delivered." file-notify--test-tmpdir '(change) #'file-notify--test-event-handler))) (let ((file-notify-debug ;; Temporarily. - (or file-notify-debug - (and (getenv "EMACS_EMBA_CI") - (string-equal (file-notify--test-library) "gio") - (eq (file-notify--test-monitor) 'GInotifyFileMonitor)))) + (or file-notify-debug + (and (getenv "EMACS_EMBA_CI") + (string-equal (file-notify--test-library) "gio") + (eq (file-notify--test-monitor) 'GInotifyFileMonitor)))) (n 10);00) source-file-list target-file-list (default-directory file-notify--test-tmpdir)) @@ -1680,6 +1682,10 @@ the file watch." ((or "inotify" "inotifywait") '(unmount isdir)) ((or "gfilenotify" "gio") '(unmounted)) ("kqueue" '(revoke)) + ("tramp-rpc" + (pcase (file-notify--test-monitor) + ('TrampRPCinotify '(unmount isdir)) + (err (ert-fail (format "Monitor %s not supported" err))))) (err (ert-fail (format "Library %s not supported" err)))) (pcase (file-notify--test-library) ("kqueue" (file-local-name file-notify--test-tmpfile)) @@ -1692,7 +1698,7 @@ the file watch." ("inotify" #'file-notify--callback-inotify) ("gfilenotify" #'file-notify--callback-gfilenotify) ("kqueue" #'file-notify--callback-kqueue) - ((or "inotifywait" "gio") #'file-notify-callback) + ((or "inotifywait" "gio" "tramp-rpc") #'file-notify-callback) (err (ert-fail (format "Library %s not supported" err))))))) ;; The watch has been stopped. commit f6a244333ddcfa13d2467f343790f6a9e4f7bee4 Author: Michael Albinus Date: Thu Jun 25 11:42:04 2026 +0200 ; * etc/NEWS: Presentational fixes and improvements. diff --git a/etc/NEWS b/etc/NEWS index 11128422af9..8e7d035bf84 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2587,7 +2587,7 @@ one as before. This makes them different from 'vc-diff' and 'vc-root-diff' when those are called without a prefix argument. *** 'diff-apply-hunk' now supports creating and deleting files. -diff-apply-buffer supports creating files but not deleting them, yet. +'diff-apply-buffer' supports creating files but not deleting them, yet. +++ *** Diff mode's application and killing commands now consider the region. commit c19e9ddd486afa0c93079233373c96da50272af9 Author: Eli Zaretskii Date: Thu Jun 25 11:26:27 2026 +0300 ; Improve documentation of 'emacs-lock' features * lisp/emacs-lock.el (emacs-lock-unlockable-modes) (emacs-lock-locked-buffer-functions, emacs-lock-mode) (emacs-lock--can-auto-unlock, emacs-lock--kill-emacs-hook) (emacs-lock--kill-emacs-query-functions) (emacs-lock--kill-buffer-query-functions, emacs-lock-mode) (emacs-lock-unload-function): Doc fixes. diff --git a/lisp/emacs-lock.el b/lisp/emacs-lock.el index ec71fa2c713..c28b9d7bd52 100644 --- a/lisp/emacs-lock.el +++ b/lisp/emacs-lock.el @@ -62,13 +62,13 @@ Possible values are: ;; the old emacs-lock.el. (defcustom emacs-lock-unlockable-modes '((shell-mode . all) (telnet-mode . all)) - "Alist of auto-unlockable modes. + "Alist of major modes whose buffers can be automatically unlocked. Each element is a pair (MAJOR-MODE . ACTION), where ACTION is one of `kill', `exit' or `all'. Buffers with matching major -modes are auto-unlocked for the specific action if their -inferior processes are not alive. If this variable is t, all -buffers associated to inferior processes are auto-unlockable -for both actions (NOT RECOMMENDED)." +modes that have `emacs-lock-mode' turned on can be auto-unlocked +for the specific action if their inferior processes are not alive. +If this variable is t, all buffers associated with inferior processes +are auto-unlockable for all actions (NOT RECOMMENDED)." :type '(choice (const :tag "All buffers with inferior processes" t) (repeat :tag "Selected modes" @@ -82,15 +82,20 @@ for both actions (NOT RECOMMENDED)." :version "24.1") (defcustom emacs-lock-locked-buffer-functions nil - "Abnormal hook run when Emacs Lock prevents exiting Emacs, or killing a buffer. -The functions get one argument, the first locked buffer found." + "Abnormal hook run when exiting Emacs or killing a buffer. +When exiting Emacs, the hook is run from `kill-emacs-query-functions' +and from `kill-emacs-hook' if any buffer has `emacs-lock-mode' turned on. +When killing a buffer, the hook is run if the buffer has `emacs-lock-mode' +turned on. +The functions on this hook are called with one argument, the first (or +only) locked buffer that is found." :type 'hook :group 'emacs-lock :version "24.3") (defvar-local emacs-lock-mode nil "If non-nil, the current buffer is locked. -It can be one of the following values: +The value can be one of the following: exit -- Emacs cannot exit while the buffer is locked kill -- the buffer cannot be killed, but Emacs can exit as usual all -- the buffer is locked against both actions @@ -116,7 +121,7 @@ Internal use only.") (defun emacs-lock--can-auto-unlock (action) "Return t if the current buffer can auto-unlock for ACTION. -ACTION must be one of `kill' or `exit'. +ACTION must be one of `kill', `exit' or `all'. See `emacs-lock-unlockable-modes'." (and emacs-lock--try-unlocking (not (emacs-lock-live-process-p (current-buffer))) @@ -136,7 +141,7 @@ See `emacs-lock-unlockable-modes'." nil))) (defun emacs-lock--kill-emacs-hook () - "Signal an error if any buffer is exit-locked. + "Signal an error if any buffer is exit-locked to prevent Emacs from exiting. Used from `kill-emacs-hook' (which see)." (let ((locked (emacs-lock--exit-locked-buffer))) (when locked @@ -145,7 +150,7 @@ Used from `kill-emacs-hook' (which see)." (buffer-name locked))))) (defun emacs-lock--kill-emacs-query-functions () - "Display a message if any buffer is exit-locked. + "Display a message if any buffer is exit-locked and prevent Emacs exiting. Return a value appropriate for `kill-emacs-query-functions' (which see)." (let ((locked (emacs-lock--exit-locked-buffer))) (if (not locked) @@ -156,7 +161,7 @@ Return a value appropriate for `kill-emacs-query-functions' (which see)." nil))) (defun emacs-lock--kill-buffer-query-functions () - "Display a message if the current buffer is kill-locked. + "Display a message if the current buffer is kill-locked and prevent killing it. Return a value appropriate for `kill-buffer-query-functions' (which see)." (if (or (emacs-lock--can-auto-unlock 'kill) (memq emacs-lock-mode '(nil exit))) @@ -190,13 +195,17 @@ Return a value appropriate for `kill-buffer-query-functions' (which see)." ;;;###autoload (define-minor-mode emacs-lock-mode "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: @@ -204,7 +213,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." @@ -233,7 +242,8 @@ some major modes from being locked under some circumstances." (add-hook 'kill-emacs-query-functions 'emacs-lock--kill-emacs-query-functions)) (defun emacs-lock-unload-function () - "Unload the Emacs Lock library." + "Unload the Emacs Lock library. +This is called from `unload-feature', which see." (catch :continue (dolist (buffer (buffer-list)) (set-buffer buffer) commit 749ce42049b9d2136efa0433b4c10cd9ad070156 Author: Alan Mackenzie Date: Sat Jun 6 12:58:43 2026 +0000 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. diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index f930d2d34f3..c00fef8a471 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -675,24 +675,16 @@ that requires a literal mode spec at compile time." (setq c-min-syn-tab-mkr nil) (setq c-max-syn-tab-mkr nil) - (when (or c-recognize-<>-arglists - (c-major-mode-is 'awk-mode) - (c-major-mode-is '(java-mode c-mode c++-mode objc-mode pike-mode))) - ;; We'll use the syntax-table text property to change the syntax - ;; of some chars for this language, so do the necessary setup for - ;; that. - ;; - ;; Note to other package developers: It's ok to turn this on in CC - ;; Mode buffers when CC Mode doesn't, but it's not ok to turn it - ;; off if CC Mode has turned it on. - - ;; Emacs. - (when (boundp 'parse-sexp-lookup-properties) - (set (make-local-variable 'parse-sexp-lookup-properties) t)) - - ;; Same as above for XEmacs. - (when (boundp 'lookup-syntax-properties) - (set (make-local-variable 'lookup-syntax-properties) t))) + ;; We use the syntax-table text property to change the syntax of some + ;; chars, potentially in every language, so set this up. + ;; Emacs. + (when (boundp 'parse-sexp-lookup-properties) + (make-local-variable 'parse-sexp-lookup-properties) + (setq parse-sexp-lookup-properties t)) + ;; Same as above for XEmacs. + (when (boundp 'lookup-syntax-properties) + (make-local-variable 'lookup-syntax-properties) + (setq lookup-syntax-properties t)) ;; Use this in Emacs 21+ to avoid meddling with the rear-nonsticky ;; property on each character. commit def15c1b973e17b98c39684b06646f521497ae52 Author: Dirk-Jan C. Binnema Date: Sat Jun 13 09:47:01 2026 +0300 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. Copyright-paperwork-exempt: yes diff --git a/src/xterm.c b/src/xterm.c index 1401693541c..d95de2ef86b 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -32364,6 +32364,13 @@ static struct textconv_interface text_conversion_interface = void init_xterm (void) { +#if defined(HAVE_XWIDGETS) && !defined(HAVE_PGTK) + /* Emacs uses off-screen gtk widgets for webkit views, which do not support + DMABUF or Compositing Mode; webkit aborts unless we disable those. */ + xputenv ("WEBKIT_DISABLE_DMABUF_RENDERER=1"); + xputenv ("WEBKIT_DISABLE_COMPOSITING_MODE=1"); +#endif + #ifndef HAVE_XINPUT2 /* Emacs can handle only core input events when built without XI2 support, so make sure Gtk doesn't use Xinput or Xinput2 commit 2c5b4911b398488b4e6a00d27aa1df93075fd674 Author: Eli Zaretskii Date: Thu Jun 25 09:48:52 2026 +0300 ; * doc/lispref/commands.texi (Interactive Codes): More examples of '*'. diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi index 8614ee53f87..0e993f45b48 100644 --- a/doc/lispref/commands.texi +++ b/doc/lispref/commands.texi @@ -393,9 +393,11 @@ many Emacs primitives will signal an error if a command attempts to modify text of a read-only buffer, even if the command's interactive spec does not include @samp{*}. So this character is for when you want to forcibly signal an error even if the command's implementation doesn't -invoke any primitives which modify the buffer. For example, a command -that binds @code{inhibit-read-only} non-@code{nil} (because it affects -more than just read-only buffers), or a command which, depending on the +invoke any primitives which modify the buffer, or if you want to avoid +processing or side effects of a command that will fail later due to +buffer modifications. For example, a command that binds +@code{inhibit-read-only} non-@code{nil} (because it affects more than +just read-only buffers), or a command which, depending on the conditions, might end up not modifying the buffer, but you want it to signal this error anyway. commit ea87a99b84315eddd6e9638ff81a77b673ceeb94 Author: Eli Zaretskii Date: Thu Jun 25 09:43:29 2026 +0300 ; Fix recent improvements in docs of splitting and merging frames * lisp/window-x.el (merge-frames): Doc fix. * doc/lispref/windows.texi (Basic Windows): Fix a typo. * doc/lispref/frames.texi (Splitting and Merging Frames): Fix wording, markup and indexing. diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 6fe545ef580..945cb4d0f32 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -3094,7 +3094,7 @@ criteria. @section Splitting and Merging Frames @cindex splitting a frame @cindex merging two frames -@cindex Transferring window layouts +@cindex transferring window layouts to frames The following two functions are useful to transfer parts of the window layout (@pxref{Basic Windows}) of one frame to two separate frames and @@ -3110,7 +3110,7 @@ Interactively, @var{arg} is the prefix argument. In a first step, it divides the child windows (@pxref{Windows and Frames}) of @var{frame}'s main window (@pxref{Side Windows}) into two parts. The first part includes the first @var{arg} child windows if -@var{arg} is positive, and the -@var{arg} last child windows if +@var{arg} is positive, and the @minus{}@var{arg} last child windows if @var{arg} is negative. The second part includes the remaining child windows of @var{frame}'s main window. @@ -3133,20 +3133,22 @@ This command transfers the main window (@pxref{Side Windows}) of @var{frame2} to @var{frame1}. Both @var{frame1} and @var{frame2} must specify live frames. -In a first step it splits the main window of @var{frame1}. If +In the first step it splits the main window of @var{frame1}. If @var{vertical} is non-@code{nil}, it makes the new window below the old main window of @var{frame1}. Otherwise, it makes the new window on the right of @var{frame1}'s main window. -In a second step it makes the new window a clone (@pxref{Window +In the second step it makes the new window a clone (@pxref{Window Configurations}) of the main window of @var{frame2}. The original identity (@pxref{Basic Windows}) of the cloned windows is lost in that -step. In a final step, it deletes @var{frame2} if the merge completed +step. In the final step, it deletes @var{frame2} if the merge completed successfully and returns @var{frame1}. Interactively, @var{vertical} is the prefix argument, @var{frame1} is the selected frame and @var{frame2} is the frame following @var{frame1} -in the list of all frames (@pxref{Finding All Frames}). +in the list of all frames (@pxref{Finding All Frames}). If @var{frame1} +and @var{frame2} are omitted or @code{nil} in calls from Lisp, they +default to the above values. @end deffn In general you cannot ``undo'' a @code{split-frame} call with a diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi index 8bb2a7fc9bb..16b82a6a29e 100644 --- a/doc/lispref/windows.texi +++ b/doc/lispref/windows.texi @@ -89,7 +89,7 @@ tiling operations for that frame. @cindex window object @cindex window identity In Emacs Lisp, windows are represented by a special Lisp object type -(@pxref{Window Type}). Two windows are identic if and only if they are +(@pxref{Window Type}). Two windows are identical if and only if they are represented by the same Lisp object. @defun windowp object diff --git a/lisp/window-x.el b/lisp/window-x.el index 4197d5a0a26..813b8aed9f3 100644 --- a/lisp/window-x.el +++ b/lisp/window-x.el @@ -319,8 +319,10 @@ ones in `window--transpose'." (defun merge-frames (&optional frame1 frame2 vertical) "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 0ec6a3fd44dd774136545912b3b00dc062e95dc6 Author: Eli Zaretskii Date: Thu Jun 25 09:11:18 2026 +0300 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) diff --git a/lisp/subr.el b/lisp/subr.el index 58f388c146d..a9924445ada 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -7799,7 +7799,7 @@ seconds." (unless (y-or-n-p-with-timeout (format "Error %s; continue?" (error-message-string err)) 5 t) - (error err)))) + (signal err)))) ;; Continue running. nil))) commit 72b8d88171a1b1b6a854ee65992228d92352bb73 Author: Zhengyi Fu Date: Wed Jun 24 14:02:59 2026 +0800 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). Copyright-paperwork-exempt: yes diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 7e794330b1f..ebbaa7609ea 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -974,7 +974,7 @@ DIRS must contain directory names." (let ((res (project--read-dir-locals dir))) (project--set-cached dir 'project-vc-dir-locals (or res 'none)) res)))) - (symbol-value var))) + (default-value var))) (defun project--read-dir-locals (dir) (with-temp-buffer commit b34952ee94710e9985a3ba74f16f8ecf79ce1d5e Author: Dmitry Gutov Date: Tue Jun 23 06:04:59 2026 +0300 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. diff --git a/lisp/progmodes/etags-regen.el b/lisp/progmodes/etags-regen.el index b9cb75358c0..9be4be9f92d 100644 --- a/lisp/progmodes/etags-regen.el +++ b/lisp/progmodes/etags-regen.el @@ -236,8 +236,9 @@ is used in buffers that have no alternative completion configured." ;; this mode, skip all functionality. (not (or tags-file-name tags-table-list)) - (file-exists-p (etags-regen--choose-tags-file - (setq proj (project-current))))) + (prog1 (setq proj (project-current)) + (unless proj (message "No project found"))) + (file-exists-p (etags-regen--choose-tags-file proj))) (message "Found existing tags table, refreshing...") (etags-regen--refresh proj)) (when (and (not (or tags-file-name commit 30fc250a262738d81719570280db1b41557b1600 Author: Martin Rudalics Date: Wed Jun 24 11:39:02 2026 +0200 ; * doc/lispref/frames.texi (Deleting Frames): Fix typo in last commit. diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 571f38ed95c..6fe545ef580 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -3001,7 +3001,7 @@ should try to select the most recently used frame as returned by @code{get-mru-frame} (@pxref{Input Focus}) on the same terminal. The value @code{nil} means that @code{delete-frame} will try to select the oldest visible frame on the same terminal as the deleted one. -@end defvar +@end defopt @node Finding All Frames commit 8679bdf0819db6bfb2c4f4f1db8037824b76b1f1 Author: Stephen Berman Date: Wed Jun 24 11:35:54 2026 +0200 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. diff --git a/ChangeLog.5 b/ChangeLog.5 index c570b00aa83..dc4ae192870 100644 --- a/ChangeLog.5 +++ b/ChangeLog.5 @@ -170,7 +170,7 @@ * test/lisp/emacs-lisp/macroexp-tests.el (macroexp--test-macroexp-enable-pos-preservation): New test. -2026-06-21 milkvetch +2026-06-21 milkvetch (tiny change) Avoid infinite loop in some Dired marking commands commit 070a3a356fc0b7c3371e3196821bd95db2d96108 Author: Sean Whitton Date: Wed Jun 24 10:29:50 2026 +0100 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). diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 8506e182799..328fc8bcd2c 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -4987,11 +4987,11 @@ If FILE is a directory, revert all files inside that directory." (vc-responsible-backend file) (vc-backend file)) 'revert file backup-file)) - `((vc-state . ,(if (eq (vc-state file) 'added) - 'unregistered - 'up-to-date)) - (vc-checkout-time - . ,(file-attribute-modification-time (file-attributes file))))) + (let ((state (vc-state file))) + `(,@(and (eq state 'added) '((vc-backend . nil))) + (vc-state . ,(if (eq state 'added) 'unregistered 'up-to-date)) + (vc-checkout-time + . ,(file-attribute-modification-time (file-attributes file)))))) (vc-resynch-buffer file t t)) (defun vc-revert-files (backend files) @@ -5007,7 +5007,7 @@ For entries in FILES that are directories, revert all files inside them." ;; Use `vc-file-getprop' directly here because we may be ;; handling very many files and do not want to hit the disk. `(,@(pcase (vc-file-getprop file 'vc-state) - ('added '((vc-state . unregistered))) + ('added '((vc-backend . nil) (vc-state . unregistered))) ;; If we have no known state for the file somehow, leave ;; it that way. ('nil nil) commit c8a86c15610f1190c92a08ffe900e823ab5bee6d Author: Sean Whitton Date: Wed Jun 24 10:06:37 2026 +0100 ; make change-history-commit diff --git a/ChangeLog.5 b/ChangeLog.5 index fbf23263ad3..c570b00aa83 100644 --- a/ChangeLog.5 +++ b/ChangeLog.5 @@ -1,3 +1,742 @@ +2026-06-24 Martin Rudalics + + Document new option 'delete-frame-choose-selected' (Bug#80397) + + * doc/lispref/frames.texi (Deleting Frames): Document new option + 'delete-frame-choose-selected'. + * etc/NEWS: Mark 'delete-frame-choose-selected', 'split-frame' + and 'merge-frames' as documented. + +2026-06-23 Martin Rudalics + + Document 'split-frame' and 'merge-frames' in Elisp manual + + * doc/lispref/frames.texi (Splitting and Merging Frames): New + section. + * doc/lispref/elisp.texi (Top): Add new section. + * doc/lispref/windows.texi (Basic Windows): Explain terms + 'layout' and 'identity' of windows. + (Window Configurations): Explain that window identities are + preserved by window configurations and get lost with window + states. + +2026-06-23 Sean Whitton + + Eglot: release version 1.24 + + * lisp/progmodes/eglot.el (Version): Bump to 1.24. + + * etc/EGLOT-NEWS: Announce new version. + +2026-06-23 Sean Whitton + + Jsonrpc: release version 1.0.29 + + (Version): Bump to 1.0.29. + +2026-06-23 João Távora + + jsonrpc-shutdown: Ensure we wait whole timeout & increase timeout + + * lisp/jsonrpc.el (jsonrpc-shutdown): Ensure that we wait for + the whole timeout and increase the timeout to 300ms (bug#80140). + +2026-06-23 Sean Whitton + + vc-hg-state-slow: Run from the repository root + + * lisp/vc/vc-hg.el (vc-hg-state-slow): Run command from the + repository root. This fixes cases where a whole subdirectory no + longer exists. We should return 'missing' for any files within + it. + +2026-06-23 Sean Whitton + + vc-dir-delete-file: Call vc-delete-file on FILESET-ONLY-FILES + + * lisp/vc/vc-dir.el (vc-dir-delete-file): Call vc-delete-file on + FILESET-ONLY-FILES. See bug#80998. + +2026-06-23 Stéphane Marks + + Fix 'truncate-string-pixelwise' to restore the window buffer + + * lisp/emacs-lisp/subr-x.el (truncate-string-pixelwise): Safely + save/restore the selected window's buffer, and not the reference + or current buffers. Guard dedicated windows. Remove the work + buffer from the window's buffer list. Bind + 'buffer-list-update-hook' 'window-scroll-functions' + 'window-configuration-change-hook' to nil around the window + buffer swap. (Bug#81262; see also bug#80244.) + +2026-06-23 Stéphane Marks + + Restore progress-reporter suffix as update-text (bug#81134) + + * lisp/subr.el (progress-reporter-update-functions): Update + docstring. + (progress-reporter-update): New UPDATE-TEXT argument replacing + previously deleted SUFFIX. + (make-progress-reporter): Document suffix slot available for + reuse. + (progress-reporter-force-update): Update function signature. + (progress-reporter-echo-area): Restore the text argument and + echo it. + (progress-reporter-do-update): Update function signature. Treat + UPDATE-TEXT as ephemeral and do not persist it in the reporter + instance. Update the hook. + (progress-reporter-done): Update the hook. + * lisp/system-taskbar.el + (system-taskbar--progress-reporter-update): Update function + signature. + * lisp/net/tramp.el (tramp-progress-reporter-update): Update + function signature. + * doc/lispref/display.texi (Progress): Update documentation. + +2026-06-22 Juri Linkov + + Rename recently added after-delete-frame-select-mru-frame + + Rename 'after-delete-frame-select-mru-frame' to + 'delete-frame-choose-selected' for symmetry with + 'delete-window-choose-selected' with the same + default value 'mru' (bug#80397). + + * lisp/cus-start.el: Add a choice like in + 'delete-window-choose-selected'. + + * src/frame.c (delete_frame): Compare delete_frame_choose_selected + with Qmru. + (syms_of_frame): Define symbol Qmru. + Use DEFVAR_LISP for 'delete-frame-choose-selected' + and set the default value to Qmru. + +2026-06-22 duli (tiny change) + + Eglot: decode unhexed file URI paths as UTF-8 (bug#79897) + + 'url-unhex-string' only decodes %XX sequences and returns a + unibyte string; it does not interpret the resulting octets as + UTF-8. Its docstring says that the resulting string generally + requires decoding with an appropriate coding system. + + LSP messages are UTF-8, and document URIs are transferred as URI + strings. When recovering the file path from the URI, decode the + unhexed octets as UTF-8 instead of using them directly as an + Emacs string. This should fix bug#79897. + + + * lisp/progmodes/eglot.el (eglot-uri-to-path): Decode the + result of 'url-unhex-string' with 'utf-8-unix'. + +2026-06-22 Michael Albinus + + Sync with Tramp 2.8.2 + + * lisp/net/tramp-message.el (tramp-trace-add-package): New defun. + + * lisp/net/tramp-smb.el (tramp-smb-maybe-open-connection): + Remove superfluous comment. + + * lisp/net/tramp.el (tramp-restricted-shell-hosts-alist): + Use `file-name-sans-extension'. + (tramp-completion-handle-expand-file-name): + Apply `tramp-drop-volume-letter' consequently. + + * test/lisp/net/tramp-tests.el + (tramp--test-ignore-make-symbolic-link-error): Use `file-error' + instead of `remote-file-error' + (tramp--test-instrument-test-case-p): Fix doxstring. + (tramp-test10-write-region-other-file-name-handler) + (tramp-test49-external-backend-function): Adapt tests. + +2026-06-22 Sean Whitton + + Rename variable to macroexp-enable-preserve-posification + + * lisp/emacs-lisp/macroexp.el + (macroexp-enable-pos-preservation): Rename ... + (macroexp-enable-preserve-posification): ... to this. All uses + changes. + +2026-06-22 Eshel Yaron + + New variable 'macroexp-enable-pos-preservation' (bug#79599) + + * lisp/emacs-lisp/macroexp.el + (macroexp-enable-pos-preservation): New variable. + (macroexp-preserve-posification): Respect it. + * lisp/emacs-lisp/elisp-scope.el (elisp-scope-1): Use it. + * test/lisp/emacs-lisp/macroexp-tests.el + (macroexp--test-macroexp-enable-pos-preservation): New test. + +2026-06-21 milkvetch + + Avoid infinite loop in some Dired marking commands + + These commands use dired-get-filename inside a dired-mark-if form; + when the bottom subdirectory is hidden, dired-get-filename makes + it so the dired-mark-if loop never reaches the end of the buffer. + This is fixed by skipping hidden subdirectories (bug#80964). + + * lisp/dired.el (dired-mark-files-regexp) + (dired-mark-files-containing-regexp): + * lisp/dired-x.el (dired-mark-unmarked-files): + * lisp/dired-aux.el (dired-compare-directories): Skip hidden subdirectories. + +2026-06-20 Eli Zaretskii + + Resurrect effect of 2nd arg t in 'format-mode-line' + + * src/xdisp.c (Fformat_mode_line): Resurrect support for FACE = t. + Doc fix. (Bug#81271) + + * doc/lispref/modes.texi (Emulating Mode Line): Fix documentation + of 'format-mode-line' when 2nd argument is t. + + * test/src/xdisp-tests.el (xdisp-test-format-mode-line): New test. + +2026-06-20 Eli Zaretskii + + Fix 'format-mode-line' for integer second argument + + * src/xdisp.c (Fformat_mode_line): Test for integers with + INTEGERP. (Bug#81272) + +2026-06-20 Stéphane Marks + + markdown-ts-mode: fix code block and table overlays (bug#81195) + + Fix to eliminate erroneous multiple code block overlays. Fixes + to deal with 'treesit' fontification catching up to + user-initiated code block range expansions; e.g., inserting, + yanking. Set overlay properties only once. + + * lisp/textmodes/markdown-ts-mode.el + (markdown-ts--fontify-code-block): Use 'overlays-in' not + 'overlays-at'. Use only overlays, eliminate markers. + (markdown-ts--enable-code-block-in-context-mode): Add 'sit-for' + to allow 'treesit' to catch up (pending input should not be an + issue). + (markdown-ts--run-command-in-code-block): Use overlays instead + of 'get-char-property'. + (markdown-ts--code-block-in-context-mode-update-ov): Use + overlays instead of 'get-char-property'. Set overlay properties + only once. + (markdown-ts--in-table-mode-update-ov): Set overlay properties + only once. + +2026-06-20 Stéphane Marks + + markdown-ts-mode: Fix computing code block current region (bug#81219) + + This ensures that commands such as 'comment-or-uncomment-region' + operate on the correct region in the work buffer. + + * lisp/textmodes/markdown-ts-mode.el (markdown-ts--run-command-in-code-block): + Fix adj-region-beg and adj-region-end. + +2026-06-20 Oleksandr Makhmudov (tiny change) + + Eglot: add 'nu-ts-mode' as a nushell major mode + + 'nu-ts-mode' is an alternative tree-sitter-based major mode for + nushell. This commit adds it to the list of major modes that run + the nushell language server. + * lisp/progmodes/eglot.el (eglot-server-programs): Add 'nu-ts-mode'. + (Bug#81206) + +2026-06-20 समीर सिंह Sameer Singh + + Fix c-ts-mode bsd-style indentation of union bodies (bug#81255) + + * lisp/progmodes/c-ts-mode.el (c-ts-mode--simple-indent-rules): Add + "union_specifier" to the parent-is regexp. + + * test/lisp/progmodes/c-ts-mode-resources/indent-bsd.erts: New test. + +2026-06-20 Yuan Fu + + Fix markdown-inline incremental parsing issue (bug#81019) + + * lisp/treesit.el: + (treesit--embed-languages-need-full-parse): New variable. + (treesit--set-embed-ranges): Reparse full range if the langauge + needs it. + +2026-06-19 Stephen Berman + + Avoid an unusual error when visiting a directory in Dired + + * lisp/dired.el (dired-internal-noselect): Unset + 'dired--ls-error-buffer' before calling 'dired-readin'. This is a + safeguard to prevent an error when visiting a directory in Dired, + which apparently happens when the variable somehow gets set even + though 'ls' has not emitted an error message (bug#80499, Message #218). + + * test/lisp/dired-tests.el (dired-test-set-dired--ls-error-buffer): New test. + +2026-06-19 Dmitry Gutov + + Fix "diff-apply-buffer applies to the wrong file" + + * lisp/vc/diff-mode.el (diff-find-file-name): Inhibit the "drop + dir" behavior in diffs produced by Git and Hg (bug#81210). + Except for the virtual subdirectories like a/b/etc, which is + moved and happens for all such diffs. Tighten the check for + such virtual directory names, though (characters are the chars + used by the configuration option 'diff.mnemonicPrefix'). + (diff-setup-buffer-type): Recognize Hg diffs where only one + revision is specified, too. + + * test/lisp/vc/diff-mode-tests.el + (diff-mode-test-setup-buffer-type) + (diff-mode-test-find-file-name-create): New tests. + +2026-06-18 Martin Rudalics + + Fix thinko in 'set-frame-size-and-position' (Bug#81193) + + * lisp/frame.el (set-frame-size-and-position): Do not subtract + scoll bar, fringes and internal border sizes twice (Bug#81193). + +2026-06-17 JD Smith + + Correct default native-comp tests + + Supersedes 5bd9d1f7df3. + + * configure.ac: Store `with_native_compilation' to correctly test + whether to use the soft or hard (error) checks, as these set the + variable by side-effect. + +2026-06-16 JD Smith + + Revert "Fix the Android build" + + This reverts commit 916572f6e0ab3e36f7098b6d9b5ff19f87240da4, in favor + of another fix. + +2026-06-16 Stefan Monnier + + (comint--intersect-regions): Fix bug#81243 + + * lisp/comint.el (comint--intersect-regions): Fix syntax-propertization. + +2026-06-14 Kyle Meyer + + Update to Org 9.8.6 + +2026-06-13 Stefan Monnier + + src/keyboard.c (Finsert_special_event): Don't ignore unknown events + +2026-06-13 João Távora + + Eglot: restore compatibility to Emacs 26.3 + + Github-reference: https://github.com/joaotavora/eglot/discussions/1591 + + Can't use setf plist-get. + + * lisp/progmodes/eglot.el (eglot--async-request): Use cl-getf. + +2026-06-12 Martin Rudalics + + Fix behavior of 'temp-buffer-resize-mode' (Bug#81207) + + * lisp/help.el (temp-buffer-resize-mode): Fix doc-string - a + window can be resized now even if it has shown another buffer in + between (Bug#81207). + (resize-temp-buffer-window): Resize window if and only if its + buffer is the buffer it has shown initially (Bug#81207). + +2026-06-11 Xiyue Deng + + Restore public interfaces for accessing built-in package info + + These functions were removed in ab36f5892203e4b1f59da7c995e0f1fa0a81d1b6 + during the reorganization of package.el as part of Bug#80079. + + Also add a simple test for these functions to avoid future regressions. + + See also discussion at + https://lists.gnu.org/archive/html/emacs-devel/2026-06/msg00149.html. + + * lisp/emacs-lisp/package.el (package-versioned-builtin-packages, + package-builtin-package-version): Restore. + * lisp/emacs-lisp/package-activate.el: Remove lingering comments. + * test/lisp/emacs-lisp/package-tests.el + (package-test-builtin-package-info): Add. + +2026-06-11 Philip Kaludercic + + Allow uninstalling dependency with multiple installations + + * lisp/emacs-lisp/package.el (package--dependency-p): Add new + function to check if a package is a dependency. + (package-delete): Prompt user if it is OK to uninstall a package + that serves as a dependency, but where the package has multiple + installations. This also means that we don't de-select a + selected dependency if there are multiple installations. + + (Bug#81082) + +2026-06-11 Andrea Alberti + + Fix memcpy size in 'merge_faces' + + * src/xfaces.c (merge_faces): Use 'sizeof lface_attrs' instead of + LFACE_VECTOR_SIZE as the 'memcpy' size argument. (Bug#81224) + +2026-06-11 Sean Whitton + + Fix fontification in short unintegrated changes logs (bug#81215) + + Do not merge to master. + + * lisp/vc/vc.el (vc--shortlog): New variable. + (vc-print-log-internal): + * lisp/vc/vc-git.el (vc-git-log-view-mode): + * lisp/vc/vc-hg.el (vc-hg-log-view-mode): Use it. + +2026-06-11 Sean Whitton + + * lisp/vc/vc.el (vc-log-remote-unintegrated): Set vc-log-view-type. + + Do not merge to master. + +2026-06-11 Sean Whitton + + vc-hg-trunk-or-topic-p, vc-hg-topic-outgoing-base: Fix ret vals + + * lisp/vc/vc-hg.el (vc-hg-trunk-or-topic-p) + (vc-hg-topic-outgoing-base): Fix return values. + +2026-06-11 Stéphane Marks + + markdown-ts-mode: Sanitize work-buffer pool + + This a workaround for the release branch due to the work-buffer + pool being insufficiently sanitized. + * lisp/textmodes/markdown-ts-mode.el + (markdown-ts--run-command-in-code-block): Reset 'mark-active'. + Do not merge to master. (Bug#81218) (Bug#81111) + +2026-06-10 Michael Albinus + + Extend Tramp external operations + + * doc/misc/tramp.texi (New operations): Extend. + + * lisp/net/tramp.el (tramp-file-name-for-operation-external): + Extend docstring. + (tramp-file-name-for-operation): Make more use of + `tramp-file-name-for-operation-external'. + (tramp-add-external-operation): Support ARG-TYPE `tramp-file-name'. + + * test/lisp/net/tramp-tests.el (tramp-test49-external-backend-function): + Extend test. + +2026-06-10 Rahul Martim Juliato + + markdown-ts-mode: fix duplicated menu entries (bug#81201) + + * lisp/textmodes/markdown-ts-mode.el + (markdown-ts-code-block-in-context-mode-map) + (markdown-ts-in-table-mode-map): Remove redundant :parent. + +2026-06-10 Sean Whitton + + vc-dir-recompute-file-state: Change directory to DEF-DIR + + * lisp/vc/vc-dir.el (vc-dir-recompute-file-state): Change + directory to DEF-DIR before calling into the backend. + * test/lisp/vc/vc-tests/vc-test-misc.el + (vc-test-vc-dir-on-symlink): Test that the file has the right + state. + +2026-06-10 Pip Cet + + Restore "interactive" when describing functions + + * lisp/help-fns.el (help-fns-function-description-header): Only + substitute "an" for "a", not for a longer BEG (bug#81203). + +2026-06-09 Stéphane Marks + + Inhibit follow-link via `mouse-1' on the tab-bar (bug#81036) + + Prevent 'tab-bar' mouse clicks from being directed to the + current buffer, for example, in `dired-mode'. This prevents the + side effect that the clicked tab is erroneously closed. + + * lisp/mouse.el (mouse-on-link-p): Explicitly exempt clicks in + 'tab-bar' if there is a 'follow-link' property. + +2026-06-09 Juri Linkov + + Fix the tab close button appearance when clicking (bug#76394) + + * src/xdisp.c (handle_tab_bar_click): Use the variable 'close_p' + to show mouse face as sunken/raised only when clicked + on the close button. Clicking elsewhere on the tab should not + change the close button's appearance using DRAW_MOUSE_FACE. + +2026-06-09 Peter Oliver + + Install images with info documentation (bug#81204) + + * Makefile.in (info_misc): Install all files with .png and .jpg + extensions into the info directory (bug#81204). + +2026-06-09 Sean Whitton + + vc-dir-recompute-file-state: Return nil state for nonexistent file + + * lisp/vc/vc-dir.el (vc-dir-recompute-file-state): Return nil + state for nonexistent file (bug#81191). + +2026-06-09 Sean Whitton + + vc-test-vc-dir-on-symlink: Use vc-test--with-author-identity + + * test/lisp/vc/vc-tests/vc-tests.el (vc-hg-global-switches): + Declare. + (vc-tests-helpers): Require. + (vc-test--create-repo-function, vc-test--with-author-identity): + Move these from here ... + * test/lisp/vc/vc-tests/resources/vc-tests-helpers.el + (vc-test--create-repo-function, vc-test--with-author-identity): + ... to here. + (vc-hg-global-switches): + * test/lisp/vc/vc-tests/vc-test-misc.el (vc-hg-global-switches): + Declare. + (vc-dir, log-edit, vc-tests-helpers): Require. + (vc-test-vc-dir-on-symlink): Use vc-test--with-author-identity + and vc-test--create-repo-function. + +2026-06-08 Stéphane Marks + + Fix M-RET in 'markdown-ts-in-table-mode-map' + + * lisp/textmodes/markdown-ts-mode.el + (markdown-ts-in-table-mode-map): Map 'M-RET' to + 'markdown-ts-table-insert-row-below' (bug#81196). + +2026-06-08 Sean Whitton + + Fix recurrence of bug#80803 after changes in bug#80967 + + * lisp/vc/vc-dir.el (vc-dir-resynch-file): Pass only truenames + to vc-dir-recompute-file-state. + * test/lisp/vc/vc-tests/vc-test-misc.el (vc-git): Require. + (vc-test-vc-dir-on-symlink): New test. + +2026-06-08 Michael Albinus + + Ensure Tramp backward compatibility + + * lisp/net/tramp.el (tramp-local-environment-variable-p): + Use `tramp-compat-funcall'. + +2026-06-07 Juri Linkov + + Read a key sequence instead of a single key in 'map-y-or-n-p' + + This is necessary to correctly read keys like 'M-~' + used by 'save-some-buffers' that is two keys 'ESC ~' + on a tty. + + * doc/lispref/minibuf.texi (Multiple Queries): + Index 'y-or-n-p-use-read-key' for 'map-y-or-n-p'. + Mention using a key sequence instead of single keys. + + * lisp/emacs-lisp/map-ynp.el (map-y-or-n-p): + In the 'y-or-n-p-use-read-key' cond-branch, + use 'read-key-sequence-vector' instead of 'read-key'. + In the default cond-branch, use 'this-command-keys-vector' + instead of 'last-command-event'. In both cond-branches + use 'key-description' instead of 'single-key-description' + (bug#81168). + Instead of '(eq def nil)' check if chars are either nil + or an empty vector in noninteractive mode (bug#67836). + + * test/lisp/emacs-lisp/map-ynp-tests.el (test-map-ynp-kmacro): + Test separately nil/non-nil 'y-or-n-p-use-read-key'. + (test-map-ynp-keys): New test for complete coverage of + 'map-y-or-n-p'. + +2026-06-07 Eli Zaretskii + + Avoid recursive error in debug-early in batch mode + + * lisp/emacs-lisp/debug-early.el (cl--generic-compiler): Defvar it. + (debug-early-backtrace): Bind it so as to avoid loading + byte-compiler; see the value of the variable in cl-generic.el. + Do not merge to master. (Bug#80916) + +2026-06-07 Eli Zaretskii + + Remove from CC Mode code that modifies 'major-mode-remap-defaults' + + * lisp/progmodes/cc-mode.el: Remove code that adds to + 'major-mode-remap-defaults', as enabling and disabling tree-sitter + based modes now goes through 'treesit-enabled-modes'. + +2026-06-06 Pip Cet + + Assert we don't double-free timers (bug#81108) + + * src/atimer.c (cancel_atimer): Assert that we found the timer. + +2026-06-06 Pip Cet + + Don't cancel random timers in x_get_foreign_selection (bug#81108) + + * src/pgtkselect.c (pgtk_display_selection_waiting_message): + (pgtk_cancel_atimer): + (pgtk_get_foreign_selection): + * src/xselect.c (x_display_selection_waiting_message): + (x_cancel_atimer): + (x_get_foreign_selection): Use a pointer to a timer variable, which is + cleared when the timer runs or is otherwise cancelled. Don't cancel + the timer twice. + +2026-06-06 Pip Cet + + Fix use-after-free in Ffuncall_with_delayed_message (bug#81108) + + * src/eval.c (with_delayed_message_display): + (with_delayed_message_cancel): + (Ffuncall_with_delayed_message): Use new temporary data + structure. Cancel timer at most once. + +2026-06-06 Andrea Alberti + + Document 'margin' face as base for margin display strings (Bug#80693) + + * doc/lispref/display.texi (Displaying Faces): Note that the + underlying-text rule does not apply to strings displayed in the + display margins, and reword the margin-face bullet to describe + 'margin' as the base. + (Basic Faces): Note that the 'margin' face also provides the base + attributes for strings displayed in the margins. + (Display Margins): Drop a sentence that restated the preceding one + about unspecified attributes inheriting from 'margin'. + * etc/NEWS: Document the change for margin strings. + + Suggested by F. Jason Park . + +2026-06-06 Augusto Stoffel + + Improve prompting for mail sending by by 'report-emacs-bug' + + * lisp/mail/emacsbug.el (report-emacs-bug-hook): Don't ask about + mail sending options if 'message-server-alist' is set. (Bug#81176) + +2026-06-06 Po Lu + + Fix the Android build + + * configure.ac: Don't test for libgccjit.h if a preceding test + have already concluded that native compilation is unavailable. + +2026-06-05 Andrea Alberti + + Don't resurrect invisible child frames when rebuilding parent links + + On the NS port, -[EmacsWindow setParentChildRelationships] reattaches + every child frame to its parent via -addChildWindow:ordered:, which also + orders the child window onto the screen. This runs whenever the + parent/child relationships are rebuilt, e.g., when entering non-native + fullscreen, which allocates a fresh EmacsWindow whose initializer + rebuilds the relationships. A child frame that Emacs had made invisible + (e.g. a corfu/company completion popup) was thereby brought back as a + stale, non-responsive child frame. Emacs never repaints to clear it + because frame_redisplay_p trusts FRAME_VISIBLE_P on the NS port and + avoids dealing with the child frame when it is marked as invisible. + + Native fullscreen does not trigger this: -toggleFullScreen: hands off to + AppKit without allocating a new window, so the rebuild never runs. + + A hidden child frame is normally detached from its parent already: Emacs + hides it with -orderOut: (ns_make_frame_invisible), which per Apple's + documentation removes a child window from its parent before ordering it + out. The fix is therefore not to re-attach a child while it is + invisible; ns_make_frame_visible already reinstates the parent/child link + when the frame is shown again. + + * src/nsterm.m ([EmacsWindow setParentChildRelationships]): Only + re-attach a child window when the frame is marked visible. + (ns_make_frame_visible): Explain, with a reference to Apple's + documentation, why the parent/child link must be reinstated on show. + +2026-06-05 Stéphane Marks + + Improve progress-reporter state to remove hard coded length (bug#80988) + + Remove hard-coded state range, now a monotonically increasing + integer. + + * lisp/subr.el (progress-reporter-update-functions): Update + docstring. + (progress-reporter-echo-area): Use + 'progress-reporter--pulse-characters' length. + (progress-reporter-do-update): Increase 'state' by 1 each pass. + * + lisp/system-taskbar.el (system-taskbar--progress-reporter-update): + Make steps independent of 'progress-reporter-echo-area' steps. + +2026-06-05 Arash Esbati + + (tex-main-file): Add forgotten safety predicate (bug#81099) + + That variable is commonly set file-locally. + + * lisp/textmodes/tex-mode.el (tex-main-file): Add safety predicate. + +2026-06-05 Al Haji-Ali + + Fix bug in latexenc when AUCTeX is loaded + + * lisp/international/latexenc.el + (latexenc-find-file-coding-system): Set file name correctly when + `TeX-master' is a string. (Bug#81099) + +2026-06-05 Stefan Monnier + + paren.el: Fix part of bug#81035 + + * lisp/paren.el (show-paren--default): Syntax-propertize before narrowing. + +2026-06-05 Michael Albinus + + Adapt Tramp version + + * lisp/net/trampver.el (customize-package-emacs-version-alist): + Add Tramp version integrated in Emacs 31.1. + + * doc/misc/trampver.texi: + * lisp/net/trampver.el (tramp-version): Adapt Tramp versions. + +2026-06-05 Augusto Stoffel + + Check buffer-local value in tramp-local-environment-variable-p + + * lisp/net/tramp.el (tramp-local-environment-variable-p): Do it. + +2026-06-05 Sean Whitton + + Bump Emacs version to 31.0.90 + + * README: + * configure.ac: + * exec/configure.ac: + * java/AndroidManifest.xml.in (Version-code): + * msdos/sed2v2.inp: + * nt/README.W32: Bump Emacs version to 31.0.90. + 2026-06-04 Stefan Monnier message.el: Fix part of bug#81035 @@ -65759,7 +66498,7 @@ This file records repository revisions from commit 1cda0967b4d3c815fc610794ad6a8fc2b913a3c5 (exclusive) to -commit 5e3e1a5bb23b5e7813a60c2b121b1393ff6ca86f (inclusive). +commit 884d7a198c9eff1cf0a9cc6e2a021f7d82cb57c6 (inclusive). See ChangeLog.4 for earlier changes. ;; Local Variables: commit 884d7a198c9eff1cf0a9cc6e2a021f7d82cb57c6 Author: Martin Rudalics Date: Wed Jun 24 10:09:47 2026 +0200 Document new option 'delete-frame-choose-selected' (Bug#80397) * doc/lispref/frames.texi (Deleting Frames): Document new option 'delete-frame-choose-selected'. * etc/NEWS: Mark 'delete-frame-choose-selected', 'split-frame' and 'merge-frames' as documented. diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 56acd7c6ee9..571f38ed95c 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -2991,6 +2991,18 @@ for example, deleting a frame during a drag-and-drop operation the @code{delete-frame} call in a @code{condition-case} form. @end defun +When the selected frame gets deleted Emacs has to select another frame +instead. The following option lets you choose which one. + +@defopt delete-frame-choose-selected +This variable specifies which frame to select after deleting the +selected frame. The default value @code{mru} means @code{delete-frame} +should try to select the most recently used frame as returned by +@code{get-mru-frame} (@pxref{Input Focus}) on the same terminal. The +value @code{nil} means that @code{delete-frame} will try to select the +oldest visible frame on the same terminal as the deleted one. +@end defvar + @node Finding All Frames @section Finding All Frames diff --git a/etc/NEWS b/etc/NEWS index 6b2abe30aaa..11128422af9 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -519,7 +519,7 @@ same terminal as the selected frame. Child frames can be excluded. A single frame can be excluded, for example, the selected frame. 'get-mru-frame' returns the single most recently used frame. ---- ++++ *** After deleting, 'delete-frame' now selects the most recently used frame. Previously, after deleting a specified frame, 'delete-frame' would select the oldest visible frame on the same terminal. To revert to the @@ -550,7 +550,7 @@ the corresponding frame parameters 'width', 'height', 'left' and 'top'. 'set-frame-size-and-position-pixelwise' is similar but has a more restricted set of values for specifying size and position. ---- ++++ *** New commands 'split-frame' and 'merge-frames'. 'split-frame' moves a specified number of windows from an existing frame to a newly-created frame. 'merge-frames' merges all windows from two commit f0bfa330394f15448d74e88e053bb1e775f783ad Author: Martin Rudalics Date: Tue Jun 23 16:37:37 2026 +0200 Document 'split-frame' and 'merge-frames' in Elisp manual * doc/lispref/frames.texi (Splitting and Merging Frames): New section. * doc/lispref/elisp.texi (Top): Add new section. * doc/lispref/windows.texi (Basic Windows): Explain terms 'layout' and 'identity' of windows. (Window Configurations): Explain that window identities are preserved by window configurations and get lost with window states. diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi index 9115b3a4691..b7809ff66da 100644 --- a/doc/lispref/elisp.texi +++ b/doc/lispref/elisp.texi @@ -1137,6 +1137,7 @@ Frames * Frame Titles:: Automatic updating of frame titles. * Deleting Frames:: Frames last until explicitly deleted. * Finding All Frames:: How to examine all existing frames. +* Splitting and Merging Frames:: Transferring window layouts between frames. * Minibuffers and Frames:: How a frame finds the minibuffer to use. * Input Focus:: Specifying the selected frame. * Visibility of Frames:: Frames may be visible or invisible, or icons. diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 8535cb6ec08..56acd7c6ee9 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -151,6 +151,7 @@ unique id. * Frame Titles:: Automatic updating of frame titles. * Deleting Frames:: Frames last until explicitly deleted. * Finding All Frames:: How to examine all existing frames. +* Splitting and Merging Frames:: Transferring window layouts between frames. * Minibuffers and Frames:: How a frame finds the minibuffer to use. * Input Focus:: Specifying the selected frame. * Visibility of Frames:: Frames may be visible or invisible, or icons. @@ -3076,6 +3077,85 @@ criteria, and should return non-@code{nil} if the frame satisfies the criteria. @end defun + +@node Splitting and Merging Frames +@section Splitting and Merging Frames +@cindex splitting a frame +@cindex merging two frames +@cindex Transferring window layouts + +The following two functions are useful to transfer parts of the window +layout (@pxref{Basic Windows}) of one frame to two separate frames and +to merge the window layouts of two separate frames into one frame. + +@deffn Command split-frame &optional frame arg +This command transfers some windows of the specified @var{frame} to a +new frame and subsequently deletes them on @var{frame}. @var{frame} +must be a live frame and defaults to the selected frame. @var{arg} +specifies the number of windows to transfer and defaults to 1. +Interactively, @var{arg} is the prefix argument. + +In a first step, it divides the child windows (@pxref{Windows and +Frames}) of @var{frame}'s main window (@pxref{Side Windows}) into two +parts. The first part includes the first @var{arg} child windows if +@var{arg} is positive, and the -@var{arg} last child windows if +@var{arg} is negative. The second part includes the remaining child +windows of @var{frame}'s main window. + +In a second step, it clones (@pxref{Window Configurations}) into a newly +created frame each of the windows of the part which does not include +@var{frame}'s selected window (@pxref{Selecting Windows}) and removes +those windows from @var{frame}. Note that the original identity +(@pxref{Basic Windows}) of the cloned windows is lost in this step. The +identity of the windows retained on @var{frame} is preserved, however. +In a final step, it deletes the windows that have been cloned from +@var{frame} and returns the newly created frame. + +This function signals an error if @var{arg} is either zero or not a +number, or if @var{frame}'s main window is either live or does not have +more child windows than specified by the absolute value of @var{arg}. +@end deffn + +@deffn Command merge-frames &optional frame1 frame2 vertical +This command transfers the main window (@pxref{Side Windows}) of +@var{frame2} to @var{frame1}. Both @var{frame1} and @var{frame2} must +specify live frames. + +In a first step it splits the main window of @var{frame1}. If +@var{vertical} is non-@code{nil}, it makes the new window below the old +main window of @var{frame1}. Otherwise, it makes the new window on the +right of @var{frame1}'s main window. + +In a second step it makes the new window a clone (@pxref{Window +Configurations}) of the main window of @var{frame2}. The original +identity (@pxref{Basic Windows}) of the cloned windows is lost in that +step. In a final step, it deletes @var{frame2} if the merge completed +successfully and returns @var{frame1}. + +Interactively, @var{vertical} is the prefix argument, @var{frame1} is +the selected frame and @var{frame2} is the frame following @var{frame1} +in the list of all frames (@pxref{Finding All Frames}). +@end deffn + +In general you cannot ``undo'' a @code{split-frame} call with a +subsequent @code{merge-frames} call for the following reasons: In its +second step @code{merge-frame} puts the main window of @var{frame2} into +an internal window split off in the first step. No such window was +present in the configuration of @var{frame1} before calling +@code{split-frame}. Also, after merging is complete, the window cloned +from the main window of @var{frame2} will occupy as much space as the +main window of @var{frame1} before merging. This might not match the +space distribution of the original layout. + +Hence, if your preferred workflow is to temporarily split off windows +for working on them in a separate frame and later continue with the +original layout of the original frame, you should proceed as follows: +Save the configuration (@pxref{Window Configurations}) of the original +frame, call @code{split-frame} to create the separate frame and finally +restore the saved configuration of the original frame and delete the +separate frame. + + @node Minibuffers and Frames @section Minibuffers and Frames diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi index fbd578b08f0..8bb2a7fc9bb 100644 --- a/doc/lispref/windows.texi +++ b/doc/lispref/windows.texi @@ -78,14 +78,19 @@ disambiguation, we use the term @dfn{window-system window} when we mean the window-system window corresponding to an Emacs frame. @cindex tiled windows +@cindex window layout Unlike X windows, Emacs windows are @dfn{tiled}; they never overlap within the area of their frame. When a window is created, resized, or deleted, the change in window space is taken from or given to other windows on the same frame, so that the total area of the frame is -unchanged. +unchanged. The @dfn{window layout} of a frame is the result of all +tiling operations for that frame. +@cindex window object +@cindex window identity In Emacs Lisp, windows are represented by a special Lisp object type -(@pxref{Window Type}). +(@pxref{Window Type}). Two windows are identic if and only if they are +represented by the same Lisp object. @defun windowp object This function returns @code{t} if @var{object} is a window (whether or @@ -7263,11 +7268,16 @@ and/or two columns. In the context of window states, the @dfn{clone of a window} is a window that has the same decorations and contents as the window whose state was used to produce it, but is actually represented by another window -object. Operating on the original or the clone of a window does not -affect the other in any way. Note that while @code{window-state-get} -clones existing windows, these clones are not yet valid windows. They -become valid only after @code{window-state-put} has put them into a live -frame. +object. Hence it does not have the same identity as the original +window. Operating on the original or the clone of a window does not +affect the other in any way. + +Note that while @code{set-window-configuration} always restores the +identity of the windows it puts back into their frame, +@code{window-state-put} never does that. Note also that while +@code{window-state-get} clones existing windows, these clones are not +yet valid windows. They become valid only after @code{window-state-put} +has put them into a live frame. By default, @code{set-window-configuration} and @code{window-state-put} may delete a window from the restored configuration or state when they commit 0d67e76b94e1f0af9fe364aed8aa5db1c494c206 Author: Sean Whitton Date: Tue Jun 23 13:22:58 2026 +0100 Eglot: release version 1.24 * lisp/progmodes/eglot.el (Version): Bump to 1.24. * etc/EGLOT-NEWS: Announce new version. diff --git a/etc/EGLOT-NEWS b/etc/EGLOT-NEWS index cdbd3048f27..ad6aae10436 100644 --- a/etc/EGLOT-NEWS +++ b/etc/EGLOT-NEWS @@ -18,7 +18,7 @@ to look up issue github#1234, go to https://github.com/joaotavora/eglot/issues/1234. -* Changes to upcoming Eglot +* Changes in Eglot 1.24 (23/6/2026) ** New command 'M-x eglot-describe-connection' diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 2afb2b40094..f701a38ab8b 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -2,12 +2,12 @@ ;; Copyright (C) 2018-2026 Free Software Foundation, Inc. -;; Version: 1.23 +;; Version: 1.24 ;; Author: João Távora ;; Maintainer: João Távora ;; URL: https://github.com/joaotavora/eglot ;; Keywords: convenience, languages -;; Package-Requires: ((emacs "26.3") (eldoc "1.16.0") (external-completion "0.1") (flymake "1.4.5") (jsonrpc "1.0.28") (project "0.11.2") (seq "2.23") (xref "1.7.0")) +;; Package-Requires: ((emacs "26.3") (eldoc "1.16.0") (external-completion "0.1") (flymake "1.4.5") (jsonrpc "1.0.29") (project "0.11.2") (seq "2.23") (xref "1.7.0")) ;; This is a GNU ELPA :core package. Avoid adding functionality ;; that is not available in the version of Emacs recorded above or any commit f52457d17ef3fb426b9dff07dec8b99aae3ff54c Author: Sean Whitton Date: Tue Jun 23 13:22:34 2026 +0100 Jsonrpc: release version 1.0.29 (Version): Bump to 1.0.29. diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el index 362f4eb1100..55d0dea81bb 100644 --- a/lisp/jsonrpc.el +++ b/lisp/jsonrpc.el @@ -4,7 +4,7 @@ ;; Author: João Távora ;; Keywords: processes, languages, extensions -;; Version: 1.0.28 +;; Version: 1.0.29 ;; Package-Requires: ((emacs "25.2")) ;; This is a GNU ELPA :core package. Avoid functionality that is not commit 4f6b6f462c1f2858d98c2f81608f7b23077adbe9 Author: João Távora Date: Thu May 28 01:19:24 2026 +0100 jsonrpc-shutdown: Ensure we wait whole timeout & increase timeout * lisp/jsonrpc.el (jsonrpc-shutdown): Ensure that we wait for the whole timeout and increase the timeout to 300ms (bug#80140). diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el index 174c99afc86..362f4eb1100 100644 --- a/lisp/jsonrpc.el +++ b/lisp/jsonrpc.el @@ -678,14 +678,16 @@ If CONN is not shutdown within a reasonable amount of time, warn and delete the network process." (unwind-protect (cl-loop - with proc = (jsonrpc--process conn) for i from 0 + with proc = (jsonrpc--process conn) + with grace = 0.3 with start = (float-time) + for i from 0 while (not (process-get proc 'jsonrpc-sentinel-cleanup-started)) - unless (zerop i) do + unless (or (zerop i) (< (- (float-time) start) grace)) do (jsonrpc--warn "Sentinel for %s still hasn't run, deleting it!" proc) (delete-process proc) do ;; Let sentinel have a chance to run - (accept-process-output nil 0.1)) + (accept-process-output nil grace)) (when cleanup (kill-buffer (process-buffer (jsonrpc--process conn))) (kill-buffer (jsonrpc-stderr-buffer conn)))))