commit 0d1bb23d8caf36f6f9bf8cd073aeca557112830c (HEAD, refs/remotes/origin/master) Author: Po Lu Date: Tue Nov 25 10:48:27 2025 +0800 Fix mouse dragging on touch screens * lisp/mouse.el (mouse-position-for-drag-line): New function; return position of active touch screen tool if a sequence is being translated into mouse movement events, and the last mouse position otherwise. (mouse-drag-line): Invoke `mouse-position-for-drag-line' rather than reading the mouse position manually. * lisp/touch-screen.el (touch-screen-current-tool): New 10th field holding the frame-relative last attested position of this tool. (touch-screen-relative-xy): Clarify doc string. (touch-screen-handle-point-update): Update the said field with POSN's position relative to its frame. (touch-screen-handle-touch): Initialize the 10th field of new tool lists with such a position. (touch-screen-last-drag-position): New function. diff --git a/lisp/mouse.el b/lisp/mouse.el index f75800763e6..33aef3b729f 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -853,6 +853,17 @@ This command must be bound to a mouse click." (split-window-horizontally (min (max new-width first-col) last-col))))))) +(defun mouse-position-for-drag-line (tty) + "Return the last mouse position observed for the purposes of `mouse-drag-line'. +If TTY is non-nil, return the last attested position of the mouse +relative to the root frame. Otherwise, return the position of the mouse +relative to the selected frame, unless the current drag operation was +produced from a touch screen event, in which event, return the position +of the active touch-screen tool relative to the same." + (if tty (mouse-position-in-root-frame) + (or (touch-screen-last-drag-position) + (mouse-absolute-pixel-position)))) + (defun mouse-drag-line (start-event line) "Drag a mode, header, tab or vertical line with the mouse. START-EVENT is the starting mouse event of the drag action. LINE @@ -888,9 +899,7 @@ must be one of the symbols `header', `mode', `tab' or `vertical'." ;; START-EVENT here because that would give us coordinates for ;; 'posn-window' of that event and we don't want that (see the ;; comment above). - (position-x-y (if tty - (mouse-position-in-root-frame) - (mouse-absolute-pixel-position))) + (position-x-y (mouse-position-for-drag-line tty)) ;; 'position' records the x- (for vertical dragging) or y- (for ;; mode, header and tab line dragging) coordinate of the ;; current mouse position @@ -956,9 +965,7 @@ must be one of the symbols `header', `mode', `tab' or `vertical'." nil) ((eq line 'vertical) ;; Drag right edge of 'window'. - (setq position (if tty - (car (mouse-position-in-root-frame)) - (car (mouse-absolute-pixel-position)))) + (setq position (car (mouse-position-for-drag-line tty))) (unless (zerop (setq growth (- position last-position))) ;; When we drag characterwise and we either drag for ;; the first time or the dragging direction changes, @@ -989,9 +996,7 @@ must be one of the symbols `header', `mode', `tab' or `vertical'." )) (t ;; Drag bottom edge of 'window'. - (setq position (cdr (if tty - (mouse-position-in-root-frame) - (mouse-absolute-pixel-position)))) + (setq position (cdr (mouse-position-for-drag-line tty))) (unless (zerop (setq growth (- position last-position))) ;; When we drag characterwise and we either drag for ;; the first time or the dragging direction changes, diff --git a/lisp/touch-screen.el b/lisp/touch-screen.el index ee4687e8d63..4109bd96ca2 100644 --- a/lisp/touch-screen.el +++ b/lisp/touch-screen.el @@ -61,7 +61,13 @@ accessed as follows: touch point. (nth 9 touch-screen-current-tool) - The last known position of the touch point. + The last known position of the touch point, relative to the + window in the second element. + + (nth 10 touch-screen-current-tool) + The same position, relative to the frame to which the window + in the second element belongs. + See `touch-screen-handle-point-update' and `touch-screen-handle-point-up' for the meanings of the fourth @@ -201,15 +207,16 @@ mouse-down, mouse motion, mouse drag, and mouse button events.") ;;; Scroll gesture. (defun touch-screen-relative-xy (posn window) - "Return the coordinates of POSN, a mouse position list. -However, return the coordinates relative to WINDOW. + "Return the coordinates of POSN, a mouse position list, relative to WINDOW. -If (posn-window posn) is the same as window, simply return the -coordinates in POSN. Otherwise, convert them to the frame, and -then back again. +If (posn-window POSN) is the same as window, simply return the +coordinates in POSN. Otherwise, translate these coordinates +into that window's frame's coordinate system and from there into +that of WINDOW. -If WINDOW is the symbol `frame', simply convert the coordinates -to the frame that they belong in." +If WINDOW is the symbol `frame', just convert these coordinates +to the coordinate system of the frame containing POSN or its +window." (if (or (eq (posn-window posn) window) (and (eq window 'frame) (framep (posn-window posn)))) @@ -1104,6 +1111,10 @@ then move point to the position of POINT." (relative-xy (touch-screen-relative-xy posn window))) ;; Update the 10th field of the tool list with RELATIVE-XY. (setcar (nthcdr 9 touch-screen-current-tool) relative-xy) + ;; And the 11th with the absolute position of POSN relative to its + ;; frame. + (setcar (nthcdr 10 touch-screen-current-tool) + (touch-screen-relative-xy posn 'frame)) (cond ((or (null what) (eq what 'ancillary-tool)) (let* ((last-posn (nth 2 touch-screen-current-tool)) @@ -1576,6 +1587,8 @@ functions undertaking event management themselves to call (position (cdadr event)) (window (posn-window position)) (point (posn-point position)) + (frame-or-window-frame + (if (framep window) window (window-frame window))) binding tool-list) ;; Cancel the touch screen timer, if it is still there by any ;; chance. @@ -1603,7 +1616,7 @@ functions undertaking event management themselves to call ;; auxiliary tool was first pressed, then interpreted as a ;; scale by which to adjust text within the current tool's ;; window. - (when (eq (if (framep window) window (window-frame window)) + (when (eq frame-or-window-frame ;; Verify that the new tool was placed on the ;; same frame the current tool has, so as not to ;; consider events distributed across distinct @@ -1657,7 +1670,9 @@ functions undertaking event management themselves to call (posn-x-y position) nil position nil nil nil nil - (posn-x-y position))) + (posn-x-y position) + (touch-screen-relative-xy position + 'frame))) touch-screen-current-tool tool-list) ;; Select the window underneath the event as the checks below ;; will look up keymaps and markers inside its buffer. @@ -2155,6 +2170,24 @@ Must be called from a command bound to a `touchscreen-hold' or ;; Now set the fourth element of tool to `command-inhibit'. (setcar (nthcdr 3 tool) 'command-inhibit))) +;;;###autoload +(defun touch-screen-last-drag-position () + "Return the last attested position of the current touch screen tool. +Value is a pair of integers (X . Y) representing the pixel +position of the said tool relative to the frame where it was +placed (not the selected frame), or nil if this function was +not invoked after the generation of a `mouse-movement' or +`down-mouse-1' event by touch screen event translation. + +This function must be consulted in preference to +`mouse-absolute-pixel-position' if the latter is required in any +command that handles `mouse-movement' or `down-mouse-1' events." + (when-let* ((tool touch-screen-current-tool) + (window (nth 1 tool)) + (pos (nth 10 tool))) + (and (eq (nth 3 tool) 'mouse-drag) + (window-live-p window) pos))) + (provide 'touch-screen) commit c767928997d3015695e678d3cfad7d0a11f2da9d Author: Philip Kaludercic Date: Sun Nov 23 11:30:33 2025 +0100 Only search for package descriptors in package root See the following thread for a background on this change: https://mail.gnu.org/archive/html/emacs-devel/2025-08/msg00332.html. This change reverts b81f937e. * lisp/emacs-lisp/package.el (package-dir-info): Do not recursively try to find all Lisp files that might have package metadata. (Bug#79742) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index f302887eeef..3cc0f7699fa 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1279,7 +1279,7 @@ The return result is a `package-desc'." (catch 'found (let ((files (or (and (derived-mode-p 'dired-mode) (dired-get-marked-files nil 'marked)) - (directory-files-recursively default-directory "\\.el\\'")))) + (directory-files default-directory t "\\.el\\'" t)))) ;; We sort the file names in lexicographical order, to ensure ;; that we check shorter file names first (ie. those further ;; up in the directory structure). commit c3604c3224187a219cd8db0b6332f0a6ceacd881 Author: Philip Kaludercic Date: Sun Nov 23 11:14:18 2025 +0100 ; Fix issue when installing packages from Dired * lisp/emacs-lisp/package.el (package-dir-info, package-unpack): Force Dired to return list of packages explicitly marked for installation. Without the optional argument, Dired will return the file under the current point if no files are selected. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 63124706e28..f302887eeef 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -1029,7 +1029,7 @@ untar into a directory named DIR; otherwise, signal an error." (make-directory pkg-dir t) (let ((file-list (or (and (derived-mode-p 'dired-mode) - (dired-get-marked-files)) + (dired-get-marked-files nil 'marked)) (directory-files-recursively default-directory "" nil)))) (dolist (source-file file-list) (let ((target (expand-file-name @@ -1278,7 +1278,7 @@ The return result is a `package-desc'." (package--read-pkg-desc 'dir)) (catch 'found (let ((files (or (and (derived-mode-p 'dired-mode) - (dired-get-marked-files)) + (dired-get-marked-files nil 'marked)) (directory-files-recursively default-directory "\\.el\\'")))) ;; We sort the file names in lexicographical order, to ensure ;; that we check shorter file names first (ie. those further commit 4ea81f359c7661dbc43b1982b19c356e8c105540 Author: Philip Kaludercic Date: Sun Nov 23 21:48:32 2025 +0100 Replace underscores in bind-and* with fresh symbols * lisp/emacs-lisp/cond-star.el (cond*-convert-condition): Bind unused values to fresh symbols, to avoid the compiler warning that a symbol starting with an underscore is accessed later on. This mirrors the behaviour of `if-let*' and family. diff --git a/lisp/emacs-lisp/cond-star.el b/lisp/emacs-lisp/cond-star.el index 55322e4713e..d2a7f05a06b 100644 --- a/lisp/emacs-lisp/cond-star.el +++ b/lisp/emacs-lisp/cond-star.el @@ -311,7 +311,9 @@ This is used for conditional exit clauses." (dolist (bind (cdr condition)) (push (list (car bind) (list 'and last (cadr bind))) checks) - (setq last (car bind))) + (when (eq (caar checks) '_) + (setcar (car checks) (make-symbol "s"))) + (setq last (caar checks))) (cond ;; For explanations on these cases, see "Ordinary ;; Lisp expression is the condition." below. commit 33d813c63b9e050c04066a3a6d75fc5c02234389 Author: Juri Linkov Date: Mon Nov 24 20:14:15 2025 +0200 Fix query-replace-regexp for using '^' with calculated replacement '\,' * lisp/replace.el (replace--push-stack): Add new args 'next-replacement' and 'match-again' and push them to the stack. (perform-replace): Restore the previous already calculated values of 'next-replacement' and 'match-again' from the stack for the 'backup' ('^') key (bug#79811). * test/lisp/replace-tests.el (query-replace-tests): Add tests. diff --git a/lisp/replace.el b/lisp/replace.el index b0689b93e06..5ef16b9df68 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -2781,8 +2781,8 @@ to a regexp that is actually used for the search.") (isearch-clean-overlays)) ;; A macro because we push STACK, i.e. a local var in `perform-replace'. -(defmacro replace--push-stack (replaced search-str next-replace stack) - (declare (indent 0) (debug (form form form gv-place))) +(defmacro replace--push-stack (replaced search-str next-replace next-replacement match-again stack) + (declare (indent 0) (debug (form form form form form gv-place))) `(push (list (point) ,replaced ;; If the replacement has already happened, all we need is the ;; current match start and end. We could get this with a trivial @@ -2797,7 +2797,7 @@ to a regexp that is actually used for the search.") (list (match-beginning 0) (match-end 0) (current-buffer)) (match-data)) - ,search-str ,next-replace) + ,search-str ,next-replace ,next-replacement ,match-again) ,stack)) (defun replace--region-filter (bounds) @@ -3149,7 +3149,9 @@ characters." real-match-data (replace-match-data nil real-match-data - (nth 2 elt)))) + (nth 2 elt)) + next-replacement (nth 5 elt) + match-again (nth 6 elt))) (message "No previous match") (ding 'no-terminate) (sit-for 1))) @@ -3258,7 +3260,8 @@ characters." (replace--push-stack replaced search-string-replaced - next-replacement-replaced stack))) + next-replacement-replaced next-replacement match-again + stack))) ((or (eq def 'automatic) (eq def 'automatic-all)) (or replaced (setq noedit @@ -3372,7 +3375,8 @@ characters." (replace--push-stack replaced search-string-replaced - next-replacement-replaced stack)) + next-replacement-replaced next-replacement match-again + stack)) (setq next-replacement-replaced nil search-string-replaced nil last-was-act-and-show nil)))))) diff --git a/test/lisp/replace-tests.el b/test/lisp/replace-tests.el index d8f2060c5f1..fc93e614898 100644 --- a/test/lisp/replace-tests.el +++ b/test/lisp/replace-tests.el @@ -437,6 +437,9 @@ Each element has the format: ("abab" "C-M-% b* RET 1 RET !" "1a1a1") ;; Test case from commit 5632eb272c7 ("a a a " "C-M-% \\ba SPC RET c RET !" "ccc") ; not "ca c" + ;; Backup ('^') with calculated replacement ('\,') (bug#79811) + ("abc" "C-M-% \\([abc]\\) RET [\\1,\\#] RET y n ^ y y" "[a,0][b,1][c,2]") + ("abc" "C-M-% \\([abc]\\) RET [\\,\\1,\\#] RET y n ^ y y" "[a,0][b,1][c,2]") )) (defun query-replace--run-tests (tests) commit b8525554018923b3de698c7c20b104095406a17e Author: Stefan Monnier Date: Mon Nov 24 11:41:32 2025 -0500 Don't apply EditorConfig files to themselves * lisp/international/mule.el (auto-coding-alist): Add entry for `.editorconfig` files. diff --git a/lisp/international/mule.el b/lisp/international/mule.el index 9d9c2d46a93..78c02ee870f 100644 --- a/lisp/international/mule.el +++ b/lisp/international/mule.el @@ -1760,7 +1760,7 @@ in-place." (defcustom auto-coding-alist ;; .exe and .EXE are added to support archive-mode looking at DOS ;; self-extracting exe archives. - '(("\\.\\(\ + '(("\\.\\(\ arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\|rar\\|7z\\|squashfs\\|\ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|7Z\\|SQUASHFS\\)\\'" . no-conversion-multibyte) @@ -1769,6 +1769,10 @@ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|7Z\\|SQUASHFS\\)\\'" ("\\.\\(gz\\|Z\\|bz\\|bz2\\|xz\\|gpg\\)\\'" . no-conversion) ("\\.\\(jpe?g\\|png\\|gif\\|tiff?\\|p[bpgn]m\\)\\'" . no-conversion) ("\\.pdf\\'" . no-conversion) + ;; https://spec.editorconfig.org/ says: + ;; EditorConfig files must be UTF-8 encoded, + ;; with LF or CRLF line separators. + ("/\\.editorconfig\\'" . utf-8-undecided) ("/#[^/]+#\\'" . utf-8-emacs-unix)) "Alist of filename patterns vs corresponding coding systems. Each element looks like (REGEXP . CODING-SYSTEM). commit 4cc42911ed024a61f965dea71d37002afee3e49c Author: Sean Whitton Date: Mon Nov 24 16:04:42 2025 +0000 Persist Log View mode marks across buffer revert * lisp/vc/log-view.el (vc-exec-after): Autoload. (log-view--restore-marks): New function. (log-view-mode): Add it to revert-buffer-restore-functions. diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index 8a0013dc9d2..46199370cfc 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -117,6 +117,8 @@ (autoload 'vc--pick-or-revert "vc") (autoload 'vc--remove-revisions-from-end "vc") (autoload 'vc--prompt-other-working-tree "vc") +(autoload 'vc-exec-after "vc-dispatcher") +(eval-when-compile (require 'vc-dispatcher)) (defvar cvs-minor-wrap-function) (defvar cvs-force-command) @@ -276,6 +278,8 @@ The match group number 1 should match the revision number itself.") (setq-local cvs-minor-wrap-function #'log-view-minor-wrap) (setq-local project-find-matching-buffer-function #'project-change-to-matching-directory) + (add-hook 'revert-buffer-restore-functions #'log-view--restore-marks + nil t) (hack-dir-local-variables-non-file-buffer)) ;;;; @@ -471,6 +475,20 @@ See `log-view-mark-entry'." (setq pos (overlay-end ov)))) marked-list))) +(defun log-view--restore-marks () + "Return a function to restore log entry marks after `revert-buffer'. +Added to `revert-buffer-restore-functions' by Log View mode." + (let ((table (make-hash-table :test #'equal))) + (dolist (mark (log-view-get-marked)) + (puthash mark t table)) + (lambda () + (vc-run-delayed + (log-view--mark-unmark (lambda () + (if (gethash (log-view-current-tag) table) + (log-view--mark-entry) + (log-view-msg-next 1))) + nil (point-min) (point-max)))))) + (defun log-view-toggle-entry-display () "If possible, expand the current Log View entry. This calls `log-view-expanded-log-entry-function' to do the work." commit e233513d28210a7aacc750a5e70fc8352b4bf12d Author: Stefan Monnier Date: Mon Nov 24 10:26:21 2025 -0500 editorconfig-core-handle.el: Fix silent misparse See https://github.com/editorconfig/editorconfig-emacs/issues/380 * lisp/editorconfig-core-handle.el (editorconfig-core-handle--parse-file): Fix regexp to not inadvertently match LF. Remove an O(N²) complexity. Use `line-number-at-pos`. * lisp/editorconfig.el (editorconfig--get-coding-system): Don't let errors propagate. diff --git a/lisp/editorconfig-core-handle.el b/lisp/editorconfig-core-handle.el index 5dd8c73d4e2..892ad61b6d3 100644 --- a/lisp/editorconfig-core-handle.el +++ b/lisp/editorconfig-core-handle.el @@ -166,10 +166,7 @@ If CONF is not found return nil." ;; nil when pattern not appeared yet, "" when pattern is empty ("[]") (pattern nil) ;; Alist of properties for current PATTERN - (props ()) - - ;; Current line num - (current-line-number 1)) + (props ())) (while (not (eobp)) (skip-chars-forward " \t\f") (cond @@ -187,7 +184,7 @@ If CONF is not found return nil." (setq props nil) (setq pattern newpattern))) - ((looking-at "\\([^=: \t][^=:]*\\)[ \t]*[=:][ \t]*\\(.*?\\)[ \t]*$") + ((looking-at "\\([^=: \n\t][^=:\n]*\\)[ \t]*[=:][ \t]*\\(.*?\\)[ \t]*$") (let ((key (downcase (string-trim (match-string 1)))) (value (match-string 2))) (if pattern @@ -197,12 +194,10 @@ If CONF is not found return nil." top-props)))) (t (error "Error while reading config file: %s:%d:\n %s\n" - conf current-line-number + conf (line-number-at-pos) (buffer-substring-no-properties (line-beginning-position) (line-end-position))))) - (setq current-line-number (1+ current-line-number)) - (goto-char (point-min)) - (forward-line (1- current-line-number))) + (forward-line 1)) (when pattern (push (make-editorconfig-core-handle-section :name pattern diff --git a/lisp/editorconfig.el b/lisp/editorconfig.el index 04c7314369d..42ff3038b92 100644 --- a/lisp/editorconfig.el +++ b/lisp/editorconfig.el @@ -658,17 +658,21 @@ F is that function, and FILENAME and ARGS are arguments passed to F." "Return the coding system to use according to EditorConfig. Meant to be used on `auto-coding-functions'." (defvar auto-coding-file-name) ;; Emacs≥30 - (when (and (stringp auto-coding-file-name) - (file-name-absolute-p auto-coding-file-name) - ;; Don't recurse infinitely. - (not (member auto-coding-file-name - editorconfig--getting-coding-system))) - (let* ((editorconfig--getting-coding-system - (cons auto-coding-file-name editorconfig--getting-coding-system)) - (props (editorconfig-call-get-properties-function - auto-coding-file-name))) - (editorconfig-merge-coding-systems (gethash 'end_of_line props) - (gethash 'charset props))))) + ;; Not only we don't want that an error in the `.editorconfig' file + ;; prevents opening a file but we don't want an error to be dropped on + ;; the floor by some `ignore-errors' higher up. + (with-demoted-errors "EditorConfig: %S" + (when (and (stringp auto-coding-file-name) + (file-name-absolute-p auto-coding-file-name) + ;; Don't recurse infinitely. + (not (member auto-coding-file-name + editorconfig--getting-coding-system))) + (let* ((editorconfig--getting-coding-system + (cons auto-coding-file-name editorconfig--getting-coding-system)) + (props (editorconfig-call-get-properties-function + auto-coding-file-name))) + (editorconfig-merge-coding-systems (gethash 'end_of_line props) + (gethash 'charset props)))))) (defun editorconfig--get-dir-local-variables () "Return the directory local variables specified via EditorConfig. commit 188ad4f9093c221d7f13308c3710f82973d8d9ad Author: Sean Whitton Date: Mon Nov 24 10:57:54 2025 +0000 ; * src/keyboard.c (read_key_sequence): Style tweaks. diff --git a/src/keyboard.c b/src/keyboard.c index 0b34edb8042..2439e61a63e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -11233,8 +11233,8 @@ read_key_sequence (Lisp_Object *keybuf, Lisp_Object prompt, { if (FIXNUMP (key) && XFIXNUM (key) != -2) { - /* If interrupted while initializing terminal, we - need to replay the interrupting key. + /* If interrupted while initializing terminal, + we need to replay the interrupting key. There may also have been a current buffer change we would otherwise miss. See bug#5095, bug#37782, bug#79513. */ @@ -11246,9 +11246,7 @@ read_key_sequence (Lisp_Object *keybuf, Lisp_Object prompt, keybuf[0] = key; } else - { - mock_input = 0; - } + mock_input = 0; } goto replay_entire_sequence; } commit 1f2a161f93c4e192d9dee02319227ed319360f07 Author: Stephen Gildea Date: Sun Nov 23 18:30:41 2025 -0800 ; * lisp/time-stamp.el: Reformat some doc strings. diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el index 0fbf9246d22..58b4a75fb21 100644 --- a/lisp/time-stamp.el +++ b/lisp/time-stamp.el @@ -116,7 +116,8 @@ limit yourself to the formats recommended by that older version." (defcustom time-stamp-active t "Non-nil enables time-stamping of buffers by \\[time-stamp]. -Can be toggled by \\[time-stamp-toggle-active]. +Can be toggled by \\[time-stamp-toggle-active] as an easy way to +temporarily disable time-stamp while saving a file. This option does not affect when `time-stamp' is run, only what it does when it runs. To activate automatic time-stamping of buffers @@ -142,8 +143,10 @@ otherwise would have been updated." (defcustom time-stamp-time-zone nil - "The time zone to be used by \\[time-stamp]. -Its format is that of the ZONE argument of the `format-time-string' function." + "The time zone used by \\[time-stamp]. t uses UTC. +nil (the default) uses local time, and t or \"UTC0\" uses +Coordinated Universal Time (UTC). For other possible values, +see the documentation of the ZONE argument of `format-time-string'." :type '(choice (const :tag "Emacs local time" nil) (const :tag "Universal Time" t) (const :tag "system wall clock time" wall) @@ -158,7 +161,7 @@ Its format is that of the ZONE argument of the `format-time-string' function." ;;;###autoload (defun time-stamp-zone-type-p (zone) - "Return non-nil if ZONE is of the correct type for a timezone rule. + "Return non-nil if ZONE looks like a valid timezone rule. Valid ZONE values are described in the documentation of `format-time-string'." (or (memq zone '(nil t wall)) (stringp zone) @@ -171,17 +174,17 @@ Valid ZONE values are described in the documentation of `format-time-string'." ;;; Do not change time-stamp-line-limit, time-stamp-start, ;;; time-stamp-end, time-stamp-pattern, time-stamp-inserts-lines, -;;; or time-stamp-count in your .emacs or you will be incompatible -;;; with other people's files! If you must change them, do so only -;;; in the local variables section of the file itself. +;;; or time-stamp-count in your init file or you will be incompatible +;;; with other people's files. It is fine to change these variables +;;; in the local variables list of the file itself. (defvar time-stamp-line-limit 8 ;Do not change! - "Lines of a file searched; positive counts from start, negative from end. -The patterns `time-stamp-start' and `time-stamp-end' must be found in -the first (last) `time-stamp-line-limit' lines of the file for the -file to be time-stamped by \\[time-stamp]. A value of 0 searches the -entire buffer (use with care). + "Lines searched; positive counts from start, negative from end. +The patterns `time-stamp-start' and `time-stamp-end' must be found +in the first (last) `time-stamp-line-limit' lines of the file for +\\[time-stamp] to update the region between them with the current +time stamp. A value of 0 searches the entire buffer (use with care). It may be more convenient to use `time-stamp-pattern' if you set more than one of `time-stamp-line-limit', `time-stamp-start', `time-stamp-end', @@ -262,7 +265,7 @@ with other people's files.") (defvar time-stamp-pattern nil ;Do not change! - "Convenience variable setting all `time-stamp' location and format values. + "Shorthand variable for `time-stamp' location and format values. This string has four parts, each of which is optional. These four parts override `time-stamp-line-limit', `time-stamp-start', `time-stamp-format' and `time-stamp-end', respectively. See the @@ -418,7 +421,7 @@ to customize the information in the time stamp and where it is written." (defun time-stamp-once (start search-limit ts-start ts-end ts-format format-lines end-lines) - "Update one time stamp. Internal routine called by \\[time-stamp]. + "Update one time stamp. Internal routine called by `time-stamp'. Returns the end point, which is where `time-stamp' begins the next search." (let ((case-fold-search nil) (end nil) @@ -489,8 +492,10 @@ Returns the end point, which is where `time-stamp' begins the next search." ;;;###autoload (defun time-stamp-toggle-active (&optional arg) - "Toggle `time-stamp-active', setting whether \\[time-stamp] updates a buffer. -With ARG, turn time stamping on if and only if ARG is positive." + "Set `time-stamp-active' (whether \\[time-stamp] updates a buffer). +If ARG is unset, toggle `time-stamp-active'. With an arg, set +`time-stamp-active' to t (turning on time stamping) if +ARG is positive, otherwise nil." (interactive "P") (setq time-stamp-active (if (null arg) @@ -504,7 +509,7 @@ Internal helper used by `time-stamp-string-preprocess'." (format-time-string format time time-stamp-time-zone)) (defun time-stamp-string (&optional ts-format time) - "Return the current time and other info formatted for \\[time-stamp]. + "Return the time, date and other info formatted for `time-stamp'. Optional first argument TS-FORMAT gives the format to use; it defaults to the value of `time-stamp-format'. Thus, with no arguments, this function returns the string `time-stamp' would use to update @@ -798,9 +803,9 @@ and all `time-stamp-format' compatibility." (defun time-stamp-do-letter-case (change-is-downcase upcase title-case change-case text) - "Apply upper- and lower-case conversions to TEXT according to the flags. -CHANGE-IS-DOWNCASE non-nil indicates that modifier CHANGE-CASE requests -lowercase, otherwise the modifier requests uppercase. + "Apply upper- and lower-case conversions to TEXT per the flags. +CHANGE-IS-DOWNCASE non-nil indicates that modifier CHANGE-CASE +requests lowercase, otherwise the modifier requests uppercase. UPCASE is non-nil if the \"^\" modifier is active. TITLE-CASE is non-nil if the \"*\" modifier is active. CHANGE-CASE is non-nil if the \"#\" modifier is active. @@ -819,7 +824,8 @@ This is an internal helper for `time-stamp-string-preprocess'." text))) (defun time-stamp-do-number (format-char colon-count field-width time) - "Handle compatible FORMAT-CHAR where only default width/padding will change. + "Handle a FORMAT-CHAR mostly compatible with `format-time-string'. +The default width/padding may be different from `format-time-string'. COLON-COUNT is non-0 if \":\" was specified. FIELD-WIDTH is the string width specification or \"\". TIME is the time to convert. This is an internal helper for `time-stamp-string-preprocess'." @@ -829,8 +835,9 @@ This is an internal helper for `time-stamp-string-preprocess'." (string-to-number (time-stamp--format format-string time))))) (defun time-stamp-filtered-buffer-file-name (type) - "Return the buffer file name, but with non-graphic characters replaced by ?. -TYPE is :absolute for the full name or :nondirectory for base name only." + "Return a printable string representing the buffer file name. +Non-graphic characters are replaced by ?. TYPE is :absolute +for the full name or :nondirectory for base name only." (declare (ftype (function ((member :absolute :nondirectory)) string))) (let ((file-name buffer-file-name) (safe-character-filter @@ -850,11 +857,18 @@ TYPE is :absolute for the full name or :nondirectory for base name only." (defvar time-stamp-conversion-warn t - "Enable warnings about soon-to-be-unsupported forms in `time-stamp-format'. -If nil, these warnings are disabled, which would be a bad idea! -You really need to update your files instead. - -The new formats will work with old versions of Emacs. + "Enable warnings for old formats in `time-stamp-format'. +When non-nil, `time-stamp' warns about unstable and +soon-to-be-changing conversions found in that buffer's +`time-stamp-format' value. The warning is displayed only +when a buffer's time-stamp is updated; merely viewing a file +does not warn. + +If nil, these warnings are disabled, which would be a bad idea. +Since you are changing your file anyway, please make one more +change and update its local variables list. + +The recommended replacements will work with old versions of Emacs. New formats are being recommended now to allow `time-stamp-format' to change in the future to be compatible with `format-time-string'. The new formats being recommended now will continue to work then.") @@ -880,7 +894,7 @@ This is an internal function called by `time-stamp'." (cond (standard-format (concat - "Conversions that are changing are ambiguous and should be replaced by\n" + "Conversions that are changing are ambiguous and are best replaced by\n" "stable conversions that make your intention clear.\n"))) "\n" "The following obsolescent `time-stamp-format' conversion(s) were found:\n\n"))))) diff --git a/test/lisp/time-stamp-tests.el b/test/lisp/time-stamp-tests.el index 45593db0ed6..4aecb4e80f9 100644 --- a/test/lisp/time-stamp-tests.el +++ b/test/lisp/time-stamp-tests.el @@ -745,6 +745,7 @@ This is a separate function so it can have an `ert-explainer' property." "Test that our variables are known to be safe local variables." (should (safe-local-variable-p 'time-stamp-format "a string")) (should-not (safe-local-variable-p 'time-stamp-format '(a list))) + (should (safe-local-variable-p 'time-stamp-time-zone t)) (should (safe-local-variable-p 'time-stamp-time-zone "a string")) (should-not (safe-local-variable-p 'time-stamp-time-zone 0.5)) (should (safe-local-variable-p 'time-stamp-line-limit -10)) commit 860996afb0094c33499b006f92b917957e4333a1 Author: Po Lu Date: Mon Nov 24 10:19:56 2025 +0800 ; * src/gtkutil.c (xg_update_dark_mode_for_all_displays): Typo. diff --git a/src/gtkutil.c b/src/gtkutil.c index b30f120b863..a8e65f7cb0f 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -1480,7 +1480,7 @@ xg_update_dark_mode_for_all_displays (bool dark_mode_p) struct input_event inev; EVENT_INIT (inev); inev.kind = TOOLKIT_THEME_CHANGED_EVENT; - inev.arg = msg.msg.wParam ? Qdark : Qlight; + inev.arg = dark_mode_p ? Qdark : Qlight; kbd_buffer_store_event (&inev); } } commit 7550791287503ebc582c92841f6483032aa0b050 Author: Po Lu Date: Mon Nov 24 10:16:21 2025 +0800 Support `toolkit-theme-set-functions' on Android and execute hooks safely * java/org/gnu/emacs/EmacsNative.java (setEmacsParams): New arg UIMODE. (sendConfigurationChanged): New args DETAIL and UI_MODE. * java/org/gnu/emacs/EmacsNoninteractive.java (main1): Provide an undefined UI mode. * java/org/gnu/emacs/EmacsService.java (EmacsService): New field uiMode. (onCreate): Initialize this field at start-up and provide the same to setEmacsParams. (onConfigurationChanged): If the UI mode has been altered, generate a configuration changed event to match. * src/android.c (android_ui_mode): New variable. (setEmacsParams): New argument UI_MODE. Initialize the same from this variable. * src/androidgui.h (enum android_configuration_changed): New enum. (struct android_configuration_changed_event): New field `DETAIL'. Convert fields providing specifics into a union of display density information and a UI mode integer. * src/androidterm.c (handle_one_android_event): Handle both manners of configuration change events. (android_term_init): Initialize Vtoolkit_theme from UI mode provided at start-up. * src/frame.c (syms_of_frame): Always define Vtoolkit_theme. Define Qtoolkit_theme_set_functions. * src/gtkutil.c (xg_update_dark_mode_for_all_displays): * src/w32term.c (w32_read_socket): Generate special toolkit theme events, rather than executing hooks directly within the read_socket callback. * src/keyboard.c (kbd_buffer_get_event) : Run Qtoolkit_theme_set_functions and set Vtoolkit_theme from event->ie.arg. * src/termhooks.h (enum event_kind): New event TOOLKIT_THEME_CHANGED_EVENT. diff --git a/etc/NEWS b/etc/NEWS index 73335113180..7d132356484 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -3573,10 +3573,10 @@ automatically toggling between them. --- *** 'toolkit-theme-set-functions' called when the toolkit theme is set for Emacs. -When the theme is set on PGTK or MS-Windows builds, +When the theme is set on PGTK, Android, or MS-Windows systems, 'toolkit-theme-set-functions' is called. The result is stored in the variable 'toolkit-theme' as either symbol 'dark' or 'light', but may be -expanded to future toolkit-specific symbols in the future. +extended to encompass other toolkit-specific symbols in the future. * Changes in Emacs 31.1 on Non-Free Operating Systems diff --git a/java/org/gnu/emacs/EmacsNative.java b/java/org/gnu/emacs/EmacsNative.java index 49a21ce1c4d..fac4b6f01df 100644 --- a/java/org/gnu/emacs/EmacsNative.java +++ b/java/org/gnu/emacs/EmacsNative.java @@ -61,6 +61,9 @@ public final class EmacsNative scaledDensity is the DPI value used to translate point sizes to pixel sizes when loading fonts. + uiMode holds the bits of the system's UI mode specification + defining the active system theme. + classPath must be the classpath of this app_process process, or NULL. @@ -74,6 +77,7 @@ public static native void setEmacsParams (AssetManager assetManager, float pixelDensityX, float pixelDensityY, float scaledDensity, + int uiMode, String classPath, EmacsService emacsService, int apiLevel); @@ -197,8 +201,9 @@ public static native long sendDndText (long window, int x, int y, public static native void sendNotificationAction (String tag, String action); /* Send an ANDROID_CONFIGURATION_CHANGED event. */ - public static native void sendConfigurationChanged (float dpiX, float dpiY, - float dpiScaled); + public static native void sendConfigurationChanged (int detail, float dpiX, + float dpiY, float dpiScaled, + int ui_mode); /* Return the file name associated with the specified file descriptor, or NULL if there is none. */ diff --git a/java/org/gnu/emacs/EmacsNoninteractive.java b/java/org/gnu/emacs/EmacsNoninteractive.java index 83ef04b1cf1..b4d055ce4c9 100644 --- a/java/org/gnu/emacs/EmacsNoninteractive.java +++ b/java/org/gnu/emacs/EmacsNoninteractive.java @@ -67,7 +67,7 @@ public final class EmacsNoninteractive cacheDir = context.getCacheDir ().getCanonicalPath (); EmacsNative.setEmacsParams (assets, filesDir, libDir, cacheDir, 0.0f, - 0.0f, 0.0f, null, null, + 0.0f, 0.0f, 0x0, null, null, Build.VERSION.SDK_INT); /* Now find the dump file that Emacs should use, if it has already diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 3630329839f..d141f6f4d0d 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -150,6 +150,10 @@ public final class EmacsService extends Service consulted for font scaling. */ private double dpiX, dpiY, dpiScaled; + /* The display's previously observed UI mode as it relates to the + system theme. */ + private int uiMode; + static { servicingQuery = new AtomicInteger (); @@ -240,6 +244,7 @@ public final class EmacsService extends Service float tempScaledDensity; Resources resources; DisplayMetrics metrics; + Configuration configuration; super.onCreate (); @@ -254,6 +259,8 @@ public final class EmacsService extends Service tempScaledDensity = ((getScaledDensity (metrics) / metrics.density) * pixelDensityX); + configuration = resources.getConfiguration (); + uiMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; resolver = getContentResolver (); mainThread = Thread.currentThread (); @@ -311,7 +318,8 @@ invocation of app_process (through android-emacs) can EmacsNative.setEmacsParams (manager, filesDir, libDir, cacheDir, pixelDensityX, pixelDensityY, scaledDensity, - classPath, EmacsService.this, + uiMode, classPath, + EmacsService.this, Build.VERSION.SDK_INT); } }, extraStartupArguments); @@ -375,8 +383,14 @@ invocation of app_process (through android-emacs) can dpiX = pixelDensityX; dpiY = pixelDensityY; dpiScaled = scaledDensity; - EmacsNative.sendConfigurationChanged (pixelDensityX, pixelDensityY, - scaledDensity); + EmacsNative.sendConfigurationChanged (0, pixelDensityX, pixelDensityY, + scaledDensity, 0); + } + + if ((newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) != uiMode) + { + uiMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK; + EmacsNative.sendConfigurationChanged (1, 0.0f, 0.0f, 0.0f, uiMode); } super.onConfigurationChanged (newConfig); diff --git a/src/android.c b/src/android.c index 6cc416063f6..5f2f2e35239 100644 --- a/src/android.c +++ b/src/android.c @@ -163,6 +163,9 @@ double android_pixel_density_x, android_pixel_density_y; font sizes. */ double android_scaled_pixel_density; +/* The display's current UI mode. */ +int android_ui_mode; + /* The Android application data directory. */ static char *android_files_dir; @@ -1476,6 +1479,7 @@ NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object, jfloat pixel_density_x, jfloat pixel_density_y, jfloat scaled_density, + jint ui_mode, jobject class_path, jobject emacs_service_object, jint api_level) @@ -1501,6 +1505,7 @@ NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object, android_pixel_density_x = pixel_density_x; android_pixel_density_y = pixel_density_y; android_scaled_pixel_density = scaled_density; + android_ui_mode = ui_mode; __android_log_print (ANDROID_LOG_INFO, __func__, "Initializing "PACKAGE_STRING"...\nPlease report bugs to " @@ -2821,8 +2826,9 @@ NATIVE_NAME (sendNotificationAction) (JNIEnv *env, jobject object, JNIEXPORT jlong JNICALL NATIVE_NAME (sendConfigurationChanged) (JNIEnv *env, jobject object, - jfloat dpi_x, jfloat dpi_y, - jfloat dpi_scaled) + int detail, jfloat dpi_x, + jfloat dpi_y, jfloat dpi_scaled, + int ui_mode) { JNI_STACK_ALIGNMENT_PROLOGUE; @@ -2831,9 +2837,24 @@ NATIVE_NAME (sendConfigurationChanged) (JNIEnv *env, jobject object, event.config.type = ANDROID_CONFIGURATION_CHANGED; event.config.serial = ++event_serial; event.config.window = ANDROID_NONE; - event.config.dpi_x = dpi_x; - event.config.dpi_y = dpi_y; - event.config.dpi_scaled = dpi_scaled; + event.config.detail = detail; + + switch (detail) + { + case ANDROID_PIXEL_DENSITY_CHANGED: + event.config.u.pixel_density.dpi_x = dpi_x; + event.config.u.pixel_density.dpi_y = dpi_y; + event.config.u.pixel_density.dpi_scaled = dpi_scaled; + break; + + case ANDROID_UI_MODE_CHANGED: + event.config.u.ui_mode = ui_mode; + break; + + default: + emacs_abort (); + } + android_write_event (&event); return event_serial; } diff --git a/src/android.h b/src/android.h index 1a12c95c9a5..fa94386a05e 100644 --- a/src/android.h +++ b/src/android.h @@ -102,6 +102,7 @@ extern ssize_t android_readlinkat (int, const char *restrict, char *restrict, extern double android_pixel_density_x, android_pixel_density_y; extern double android_scaled_pixel_density; +extern int android_ui_mode; static_assert (sizeof (android_handle) == sizeof (jobject)); #define android_resolve_handle(handle) ((jobject) (handle)) diff --git a/src/androidgui.h b/src/androidgui.h index b09d5eaabce..9b46f7120d7 100644 --- a/src/androidgui.h +++ b/src/androidgui.h @@ -596,6 +596,17 @@ struct android_notification_event size_t length; }; +enum android_configuration_change_type + { + ANDROID_PIXEL_DENSITY_CHANGED, + ANDROID_UI_MODE_CHANGED, + }; + +#define UI_MODE_NIGHT_MASK 0x00000030 +#define UI_MODE_NIGHT_NO 0x00000010 +#define UI_MODE_NIGHT_YES 0x00000020 +#define UI_MODE_NIGHT_UNDEFINED 0x00000000 + struct android_configuration_changed_event { /* Type of the event. */ @@ -607,13 +618,23 @@ struct android_configuration_changed_event /* The window that gave rise to the event (None). */ android_window window; - /* The density of the display along the horizontal and vertical - axes. */ - double dpi_x, dpi_y; + /* What type of change this event represents. */ + enum android_configuration_change_type detail; + + union { + struct { + /* The density of the display along the horizontal and vertical + axes. */ + double dpi_x, dpi_y; + + /* The density to take into account when converting between point + and pixel dimensions. */ + double dpi_scaled; + } pixel_density; - /* The density to take into account when converting between point and - pixel dimensions. */ - double dpi_scaled; + /* A change in the reported user interface UI mode. */ + int ui_mode; + } u; }; union android_event diff --git a/src/androidterm.c b/src/androidterm.c index beab3406fdd..d9830e5cd08 100644 --- a/src/androidterm.c +++ b/src/androidterm.c @@ -1825,19 +1825,32 @@ handle_one_android_event (struct android_display_info *dpyinfo, goto OTHER; case ANDROID_CONFIGURATION_CHANGED: - /* Update the display configuration from the event. */ - dpyinfo->resx = event->config.dpi_x; - dpyinfo->resy = event->config.dpi_y; - dpyinfo->font_resolution = event->config.dpi_scaled; -#ifdef notdef - __android_log_print (ANDROID_LOG_VERBOSE, __func__, - "New display configuration: " - "resx = %.2f resy = %.2f font_resolution = %.2f", - dpyinfo->resx, dpyinfo->resy, dpyinfo->font_resolution); + + if (event->config.detail == ANDROID_PIXEL_DENSITY_CHANGED) + { + /* Update the display configuration from the event. */ + dpyinfo->resx = event->config.u.pixel_density.dpi_x; + dpyinfo->resy = event->config.u.pixel_density.dpi_y; + dpyinfo->font_resolution + = event->config.u.pixel_density.dpi_scaled; +#if notdef + __android_log_print (ANDROID_LOG_VERBOSE, __func__, + "New display configuration: " + "resx = %.2f resy = %.2f font_resolution = %.2f", + dpyinfo->resx, dpyinfo->resy, dpyinfo->font_resolution); #endif /* notdef */ - inev.ie.kind = CONFIG_CHANGED_EVENT; - inev.ie.frame_or_window = XCAR (dpyinfo->name_list_element); - inev.ie.arg = Qfont_render; + inev.ie.kind = CONFIG_CHANGED_EVENT; + inev.ie.frame_or_window = XCAR (dpyinfo->name_list_element); + inev.ie.arg = Qfont_render; + } + else if (event->config.detail == ANDROID_UI_MODE_CHANGED) + { + android_ui_mode = event->config.u.ui_mode; + inev.ie.kind = TOOLKIT_THEME_CHANGED_EVENT; + inev.ie.arg = (android_ui_mode == UI_MODE_NIGHT_YES + ? Qdark : Qlight); + } + goto OTHER; default: @@ -6753,6 +6766,8 @@ android_term_init (void) dpyinfo->resx = android_pixel_density_x; dpyinfo->resy = android_pixel_density_y; dpyinfo->font_resolution = android_scaled_pixel_density; + Vtoolkit_theme = (android_ui_mode == UI_MODE_NIGHT_YES + ? Qdark : Qlight); #endif /* !ANDROID_STUBIFY */ /* https://lists.gnu.org/r/emacs-devel/2015-11/msg00194.html */ diff --git a/src/frame.c b/src/frame.c index 65900665dd5..5aad8f890dc 100644 --- a/src/frame.c +++ b/src/frame.c @@ -7619,16 +7619,15 @@ The default is \\+`inhibit' in NS builds and nil everywhere else. */); #endif /* !HAVE_EXT_TOOL_BAR || USE_GTK */ #endif /* HAVE_WINDOW_SYSTEM */ -#if (defined(HAVE_PGTK) && defined(HAVE_GSETTINGS)) || defined (WINDOWSNT) DEFVAR_LISP ("toolkit-theme", Vtoolkit_theme, doc: /* The current toolkit theme. Either the symbol `light' or the symbol `dark', reflecting the system's current theme preference. This variable is updated automatically when the system theme changes. -This variable is only available on PGTK and MS-Windows builds. */); +This variable is only set on PGTK, Android, and MS-Windows builds. */); Vtoolkit_theme = Qnil; DEFSYM (Qlight, "light"); DEFSYM (Qdark, "dark"); -#endif + DEFSYM (Qtoolkit_theme_set_functions, "toolkit-theme-set-functions"); } diff --git a/src/gtkutil.c b/src/gtkutil.c index 5e9e8254506..b30f120b863 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -1476,15 +1476,13 @@ xg_update_dark_mode_for_all_displays (bool dark_mode_p) xg_set_gtk_theme_dark_mode (dark_mode_p, settings); } - Vtoolkit_theme = dark_mode_p ? Qdark : Qlight; - Lisp_Object hook = intern ("toolkit-theme-set-functions"); - if (!NILP (Fboundp (hook))) - { - Lisp_Object args[2]; - args[0] = hook; - args[1] = Vtoolkit_theme; - Frun_hook_with_args (2, args); - } + { + struct input_event inev; + EVENT_INIT (inev); + inev.kind = TOOLKIT_THEME_CHANGED_EVENT; + inev.arg = msg.msg.wParam ? Qdark : Qlight; + kbd_buffer_store_event (&inev); + } } /* Set initial dark mode for a new frame (called during frame diff --git a/src/keyboard.c b/src/keyboard.c index 6c01811c2d8..0b34edb8042 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -4242,6 +4242,15 @@ kbd_buffer_get_event (KBOARD **kbp, } #endif /* HAVE_ANDROID */ + case TOOLKIT_THEME_CHANGED_EVENT: + kbd_fetch_ptr = next_kbd_event (event); + input_pending = readable_events (0); + + Vtoolkit_theme = event->ie.arg; + CALLN (Frun_hook_with_args, Qtoolkit_theme_set_functions, + event->ie.arg); + break; + #ifdef HAVE_EXT_MENU_BAR case MENU_BAR_ACTIVATE_EVENT: { diff --git a/src/termhooks.h b/src/termhooks.h index a77ca25e159..e688ed40c0f 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -341,6 +341,10 @@ enum event_kind which the monitors changed. */ , MONITORS_CHANGED_EVENT + /* In a TOOLKIT_THEME_CHANGED_EVENT, .arg is the value to which the + toolkit theme was altered. */ + , TOOLKIT_THEME_CHANGED_EVENT + #ifdef HAVE_HAIKU /* In a NOTIFICATION_CLICKED_EVENT, .arg is an integer identifying the notification that was clicked. */ diff --git a/src/w32term.c b/src/w32term.c index 56e1fca9333..9387cc3e7b7 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -6085,15 +6085,8 @@ w32_read_socket (struct terminal *terminal, case WM_EMACS_SET_TOOLKIT_THEME: { - Vtoolkit_theme = msg.msg.wParam ? Qdark : Qlight; - Lisp_Object hook = intern ("toolkit-theme-set-functions"); - if (!NILP (Fboundp (hook))) - { - Lisp_Object args[2]; - args[0] = hook; - args[1] = Vtoolkit_theme; - Frun_hook_with_args (2, args); - } + inev.kind = TOOLKIT_THEME_CHANGED_EVENT; + inev.arg = msg.msg.wParam ? Qdark : Qlight; } break; commit 435c3948a477a3e24af9cd866584c4e0f41f86b9 Author: Stephen Gildea Date: Sun Nov 23 18:11:18 2025 -0800 ; * lisp/time-stamp.el: Minor code changes autoloads: quote function names with #' (time-stamp-filtered-buffer-file-name): 'member' -> 'memq' (time-stamp-conv-warn): don't call the formats "forms". diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el index 2a6079a9fa2..0fbf9246d22 100644 --- a/lisp/time-stamp.el +++ b/lisp/time-stamp.el @@ -111,7 +111,7 @@ If your files might be edited by older versions of Emacs also, you should limit yourself to the formats recommended by that older version." :type 'string :version "31.1") -;;;###autoload(put 'time-stamp-format 'safe-local-variable 'stringp) +;;;###autoload(put 'time-stamp-format 'safe-local-variable #'stringp) (defcustom time-stamp-active t @@ -153,7 +153,7 @@ Its format is that of the ZONE argument of the `format-time-string' function." (string :tag "Time zone abbreviation")) (integer :tag "Offset (seconds east of UTC)")) :version "20.1") -;;;###autoload(put 'time-stamp-time-zone 'safe-local-variable 'time-stamp-zone-type-p) +;;;###autoload(put 'time-stamp-time-zone 'safe-local-variable #'time-stamp-zone-type-p) ;;;###autoload @@ -191,7 +191,7 @@ These variables are best changed with file-local variables. If you were to change `time-stamp-line-limit', `time-stamp-start', `time-stamp-end', or `time-stamp-pattern' in your init file, you would be incompatible with other people's files.") -;;;###autoload(put 'time-stamp-line-limit 'safe-local-variable 'integerp) +;;;###autoload(put 'time-stamp-line-limit 'safe-local-variable #'integerp) (defvar time-stamp-start "Time-stamp:[ \t]+\\\\?[\"<]+" ;Do not change! @@ -205,7 +205,7 @@ These variables are best changed with file-local variables. If you were to change `time-stamp-line-limit', `time-stamp-start', `time-stamp-end', or `time-stamp-pattern' in your init file, you would be incompatible with other people's files.") -;;;###autoload(put 'time-stamp-start 'safe-local-variable 'stringp) +;;;###autoload(put 'time-stamp-start 'safe-local-variable #'stringp) (defvar time-stamp-end "\\\\?[\">]" ;Do not change! @@ -228,7 +228,7 @@ These variables are best changed with file-local variables. If you were to change `time-stamp-line-limit', `time-stamp-start', `time-stamp-end', `time-stamp-pattern', or `time-stamp-inserts-lines' in your init file, you would be incompatible with other people's files.") -;;;###autoload(put 'time-stamp-end 'safe-local-variable 'stringp) +;;;###autoload(put 'time-stamp-end 'safe-local-variable #'stringp) (defvar time-stamp-inserts-lines nil ;Do not change! @@ -244,7 +244,7 @@ for generating repeated time stamps. These variables are best changed with file-local variables. If you were to change `time-stamp-end' or `time-stamp-inserts-lines' in your init file, you would be incompatible with other people's files.") -;;;###autoload(put 'time-stamp-inserts-lines 'safe-local-variable 'booleanp) +;;;###autoload(put 'time-stamp-inserts-lines 'safe-local-variable #'booleanp) (defvar time-stamp-count 1 ;Do not change! @@ -313,7 +313,7 @@ in-depth examples. See also `time-stamp-count' and `time-stamp-inserts-lines'.") -;;;###autoload(put 'time-stamp-pattern 'safe-local-variable 'stringp) +;;;###autoload(put 'time-stamp-pattern 'safe-local-variable #'stringp) @@ -838,7 +838,7 @@ TYPE is :absolute for the full name or :nondirectory for base name only." (let ((category (get-char-code-property chr 'general-category))) (if (or ;; Letter, Mark, Number, Punctuation, or Symbol - (member (aref (symbol-name category) 0) '(?L ?M ?N ?P ?S)) + (memq (aref (symbol-name category) 0) '(?L ?M ?N ?P ?S)) ;; spaces of various widths, but not ctrl chars like CR or LF (eq category 'Zs)) chr @@ -857,14 +857,15 @@ You really need to update your files instead. The new formats will work with old versions of Emacs. New formats are being recommended now to allow `time-stamp-format' to change in the future to be compatible with `format-time-string'. -The new forms being recommended now will continue to work then.") +The new formats being recommended now will continue to work then.") -(defun time-stamp-conv-warn (old-form new-form &optional standard-form) +(defun time-stamp-conv-warn (old-format new-format &optional standard-format) "Display a warning about a soon-to-be-obsolete format. -Suggests replacing OLD-FORM with NEW-FORM (same effect, but stable) -or (if provided) STANDARD-FORM (the effect the user may have expected -if they didn't read the documentation)." +Suggests replacing OLD-FORMAT with NEW-FORMAT (same effect, but stable) +or (if provided) STANDARD-FORMAT (the effect the user may have expected +if they didn't read the documentation). +This is an internal function called by `time-stamp'." (cond (time-stamp-conversion-warn (with-current-buffer (get-buffer-create "*Time-stamp-compatibility*") @@ -877,15 +878,15 @@ if they didn't read the documentation)." "The conversions recognized in `time-stamp-format' will change in a future\n" "release to be more compatible with the function `format-time-string'.\n" (cond - (standard-form + (standard-format (concat "Conversions that are changing are ambiguous and should be replaced by\n" "stable conversions that make your intention clear.\n"))) "\n" "The following obsolescent `time-stamp-format' conversion(s) were found:\n\n"))))) - (insert old-form " -- use " new-form) - (if standard-form - (insert " or " standard-form)) + (insert old-format " -- use " new-format) + (if standard-format + (insert " or " standard-format)) (insert "\n") (help-make-xrefs)) (display-buffer "*Time-stamp-compatibility*")))) commit 11b68c6223d154b4c85e8feec63581dcf7c76a3e Author: Sean Whitton Date: Fri Nov 21 11:22:30 2025 +0000 New commands to rewind decentralized VCS branches * lisp/vc/vc.el (vc--remove-revisions-from-end): New function. (vc-uncommit-revisions-from-end, vc-delete-revisions-from-end): * lisp/vc/log-view.el (log-view-uncommit-revisions-from-end) (log-view-delete-revisions-from-end): New commands (bug#79408). (log-view-mode-map): Bind them. * doc/emacs/maintaining.texi (VC Change Log): * doc/emacs/vc1-xtra.texi (VC Auto-Reverting): * etc/NEWS: Document them. diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi index d7bd581f7fa..9f84f4e3978 100644 --- a/doc/emacs/emacs.texi +++ b/doc/emacs/emacs.texi @@ -877,6 +877,7 @@ Miscellaneous Commands and Features of VC * Editing VC Commands:: Editing the VC shell commands that Emacs will run. * Preparing Patches:: Preparing and composing patches from within VC. * VC Auto-Reverting:: Updating buffer contents after VCS operations. +* Rewinding Branches:: Commands to delete revisions from ends of branches. Customizing VC diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 147857aa836..db1e81d62e6 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -1273,6 +1273,15 @@ the revision at point, or the changes from all marked revisions @item R Undo the effects of old revisions; either the revision at point, or all marked revisions (@code{log-view-revert-or-delete-revisions}). + +@item x +Delete revisions newer than the revision at point from the current +branch without touching the working tree +(@code{log-view-uncommit-revisions-from-end}). + +@item X +Delete revisions newer than the revision at point from the current +branch (@code{log-view-delete-revisions-from-end}). @end table @vindex vc-log-show-limit diff --git a/doc/emacs/vc1-xtra.texi b/doc/emacs/vc1-xtra.texi index e020a36407b..6f1face7f40 100644 --- a/doc/emacs/vc1-xtra.texi +++ b/doc/emacs/vc1-xtra.texi @@ -21,6 +21,7 @@ * Editing VC Commands:: Editing the VC shell commands that Emacs will run. * Preparing Patches:: Preparing and composing patches from within VC. * VC Auto-Reverting:: Updating buffer contents after VCS operations. +* Rewinding Branches:: Commands to delete revisions from ends of branches. @end menu @node Change Logs and VC @@ -678,6 +679,60 @@ contents, regardless of whether Emacs initiated those operations. @xref{VC Mode Line}, for details regarding Auto Revert mode in buffers visiting tracked files (which is what @code{vc-auto-revert-mode} enables). +@node Rewinding Branches +@subsubsection Rewinding Branches +@cindex rewinding a branch (VC) + +@table @kbd +@item M-x vc-delete-revisions-from-end +Delete revisions from the end of the current branch. + +@item M-x vc-uncommit-revisions-from-end +Delete revisions from the end of the current branch without touching the +working tree. +@end table + +@findex vc-delete-revisions-from-end + For decentralized version control systems (@pxref{VCS Repositories}), +these commands provide ways to move the current branch back to an +earlier revision. @code{vc-delete-revisions-from-end} prompts for a +revision, then removes all revisions from the end of the branch up to +but not including the specified revision. We say that the branch is +@dfn{rewound} back to the specified revision. + + This command removes the changes made by the revisions from the +working tree. Therefore, if there are any uncommitted changes, they +must be reverted, first (@pxref{VC Undo}). This command will prompt you +to do that if necessary. If you supply a prefix argument, Emacs will +delete uncommitted changes without prompting. + +@cindex uncommitting revisions +@findex vc-uncommit-revisions-from-end + To ``uncommit'' a revision means to remove it from the revision +history without removing its changes from the working tree. It is as +though you had made the changes but had not yet checked them in. The +command @code{vc-uncommit-revisions-from-end} prompts for a revision, +and then uncommits all revisions from the end of the branch up to but +not including the specified revision. The branch is rewound back to the +specified revision but the changes are left behind in the working tree. + + When rewinding the current branch, if all the revisions deleted from +the revision history are among those you have pulled or pushed, then +these operations do not permanently delete anything: a simple +@w{@kbd{C-x v +}} (@pxref{Pulling / Pushing}) will bring the revisions +back. On the other hand, if there are new revisions on the end of the +branch that have not yet been pushed, then these commands will delete +them permanently. Emacs tries to detect this situation and ask you if +you are sure you want to delete them. + + Alternative ways to access this functionality are the +@code{log-view-uncommit-revisions-from-end} and +@code{log-view-delete-revisions-from-end} commands, bound to @kbd{x} and +@kbd{X}, respectively, in Log View mode buffers (@pxref{VC Change Log}). +Compared to using the commands described here directly, the Log View +mode commands can make it easier to be sure you are rewinding back to +the revision you intend. + @node Customizing VC @subsection Customizing VC diff --git a/etc/NEWS b/etc/NEWS index ff8ebe7e824..73335113180 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2393,6 +2393,13 @@ From Log View buffers, you can use 'C' to cherry-pick the revision at point or all marked revisions, and 'R' to undo the revision at point or all marked revisions. ++++ +*** New commands to rewind branches. +In Log View mode, 'x' deletes revisions newer than the revision at point +from the history of the current branch, though without undoing the +changes made by those revisions to the working tree. 'X' is similar +except that it does remove the changes from the working tree. + *** New command 'log-edit-done-strip-cvs-lines'. This command strips all lines beginning with "CVS:" from the buffer. It is intended to be added to the 'log-edit-done-hook' so that diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index d58d221a658..3e45ff045e2 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2235,7 +2235,8 @@ With a prefix argument, try to REVERSE the hunk." This command is useful in buffers generated by \\[vc-diff] and \\[vc-root-diff], especially when preparing to commit the patch with \\[vc-next-action]. -You can use \\\\[diff-hunk-kill] to temporarily remove changes that you intend to +You can use \\\\[diff-hunk-kill] \ +to temporarily remove changes that you intend to include in a separate commit or commits, and you can use this command to permanently drop changes you didn't intend, or no longer want. diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index 0419b2c077a..8a0013dc9d2 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -115,6 +115,7 @@ (autoload 'vc-find-revision "vc") (autoload 'vc-diff-internal "vc") (autoload 'vc--pick-or-revert "vc") +(autoload 'vc--remove-revisions-from-end "vc") (autoload 'vc--prompt-other-working-tree "vc") (defvar cvs-minor-wrap-function) @@ -142,7 +143,9 @@ "TAB" #'log-view-msg-next "" #'log-view-msg-prev "C" #'log-view-cherry-pick - "R" #'log-view-revert-or-delete-revisions) + "R" #'log-view-revert-or-delete-revisions + "x" #'log-view-uncommit-revisions-from-end + "X" #'log-view-delete-revisions-from-end) (easy-menu-define log-view-mode-menu log-view-mode-map "Log-View Display Menu." @@ -828,6 +831,36 @@ See also `vc-revert-or-delete-revision'." t current-prefix-arg)) (log-view--pick-or-revert directory nil t interactive delete)) +(defun log-view-uncommit-revisions-from-end () + "Uncommit revisions newer than the revision at point. +The revision at point must be on the current branch. The newer +revisions are deleted from the revision history but the changes made by +those revisions to files in the working tree are not undone. + +To delete revisions from the revision history and also undo the changes +in the working tree, see `log-edit-delete-revisions-from-end'." + (interactive) + (vc--remove-revisions-from-end (log-view-current-tag) + nil t log-view-vc-backend) + (revert-buffer)) + +(defun log-view-delete-revisions-from-end (&optional discard) + "Delete revisions newer than the revision at point. +The revision at point must be on the current branch. The newer +revisions are deleted from the revision history and the changes made by +those revisions to files in the working tree are undone. +If the are uncommitted changes, prompts to discard them. +With a prefix argument (when called from Lisp, with optional argument +DISCARD non-nil), discard any uncommitted changes without prompting. + +To delete revisions from the revision history without undoing the +changes in the working tree, see `log-edit-uncommit-revisions-from-end'." + (interactive "P") + (vc--remove-revisions-from-end (log-view-current-tag) + (if discard 'discard t) + t log-view-vc-backend) + (revert-buffer)) + ;; These are left unbound by default. A user who doesn't like the DWIM ;; behavior of `log-view-revert-or-delete-revisions' can unbind that and ;; bind these two commands instead. diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index ff7f0abd447..9b3e62d0a86 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -2429,6 +2429,92 @@ with a prefix argument." (interactive (list (vc-read-revision "Revision to delete: "))) (vc--pick-or-revert rev t nil t nil nil backend)) +(defun vc--remove-revisions-from-end (rev delete prompt backend) + "Delete revisions newer than REV. +DELETE non-nil means to remove the changes from the working tree. +DELETE `discard' means to silently discard uncommitted changes. +PROMPT non-nil means to always get confirmation. (This is passed by +`log-view-uncommit-revisions-from-end' and `log-view-delete-revisions' +because they have single-letter bindings and don't otherwise prompt, so +might be easy to use accidentally.) +BACKEND is the VC backend." + (let ((backend (or backend (vc-responsible-backend default-directory)))) + (unless (eq (vc-call-backend backend 'revision-granularity) + 'repository) + (error "Requires VCS with whole-repository revision granularity")) + (unless (vc-find-backend-function backend 'revision-published-p) + (signal 'vc-not-supported (list 'revision-published-p backend))) + ;; Rewinding the end of the branch to REV does not in itself mean + ;; rewriting public history because a subsequent pull will generally + ;; undo the rewinding. Rewinding and then making new commits before + ;; syncing with the upstream will necessitate merging, but that's + ;; just part of the normal workflow with a distributed VCS. + ;; Therefore we don't prompt about deleting published revisions (and + ;; so we ignore `vc-allow-rewriting-published-history'). + ;; We do care about deleting *unpublished* revisions, however, + ;; because that could potentially mean losing work permanently. + (when (if (vc-call-backend backend 'revision-published-p + (vc-call-backend backend + 'working-revision-symbol)) + (and prompt + (not (y-or-n-p + (format "Uncommit revisions newer than %s?" + rev)))) + ;; FIXME: Actually potentially not all revisions newer than + ;; REV would be permanently deleted -- only those which are + ;; unpushed. So this prompt is a little misleading. + (not (yes-or-no-p + (format "Permanently delete revisions newer than %s?" + rev)))) + (user-error "Aborted")) + (if delete + ;; FIXME: As discussed in bug#79408, instead of just failing if + ;; the user declines reverting the changes, we would leave + ;; behind some sort of conflict for the user to resolve, like we + ;; do when there is a merge conflict. + (let ((root (vc-root-dir))) + (when (vc-dir-status-files root nil backend) + (if (eq delete 'discard) + (vc-revert-file root) + (let ((vc-buffer-overriding-fileset `(,backend (,root)))) + (vc-revert)))) + (vc-call-backend backend 'delete-revisions-from-end rev)) + (vc-call-backend backend 'uncommit-revisions-from-end rev)))) + +;;;###autoload +(defun vc-uncommit-revisions-from-end (rev &optional backend) + "Delete revisions newer than REV without touching the working tree. +REV must be on the current branch. The newer revisions are deleted from +the revision history but the changes made by those revisions to files in +the working tree are not undone. +When called interactively, prompts for REV. +BACKEND is the VC backend. + +To delete revisions from the revision history and also undo the changes +in the working tree, see `vc-delete-revisions-from-end'." + (interactive (list + (vc-read-revision "Uncommit revisions newer than revision: "))) + (vc--remove-revisions-from-end rev nil nil backend)) + +;;;###autoload +(defun vc-delete-revisions-from-end (rev &optional discard backend) + "Delete revisions newer than REV. +REV must be on the current branch. The newer revisions are deleted from +the revision history and the changes made by those revisions to files in +the working tree are undone. +When called interactively, prompts for REV. +If the are uncommitted changes, prompts to discard them. +With a prefix argument (when called from Lisp, with optional argument +DISCARD non-nil), discard any uncommitted changes without prompting. +BACKEND is the VC backend. + +To delete revisions from the revision history without undoing the +changes in the working tree, see `vc-uncommit-revisions-from-end'." + (interactive (list + (vc-read-revision "Delete revisions newer than revision: ") + current-prefix-arg)) + (vc--remove-revisions-from-end rev (if discard 'discard t) nil backend)) + (declare-function diff-bounds-of-hunk "diff-mode") (defun vc-default-checkin-patch (_backend patch-string comment) commit dcc909917b03dc3cfb51c070b9b61fdc02d2521c Author: Ulf Jasper Date: Sun Nov 23 13:57:36 2025 +0100 Add 'newsticker--treeview-handle-url' (Bug#79849) * lisp/net/newst-treeview.el (newsticker--treeview-url-keymap) (newsticker--treeview-handle-url): Add 'newsticker--treeview-handle-url' to replace 'newsticker-handle-url' in newsticker-treeview (Bug#79849). diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el index 5239293a1e2..ed5d97cdd82 100644 --- a/lisp/net/newst-treeview.el +++ b/lisp/net/newst-treeview.el @@ -148,8 +148,6 @@ Example: (\"Topmost group\" \"feed1\" (\"subgroup1\" \"feed 2\") (defvar newsticker--treeview-feed-tree nil) (defvar newsticker--treeview-vfeed-tree nil) -(declare-function newsticker-handle-url "newst-plainview" ()) - ;; maps for the clickable portions (defvar newsticker--treeview-url-keymap (let ((map (make-sparse-keymap 'newsticker--treeview-url-keymap))) @@ -157,7 +155,7 @@ Example: (\"Topmost group\" \"feed1\" (\"subgroup1\" \"feed 2\") (define-key map [mouse-2] #'newsticker-treeview-mouse-browse-url) (define-key map "\n" #'newsticker-treeview-browse-url) (define-key map "\C-m" #'newsticker-treeview-browse-url) - (define-key map [(control return)] #'newsticker-handle-url) + (define-key map [(control return)] #'newsticker--treeview-handle-url) map) "Key map for click-able headings in the newsticker treeview buffers.") @@ -247,6 +245,19 @@ their id stays constant." "Return current node in newsticker treeview tree." (newsticker--treeview-get-node-by-id newsticker--treeview-current-node-id)) +(defun newsticker--treeview-handle-url () + "Ask for a program to open the link of the item at point." + (interactive) + (let ((url (get-text-property (point) 'nt-link))) + (when url + (let ((prog (read-string "Open url with: " nil + 'newsticker-open-url-history))) + (when prog + (message "%s %s" prog url) + (start-process prog prog prog url) + (if newsticker-automatically-mark-visited-items-as-old + (newsticker-treeview-mark-item-old))))))) + ;; ====================================================================== (declare-function w3m-toggle-inline-images "ext:w3m" (&optional force no-cache)) commit b89fec79980b0f63c244b500221faba3290b0be3 Author: Eli Zaretskii Date: Sun Nov 23 10:41:12 2025 +0200 ; * doc/emacs/package.texi (Package Installation): Minor clarification. diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi index c29beea3b08..49d7e65c5b1 100644 --- a/doc/emacs/package.texi +++ b/doc/emacs/package.texi @@ -358,6 +358,10 @@ if you want to upgrade a package, you can use the @kbd{M-x package-upgrade} command, and if you want to upgrade all the packages, you can use the @kbd{M-x package-upgrade-all} command. + Note that @code{package-install} will not suggest to install packages +that are already installed. Similarly, @code{package-upgrade} will only +suggest to upgrade packages for which a newer version is available. + @vindex package-install-upgrade-built-in By default, @code{package-install} doesn't consider built-in packages for which new versions are available from the archives. (A commit bb1f70c90180589564e1f831725c59e34013b02a Author: Eli Zaretskii Date: Sun Nov 23 10:32:18 2025 +0200 Fix 'd' command in 'query-replace' in buffers not visiting files * lisp/vc/diff.el (diff-file-local-copy): Use proper coding-system when writing a local copy of a non-file visiting buffer. * lisp/misearch.el (coding-system--for-buffer-diff): New variable. (multi-file-replace-as-diff): Bind it to 'utf-8-emacs'. (multi-file-diff-no-select): Use proper coding-system when reading output of Diff. (Bug#79761) diff --git a/lisp/misearch.el b/lisp/misearch.el index c20b75bf6f0..28cda1fcbf0 100644 --- a/lisp/misearch.el +++ b/lisp/misearch.el @@ -406,6 +406,9 @@ modified buffer to be able to use unsaved changes." (declare-function diff-setup-whitespace "diff-mode" ()) (declare-function diff-setup-buffer-type "diff-mode" ()) +(defvar coding-system--for-buffer-diff nil + "Used to pass encoding down to callees of `multi-file-diff-no-select'.") + ;;;###autoload (defun multi-file-replace-as-diff (files from-string replacements regexp-flag delimited-flag) "Show as diffs replacements of FROM-STRING with REPLACEMENTS. @@ -439,7 +442,11 @@ as in `perform-replace'." file-name (when (or (not file-exists) (eq multi-file-diff-unsaved 'use-modified-buffer)) - (find-buffer-visiting file-name))))) + (find-buffer-visiting file-name)))) + ;; Make sure any supported characters can be written to a + ;; file without asking the user to select a safe + ;; coding-system. + (coding-system--for-buffer-diff 'utf-8-emacs)) (when non-file-buffer (setq file-name (buffer-name file-name))) (when (or file-exists file-buffer) (with-temp-buffer @@ -540,7 +547,9 @@ specify labels to use for file names." (or new-alt new))))) " "))) (with-current-buffer buf - (let ((inhibit-read-only t)) + (let ((inhibit-read-only t) + (coding-system-for-read (or coding-system--for-buffer-diff + coding-system-for-read))) (insert command "\n") (call-process shell-file-name nil buf nil shell-command-switch command)) diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el index c8a1b7c0efa..9e4a5349fef 100644 --- a/lisp/vc/diff.el +++ b/lisp/vc/diff.el @@ -118,13 +118,17 @@ Non-interactively, OLD and NEW may each be a file or a buffer." (display-buffer (diff-no-select old new switches no-async))) +(defvar coding-system--for-buffer-diff) ; from misearch.el + (defun diff-file-local-copy (file-or-buf) "Like `file-local-copy' but also supports a buffer as the argument. When FILE-OR-BUF is a buffer, return the filename of a local temporary file with the buffer's contents." (if (bufferp file-or-buf) (with-current-buffer file-or-buf - (let ((tempfile (make-temp-file "buffer-content-"))) + (let ((tempfile (make-temp-file "buffer-content-")) + (coding-system-for-write (or coding-system--for-buffer-diff + coding-system-for-write))) (if diff-entire-buffers (write-region nil nil tempfile nil 'nomessage) (write-region (point-min) (point-max) tempfile nil 'nomessage)) commit 6c30c6c87d953455e55a258685b697ab531cbd25 Author: Elías Gabriel Pérez Date: Thu Nov 20 22:09:46 2025 -0600 ; hideshow: Rename 'hs--discard-overlay-after-change'. * lisp/progmodes/hideshow.el (hs--discard-overlay-after-change): Rename function and update docstring. (hs-make-overlay): Update. diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el index 9474332e269..ac0c68a0410 100644 --- a/lisp/progmodes/hideshow.el +++ b/lisp/progmodes/hideshow.el @@ -752,8 +752,8 @@ block at point." (when-let* ((block (hs-block-positions))) (apply #'hs-hideable-region-p block)))) -(defun hs--discard-overlay-after-change (o &rest _r) - "Remove overlay O after changes. +(defun hs--discard-overlay-before-changes (o &rest _r) + "Remove overlay O before changes. Intended to be used in `modification-hooks', `insert-in-front-hooks' and `insert-behind-hooks'." (let ((beg (overlay-start o)) @@ -797,9 +797,9 @@ to call with the newly initialized overlay." (overlay-put ov 'isearch-open-invisible-temporary 'hs-isearch-show-temporary)) ;; Remove overlay after modifications - (overlay-put ov 'modification-hooks '(hs--discard-overlay-after-change)) - (overlay-put ov 'insert-in-front-hooks '(hs--discard-overlay-after-change)) - (overlay-put ov 'insert-behind-hooks '(hs--discard-overlay-after-change)) + (overlay-put ov 'modification-hooks '(hs--discard-overlay-before-changes)) + (overlay-put ov 'insert-in-front-hooks '(hs--discard-overlay-before-changes)) + (overlay-put ov 'insert-behind-hooks '(hs--discard-overlay-before-changes)) (when hs-set-up-overlay (funcall hs-set-up-overlay ov)) (hs--refresh-indicators b e) commit cd86307f269de9dba9011d217517a45d6f180238 Author: Sean Whitton Date: Sat Nov 22 13:50:22 2025 +0000 vc-resynch-window: Restore always using vc-revert-buffer-internal * lisp/vc/vc-dispatcher.el (auto-revert-buffers): Delete. (vc-resynch-window): Always call vc-revert-buffer-internal. Calling auto-revert-buffers will not necessarily revert the current buffer, but we want it to happen synchronously. diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el index 17d1aef9730..bf5318a0473 100644 --- a/lisp/vc/vc-dispatcher.el +++ b/lisp/vc/vc-dispatcher.el @@ -749,8 +749,6 @@ ARG and NO-CONFIRM are passed on to `revert-buffer'." (defvar view-old-buffer-read-only) -(declare-function auto-revert-buffers "autorevert") - (defun vc-resynch-window (file &optional keep noquery reset-vc-info) "If FILE is in the current buffer, either revert or unvisit it. The choice between revert (to see expanded keywords) and unvisit @@ -768,13 +766,7 @@ editing!" ((file-exists-p file) (when reset-vc-info (vc-file-clearprops file)) - ;; If `auto-revert-mode' is on (probably due to either - ;; `global-auto-revert-mode' or `vc-auto-revert-mode') - ;; then defer to that. Otherwise we do our own - ;; VC-specific reverting. - (if (and (bound-and-true-p auto-revert-mode) noquery) - (auto-revert-buffers) - (vc-revert-buffer-internal t noquery)) + (vc-revert-buffer-internal t noquery) ;; VC operations might toggle the read-only state. In ;; that case we need to adjust the `view-mode' status commit 24c09c68dd1f20a9650c31f8d7a36922b552341d Author: Stefan Monnier Date: Sat Nov 22 08:42:39 2025 -0500 lisp/ldefs-boot.el: Update generated presumably by lisp/Makefile.in (?) diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index ad280df434d..2d6a69e1841 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -5248,8 +5248,6 @@ evaluate the variable `compilation-shell-minor-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -\\{compilation-shell-minor-mode-map} - (fn &optional ARG)" t) (autoload 'compilation-minor-mode "compile" "\ Toggle Compilation minor mode. @@ -5272,8 +5270,6 @@ evaluate the variable `compilation-minor-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. -\\{compilation-minor-mode-map} - (fn &optional ARG)" t) (autoload 'compilation-next-error-function "compile" "\ Advance to the next error message and visit the file where the error was. @@ -5791,6 +5787,16 @@ independently replaces consecutive years with a range." t) (autoload 'copyright "copyright" "\ Insert a copyright by $ORGANIZATION notice at cursor. +This is a skeleton command (see `skeleton-insert'). +Normally the skeleton text is inserted at point, with nothing \"inside\". +If there is a highlighted region, the skeleton text is wrapped +around the region text. + +A prefix argument ARG says to wrap the skeleton around the next ARG words. +A prefix argument of -1 says to wrap around region, even if not highlighted. +A prefix argument of zero says to wrap around zero words---that is, nothing. +This is a way of overriding the use of a highlighted region. + (fn &optional STR ARG)" t) (autoload 'copyright-update-directory "copyright" "\ Update copyright notice for all files in DIRECTORY matching MATCH. @@ -13455,6 +13461,8 @@ evaluate `(default-value \\='find-function-mode)'. The mode's hook is called both when the mode is enabled and when it is disabled. +\\{find-function-mode-map} + (fn &optional ARG)" t) (autoload 'find-function-setup-keys "find-func" "\ Turn on `find-function-mode', which see.") @@ -13639,8 +13647,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.") @@ -20487,13 +20493,18 @@ step during initialization. (defalias 'run-lua #'lua-start-process) (autoload 'lua-start-process "lua-mode" "\ Start a Lua process named NAME, running PROGRAM. -PROGRAM defaults to NAME, which defaults to `lua-default-application'. When called interactively, switch to the process buffer. -STARTFILE is the name of a file, whose contents are sent to the process -as its initial input. +NAME is the name of the created process; default is +`lua-process-buffer-name' or `lua-default-application'. + +PROGRAM is the executable to run; default is `lua-default-application'. -SWITCHES is a list of strings passed as arguments to PROGRAM. +STARTFILE is a file, whose contents are sent to the process as initial +input; default is `lua-process-startfile'. + +SWITCHES is a list of strings passed as arguments to PROGRAM; default is +`lua-default-command-switches'. (fn &optional NAME PROGRAM STARTFILE &rest SWITCHES)" t) (register-definition-prefixes "lua-mode" '("lua-")) @@ -21906,6 +21917,13 @@ With a prefix argument, ask for a wildcard, and search in file buffers whose file names match the specified wildcard. (fn FILES)" t) +(autoload 'multi-file-replace-as-diff "misearch" "\ +Show as diffs replacements of FROM-STRING with REPLACEMENTS. +FILES is a list of file names. Also it's possible to provide a list of +buffers in FILES. REGEXP-FLAG and DELIMITED-FLAG have the same meaning +as in `perform-replace'. + +(fn FILES FROM-STRING REPLACEMENTS REGEXP-FLAG DELIMITED-FLAG)") (autoload 'multi-file-replace-regexp-as-diff "misearch" "\ Show as diffs replacements of REGEXP with TO-STRING in FILES. DELIMITED has the same meaning as in `replace-regexp'. @@ -39863,6 +39881,7 @@ run a specific program. The program must be a member of (provide 'loaddefs) ;; Local Variables: +;; no-byte-compile: t ;; version-control: never ;; no-update-autoloads: t ;; no-native-compile: t commit 75c09b03ed5bd06dd0afd654570236b409341897 Author: Sean Whitton Date: Sat Nov 22 13:20:05 2025 +0000 Default split-window-preferred-direction to 'longest' * lisp/window.el (split-window-preferred-direction): Change default value to 'longest'. diff --git a/etc/NEWS b/etc/NEWS index 7bc247cf47d..ff8ebe7e824 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -392,10 +392,10 @@ for which you can use '(category . tex-shell)'. +++ *** New user option 'split-window-preferred-direction'. Users can now choose in which direction Emacs tries to split first: -vertical or horizontal. With this new setting, when the frame is in -landscape shape for instance, Emacs could split horizontally before -splitting vertically. The default setting preserves Emacs historical -behavior to try to split vertically first. +vertically or horizontally. The new default is to prefer to split +horizontally if the frame is landscape and vertically if it is portrait. +You can customize this option to 'vertical' to restore Emacs's old +behavior of always preferring vertical splits. +++ *** New argument INDIRECT for 'get-buffer-window-list'. diff --git a/lisp/window.el b/lisp/window.el index 702ec1de65d..af5d73d3384 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -7532,18 +7532,19 @@ hold: (* 2 (max window-min-height (if mode-line-format 2 1)))))))))) -(defcustom split-window-preferred-direction 'vertical +(defcustom split-window-preferred-direction 'longest "The first direction tried when Emacs needs to split a window. -This variable controls in which order `split-window-sensibly' will try to -split the window. That order specially matters when both dimensions of -the frame are long enough to be split according to -`split-width-threshold' and `split-height-threshold'. If this is set to -`vertical' (the default), `split-window-sensibly' tries to split -vertically first and then horizontally. If set to `horizontal' it does -the opposite. If set to `longest', the first direction tried -depends on the frame shape: in landscape orientation it will be like -`horizontal', but in portrait it will be like `vertical'. Basically, -the longest of the two dimension is split first. +This variable controls in which order `split-window-sensibly' will try +to split the window. That order specially matters when both dimensions +of the frame are long enough to be split according to +`split-width-threshold' and `split-height-threshold'. +If set to `vertical', `split-window-sensibly' tries to split vertically +first and then horizontally. +If set to `horizontal' it does the opposite. +If set to `longest' (the default), the first direction tried depends on +the frame shape: in landscape orientation it will be like `horizontal', +but in portrait it will be like `vertical'. In other words, the longest +of the two dimension is split first. If both `split-width-threshold' and `split-height-threshold' cannot be satisfied, it will fallback to split vertically. commit 54775983acac5f1f211bc43048b714f8be61c79d Author: Sean Whitton Date: Sat Nov 22 12:46:16 2025 +0000 vc-git-revision-published-p: Resolve REV * lisp/vc/vc-git.el (vc-git-revision-published-p): Resolve REV before using it, using vc-git--rev-parse. diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 6d2b1f977da..93951c04c12 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -2219,7 +2219,8 @@ This requires git 1.8.4 or later, for the \"-L\" option of \"git log\"." (defun vc-git-revision-published-p (rev) "Whether we think REV has been pushed such that it is public history. Considers only the current branch. Does not fetch." - (let ((branch (vc-git--current-branch))) + (let ((branch (vc-git--current-branch)) + (rev (vc-git--rev-parse rev))) (vc-git--assert-revision-on-branch rev branch) (and ;; BRANCH has an upstream. commit 748c3b2645e68623499e9158902a1dcf4165975e Author: Sean Whitton Date: Sat Nov 22 12:45:55 2025 +0000 New command alias vc-restore * lisp/vc/vc.el (vc-restore): New alias. * etc/NEWS: Announce it. diff --git a/etc/NEWS b/etc/NEWS index 8bf4a0ab54c..7bc247cf47d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2566,6 +2566,9 @@ View mode, copies to the kill ring the ID of the revision at point in the log entry. If there are marked revisions, it copies the IDs of those, instead. +--- +*** New command alias 'vc-restore' for 'vc-revert'. + ** Package +++ diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index eff0f7680dd..ff7f0abd447 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -4087,6 +4087,9 @@ to the working revision (except for keyword expansion)." (quit-windows-on diff-buffer (eq vc-revert-show-diff 'kill)))) (vc-revert-files backend files))) +;;;###autoload +(defalias 'vc-restore #'vc-revert) + ;;;###autoload (defun vc-pull (&optional arg) "Update the current fileset or branch. commit 46d0f1fef197f2049436a6fabca7f9e929b476a6 Author: Stefan Monnier Date: Sat Nov 22 06:52:55 2025 -0500 (loaddefs-generate--make-autoload): Fix bug#79852 As JD Smith said we had 3 paths: 1. macro has `autoload-macro expand` and is already loaded: expand 2. macro has `autoload-macro expand` but is /not/ yet loaded: shortcut 3. macro does not have `autoload-macro expand`: shortcut and the co-existence of 1 and 2 is a problem because it means that same macro is sometimes handled one way and sometimes another, with different results. Remove number 2 by removing from the shortcut all the remaining macros that have `autoload-macro expand`. The immediate effect is that `make autoloads` now (auto)loads three more files: [...] loaddefs-gen: loading file frameset (for cl-defun) Loading frameset... INFO Scraping 1547 files for loaddefs...10% INFO Scraping 1547 files for loaddefs...20% loaddefs-gen: loading file semantic/analyze (for define-overloadable-function) Loading semantic/analyze... INFO Scraping 1547 files for loaddefs...30% INFO Scraping 1547 files for loaddefs...40% INFO Scraping 1547 files for loaddefs...50% INFO Scraping 1547 files for loaddefs...60% INFO Scraping 1547 files for loaddefs...70% loaddefs-gen: loading file tramp-adb (for tramp--with-startup) Loading tramp-adb... INFO Scraping 1547 files for loaddefs...80% loaddefs-gen: loading file grep (for define-compilation-mode) Loading grep... [...] * lisp/emacs-lisp/loaddefs-gen.el (loaddefs--defining-macros): Remove macros that are marked `autoload-macro expand`, even if they are not predefined. (loaddefs-generate--make-autoload): Simplify accordingly. diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index e24452ed8ed..9db2e425ea7 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -154,9 +154,7 @@ scanning for autoloads and will be in the `load-path'." ;; they request such expansion and produce suitable output (e.g. by ;; employing :autoload-end to omit unneeded forms). (defconst loaddefs--defining-macros - '( define-compilation-mode - cl-defun defun* cl-defmacro defmacro* define-overloadable-function - transient-define-prefix transient-define-suffix transient-define-infix + '( transient-define-prefix transient-define-suffix transient-define-infix transient-define-argument transient-define-group)) (defvar loaddefs--load-error-files nil) @@ -246,17 +244,12 @@ expand)' among their `declare' forms." ;; For known special macros which define functions, use `autoload' ;; directly. ((memq car loaddefs--defining-macros) - (let* ((macrop (memq car '(defmacro cl-defmacro defmacro*))) - (name (nth 1 form)) + (let* ((name (nth 1 form)) (args (pcase car - ((or 'defun* 'defmacro* 'cl-defun 'cl-defmacro - 'define-overloadable-function - 'transient-define-prefix 'transient-define-suffix + ((or 'transient-define-prefix 'transient-define-suffix 'transient-define-infix 'transient-define-argument 'transient-define-group) (nth 2 form)) - ('define-compilation-mode - nil) (_ t))) (body (nthcdr (or (function-get car 'doc-string-elt) 3) form)) (doc (if (stringp (car body)) (pop body)))) @@ -277,8 +270,7 @@ expand)' among their `declare' forms." ;; List of modes or just t. (or (if (nthcdr 2 (car body)) (list 'quote (nthcdr 2 (car body))) - t)))) - ,(if macrop ''macro nil))))) + t)))))))) ;; For defclass forms, use `eieio-defclass-autoload'. ((eq car 'defclass) commit b193a78a6f3ee254c8eeb6bb612cefd348683a9d Author: Stefan Monnier Date: Fri Nov 21 10:46:13 2025 -0500 (loaddefs--defining-macros): Weed out a few more entries * lisp/emacs-lisp/loaddefs-gen.el (loaddefs--defining-macros): Remove `define-skeleton`, `define-derived-mode`, and `define-generic-mode` since their `autoload-macro expand` property is now preloaded. diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 3c42bb322a5..e24452ed8ed 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -154,8 +154,7 @@ scanning for autoloads and will be in the `load-path'." ;; they request such expansion and produce suitable output (e.g. by ;; employing :autoload-end to omit unneeded forms). (defconst loaddefs--defining-macros - '( define-skeleton define-derived-mode define-compilation-mode - define-generic-mode + '( define-compilation-mode cl-defun defun* cl-defmacro defmacro* define-overloadable-function transient-define-prefix transient-define-suffix transient-define-infix transient-define-argument transient-define-group)) @@ -256,9 +255,7 @@ expand)' among their `declare' forms." 'transient-define-infix 'transient-define-argument 'transient-define-group) (nth 2 form)) - ('define-skeleton '(&optional str arg)) - ((or 'define-generic-mode 'define-derived-mode - 'define-compilation-mode) + ('define-compilation-mode nil) (_ t))) (body (nthcdr (or (function-get car 'doc-string-elt) 3) form)) @@ -270,9 +267,7 @@ expand)' among their `declare' forms." (loaddefs-generate--shorten-autoload `(autoload ,(if (listp name) name (list 'quote name)) ,file ,doc - ,(or (and (memq car '( define-skeleton define-derived-mode - define-generic-mode - transient-define-prefix + ,(or (and (memq car '( transient-define-prefix transient-define-suffix transient-define-infix transient-define-argument commit 10961728dc7e2f36235a9be6abddc383559d2aaf Author: Stefan Monnier Date: Fri Nov 21 10:28:12 2025 -0500 : Update ldefs-boot.el diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index d5b00ad9a2c..ad280df434d 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -156,9 +156,7 @@ New log entries are usually made with \\[add-change-log-entry] or \\[add-change- Each entry behaves as a paragraph, and the entries for one day as a page. Runs `change-log-mode-hook'. -\\{change-log-mode-map} - -(fn)" t) +\\{change-log-mode-map}" t) (autoload 'add-log-current-defun "add-log" "\ Return name of function definition point is in, or nil. @@ -305,7 +303,6 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...) (fn FUNCTION ARGS &rest BODY)" nil t) (function-put 'defadvice 'doc-string-elt 3) -(function-put 'defadvice 'lisp-indent-function 2) (make-obsolete 'defadvice '"use `advice-add' or `define-advice'" "30.1") (register-definition-prefixes "advice" '("ad-")) @@ -933,7 +930,11 @@ commentary with value `antlr-help-unknown-file-text' is added. The (autoload 'antlr-mode "antlr-mode" "\ Major mode for editing ANTLR grammar files. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `antlr-mode-hook', as the final or penultimate +step during initialization. + +\\{antlr-mode-map}" t) (autoload 'antlr-set-tabs "antlr-mode" "\ Use ANTLR's convention for TABs according to `antlr-tab-offset-alist'. Used in `antlr-mode'. Also a useful function in `java-mode-hook'.") @@ -1187,9 +1188,7 @@ take a numeric prefix argument): \\[array-display-local-variables] Display current values of local variables. -Entering array mode calls the function `array-mode-hook'. - -(fn)" t) +Entering array mode calls the function `array-mode-hook'." t) (register-definition-prefixes "array" '("array-")) @@ -1429,9 +1428,7 @@ Alternatively, you may set this variable in `asm-mode-hook'. Turning on Asm mode runs the hook `asm-mode-hook' at the end of initialization. Special commands: -\\{asm-mode-map} - -(fn)" t) +\\{asm-mode-map}" t) (register-definition-prefixes "asm-mode" '("asm-")) @@ -1454,7 +1451,8 @@ point is moved into the passwords (see `authinfo-hide-elements'). \\{authinfo-mode-map} -(fn)" t) +This mode runs the hook `authinfo-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'read-passwd "auth-source" "\ Read a password, prompting with PROMPT, and return password as a string. If optional CONFIRM is non-nil, read the password twice to make sure. @@ -1511,7 +1509,11 @@ added. Possible values are: (autoload 'autoconf-mode "autoconf" "\ Major mode for editing Autoconf configure.ac files. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `autoconf-mode-hook', as the final or +penultimate step during initialization. + +\\{autoconf-mode-map}" t) (register-definition-prefixes "autoconf" '("autoconf-")) @@ -1761,7 +1763,9 @@ Run script using `bat-run' and `bat-run-args'. \\{bat-mode-map} -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `bat-mode-hook', as the final or penultimate +step during initialization." t) (register-definition-prefixes "bat-mode" '("bat-")) @@ -1835,7 +1839,6 @@ garbage collections that ran, and the time taken by garbage collection. See also `benchmark-run-compiled'. (fn &optional REPETITIONS &rest FORMS)" nil t) -(function-put 'benchmark-run 'lisp-indent-function 1) (autoload 'benchmark-run-compiled "benchmark" "\ Time execution of compiled version of FORMS. This is like `benchmark-run', but what is timed is a funcall of the @@ -1843,7 +1846,6 @@ byte code obtained by wrapping FORMS in a `lambda' and compiling the result. The overhead of the `lambda's is accounted for. (fn &optional REPETITIONS &rest FORMS)" nil t) -(function-put 'benchmark-run-compiled 'lisp-indent-function 1) (autoload 'benchmark "benchmark" "\ Print the time taken for REPETITIONS executions of FORM. Interactively, REPETITIONS is taken from the prefix arg, and @@ -1859,7 +1861,6 @@ Evaluate BODY and message the time taken. The return value is the value of the final form in BODY. (fn &rest BODY)" nil t) -(function-put 'benchmark-progn 'lisp-indent-function 0) (register-definition-prefixes "benchmark" '("benchmark-")) @@ -1936,9 +1937,7 @@ BibTeX mode supports Imenu and hideshow minor mode (`hs-minor-mode'). Entry to BibTeX mode calls the value of `bibtex-mode-hook' if that value is non-nil. -\\{bibtex-mode-map} - -(fn)" t) +\\{bibtex-mode-map}" t) (autoload 'bibtex-search-entry "bibtex" "\ Move point to the beginning of BibTeX entry named KEY. Return position of entry if KEY is found or nil if not found. @@ -1961,7 +1960,10 @@ A prefix arg negates the value of `bibtex-search-entry-globally'. (autoload 'bibtex-style-mode "bibtex-style" "\ Major mode for editing BibTeX style files. -(fn)" t) +This mode runs the hook `bibtex-style-mode-hook', as the final or +penultimate step during initialization. + +\\{bibtex-style-mode-map}" t) (register-definition-prefixes "bibtex-style" '("bibtex-style-")) @@ -2954,7 +2956,11 @@ To use tree-sitter C/C++ modes by default, evaluate in your init files, or customize `treesit-enabled-modes'. -(fn)" t) +In addition to any hooks its parent mode `c-ts-base-mode' might have +run, this mode runs the hook `c-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{c-ts-mode-map}" t) (autoload 'c++-ts-mode "c-ts-mode" "\ Major mode for editing C++, powered by tree-sitter. @@ -2975,7 +2981,11 @@ Since this mode uses a parser, unbalanced brackets might cause some breakage in indentation/fontification. Therefore, it's recommended to enable `electric-pair-mode' with this mode. -(fn)" t) +In addition to any hooks its parent mode `c-ts-base-mode' might have +run, this mode runs the hook `c++-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{c++-ts-mode-map}" t) (autoload 'c-or-c++-ts-mode "c-ts-mode" "\ Analyze buffer and enable either C or C++ mode. @@ -3160,7 +3170,6 @@ See Info node `(calc)Defining Functions'. (fn FUNC ARGS &rest BODY)" nil t) (function-put 'defmath 'doc-string-elt 3) -(function-put 'defmath 'lisp-indent-function 'defun) (register-definition-prefixes "calc" '("calc" "defcalcmodevar" "inexact-result" "math-" "var-")) @@ -3613,9 +3622,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `c-mode-hook'. Key bindings: -\\{c-mode-map} - -(fn)" t) +\\{c-mode-map}" t) (autoload 'c-or-c++-mode "cc-mode" "\ Analyze buffer and enable either C or C++ mode. @@ -3641,9 +3648,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `c++-mode-hook'. Key bindings: -\\{c++-mode-map} - -(fn)" t) +\\{c++-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode)) (autoload 'objc-mode "cc-mode" "\ Major mode for editing Objective C code. @@ -3659,9 +3664,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `objc-mode-hook'. Key bindings: -\\{objc-mode-map} - -(fn)" t) +\\{objc-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode)) (autoload 'java-mode "cc-mode" "\ Major mode for editing Java code. @@ -3677,9 +3680,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `java-mode-hook'. Key bindings: -\\{java-mode-map} - -(fn)" t) +\\{java-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode)) (autoload 'idl-mode "cc-mode" "\ Major mode for editing CORBA's IDL, PSDL and CIDL code. @@ -3695,9 +3696,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `idl-mode-hook'. Key bindings: -\\{idl-mode-map} - -(fn)" t) +\\{idl-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(\\.in\\)?\\)\\'" . pike-mode)) (add-to-list 'interpreter-mode-alist '("pike" . pike-mode)) (autoload 'pike-mode "cc-mode" "\ @@ -3714,9 +3713,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `pike-mode-hook'. Key bindings: -\\{pike-mode-map} - -(fn)" t) +\\{pike-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode)) (add-to-list 'interpreter-mode-alist '("awk" . awk-mode)) (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode)) @@ -3735,9 +3732,7 @@ The hook `c-mode-common-hook' is run with no args at mode initialization, then `awk-mode-hook'. Key bindings: -\\{awk-mode-map} - -(fn)" t) +\\{awk-mode-map}" t) (register-definition-prefixes "cc-mode" '("awk-mode-map" "c++-mode-" "c-" "idl-mode-" "java-mode-" "objc-mode-" "pike-mode-")) @@ -4075,7 +4070,6 @@ MAP-ID := integer (fn NAME CCL-PROGRAM &optional DOC)" nil t) (function-put 'define-ccl-program 'doc-string-elt 3) -(function-put 'define-ccl-program 'lisp-indent-function 'defun) (autoload 'check-ccl-program "ccl" "\ Check validity of CCL-PROGRAM. If CCL-PROGRAM is a symbol denoting a CCL program, return @@ -4130,7 +4124,9 @@ There are no special keybindings by default. Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves to the action header. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `cfengine3-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'cfengine2-mode "cfengine" "\ Major mode for editing CFEngine2 input. There are no special keybindings by default. @@ -4138,7 +4134,9 @@ There are no special keybindings by default. Action blocks are treated as defuns, i.e. \\[beginning-of-defun] moves to the action header. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `cfengine2-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'cfengine-auto-mode "cfengine" "\ Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents." t) (register-definition-prefixes "cfengine" '("cfengine")) @@ -4705,7 +4703,11 @@ For use inside Lisp programs, see also `c-macro-expansion'. (autoload 'cmake-ts-mode "cmake-ts-mode" "\ Major mode for editing CMake files, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `cmake-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{cmake-ts-mode-map}" t) (autoload 'cmake-ts-mode-maybe "cmake-ts-mode" "\ Enable `cmake-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -5246,6 +5248,8 @@ evaluate the variable `compilation-shell-minor-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. +\\{compilation-shell-minor-mode-map} + (fn &optional ARG)" t) (autoload 'compilation-minor-mode "compile" "\ Toggle Compilation minor mode. @@ -5268,6 +5272,8 @@ evaluate the variable `compilation-minor-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. +\\{compilation-minor-mode-map} + (fn &optional ARG)" t) (autoload 'compilation-next-error-function "compile" "\ Advance to the next error message and visit the file where the error was. @@ -5572,12 +5578,17 @@ See also `conf-space-mode', `conf-colon-mode', `conf-javaprop-mode', \\{conf-mode-map} -(fn)" t) +This mode runs the hook `conf-mode-hook', as the final or penultimate +step during initialization." t) (autoload 'conf-unix-mode "conf-mode" "\ Conf Mode starter for Unix style Conf files. Comments start with `#'. For details see `conf-mode'. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `conf-unix-mode-hook', as the final or penultimate step +during initialization. + +\\{conf-unix-mode-map}" t) (autoload 'conf-windows-mode "conf-mode" "\ Conf Mode starter for Windows style Conf files. Comments start with `;'. @@ -5592,7 +5603,9 @@ Default={5984FFE0-28D4-11CF-AE66-08002B2E1262} [{5984FFE0-28D4-11CF-AE66-08002B2E1262}] PersistMoniker=file://Folder.htt -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `conf-windows-mode-hook', as the final or penultimate +step during initialization." t) (autoload 'conf-javaprop-mode "conf-mode" "\ Conf Mode starter for Java properties files. Comments start with `#'. Example: @@ -5606,7 +5619,9 @@ x.1 = x.2.y.1.z.1 = x.2.y.1.z.2.zz = -(fn)" t) +In addition to any hooks its parent mode `conf-mode' might have run, +this mode runs the hook `conf-javaprop-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'conf-space-mode "conf-mode" "\ Conf Mode starter for space separated conf files. \"Assignments\" are with ` '. Keywords before the parameters are @@ -5630,7 +5645,9 @@ class desktop add /dev/audio desktop add /dev/mixer desktop -(fn)" t) +In addition to any hooks its parent mode `conf-unix-mode' might have +run, this mode runs the hook `conf-space-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'conf-space-keywords "conf-mode" "\ Enter Conf Space mode using regexp KEYWORDS to match the keywords. See `conf-space-mode'. @@ -5646,7 +5663,9 @@ For details see `conf-mode'. Example: : \"\\241\" exclamdown : \"\\242\" cent -(fn)" t) +In addition to any hooks its parent mode `conf-unix-mode' might have +run, this mode runs the hook `conf-colon-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'conf-ppd-mode "conf-mode" "\ Conf Mode starter for Adobe/CUPS PPD files. Comments start with `*%' and \"assignments\" are with `:'. @@ -5657,7 +5676,9 @@ For details see `conf-mode'. Example: *DefaultTransfer: Null *Transfer Null.Inverse: \"{ 1 exch sub }\" -(fn)" t) +In addition to any hooks its parent mode `conf-colon-mode' might have +run, this mode runs the hook `conf-ppd-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'conf-xdefaults-mode "conf-mode" "\ Conf Mode starter for Xdefaults files. Comments start with `!' and \"assignments\" are with `:'. @@ -5668,7 +5689,9 @@ For details see `conf-mode'. Example: *background: gray99 *foreground: black -(fn)" t) +In addition to any hooks its parent mode `conf-colon-mode' might have +run, this mode runs the hook `conf-xdefaults-mode-hook', as the final +or penultimate step during initialization." t) (autoload 'conf-toml-mode "conf-mode" "\ Conf Mode starter for TOML files. Comments start with `#' and \"assignments\" are with `='. @@ -5679,7 +5702,9 @@ For details see `conf-mode'. Example: [entry] value = \"some string\" -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `conf-toml-mode-hook', as the final or penultimate step +during initialization." t) (autoload 'conf-desktop-mode "conf-mode" "\ Conf Mode started for freedesktop.org Desktop files. Comments start with `#' and \"assignments\" are with `='. @@ -5692,11 +5717,24 @@ For details see `conf-mode'. Exec=gimp-2.8 %U Terminal=false -(fn)" t) +In addition to any hooks its parent mode `conf-unix-mode' might have +run, this mode runs the hook `conf-desktop-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'conf-npmrc-mode "conf-mode" "\ +Major mode derived from `conf-mode' by `define-derived-mode'. +It inherits all of the parent's attributes, but has its own keymap, +abbrev table and syntax table: + + `conf-npmrc-mode-map', `conf-npmrc-mode-abbrev-table' and +`conf-npmrc-mode-syntax-table' + +which more-or-less shadow conf-mode's corresponding tables. +In addition to any hooks its parent mode might have run, this mode +runs the hook `conf-npmrc-mode-hook', as the final or penultimate step +during initialization. -(fn)" t) +\\{conf-npmrc-mode-map}" t) (register-definition-prefixes "conf-mode" '("conf-")) @@ -5936,9 +5974,7 @@ with no args. DO NOT FORGET to read micro-docs (available from `Perl' menu) or as help on variables `cperl-tips', `cperl-problems', -`cperl-praise', `cperl-speed'. - -(fn)" t) +`cperl-praise', `cperl-speed'." t) (autoload 'cperl-perldoc "cperl-mode" "\ Run `perldoc' on WORD. @@ -6011,11 +6047,17 @@ Major mode for editing Csharp code. Key bindings: \\{csharp-mode-map} -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `csharp-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'csharp-ts-mode "csharp-mode" "\ Major mode for editing C# code. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `csharp-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{csharp-ts-mode-map}" t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(csharp-mode . csharp-ts-mode))) (register-definition-prefixes "csharp-mode" '("codedoc-font-lock-" "csharp-")) @@ -6045,7 +6087,9 @@ can also be used to fill comments. \\{css-mode-map} -(fn)" t) +In addition to any hooks its parent mode `css-base-mode' might have +run, this mode runs the hook `css-ts-mode-hook', as the final or +penultimate step during initialization." t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(css-mode . css-ts-mode))) (autoload 'css-mode "css-mode" "\ Major mode to edit Cascading Style Sheets (CSS). @@ -6068,12 +6112,18 @@ be used to fill comments. \\{css-mode-map} -(fn)" t) +In addition to any hooks its parent mode `css-base-mode' might have +run, this mode runs the hook `css-mode-hook', as the final or +penultimate step during initialization." t) (add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode)) (autoload 'scss-mode "css-mode" "\ Major mode to edit \"Sassy CSS\" files. -(fn)" t) +In addition to any hooks its parent mode `css-mode' might have run, +this mode runs the hook `scss-mode-hook', as the final or penultimate +step during initialization. + +\\{scss-mode-map}" t) (autoload 'css-lookup-symbol "css-mode" "\ Display the CSS documentation for SYMBOL, as found on MDN. When this command is used interactively, it picks a default @@ -6590,7 +6640,10 @@ omitted, a buffer named *Custom Themes* is used. (autoload 'cvs-status-mode "cvs-status" "\ Mode used for cvs status output. -(fn)" t) +This mode runs the hook `cvs-status-mode-hook', as the final or +penultimate step during initialization. + +\\{cvs-status-mode-map}" t) (register-definition-prefixes "cvs-status" '("cvs-")) @@ -6919,9 +6972,7 @@ $ There is some minimal font-lock support (see vars -`dcl-font-lock-defaults' and `dcl-font-lock-keywords'). - -(fn)" t) +`dcl-font-lock-defaults' and `dcl-font-lock-keywords')." t) (register-definition-prefixes "dcl-mode" '("dcl-")) @@ -7037,7 +7088,8 @@ The most useful commands are: \\[decipher-make-checkpoint] Save the current cipher alphabet (checkpoint) \\[decipher-restore-checkpoint] Restore a saved cipher alphabet (checkpoint) -(fn)" t) +This mode runs the hook `decipher-mode-hook', as the final or +penultimate step during initialization." t) (register-definition-prefixes "decipher" '("decipher-")) @@ -7221,7 +7273,7 @@ See Info node `(elisp)Derived Modes' for more details. (fn CHILD PARENT NAME [DOCSTRING] [KEYWORD-ARGS...] &rest BODY)" nil t) (function-put 'define-derived-mode 'doc-string-elt 4) -(function-put 'define-derived-mode 'lisp-indent-function 'defun) +(function-put 'define-derived-mode 'autoload-macro 'expand) (register-definition-prefixes "derived" '("derived-mode-")) @@ -7582,7 +7634,10 @@ ensure that all relevant variables are set. (autoload 'diary-mode "diary-lib" "\ Major mode for editing the diary file. -(fn)" t) +This mode runs the hook `diary-mode-hook', as the final or penultimate +step during initialization. + +\\{diary-mode-map}" t) (register-definition-prefixes "diary-lib" '("calendar-mark-" "diary-")) @@ -7610,7 +7665,9 @@ This is a quick reference to this mode describing the default key bindings: \\`RET' visit link at point \\`' visit clicked link -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `dictionary-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'dictionary "dictionary" "\ Create a new dictionary buffer and install `dictionary-mode'." t) (autoload 'dictionary-search "dictionary" "\ @@ -7757,7 +7814,8 @@ a diff with \\[diff-reverse-direction]. In read-only buffers the following bindings are also available: \\{diff-read-only-map} -(fn)" t) +This mode runs the hook `diff-mode-hook', as the final or penultimate +step during initialization." t) (autoload 'diff-minor-mode "diff-mode" "\ Toggle Diff minor mode. @@ -8420,7 +8478,7 @@ table and its own syntax table. Turning on DNS mode runs `dns-mode-hook'. -(fn)" t) +\\{dns-mode-map}" t) (defalias 'zone-mode 'dns-mode) (autoload 'dns-mode-soa-increment-serial "dns-mode" "\ Locate SOA record and increment the serial field." t) @@ -8485,7 +8543,11 @@ disabled. (autoload 'dockerfile-ts-mode "dockerfile-ts-mode" "\ Major mode for editing Dockerfiles, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `dockerfile-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{dockerfile-ts-mode-map}" t) (autoload 'dockerfile-ts-mode-maybe "dockerfile-ts-mode" "\ Enable `dockerfile-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -8639,7 +8701,6 @@ INIT-VALUE LIGHTER KEYMAP. (fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t) (function-put 'define-minor-mode 'doc-string-elt 2) -(function-put 'define-minor-mode 'lisp-indent-function 'defun) (function-put 'define-minor-mode 'autoload-macro 'expand) (autoload 'define-globalized-minor-mode "easy-mmode" "\ Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE. @@ -8683,7 +8744,6 @@ on if the hook has explicitly disabled it. (fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)" nil t) (function-put 'define-globalized-minor-mode 'doc-string-elt 2) -(function-put 'define-globalized-minor-mode 'lisp-indent-function 'defun) (function-put 'define-globalized-minor-mode 'autoload-macro 'expand) (autoload 'easy-mmode-define-keymap "easy-mmode" "\ Return a keymap built from bindings BS. @@ -8713,7 +8773,6 @@ This macro is deprecated; use `defvar-keymap' instead. (fn M BS DOC &rest ARGS)" nil t) (function-put 'easy-mmode-defmap 'doc-string-elt 3) -(function-put 'easy-mmode-defmap 'lisp-indent-function 1) (make-obsolete 'easy-mmode-defmap 'defvar-keymap "29.1") (autoload 'easy-mmode-defsyntax "easy-mmode" "\ Define variable ST as a syntax-table. @@ -8721,7 +8780,6 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX). (fn ST CSS DOC &rest ARGS)" nil t) (function-put 'easy-mmode-defsyntax 'doc-string-elt 3) -(function-put 'easy-mmode-defsyntax 'lisp-indent-function 1) (define-obsolete-function-alias 'easy-mmode-define-minor-mode #'define-minor-mode "30.1") (define-obsolete-function-alias 'easy-mmode-define-global-mode #'define-globalized-minor-mode "30.1") (define-obsolete-function-alias 'define-global-minor-mode #'define-globalized-minor-mode "31.1") @@ -9000,13 +9058,19 @@ E.g. \\[save-buffer] writes the tree to the file it was loaded from. Tree mode key bindings: \\{ebrowse-tree-mode-map} -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `ebrowse-tree-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'ebrowse-electric-choose-tree "ebrowse" "\ Return a buffer containing a tree or nil if no tree found or canceled." t) (autoload 'ebrowse-member-mode "ebrowse" "\ Major mode for Ebrowse member buffers. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `ebrowse-member-mode-hook', as the final +or penultimate step during initialization. + +\\{ebrowse-member-mode-map}" t) (autoload 'ebrowse-tags-view-declaration "ebrowse" "\ View declaration of member at point." t) (autoload 'ebrowse-tags-find-declaration "ebrowse" "\ @@ -9598,7 +9662,11 @@ disabled. (autoload 'editorconfig-conf-mode "editorconfig-conf-mode" "\ Major mode for editing .editorconfig files. -(fn)" t) +In addition to any hooks its parent mode `conf-unix-mode' might have +run, this mode runs the hook `editorconfig-conf-mode-hook', as the +final or penultimate step during initialization. + +\\{editorconfig-conf-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.editorconfig\\'" . editorconfig-conf-mode)) (register-definition-prefixes "editorconfig-conf-mode" '("editorconfig-conf-mode-")) @@ -9621,11 +9689,8 @@ Major mode for editing .editorconfig files. ;;; Generated autoloads from editorconfig-tools.el (autoload 'editorconfig-apply "editorconfig-tools" "\ -Get and apply EditorConfig properties to current buffer. - -This function does not respect the values of `editorconfig-exclude-modes' and -`editorconfig-exclude-regexps' and always applies available properties. -Use `editorconfig-mode-apply' instead to make use of these variables." t) +Get and apply EditorConfig properties to current buffer." t) +(make-obsolete 'editorconfig-apply 'hack-local-variables "31.1") (autoload 'editorconfig-find-current-editorconfig "editorconfig-tools" "\ Find the closest .editorconfig file for current file." t) (autoload 'editorconfig-display-current-properties "editorconfig-tools" "\ @@ -9871,7 +9936,6 @@ and reference them using the function `class-option'. (fn NAME SUPERCLASSES SLOTS &rest OPTIONS-AND-DOC)" nil t) (function-put 'defclass 'doc-string-elt 4) -(function-put 'defclass 'lisp-indent-function 'defun) (autoload 'make-instance "eieio" "\ Make a new instance of CLASS based on INITARGS. For example: @@ -10128,7 +10192,11 @@ for the `identity' function: (autoload 'elixir-ts-mode "elixir-ts-mode" "\ Major mode for editing Elixir, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `elixir-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{elixir-ts-mode-map}" t) (autoload 'elixir-ts-mode-maybe "elixir-ts-mode" "\ Enable `elixir-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -10298,7 +10366,11 @@ top in order to make it into an executable script: Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution. Provides some basic font locking and not much else. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `emacs-authors-mode-hook', as the final +or penultimate step during initialization. + +\\{emacs-authors-mode-map}" t) (define-obsolete-function-alias 'etc-authors-mode #'emacs-authors-mode "29.1") (register-definition-prefixes "emacs-authors-mode" '("emacs-authors-" "etc-authors-")) @@ -10335,11 +10407,19 @@ some major modes from being locked under some circumstances. (autoload 'emacs-news-mode "emacs-news-mode" "\ Major mode for editing the Emacs NEWS file. -(fn)" t) +In addition to any hooks its parent mode `text-mode' might have run, +this mode runs the hook `emacs-news-mode-hook', as the final or +penultimate step during initialization. + +\\{emacs-news-mode-map}" t) (autoload 'emacs-news-view-mode "emacs-news-mode" "\ Major mode for viewing the Emacs NEWS file. -(fn)" t) +In addition to any hooks its parent mode `emacs-news-mode' might have +run, this mode runs the hook `emacs-news-view-mode-hook', as the final +or penultimate step during initialization. + +\\{emacs-news-view-mode-map}" t) (register-definition-prefixes "emacs-news-mode" '("emacs-news-")) @@ -11127,7 +11207,8 @@ it has to be wrapped in `(eval (quote ...))'. If NAME is already defined as a test and Emacs is running in batch mode, an error is signaled. -(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil 'macro) +(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil t) +(function-put 'ert-deftest 'doc-string-elt 3) (autoload 'ert-run-tests-batch "ert" "\ Run the tests specified by SELECTOR, printing results to the terminal. @@ -11177,7 +11258,6 @@ used through `ert'. (fn NAME [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] MAJOR-MODE TEST-STR)" nil t) (function-put 'ert-font-lock-deftest 'doc-string-elt 2) -(function-put 'ert-font-lock-deftest 'lisp-indent-function 1) (autoload 'ert-font-lock-deftest-file "ert-font-lock" "\ Define test NAME (a symbol) using assertions from FILE. @@ -11191,7 +11271,6 @@ through `ert'. (fn NAME [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] MAJOR-MODE FILE)" nil t) (function-put 'ert-font-lock-deftest-file 'doc-string-elt 2) -(function-put 'ert-font-lock-deftest-file 'lisp-indent-function 1) (autoload 'ert-font-lock-test-string "ert-font-lock" "\ Check font faces in TEST-STRING set by MODE. @@ -11220,7 +11299,9 @@ This mode mainly provides some font locking. \\{erts-mode-map} -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `erts-mode-hook', as the final or penultimate +step during initialization." t) (register-definition-prefixes "erts-mode" '("erts-")) @@ -11249,7 +11330,10 @@ This mode mainly provides some font locking. (autoload 'eshell-mode "esh-mode" "\ Emacs shell interactive mode. -(fn)" t) +This mode runs the hook `eshell-mode-hook', as the final or +penultimate step during initialization. + +\\{eshell-mode-map}" t) (autoload 'eshell-bookmark-jump "esh-mode" "\ Default bookmark handler for Eshell buffers. @@ -11379,7 +11463,11 @@ Otherwise, `find-tag-default' is used.") (autoload 'tags-table-mode "etags" "\ Major mode for tags table file buffers. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `tags-table-mode-hook', as the final or +penultimate step during initialization. + +\\{tags-table-mode-map}" t) (autoload 'visit-tags-table "etags" "\ Tell tags commands to use tags table file FILE. FILE should be the name of a file created with the `etags' program. @@ -12105,7 +12193,11 @@ for the search engine used." t) (autoload 'eww-mode "eww" "\ Mode for browsing the web. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `eww-mode-hook', as the final or +penultimate step during initialization. + +\\{eww-mode-map}") (autoload 'eww-browse-url "eww" "\ Ask the EWW browser to load URL. @@ -12289,9 +12381,7 @@ Variables controlling indentation style and extra features: Do not left-justify line numbers (default nil). Turning on F90 mode calls the value of the variable `f90-mode-hook' -with no args, if that value is non-nil. - -(fn)" t) +with no args, if that value is non-nil." t) (register-definition-prefixes "f90" '("f90-")) @@ -12932,7 +13022,6 @@ Apply connection-local variables for APPLICATION in `default-directory'. Execute BODY, and unwind connection-local variables. (fn APPLICATION &rest BODY)" nil t) -(function-put 'with-connection-local-application-variables 'lisp-indent-function 1) (autoload 'with-connection-local-variables-1 "files-x" "\ Apply connection-local variables according to `default-directory'. Call BODY-FUN with no args, and then unwind connection-local variables. @@ -13550,6 +13639,8 @@ 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.") @@ -13980,9 +14071,7 @@ Variables controlling indentation style and extra features: Non-nil causes lines to be broken before delimiters (default t). Turning on Fortran mode calls the value of the variable `fortran-mode-hook' -with no args, if that value is non-nil. - -(fn)" t) +with no args, if that value is non-nil." t) (register-definition-prefixes "fortran" '("fortran-")) @@ -14380,8 +14469,8 @@ mode hook `MODE-hook'. See the file generic-x.el for some examples of `define-generic-mode'. (fn MODE COMMENT-LIST KEYWORD-LIST FONT-LOCK-LIST AUTO-MODE-LIST FUNCTION-LIST &optional DOCSTRING)" nil t) -(function-put 'define-generic-mode 'lisp-indent-function 1) (function-put 'define-generic-mode 'doc-string-elt 7) +(function-put 'define-generic-mode 'autoload-macro 'expand) (autoload 'generic-mode-internal "generic" "\ Go into the generic mode MODE. @@ -15292,7 +15381,9 @@ Major mode for editing Go, powered by tree-sitter. \\{go-ts-mode-map} -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `go-ts-mode-hook', as the final or penultimate +step during initialization." t) (autoload 'go-ts-mode-maybe "go-ts-mode" "\ Enable `go-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -15301,7 +15392,11 @@ is t or contains the mode name.") (autoload 'go-mod-ts-mode "go-ts-mode" "\ Major mode for editing go.mod files, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `go-mod-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{go-mod-ts-mode-map}" t) (autoload 'go-mod-ts-mode-maybe "go-ts-mode" "\ Enable `go-mod-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -15310,7 +15405,11 @@ is t or contains the mode name.") (autoload 'go-work-ts-mode "go-ts-mode" "\ Major mode for editing go.work files, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `go-work-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{go-work-ts-mode-map}" t) (autoload 'go-work-ts-mode-maybe "go-ts-mode" "\ Enable `go-work-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -15435,7 +15534,11 @@ disabled. (autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\ Major mode for editing Wisent grammars. -(fn)" t) +In addition to any hooks its parent mode `semantic-grammar-mode' might +have run, this mode runs the hook `wisent-grammar-mode-hook', as the +final or penultimate step during initialization. + +\\{wisent-grammar-mode-map}" t) (register-definition-prefixes "semantic/wisent/grammar" '("semantic-grammar-" "wisent-")) @@ -15444,7 +15547,11 @@ Major mode for editing Wisent grammars. (autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\ Major mode for editing Bovine grammars. -(fn)" t) +In addition to any hooks its parent mode `semantic-grammar-mode' might +have run, this mode runs the hook `bovine-grammar-mode-hook', as the +final or penultimate step during initialization. + +\\{bovine-grammar-mode-map}" t) (register-definition-prefixes "semantic/bovine/grammar" '("bovine-" "semantic-grammar-")) @@ -15571,7 +15678,11 @@ The value depends on `grep-command', `grep-template', (autoload 'grep-mode "grep" "\ Sets `grep-last-buffer' and `compilation-window-height'. -(fn)") +In addition to any hooks its parent mode `compilation-mode' might have +run, this mode runs the hook `grep-mode-hook', as the final or +penultimate step during initialization. + +\\{grep-mode-map}" t) (autoload 'grep "grep" "\ Run Grep with user-specified COMMAND-ARGS. The output from the command goes to the \"*grep*\" buffer. @@ -15767,7 +15878,11 @@ gud, see `gud-mode'. (autoload 'gdb-script-mode "gud" "\ Major mode for editing GDB scripts. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `gdb-script-mode-hook', as the final or +penultimate step during initialization. + +\\{gdb-script-mode-map}" t) (defvar gud-tooltip-mode nil "\ Non-nil if Gud-Tooltip mode is enabled. See the `gud-tooltip-mode' command @@ -15845,7 +15960,6 @@ The returned value will then be an Elisp expression that first evaluates all the parts of PLACE that can be evaluated and then runs E. (fn (GETTER SETTER) PLACE &rest BODY)" nil t) -(function-put 'gv-letplace 'lisp-indent-function 2) (autoload 'gv-define-expander "gv" "\ Use HANDLER to handle NAME as a generalized var. NAME is a symbol: the name of a function, macro, or special form. @@ -15853,7 +15967,6 @@ HANDLER is a function which takes an argument DO followed by the same arguments as NAME. DO is a function as defined in `gv-get'. (fn NAME HANDLER)" nil t) -(function-put 'gv-define-expander 'lisp-indent-function 1) (autoload 'gv--defun-declaration "gv" "\ @@ -15876,7 +15989,6 @@ to be pure and copyable. Example use: (gv-define-setter aref (v a i) \\=`(aset ,a ,i ,v)) (fn NAME ARGLIST &rest BODY)" nil t) -(function-put 'gv-define-setter 'lisp-indent-function 2) (autoload 'gv-define-simple-setter "gv" "\ Define a simple setter method for generalized variable NAME. This macro is an easy-to-use substitute for `gv-define-expander' that works @@ -15987,7 +16099,11 @@ Like `hanoi-unix', but with a 64-bit clock." t) (autoload 'heex-ts-mode "heex-ts-mode" "\ Major mode for editing HEEx, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `html-mode' might have run, +this mode runs the hook `heex-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{heex-ts-mode-map}" t) (autoload 'heex-ts-mode-maybe "heex-ts-mode" "\ Enable `heex-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -16302,7 +16418,9 @@ Also see the `help-enable-variable-value-editing' variable. Commands: \\{help-mode-map} -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `help-mode-hook', as the final or +penultimate step during initialization." t) (autoload 'help-mode-setup "help-mode" "\ Enter Help mode in the current buffer.") (make-obsolete 'help-mode-setup 'nil "29.1") @@ -17189,7 +17307,11 @@ values. (autoload 'html-ts-mode "html-ts-mode" "\ Major mode for editing Html, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `html-mode' might have run, +this mode runs the hook `html-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{html-ts-mode-map}" t) (register-definition-prefixes "html-ts-mode" '("html-ts-mode-")) @@ -17264,7 +17386,7 @@ inlined into the compiled format versions. This means that if you change its definition, you should explicitly call `ibuffer-recompile-formats'. -(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil 'macro) +(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil t) (autoload 'define-ibuffer-sorter "ibuf-macs" "\ Define a method of sorting named NAME. DOCUMENTATION is the documentation of the function, which will be called @@ -17275,7 +17397,8 @@ For sorting, the forms in BODY will be evaluated with `a' bound to one buffer object, and `b' bound to another. BODY should return a non-nil value if and only if `a' is \"less than\" `b'. -(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil 'macro) +(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil t) +(function-put 'define-ibuffer-sorter 'doc-string-elt 2) (autoload 'define-ibuffer-op "ibuf-macs" "\ Generate a function which operates on a buffer. OP becomes the name of the function; if it doesn't begin with @@ -17318,7 +17441,8 @@ BODY define the operation; they are forms to evaluate per each marked buffer. BODY is evaluated with `buf' bound to the buffer object. -(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil 'macro) +(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil t) +(function-put 'define-ibuffer-op 'doc-string-elt 3) (autoload 'define-ibuffer-filter "ibuf-macs" "\ Define a filter named NAME. DOCUMENTATION is the documentation of the function. @@ -17333,7 +17457,8 @@ not a particular buffer should be displayed or not. The forms in BODY will be evaluated with BUF bound to the buffer object, and QUALIFIER bound to the current value of the filter. -(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil 'macro) +(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil t) +(function-put 'define-ibuffer-filter 'doc-string-elt 2) (register-definition-prefixes "ibuf-macs" '("ibuffer-")) @@ -17597,9 +17722,7 @@ Variables controlling indentation style: this far to the right of the start of its line. Turning on Icon mode calls the value of the variable `icon-mode-hook' -with no args, if that value is non-nil. - -(fn)" t) +with no args, if that value is non-nil." t) (register-definition-prefixes "icon" '("beginning-of-icon-defun" "calculate-icon-indent" "electric-icon-brace" "end-of-icon-defun" "icon-" "indent-icon-exp" "mark-icon-function")) @@ -18091,7 +18214,6 @@ Example: (fn SYMBOL SPECS &optional DOC)" nil t) (function-put 'defimage 'doc-string-elt 3) -(function-put 'defimage 'lisp-indent-function 'defun) (autoload 'imagemagick-register-types "image" "\ Register file types that can be handled by ImageMagick. This function is called at startup, after loading the init file. @@ -18839,7 +18961,9 @@ Advanced commands: \\[universal-argument] \\[info] Move to new Info file with completion. \\[universal-argument] N \\[info] Select Info buffer with prefix number in the name *info*. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `Info-mode-hook', as the final or +penultimate step during initialization." t) (put 'Info-goto-emacs-command-node 'info-file "emacs") (autoload 'Info-goto-emacs-command-node "info" "\ Go to the Info node in the Emacs manual for command COMMAND. @@ -19055,7 +19179,6 @@ compiler macro. This is for the rare case in which you want to use this macro to define a function that should not be inlined. (fn NAME ARGS &rest BODY)" nil t) -(function-put 'define-inline 'lisp-indent-function 'defun) (function-put 'define-inline 'doc-string-elt 3) (function-put 'define-inline 'autoload-macro 'expand) (register-definition-prefixes "inline" '("inline-")) @@ -19501,7 +19624,11 @@ Return the string read from the minibuffer. (autoload 'java-ts-mode "java-ts-mode" "\ Major mode for editing Java, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `java-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{java-ts-mode-map}" t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(java-mode . java-ts-mode))) (register-definition-prefixes "java-ts-mode" '("java-ts-mode-")) @@ -19538,22 +19665,45 @@ Generic major mode for editing JavaScript. This mode is intended to be inherited by concrete major modes. Currently there are `js-mode' and `js-ts-mode'. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `js-base-mode-hook', as the final or +penultimate step during initialization. + +\\{js-base-mode-map}" t) (autoload 'js-mode "js" "\ Major mode for editing JavaScript. -(fn)" t) +In addition to any hooks its parent mode `js-base-mode' might have +run, this mode runs the hook `js-mode-hook', as the final or +penultimate step during initialization. + +\\{js-mode-map}" t) (autoload 'js-ts-mode "js" "\ Major mode for editing JavaScript. \\ -(fn)" t) +In addition to any hooks its parent mode `js-base-mode' might have +run, this mode runs the hook `js-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{js-ts-mode-map}" t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(javascript-mode . js-ts-mode))) (autoload 'js-json-mode "js" "\ +Major mode derived from `prog-mode' by `define-derived-mode'. +It inherits all of the parent's attributes, but has its own keymap, +abbrev table and syntax table: + `js-json-mode-map', `js-json-mode-abbrev-table' and +`js-mode-syntax-table' -(fn)" t) +which more-or-less shadow prog-mode's corresponding tables. + +In addition to any hooks its parent mode might have run, this mode +runs the hook `js-json-mode-hook', as the final or penultimate step +during initialization. + +\\{js-json-mode-map}" t) (autoload 'js-jsx-mode "js" "\ Major mode for editing JavaScript+JSX. @@ -19567,7 +19717,11 @@ could set `js-jsx-syntax' to t in your init file, or in a `js-jsx-enable' in `js-mode-hook'. You may be better served by one of the aforementioned options instead of using this mode. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `js-jsx-mode-hook', as the final or penultimate step +during initialization. + +\\{js-jsx-mode-map}" t) (defalias 'javascript-mode 'js-mode) (dolist (name (list "node" "nodejs" "gjs" "rhino")) (add-to-list 'interpreter-mode-alist (cons name 'js-mode))) (register-definition-prefixes "js" '("js-")) @@ -19584,7 +19738,11 @@ one of the aforementioned options instead of using this mode. (autoload 'json-ts-mode "json-ts-mode" "\ Major mode for editing JSON, powered by tree-sitter. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `json-ts-mode-hook', as the final or +penultimate step during initialization. + +\\{json-ts-mode-map}" t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(js-json-mode . json-ts-mode))) (register-definition-prefixes "json-ts-mode" '("json-ts-")) @@ -19928,7 +20086,11 @@ isn't changed if the display can render Unicode characters. (autoload 'ld-script-mode "ld-script" "\ A major mode to edit GNU ld script files. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `ld-script-mode-hook', as the final or +penultimate step during initialization. + +\\{ld-script-mode-map}" t) (register-definition-prefixes "ld-script" '("ld-script-")) @@ -19949,7 +20111,9 @@ Major mode for editing Less files (https://lesscss.org/). Special commands: \\{less-css-mode-map} -(fn)" t) +In addition to any hooks its parent mode `css-mode' might have run, +this mode runs the hook `less-css-mode-hook', as the final or +penultimate step during initialization." t) (register-definition-prefixes "less-css-mode" '("less-css-")) @@ -20000,7 +20164,6 @@ the following form evaluates to nil: .some-key) (fn ALIST &rest BODY)" nil t) -(function-put 'let-alist 'lisp-indent-function 1) (register-definition-prefixes "let-alist" '("let-alist--")) @@ -20048,8 +20211,8 @@ sleep in seconds. ;;; Generated autoloads from emacs-lisp/loaddefs-gen.el (put 'autoload-compute-prefixes 'safe-local-variable #'booleanp) -(put 'generated-autoload-file 'safe-local-variable 'stringp) -(put 'generated-autoload-load-name 'safe-local-variable 'stringp) +(put 'generated-autoload-file 'safe-local-variable #'stringp) +(put 'generated-autoload-load-name 'safe-local-variable #'stringp) (autoload 'loaddefs-generate "loaddefs-gen" "\ Generate loaddefs files for Lisp files in directories given by DIRS. DIRS can be either a single directory or a list of directories. @@ -20206,7 +20369,11 @@ done. Otherwise, this function will use the current buffer. (autoload 'log-view-mode "log-view" "\ Major mode for browsing CVS log output. -(fn)" t) +In addition to any hooks its parent mode `special-mode' might have +run, this mode runs the hook `log-view-mode-hook', as the final or +penultimate step during initialization. + +\\{log-view-mode-map}" t) (autoload 'log-view-get-marked "log-view" "\ Return the list of tags for the marked log entries.") (register-definition-prefixes "log-view" '("log-view-")) @@ -20310,7 +20477,11 @@ Otherwise they are treated as Emacs regexps (for backward compatibility).") (autoload 'lua-mode "lua-mode" "\ Major mode for editing Lua code. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `lua-mode-hook', as the final or penultimate +step during initialization. + +\\{lua-mode-map}" t) (add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-mode)) (add-to-list 'interpreter-mode-alist '("lua" . lua-mode)) (defalias 'run-lua #'lua-start-process) @@ -20337,7 +20508,9 @@ Major mode for editing Lua files, powered by tree-sitter. \\{lua-ts-mode-map} -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `lua-ts-mode-hook', as the final or +penultimate step during initialization." t) (when (boundp 'treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(lua-mode . lua-ts-mode))) (register-definition-prefixes "lua-ts-mode" '("lua-ts-")) @@ -20358,7 +20531,11 @@ This function is suitable for execution in an init file. (autoload 'm4-mode "m4-mode" "\ A major mode to edit m4 macro files. -(fn)" t) +In addition to any hooks its parent mode `prog-mode' might have run, +this mode runs the hook `m4-mode-hook', as the final or penultimate +step during initialization. + +\\{m4-mode-map}" t) (register-definition-prefixes "m4-mode" '("m4-")) @@ -20809,29 +20986,47 @@ Makefile mode can be configured by modifying the following variables: `makefile-special-targets-list': List of special targets. You will be offered to complete on one of those in the minibuffer whenever you enter a `.'. - at the beginning of a line in Makefile mode. - -(fn)" t) + at the beginning of a line in Makefile mode." t) (autoload 'makefile-automake-mode "make-mode" "\ An adapted `makefile-mode' that knows about automake. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `makefile-automake-mode-hook', as the final or +penultimate step during initialization. + +\\{makefile-automake-mode-map}" t) (autoload 'makefile-gmake-mode "make-mode" "\ An adapted `makefile-mode' that knows about gmake. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `makefile-gmake-mode-hook', as the final or penultimate +step during initialization. + +\\{makefile-gmake-mode-map}" t) (autoload 'makefile-makepp-mode "make-mode" "\ An adapted `makefile-mode' that knows about makepp. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `makefile-makepp-mode-hook', as the final or penultimate +step during initialization. + +\\{makefile-makepp-mode-map}" t) (autoload 'makefile-bsdmake-mode "make-mode" "\ An adapted `makefile-mode' that knows about BSD make. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `makefile-bsdmake-mode-hook', as the final or +penultimate step during initialization. + +\\{makefile-bsdmake-mode-map}" t) (autoload 'makefile-imake-mode "make-mode" "\ An adapted `makefile-mode' that knows about imake. -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `makefile-imake-mode-hook', as the final or penultimate +step during initialization. + +\\{makefile-imake-mode-map}" t) (register-definition-prefixes "make-mode" '("makefile-")) @@ -20926,7 +21121,11 @@ Populate MENU with commands that open a man page at point. (autoload 'markdown-ts-mode "markdown-ts-mode" "\ Major mode for editing Markdown using tree-sitter grammar. -(fn)" t) +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-mode-maybe "markdown-ts-mode" "\ Enable `markdown-ts-mode' when its grammar is available. Also propose to install the grammar when `treesit-enabled-modes' @@ -21029,7 +21228,9 @@ Like `text-mode', but with these additional commands: \\{message-mode-map} -(fn)" t) +In addition to any hooks its parent mode might have run, this mode +runs the hook `message-mode-hook', as the final or penultimate step +during initialization." t) (autoload 'message-mail "message" "\ Start editing a mail message to be sent. OTHER-HEADERS is an alist of header/value pairs. CONTINUE says whether @@ -21150,11 +21351,19 @@ to the E-mail. (autoload 'metafont-mode "meta-mode" "\ Major mode for editing Metafont sources. -(fn)" t) +In addition to any hooks its parent mode `meta-common-mode' might have +run, this mode runs the hook `metafont-mode-hook', as the final or +penultimate step during initialization. + +\\{metafont-mode-map}" t) (autoload 'metapost-mode "meta-mode" "\ Major mode for editing MetaPost sources. -(fn)" t) +In addition to any hooks its parent mode `meta-common-mode' might have +run, this mode runs the hook `metapost-mode-hook', as the final or +penultimate step during initialization. + +\\{metapost-mode-map}" t) (register-definition-prefixes "meta-mode" '("meta")) @@ -21332,9 +21541,7 @@ If the option `transient-mark-mode' is set to t and you set a region in the MH-Folder buffer, then the MH-E command will perform the operation on all messages in that region. -\\{mh-folder-mode-map} - -(fn)" t) +\\{mh-folder-mode-map}" t) (register-definition-prefixes "mh-folder" '("mh-")) @@ -21432,7 +21639,11 @@ Code inside a