From 5e4a0a29fa3562ce9b2b8e497c6e71e6bc169082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 30 Nov 2023 06:00:44 -0600 Subject: [PATCH 001/446] Make sure read-symbol-shorthands is permanently local bug#63480, bug#67390 * lisp/files.el (permanently-enabled-local-variables): Add read-symbol-shorthands. --- lisp/files.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/files.el b/lisp/files.el index 9c8914bfc50..fd9088206d7 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3754,7 +3754,8 @@ function is allowed to change the contents of this alist. This hook is called only if there is at least one file-local variable to set.") -(defvar permanently-enabled-local-variables '(lexical-binding) +(defvar permanently-enabled-local-variables + '(lexical-binding read-symbol-shorthands) "A list of file-local variables that are always enabled. This overrides any `enable-local-variables' setting.") From c2aaa8f15aa8fb3415a6c9f421f539ee34b7f52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 30 Nov 2023 06:00:38 -0600 Subject: [PATCH 002/446] Process read-symbol-shorthands from longest to shortest (bug#67390) This ensures that overlapping shorthands are handled correctly and consistently even if specified out-of-order by the user. * doc/lispref/symbols.texi (Shorthands): Describe shorthand sort order. * lisp/files.el (hack-local-variables--find-variables): Specially handle read-symbol-shorthands. --- doc/lispref/symbols.texi | 17 +++++++++++++++++ lisp/files.el | 7 +++++++ 2 files changed, 24 insertions(+) diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi index 367bd195f16..e95e53d972d 100644 --- a/doc/lispref/symbols.texi +++ b/doc/lispref/symbols.texi @@ -761,6 +761,23 @@ instead of @code{snu-}. ;; End: @end example +Note that if you have two shorthands in the same file where one is the +prefix of the other, the longer shorthand will be attempted first. +This happens regardless of the order you specify shorthands in the +local variables section of your file. + +@example +'( + t//foo ; reads to 'my-tricks--foo', not 'my-tricks-/foo' + t/foo ; reads to 'my-tricks-foo' + ) + +;; Local Variables: +;; read-symbol-shorthands: (("t/" . "my-tricks-") +;; ("t//" . "my-tricks--") +;; End: +@end example + @subsection Exceptions There are two exceptions to rules governing Shorthand transformations: diff --git a/lisp/files.el b/lisp/files.el index fd9088206d7..172237ceb82 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4191,6 +4191,13 @@ major-mode." ;; to use 'thisbuf's name in the ;; warning message. (or (buffer-file-name thisbuf) "")))))) + ((eq var 'read-symbol-shorthands) + ;; Sort automatically by shorthand length + ;; descending + (setq val (sort val + (lambda (sh1 sh2) (> (length (car sh1)) + (length (car sh2)))))) + (push (cons 'read-symbol-shorthands val) result)) ((and (eq var 'mode) handle-mode)) (t (ignore-errors From 17c3610c56155dd5b1efd5b7e8d6a58112f43a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Wed, 29 Nov 2023 06:21:29 -0600 Subject: [PATCH 003/446] Consider read-symbol-shorthands in check-declare.el (bug#67523) * lisp/emacs-lisp/check-declare.el (check-declare-verify): Consider read-symbol-shorthands. --- lisp/emacs-lisp/check-declare.el | 101 ++++++++++++++++--------------- 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el index 8e40b227b65..b4a7b4b33e6 100644 --- a/lisp/emacs-lisp/check-declare.el +++ b/lisp/emacs-lisp/check-declare.el @@ -145,64 +145,69 @@ is a string giving details of the error." (if (file-regular-p fnfile) (with-temp-buffer (insert-file-contents fnfile) + (unless cflag + ;; If in Elisp, ensure syntax and shorthands available + (set-syntax-table emacs-lisp-mode-syntax-table) + (let (enable-local-variables) (hack-local-variables))) ;; defsubst's don't _have_ to be known at compile time. - (setq re (format (if cflag - "^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\"" - "^[ \t]*(\\(fset[ \t]+'\\|\ + (setq re (if cflag + (format "^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\"" + (regexp-opt (mapcar 'cadr fnlist) t)) + "^[ \t]*(\\(fset[ \t]+'\\|\ cl-def\\(?:generic\\|method\\|un\\)\\|\ def\\(?:un\\|subst\\|foo\\|method\\|class\\|\ ine-\\(?:derived\\|generic\\|\\(?:global\\(?:ized\\)?-\\)?minor\\)-mode\\|\ \\(?:ine-obsolete-function-\\)?alias[ \t]+'\\|\ ine-overloadable-function\\)\\)\ -[ \t]*%s\\([ \t;]+\\|$\\)") - (regexp-opt (mapcar 'cadr fnlist) t))) +[ \t]*\\(\\(?:\\sw\\|\\s_\\)+\\)\\([ \t;]+\\|$\\)")) (while (re-search-forward re nil t) (skip-chars-forward " \t\n") - (setq fn (match-string 2) - type (match-string 1) - ;; (min . max) for a fixed number of arguments, or - ;; arglists with optional elements. - ;; (min) for arglists with &rest. - ;; sig = 'err means we could not find an arglist. - sig (cond (cflag - (or - (when (search-forward "," nil t 3) - (skip-chars-forward " \t\n") - ;; Assuming minargs and maxargs on same line. - (when (looking-at "\\([0-9]+\\)[ \t]*,[ \t]*\ + (setq fn (symbol-name (car (read-from-string (match-string 2))))) + (when (member fn (mapcar 'cadr fnlist)) + (setq type (match-string 1) + ;; (min . max) for a fixed number of arguments, or + ;; arglists with optional elements. + ;; (min) for arglists with &rest. + ;; sig = 'err means we could not find an arglist. + sig (cond (cflag + (or + (when (search-forward "," nil t 3) + (skip-chars-forward " \t\n") + ;; Assuming minargs and maxargs on same line. + (when (looking-at "\\([0-9]+\\)[ \t]*,[ \t]*\ \\([0-9]+\\|MANY\\|UNEVALLED\\)") - (setq minargs (string-to-number - (match-string 1)) - maxargs (match-string 2)) - (cons minargs (unless (string-match "[^0-9]" - maxargs) - (string-to-number - maxargs))))) - 'err)) - ((string-match - "\\`define-\\(derived\\|generic\\)-mode\\'" - type) - '(0 . 0)) - ((string-match - "\\`define\\(-global\\(ized\\)?\\)?-minor-mode\\'" - type) - '(0 . 1)) - ;; Prompt to update. - ((string-match - "\\`define-obsolete-function-alias\\>" - type) - 'obsolete) - ;; Can't easily check arguments in these cases. - ((string-match "\\`\\(def\\(alias\\|class\\)\\|\ + (setq minargs (string-to-number + (match-string 1)) + maxargs (match-string 2)) + (cons minargs (unless (string-match "[^0-9]" + maxargs) + (string-to-number + maxargs))))) + 'err)) + ((string-match + "\\`define-\\(derived\\|generic\\)-mode\\'" + type) + '(0 . 0)) + ((string-match + "\\`define\\(-global\\(ized\\)?\\)?-minor-mode\\'" + type) + '(0 . 1)) + ;; Prompt to update. + ((string-match + "\\`define-obsolete-function-alias\\>" + type) + 'obsolete) + ;; Can't easily check arguments in these cases. + ((string-match "\\`\\(def\\(alias\\|class\\)\\|\ fset\\|\\(?:cl-\\)?defmethod\\)\\>" type) - t) - ((looking-at "\\((\\|nil\\)") - (byte-compile-arglist-signature - (read (current-buffer)))) - (t - 'err)) - ;; alist of functions and arglist signatures. - siglist (cons (cons fn sig) siglist))))) + t) + ((looking-at "\\((\\|nil\\)") + (byte-compile-arglist-signature + (read (current-buffer)))) + (t + 'err)) + ;; alist of functions and arglist signatures. + siglist (cons (cons fn sig) siglist)))))) (dolist (e fnlist) (setq arglist (nth 2 e) type From 0f715f9c154a47de57a2f24f19b4a402604e6dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Wed, 29 Nov 2023 16:48:34 -0600 Subject: [PATCH 004/446] Improve shorthands-font-lock-shorthands (bug#67390) Add font locking to the shorthand prefix of a given printed symbol name by checking if any of the shorthand prefixes in read-symbol-shorthands are a prefix for that print name. Although this does more string comparisons, it didn't prove to be any slower than the existing approach, and is more correct. This version is more accurate when highlighting files with many overlapping shorthands. Given: ;; Local Variables: ;; read-symbol-shorthands: (("bc-" . "breadcrumb-") ;; ("aw-" . "ace-window-") ;; ("zorglub/" . "ace-window-") ;; ("he//" . "hyperdrive-entry--") ;; ("h//" . "hyperdrive--") ;; ("he/" . "hyperdrive-entry-") ;; ("h/" . "hyperdrive-")) ;; End: The following are correct highlights on print names '(zorglub/blerh ; hilits "zorglub/" reads to 'ace-window-blerh' he/foo ; hilits "he/" reads to 'hyperdrive-entry-foo' he//bar ; hilits "he//" reads to 'hyperdrive-entry--bar' h/coiso ; hilits "h/" reads to 'hyperdrive-coiso' h//thingy ; hilits "h//" reads to 'hyperdrive--thingy' bc-yo ; hilits "bc-" reads to 'breadcrumb-yo' aw-thingy ; hilits "aw-" reads to 'ace-window-thingy' ) Co-authored-by: Jonas Bernoulli Co-authored-by: Joseph Turner * lisp/emacs-lisp/shorthands.el (shorthands-font-lock-shorthands): --- lisp/emacs-lisp/shorthands.el | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/lisp/emacs-lisp/shorthands.el b/lisp/emacs-lisp/shorthands.el index 6348aaccf93..379fb0baec9 100644 --- a/lisp/emacs-lisp/shorthands.el +++ b/lisp/emacs-lisp/shorthands.el @@ -52,38 +52,26 @@ :version "28.1" :group 'font-lock-faces) -(defun shorthands--mismatch-from-end (str1 str2) - "Tell index of first mismatch in STR1 and STR2, from end. -The index is a valid 0-based index on STR1. Returns nil if STR1 -equals STR2. Return 0 if STR1 is a suffix of STR2." - (cl-loop with l1 = (length str1) with l2 = (length str2) - for i from 1 - for i1 = (- l1 i) for i2 = (- l2 i) - while (eq (aref str1 i1) (aref str2 i2)) - if (zerop i2) return (if (zerop i1) nil i1) - if (zerop i1) return 0 - finally (return i1))) - (defun shorthands-font-lock-shorthands (limit) + "Font lock until LIMIT considering `read-symbol-shorthands'." (when read-symbol-shorthands (while (re-search-forward (concat "\\_<\\(" (rx lisp-mode-symbol) "\\)\\_>") limit t) (let* ((existing (get-text-property (match-beginning 1) 'face)) + (print-name (match-string 1)) (probe (and (not (memq existing '(font-lock-comment-face font-lock-string-face))) - (intern-soft (match-string 1)))) - (sname (and probe (symbol-name probe))) - (mismatch (and sname (shorthands--mismatch-from-end - (match-string 1) sname))) - (guess (and mismatch (1+ mismatch)))) - (when guess - (when (and (< guess (1- (length (match-string 1)))) - ;; In bug#67390 we allow other separators - (eq (char-syntax (aref (match-string 1) guess)) ?_)) - (setq guess (1+ guess))) + (intern-soft print-name))) + (symbol-name (and probe (symbol-name probe))) + (prefix (and symbol-name + (not (string-equal print-name symbol-name)) + (car (assoc print-name + read-symbol-shorthands + #'string-prefix-p))))) + (when prefix (add-face-text-property (match-beginning 1) - (+ (match-beginning 1) guess) + (+ (match-beginning 1) (length prefix)) 'elisp-shorthand-font-lock-face)))))) (font-lock-add-keywords 'emacs-lisp-mode '((shorthands-font-lock-shorthands)) t) From c52d17d91ade6c789d8672dbd1301ba86ba4d7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Wed, 29 Nov 2023 20:09:57 -0600 Subject: [PATCH 005/446] Also teach loaddefs-gen.el about shorthands (bug#63480) * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--parse-file): Make aware of read-symbol-shorthands. --- lisp/emacs-lisp/loaddefs-gen.el | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 5f152d3b509..bf5cd24f161 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -378,6 +378,7 @@ don't include." (let ((defs nil) (load-name (loaddefs-generate--file-load-name file main-outfile)) (compute-prefixes t) + read-symbol-shorthands local-outfile inhibit-autoloads) (with-temp-buffer (insert-file-contents file) @@ -399,7 +400,19 @@ don't include." (setq inhibit-autoloads (read (current-buffer))))) (save-excursion (when (re-search-forward "autoload-compute-prefixes: *" nil t) - (setq compute-prefixes (read (current-buffer)))))) + (setq compute-prefixes (read (current-buffer))))) + (save-excursion + ;; since we're "open-coding" we have to repeat more + ;; complicated logic in `hack-local-variables'. + (when (re-search-forward "read-symbol-shorthands: *" nil t) + (let* ((commentless (replace-regexp-in-string + "\n\\s-*;+" "" + (buffer-substring (point) (point-max)))) + (unsorted-shorthands (car (read-from-string commentless)))) + (setq read-symbol-shorthands + (sort unsorted-shorthands + (lambda (sh1 sh2) + (> (length (car sh1)) (length (car sh2)))))))))) ;; We always return the package version (even for pre-dumped ;; files). From 817140a852e79c5ef3cf7dc5e4c50aa710e8c4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 30 Nov 2023 07:32:50 -0600 Subject: [PATCH 006/446] Fix prefix discovery for files with read-symbol-shorthands (bug#67325) In a previous commit, the local-variable read-symbol-shorthands is already read into the temporary buffer used for the autoload parsing aerobatics, so all we needed to do in 'l-g--compute-prefixes' is use 'read' to give 'read-symbol-shorthands' a chance to kick in. * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--compute-prefixes): --- lisp/emacs-lisp/loaddefs-gen.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index bf5cd24f161..8aacbf406b6 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -499,7 +499,11 @@ don't include." (while (re-search-forward "^(\\(def[^ \t\n]+\\)[ \t\n]+['(]*\\([^' ()\"\n]+\\)[\n \t]" nil t) (unless (member (match-string 1) autoload-ignored-definitions) - (let ((name (match-string-no-properties 2))) + (let* ((name (match-string-no-properties 2)) + ;; Consider `read-symbol-shorthands'. + (probe (let ((obarray (obarray-make))) + (car (read-from-string name))))) + (setq name (symbol-name probe)) (when (save-excursion (goto-char (match-beginning 0)) (or (bobp) From 9a51fbb69fc9dc4aa415308889ae667ee65660d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Sat, 3 Feb 2024 08:27:27 -0600 Subject: [PATCH 007/446] ; Also consider shorthands in check-declare-scan (bug#67523) * lisp/emacs-lisp/check-declare.el (check-declare-scan): Also consider shorthands here. --- lisp/emacs-lisp/check-declare.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el index b4a7b4b33e6..a6d1a330d90 100644 --- a/lisp/emacs-lisp/check-declare.el +++ b/lisp/emacs-lisp/check-declare.el @@ -85,6 +85,9 @@ don't know how to recognize (e.g. some macros)." (let (alist) (with-temp-buffer (insert-file-contents file) + ;; Ensure shorthands available, as we will be `read'ing Elisp + ;; (bug#67523) + (let (enable-local-variables) (hack-local-variables)) ;; FIXME we could theoretically be inside a string. (while (re-search-forward "^[ \t]*\\((declare-function\\)[ \t\n]" nil t) (let ((pos (match-beginning 1))) @@ -147,6 +150,7 @@ is a string giving details of the error." (insert-file-contents fnfile) (unless cflag ;; If in Elisp, ensure syntax and shorthands available + ;; (bug#67523) (set-syntax-table emacs-lisp-mode-syntax-table) (let (enable-local-variables) (hack-local-variables))) ;; defsubst's don't _have_ to be known at compile time. From f266622cdb34044f364976796a4e7ac003d7a1b3 Mon Sep 17 00:00:00 2001 From: Joseph Turner Date: Sat, 3 Feb 2024 08:32:37 -0600 Subject: [PATCH 008/446] ; Optimize shorthand insertion in loaddefs-generate--parse-file * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--parse-file): Optimize. --- lisp/emacs-lisp/loaddefs-gen.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 8aacbf406b6..fe29469d08c 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -404,10 +404,13 @@ don't include." (save-excursion ;; since we're "open-coding" we have to repeat more ;; complicated logic in `hack-local-variables'. - (when (re-search-forward "read-symbol-shorthands: *" nil t) - (let* ((commentless (replace-regexp-in-string + (when-let ((beg + (re-search-forward "read-symbol-shorthands: *" nil t))) + ;; `read-symbol-shorthands' alist ends with two parens. + (let* ((end (re-search-forward ")[;\n\s]*)")) + (commentless (replace-regexp-in-string "\n\\s-*;+" "" - (buffer-substring (point) (point-max)))) + (buffer-substring beg end))) (unsorted-shorthands (car (read-from-string commentless)))) (setq read-symbol-shorthands (sort unsorted-shorthands From ecb69c8bd8c3dba205187c6296c8cac9b6a65121 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 3 Feb 2024 18:05:55 +0200 Subject: [PATCH 009/446] ; Fix a comment in loaddefs-gen.el --- lisp/emacs-lisp/loaddefs-gen.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index fe29469d08c..7eced43e735 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -402,7 +402,7 @@ don't include." (when (re-search-forward "autoload-compute-prefixes: *" nil t) (setq compute-prefixes (read (current-buffer))))) (save-excursion - ;; since we're "open-coding" we have to repeat more + ;; Since we're "open-coding", we have to repeat more ;; complicated logic in `hack-local-variables'. (when-let ((beg (re-search-forward "read-symbol-shorthands: *" nil t))) From 8fc7e8c2b0cb33b0e8e9822f116e6dbb530ab1b6 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 3 Feb 2024 18:09:35 +0200 Subject: [PATCH 010/446] ; * lisp/files.el (hack-local-variables--find-variables): Fix comment. --- lisp/files.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/files.el b/lisp/files.el index 172237ceb82..229771810fb 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4193,7 +4193,7 @@ major-mode." (or (buffer-file-name thisbuf) "")))))) ((eq var 'read-symbol-shorthands) ;; Sort automatically by shorthand length - ;; descending + ;; in descending order. (setq val (sort val (lambda (sh1 sh2) (> (length (car sh1)) (length (car sh2)))))) From d41cdceb133e30c71a95fe893d70645472b326e3 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 3 Feb 2024 16:07:24 -0500 Subject: [PATCH 011/446] textconv.c: Fix warnings with-wide-int * src/textconv.c (set_composing_region, textconv_set_point_and_mark): Use `min/max`. --- src/textconv.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/textconv.c b/src/textconv.c index 0d35ec19c55..0941848dd09 100644 --- a/src/textconv.c +++ b/src/textconv.c @@ -1705,11 +1705,8 @@ set_composing_region (struct frame *f, ptrdiff_t start, { struct text_conversion_action *action, **last; - if (start > MOST_POSITIVE_FIXNUM) - start = MOST_POSITIVE_FIXNUM; - - if (end > MOST_POSITIVE_FIXNUM) - end = MOST_POSITIVE_FIXNUM; + start = min (start, MOST_POSITIVE_FIXNUM); + end = min (end, MOST_POSITIVE_FIXNUM); action = xmalloc (sizeof *action); action->operation = TEXTCONV_SET_COMPOSING_REGION; @@ -1734,8 +1731,7 @@ textconv_set_point_and_mark (struct frame *f, ptrdiff_t point, { struct text_conversion_action *action, **last; - if (point > MOST_POSITIVE_FIXNUM) - point = MOST_POSITIVE_FIXNUM; + point = min (point, MOST_POSITIVE_FIXNUM); action = xmalloc (sizeof *action); action->operation = TEXTCONV_SET_POINT_AND_MARK; From b0049c942b8fa4093a02a9bb4ffc9c5da2261765 Mon Sep 17 00:00:00 2001 From: Richard M Stallman Date: Sat, 3 Feb 2024 17:47:02 -0500 Subject: [PATCH 012/446] bytecomp.el: Warn for `,' not within backquote construct (bytecomp--report-comma): New function with `compiler-macro' property. --- lisp/emacs-lisp/bytecomp.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 6e66771658e..5d2aa3355be 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -5742,6 +5742,16 @@ and corresponding effects." (eval form) form))) +;; Report comma operator used outside of backquote. +;; Inside backquote, backquote will transform it before it gets here. + +(put '\, 'compiler-macro #'bytecomp--report-comma) +(defun bytecomp--report-comma (form &rest _ignore) + (macroexp-warn-and-return + (format-message "`%s' called -- perhaps used not within backquote" + (car form)) + form (list 'suspicious (car form)) t)) + ;; Check for (in)comparable constant values in calls to `eq', `memq' etc. (defun bytecomp--dodgy-eq-arg-p (x number-ok) From ecf3488477c6a4382737b97698443fdf26db8bd1 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 3 Feb 2024 18:22:05 -0500 Subject: [PATCH 013/446] * doc/emacs/buffers.texi (List Buffers): Update example --- doc/emacs/buffers.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi index d9113a6811a..00160afd844 100644 --- a/doc/emacs/buffers.texi +++ b/doc/emacs/buffers.texi @@ -205,7 +205,7 @@ Here is an example of a buffer list: @smallexample CRM Buffer Size Mode File -. * .emacs 3294 Emacs-Lisp ~/.emacs +. * .emacs 3294 ELisp/l ~/.emacs % *Help* 101 Help search.c 86055 C ~/cvs/emacs/src/search.c % src 20959 Dired by name ~/cvs/emacs/src/ From 4ebded3f5ee8617ac6b1debaa01706cd78206f39 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 3 Feb 2024 18:22:41 -0500 Subject: [PATCH 014/446] * lisp/emacs-lisp/easy-mmode.el (easy-mmode--mode-docstring): Add comment --- lisp/emacs-lisp/easy-mmode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index 05b23a86fc0..4fa05008dd8 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -132,7 +132,7 @@ it is disabled.") (string-replace "'" "\\='" (format "%S" getter))))) (let ((start (point))) (insert argdoc) - (when (fboundp 'fill-region) + (when (fboundp 'fill-region) ;Don't break bootstrap! (fill-region start (point) 'left t)))) ;; Finally, insert the keymap. (when (and (boundp keymap-sym) From 45125e019c3698ff74ccb2183b789c25f9d3f574 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 3 Feb 2024 23:05:03 -0500 Subject: [PATCH 015/446] tramp: Tweak the ls-lisp declarations * lisp/net/tramp-sh.el (ls-lisp-use-insert-directory-program): Don't declare its existence... (tramp-sh-handle-insert-directory): ...test it instead. * lisp/net/tramp.el (ls-lisp-dirs-first, ls-lisp-emulation) (ls-lisp-ignore-case, ls-lisp-use-insert-directory-program) (ls-lisp-verbosity): Move declaration... (tramp-handle-insert-directory): ...to the point where we have a good reason to think these variables exist. --- lisp/net/tramp-sh.el | 3 +-- lisp/net/tramp.el | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 6bb1d976ec5..7656da81dcc 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -38,7 +38,6 @@ (declare-function dired-compress-file "dired-aux") (declare-function dired-remove-file "dired-aux") (defvar dired-compress-file-suffixes) -(defvar ls-lisp-use-insert-directory-program) ;; Added in Emacs 28.1. (defvar process-file-return-signal-string) (defvar vc-handled-backends) @@ -2636,7 +2635,7 @@ The method used must be an out-of-band method." (defun tramp-sh-handle-insert-directory (filename switches &optional wildcard full-directory-p) "Like `insert-directory' for Tramp files." - (if (and (featurep 'ls-lisp) + (if (and (boundp 'ls-lisp-use-insert-directory-program) (not ls-lisp-use-insert-directory-program)) (tramp-handle-insert-directory filename switches wildcard full-directory-p) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 74d95757e46..7800efc2a5e 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -67,11 +67,6 @@ (declare-function file-notify-rm-watch "filenotify") (declare-function netrc-parse "netrc") (defvar auto-save-file-name-transforms) -(defvar ls-lisp-dirs-first) -(defvar ls-lisp-emulation) -(defvar ls-lisp-ignore-case) -(defvar ls-lisp-use-insert-directory-program) -(defvar ls-lisp-verbosity) (defvar tramp-prefix-format) (defvar tramp-prefix-regexp) (defvar tramp-method-regexp) @@ -4189,6 +4184,11 @@ Let-bind it when necessary.") (filename switches &optional wildcard full-directory-p) "Like `insert-directory' for Tramp files." (require 'ls-lisp) + (defvar ls-lisp-dirs-first) + (defvar ls-lisp-emulation) + (defvar ls-lisp-ignore-case) + (defvar ls-lisp-use-insert-directory-program) + (defvar ls-lisp-verbosity) (unless switches (setq switches "")) ;; Mark trailing "/". (when (and (directory-name-p filename) From dd81e767b7782c275af4221fe258fa3d2948724a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 4 Feb 2024 11:45:15 +0200 Subject: [PATCH 016/446] Fix display of invisible text with opposite directionality * src/xdisp.c (handle_invisible_prop): Skip invisible text correctly when it starts at position whose resolved bidi level is above the base paragraph level. (Bug#68446) --- src/xdisp.c | 191 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 158 insertions(+), 33 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 4ff689b2df7..40311ee8ea7 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5062,31 +5062,169 @@ handle_invisible_prop (struct it *it) { enum prop_handled handled = HANDLED_NORMALLY; int invis; - Lisp_Object prop; + ptrdiff_t curpos, endpos; + Lisp_Object prop, pos, overlay; + /* Get the value of the invisible text property at the current + position. Value will be nil if there is no such property. */ if (STRINGP (it->string)) { - Lisp_Object end_charpos, limit; + curpos = IT_STRING_CHARPOS (*it); + endpos = SCHARS (it->string); + pos = make_fixnum (curpos); + prop = Fget_text_property (pos, Qinvisible, it->string); + } + else /* buffer */ + { + curpos = IT_CHARPOS (*it); + endpos = ZV; + pos = make_fixnum (curpos); + prop = get_char_property_and_overlay (pos, Qinvisible, it->window, + &overlay); + } - /* Get the value of the invisible text property at the - current position. Value will be nil if there is no such - property. */ - end_charpos = make_fixnum (IT_STRING_CHARPOS (*it)); - prop = Fget_text_property (end_charpos, Qinvisible, it->string); - invis = TEXT_PROP_MEANS_INVISIBLE (prop); + /* Do we have anything to do here? */ + invis = TEXT_PROP_MEANS_INVISIBLE (prop); + if (invis == 0 || curpos >= it->end_charpos) + return handled; + + /* If not bidi, or the bidi iteration is at base paragraph level, we + can use a faster method; otherwise we need to check invisibility + of every character while bidi-iterating out of invisible text. */ + bool slow = it->bidi_p && !BIDI_AT_BASE_LEVEL (it->bidi_it); + /* Record whether we have to display an ellipsis for the + invisible text. */ + bool display_ellipsis_p = (invis == 2); + + handled = HANDLED_RECOMPUTE_PROPS; + + if (slow) + { + if (it->bidi_it.first_elt && it->bidi_it.charpos < endpos) + bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it, true); + + if (STRINGP (it->string)) + { + bool done = false; + /* Bidi-iterate out of the invisible part of the string. */ + do + { + bidi_move_to_visually_next (&it->bidi_it); + if (it->bidi_it.charpos < 0 || it->bidi_it.charpos >= endpos) + done = true; + else + { + pos = make_fixnum (it->bidi_it.charpos); + prop = Fget_text_property (pos, Qinvisible, it->string); + invis = TEXT_PROP_MEANS_INVISIBLE (prop); + /* If there are adjacent invisible texts, don't lose + the second one's ellipsis. */ + if (invis == 2) + display_ellipsis_p = true; + } + } + while (!done && invis != 0); + + if (display_ellipsis_p) + it->ellipsis_p = true; + IT_STRING_CHARPOS (*it) = it->bidi_it.charpos; + IT_STRING_BYTEPOS (*it) = it->bidi_it.bytepos; + if (IT_STRING_BYTEPOS (*it) >= endpos) + { + /* The rest of the string is invisible. If this is an + overlay string, proceed with the next overlay string + or whatever comes and return a character from there. */ + if (it->current.overlay_string_index >= 0 + && !display_ellipsis_p) + { + next_overlay_string (it); + /* Don't check for overlay strings when we just + finished processing them. */ + handled = HANDLED_OVERLAY_STRING_CONSUMED; + } + } + } + else + { + bool done = false; + /* Bidi-iterate out of the invisible text. */ + do + { + bidi_move_to_visually_next (&it->bidi_it); + if (it->bidi_it.charpos < BEGV || it->bidi_it.charpos >= endpos) + done = true; + else + { + pos = make_fixnum (it->bidi_it.charpos); + prop = Fget_char_property (pos, Qinvisible, it->window); + invis = TEXT_PROP_MEANS_INVISIBLE (prop); + /* If there are adjacent invisible texts, don't lose + the second one's ellipsis. */ + if (invis == 2) + display_ellipsis_p = true; + } + } + while (!done && invis != 0); + + IT_CHARPOS (*it) = it->bidi_it.charpos; + IT_BYTEPOS (*it) = it->bidi_it.bytepos; + if (display_ellipsis_p) + { + /* Make sure that the glyphs of the ellipsis will get + correct `charpos' values. See below for detailed + explanation why this is needed. */ + it->position.charpos = IT_CHARPOS (*it) - 1; + it->position.bytepos = CHAR_TO_BYTE (it->position.charpos); + } + /* If there are before-strings at the start of invisible + text, and the text is invisible because of a text + property, arrange to show before-strings because 20.x did + it that way. (If the text is invisible because of an + overlay property instead of a text property, this is + already handled in the overlay code.) */ + if (NILP (overlay) + && get_overlay_strings (it, it->stop_charpos)) + { + handled = HANDLED_RECOMPUTE_PROPS; + if (it->sp > 0) + { + it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p; + /* The call to get_overlay_strings above recomputes + it->stop_charpos, but it only considers changes + in properties and overlays beyond iterator's + current position. This causes us to miss changes + that happen exactly where the invisible property + ended. So we play it safe here and force the + iterator to check for potential stop positions + immediately after the invisible text. Note that + if get_overlay_strings returns true, it + normally also pushed the iterator stack, so we + need to update the stop position in the slot + below the current one. */ + it->stack[it->sp - 1].stop_charpos + = CHARPOS (it->stack[it->sp - 1].current.pos); + } + } + else if (display_ellipsis_p) + { + it->ellipsis_p = true; + /* Let the ellipsis display before + considering any properties of the following char. + Fixes jasonr@gnu.org 01 Oct 07 bug. */ + handled = HANDLED_RETURN; + } + } + } + else if (STRINGP (it->string)) + { + Lisp_Object end_charpos = pos, limit; if (invis != 0 && IT_STRING_CHARPOS (*it) < it->end_charpos) { - /* Record whether we have to display an ellipsis for the - invisible text. */ - bool display_ellipsis_p = (invis == 2); - ptrdiff_t len, endpos; - - handled = HANDLED_RECOMPUTE_PROPS; + ptrdiff_t len = endpos; /* Get the position at which the next visible text can be found in IT->string, if any. */ - endpos = len = SCHARS (it->string); XSETINT (limit, len); do { @@ -5137,7 +5275,7 @@ handle_invisible_prop (struct it *it) IT_STRING_CHARPOS (*it) = it->bidi_it.charpos; IT_STRING_BYTEPOS (*it) = it->bidi_it.bytepos; - if (IT_CHARPOS (*it) >= endpos) + if (IT_STRING_CHARPOS (*it) >= endpos) it->prev_stop = endpos; } else @@ -5167,27 +5305,14 @@ handle_invisible_prop (struct it *it) } } } - else + else /* we are iterating over buffer text at base paragraph level */ { - ptrdiff_t newpos, next_stop, start_charpos, tem; - Lisp_Object pos, overlay; - - /* First of all, is there invisible text at this position? */ - tem = start_charpos = IT_CHARPOS (*it); - pos = make_fixnum (tem); - prop = get_char_property_and_overlay (pos, Qinvisible, it->window, - &overlay); - invis = TEXT_PROP_MEANS_INVISIBLE (prop); + ptrdiff_t newpos, next_stop, tem = curpos; + Lisp_Object pos; /* If we are on invisible text, skip over it. */ - if (invis != 0 && start_charpos < it->end_charpos) + if (invis != 0 && curpos < it->end_charpos) { - /* Record whether we have to display an ellipsis for the - invisible text. */ - bool display_ellipsis_p = invis == 2; - - handled = HANDLED_RECOMPUTE_PROPS; - /* Loop skipping over invisible text. The loop is left at ZV or with IT on the first char being visible again. */ do From fc8b09484a2fbe182a0351c47afc3bf71f3b2a1b Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 09:48:04 +0100 Subject: [PATCH 017/446] ; Fix typos --- ChangeLog.3 | 4 ++-- admin/codespell/codespell.exclude | 2 ++ lisp/erc/erc-common.el | 2 +- lisp/erc/erc.el | 2 +- lisp/eshell/esh-arg.el | 2 +- lisp/forms.el | 2 +- lisp/progmodes/eglot.el | 2 +- src/fns.c | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ChangeLog.3 b/ChangeLog.3 index dc712df43ad..7db4986410d 100644 --- a/ChangeLog.3 +++ b/ChangeLog.3 @@ -137530,7 +137530,7 @@ Bind `enable-local-variables' in `hack-connection-local-variables' * lisp/files-x.el (hack-connection-local-variables): - Bind `enable-local-variables', instead of re-declaring + Bind `enable-local-variables', instead of redeclaring `safe-local-variable-p'. 2019-03-23 Eli Zaretskii @@ -163179,7 +163179,7 @@ Quieten compilation of octave.el - * lisp/progmodes/octave.el (compilation-forget-errors): Re-declare. + * lisp/progmodes/octave.el (compilation-forget-errors): Redeclare. 2018-02-28 Glenn Morris diff --git a/admin/codespell/codespell.exclude b/admin/codespell/codespell.exclude index 416d79cf131..6413a73701b 100644 --- a/admin/codespell/codespell.exclude +++ b/admin/codespell/codespell.exclude @@ -1583,3 +1583,5 @@ VERY VERY LONG STRIN | VERY VERY LONG STRIN (ert-info ("Joined by bouncer to #chan@foonet, pal persent") (ert-info ("Joined by bouncer to #chan@barnet, pal persent") .UE . + (0.03 ":bob!~u@euegh6mj3y8r2.irc PRIVMSG #chan :alice: See, by good hap, yonder's my lord; I have sweat to see his honour.") + (0.05 ":bob!~u@euegh6mj3y8r2.irc PRIVMSG #chan :alice: But, in defence, by mercy, 'tis most just.") diff --git a/lisp/erc/erc-common.el b/lisp/erc/erc-common.el index abcdc4c8843..8388efe062c 100644 --- a/lisp/erc/erc-common.el +++ b/lisp/erc/erc-common.el @@ -171,7 +171,7 @@ Derived from the advertised \"PREFIX\" ISUPPORT parameter." ;; After dropping 28, we can use prefixed "erc-autoload" cookies. (defun erc--normalize-module-symbol (symbol) - "Return preferred SYMBOL for `erc--modules'." + "Return preferred SYMBOL for `erc--module'." (while-let ((canonical (get symbol 'erc--module)) ((not (eq canonical symbol)))) (setq symbol canonical)) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index ef047201251..08dfa4b8f1b 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -6815,7 +6815,7 @@ stand-in from the fallback value \"(qaohv)~&@%+\"." "Return numeric rank for CHAR or nil if unknown. For example, given letters \"qaohv\" return 1 for ?v, 2 for ?h, and 4 for ?o, etc. If given, expect PARSED-PREFIX to be a -`erc--parse-prefix' object. With FROM-PREFIX-P, expect CHAR to +`erc--parsed-prefix' object. With FROM-PREFIX-P, expect CHAR to be a prefix instead." (and-let* ((obj (or parsed-prefix (erc--parsed-prefix))) (pos (erc--strpos char (if from-prefix-p diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el index 97ddac58629..78cf28d785a 100644 --- a/lisp/eshell/esh-arg.el +++ b/lisp/eshell/esh-arg.el @@ -285,7 +285,7 @@ QUOTED is passed to `eshell-concat' (which see) and, if non-nil, allows values to be converted to numbers where appropriate. ARGS should be a list of lists of arguments, such as that -produced by `eshell-prepare-slice'. \"Adjacent\" values of +produced by `eshell-prepare-splice'. \"Adjacent\" values of consecutive arguments will be passed to `eshell-concat'. For example, if ARGS is diff --git a/lisp/forms.el b/lisp/forms.el index 009667af273..3a3160a0c8b 100644 --- a/lisp/forms.el +++ b/lisp/forms.el @@ -343,7 +343,7 @@ suitable for forms processing.") (defvar forms-write-file-filter nil "The name of a function that is called before writing the data file. -This can be used to undo the effects of `form-read-file-filter'.") +This can be used to undo the effects of `forms-read-file-filter'.") (defvar forms-new-record-filter nil "The name of a function that is called when a new record is created.") diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index df8a287b4f2..2f32a8e6eda 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -591,7 +591,7 @@ It is nil if Eglot is not byte-complied.") (let ((vec (copy-sequence url-path-allowed-chars))) (aset vec ?: nil) ;; see github#639 vec) - "Like `url-path-allows-chars' but more restrictive.") + "Like `url-path-allowed-chars' but more restrictive.") ;;; Message verification helpers diff --git a/src/fns.c b/src/fns.c index 1262e3e749e..08908d481a3 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5374,7 +5374,7 @@ mark_fns (void) } } -/* Find the hash_table_test object correponding to the (bare) symbol TEST, +/* Find the hash_table_test object corresponding to the (bare) symbol TEST, creating one if none existed. */ static struct hash_table_test * get_hash_table_user_test (Lisp_Object test) From 56d0fbd99a87858717e08488df57db7fc08a2891 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 10:28:18 +0100 Subject: [PATCH 018/446] Add alias progress-reporter-make * lisp/subr.el (progress-reporter-make): New alias for 'make-progress-reporter'. --- lisp/subr.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index a97824965b5..582415a9761 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1,7 +1,6 @@ ;;; subr.el --- basic lisp subroutines for Emacs -*- lexical-binding:t -*- -;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2024 Free Software -;; Foundation, Inc. +;; Copyright (C) 1985-2024 Free Software Foundation, Inc. ;; Maintainer: emacs-devel@gnu.org ;; Keywords: internal @@ -6736,6 +6735,8 @@ effectively rounded up." (progress-reporter-update reporter (or current-value min-value)) reporter)) +(defalias 'progress-reporter-make #'make-progress-reporter) + (defun progress-reporter-force-update (reporter &optional value new-message suffix) "Report progress of an operation in the echo area unconditionally. From 9bbf8232dba746db90b90285e9e4ed6d299d251a Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 10:28:40 +0100 Subject: [PATCH 019/446] Delete compat code in `url` library * lisp/url/url-cid.el (url-cid): Delete compat code for ancient Gnus. * lisp/url/url-ldap.el (url-ldap-certificate-formatter): Delete compat code; ssl.el has never been in Emacs. * lisp/url/url-mailto.el (url-mail): Make into alias for 'message-mail', since it is always fboundp. --- lisp/url/url-cid.el | 11 +++-------- lisp/url/url-ldap.el | 10 +++------- lisp/url/url-mailto.el | 17 ++++------------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/lisp/url/url-cid.el b/lisp/url/url-cid.el index 17a0318e652..d80037f8fe9 100644 --- a/lisp/url/url-cid.el +++ b/lisp/url/url-cid.el @@ -1,6 +1,6 @@ ;;; url-cid.el --- Content-ID URL loader -*- lexical-binding: t; -*- -;; Copyright (C) 1998-1999, 2004-2024 Free Software Foundation, Inc. +;; Copyright (C) 1998-2024 Free Software Foundation, Inc. ;; Keywords: comm, data, processes @@ -52,12 +52,7 @@ ;;;###autoload (defun url-cid (url) - (cond - ((fboundp 'mm-get-content-id) - ;; Using Pterodactyl Gnus or later - (with-current-buffer (generate-new-buffer " *url-cid*") - (url-cid-gnus (url-filename url)))) - (t - (message "Unable to handle CID URL: %s" url)))) + (with-current-buffer (generate-new-buffer " *url-cid*") + (url-cid-gnus (url-filename url)))) ;;; url-cid.el ends here diff --git a/lisp/url/url-ldap.el b/lisp/url/url-ldap.el index 1bdd5099637..6aaea606c27 100644 --- a/lisp/url/url-ldap.el +++ b/lisp/url/url-ldap.el @@ -1,6 +1,6 @@ ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code -*- lexical-binding: t; -*- -;; Copyright (C) 1998-1999, 2004-2024 Free Software Foundation, Inc. +;; Copyright (C) 1998-2024 Free Software Foundation, Inc. ;; Keywords: comm, data, processes @@ -92,12 +92,8 @@ "'>" dn "")) (defun url-ldap-certificate-formatter (data) - (condition-case () - (require 'ssl) - (error nil)) - (let ((vals (if (fboundp 'ssl-certificate-information) - (ssl-certificate-information data) - (tls-certificate-information data)))) + ;; FIXME: tls.el is obsolete. + (let ((vals (tls-certificate-information data))) (if (not vals) "Unable to parse certificate" (concat "\n" diff --git a/lisp/url/url-mailto.el b/lisp/url/url-mailto.el index c2d347a1646..50293ab3f05 100644 --- a/lisp/url/url-mailto.el +++ b/lisp/url/url-mailto.el @@ -1,6 +1,6 @@ ;;; url-mailto.el --- Mail Uniform Resource Locator retrieval code -*- lexical-binding: t; -*- -;; Copyright (C) 1996-1999, 2004-2024 Free Software Foundation, Inc. +;; Copyright (C) 1996-2024 Free Software Foundation, Inc. ;; Keywords: comm, data, processes @@ -28,12 +28,7 @@ (require 'url-util) ;;;###autoload -(defun url-mail (&rest args) - (interactive "P") - (if (fboundp 'message-mail) - (apply 'message-mail args) - (or (apply 'mail args) - (error "Mail aborted")))) +(defalias 'url-mail #'message-mail) (defun url-mail-goto-field (field) (if (not field) @@ -57,8 +52,6 @@ (save-excursion (insert "\n")))))) -(declare-function mail-send-and-exit "sendmail") - ;;;###autoload (defun url-mailto (url) "Handle the mailto: URL syntax." @@ -111,8 +104,6 @@ ;; (setq func (intern-soft (concat "mail-" (caar args)))) (insert (mapconcat 'identity (cdar args) ", "))) (setq args (cdr args))) - ;; (url-mail-goto-field "User-Agent") -;; (insert url-package-name "/" url-package-version " URL/" url-version) (if (not url-request-data) (progn (set-buffer-modified-p nil) @@ -128,8 +119,8 @@ (goto-char (point-max)) (insert url-request-data) ;; It seems Microsoft-ish to send without warning. - ;; Fixme: presumably this should depend on a privacy setting. - (if (y-or-n-p "Send this auto-generated mail? ") + ;; FIXME: presumably this should depend on a privacy setting. + (if (y-or-n-p "Send this auto-generated mail?") (let ((buffer (current-buffer))) (cond ((eq url-mail-command 'compose-mail) (funcall (get mail-user-agent 'sendfunc) nil)) From e44b9f35793d642d5155fde035e3bc92102d13a1 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 11:26:43 +0100 Subject: [PATCH 020/446] * lisp/speedbar.el (imenu): Require unconditionally. --- lisp/speedbar.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/speedbar.el b/lisp/speedbar.el index 1cb72dc23e6..2ed97986fe7 100644 --- a/lisp/speedbar.el +++ b/lisp/speedbar.el @@ -3488,7 +3488,7 @@ functions to do caching and flushing if appropriate." nil -(eval-when-compile (condition-case nil (require 'imenu) (error nil))) +(eval-when-compile (require 'imenu)) (declare-function imenu--make-index-alist "imenu" (&optional no-error)) (defun speedbar-fetch-dynamic-imenu (file) From 4d57187a248d3243dcc8b5da5d8365cb1b54a347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 3 Feb 2024 16:46:59 +0100 Subject: [PATCH 021/446] Prevent cache of diff-mode buffers to grow without bounds Previously, these " *diff-syntax:..." buffers were never removed. Now we discard the least recently used half of them every hour. * lisp/vc/diff-mode.el (diff--cached-revision-buffers) (diff--cache-clean-interval, diff--cache-clean-timer, diff--cache-clean) (diff--cache-schedule-clean, diff--get-revision-properties): New. (diff-syntax-fontify-hunk): Use diff--get-revision-properties. --- lisp/vc/diff-mode.el | 69 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 83d580d98dd..34a4b70691d 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2817,6 +2817,57 @@ and the position in MAX." (defvar-local diff--syntax-file-attributes nil) (put 'diff--syntax-file-attributes 'permanent-local t) +(defvar diff--cached-revision-buffers nil + "List of ((FILE . REVISION) . BUFFER) in MRU order.") + +(defvar diff--cache-clean-timer nil) +(defconst diff--cache-clean-interval 3600) ; seconds + +(defun diff--cache-clean () + "Discard the least recently used half of the cache." + (let ((n (/ (length diff--cached-revision-buffers) 2))) + (mapc #'kill-buffer (mapcar #'cdr (nthcdr n diff--cached-revision-buffers))) + (setq diff--cached-revision-buffers + (ntake n diff--cached-revision-buffers))) + (diff--cache-schedule-clean)) + +(defun diff--cache-schedule-clean () + (setq diff--cache-clean-timer + (and diff--cached-revision-buffers + (run-with-timer diff--cache-clean-interval nil + #'diff--cache-clean)))) + +(defun diff--get-revision-properties (file revision text line-nb) + "Get font-lock properties from FILE at REVISION for TEXT at LINE-NB." + (let* ((file-rev (cons file revision)) + (entry (assoc file-rev diff--cached-revision-buffers)) + (buffer (cdr entry))) + (if (buffer-live-p buffer) + (progn + ;; Don't re-initialize the buffer (which would throw + ;; away the previous fontification work). + (setq file nil) + (setq diff--cached-revision-buffers + (cons entry + (delq entry diff--cached-revision-buffers)))) + ;; Cache miss: create a new entry. + (setq buffer (get-buffer-create (format " *diff-syntax:%s.~%s~*" + file revision))) + (condition-case nil + (vc-find-revision-no-save file revision diff-vc-backend buffer) + (error + (kill-buffer buffer) + (setq buffer nil)) + (:success + (push (cons file-rev buffer) + diff--cached-revision-buffers)))) + (when diff--cache-clean-timer + (cancel-timer diff--cache-clean-timer)) + (diff--cache-schedule-clean) + (and buffer + (with-current-buffer buffer + (diff-syntax-fontify-props file text line-nb))))) + (defun diff-syntax-fontify-hunk (beg end old) "Highlight source language syntax in diff hunk between BEG and END. When OLD is non-nil, highlight the hunk from the old source." @@ -2867,22 +2918,8 @@ When OLD is non-nil, highlight the hunk from the old source." (insert-file-contents file) (setq diff--syntax-file-attributes attrs))) (diff-syntax-fontify-props file text line-nb))))) - ;; Get properties from a cached revision - (let* ((buffer-name (format " *diff-syntax:%s.~%s~*" - file revision)) - (buffer (get-buffer buffer-name))) - (if buffer - ;; Don't re-initialize the buffer (which would throw - ;; away the previous fontification work). - (setq file nil) - (setq buffer (ignore-errors - (vc-find-revision-no-save - file revision - diff-vc-backend - (get-buffer-create buffer-name))))) - (when buffer - (with-current-buffer buffer - (diff-syntax-fontify-props file text line-nb)))))))) + (diff--get-revision-properties file revision + text line-nb))))) (let ((file (car (diff-hunk-file-names old)))) (cond ((and file diff-default-directory From 70c10204f0025eac844a88b0ef85cfca44cff61c Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 13:16:59 +0100 Subject: [PATCH 022/446] Prefer setq-local in more places * lisp/erc/erc-compat.el (erc-set-write-file-functions): * lisp/obsolete/iswitchb.el (iswitchb-minibuffer-setup-hook) (iswitchb-minibuffer-setup): * lisp/obsolete/longlines.el (longlines-mode): * lisp/obsolete/rcompile.el (remote-compile): * lisp/progmodes/cperl-mode.el (cperl-file-style): * test/lisp/erc/erc-tests.el (erc-ring-previous-command): Prefer setq-local. --- lisp/erc/erc-compat.el | 2 +- lisp/obsolete/iswitchb.el | 4 ++-- lisp/obsolete/longlines.el | 14 +++++--------- lisp/obsolete/rcompile.el | 14 +++++++------- lisp/progmodes/cperl-mode.el | 2 +- test/lisp/erc/erc-tests.el | 2 +- 6 files changed, 17 insertions(+), 21 deletions(-) diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el index dede833a93d..37fcdebbe7b 100644 --- a/lisp/erc/erc-compat.el +++ b/lisp/erc/erc-compat.el @@ -102,7 +102,7 @@ See `erc-encoding-coding-alist'." (defun erc-set-write-file-functions (new-val) (declare (obsolete nil "28.1")) - (set (make-local-variable 'write-file-functions) new-val)) + (setq-local 'write-file-functions new-val)) (defvar erc-emacs-build-time (if (or (stringp emacs-build-time) (not emacs-build-time)) diff --git a/lisp/obsolete/iswitchb.el b/lisp/obsolete/iswitchb.el index 3f05b7fe7ac..d541dc085c6 100644 --- a/lisp/obsolete/iswitchb.el +++ b/lisp/obsolete/iswitchb.el @@ -370,7 +370,7 @@ See documentation of `walk-windows' for useful values." This hook is run during minibuffer setup if `iswitchb' is active. For instance: \(add-hook \\='iswitchb-minibuffer-setup-hook - \\='\(lambda () (set (make-local-variable \\='max-mini-window-height) 3))) + \\='\(lambda () (setq-local \\='max-mini-window-height 3))) will constrain the minibuffer to a maximum height of 3 lines when iswitchb is running." :type 'hook) @@ -1262,7 +1262,7 @@ Modified from `icomplete-completions'." "Set up minibuffer for `iswitchb-buffer'. Copied from `icomplete-minibuffer-setup-hook'." (when (iswitchb-entryfn-p) - (set (make-local-variable 'iswitchb-use-mycompletion) t) + (setq-local 'iswitchb-use-mycompletion t) (add-hook 'pre-command-hook #'iswitchb-pre-command nil t) (add-hook 'post-command-hook #'iswitchb-post-command nil t) (run-hooks 'iswitchb-minibuffer-setup-hook))) diff --git a/lisp/obsolete/longlines.el b/lisp/obsolete/longlines.el index 6aa388805f2..e73e9e0c85b 100644 --- a/lisp/obsolete/longlines.el +++ b/lisp/obsolete/longlines.el @@ -116,17 +116,14 @@ newlines are indicated with a symbol." ;; Turn on longlines mode (progn (use-hard-newlines 1 'never) - (set (make-local-variable 'require-final-newline) nil) + (setq-local 'require-final-newline nil) (add-to-list 'buffer-file-format 'longlines) (add-hook 'change-major-mode-hook #'longlines-mode-off nil t) (add-hook 'before-revert-hook #'longlines-before-revert-hook nil t) (make-local-variable 'longlines-auto-wrap) - (set (make-local-variable 'isearch-search-fun-function) - #'longlines-search-function) - (set (make-local-variable 'replace-search-function) - #'longlines-search-forward) - (set (make-local-variable 'replace-re-search-function) - #'longlines-re-search-forward) + (setq-local 'isearch-search-fun-function #'longlines-search-function) + (setq-local 'replace-search-function #'longlines-search-forward) + (setq-local 'replace-re-search-function #'longlines-re-search-forward) (add-function :filter-return (local 'filter-buffer-substring-function) #'longlines-encode-string) (when longlines-wrap-follows-window-size @@ -136,8 +133,7 @@ newlines are indicated with a symbol." (window-width))) longlines-wrap-follows-window-size 2))) - (set (make-local-variable 'fill-column) - (- (window-width) dw))) + (setq-local 'fill-column (- (window-width) dw))) (add-hook 'window-configuration-change-hook #'longlines-window-change-function nil t)) (let ((buffer-undo-list t) diff --git a/lisp/obsolete/rcompile.el b/lisp/obsolete/rcompile.el index e0826475e32..877a143f6ad 100644 --- a/lisp/obsolete/rcompile.el +++ b/lisp/obsolete/rcompile.el @@ -169,12 +169,12 @@ See \\[compile]." ;; compilation-parse-errors will find referenced files by Tramp. (with-current-buffer next-error-last-buffer (when (fboundp 'tramp-make-tramp-file-name) - (set (make-local-variable 'comint-file-name-prefix) - (funcall - #'tramp-make-tramp-file-name - nil ;; method. - remote-compile-user - remote-compile-host - "")))))) + (setq-local 'comint-file-name-prefix + (funcall + #'tramp-make-tramp-file-name + nil ;; method. + remote-compile-user + remote-compile-host + "")))))) ;;; rcompile.el ends here diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 758a6e17f72..dc3b31c79ac 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -6557,7 +6557,7 @@ and \"Whitesmith\"." (let ((option (car setting)) (value (cdr setting))) (set (make-local-variable option) value))) - (set (make-local-variable 'cperl-file-style) style)) + (setq-local 'cperl-file-style style)) (declare-function Info-find-node "info" (filename nodename &optional no-going-back strict-case diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 7890049a325..440b52fe106 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1278,7 +1278,7 @@ (setq erc-server-current-nick "tester") (setq-local erc-last-input-time 0) (should-not (local-variable-if-set-p 'erc-send-completed-hook)) - (set (make-local-variable 'erc-send-completed-hook) nil) ; skip t (globals) + (setq-local 'erc-send-completed-hook nil) ; skip t (globals) ;; Just in case erc-ring-mode is already on (setq-local erc--input-review-functions erc--input-review-functions) (add-hook 'erc--input-review-functions #'erc-add-to-input-ring) From a4587646fabf2b7f0cb19a7e0bee090f9106a73a Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 4 Feb 2024 13:20:15 +0100 Subject: [PATCH 023/446] ; Fix my last commit --- lisp/erc/erc-compat.el | 2 +- lisp/obsolete/iswitchb.el | 4 ++-- lisp/obsolete/longlines.el | 10 +++++----- lisp/obsolete/rcompile.el | 2 +- lisp/progmodes/cperl-mode.el | 2 +- test/lisp/erc/erc-tests.el | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el index 37fcdebbe7b..9b8699f6949 100644 --- a/lisp/erc/erc-compat.el +++ b/lisp/erc/erc-compat.el @@ -102,7 +102,7 @@ See `erc-encoding-coding-alist'." (defun erc-set-write-file-functions (new-val) (declare (obsolete nil "28.1")) - (setq-local 'write-file-functions new-val)) + (setq-local write-file-functions new-val)) (defvar erc-emacs-build-time (if (or (stringp emacs-build-time) (not emacs-build-time)) diff --git a/lisp/obsolete/iswitchb.el b/lisp/obsolete/iswitchb.el index d541dc085c6..e1ea9141f0d 100644 --- a/lisp/obsolete/iswitchb.el +++ b/lisp/obsolete/iswitchb.el @@ -370,7 +370,7 @@ See documentation of `walk-windows' for useful values." This hook is run during minibuffer setup if `iswitchb' is active. For instance: \(add-hook \\='iswitchb-minibuffer-setup-hook - \\='\(lambda () (setq-local \\='max-mini-window-height 3))) + \\='\(lambda () (setq-local max-mini-window-height 3))) will constrain the minibuffer to a maximum height of 3 lines when iswitchb is running." :type 'hook) @@ -1262,7 +1262,7 @@ Modified from `icomplete-completions'." "Set up minibuffer for `iswitchb-buffer'. Copied from `icomplete-minibuffer-setup-hook'." (when (iswitchb-entryfn-p) - (setq-local 'iswitchb-use-mycompletion t) + (setq-local iswitchb-use-mycompletion t) (add-hook 'pre-command-hook #'iswitchb-pre-command nil t) (add-hook 'post-command-hook #'iswitchb-post-command nil t) (run-hooks 'iswitchb-minibuffer-setup-hook))) diff --git a/lisp/obsolete/longlines.el b/lisp/obsolete/longlines.el index e73e9e0c85b..f065bcaff26 100644 --- a/lisp/obsolete/longlines.el +++ b/lisp/obsolete/longlines.el @@ -116,14 +116,14 @@ newlines are indicated with a symbol." ;; Turn on longlines mode (progn (use-hard-newlines 1 'never) - (setq-local 'require-final-newline nil) + (setq-local require-final-newline nil) (add-to-list 'buffer-file-format 'longlines) (add-hook 'change-major-mode-hook #'longlines-mode-off nil t) (add-hook 'before-revert-hook #'longlines-before-revert-hook nil t) (make-local-variable 'longlines-auto-wrap) - (setq-local 'isearch-search-fun-function #'longlines-search-function) - (setq-local 'replace-search-function #'longlines-search-forward) - (setq-local 'replace-re-search-function #'longlines-re-search-forward) + (setq-local isearch-search-fun-function #'longlines-search-function) + (setq-local replace-search-function #'longlines-search-forward) + (setq-local replace-re-search-function #'longlines-re-search-forward) (add-function :filter-return (local 'filter-buffer-substring-function) #'longlines-encode-string) (when longlines-wrap-follows-window-size @@ -133,7 +133,7 @@ newlines are indicated with a symbol." (window-width))) longlines-wrap-follows-window-size 2))) - (setq-local 'fill-column (- (window-width) dw))) + (setq-local fill-column (- (window-width) dw))) (add-hook 'window-configuration-change-hook #'longlines-window-change-function nil t)) (let ((buffer-undo-list t) diff --git a/lisp/obsolete/rcompile.el b/lisp/obsolete/rcompile.el index 877a143f6ad..258b2b519d9 100644 --- a/lisp/obsolete/rcompile.el +++ b/lisp/obsolete/rcompile.el @@ -169,7 +169,7 @@ See \\[compile]." ;; compilation-parse-errors will find referenced files by Tramp. (with-current-buffer next-error-last-buffer (when (fboundp 'tramp-make-tramp-file-name) - (setq-local 'comint-file-name-prefix + (setq-local comint-file-name-prefix (funcall #'tramp-make-tramp-file-name nil ;; method. diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index dc3b31c79ac..113eed64917 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -6557,7 +6557,7 @@ and \"Whitesmith\"." (let ((option (car setting)) (value (cdr setting))) (set (make-local-variable option) value))) - (setq-local 'cperl-file-style style)) + (setq-local cperl-file-style style)) (declare-function Info-find-node "info" (filename nodename &optional no-going-back strict-case diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 440b52fe106..7d189d37929 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1278,7 +1278,7 @@ (setq erc-server-current-nick "tester") (setq-local erc-last-input-time 0) (should-not (local-variable-if-set-p 'erc-send-completed-hook)) - (setq-local 'erc-send-completed-hook nil) ; skip t (globals) + (setq-local erc-send-completed-hook nil) ; skip t (globals) ;; Just in case erc-ring-mode is already on (setq-local erc--input-review-functions erc--input-review-functions) (add-hook 'erc--input-review-functions #'erc-add-to-input-ring) From d0673ea0d42048c140f4e5c6db18f78a43303256 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 4 Feb 2024 16:11:20 +0200 Subject: [PATCH 024/446] ; * etc/PROBLEMS: Workaround for Windows key "stuck" (bug#68914). --- etc/PROBLEMS | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/etc/PROBLEMS b/etc/PROBLEMS index 1254f6a3bc9..60904408af8 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -476,6 +476,29 @@ You are probably using a shell that doesn't support job control, even though the system itself is capable of it. Either use a different shell, or set the variable 'cannot-suspend' to a non-nil value. +*** Emacs running on WSL receives stray characters as input. + +For example, you could see Emacs inserting 'z' characters even though +nothing is typed on the keyboard, and even if you unplug the keyboard. + +The reason is a bug in the WSL X server's handling of key-press and +key-repeat events. A workaround is to use the Cygwin or native +MS-Windows build of Emacs instead. + +*** On MS-Windows, the Windows key gets "stuck". +When this problem happens, Windows behaves as if the Windows key were +permanently pressed down. This could be a side effect of Emacs on +MS-Windows hooking keyboard input on a low level, in order to support +registering the Windows keys as hot keys. If that hook takes too much +time for some reason, Windows can decide to remove the hook, which +then has this effect. + +This is arguably a bug in Emacs, for which we don't yet have a +solution. To work around, set the 'LowLevelHooksTimeout' value in the +registry key "HKEY_CURRENT_USER\Control Panel\Desktop" to a number +higher than 200 msec; the maximum allowed value is 1000 msec (create +the value if it doesn't exist under that key). + ** Mailers and other helper programs *** movemail compiled with POP support can't connect to the POP server. @@ -545,15 +568,6 @@ As a workaround, input the passphrase with a GUI-capable pinentry program like 'pinentry-gnome' or 'pinentry-qt5'. Alternatively, you can use the 'pinentry' package from Emacs 25. -*** Emacs running on WSL receives stray characters as input. - -For example, you could see Emacs inserting 'z' characters even though -nothing is typed on the keyboard, and even if you unplug the keyboard. - -The reason is a bug in the WSL X server's handling of key-press and -key-repeat events. A workaround is to use the Cygwin or native -MS-Windows build of Emacs instead. - ** Problems with hostname resolution *** Emacs does not know your host's fully-qualified domain name. From 4749699370370a6bf0d50612dafe871dbaf52924 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 4 Feb 2024 19:22:21 +0200 Subject: [PATCH 025/446] * doc/lispref/parsing.texi (Retrieving Nodes): Improve documentation. Update optional arguments 'predicate' and 'include-node' of 'treesit-node-top-level'. --- doc/lispref/parsing.texi | 25 ++++++++++++++----------- test/src/treesit-tests.el | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi index 26204164243..fbd739b76d5 100644 --- a/doc/lispref/parsing.texi +++ b/doc/lispref/parsing.texi @@ -785,7 +785,7 @@ that comes after it in the buffer position order, i.e., nodes with start positions greater than the end position of @var{start}. In the tree shown above, @code{treesit-search-subtree} traverses node -@samp{S} (@var{start}) and nodes marked with @code{o}, where this +@samp{S} (@var{start}) and nodes marked with @code{o}, whereas this function traverses the nodes marked with numbers. This function is useful for answering questions like ``what is the first node after @var{start} in the buffer that satisfies some condition?'' @@ -860,32 +860,35 @@ nodes. @defun treesit-parent-until node predicate &optional include-node This function repeatedly finds the parents of @var{node}, and returns -the parent that satisfies @var{pred}, a function that takes a node as +the parent that satisfies @var{predicate}, a function that takes a node as argument and returns a boolean that indicates a match. If no parent -satisfies @var{pred}, this function returns @code{nil}. +satisfies @var{predicate}, this function returns @code{nil}. Normally this function only looks at the parents of @var{node} but not @var{node} itself. But if @var{include-node} is non-@code{nil}, this -function returns @var{node} if @var{node} satisfies @var{pred}. +function returns @var{node} if @var{node} satisfies @var{predicate}. @end defun -@defun treesit-parent-while node pred +@defun treesit-parent-while node predicate This function goes up the tree starting from @var{node}, and keeps -doing so as long as the nodes satisfy @var{pred}, a function that +doing so as long as the nodes satisfy @var{predicate}, a function that takes a node as argument. That is, this function returns the highest -parent of @var{node} that still satisfies @var{pred}. Note that if -@var{node} satisfies @var{pred} but its immediate parent doesn't, +parent of @var{node} that still satisfies @var{predicate}. Note that if +@var{node} satisfies @var{predicate} but its immediate parent doesn't, @var{node} itself is returned. @end defun -@defun treesit-node-top-level node &optional type +@defun treesit-node-top-level node &optional predicate include-node This function returns the highest parent of @var{node} that has the same type as @var{node}. If no such parent exists, it returns @code{nil}. Therefore this function is also useful for testing whether @var{node} is top-level. -If @var{type} is non-@code{nil}, this function matches each parent's -type with @var{type} as a regexp, rather than using @var{node}'s type. +If @var{predicate} is @code{nil}, this function uses @var{node}'s type +to find the parent. If @var{predicate} is non-@code{nil}, this +function searches the parent that satisfies @var{predicate}. If +@var{include-node} is non-@code{nil}, this function returns @var{node} +if @var{node} satisfies @var{predicate}. @end defun @node Accessing Node Information diff --git a/test/src/treesit-tests.el b/test/src/treesit-tests.el index 1cd783bd05e..3eda6fd3c53 100644 --- a/test/src/treesit-tests.el +++ b/test/src/treesit-tests.el @@ -243,7 +243,7 @@ (should (eq nil (treesit-node-text (treesit-search-subtree subarray "\\[")))) - ;; If ALL=nil, searching for number should still find the + ;; If ALL=t, searching for number should still find the ;; numbers. (should (equal "1" (treesit-node-text (treesit-search-subtree From 57024e1e9314501b103a4d36b9b166761a2ad756 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 4 Feb 2024 12:50:55 -0500 Subject: [PATCH 026/446] (w->base_line_number): Rework the way we flush the cache * src/xdisp.c (BASE_LINE_NUMBER_VALID_P): New macro. (try_scrolling): Use it. (redisplay_window, Fformat_mode_line): Use it to flush the base_line_number (if it's stale) once at the beginning. (decode_mode_spec): Don't use (or set) `w->start` and `w->base_line_number` when operating on another buffer! --- src/xdisp.c | 82 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 40311ee8ea7..750ebb703a6 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -18861,6 +18861,14 @@ enum `scroll-conservatively' and the Emacs manual. */ #define SCROLL_LIMIT 100 +/* The freshness of the w->base_line_number cache is only ensured at every + redisplay cycle, so the cache can be used only if there's been + no relevant changes to the buffer since the last redisplay. */ +#define BASE_LINE_NUMBER_VALID_P(w) \ + (eassert (current_buffer == XBUFFER ((w)->contents)), \ + !current_buffer->clip_changed \ + && BEG_UNCHANGED >= (w)->base_line_pos) + static int try_scrolling (Lisp_Object window, bool just_this_one_p, intmax_t arg_scroll_conservatively, intmax_t scroll_step, @@ -19161,9 +19169,10 @@ try_scrolling (Lisp_Object window, bool just_this_one_p, else { /* Maybe forget recorded base line for line number display. */ - if (!just_this_one_p - || current_buffer->clip_changed - || BEG_UNCHANGED < CHARPOS (startp)) + /* FIXME: Why do we need this? `try_scrolling` can only be called from + `redisplay_window` which should have flushed this cache already when + eeded. */ + if (!BASE_LINE_NUMBER_VALID_P (w)) w->base_line_number = 0; /* If cursor ends up on a partially visible line, @@ -19933,9 +19942,6 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) /* Record it now because it's overwritten. */ bool current_matrix_up_to_date_p = false; bool used_current_matrix_p = false; - /* This is less strict than current_matrix_up_to_date_p. - It indicates that the buffer contents and narrowing are unchanged. */ - bool buffer_unchanged_p = false; bool temp_scroll_step = false; specpdl_ref count = SPECPDL_INDEX (); int rc; @@ -20041,11 +20047,6 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) specbind (Qinhibit_point_motion_hooks, Qt); - buffer_unchanged_p - = (w->window_end_valid - && !current_buffer->clip_changed - && !window_outdated (w)); - /* When windows_or_buffers_changed is non-zero, we can't rely on the window end being valid, so set it to zero there. */ if (windows_or_buffers_changed) @@ -20185,6 +20186,10 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) } } + if (!BASE_LINE_NUMBER_VALID_P (w)) + /* Forget any recorded base line for line number display. */ + w->base_line_number = 0; + force_start: /* Handle case where place to start displaying has been specified, @@ -20205,10 +20210,6 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) w->preserve_vscroll_p = false; w->window_end_valid = false; - /* Forget any recorded base line for line number display. */ - if (!buffer_unchanged_p) - w->base_line_number = 0; - /* Redisplay the mode line. Select the buffer properly for that. Also, run the hook window-scroll-functions because we have scrolled. */ @@ -20537,12 +20538,6 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) if (w->cursor.vpos >= 0) { - if (!just_this_one_p - || current_buffer->clip_changed - || BEG_UNCHANGED < CHARPOS (startp)) - /* Forget any recorded base line for line number display. */ - w->base_line_number = 0; - if (!cursor_row_fully_visible_p (w, true, false, false)) { clear_glyph_matrix (w->desired_matrix); @@ -20613,10 +20608,6 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) debug_method_add (w, "recenter"); #endif - /* Forget any previously recorded base line for line number display. */ - if (!buffer_unchanged_p) - w->base_line_number = 0; - /* Determine the window start relative to point. */ init_iterator (&it, w, PT, PT_BYTE, NULL, DEFAULT_FACE_ID); it.current_y = it.last_visible_y; @@ -24783,6 +24774,13 @@ maybe_produce_line_number (struct it *it) if (!last_line) { /* If possible, reuse data cached by line-number-mode. */ + /* NOTE: We use `base_line_number` without checking + BASE_LINE_NUMBER_VALID_P because we assume that `redisplay_window` + has already flushed this cache for us when needed. + NOTE²: Checking BASE_LINE_NUMBER_VALID_P here would be + overly pessimistic because it might say that the cache + was invalid before entering `redisplay_window` yet the + value has just been refreshed. */ if (it->w->base_line_number > 0 && it->w->base_line_pos > 0 && it->w->base_line_pos <= IT_CHARPOS (*it) @@ -28175,6 +28173,11 @@ are the selected window and the WINDOW's buffer). */) init_iterator (&it, w, -1, -1, NULL, face_id); + /* Make sure `base_line_number` is fresh in case we encounter a `%l`. */ + if (current_buffer == XBUFFER ((w)->contents) + && !BASE_LINE_NUMBER_VALID_P (w)) + w->base_line_number = 0; + if (no_props) { mode_line_target = MODE_LINE_NOPROP; @@ -28627,30 +28630,29 @@ decode_mode_spec (struct window *w, register int c, int field_width, when the buffer's restriction was changed, but the window wasn't yet redisplayed after that. If that happens, we need to determine a new base line. */ - if (!(BUF_BEGV_BYTE (b) <= startpos_byte + if (current_buffer != XBUFFER (w->contents) + || !(BUF_BEGV_BYTE (b) <= startpos_byte && startpos_byte <= BUF_ZV_BYTE (b))) { startpos = BUF_BEGV (b); startpos_byte = BUF_BEGV_BYTE (b); - w->base_line_pos = 0; - w->base_line_number = 0; } /* If we decided that this buffer isn't suitable for line numbers, - don't forget that too fast. */ + don't forget that too fast. + FIXME: What if `current_buffer != w->contents`? */ if (w->base_line_pos == -1) goto no_value; /* If the buffer is very big, don't waste time. */ if (FIXNUMP (Vline_number_display_limit) && BUF_ZV (b) - BUF_BEGV (b) > XFIXNUM (Vline_number_display_limit)) - { - w->base_line_pos = 0; - w->base_line_number = 0; - goto no_value; - } + goto no_value; - if (w->base_line_number > 0 + /* Callers of `display_mode_element` are in charge of flushing + any stale `base_line_number` cache. */ + if (current_buffer == XBUFFER ((w)->contents) + && w->base_line_number > 0 && w->base_line_pos > 0 && w->base_line_pos <= startpos) { @@ -28676,7 +28678,9 @@ decode_mode_spec (struct window *w, register int c, int field_width, or too far away, or if we did not have one. "Too close" means it's plausible a scroll-down would go back past it. */ - if (startpos == BUF_BEGV (b)) + if (current_buffer != XBUFFER (w->contents)) + ; /* The base line is for another buffer, don't touch it! */ + else if (startpos == BUF_BEGV (b)) { w->base_line_number = topline; w->base_line_pos = BUF_BEGV (b); @@ -28713,6 +28717,12 @@ decode_mode_spec (struct window *w, register int c, int field_width, goto no_value; } + /* NOTE: if `clip_changed` is set or if `BEG_UNCHANGED` is + before `position`, this new cached value may get flushed + soon needlessly, because we can't reset `BEG_UNCHANGED` or + `clip_changed` from here (since they reflect the changes + since the last redisplay so they can only be reset from + `mark_window_display_accurate_1`). :-( */ w->base_line_number = topline - nlines; w->base_line_pos = BYTE_TO_CHAR (position); } From a1aa9028f83e5d3da71bdb5877d8baa5d6c1e98a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 4 Feb 2024 12:52:01 -0500 Subject: [PATCH 027/446] * src/window.c (set_window_buffer): Flush the `base_line_number` cache --- src/window.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/window.c b/src/window.c index 915f591221d..565ad00804f 100644 --- a/src/window.c +++ b/src/window.c @@ -4151,6 +4151,8 @@ set_window_buffer (Lisp_Object window, Lisp_Object buffer, buffer); w->start_at_line_beg = false; w->force_start = false; + /* Flush the base_line cache since it applied to another buffer. */ + w->base_line_number = 0; } wset_redisplay (w); From 52abeaf1333427f156a23f0acf057e81bcc5e9e2 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 4 Feb 2024 12:58:56 -0500 Subject: [PATCH 028/446] * src/lread.c (build_load_history): Be careful with in-place updates Don't leave a "broken" value in `Vcurrent_load_list`. --- src/lread.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lread.c b/src/lread.c index cc55b009ab9..b1b109315f9 100644 --- a/src/lread.c +++ b/src/lread.c @@ -2369,8 +2369,14 @@ build_load_history (Lisp_Object filename, bool entire) front of load-history, the most-recently-loaded position. Also do this if we didn't find an existing member for the file. */ if (entire || !foundit) - Vload_history = Fcons (Fnreverse (Vcurrent_load_list), - Vload_history); + { + Lisp_Object tem = Fnreverse (Vcurrent_load_list); + eassert (EQ (filename, Fcar (tem))); + Vload_history = Fcons (tem, Vload_history); + /* FIXME: There should be an unbind_to right after calling us which + should re-establish the previous value of Vcurrent_load_list. */ + Vcurrent_load_list = Qt; + } } static void From 7d3c3cad9392d3f8e59f85522053c249aff062e5 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 4 Feb 2024 13:51:13 -0500 Subject: [PATCH 029/446] * src/lread.c (bytecode_from_rev_list): Fix assertion failure The assertion failure was raised at lread.c:411 during the `lread-invalid-bytecodes` test in `test/src/lread-tests.el`. I suspect we could remove the assertion instead. --- src/lread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lread.c b/src/lread.c index b1b109315f9..b5eeb55bb70 100644 --- a/src/lread.c +++ b/src/lread.c @@ -3496,7 +3496,7 @@ bytecode_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun) Lisp_Object *vec = XVECTOR (obj)->contents; ptrdiff_t size = ASIZE (obj); - if (size >= COMPILED_CONSTANTS) + if (infile && size >= COMPILED_CONSTANTS) { /* Always read 'lazily-loaded' bytecode (generated by the `byte-compile-dynamic' feature prior to Emacs 30) eagerly, to From b2d350cfc0bf8f0e3198bffcebe60a43341fb340 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 4 Feb 2024 14:39:02 -0500 Subject: [PATCH 030/446] * lisp/emacs-lisp/comp.el (comp--native-compile): Use `error-message-string` --- lisp/emacs-lisp/comp.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 2a516246ed4..dcdc973e6c5 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -3398,16 +3398,18 @@ the deferred compilation mechanism." (if (and comp-async-compilation (not (eq (car err) 'native-compiler-error))) (progn - (message (if err-val - "%s: Error: %s %s" - "%s: Error %s") + (message "%s: Error %s" function-or-file - (get (car err) 'error-message) - (car-safe err-val)) + (error-message-string err)) (kill-emacs -1)) ;; Otherwise re-signal it adding the compilation input. + ;; FIXME: We can't just insert arbitrary info in the + ;; error-data part of an error: the handler may expect + ;; specific data at specific positions! (signal (car err) (if (consp err-val) (cons function-or-file err-val) + ;; FIXME: `err-val' is supposed to be + ;; a list, so it can only be nil here! (list function-or-file err-val))))))) (if (stringp function-or-file) data From 9dbbf93a4a08f71cf5f2278ec2a22a722fe0e0f7 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sat, 3 Feb 2024 21:24:29 -0800 Subject: [PATCH 031/446] Improve treesit-forward-sexp behavior for leaf nodes (bug#68899) treesit-forward-sexp uses treesit--navigate-thing with 'restricted' tactic. In this tactic we don't move over the parent thing. However, this makes forward-sexp useless for symbols when point is in the symbol rather than at the beginning of it: in that case, the symbol is considered parent and treesit-forward-sexp won't move to the end of it. To solve that, we allow to move across the parent even in 'restricted' mode if the parent is a leaf thing. Here, "leaf thing" is defined as "doesn't have any child 'thing' inside it". * lisp/treesit.el (treesit--navigate-thing): Move over parent in 'restricted' tactic if the parent is a leaf thing. --- lisp/treesit.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lisp/treesit.el b/lisp/treesit.el index fab2ddd88e6..93b6b56534d 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -2662,9 +2662,17 @@ function is called recursively." (setq parent (treesit-node-top-level parent thing t) prev nil next nil)) - ;; If TACTIC is `restricted', the implementation is very simple. + ;; If TACTIC is `restricted', the implementation is simple. + ;; In principle we don't go to parent's beg/end for + ;; `restricted' tactic, but if the parent is a "leaf thing" + ;; (doesn't have any child "thing" inside it), then we can + ;; move to the beg/end of it (bug#68899). (if (eq tactic 'restricted) - (setq pos (funcall advance (if (> arg 0) next prev))) + (setq pos (funcall + advance + (cond ((and (null next) (null prev)) parent) + ((> arg 0) next) + (t prev)))) ;; For `nested', it's a bit more work: ;; Move... (if (> arg 0) From be6de56906f0d1c09a0fad4f5165d864dddbc3ee Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sun, 4 Feb 2024 19:26:42 -0800 Subject: [PATCH 032/446] Use treesit-node-match-p in treesit-parent-until/while * lisp/treesit.el (treesit-parent-until): Use treesit-node-match-p. (treesit-parent-while): Update docstring. * doc/lispref/parsing.texi (Retrieving Nodes): Update docstring. --- doc/lispref/parsing.texi | 17 ++++++++++------- lisp/treesit.el | 12 +++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi index 5d79c4b27f4..ac11f88ae4d 100644 --- a/doc/lispref/parsing.texi +++ b/doc/lispref/parsing.texi @@ -916,8 +916,10 @@ nodes. @defun treesit-parent-until node predicate &optional include-node This function repeatedly finds the parents of @var{node}, and returns -the parent that satisfies @var{pred}, a function that takes a node as -argument and returns a boolean that indicates a match. If no parent +the parent that satisfies @var{pred}. @var{pred} can be either a +function that takes a node as argument and returns @code{t} or +@code{nil}, or a regexp matching node type names, or other valid +predicates described in @var{treesit-thing-settings}. If no parent satisfies @var{pred}, this function returns @code{nil}. Normally this function only looks at the parents of @var{node} but not @@ -927,11 +929,12 @@ function returns @var{node} if @var{node} satisfies @var{pred}. @defun treesit-parent-while node pred This function goes up the tree starting from @var{node}, and keeps -doing so as long as the nodes satisfy @var{pred}, a function that -takes a node as argument. That is, this function returns the highest -parent of @var{node} that still satisfies @var{pred}. Note that if -@var{node} satisfies @var{pred} but its immediate parent doesn't, -@var{node} itself is returned. +doing so as long as the nodes satisfy @var{pred}. That is, this +function returns the highest parent of @var{node} that still satisfies +@var{pred}. Note that if @var{node} satisfies @var{pred} but its +immediate parent doesn't, @var{node} itself is returned. + +@var{pred} is the same as in @code{treesit-parent-until} above. @end defun @defun treesit-node-top-level node &optional type diff --git a/lisp/treesit.el b/lisp/treesit.el index 93b6b56534d..f179204d89c 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -344,14 +344,13 @@ ancestor node which satisfies the predicate PRED; then it returns that ancestor node. It returns nil if no ancestor node was found that satisfies PRED. -PRED should be a function that takes one argument, the node to -examine, and returns a boolean value indicating whether that -node is a match. +PRED can be a predicate function, a regexp matching node type, +and more; see docstring of `treesit-thing-settings'. If INCLUDE-NODE is non-nil, return NODE if it satisfies PRED." (let ((node (if include-node node (treesit-node-parent node)))) - (while (and node (not (funcall pred node))) + (while (and node (not (treesit-node-match-p node pred))) (setq node (treesit-node-parent node))) node)) @@ -364,9 +363,8 @@ no longer satisfies the predicate PRED; it returns the last examined node that satisfies PRED. If no node satisfies PRED, it returns nil. -PRED should be a function that takes one argument, the node to -examine, and returns a boolean value indicating whether that -node is a match." +PRED can be a predicate function, a regexp matching node type, +and more; see docstring of `treesit-thing-settings'." (let ((last nil)) (while (and node (funcall pred node)) (setq last node From 5c43ef86bf169a79b87bd082d2f884757f7c2efc Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Tue, 15 Aug 2023 18:51:20 -0700 Subject: [PATCH 033/446] Document arguments to Eshell's built-in commands * lisp/eshell/em-unix.el (eshell/ln): LINK_NAME is required. * lisp/eshell/esh-ext.el (eshell/addpath): * lisp/eshell/esh-var.el (eshell/env): Improve help strings slightly. * doc/misc/eshell.texi (Scripts): Explain $0, $1, etc. (Dollars Expansion): Use "@dots{}" instead of "...". (Built-ins, Tramp extensions, Extra built-in commands): Document command-line arguments. --- doc/misc/eshell.texi | 660 ++++++++++++++++++++++++++++++----------- lisp/eshell/em-unix.el | 8 +- lisp/eshell/esh-ext.el | 6 +- lisp/eshell/esh-var.el | 2 +- 4 files changed, 500 insertions(+), 176 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index da5e1ef1d03..5d3e5c7dbd6 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -481,72 +481,88 @@ loaded as part of the eshell-xtra module. @xref{Extension modules}. @table @code -@item . +@item . @var{file} [@var{argument}]@dots{} @cmindex . -Source an Eshell file in the current environment. This is not to be -confused with the command @command{source}, which sources a file in a -subshell environment. +Source an Eshell script named @var{file} in the current environment, +passing any @var{arguments} to the script (@pxref{Scripts}). This is +not to be confused with the command @command{source}, which sources a +file in a subshell environment. @item addpath +@itemx addpath [-b] @var{directory}@dots{} @cmindex addpath -Adds a given path or set of paths to the PATH environment variable, or, -with no arguments, prints the current paths in this variable. +Adds each specified @var{directory} to the @code{$PATH} environment +variable. By default, this adds the directories to the end of +@code{$PATH}, in the order they were passed on the command line; by +passing @code{-b} or @code{--begin}, Eshell will instead add the +directories to the beginning. + +With no directories, print the list of directories currently stored in +@code{$PATH}. @item alias +@itemx alias @var{name} [@var{command}] @cmindex alias -Define an alias (@pxref{Aliases}). This adds it to the aliases file. +Define an alias named @var{name} and expanding to @var{command}, +adding it to the aliases file (@pxref{Aliases}). If @var{command} is +omitted, delete the alias named @var{name}. With no arguments at all, +list all the currently-defined aliases. -@item basename +@item basename @var{filename} @cmindex basename -Return a file name without its directory. +Return @var{filename} without its directory. -@item cat +@item cat @var{file}@dots{} @cmindex cat -Concatenate file contents into standard output. If in a pipeline, or -if the file is not a regular file, directory, or symlink, then this -command reverts to the system's definition of @command{cat}. +Concatenate the contents of @var{file}s to standard output. If in a +pipeline, or if any of the files is not a regular file, directory, or +symlink, then this command reverts to the system's definition of +@command{cat}. @item cd +@itemx cd @var{directory} +@itemx cd -[@var{n}] +@itemx cd =[@var{regexp}] @cmindex cd -This command changes the current working directory. Usually, it is -invoked as @kbd{cd @var{dir}} where @file{@var{dir}} is the new -working directory. But @command{cd} knows about a few special -arguments: +Change the current working directory. This command can take several +forms: -@itemize @minus{} -@item -When it receives no argument at all, it changes to the home directory. +@table @code -@item -Giving the command @kbd{cd -} changes back to the previous working -directory (this is the same as @kbd{cd $-}). +@item cd +Change to the user's home directory. -@item -The command @kbd{cd =} shows the directory ring. Each line is -numbered. +@item cd @var{directory} +Change to the specified @var{directory}. -@item -With @kbd{cd =foo}, Eshell searches the directory ring for a directory -matching the regular expression @samp{foo}, and changes to that -directory. +@item cd - +Change back to the previous working directory (this is the same as +@kbd{cd $-}). -@item -With @kbd{cd -42}, you can access the directory stack slots by number. +@item cd -@var{n} +Change to the directory in the @var{nth} slot of the directory stack. + +@item cd = +Show the directory ring. Each line is numbered. + +@item cd =@var{regexp} +Search the directory ring for a directory matching the regular +expression @var{regexp} and change to that directory. + +@end table -@item @vindex eshell-cd-shows-directory @vindex eshell-list-files-after-cd If @code{eshell-cd-shows-directory} is non-@code{nil}, @command{cd} will report the directory it changes to. If @code{eshell-list-files-after-cd} is non-@code{nil}, then @command{ls} is called with any remaining arguments after changing directories. -@end itemize -@item clear +@item clear [@var{scrollback}] @cmindex clear Scrolls the contents of the Eshell window out of sight, leaving a -blank window. If provided with an optional non-@code{nil} argument, -the scrollback contents are cleared instead. +blank window. If @var{scrollback} is non-@code{nil}, the scrollback +contents are cleared instead, as with @command{clear-scrollback}. @item clear-scrollback @cmindex clear-scrollback @@ -554,21 +570,30 @@ Clear the scrollback contents of the Eshell window. Unlike the command @command{clear}, this command deletes content in the Eshell buffer. -@item compile +@item compile [-p | -i] [-m @var{mode-name}] @var{command}@dots{} @cmindex compile Run an external command, sending its output to a compilation buffer if the command would output to the screen and is not part of a pipeline -or subcommand. This is particularly useful when defining aliases, so +or subcommand. + +With the @code{-p} or @code{--plain} options, always send the output +to the Eshell buffer; similarly, with @code{-i} or +@code{--interactive}, always send the output to a compilation buffer. +You can also set the mode of the compilation buffer with @code{-m +@var{mode-name}} or @code{--mode @var{mode-name}}. + +@command{compile} is particularly useful when defining aliases, so that interactively, the output shows up in a compilation buffer, but you can still pipe the output elsewhere if desired. For example, if you have a grep-like command on your system, you might define an alias for it like so: @samp{alias mygrep 'compile --mode=grep-mode -- mygrep $*'}. -@item cp +@item cp [@var{option}@dots{}] @var{source} @var{dest} +@item cp [@var{option}@dots{}] @var{source}@dots{} @var{directory} @cmindex cp -Copy a file to a new location or copy multiple files to the same -directory. +Copy the file @var{source} to @var{dest} or @var{source} into +@var{directory}. @vindex eshell-cp-overwrite-files @vindex eshell-cp-interactive-query @@ -577,26 +602,59 @@ If @code{eshell-cp-overwrite-files} is non-@code{nil}, then @code{eshell-cp-interactive-query} is non-@code{nil}, then @command{cp} will ask before overwriting anything. -@item date +@command{cp} accepts the following options: + +@table @asis + +@item @code{-a}, @code{--archive} +Equivalent to @code{--no-dereference --preserve --recursive}. + +@item @code{-d}, @code{--no-dereference} +Don't dereference symbolic links when copying; instead, copy the link +itself. + +@item @code{-f}, @code{--force} +Never prompt for confirmation before copying a file. + +@item @code{-i}, @code{--interactive} +Prompt for confirmation before copying a file if the target already +exists. + +@item @code{-n}, @code{--preview} +Run the command, but don't copy anything. This is useful if you +want to preview what would be removed when calling @command{cp}. + +@item @code{-p}, @code{--preserve} +Attempt to preserve file attributes when copying. + +@item @code{-r}, @code{-R}, @code{--recursive} +Copy any specified directories and their contents recursively. + +@item @code{-v}, @code{--verbose} +Print the name of each file before copying it. + +@end table + +@item date [@var{specified-time} [@var{zone}]] @cmindex date Print the current local time as a human-readable string. This command -is similar to, but slightly different from, the GNU Coreutils -@command{date} command. +is an alias to the Emacs Lisp function @code{current-time-string} +(@pxref{Time of Day,,, elisp, GNU Emacs Lisp Reference Manual}). -@item diff +@item diff [@var{option}]@dots{} @var{old} @var{new} @cmindex diff -Compare files using Emacs's internal @code{diff} (not to be confused -with @code{ediff}). @xref{Comparing Files, , , emacs, The GNU Emacs -Manual}. +Compare the files @var{old} and @var{new} using Emacs's internal +@code{diff} (not to be confused with @code{ediff}). @xref{Comparing +Files, , , emacs, The GNU Emacs Manual}. @vindex eshell-plain-diff-behavior If @code{eshell-plain-diff-behavior} is non-@code{nil}, then this command does not use Emacs's internal @code{diff}. This is the same as using @samp{alias diff '*diff $@@*'}. -@item dirname +@item dirname @var{filename} @cmindex dirname -Return the directory component of a file name. +Return the directory component of @var{filename}. @item dirs @cmindex dirs @@ -604,25 +662,75 @@ Prints the directory stack. Directories can be added or removed from the stack using the commands @command{pushd} and @command{popd}, respectively. -@item du +@item du [@var{option}]@dots{} @var{file}@dots{} @cmindex du -Summarize disk usage for each file. +Summarize disk usage for each file, recursing into directories. -@item echo +@command{du} accepts the following options: + +@table @asis + +@item @code{-a}, @code{--all} +Print sizes for files, not just directories. + +@item @code{--block-size=@var{size}} +Print sizes as number of blocks of size @var{size}. + +@item @code{-b}, @code{--bytes} +Print file sizes in bytes. + +@item @code{-c}, @code{--total} +Print a grand total of the sizes at the end. + +@item @code{-d}, @code{--max-depth=@var{depth}} +Only print sizes for directories (or files with @code{--all}) that are +@var{depth} or fewer levels below the command line arguments. + +@item @code{-h}, @code{--human-readable} +Print sizes in human-readable format, with binary prefixes (so 1 KB is +1024 bytes). + +@item @code{-H}, @code{--si} +Print sizes in human-readable format, with decimal prefixes (so 1 KB +is 1000 bytes). + +@item @code{-k}, @code{--kilobytes} +Print file sizes in kilobytes (like @code{--block-size=1024}). + +@item @code{-L}, @code{--dereference} +Follow symbolic links when traversing files. + +@item @code{-m}, @code{--megabytes} +Print file sizes in megabytes (like @code{--block-size=1048576}). + +@item @code{-s}, @code{--summarize} +Don't recurse into subdirectories (like @code{--max-depth=0}). + +@item @code{-x}, @code{--one-file-system} +Skip any directories that reside on different filesystems. + +@end table + +@item echo [-n | -N] [@var{arg}]@dots{} @cmindex echo -Echoes its input. By default, this prints in a Lisp-friendly fashion -(so that the value is useful to a Lisp command using the result of -@command{echo} as an argument). If a single argument is passed, -@command{echo} prints that; if multiple arguments are passed, it -prints a list of all the arguments; otherwise, it prints the empty -string. +Prints the value of each @var{arg}. By default, this prints in a +Lisp-friendly fashion (so that the value is useful to a Lisp command +using the result of @command{echo} as an argument). If a single +argument is passed, @command{echo} prints that; if multiple arguments +are passed, it prints a list of all the arguments; otherwise, it +prints the empty string. @vindex eshell-plain-echo-behavior If @code{eshell-plain-echo-behavior} is non-@code{nil}, @command{echo} will try to behave more like a plain shell's @command{echo}, printing each argument as a string, separated by a space. -@item env +You can control whether @command{echo} outputs a trailing newline +using @code{-n} to disable the trailing newline (the default behavior) +or @code{-N} to enable it (the default when +@code{eshell-plain-echo-behavior} is non-@code{nil}). + +@item env [@var{var}=@var{value}]@dots{} [@var{command}]@dots{} @cmindex env With no arguments, print the current environment variables. If you pass arguments to this command, then @command{env} will execute the @@ -630,7 +738,7 @@ arguments as a command. If you pass any initial arguments of the form @samp{@var{var}=@var{value}}, @command{env} will first set @var{var} to @var{value} before running the command. -@item eshell-debug +@item eshell-debug [error | form | process]@dots{} @cmindex eshell-debug Toggle debugging information for Eshell itself. You can pass this command one or more of the following arguments: @@ -658,65 +766,86 @@ Exit Eshell and save the history. By default, this command kills the Eshell buffer, but if @code{eshell-kill-on-exit} is @code{nil}, then the buffer is merely buried instead. -@item export +@item export [@var{name}=@var{value}]@dots{} @cmindex export Set environment variables using input like Bash's @command{export}, as in @samp{export @var{var1}=@var{val1} @var{var2}=@var{val2} @dots{}}. -@item grep +@item grep [@var{arg}]@dots{} @cmindex grep -@itemx agrep +@itemx agrep [@var{arg}]@dots{} @cmindex agrep -@itemx egrep +@itemx egrep [@var{arg}]@dots{} @cmindex egrep -@itemx fgrep +@itemx fgrep [@var{arg}]@dots{} @cmindex fgrep -@itemx rgrep +@itemx rgrep [@var{arg}]@dots{} @cmindex rgrep -@itemx glimpse +@itemx glimpse [@var{arg}]@dots{} @cmindex glimpse The @command{grep} commands are compatible with GNU @command{grep}, -but use Emacs's internal @code{grep} instead. +but open a compilation buffer in @code{grep-mode} instead. @xref{Grep Searching, , , emacs, The GNU Emacs Manual}. @vindex eshell-plain-grep-behavior If @code{eshell-plain-grep-behavior} is non-@code{nil}, then these -commands do not use Emacs's internal @code{grep}. This is the same as -using @samp{alias grep '*grep $@@*'}, though this setting applies to -all of the built-in commands for which you would need to create a -separate alias. +commands do not use open a compilation buffer, instead printing output +to Eshell's buffer. This is the same as using @samp{alias grep '*grep +$@@*'}, though this setting applies to all of the built-in commands +for which you would need to create a separate alias. -@item history +@item history [@var{n}] +@itemx history [-arw] [@var{filename}] @cmindex history -Prints Eshell's input history. With a numeric argument @var{N}, this -command prints the @var{N} most recent items in the history. +Prints Eshell's input history. With a numeric argument @var{n}, this +command prints the @var{n} most recent items in the history. +Alternately, you can specify the following options: -@item info +@table @asis + +@item @code{-a}, @code{--append} +Append new history items to the history file. + +@item @code{-r}, @code{--read} +Read history items from the history file and append them to the +current shell's history. + +@item @code{-w}, @code{--write} +Write the current history list to the history file. + +@end table + +@item info [@var{manual} [@var{item}]@dots{}] @cmindex info -Browse the available Info documentation. This command is the same as -the external @command{info} command, but uses Emacs's internal Info -reader. -@xref{Misc Help, , , emacs, The GNU Emacs Manual}. +Browse the available Info documentation. With no arguments, browse +the top-level menu. Otherwise, show the manual for @var{manual}, +selecting the menu entry for @var{item}. + +This command is the same as the external @command{info} command, but +uses Emacs's internal Info reader. @xref{Misc Help, , , emacs, The +GNU Emacs Manual}. @item jobs @cmindex jobs List subprocesses of the Emacs process, if any, using the function @code{list-processes}. -@item kill +@item kill [-@var{signal}] [@var{pid} | @var{process}] @cmindex kill Kill processes. Takes a PID or a process object and an optional -signal specifier which can either be a number or a signal name. +@var{signal} specifier which can either be a number or a signal name. -@item listify +@item listify [@var{arg}]@dots{} @cmindex listify -Eshell version of @code{list}. Allows you to create a list using Eshell -syntax, rather than Elisp syntax. For example, @samp{listify foo bar} -and @code{("foo" "bar")} both evaluate to @code{("foo" "bar")}. +Return the arguments as a single list. With a single argument, return +it as-is if it's already a list, or otherwise wrap it in a list. With +multiple arguments, return a list of all of them. -@item ln +@item ln [@var{option}]@dots{} @var{target} [@var{link-name}] +@itemx ln [@var{option}]@dots{} @var{target}@dots{} @var{directory} @cmindex ln -Create links to files. +Create a link to the specified @var{target} named @var{link-name} or +create links to multiple @var{targets} in @var{directory}. @vindex eshell-ln-overwrite-files @vindex eshell-ln-interactive-query @@ -725,7 +854,30 @@ will overwrite files without warning. If @code{eshell-ln-interactive-query} is non-@code{nil}, then @command{ln} will ask before overwriting files. -@item locate +@command{ln} accepts the following options: + +@table @asis + +@item @code{-f}, @code{--force} +Never prompt for confirmation before linking a target. + +@item @code{-i}, @code{--interactive} +Prompt for confirmation before linking to an item if the source +already exists. + +@item @code{-n}, @code{--preview} +Run the command, but don't move anything. This is useful if you +want to preview what would be linked when calling @command{ln}. + +@item @code{-s}, @code{--symbolic} +Make symbolic links instead of hard links. + +@item @code{-v}, @code{--verbose} +Print the name of each file before linking it. + +@end table + +@item locate @var{arg}@dots{} @cmindex locate Alias to Emacs's @code{locate} function, which simply runs the external @command{locate} command and parses the results. @@ -736,21 +888,11 @@ If @code{eshell-plain-locate-behavior} is non-@code{nil}, then Emacs's internal @code{locate} is not used. This is the same as using @samp{alias locate '*locate $@@*'}. -@item ls +@item ls [@var{option}]@dots{} [@var{file}]@dots{} @cmindex ls -Lists the contents of directories. - -@vindex eshell-ls-use-colors -If @code{eshell-ls-use-colors} is non-@code{nil}, the contents of a -directory is color-coded according to file type and status. These -colors and the regexps used to identify their corresponding files can -be customized via @w{@kbd{M-x customize-group @key{RET} eshell-ls @key{RET}}}. - -@vindex eshell-ls-date-format -The user option @code{eshell-ls-date-format} determines how the date -is displayed when using the @option{-l} option. The date is produced -using the function @code{format-time-string} (@pxref{Time Parsing,,, -elisp, GNU Emacs Lisp Reference Manual}). +List information about each @var{file}, including the contents of any +specified directories. If @var{file} is unspecified, list the +contents of the current directory. @vindex eshell-ls-initial-args The user option @code{eshell-ls-initial-args} contains a list of @@ -758,29 +900,117 @@ arguments to include with any call to @command{ls}. For example, you can include the option @option{-h} to always use a more human-readable format. -@vindex eshell-ls-default-blocksize -The user option @code{eshell-ls-default-blocksize} determines the -default blocksize used when displaying file sizes with the option -@option{-s}. +@vindex eshell-ls-use-colors +If @code{eshell-ls-use-colors} is non-@code{nil}, the contents of a +directory is color-coded according to file type and status. These +colors and the regexps used to identify their corresponding files can +be customized via @w{@kbd{M-x customize-group @key{RET} eshell-ls +@key{RET}}}. -@item make +@command{ls} supports the following options: + +@table @asis + +@item @code{-a}, @code{--all} +List all files, including ones starting with @samp{.}. + +@item @code{-A}, @code{--almost-all} +Like @code{--all}, but don't list the current directory (@file{.}) or +the parent directory (@file{..}). + +@item @code{-c}, @code{--by-ctime} +Sort files by last status change time, with newest files first. + +@item @code{-C} +List entries by columns. + +@item @code{-d}, @code{--directory} +List directory entries instead of their contents. + +@item @code{-h}, @code{--human-readable} +Print sizes in human-readable format, with binary prefixes (so 1 KB is +1024 bytes). + +@item @code{-H}, @code{--si} +Print sizes in human-readable format, with decimal prefixes (so 1 KB +is 1000 bytes). + +@item @code{-I@var{pattern}}, @code{--ignore=@var{pattern}} +Don't list directory entries matching @var{pattern}. + +@item @code{-k}, @code{--kilobytes} +Print sizes as 1024-byte kilobytes. + +@vindex eshell-ls-date-format +@item @code{-l} +Use a long listing format showing details for each file. The user +option @code{eshell-ls-date-format} determines how the date is +displayed when using this option. The date is produced using the +function @code{format-time-string} (@pxref{Time Parsing,,, elisp, GNU +Emacs Lisp Reference Manual}). + +@item @code{-L}, @code{--dereference} +Follow symbolic links when listing entries. + +@item @code{-n}, @code{--numeric-uid-gid} +Show UIDs and GIDs numerically, instead of using their names. + +@item @code{-r}, @code{--reverse} +Reverse order when sorting. + +@item @code{-R}, @code{--recursive} +List subdirectories recursively. + +@item @code{-s}, @code{--size} +Show the size of each file in blocks. + +@vindex eshell-ls-default-blocksize +@item @code{-S} +Sort by file size, with largest files first. The user option +@code{eshell-ls-default-blocksize} determines the default blocksize +used when displaying file sizes with this option. + +@item @code{-t} +Sort by modification time, with newest files first. + +@item @code{-u} +Sort by last access time, with newest files first. + +@item @code{-U} +Do not sort results. Instead, list entries in their directory order. + +@item @code{-x} +List entries by lines instead of by columns. + +@item @code{-X} +Sort alphabetically by file extension. + +@item @code{-1} +List one file per line. + +@end table + +@item make [@var{arg}]@dots{} @cmindex make Run @command{make} through @code{compile} when run asynchronously (e.g., @samp{make &}). @xref{Compilation, , , emacs, The GNU Emacs Manual}. Otherwise call the external @command{make} command. -@item man +@item man [@var{arg}]@dots{} @cmindex man Display Man pages using the Emacs @code{man} command. @xref{Man Page, , , emacs, The GNU Emacs Manual}. -@item mkdir +@item mkdir [-p] @var{directory}@dots{} @cmindex mkdir -Make new directories. +Make new directories. With @code{-p} or @code{--parents}, +automatically make any necessary parent directories as well. -@item mv +@item mv [@var{option}]@dots{} @var{source} @var{dest} +@itemx mv [@var{option}]@dots{} @var{source}@dots{} @var{directory} @cmindex mv -Move or rename files. +Rename the file @var{source} to @var{dest} or move @var{source} into +@var{directory}. @vindex eshell-mv-overwrite-files @vindex eshell-mv-interactive-query @@ -789,40 +1019,93 @@ will overwrite files without warning. If @code{eshell-mv-interactive-query} is non-@code{nil}, @command{mv} will prompt before overwriting anything. -@item occur +@command{mv} accepts the following options: + +@table @asis + +@item @code{-f}, @code{--force} +Never prompt for confirmation before moving an item. + +@item @code{-i}, @code{--interactive} +Prompt for confirmation before moving an item if the target already +exists. + +@item @code{-n}, @code{--preview} +Run the command, but don't move anything. This is useful if you +want to preview what would be moved when calling @command{mv}. + +@item @code{-v}, @code{--verbose} +Print the name of each item before moving it. + +@end table + +@item occur @var{regexp} [@var{nlines}] @cmindex occur Alias to Emacs's @code{occur}. @xref{Other Repeating Search, , , emacs, The GNU Emacs Manual}. @item popd +@item popd +@var{n} @cmindex popd Pop a directory from the directory stack and switch to a another place -in the stack. +in the stack. This command can take the following forms: -@item printnl +@table @code + +@item popd +Remove the current directory from the directory stack and change to +the directory beneath it. + +@item popd +@var{n} +Remove the current directory from the directory stack and change to +the @var{nth} directory in the stack (counting from zero). + +@end table + +@item printnl [@var{arg}]@dots{} @cmindex printnl -Print the arguments separated by newlines. +Print all the @var{arg}s separated by newlines. @item pushd +@itemx pushd @var{directory} +@itemx pushd +@var{n} @cmindex pushd Push the current directory onto the directory stack, then change to -another directory. +another directory. This command can take the following forms: + +@table @code + +@vindex eshell-pushd-tohome +@item pushd +Swap the current directory with the directory on the top of the stack. +If @code{eshell-pushd-tohome} is non-@code{nil}, push the current +directory onto the stack and change to the user's home directory (like +@samp{pushd ~}). @vindex eshell-pushd-dunique +@item pushd @var{directory} +Push the current directory onto the stack and change to +@var{directory}. If @code{eshell-pushd-dunique} is non-@code{nil}, +then only unique directories will be added to the stack. + @vindex eshell-pushd-dextract -If @code{eshell-pushd-dunique} is non-@code{nil}, then only unique -directories will be added to the stack. If -@code{eshell-pushd-dextract} is non-@code{nil}, then @samp{pushd -+@var{n}} will pop the @var{n}th directory to the top of the stack. +@item pushd +@var{n} +Change to the @var{nth} directory in the directory stack (counting +from zero), and ``rotate'' the stack by moving any elements before the +@var{nth} to the bottom. If @code{eshell-pushd-dextract} is +non-@code{nil}, then @samp{pushd +@var{n}} will instead pop the +@var{n}th directory to the top of the stack. + +@end table @item pwd @cmindex pwd Prints the current working directory. -@item rm +@item rm [@var{option}]@dots{} @var{item}@dots{} @cmindex rm Removes files, buffers, processes, or Emacs Lisp symbols, depending on -the argument. +the type of each @var{item}. @vindex eshell-rm-interactive-query @vindex eshell-rm-removes-directories @@ -832,56 +1115,84 @@ will prompt before removing anything. If @command{rm} can also remove directories. Otherwise, @command{rmdir} is required. -@item rmdir +@command{rm} accepts the following options: + +@table @asis + +@item @code{-f}, @code{--force} +Never prompt for confirmation before removing an item. + +@item @code{-i}, @code{--interactive} +Prompt for confirmation before removing each item. + +@item @code{-n}, @code{--preview} +Run the command, but don't remove anything. This is useful if you +want to preview what would be removed when calling @command{rm}. + +@item @code{-r}, @code{-R}, @code{--recursive} +Remove any specified directories and their contents recursively. + +@item @code{-v}, @code{--verbose} +Print the name of each item before removing it. + +@end table + +@item rmdir @var{directory}@dots{} @cmindex rmdir Removes directories if they are empty. -@item set +@item set [@var{var} @var{value}]@dots{} @cmindex set Set variable values, using the function @code{set} like a command (@pxref{Setting Variables,,, elisp, GNU Emacs Lisp Reference Manual}). -A variable name can be a symbol, in which case it refers to a Lisp -variable, or a string, referring to an environment variable +The value of @var{var} can be a symbol, in which case it refers to a +Lisp variable, or a string, referring to an environment variable (@pxref{Arguments}). -@item setq +@item setq [@var{symbol} @var{value}]@dots{} @cmindex setq Set variable values, using the function @code{setq} like a command (@pxref{Setting Variables,,, elisp, GNU Emacs Lisp Reference Manual}). -@item source +@item source @var{file} [@var{argument}]@dots{} @cmindex source -Source an Eshell file in a subshell environment. This is not to be -confused with the command @command{.}, which sources a file in the -current environment. +Source an Eshell script named @var{file} in a subshell environment, +passing any @var{argument}s to the script (@pxref{Scripts}). This is +not to be confused with the command @command{.}, which sources a file +in the current environment. -@item time +@item time @var{command}@dots{} @cmindex time -Show the time elapsed during a command's execution. +Show the time elapsed during the execution of @var{command}. -@item umask +@item umask [-S] +@itemx umask @var{mode} @cmindex umask -Set or view the default file permissions for newly created files and -directories. +View the default file permissions for newly created files and +directories. If you pass @code{-S} or @code{--symbolic}, view the +mode symbolically. With @var{mode}, set the default permissions to +this value. -@item unset +@item unset [@var{var}]@dots{} @cmindex unset -Unset one or more variables. As with @command{set}, a variable name -can be a symbol, in which case it refers to a Lisp variable, or a -string, referring to an environment variable. +Unset one or more variables. As with @command{set}, the value of +@var{var} can be a symbol, in which case it refers to a Lisp variable, +or a string, referring to an environment variable. -@item wait +@item wait [@var{process}]@dots{} @cmindex wait -Wait until a process has successfully completed. +Wait until each specified @var{process} has exited. -@item which +@item which @var{command}@dots{} @cmindex which -Identify a command and its location. +For each @var{command}, identify what kind of command it is and its +location. @item whoami @cmindex whoami -Print the current user. This Eshell version of @command{whoami} -supports Tramp. +Print the current user. This Eshell version of @command{whoami} is +connection-aware, so for remote directories, it will print the user +associated with that connection. @end table @subsection Defining new built-in commands @@ -1353,6 +1664,11 @@ sequence of commands, as with almost any other shell script. Scripts are invoked from Eshell with @command{source}, or from anywhere in Emacs with @code{eshell-source-file}. +Like with aliases (@pxref{Aliases}), Eshell scripts can accept any +number of arguments. Within the script, you can refer to these with +the special variables @code{$0}, @code{$1}, @dots{}, @code{$9}, and +@code{$*}. + @cmindex . If you wish to load a script into your @emph{current} environment, rather than in a subshell, use the @code{.} command. @@ -1452,7 +1768,7 @@ As with @samp{$@{@var{command}@}}, evaluates the Eshell command invocation @command{@var{command}}, but writes the output to a temporary file and returns the file name. -@item $@var{expr}[@var{i...}] +@item $@var{expr}[@var{i@dots{}}] Expands to the @var{i}th element of the result of @var{expr}, an expression in one of the above forms listed here. If multiple indices are supplied, this will return a list containing the elements for each @@ -1501,7 +1817,7 @@ Multiple sets of indices can also be specified. For example, if expand to @code{2}, i.e.@: the second element of the first list member (all indices are zero-based). -@item $@var{expr}[@var{regexp} @var{i...}] +@item $@var{expr}[@var{regexp} @var{i@dots{}}] As above (when @var{expr} expands to a string), but use @var{regexp} to split the string. @var{regexp} can be any form other than a number. For example, @samp{$@var{var}[: 0]} will return the first @@ -2275,15 +2591,23 @@ external commands. To enable it, add @code{eshell-tramp} to @table @code -@item su +@item su [- | -l] [@var{user}] @cmindex su -@itemx sudo +Uses TRAMP's @command{su} method (@pxref{Inline methods, , , tramp, +The Tramp Manual}) to change the current user to @var{user} (or root +if unspecified). With @code{-}, @code{-l}, or @code{--login}, provide +a login environment. + +@item sudo [-u @var{user}] [-s | @var{command}@dots{}] @cmindex sudo -@itemx doas +@itemx doas [-u @var{user}] [-s | @var{command}@dots{}] @cmindex doas -Uses TRAMP's @command{su}, @command{sudo}, or @command{doas} method -(@pxref{Inline methods, , , tramp, The Tramp Manual}) to run a command -via @command{su}, @command{sudo}, or @command{doas}. +Uses TRAMP's @command{sudo} or @command{doas} method (@pxref{Inline +methods, , , tramp, The Tramp Manual}) to run @var{command} as root +via @command{sudo} or @command{doas}. When specifying @code{-u +@var{user}} or @code{--user @var{user}}, run the command as @var{user} +instead. With @code{-s} or @code{--shell}, start a shell instead of +running @var{command}. @end table @@ -2296,58 +2620,58 @@ add @code{eshell-xtra} to @code{eshell-modules-list}. @table @code -@item count +@item count @var{item} @var{seq} [@var{option}]@dots{} @cmindex count A wrapper around the function @code{cl-count} (@pxref{Searching Sequences,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item expr +@item expr @var{str} [@var{separator}] [@var{arg}]@dots{} @cmindex expr An implementation of @command{expr} using the Calc package. @xref{Top,,, calc, The GNU Emacs Calculator}. -@item ff +@item ff @var{directory} @var{pattern} @cmindex ff Shorthand for the the function @code{find-name-dired} (@pxref{Dired and Find, , , emacs, The Emacs Editor}). -@item gf +@item gf @var{directory} @var{regexp} @cmindex gf Shorthand for the the function @code{find-grep-dired} (@pxref{Dired and Find, , , emacs, The Emacs Editor}). -@item intersection +@item intersection @var{list1} @var{list2} [@var{option}]@dots{} @cmindex intersection A wrapper around the function @code{cl-intersection} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item mismatch +@item mismatch @var{seq1} @var{seq2} [@var{option}]@dots{} @cmindex mismatch A wrapper around the function @code{cl-mismatch} (@pxref{Searching Sequences,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item set-difference +@item set-difference @var{list1} @var{list2} [@var{option}]@dots{} @cmindex set-difference A wrapper around the function @code{cl-set-difference} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item set-exclusive-or +@item set-exclusive-or @var{list1} @var{list2} [@var{option}]@dots{} @cmindex set-exclusive-or A wrapper around the function @code{cl-set-exclusive-or} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item substitute +@item substitute @var{new} @var{old} @var{seq} [@var{option}]@dots{} @cmindex substitute A wrapper around the function @code{cl-substitute} (@pxref{Sequence Functions,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item union +@item union @var{list1} @var{list2} [@var{option}]@dots{} @cmindex union A wrapper around the function @code{cl-union} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el index 78dfd0654e2..23028576f45 100644 --- a/lisp/eshell/em-unix.el +++ b/lisp/eshell/em-unix.el @@ -618,11 +618,11 @@ Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.") :preserve-args :external "ln" :show-usage - :usage "[OPTION]... TARGET [LINK_NAME] + :usage "[OPTION]... TARGET LINK_NAME or: ln [OPTION]... TARGET... DIRECTORY -Create a link to the specified TARGET with optional LINK_NAME. If there is -more than one TARGET, the last argument must be a directory; create links -in DIRECTORY to each TARGET. Create hard links by default, symbolic links +Create a link to the specified TARGET with LINK_NAME. If there is more +than one TARGET, the last argument must be a directory; create links in +DIRECTORY to each TARGET. Create hard links by default, symbolic links with `--symbolic'. When creating hard links, each TARGET must exist.") (let ((no-dereference t)) (eshell-mvcpln-template "ln" "linking" diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el index dc2b93e574b..44861c222b8 100644 --- a/lisp/eshell/esh-ext.el +++ b/lisp/eshell/esh-ext.el @@ -253,10 +253,10 @@ An external command simply means external to Emacs." "Add a set of paths to PATH." (eshell-eval-using-options "addpath" args - '((?b "begin" nil prepend "add path element at beginning") + '((?b "begin" nil prepend "add to beginning of $PATH") (?h "help" nil nil "display this usage message") - :usage "[-b] PATH -Adds the given PATH to $PATH.") + :usage "[-b] DIR... +Adds the given DIR to $PATH.") (let ((path (eshell-get-path t))) (if args (progn diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index 537bc4b0641..02b5c785625 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -433,7 +433,7 @@ the values of nil for each." (?h "help" nil nil "show this usage screen") :external "env" :parse-leading-options-only - :usage "[NAME=VALUE]... [COMMAND [ARG]...]") + :usage "[NAME=VALUE]... [COMMAND]...") (if args (or (eshell-parse-local-variables args) (eshell-named-command (car args) (cdr args))) From 7756e9c73611c25002a90194b4a32c23051cb234 Mon Sep 17 00:00:00 2001 From: Xi Lu Date: Thu, 23 Feb 2023 20:58:00 +0800 Subject: [PATCH 034/446] filesets: Safely invoke `shell-command*' functions * lisp/filesets.el: (filesets-select-command, filesets-quote): Remove unused functions. (filesets-external-viewers): Remove old comments. (filesets-which-command, filesets-get-quoted-selection) (filesets-spawn-external-viewer): Use `shell-quote-argument'. (Bug#61709) --- lisp/filesets.el | 40 +++++++++------------------------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/lisp/filesets.el b/lisp/filesets.el index 4e2de8fed1b..bc113b80e07 100644 --- a/lisp/filesets.el +++ b/lisp/filesets.el @@ -161,18 +161,9 @@ COND-FN takes one argument: the current element." (define-obsolete-function-alias 'filesets-member #'cl-member "28.1") (define-obsolete-function-alias 'filesets-sublist #'seq-subseq "28.1") -(defun filesets-select-command (cmd-list) - "Select one command from CMD-LIST -- a string with space separated names." - (let ((this (shell-command-to-string - (format "which --skip-alias %s 2> %s | head -n 1" - cmd-list null-device)))) - (if (equal this "") - nil - (file-name-nondirectory (substring this 0 (- (length this) 1)))))) - (defun filesets-which-command (cmd) "Call \"which CMD\"." - (shell-command-to-string (format "which %s" cmd))) + (shell-command-to-string (format "which %s" (shell-quote-argument cmd)))) (defun filesets-which-command-p (cmd) "Call \"which CMD\" and return non-nil if the command was found." @@ -547,16 +538,6 @@ the filename." (defcustom filesets-external-viewers (let - ;; ((ps-cmd (or (and (boundp 'my-ps-viewer) my-ps-viewer) - ;; (filesets-select-command "ggv gv"))) - ;; (pdf-cmd (or (and (boundp 'my-ps-viewer) my-pdf-viewer) - ;; (filesets-select-command "xpdf acroread"))) - ;; (dvi-cmd (or (and (boundp 'my-ps-viewer) my-dvi-viewer) - ;; (filesets-select-command "xdvi tkdvi"))) - ;; (doc-cmd (or (and (boundp 'my-ps-viewer) my-doc-viewer) - ;; (filesets-select-command "antiword"))) - ;; (pic-cmd (or (and (boundp 'my-ps-viewer) my-pic-viewer) - ;; (filesets-select-command "gqview ee display")))) ((ps-cmd "ggv") (pdf-cmd "xpdf") (dvi-cmd "xdvi") @@ -1084,10 +1065,6 @@ Return full path if FULL-FLAG is non-nil." (t (error "Filesets: %s does not exist" dir)))) -(defun filesets-quote (txt) - "Return TXT in quotes." - (concat "\"" txt "\"")) - (defun filesets-get-selection () "Get the text between mark and point -- i.e. the selection or region." (let ((m (mark)) @@ -1098,7 +1075,7 @@ Return full path if FULL-FLAG is non-nil." (defun filesets-get-quoted-selection () "Return the currently selected text in quotes." - (filesets-quote (filesets-get-selection))) + (shell-quote-argument (filesets-get-selection))) (defun filesets-get-shortcut (n) "Create menu shortcuts based on number N." @@ -1245,12 +1222,13 @@ Use the viewer defined in EV-ENTRY (a valid element of (if fmt (mapconcat (lambda (this) - (if (stringp this) (format this file) - (format "%S" (if (functionp this) - (funcall this) - this)))) + (if (stringp this) + (format this (shell-quote-argument file)) + (shell-quote-argument (if (functionp this) + (funcall this) + this)))) fmt "") - (format "%S" file)))) + (shell-quote-argument file)))) (output (cond ((and (functionp vwr) co-flag) @@ -1259,7 +1237,7 @@ Use the viewer defined in EV-ENTRY (a valid element of (funcall vwr file) nil) (co-flag - (shell-command-to-string (format "%s %s" vwr args))) + (shell-command-to-string (format "%s %s" vwr args))) (t (shell-command (format "%s %s&" vwr args)) nil)))) From ea53a26d03da8d03652696939431b3a7e63053d7 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Mon, 5 Feb 2024 08:30:31 +0100 Subject: [PATCH 035/446] ; Fix last change * lisp/filesets.el (filesets-quote): Resurrect as obsolete alias for 'shell-quote-argument'. --- lisp/filesets.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/filesets.el b/lisp/filesets.el index bc113b80e07..68133ba2255 100644 --- a/lisp/filesets.el +++ b/lisp/filesets.el @@ -2461,11 +2461,15 @@ Set up hooks, load the cache file -- if existing -- and build the menu." (setq filesets-menu-use-cached-flag t))) (filesets-build-menu))) +;;; obsolete + (defun filesets-error (_class &rest args) "`error' wrapper." (declare (obsolete error "28.1")) (error "%s" (mapconcat #'identity args " "))) +(define-obsolete-function-alias 'filesets-quote #'shell-quote-argument "30.1") + (provide 'filesets) ;;; filesets.el ends here From 98d62c5f7675b24ad66e010765ce3012046f2ff8 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 5 Feb 2024 17:17:51 +0800 Subject: [PATCH 036/446] Don't respect ROUND_XY_TO_GRID when decomposing uninterpreted glyph * src/sfnt.c (sfnt_decompose_compound_glyph): Remove useless code; don't pretend to round glyph coordinates. --- src/sfnt.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/sfnt.c b/src/sfnt.c index 6df43af4293..8598b052044 100644 --- a/src/sfnt.c +++ b/src/sfnt.c @@ -2798,12 +2798,6 @@ sfnt_decompose_compound_glyph (struct sfnt_glyph *glyph, if (component->flags & 04000) /* SCALED_COMPONENT_OFFSET */ sfnt_transform_coordinates (component, &x, &y, 1, 0, 0); - - if (component->flags & 04) /* ROUND_XY_TO_GRID */ - { - x = sfnt_round_fixed (x); - y = sfnt_round_fixed (y); - } } else { @@ -20800,8 +20794,8 @@ main (int argc, char **argv) return 1; } -#define FANCY_PPEM 12 -#define EASY_PPEM 12 +#define FANCY_PPEM 18 +#define EASY_PPEM 18 interpreter = NULL; head = sfnt_read_head_table (fd, font); From c1f8fe09e6641cc6c1195edcb8666ace1e6e8829 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 5 Feb 2024 18:34:22 +0800 Subject: [PATCH 037/446] Fix frame focus tracking under Android * java/org/gnu/emacs/EmacsActivity.java (invalidateFocus): New argument WHENCE, a unique number identifying the circumstances leading up to the call. All callers changed. (attachWindow): Call `invalidateFocus' from the UI thread. (onWindowFocusChanged): Don't remove activity from `focusedActivities' if it already exists should `hasWindowFocus' return true. --- java/org/gnu/emacs/EmacsActivity.java | 32 ++++++++++++++++++++------- java/org/gnu/emacs/EmacsWindow.java | 4 ++-- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/java/org/gnu/emacs/EmacsActivity.java b/java/org/gnu/emacs/EmacsActivity.java index 3237f650240..b821694b18a 100644 --- a/java/org/gnu/emacs/EmacsActivity.java +++ b/java/org/gnu/emacs/EmacsActivity.java @@ -97,7 +97,7 @@ public class EmacsActivity extends Activity } public static void - invalidateFocus () + invalidateFocus (int whence) { EmacsWindow oldFocus; @@ -144,7 +144,7 @@ public class EmacsActivity extends Activity layout.removeView (window.view); window = null; - invalidateFocus (); + invalidateFocus (0); } } @@ -172,8 +172,17 @@ public class EmacsActivity extends Activity if (isPaused) window.noticeIconified (); - /* Invalidate the focus. */ - invalidateFocus (); + /* Invalidate the focus. Since attachWindow may be called from + either the main or the UI thread, post this to the UI thread. */ + + runOnUiThread (new Runnable () { + @Override + public void + run () + { + invalidateFocus (1); + } + }); } @Override @@ -261,7 +270,7 @@ public class EmacsActivity extends Activity isMultitask = this instanceof EmacsMultitaskActivity; manager.removeWindowConsumer (this, isMultitask || isFinishing ()); focusedActivities.remove (this); - invalidateFocus (); + invalidateFocus (2); /* Remove this activity from the static field, lest it leak. */ if (lastFocusedActivity == this) @@ -274,9 +283,16 @@ public class EmacsActivity extends Activity public final void onWindowFocusChanged (boolean isFocused) { - if (isFocused && !focusedActivities.contains (this)) + /* At times and on certain versions of Android ISFOCUSED does not + reflect whether the window actually holds focus, so replace it + with the value of `hasWindowFocus'. */ + isFocused = hasWindowFocus (); + + if (isFocused) { - focusedActivities.add (this); + if (!focusedActivities.contains (this)) + focusedActivities.add (this); + lastFocusedActivity = this; /* Update the window insets as the focus change may have @@ -291,7 +307,7 @@ public class EmacsActivity extends Activity else focusedActivities.remove (this); - invalidateFocus (); + invalidateFocus (3); } @Override diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 304304a328b..b75d96b2b5a 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -240,7 +240,7 @@ private static class Coordinate } } - EmacsActivity.invalidateFocus (); + EmacsActivity.invalidateFocus (4); if (!children.isEmpty ()) throw new IllegalStateException ("Trying to destroy window with " @@ -760,7 +760,7 @@ private static class Coordinate public void onFocusChanged (boolean gainFocus) { - EmacsActivity.invalidateFocus (); + EmacsActivity.invalidateFocus (gainFocus ? 6 : 5); } /* Notice that the activity has been detached or destroyed. From c7539a363b8b109d24457aaeb60fb51bd0a03e4f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Mon, 5 Feb 2024 12:54:03 +0100 Subject: [PATCH 038/446] Fix stale cache in Tramp * lisp/net/tramp-sh.el (tramp-do-copy-or-rename-file-out-of-band): Flush file properties in time. (Bug#68805) --- lisp/net/tramp-sh.el | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 7656da81dcc..68ee541bee6 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2009,7 +2009,7 @@ ID-FORMAT valid values are `string' and `integer'." #'copy-directory (list dirname newname keep-date parents copy-contents)))) - ;; When newname did exist, we have wrong cached values. + ;; NEWNAME has wrong cached values. (when t2 (with-parsed-tramp-file-name (expand-file-name newname) nil (tramp-flush-file-properties v localname))))))) @@ -2148,6 +2148,16 @@ file names." ;; One of them must be a Tramp file. (error "Tramp implementation says this cannot happen"))) + ;; In case of `rename', we must flush the cache of the source file. + (when (and t1 (eq op 'rename)) + (with-parsed-tramp-file-name filename v1 + (tramp-flush-file-properties v1 v1-localname))) + + ;; NEWNAME has wrong cached values. + (when t2 + (with-parsed-tramp-file-name newname v2 + (tramp-flush-file-properties v2 v2-localname))) + ;; Handle `preserve-extended-attributes'. We ignore ;; possible errors, because ACL strings could be ;; incompatible. @@ -2156,16 +2166,6 @@ file names." (ignore-errors (set-file-extended-attributes newname attributes))) - ;; In case of `rename', we must flush the cache of the source file. - (when (and t1 (eq op 'rename)) - (with-parsed-tramp-file-name filename v1 - (tramp-flush-file-properties v1 v1-localname))) - - ;; When newname did exist, we have wrong cached values. - (when t2 - (with-parsed-tramp-file-name newname v2 - (tramp-flush-file-properties v2 v2-localname))) - ;; KEEP-DATE handling. (when (and keep-date (not copy-keep-date)) (tramp-compat-set-file-times @@ -2437,7 +2437,7 @@ The method used must be an out-of-band method." copy-program (tramp-get-method-parameter v 'tramp-copy-program) copy-args ;; " " has either been a replacement of "%k" (when - ;; keep-date argument is non-nil), or a replacement for + ;; KEEP-DATE argument is non-nil), or a replacement for ;; the whole keep-date sublist. (delete " " (apply #'tramp-expand-args v 'tramp-copy-args spec)) ;; `tramp-ssh-controlmaster-options' is a string instead @@ -5353,7 +5353,7 @@ connection if a previous connection has died for some reason." "2>" (tramp-get-remote-null-device previous-hop)) ?l (concat remote-shell " " extra-args " -i")) ;; A restricted shell does not allow "exec". - (when r-shell '("&&" "exit")) '("||" "exit")) + (when r-shell '("&&" "exit")) '("||" "exit")) " ")) ;; Send the command. From edf61edfd6f04ab97785dca92fc68e8e5783586e Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Mon, 5 Feb 2024 12:54:56 +0100 Subject: [PATCH 039/446] Adapt cache handling in Tramp * lisp/net/tramp-cache.el (with-tramp-saved-file-property) (with-tramp-saved-file-properties) (with-tramp-saved-connection-property) (with-tramp-saved-connection-properties): Do not change KEY destructively. --- lisp/net/tramp-cache.el | 105 ++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 58 deletions(-) diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el index 25123a6e282..225a26ad1cd 100644 --- a/lisp/net/tramp-cache.el +++ b/lisp/net/tramp-cache.el @@ -144,7 +144,6 @@ If KEY is `tramp-cache-undefined', don't create anything, and return nil." (defun tramp-get-file-property (key file property &optional default) "Get the PROPERTY of FILE from the cache context of KEY. Return DEFAULT if not set." - ;; Unify localname. Remove hop from `tramp-file-name' structure. (setq key (tramp-file-name-unify key file)) (if (eq key tramp-cache-undefined) default (let* ((hash (tramp-get-hash-table key)) @@ -191,7 +190,6 @@ Return DEFAULT if not set." (defun tramp-set-file-property (key file property value) "Set the PROPERTY of FILE to VALUE, in the cache context of KEY. Return VALUE." - ;; Unify localname. Remove hop from `tramp-file-name' structure. (setq key (tramp-file-name-unify key file)) (if (eq key tramp-cache-undefined) value (let ((hash (tramp-get-hash-table key))) @@ -224,7 +222,6 @@ Return VALUE." ;;;###tramp-autoload (defun tramp-flush-file-property (key file property) "Remove PROPERTY of FILE in the cache context of KEY." - ;; Unify localname. Remove hop from `tramp-file-name' structure. (setq key (tramp-file-name-unify key file)) (unless (eq key tramp-cache-undefined) (remhash property (tramp-get-hash-table key)) @@ -239,7 +236,6 @@ Return VALUE." ;; `file-name-directory' can return nil, for example for "~". (when-let ((file (file-name-directory file)) (file (directory-file-name file))) - ;; Unify localname. Remove hop from `tramp-file-name' structure. (setq key (tramp-file-name-unify key file)) (unless (eq key tramp-cache-undefined) (dolist (property (hash-table-keys (tramp-get-hash-table key))) @@ -254,7 +250,6 @@ Return VALUE." (defun tramp-flush-file-properties (key file) "Remove all properties of FILE in the cache context of KEY." (let ((truename (tramp-get-file-property key file "file-truename"))) - ;; Unify localname. Remove hop from `tramp-file-name' structure. (setq key (tramp-file-name-unify key file)) (unless (eq key tramp-cache-undefined) (tramp-message key 8 "%s" (tramp-file-name-localname key)) @@ -338,17 +333,15 @@ FILE must be a local file name on a connection identified via KEY." "Save PROPERTY, run BODY, reset PROPERTY. Preserve timestamps." (declare (indent 3) (debug t)) - `(progn - ;; Unify localname. Remove hop from `tramp-file-name' structure. - (setf ,key (tramp-file-name-unify ,key ,file)) - (let* ((hash (tramp-get-hash-table ,key)) - (cached (and (hash-table-p hash) (gethash ,property hash)))) - (unwind-protect (progn ,@body) - ;; Reset PROPERTY. Recompute hash, it could have been flushed. - (setq hash (tramp-get-hash-table ,key)) - (if (consp cached) - (puthash ,property cached hash) - (remhash ,property hash)))))) + `(let* ((key (tramp-file-name-unify ,key ,file)) + (hash (tramp-get-hash-table key)) + (cached (and (hash-table-p hash) (gethash ,property hash)))) + (unwind-protect (progn ,@body) + ;; Reset PROPERTY. Recompute hash, it could have been flushed. + (setq hash (tramp-get-hash-table key)) + (if (consp cached) + (puthash ,property cached hash) + (remhash ,property hash))))) ;;;###tramp-autoload (defmacro with-tramp-saved-file-properties (key file properties &rest body) @@ -356,22 +349,20 @@ Preserve timestamps." PROPERTIES is a list of file properties (strings). Preserve timestamps." (declare (indent 3) (debug t)) - `(progn - ;; Unify localname. Remove hop from `tramp-file-name' structure. - (setf ,key (tramp-file-name-unify ,key ,file)) - (let* ((hash (tramp-get-hash-table ,key)) - (values - (and (hash-table-p hash) - (mapcar - (lambda (property) (cons property (gethash property hash))) - ,properties)))) - (unwind-protect (progn ,@body) - ;; Reset PROPERTIES. Recompute hash, it could have been flushed. - (setq hash (tramp-get-hash-table ,key)) - (dolist (value values) - (if (consp (cdr value)) - (puthash (car value) (cdr value) hash) - (remhash (car value) hash))))))) + `(let* ((key (tramp-file-name-unify ,key ,file)) + (hash (tramp-get-hash-table key)) + (values + (and (hash-table-p hash) + (mapcar + (lambda (property) (cons property (gethash property hash))) + ,properties)))) + (unwind-protect (progn ,@body) + ;; Reset PROPERTIES. Recompute hash, it could have been flushed. + (setq hash (tramp-get-hash-table key)) + (dolist (value values) + (if (consp (cdr value)) + (puthash (car value) (cdr value) hash) + (remhash (car value) hash)))))) ;;; -- Properties -- @@ -473,38 +464,36 @@ used to cache connection properties of the local machine." (defmacro with-tramp-saved-connection-property (key property &rest body) "Save PROPERTY, run BODY, reset PROPERTY." (declare (indent 2) (debug t)) - `(progn - (setf ,key (tramp-file-name-unify ,key)) - (let* ((hash (tramp-get-hash-table ,key)) - (cached (and (hash-table-p hash) - (gethash ,property hash tramp-cache-undefined)))) - (unwind-protect (progn ,@body) - ;; Reset PROPERTY. Recompute hash, it could have been flushed. - (setq hash (tramp-get-hash-table ,key)) - (if (not (eq cached tramp-cache-undefined)) - (puthash ,property cached hash) - (remhash ,property hash)))))) + `(let* ((key (tramp-file-name-unify ,key)) + (hash (tramp-get-hash-table key)) + (cached (and (hash-table-p hash) + (gethash ,property hash tramp-cache-undefined)))) + (unwind-protect (progn ,@body) + ;; Reset PROPERTY. Recompute hash, it could have been flushed. + (setq hash (tramp-get-hash-table key)) + (if (not (eq cached tramp-cache-undefined)) + (puthash ,property cached hash) + (remhash ,property hash))))) ;;;###tramp-autoload (defmacro with-tramp-saved-connection-properties (key properties &rest body) "Save PROPERTIES, run BODY, reset PROPERTIES. PROPERTIES is a list of file properties (strings)." (declare (indent 2) (debug t)) - `(progn - (setf ,key (tramp-file-name-unify ,key)) - (let* ((hash (tramp-get-hash-table ,key)) - (values - (mapcar - (lambda (property) - (cons property (gethash property hash tramp-cache-undefined))) - ,properties))) - (unwind-protect (progn ,@body) - ;; Reset PROPERTIES. Recompute hash, it could have been flushed. - (setq hash (tramp-get-hash-table ,key)) - (dolist (value values) - (if (not (eq (cdr value) tramp-cache-undefined)) - (puthash (car value) (cdr value) hash) - (remhash (car value) hash))))))) + `(let* ((key (tramp-file-name-unify ,key)) + (hash (tramp-get-hash-table key)) + (values + (mapcar + (lambda (property) + (cons property (gethash property hash tramp-cache-undefined))) + ,properties))) + (unwind-protect (progn ,@body) + ;; Reset PROPERTIES. Recompute hash, it could have been flushed. + (setq hash (tramp-get-hash-table key)) + (dolist (value values) + (if (not (eq (cdr value) tramp-cache-undefined)) + (puthash (car value) (cdr value) hash) + (remhash (car value) hash)))))) ;;;###tramp-autoload (defun tramp-cache-print (table) From dbc5fafa311823f3a78d4ad5a395e4d87d31d9bd Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Mon, 5 Feb 2024 12:55:27 +0100 Subject: [PATCH 040/446] * lisp/net/tramp.el (tramp-local-host-regexp): Adapt :version. --- lisp/net/tramp-archive.el | 4 ++-- lisp/net/tramp-compat.el | 2 +- lisp/net/tramp.el | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el index 298cacdb0e0..752462d8fa3 100644 --- a/lisp/net/tramp-archive.el +++ b/lisp/net/tramp-archive.el @@ -389,7 +389,7 @@ arguments to pass to the OPERATION." "Add archive file name handler to `file-name-handler-alist'." (when (and tramp-archive-enabled (not - (rassq 'tramp-archive-file-name-handler file-name-handler-alist))) + (rassq #'tramp-archive-file-name-handler file-name-handler-alist))) (add-to-list 'file-name-handler-alist (cons (tramp-archive-autoload-file-name-regexp) #'tramp-archive-autoload-file-name-handler)) @@ -443,7 +443,7 @@ arguments to pass to the OPERATION." (and (tramp-archive-file-name-p name) (match-string 2 name))) -(defvar tramp-archive-hash (make-hash-table :test 'equal) +(defvar tramp-archive-hash (make-hash-table :test #'equal) "Hash table for archive local copies. The hash key is the archive name. The value is a cons of the used `tramp-file-name' structure for tramp-gvfs, and the file diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el index 87b20b982f9..061766090a0 100644 --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@ -309,7 +309,7 @@ Also see `ignore'." ;; Macro `connection-local-p' is new in Emacs 30.1. (if (macrop 'connection-local-p) - (defalias 'tramp-compat-connection-local-p #'connection-local-p) + (defalias 'tramp-compat-connection-local-p 'connection-local-p) (defmacro tramp-compat-connection-local-p (variable) "Non-nil if VARIABLE has a connection-local binding in `default-directory'." `(let (connection-local-variables-alist file-local-variables-alist) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 7800efc2a5e..8e114912527 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -557,7 +557,7 @@ host runs a restricted shell, it shall be added to this list, too." eos) "Host names which are regarded as local host. If the local host runs a chrooted environment, set this to nil." - :version "30.1" + :version "29.3" :type '(choice (const :tag "Chrooted environment" nil) (regexp :tag "Host regexp"))) From 798310f0100e7819bc79fb7f9bdcf59b8f534b4b Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Mon, 5 Feb 2024 12:56:36 +0100 Subject: [PATCH 041/446] ; * etc/NEWS: Fix typos. --- etc/NEWS | 74 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 816613de4ec..5180c26aa92 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -76,7 +76,7 @@ see the variable 'url-request-extra-headers'. +++ ** 'completion-auto-help' now affects 'icomplete-in-buffer'. -Previously, completion-auto-help mostly affected only minibuffer +Previously, 'completion-auto-help' mostly affected only minibuffer completion. Now, if 'completion-auto-help' has the value 'lazy', then Icomplete's in-buffer display of possible completions will only appear after the 'completion-at-point' command has been invoked twice, and if @@ -85,12 +85,12 @@ completely suppressed. Thus, if you use 'icomplete-in-buffer', ensure 'completion-auto-help' is not customized to 'lazy' or nil. +++ -** The *Completions* buffer now always accompanies 'icomplete-in-buffer'. -Previously, it was not consistent when the *Completions* buffer would -appear when using 'icomplete-in-buffer'. Now the *Completions* buffer +** The "*Completions*" buffer now always accompanies 'icomplete-in-buffer'. +Previously, it was not consistent whether the "*Completions*" buffer would +appear when using 'icomplete-in-buffer'. Now the "*Completions*" buffer and Icomplete's in-buffer display of possible completions always appear together. If you would prefer to see only Icomplete's -in-buffer display, and not the *Completions* buffer, you can add this +in-buffer display, and not the "*Completions*" buffer, you can add this to your init: (advice-add 'completion-at-point :after #'minibuffer-hide-completions) @@ -258,7 +258,7 @@ right-aligned to is controlled by the new user option ** Windows -*** New action alist entry 'post-command-select-window' for display-buffer. +*** New action alist entry 'post-command-select-window' for 'display-buffer'. It specifies whether the window of the displayed buffer should be selected or deselected at the end of executing the current command. @@ -305,8 +305,7 @@ between the auto save file and the current file. --- ** 'ffap-lax-url' now defaults to nil. -Previously, it was set to 'ffap-lax-url' to t but this broke remote file -name detection. +Previously, it was set to t but this broke remote file name detection. * Editing Changes in Emacs 30.1 @@ -433,7 +432,7 @@ configurations such as X11 when the X server does not support at least version 2.1 of the X Input Extension, and 'xterm-mouse-mode'. ** 'xterm-mouse-mode' -This mode now emits `wheel-up/down/right/left' events instead of +This mode now emits 'wheel-up/down/right/left' events instead of 'mouse-4/5/6/7' events for the mouse wheel. It uses the 'mouse-wheel-up/down/left/right-event' variables to decide which button maps to which wheel event (if any). @@ -442,7 +441,7 @@ variables to decide which button maps to which wheel event (if any). --- *** New user option 'Info-url-alist'. -This user option associates manual-names with URLs. It affects the +This user option associates manual names with URLs. It affects the 'Info-goto-node-web' command. By default, associations for all Emacs-included manuals are set. Further associations can be added for arbitrary Info manuals. @@ -691,7 +690,7 @@ arguments of the form 'VAR=VALUE', 'env' will first set 'VAR' to Now, you can pass an argument like "u+w,o-r" to Eshell's 'umask' command, which will give write permission for owners of newly-created files and deny read permission for users who are not members of the -file's group. See the Info node '(coreutils)File permissions' for +file's group. See the Info node "(coreutils) File permissions" for more information on this notation. +++ @@ -810,14 +809,14 @@ in the minibuffer history, with more recent candidates appearing first. *** 'completion-category-overrides' supports more metadata. The new supported completion properties are 'cycle-sort-function', 'display-sort-function', 'annotation-function', 'affixation-function', -'group-function'. You can now customize them for any category in +and 'group-function'. You can now customize them for any category in 'completion-category-overrides' that will override the properties defined in completion metadata. +++ *** 'completion-extra-properties' supports more metadata. The new supported completion properties are 'category', -'group-function', 'display-sort-function', 'cycle-sort-function'. +'group-function', 'display-sort-function', and 'cycle-sort-function'. ** Pcomplete @@ -1059,8 +1058,8 @@ which calls 'xref-find-definitions'. If the previous one worked better for you, use 'define-key' in your init script to bind 'js-find-symbol' to that combination again. -** Json mode -`js-json-mode` does not derive from `js-mode` any more so as not +** Json mode. +'js-json-mode' does not derive from 'js-mode' any more so as not to confuse tools like Eglot or YASnippet into thinking that those buffers contain Javascript code. @@ -1195,8 +1194,8 @@ comment, like Perl mode does. *** New command 'cperl-file-style'. This command sets the indentation style for the current buffer. To -change the default style, either use the option with the same name or -use the command cperl-set-style. +change the default style, either use the user option with the same name +or use the command 'cperl-set-style'. *** Commands using the Perl info page are obsolete. The Perl documentation in info format is no longer distributed with @@ -1309,16 +1308,19 @@ chat buffers use by default. +++ *** New command 'customize-dirlocals'. This command pops up a buffer to edit the settings in ".dir-locals.el". + ** Calc + +++ -*** Calc parses fractions written using U+2044 FRACTION SLASH -Fractions of the form 123⁄456 are handled as if written 123:456. Note -in particular the difference in behavior from U+2215 DIVISION SLASH +*** Calc parses fractions written using U+2044 FRACTION SLASH. +Fractions of the form "123⁄456" are handled as if written "123:456". +Note in particular the difference in behavior from U+2215 DIVISION SLASH and U+002F SOLIDUS, which result in division rather than a rational -fraction. You may also be interested to know that precomposed -fraction characters, such as ½ (U+00BD VULGAR FRACTION ONE HALF), are -also recognized as rational fractions. They have been since 2004, but -it looks like it was never mentioned in the NEWS, or even the manual. +fraction. You may also be interested to know that precomposed fraction +characters, such as ½ (U+00BD VULGAR FRACTION ONE HALF), are also +recognized as rational fractions. They have been since 2004, but it +looks like it was never mentioned in the NEWS, or even the manual. + * New Modes and Packages in Emacs 30.1 @@ -1378,19 +1380,19 @@ files and save the changes. * Incompatible Lisp Changes in Emacs 30.1 --- -** Old 'derived.el' functions removed. +** Old derived.el functions removed. The following functions have been deleted because they were only used by code compiled with Emacs<21: -'derived-mode-setup-function-name', 'derived-mode-init-mode-variables', -'derived-mode-set-keymap', 'derived-mode-set-syntax-table', -'derived-mode-set-abbrev-table', 'derived-mode-run-hooks', +'derived-mode-init-mode-variables', 'derived-mode-merge-abbrev-tables', 'derived-mode-merge-keymaps', 'derived-mode-merge-syntax-tables', -'derived-mode-merge-abbrev-tables'. +'derived-mode-run-hooks', 'derived-mode-set-abbrev-table', +'derived-mode-set-keymap', 'derived-mode-set-syntax-table', +'derived-mode-setup-function-name'. +++ ** 'M-TAB' now invokes 'completion-at-point' also in Text mode. By default, Text mode no longer binds 'M-TAB' to -'ispell-complete-word'. Instead this mode arranges for +'ispell-complete-word'. Instead, this mode arranges for 'completion-at-point', globally bound to 'M-TAB', to perform word completion as well. You can have Text mode bind 'M-TAB' to 'ispell-complete-word' as it did in previous Emacs versions, or @@ -1498,8 +1500,8 @@ values. * Lisp Changes in Emacs 30.1 +++ -** 'define-advice' now sets the new advice's 'name' property to NAME -Named advice defined with 'define-advice' can now be removed with +** 'define-advice' now sets the new advice's 'name' property to NAME. +Named advices defined with 'define-advice' can now be removed with '(advice-remove SYMBOL NAME)' in addition to '(advice-remove SYMBOL SYMBOL@NAME)'. @@ -1516,10 +1518,10 @@ It puts a limit to the amount by which Emacs can temporarily increase +++ ** New special form 'handler-bind'. -Provides a functionality similar to `condition-case` except it runs the -handler code without unwinding the stack, such that we can record the -backtrace and other dynamic state at the point of the error. -See the Info node "(elisp) Handling Errors". +It provides a functionality similar to 'condition-case' except it runs +the handler code without unwinding the stack, such that we can record +the backtrace and other dynamic state at the point of the error. See +the Info node "(elisp) Handling Errors". +++ ** New 'pop-up-frames' action alist entry for 'display-buffer'. From 95c8bfb11ec82e67652e5903495c1fcb5c61ace2 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 5 Feb 2024 10:13:56 -0500 Subject: [PATCH 042/446] (edebug-signal): Simplify Also, prefer #' to quote function names. * lisp/emacs-lisp/edebug.el (edebug-signal): Instead of re-signaling the error, let `signal_or_quit` continue processing it. --- lisp/emacs-lisp/edebug.el | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index a8a51502503..4c7dbb4ef8c 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -481,7 +481,7 @@ just FUNCTION is printed." (edebug--eval-defun #'eval-defun edebug-it))) ;;;###autoload -(defalias 'edebug-defun 'edebug-eval-top-level-form) +(defalias 'edebug-defun #'edebug-eval-top-level-form) ;;;###autoload (defun edebug-eval-top-level-form () @@ -1729,7 +1729,7 @@ contains a circular object." (defun edebug-match-form (cursor) (list (edebug-form cursor))) -(defalias 'edebug-match-place 'edebug-match-form) +(defalias 'edebug-match-place #'edebug-match-form) ;; Currently identical to edebug-match-form. ;; This is for common lisp setf-style place arguments. @@ -2277,12 +2277,7 @@ only be active while Edebug is. It checks `debug-on-error' to see whether it should call the debugger. When execution is resumed, the error is signaled again." (if (and (listp debug-on-error) (memq signal-name debug-on-error)) - (edebug 'error (cons signal-name signal-data))) - ;; If we reach here without another non-local exit, then send signal again. - ;; i.e. the signal is not continuable, yet. - ;; Avoid infinite recursion. - (let ((signal-hook-function nil)) - (signal signal-name signal-data))) + (edebug 'error (cons signal-name signal-data)))) ;;; Entering Edebug @@ -2326,6 +2321,12 @@ and run its entry function, and set up `edebug-before' and (debug-on-error (or debug-on-error edebug-on-error)) (debug-on-quit edebug-on-quit)) (unwind-protect + ;; FIXME: We could replace this `signal-hook-function' with + ;; a cleaner `handler-bind' but then we wouldn't be able to + ;; install it here (i.e. once and for all when entering + ;; an Edebugged function), but instead it would have to + ;; be installed into a modified `edebug-after' which wraps + ;; the `handler-bind' around its argument(s). :-( (let ((signal-hook-function #'edebug-signal)) (setq edebug-execution-mode (or edebug-next-execution-mode edebug-initial-mode @@ -3348,7 +3349,7 @@ With prefix argument, make it a temporary breakpoint." (message "%s" msg))) -(defalias 'edebug-step-through-mode 'edebug-step-mode) +(defalias 'edebug-step-through-mode #'edebug-step-mode) (defun edebug-step-mode () "Proceed to next stop point." @@ -3836,12 +3837,12 @@ be installed in `emacs-lisp-mode-map'.") ;; Global GUD bindings for all emacs-lisp-mode buffers. (unless edebug-inhibit-emacs-lisp-mode-bindings - (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) - (define-key emacs-lisp-mode-map "\C-x\C-a\C-n" 'edebug-next-mode) - (define-key emacs-lisp-mode-map "\C-x\C-a\C-c" 'edebug-go-mode) - (define-key emacs-lisp-mode-map "\C-x\C-a\C-l" 'edebug-where) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" #'edebug-step-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-n" #'edebug-next-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-c" #'edebug-go-mode) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-l" #'edebug-where) ;; The following isn't a GUD binding. - (define-key emacs-lisp-mode-map "\C-x\C-a\C-m" 'edebug-set-initial-mode)) + (define-key emacs-lisp-mode-map "\C-x\C-a\C-m" #'edebug-set-initial-mode)) (defvar-keymap edebug-mode-map :parent emacs-lisp-mode-map From 5e69376292994ffe69b7f8f52ae1ad85c60c2d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 5 Feb 2024 17:56:11 +0100 Subject: [PATCH 043/446] Grudgingly accept function values in the function position * lisp/emacs-lisp/cconv.el (cconv-convert): Warn about (F ...) where F is a non-symbol function value (bytecode object etc), but let it pass for compatibility's sake (bug#68931). * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp--fun-value-as-head): New test. --- lisp/emacs-lisp/cconv.el | 12 ++++++++---- test/lisp/emacs-lisp/bytecomp-tests.el | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el index e210cfdf5ce..4ff47971351 100644 --- a/lisp/emacs-lisp/cconv.el +++ b/lisp/emacs-lisp/cconv.el @@ -621,12 +621,16 @@ places where they originally did not directly appear." (cconv-convert exp env extend)) (`(,func . ,forms) - (if (symbolp func) + (if (or (symbolp func) (functionp func)) ;; First element is function or whatever function-like forms are: ;; or, and, if, catch, progn, prog1, while, until - `(,func . ,(mapcar (lambda (form) - (cconv-convert form env extend)) - forms)) + (let ((args (mapcar (lambda (form) (cconv-convert form env extend)) + forms))) + (unless (symbolp func) + (byte-compile-warn-x + form + "Use `funcall' instead of `%s' in the function position" func)) + `(,func . ,args)) (byte-compile-warn-x form "Malformed function `%S'" func) nil)) diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el index dcb72e4105a..8ccac492141 100644 --- a/test/lisp/emacs-lisp/bytecomp-tests.el +++ b/test/lisp/emacs-lisp/bytecomp-tests.el @@ -848,6 +848,22 @@ byte-compiled. Run with dynamic binding." (should (equal (bytecomp-tests--eval-interpreted form) (bytecomp-tests--eval-compiled form))))))) +(ert-deftest bytecomp--fun-value-as-head () + ;; Check that (FUN-VALUE ...) is a valid call, for compatibility (bug#68931). + ;; (There is also a warning but this test does not check that.) + (dolist (lb '(nil t)) + (ert-info ((prin1-to-string lb) :prefix "lexical-binding: ") + (let* ((lexical-binding lb) + (s-int '(lambda (x) (1+ x))) + (s-comp (byte-compile s-int)) + (v-int (lambda (x) (1+ x))) + (v-comp (byte-compile v-int)) + (comp (lambda (f) (funcall (byte-compile `(lambda () (,f 3))))))) + (should (equal (funcall comp s-int) 4)) + (should (equal (funcall comp s-comp) 4)) + (should (equal (funcall comp v-int) 4)) + (should (equal (funcall comp v-comp) 4)))))) + (defmacro bytecomp-tests--with-fresh-warnings (&rest body) `(let ((macroexp--warned ; oh dear (make-hash-table :test #'equal :weakness 'key))) From aedfb4f04837ef7b6f50d6a9d833a3ec0f33b11d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 5 Feb 2024 14:50:45 -0500 Subject: [PATCH 044/446] (gitmerge-mode-font-lock-keywords): Don't use font-lock-*-face vars * admin/gitmerge.el (gitmerge-mode-font-lock-keywords): Refer to the faces directly. --- admin/gitmerge.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/admin/gitmerge.el b/admin/gitmerge.el index 7c815c729e5..32d5c3c1bea 100644 --- a/admin/gitmerge.el +++ b/admin/gitmerge.el @@ -111,10 +111,10 @@ If nil, the function `gitmerge-default-branch' guesses.") (defvar gitmerge-mode-font-lock-keywords `((,gitmerge-log-regexp - (1 font-lock-warning-face) - (2 font-lock-constant-face) - (3 font-lock-builtin-face) - (4 font-lock-comment-face)))) + (1 'font-lock-warning-face) + (2 'font-lock-constant-face) + (3 'font-lock-builtin-face) + (4 'font-lock-comment-face)))) (defvar gitmerge--commits nil) (defvar gitmerge--from nil) From 10faaa3c91045390755791c21349cd562546fdea Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 5 Feb 2024 17:58:47 -0500 Subject: [PATCH 045/446] Prefer `ITREE_FOREACH` over `overlays_in` Use `ITREE_FOREACH` instead of `overlays_in` if that can save us from allocating an array. * src/buffer.c (overlays_in): Mark as static. (mouse_face_overlay_overlaps): Use `ITREE_FOREACH` instead of `overlays_in`. (disable_line_numbers_overlay_at_eob): Same, and also change return value to a boolean. * src/buffer.h (overlays_in): Don't declare. * src/editfns.c (overlays_around): Delete function. (Fget_pos_property): Use `ITREE_FOREACH` and keep the "best so far" instead of using `overlays_in` and sorting the elements. * src/lisp.h (disable_line_numbers_overlay_at_eob): Change return type to a boolean. * src/xdisp.c (should_produce_line_number): Adjust accordingly. --- src/buffer.c | 60 +++++++++++++---------------------- src/buffer.h | 2 -- src/editfns.c | 86 +++++++++++++++++---------------------------------- src/lisp.h | 2 +- src/xdisp.c | 2 +- 5 files changed, 51 insertions(+), 101 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 352aca8ddfd..d67e1d67cd6 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -3002,7 +3002,7 @@ the normal hook `change-major-mode-hook'. */) But still return the total number of overlays. */ -ptrdiff_t +static ptrdiff_t overlays_in (ptrdiff_t beg, ptrdiff_t end, bool extend, Lisp_Object **vec_ptr, ptrdiff_t *len_ptr, bool empty, bool trailing, @@ -3125,56 +3125,38 @@ mouse_face_overlay_overlaps (Lisp_Object overlay) { ptrdiff_t start = OVERLAY_START (overlay); ptrdiff_t end = OVERLAY_END (overlay); - ptrdiff_t n, i, size; - Lisp_Object *v, tem; - Lisp_Object vbuf[10]; - USE_SAFE_ALLOCA; + Lisp_Object tem; + struct itree_node *node; - size = ARRAYELTS (vbuf); - v = vbuf; - n = overlays_in (start, end, 0, &v, &size, true, false, NULL); - if (n > size) + ITREE_FOREACH (node, current_buffer->overlays, + start, min (end, ZV) + 1, + ASCENDING) { - SAFE_NALLOCA (v, 1, n); - overlays_in (start, end, 0, &v, &n, true, false, NULL); + if (node->begin < end && node->end > start + && node->begin < node->end + && !EQ (node->data, overlay) + && (tem = Foverlay_get (overlay, Qmouse_face), + !NILP (tem))) + return true; } - - for (i = 0; i < n; ++i) - if (!EQ (v[i], overlay) - && (tem = Foverlay_get (overlay, Qmouse_face), - !NILP (tem))) - break; - - SAFE_FREE (); - return i < n; + return false; } /* Return the value of the 'display-line-numbers-disable' property at EOB, if there's an overlay at ZV with a non-nil value of that property. */ -Lisp_Object +bool disable_line_numbers_overlay_at_eob (void) { - ptrdiff_t n, i, size; - Lisp_Object *v, tem = Qnil; - Lisp_Object vbuf[10]; - USE_SAFE_ALLOCA; + Lisp_Object tem = Qnil; + struct itree_node *node; - size = ARRAYELTS (vbuf); - v = vbuf; - n = overlays_in (ZV, ZV, 0, &v, &size, false, false, NULL); - if (n > size) + ITREE_FOREACH (node, current_buffer->overlays, ZV, ZV, ASCENDING) { - SAFE_NALLOCA (v, 1, n); - overlays_in (ZV, ZV, 0, &v, &n, false, false, NULL); + if ((tem = Foverlay_get (node->data, Qdisplay_line_numbers_disable), + !NILP (tem))) + return true; } - - for (i = 0; i < n; ++i) - if ((tem = Foverlay_get (v[i], Qdisplay_line_numbers_disable), - !NILP (tem))) - break; - - SAFE_FREE (); - return tem; + return false; } diff --git a/src/buffer.h b/src/buffer.h index 9e0982f5da7..87ba2802b39 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -1174,8 +1174,6 @@ extern void delete_all_overlays (struct buffer *); extern void reset_buffer (struct buffer *); extern void compact_buffer (struct buffer *); extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *); -extern ptrdiff_t overlays_in (ptrdiff_t, ptrdiff_t, bool, Lisp_Object **, - ptrdiff_t *, bool, bool, ptrdiff_t *); extern ptrdiff_t previous_overlay_change (ptrdiff_t); extern ptrdiff_t next_overlay_change (ptrdiff_t); extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); diff --git a/src/editfns.c b/src/editfns.c index 0cecd81c07f..cce52cddbf8 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -272,24 +272,6 @@ If you set the marker not to point anywhere, the buffer will have no mark. */) } -/* Find all the overlays in the current buffer that touch position POS. - Return the number found, and store them in a vector in VEC - of length LEN. - - Note: this can return overlays that do not touch POS. The caller - should filter these out. */ - -static ptrdiff_t -overlays_around (ptrdiff_t pos, Lisp_Object *vec, ptrdiff_t len) -{ - /* Find all potentially rear-advance overlays at (POS - 1). Find - all overlays at POS, so end at (POS + 1). Find even empty - overlays, which due to the way 'overlays-in' works implies that - we might also fetch empty overlays starting at (POS + 1). */ - return overlays_in (pos - 1, pos + 1, false, &vec, &len, - true, false, NULL); -} - DEFUN ("get-pos-property", Fget_pos_property, Sget_pos_property, 2, 3, 0, doc: /* Return the value of POSITION's property PROP, in OBJECT. Almost identical to `get-char-property' except for the following difference: @@ -315,53 +297,41 @@ at POSITION. */) else { EMACS_INT posn = XFIXNUM (position); - ptrdiff_t noverlays; - Lisp_Object *overlay_vec, tem; + Lisp_Object tem; struct buffer *obuf = current_buffer; - USE_SAFE_ALLOCA; + struct itree_node *node; + struct sortvec items[2]; + struct sortvec *result = NULL; + struct buffer *b = XBUFFER (object); + Lisp_Object res = Qnil; - set_buffer_temp (XBUFFER (object)); + set_buffer_temp (b); - /* First try with room for 40 overlays. */ - Lisp_Object overlay_vecbuf[40]; - noverlays = ARRAYELTS (overlay_vecbuf); - overlay_vec = overlay_vecbuf; - noverlays = overlays_around (posn, overlay_vec, noverlays); - - /* If there are more than 40, - make enough space for all, and try again. */ - if (ARRAYELTS (overlay_vecbuf) < noverlays) + ITREE_FOREACH (node, b->overlays, posn - 1, posn + 1, ASCENDING) { - SAFE_ALLOCA_LISP (overlay_vec, noverlays); - noverlays = overlays_around (posn, overlay_vec, noverlays); - } - noverlays = sort_overlays (overlay_vec, noverlays, NULL); + Lisp_Object ol = node->data; + tem = Foverlay_get (ol, prop); + if (NILP (tem) + /* Check the overlay is indeed active at point. */ + || ((node->begin == posn + && OVERLAY_FRONT_ADVANCE_P (ol)) + || (node->end == posn + && ! OVERLAY_REAR_ADVANCE_P (ol)) + || node->begin > posn + || node->end < posn)) + /* The overlay will not cover a char inserted at point. */ + continue; + struct sortvec *this = (result == items ? items + 1 : items); + if (NILP (res) + || (make_sortvec_item (this, node->data), + compare_overlays (result, this) < 0)) + res = tem; + } set_buffer_temp (obuf); - /* Now check the overlays in order of decreasing priority. */ - while (--noverlays >= 0) - { - Lisp_Object ol = overlay_vec[noverlays]; - tem = Foverlay_get (ol, prop); - if (!NILP (tem)) - { - /* Check the overlay is indeed active at point. */ - if ((OVERLAY_START (ol) == posn - && OVERLAY_FRONT_ADVANCE_P (ol)) - || (OVERLAY_END (ol) == posn - && ! OVERLAY_REAR_ADVANCE_P (ol)) - || OVERLAY_START (ol) > posn - || OVERLAY_END (ol) < posn) - ; /* The overlay will not cover a char inserted at point. */ - else - { - SAFE_FREE (); - return tem; - } - } - } - SAFE_FREE (); + if (!NILP (res)) + return res; { /* Now check the text properties. */ int stickiness = text_property_stickiness (prop, position, object); diff --git a/src/lisp.h b/src/lisp.h index 75134425a07..e6fd8cacb1b 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4802,7 +4802,7 @@ extern void syms_of_editfns (void); /* Defined in buffer.c. */ extern bool mouse_face_overlay_overlaps (Lisp_Object); -extern Lisp_Object disable_line_numbers_overlay_at_eob (void); +extern bool disable_line_numbers_overlay_at_eob (void); extern AVOID nsberror (Lisp_Object); extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t, bool); extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t); diff --git a/src/xdisp.c b/src/xdisp.c index 750ebb703a6..2dcf0d58a14 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -25060,7 +25060,7 @@ should_produce_line_number (struct it *it) because get-char-property always returns nil for ZV, except if the property is in 'default-text-properties'. */ if (NILP (val) && IT_CHARPOS (*it) >= ZV) - val = disable_line_numbers_overlay_at_eob (); + return !disable_line_numbers_overlay_at_eob (); return NILP (val) ? true : false; } From cebd26b2e16d75a939e2a9f91becc6ec702122a7 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Mon, 5 Feb 2024 23:12:36 -0800 Subject: [PATCH 046/446] Use treesit-node-match-p in treesit-parent-while The previous commit should've done this, but I missed it. * lisp/treesit.el (treesit-parent-while): Use treesit-node-match-p. --- lisp/treesit.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/treesit.el b/lisp/treesit.el index f179204d89c..6a485ae591a 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -366,7 +366,7 @@ returns nil. PRED can be a predicate function, a regexp matching node type, and more; see docstring of `treesit-thing-settings'." (let ((last nil)) - (while (and node (funcall pred node)) + (while (and node (treesit-node-match-p node pred)) (setq last node node (treesit-node-parent node))) last)) From 0d2b7120783255fbb0f8e98717573c35425f4df6 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 6 Feb 2024 13:10:57 +0800 Subject: [PATCH 047/446] Don't forcibly display dialogs on Android if a keyboard is present * java/org/gnu/emacs/EmacsService.java (detectKeyboard): New function. * lisp/subr.el (use-dialog-box-p): Don't always return t if a keyboard is present on Android. * src/android.c (android_init_emacs_service): Link to new function. (android_detect_keyboard): New function. * src/android.h: Update prototypes. * src/androidfns.c (Fandroid_detect_keyboard) (syms_of_androidfns): New function. --- java/org/gnu/emacs/EmacsService.java | 10 ++++++++++ lisp/subr.el | 6 +++++- src/android.c | 16 ++++++++++++++++ src/android.h | 2 ++ src/androidfns.c | 20 ++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 5cb1ceca0aa..93e34e6e694 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -60,6 +60,7 @@ import android.content.pm.PackageManager; import android.content.res.AssetManager; +import android.content.res.Configuration; import android.hardware.input.InputManager; @@ -581,6 +582,15 @@ invocation of app_process (through android-emacs) can return false; } + public boolean + detectKeyboard () + { + Configuration configuration; + + configuration = getResources ().getConfiguration (); + return configuration.keyboard != Configuration.KEYBOARD_NOKEYS; + } + public String nameKeysym (int keysym) { diff --git a/lisp/subr.el b/lisp/subr.el index 582415a9761..e53ef505522 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3829,13 +3829,17 @@ confusing to some users.") (defvar from--tty-menu-p nil "Non-nil means the current command was invoked from a TTY menu.") + +(declare-function android-detect-keyboard "androidfns.c") + (defun use-dialog-box-p () "Return non-nil if the current command should prompt the user via a dialog box." (and last-input-event ; not during startup (or (consp last-nonmenu-event) ; invoked by a mouse event (and (null last-nonmenu-event) (consp last-input-event)) - (featurep 'android) ; Prefer dialog boxes on Android. + (and (featurep 'android) ; Prefer dialog boxes on Android. + (not (android-detect-keyboard))) ; If no keyboard is connected. from--tty-menu-p) ; invoked via TTY menu use-dialog-box)) diff --git a/src/android.c b/src/android.c index 4a74f5b2af4..2c0e4f845f4 100644 --- a/src/android.c +++ b/src/android.c @@ -1593,6 +1593,7 @@ android_init_emacs_service (void) FIND_METHOD (get_screen_width, "getScreenWidth", "(Z)I"); FIND_METHOD (get_screen_height, "getScreenHeight", "(Z)I"); FIND_METHOD (detect_mouse, "detectMouse", "()Z"); + FIND_METHOD (detect_keyboard, "detectKeyboard", "()Z"); FIND_METHOD (name_keysym, "nameKeysym", "(I)Ljava/lang/String;"); FIND_METHOD (browse_url, "browseUrl", "(Ljava/lang/String;Z)" "Ljava/lang/String;"); @@ -5626,6 +5627,21 @@ android_detect_mouse (void) return rc; } +bool +android_detect_keyboard (void) +{ + bool rc; + jmethodID method; + + method = service_class.detect_keyboard; + rc = (*android_java_env)->CallNonvirtualBooleanMethod (android_java_env, + emacs_service, + service_class.class, + method); + android_exception_check (); + return rc; +} + void android_set_dont_focus_on_map (android_window handle, bool no_focus_on_map) diff --git a/src/android.h b/src/android.h index 2f5f32037c5..bd19c4d9ac8 100644 --- a/src/android.h +++ b/src/android.h @@ -103,6 +103,7 @@ extern int android_get_screen_height (void); extern int android_get_mm_width (void); extern int android_get_mm_height (void); extern bool android_detect_mouse (void); +extern bool android_detect_keyboard (void); extern void android_set_dont_focus_on_map (android_window, bool); extern void android_set_dont_accept_focus (android_window, bool); @@ -265,6 +266,7 @@ struct android_emacs_service jmethodID get_screen_width; jmethodID get_screen_height; jmethodID detect_mouse; + jmethodID detect_keyboard; jmethodID name_keysym; jmethodID browse_url; jmethodID restart_emacs; diff --git a/src/androidfns.c b/src/androidfns.c index eaecb78338b..48c3f3046d6 100644 --- a/src/androidfns.c +++ b/src/androidfns.c @@ -2476,6 +2476,25 @@ there is no mouse. */) #endif } +DEFUN ("android-detect-keyboard", Fandroid_detect_keyboard, + Sandroid_detect_keyboard, 0, 0, 0, + doc: /* Return whether a keyboard is connected. +Return non-nil if a key is connected to this computer, or nil +if there is no keyboard. */) + (void) +{ +#ifndef ANDROID_STUBIFY + /* If no display connection is present, just return nil. */ + + if (!android_init_gui) + return Qnil; + + return android_detect_keyboard () ? Qt : Qnil; +#else /* ANDROID_STUBIFY */ + return Qt; +#endif /* ANDROID_STUBIFY */ +} + DEFUN ("android-toggle-on-screen-keyboard", Fandroid_toggle_on_screen_keyboard, Sandroid_toggle_on_screen_keyboard, 2, 2, 0, @@ -3560,6 +3579,7 @@ language to be US English if LANGUAGE is empty. */); defsubr (&Sx_show_tip); defsubr (&Sx_hide_tip); defsubr (&Sandroid_detect_mouse); + defsubr (&Sandroid_detect_keyboard); defsubr (&Sandroid_toggle_on_screen_keyboard); defsubr (&Sx_server_vendor); defsubr (&Sx_server_version); From 42db7292c3e05920bc9f2fa5c3478eb2ba835c5c Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 6 Feb 2024 17:52:33 +0800 Subject: [PATCH 048/446] Implement Lisp threading on Android Much like the NS port, only the main thread receives input from the user interface, which is fortunately not a major problem for packages such as lsp-mode that create Lisp threads. * configure.ac: Enable with_threads under Android. * src/android.c (android_init_events): Set `main_thread_id' to the ID of the main thread. (setEmacsParams): Set new global variable `android_jvm' to the JVM object, for the purpose of attaching Lisp threads to the JVM. (android_select): [THREADS_ENABLED]: If the caller isn't the main thread, resort to pselect. Don't check query before select returns. (android_check_query): Export. * src/android.h (_ANDROID_H_): Define new macro and update prototypes. * src/process.c (android_select_wrapper): New function. (wait_reading_process_output): If THREADS_ENABLED, call thread_select through the Android select wrapper. * src/thread.c (post_acquire_global_lock): Call android_check_query; replace android_java_env with the incoming Lisp thread's. (run_thread): Attach and detach the thread created to the JVM. (init_threads): Set the main thread's JNI environment object. * src/thread.h (struct thread_state) : New field. --- configure.ac | 3 ++- src/android.c | 34 ++++++++++++++++++++++++++++------ src/android.h | 7 +++++++ src/process.c | 33 ++++++++++++++++++++++++++++++--- src/thread.c | 39 +++++++++++++++++++++++++++++++++++++++ src/thread.h | 11 +++++++++++ 6 files changed, 117 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index fa8b04ec685..901980c4d8e 100644 --- a/configure.ac +++ b/configure.ac @@ -1231,6 +1231,7 @@ package will likely install on older systems but crash on startup.]) passthrough="$passthrough --with-mailutils=$with_mailutils" passthrough="$passthrough --with-pop=$with_pop" passthrough="$passthrough --with-harfbuzz=$with_harfbuzz" + passthrough="$passthrough --with-threads=$with_png" # Now pass through some checking options. emacs_val="--enable-check-lisp-object-type=$enable_check_lisp_object_type" @@ -1321,6 +1322,7 @@ if test "$ANDROID" = "yes"; then with_pop=no with_harfbuzz=no with_native_compilation=no + with_threads=no fi with_rsvg=no @@ -1331,7 +1333,6 @@ if test "$ANDROID" = "yes"; then with_gpm=no with_dbus=no with_gsettings=no - with_threads=no with_ns=no # zlib is available in android. diff --git a/src/android.c b/src/android.c index 2c0e4f845f4..46f4dcd5546 100644 --- a/src/android.c +++ b/src/android.c @@ -40,6 +40,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include /* Old NDK versions lack MIN and MAX. */ #include @@ -152,6 +153,13 @@ static char *android_files_dir; /* The Java environment being used for the main thread. */ JNIEnv *android_java_env; +#ifdef THREADS_ENABLED + +/* The Java VM new threads attach to. */ +JavaVM *android_jvm; + +#endif /* THREADS_ENABLED */ + /* The EmacsGC class. */ static jclass emacs_gc_class; @@ -496,6 +504,9 @@ android_handle_sigusr1 (int sig, siginfo_t *siginfo, void *arg) This should ideally be defined further down. */ static sem_t android_query_sem; +/* ID of the Emacs thread. */ +static pthread_t main_thread_id; + /* Set up the global event queue by initializing the mutex and two condition variables, and the linked list of events. This must be called before starting the Emacs thread. Also, initialize the @@ -531,6 +542,8 @@ android_init_events (void) event_queue.events.next = &event_queue.events; event_queue.events.last = &event_queue.events; + main_thread_id = pthread_self (); + #if __ANDROID_API__ >= 16 /* Before starting the select thread, make sure the disposition for @@ -579,10 +592,6 @@ android_pending (void) return i; } -/* Forward declaration. */ - -static void android_check_query (void); - /* Wait for events to become available synchronously. Return once an event arrives. Also, reply to the UI thread whenever it requires a response. */ @@ -732,6 +741,12 @@ android_select (int nfds, fd_set *readfds, fd_set *writefds, static char byte; #endif +#ifdef THREADS_ENABLED + if (!pthread_equal (pthread_self (), main_thread_id)) + return pselect (nfds, readfds, writefds, exceptfds, timeout, + NULL); +#endif /* THREADS_ENABLED */ + /* Since Emacs is reading keyboard input again, signify that queries from input methods are no longer ``urgent''. */ @@ -837,9 +852,11 @@ android_select (int nfds, fd_set *readfds, fd_set *writefds, if (nfds_return < 0) errno = EINTR; +#ifndef THREADS_ENABLED /* Now check for and run anything the UI thread wants to run in the main thread. */ android_check_query (); +#endif /* THREADS_ENABLED */ return nfds_return; } @@ -1315,12 +1332,17 @@ NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object, const char *java_string; struct stat statb; +#ifdef THREADS_ENABLED + /* Save the Java VM. */ + if ((*env)->GetJavaVM (env, &android_jvm)) + emacs_abort (); +#endif /* THREADS_ENABLED */ + /* Set the Android API level early, as it is used by `android_vfs_init'. */ android_api_level = api_level; /* This function should only be called from the main thread. */ - android_pixel_density_x = pixel_density_x; android_pixel_density_y = pixel_density_y; android_scaled_pixel_density = scaled_density; @@ -6717,7 +6739,7 @@ static void *android_query_context; /* Run any function that the UI thread has asked to run, and then signal its completion. */ -static void +void android_check_query (void) { void (*proc) (void *); diff --git a/src/android.h b/src/android.h index bd19c4d9ac8..e1834cebf68 100644 --- a/src/android.h +++ b/src/android.h @@ -24,6 +24,8 @@ along with GNU Emacs. If not, see . */ a table of function pointers. */ #ifndef _ANDROID_H_ +#define _ANDROID_H_ + #ifndef ANDROID_STUBIFY #include #include @@ -226,6 +228,7 @@ extern void android_display_toast (const char *); /* Event loop functions. */ +extern void android_check_query (void); extern void android_check_query_urgent (void); extern int android_run_in_emacs_thread (void (*) (void *), void *); extern void android_write_event (union android_event *); @@ -299,6 +302,10 @@ struct android_emacs_service extern JNIEnv *android_java_env; +#ifdef THREADS_ENABLED +extern JavaVM *android_jvm; +#endif /* THREADS_ENABLED */ + /* The EmacsService object. */ extern jobject emacs_service; diff --git a/src/process.c b/src/process.c index ddab9ed6c01..48a2c0c8e53 100644 --- a/src/process.c +++ b/src/process.c @@ -5209,6 +5209,27 @@ wait_reading_process_output_1 (void) { } +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY \ + && defined THREADS_ENABLED + +/* Wrapper around `android_select' that exposes a calling interface with + an extra argument for compatibility with `thread_pselect'. */ + +static int +android_select_wrapper (int nfds, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds, const struct timespec *timeout, + const sigset_t *sigmask) +{ + /* sigmask is not supported. */ + if (sigmask) + emacs_abort (); + + return android_select (nfds, readfds, writefds, exceptfds, + (struct timespec *) timeout); +} + +#endif /* HAVE_ANDROID && !ANDROID_STUBIFY && THREADS_ENABLED */ + /* Read and dispose of subprocess output while waiting for timeout to elapse and/or keyboard input to be available. @@ -5701,13 +5722,19 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, timeout = short_timeout; #endif - /* Android doesn't support threads and requires using a - replacement for pselect in android.c to poll for - events. */ + /* Android requires using a replacement for pselect in + android.c to poll for events. */ #if defined HAVE_ANDROID && !defined ANDROID_STUBIFY +#ifndef THREADS_ENABLED nfds = android_select (max_desc + 1, &Available, (check_write ? &Writeok : 0), NULL, &timeout); +#else /* THREADS_ENABLED */ + nfds = thread_select (android_select_wrapper, + max_desc + 1, + &Available, (check_write ? &Writeok : 0), + NULL, &timeout, NULL); +#endif /* THREADS_ENABLED */ #else /* Non-macOS HAVE_GLIB builds call thread_select in diff --git a/src/thread.c b/src/thread.c index 040ca39511e..2f5d7a08838 100644 --- a/src/thread.c +++ b/src/thread.c @@ -106,6 +106,12 @@ post_acquire_global_lock (struct thread_state *self) { struct thread_state *prev_thread = current_thread; + /* Switch the JNI interface pointer to the environment assigned to the + current thread. */ +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + android_java_env = self->java_env; +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ + /* Do this early on, so that code below could signal errors (e.g., unbind_for_thread_switch might) correctly, because we are already running in the context of the thread pointed by SELF. */ @@ -126,6 +132,12 @@ post_acquire_global_lock (struct thread_state *self) set_buffer_internal_2 (current_buffer); } +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + /* This step is performed in android_select when built without + threads. */ + android_check_query (); +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ + /* We could have been signaled while waiting to grab the global lock for the first time since this thread was created, in which case we didn't yet have the opportunity to set up the handlers. Delay @@ -756,6 +768,11 @@ run_thread (void *state) struct thread_state *self = state; struct thread_state **iter; +#ifdef THREADS_ENABLED +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + jint rc; +#endif /* #if defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ +#endif /* THREADS_ENABLED */ #ifdef HAVE_NS /* Allocate an autorelease pool in case this thread calls any @@ -766,6 +783,16 @@ run_thread (void *state) void *pool = ns_alloc_autorelease_pool (); #endif +#ifdef THREADS_ENABLED +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + rc + = (*android_jvm)->AttachCurrentThread (android_jvm, &self->java_env, + NULL); + if (rc != JNI_OK) + emacs_abort (); +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ +#endif /* THREADS_ENABLED */ + self->m_stack_bottom = self->stack_top = &stack_pos.c; self->thread_id = sys_thread_self (); @@ -812,6 +839,14 @@ run_thread (void *state) ns_release_autorelease_pool (pool); #endif +#ifdef THREADS_ENABLED +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + rc = (*android_jvm)->DetachCurrentThread (android_jvm); + if (rc != JNI_OK) + emacs_abort (); +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ +#endif /* THREADS_ENABLED */ + /* Unlink this thread from the list of all threads. Note that we have to do this very late, after broadcasting our death. Otherwise the GC may decide to reap the thread_state object, @@ -1131,6 +1166,10 @@ init_threads (void) sys_mutex_init (&global_lock); sys_mutex_lock (&global_lock); current_thread = &main_thread.s; +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + current_thread->java_env = android_java_env; +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ + main_thread.s.thread_id = sys_thread_self (); init_bc_thread (&main_thread.s.bc); } diff --git a/src/thread.h b/src/thread.h index 6ce2b7f30df..1844cf03967 100644 --- a/src/thread.h +++ b/src/thread.h @@ -30,6 +30,12 @@ along with GNU Emacs. If not, see . */ #include /* sigset_t */ #endif +#ifdef HAVE_ANDROID +#ifndef ANDROID_STUBIFY +#include "android.h" +#endif /* ANDROID_STUBIFY */ +#endif /* HAVE_ANDROID */ + #include "sysselect.h" /* FIXME */ #include "systhread.h" @@ -84,6 +90,11 @@ struct thread_state Lisp_Object event_object; /* event_object must be the last Lisp field. */ +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + /* Pointer to an object to call Java functions through. */ + JNIEnv *java_env; +#endif /* HAVE_ANDROID && !ANDROID_STUBIFY */ + /* An address near the bottom of the stack. Tells GC how to save a copy of the stack. */ char const *m_stack_bottom; From f6225d125c07bbde8c828b40eb6e81333e051c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 6 Feb 2024 12:39:11 +0100 Subject: [PATCH 049/446] Optionally show internal buffers in Buffer Menu mode Internal buffers were never shown before but they can be of interest to Elisp developers, especially since there is no general mechanism to remove unused buffers. * lisp/buff-menu.el (Buffer-menu-show-internal) (Buffer-menu--selection-message, Buffer-menu-toggle-internal): New. (Buffer-menu-mode-map): Bind to `I`. (Buffer-menu-mode-menu): Add menu entry. (list-buffers--refresh): Extend filtering logic. * etc/NEWS: Announce. --- etc/NEWS | 6 ++++++ lisp/buff-menu.el | 33 +++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 5180c26aa92..f980d612a57 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1303,6 +1303,12 @@ will return the URL for that bug. This allows for rcirc logs to use a custom timestamp format, than the chat buffers use by default. +--- +*** New command 'Buffer-menu-toggle-internal', locally bound to 'I'. +This command toggles the display of internal buffers in Buffer Menu mode; +that is, buffers not visiting a file and whose names start with a space. +Previously, such buffers were never shown. + ** Customize +++ diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 5796544c534..9561141f0c3 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -100,6 +100,10 @@ as it is by default." This is set by the prefix argument to `buffer-menu' and related commands.") +(defvar-local Buffer-menu-show-internal nil + "Non-nil if the current Buffer Menu lists internal buffers. +Internal buffers are those whose names start with a space.") + (defvar-local Buffer-menu-filter-predicate nil "Function to filter out buffers in the buffer list. Buffers that don't satisfy the predicate will be skipped. @@ -140,6 +144,7 @@ then the buffer will be displayed in the buffer list.") "V" #'Buffer-menu-view "O" #'Buffer-menu-view-other-window "T" #'Buffer-menu-toggle-files-only + "I" #'Buffer-menu-toggle-internal "M-s a C-s" #'Buffer-menu-isearch-buffers "M-s a C-M-s" #'Buffer-menu-isearch-buffers-regexp "M-s a C-o" #'Buffer-menu-multi-occur @@ -197,6 +202,10 @@ then the buffer will be displayed in the buffer list.") :help "Toggle whether the current buffer-menu displays only file buffers" :style toggle :selected Buffer-menu-files-only] + ["Show Internal Buffers" Buffer-menu-toggle-internal + :help "Toggle whether the current buffer-menu displays internal buffers" + :style toggle + :selected Buffer-menu-show-internal] "---" ["Refresh" revert-buffer :help "Refresh the *Buffer List* buffer contents"] @@ -317,6 +326,11 @@ ARG, show only buffers that are visiting files." (interactive "P") (display-buffer (list-buffers-noselect arg))) +(defun Buffer-menu--selection-message () + (message (cond (Buffer-menu-files-only "Showing only file-visiting buffers.") + (Buffer-menu-show-internal "Showing all buffers.") + (t "Showing all non-internal buffers.")))) + (defun Buffer-menu-toggle-files-only (arg) "Toggle whether the current `buffer-menu' displays only file buffers. With a positive ARG, display only file buffers. With zero or @@ -325,9 +339,18 @@ negative ARG, display other buffers as well." (setq Buffer-menu-files-only (cond ((not arg) (not Buffer-menu-files-only)) ((> (prefix-numeric-value arg) 0) t))) - (message (if Buffer-menu-files-only - "Showing only file-visiting buffers." - "Showing all non-internal buffers.")) + (Buffer-menu--selection-message) + (revert-buffer)) + +(defun Buffer-menu-toggle-internal (arg) + "Toggle whether the current `buffer-menu' displays internal buffers. +With a positive ARG, display non-internal buffers only. With zero or +negative ARG, display internal buffers as well." + (interactive "P" Buffer-menu-mode) + (setq Buffer-menu-show-internal + (cond ((not arg) (not Buffer-menu-show-internal)) + ((> (prefix-numeric-value arg) 0) t))) + (Buffer-menu--selection-message) (revert-buffer)) (define-obsolete-function-alias 'Buffer-menu-sort 'tabulated-list-sort @@ -667,6 +690,7 @@ See more at `Buffer-menu-filter-predicate'." (marked-buffers (Buffer-menu-marked-buffers)) (buffer-menu-buffer (current-buffer)) (show-non-file (not Buffer-menu-files-only)) + (show-internal Buffer-menu-show-internal) (filter-predicate (and (functionp Buffer-menu-filter-predicate) Buffer-menu-filter-predicate)) entries name-width) @@ -686,7 +710,8 @@ See more at `Buffer-menu-filter-predicate'." (file buffer-file-name)) (when (and (buffer-live-p buffer) (or buffer-list - (and (or (not (string= (substring name 0 1) " ")) + (and (or show-internal + (not (string= (substring name 0 1) " ")) file) (not (eq buffer buffer-menu-buffer)) (or file show-non-file) From e66870400d45e3d08265df9f6acd4631a5712139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 15 Jan 2024 09:25:02 +0100 Subject: [PATCH 050/446] Change hash range reduction from remainder to multiplication This makes both lookups and rehashing cheaper. The index vector size is now always a power of 2. The first table size is reduced to 6 (from 8), because index vectors would become excessively big otherwise. * src/lisp.h (struct Lisp_Hash_Table): Replace index_size with index_bits. All references adapted. (hash_table_index_size): New accessor; use it where applicable. * src/fns.c (hash_index_size): Replace with... (compute_hash_index_bits): ...this new function, returning the log2 of the index size. All callers adapted. (hash_index_index): Knuth multiplicative hashing instead of remainder. (maybe_resize_hash_table): Reduce first table size from 8 to 6. --- src/alloc.c | 7 +++-- src/fns.c | 76 +++++++++++++++++++++++++-------------------------- src/lisp.h | 13 +++++++-- src/pdumper.c | 2 +- 4 files changed, 53 insertions(+), 45 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 15bb65cf74f..6abe9e28650 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3443,7 +3443,7 @@ cleanup_vector (struct Lisp_Vector *vector) struct Lisp_Hash_Table *h = PSEUDOVEC_STRUCT (vector, Lisp_Hash_Table); if (h->table_size > 0) { - eassert (h->index_size > 1); + eassert (h->index_bits > 0); xfree (h->index); xfree (h->key_and_value); xfree (h->next); @@ -3451,7 +3451,7 @@ cleanup_vector (struct Lisp_Vector *vector) ptrdiff_t bytes = (h->table_size * (2 * sizeof *h->key_and_value + sizeof *h->hash + sizeof *h->next) - + h->index_size * sizeof *h->index); + + hash_table_index_size (h) * sizeof *h->index); hash_table_allocated_bytes -= bytes; } } @@ -5959,7 +5959,8 @@ purecopy_hash_table (struct Lisp_Hash_Table *table) for (ptrdiff_t i = 0; i < nvalues; i++) pure->key_and_value[i] = purecopy (table->key_and_value[i]); - ptrdiff_t index_bytes = table->index_size * sizeof *table->index; + ptrdiff_t index_bytes = hash_table_index_size (table) + * sizeof *table->index; pure->index = pure_alloc (index_bytes, -(int)sizeof *table->index); memcpy (pure->index, table->index, index_bytes); } diff --git a/src/fns.c b/src/fns.c index 08908d481a3..7de2616b359 100644 --- a/src/fns.c +++ b/src/fns.c @@ -4291,7 +4291,7 @@ set_hash_hash_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, hash_hash_t val) static void set_hash_index_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, ptrdiff_t val) { - eassert (idx >= 0 && idx < h->index_size); + eassert (idx >= 0 && idx < hash_table_index_size (h)); h->index[idx] = val; } @@ -4392,7 +4392,7 @@ HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t idx) static ptrdiff_t HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx) { - eassert (idx >= 0 && idx < h->index_size); + eassert (idx >= 0 && idx < hash_table_index_size (h)); return h->index[idx]; } @@ -4527,26 +4527,19 @@ allocate_hash_table (void) return ALLOCATE_PLAIN_PSEUDOVECTOR (struct Lisp_Hash_Table, PVEC_HASH_TABLE); } -/* Compute the size of the index from the table capacity. */ -static ptrdiff_t -hash_index_size (ptrdiff_t size) +/* Compute the size of the index (as log2) from the table capacity. */ +static int +compute_hash_index_bits (hash_idx_t size) { - /* An upper bound on the size of a hash table index. It must fit in - ptrdiff_t and be a valid Emacs fixnum. */ - ptrdiff_t upper_bound = min (MOST_POSITIVE_FIXNUM, - min (TYPE_MAXIMUM (hash_idx_t), - PTRDIFF_MAX / sizeof (ptrdiff_t))); - /* Single-element index vectors are used iff size=0. */ - eassert (size > 0); - ptrdiff_t lower_bound = 2; - ptrdiff_t index_size = size + max (size >> 2, 1); /* 1.25x larger */ - if (index_size < upper_bound) - index_size = (index_size < lower_bound - ? lower_bound - : next_almost_prime (index_size)); - if (index_size > upper_bound) + /* An upper bound on the size of a hash table index index. */ + hash_idx_t upper_bound = min (MOST_POSITIVE_FIXNUM, + min (TYPE_MAXIMUM (hash_idx_t), + PTRDIFF_MAX / sizeof (hash_idx_t))); + /* Use next higher power of 2. This works even for size=0. */ + int bits = elogb (size) + 1; + if (bits >= TYPE_WIDTH (uintmax_t) || ((uintmax_t)1 << bits) > upper_bound) error ("Hash table too large"); - return index_size; + return bits; } /* Constant hash index vector used when the table size is zero. @@ -4587,7 +4580,7 @@ make_hash_table (const struct hash_table_test *test, EMACS_INT size, h->key_and_value = NULL; h->hash = NULL; h->next = NULL; - h->index_size = 1; + h->index_bits = 0; h->index = (hash_idx_t *)empty_hash_index_vector; h->next_free = -1; } @@ -4605,8 +4598,9 @@ make_hash_table (const struct hash_table_test *test, EMACS_INT size, h->next[i] = i + 1; h->next[size - 1] = -1; - int index_size = hash_index_size (size); - h->index_size = index_size; + int index_bits = compute_hash_index_bits (size); + h->index_bits = index_bits; + ptrdiff_t index_size = hash_table_index_size (h); h->index = hash_table_alloc_bytes (index_size * sizeof *h->index); for (ptrdiff_t i = 0; i < index_size; i++) h->index[i] = -1; @@ -4654,7 +4648,7 @@ copy_hash_table (struct Lisp_Hash_Table *h1) h2->next = hash_table_alloc_bytes (next_bytes); memcpy (h2->next, h1->next, next_bytes); - ptrdiff_t index_bytes = h1->index_size * sizeof *h1->index; + ptrdiff_t index_bytes = hash_table_index_size (h1) * sizeof *h1->index; h2->index = hash_table_alloc_bytes (index_bytes); memcpy (h2->index, h1->index, index_bytes); } @@ -4668,8 +4662,11 @@ copy_hash_table (struct Lisp_Hash_Table *h1) static inline ptrdiff_t hash_index_index (struct Lisp_Hash_Table *h, hash_hash_t hash) { - eassert (h->index_size > 0); - return hash % h->index_size; + /* Knuth multiplicative hashing, tailored for 32-bit indices + (avoiding a 64-bit multiply). */ + uint32_t alpha = 2654435769; /* 2**32/phi */ + /* Note the cast to uint64_t, to make it work for index_bits=0. */ + return (uint64_t)((uint32_t)hash * alpha) >> (32 - h->index_bits); } /* Resize hash table H if it's too full. If H cannot be resized @@ -4681,7 +4678,7 @@ maybe_resize_hash_table (struct Lisp_Hash_Table *h) if (h->next_free < 0) { ptrdiff_t old_size = HASH_TABLE_SIZE (h); - ptrdiff_t min_size = 8; + ptrdiff_t min_size = 6; ptrdiff_t base_size = min (max (old_size, min_size), PTRDIFF_MAX / 2); /* Grow aggressively at small sizes, then just double. */ ptrdiff_t new_size = @@ -4706,13 +4703,14 @@ maybe_resize_hash_table (struct Lisp_Hash_Table *h) hash_hash_t *hash = hash_table_alloc_bytes (new_size * sizeof *hash); memcpy (hash, h->hash, old_size * sizeof *hash); - ptrdiff_t old_index_size = h->index_size; - ptrdiff_t index_size = hash_index_size (new_size); + ptrdiff_t old_index_size = hash_table_index_size (h); + ptrdiff_t index_bits = compute_hash_index_bits (new_size); + ptrdiff_t index_size = (ptrdiff_t)1 << index_bits; hash_idx_t *index = hash_table_alloc_bytes (index_size * sizeof *index); for (ptrdiff_t i = 0; i < index_size; i++) index[i] = -1; - h->index_size = index_size; + h->index_bits = index_bits; h->table_size = new_size; h->next_free = old_size; @@ -4778,18 +4776,19 @@ hash_table_thaw (Lisp_Object hash_table) h->key_and_value = NULL; h->hash = NULL; h->next = NULL; - h->index_size = 1; + h->index_bits = 0; h->index = (hash_idx_t *)empty_hash_index_vector; } else { - ptrdiff_t index_size = hash_index_size (size); - h->index_size = index_size; + ptrdiff_t index_bits = compute_hash_index_bits (size); + h->index_bits = index_bits; h->hash = hash_table_alloc_bytes (size * sizeof *h->hash); h->next = hash_table_alloc_bytes (size * sizeof *h->next); + ptrdiff_t index_size = hash_table_index_size (h); h->index = hash_table_alloc_bytes (index_size * sizeof *h->index); for (ptrdiff_t i = 0; i < index_size; i++) h->index[i] = -1; @@ -4937,7 +4936,8 @@ hash_clear (struct Lisp_Hash_Table *h) set_hash_value_slot (h, i, Qnil); } - for (ptrdiff_t i = 0; i < h->index_size; i++) + ptrdiff_t index_size = hash_table_index_size (h); + for (ptrdiff_t i = 0; i < index_size; i++) h->index[i] = -1; h->next_free = 0; @@ -4976,7 +4976,7 @@ keep_entry_p (hash_table_weakness_t weakness, bool sweep_weak_table (struct Lisp_Hash_Table *h, bool remove_entries_p) { - ptrdiff_t n = h->index_size; + ptrdiff_t n = hash_table_index_size (h); bool marked = false; for (ptrdiff_t bucket = 0; bucket < n; ++bucket) @@ -5701,7 +5701,7 @@ DEFUN ("internal--hash-table-histogram", struct Lisp_Hash_Table *h = check_hash_table (hash_table); ptrdiff_t size = HASH_TABLE_SIZE (h); ptrdiff_t *freq = xzalloc (size * sizeof *freq); - ptrdiff_t index_size = h->index_size; + ptrdiff_t index_size = hash_table_index_size (h); for (ptrdiff_t i = 0; i < index_size; i++) { ptrdiff_t n = 0; @@ -5729,7 +5729,7 @@ Internal use only. */) { struct Lisp_Hash_Table *h = check_hash_table (hash_table); Lisp_Object ret = Qnil; - ptrdiff_t index_size = h->index_size; + ptrdiff_t index_size = hash_table_index_size (h); for (ptrdiff_t i = 0; i < index_size; i++) { Lisp_Object bucket = Qnil; @@ -5750,7 +5750,7 @@ DEFUN ("internal--hash-table-index-size", (Lisp_Object hash_table) { struct Lisp_Hash_Table *h = check_hash_table (hash_table); - return make_int (h->index_size); + return make_int (hash_table_index_size (h)); } diff --git a/src/lisp.h b/src/lisp.h index e6fd8cacb1b..d6bbf15d83b 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2475,14 +2475,14 @@ struct Lisp_Hash_Table The table is physically split into three vectors (hash, next, key_and_value) which may or may not be beneficial. */ - hash_idx_t index_size; /* Size of the index vector. */ + int index_bits; /* log2 (size of the index vector). */ hash_idx_t table_size; /* Size of the next and hash vectors. */ /* Bucket vector. An entry of -1 indicates no item is present, and a nonnegative entry is the index of the first item in a collision chain. - This vector is index_size entries long. - If index_size is 1 (and table_size is 0), then this is the + This vector is 2**index_bits entries long. + If index_bits is 0 (and table_size is 0), then this is the constant read-only vector {-1}, shared between all instances. Otherwise it is heap-allocated. */ hash_idx_t *index; @@ -2597,6 +2597,13 @@ HASH_TABLE_SIZE (const struct Lisp_Hash_Table *h) return h->table_size; } +/* Size of the index vector in hash table H. */ +INLINE ptrdiff_t +hash_table_index_size (const struct Lisp_Hash_Table *h) +{ + return (ptrdiff_t)1 << h->index_bits; +} + /* Hash value for KEY in hash table H. */ INLINE hash_hash_t hash_from_key (struct Lisp_Hash_Table *h, Lisp_Object key) diff --git a/src/pdumper.c b/src/pdumper.c index ee554cda55a..b8006b035ea 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2688,7 +2688,7 @@ hash_table_freeze (struct Lisp_Hash_Table *h) h->hash = NULL; h->index = NULL; h->table_size = 0; - h->index_size = 0; + h->index_bits = 0; h->frozen_test = hash_table_std_test (h->test); h->test = NULL; } From 05e3183ede3a08993a7d209fb14153abaed0c74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 6 Feb 2024 15:23:53 +0100 Subject: [PATCH 051/446] Rearrange and pack hash table fields to reduce space * src/lisp.h (struct Lisp_Hash_Table): Move and reduce width of fields where possible; this saves an entire word at no apparent cost. --- src/lisp.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index d6bbf15d83b..5326824bf38 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2475,9 +2475,6 @@ struct Lisp_Hash_Table The table is physically split into three vectors (hash, next, key_and_value) which may or may not be beneficial. */ - int index_bits; /* log2 (size of the index vector). */ - hash_idx_t table_size; /* Size of the next and hash vectors. */ - /* Bucket vector. An entry of -1 indicates no item is present, and a nonnegative entry is the index of the first item in a collision chain. @@ -2514,20 +2511,24 @@ struct Lisp_Hash_Table /* Index of first free entry in free list, or -1 if none. */ hash_idx_t next_free; + hash_idx_t table_size; /* Size of the next and hash vectors. */ + + unsigned char index_bits; /* log2 (size of the index vector). */ + /* Weakness of the table. */ - hash_table_weakness_t weakness : 8; + hash_table_weakness_t weakness : 3; /* Hash table test (only used when frozen in dump) */ - hash_table_std_test_t frozen_test : 8; + hash_table_std_test_t frozen_test : 2; /* True if the table can be purecopied. The table cannot be changed afterwards. */ - bool purecopy; + bool_bf purecopy : 1; /* True if the table is mutable. Ordinarily tables are mutable, but pure tables are not, and while a table is being mutated it is immutable for recursive attempts to mutate it. */ - bool mutable; + bool_bf mutable : 1; /* Next weak hash table if this is a weak hash table. The head of the list is in weak_hash_tables. Used only during garbage From ce7365b591852dd5556e0a4bf6a0ba63a8733802 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 6 Feb 2024 19:55:41 +0200 Subject: [PATCH 052/446] Use new variable Buffer-menu-show-internal in project-list-buffers. * lisp/progmodes/project.el (project-list-buffers): Add the new variable `Buffer-menu-show-internal' used to toggle internal buffers (bug#68949). --- lisp/progmodes/project.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index da782ad5537..983c0ed2ac2 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -1515,7 +1515,8 @@ ARG, show only buffers that are visiting files." (lambda (buffer) (let ((name (buffer-name buffer)) (file (buffer-file-name buffer))) - (and (or (not (string= (substring name 0 1) " ")) + (and (or Buffer-menu-show-internal + (not (string= (substring name 0 1) " ")) file) (not (eq buffer (current-buffer))) (or file (not Buffer-menu-files-only))))) @@ -1525,6 +1526,7 @@ ARG, show only buffers that are visiting files." (let ((buf (list-buffers-noselect arg (with-current-buffer (get-buffer-create "*Buffer List*") + (setq-local Buffer-menu-show-internal nil) (let ((Buffer-menu-files-only arg)) (funcall buffer-list-function)))))) (with-current-buffer buf From a2201a2034a86b4cc90132ab2d920456866c11e3 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 6 Feb 2024 13:21:22 -0500 Subject: [PATCH 053/446] (loaddefs-generate--parse-file): Be a bit more defensive * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--parse-file): Don't fail in case of an error while generating the prefixes. (loaddefs-generate--compute-prefixes): Don't burp when `read-from-string` returns something else than a symbol. --- lisp/emacs-lisp/loaddefs-gen.el | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 7eced43e735..7cfb14ace5f 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -489,10 +489,12 @@ don't include." (when (and autoload-compute-prefixes compute-prefixes) - (when-let ((form (loaddefs-generate--compute-prefixes load-name))) - ;; This output needs to always go in the main loaddefs.el, - ;; regardless of `generated-autoload-file'. - (push (list main-outfile file form) defs))))) + (with-demoted-errors "%S" + (when-let + ((form (loaddefs-generate--compute-prefixes load-name))) + ;; This output needs to always go in the main loaddefs.el, + ;; regardless of `generated-autoload-file'. + (push (list main-outfile file form) defs)))))) defs)) (defun loaddefs-generate--compute-prefixes (load-name) @@ -506,14 +508,15 @@ don't include." ;; Consider `read-symbol-shorthands'. (probe (let ((obarray (obarray-make))) (car (read-from-string name))))) - (setq name (symbol-name probe)) - (when (save-excursion - (goto-char (match-beginning 0)) - (or (bobp) - (progn - (forward-line -1) - (not (looking-at ";;;###autoload"))))) - (push name prefs))))) + (when (symbolp name) + (setq name (symbol-name probe)) + (when (save-excursion + (goto-char (match-beginning 0)) + (or (bobp) + (progn + (forward-line -1) + (not (looking-at ";;;###autoload"))))) + (push name prefs)))))) (loaddefs-generate--make-prefixes prefs load-name))) (defun loaddefs-generate--rubric (file &optional type feature compile) From ab318cce1e97f4b9c78adc3290784105b78f0728 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 6 Feb 2024 21:55:57 +0200 Subject: [PATCH 054/446] ; Fix last change in buffer-menu.el * etc/NEWS: Elaborate about the binding of the new command. * lisp/buff-menu.el (Buffer-menu--selection-message): Fix wording of new message. (Buffer-menu-toggle-internal): Doc fix. (Bug#68949) --- etc/NEWS | 3 ++- lisp/buff-menu.el | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index f980d612a57..ee7462cb2aa 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1307,7 +1307,8 @@ chat buffers use by default. *** New command 'Buffer-menu-toggle-internal', locally bound to 'I'. This command toggles the display of internal buffers in Buffer Menu mode; that is, buffers not visiting a file and whose names start with a space. -Previously, such buffers were never shown. +Previously, such buffers were never shown. This command is bound to 'I' +in Buffer menu mode. ** Customize diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 9561141f0c3..29ca3b41f0c 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -329,7 +329,7 @@ ARG, show only buffers that are visiting files." (defun Buffer-menu--selection-message () (message (cond (Buffer-menu-files-only "Showing only file-visiting buffers.") (Buffer-menu-show-internal "Showing all buffers.") - (t "Showing all non-internal buffers.")))) + (t "Hiding internal buffers.")))) (defun Buffer-menu-toggle-files-only (arg) "Toggle whether the current `buffer-menu' displays only file buffers. @@ -344,7 +344,7 @@ negative ARG, display other buffers as well." (defun Buffer-menu-toggle-internal (arg) "Toggle whether the current `buffer-menu' displays internal buffers. -With a positive ARG, display non-internal buffers only. With zero or +With a positive ARG, don't show internal buffers. With zero or negative ARG, display internal buffers as well." (interactive "P" Buffer-menu-mode) (setq Buffer-menu-show-internal From 77f240012f1e9a7cfee60adedebc8e6a230ce49b Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 6 Feb 2024 15:36:18 -0500 Subject: [PATCH 055/446] (loaddefs-generate--compute-prefixes): Fix thinko in last change * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--compute-prefixes): Fix thinko in last change. Also, reduce memory allocation. --- lisp/emacs-lisp/loaddefs-gen.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 7cfb14ace5f..1e91e84157d 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -499,16 +499,17 @@ don't include." (defun loaddefs-generate--compute-prefixes (load-name) (goto-char (point-min)) - (let ((prefs nil)) + (let ((prefs nil) + (temp-obarray (obarray-make))) ;; Avoid (defvar ) by requiring a trailing space. (while (re-search-forward "^(\\(def[^ \t\n]+\\)[ \t\n]+['(]*\\([^' ()\"\n]+\\)[\n \t]" nil t) (unless (member (match-string 1) autoload-ignored-definitions) (let* ((name (match-string-no-properties 2)) ;; Consider `read-symbol-shorthands'. - (probe (let ((obarray (obarray-make))) + (probe (let ((obarray temp-obarray)) (car (read-from-string name))))) - (when (symbolp name) + (when (symbolp probe) (setq name (symbol-name probe)) (when (save-excursion (goto-char (match-beginning 0)) From e25d11314d84cc3e606515d6551e878cec4cfee4 Mon Sep 17 00:00:00 2001 From: Joseph Turner Date: Tue, 30 Jan 2024 22:08:50 -0800 Subject: [PATCH 056/446] Pass unquoted filename to user-supplied MUSTMATCH predicate * lisp/minibuffer.el (read-file-name-default): Pass REQUIRE-MATCH argument through substitute-in-file-name. * lisp/minibuffer.el (read-file-name): Update docstring. Resolves bug#68815. --- lisp/minibuffer.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index faa7f543ece..a9e3ec937f9 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -3262,9 +3262,10 @@ Fourth arg MUSTMATCH can take the following values: input, but she needs to confirm her choice if she called `minibuffer-complete' right before `minibuffer-complete-and-exit' and the input is not an existing file. -- a function, which will be called with the input as the - argument. If the function returns a non-nil value, the - minibuffer is exited with that argument as the value. +- a function, which will be called with a single argument, the + input unquoted by `substitute-in-file-name', which see. If the + function returns a non-nil value, the minibuffer is exited with + that argument as the value. - anything else behaves like t except that typing RET does not exit if it does non-null completion. @@ -3353,7 +3354,13 @@ See `read-file-name' for the meaning of the arguments." (let ((ignore-case read-file-name-completion-ignore-case) (minibuffer-completing-file-name t) (pred (or predicate 'file-exists-p)) - (add-to-history nil)) + (add-to-history nil) + (require-match (if (functionp mustmatch) + (lambda (input) + (funcall mustmatch + ;; User-supplied MUSTMATCH expects an unquoted filename + (substitute-in-file-name input))) + mustmatch))) (let* ((val (if (or (not (next-read-file-uses-dialog-p)) @@ -3389,7 +3396,7 @@ See `read-file-name' for the meaning of the arguments." (read-file-name--defaults dir initial)))) (set-syntax-table minibuffer-local-filename-syntax)) (completing-read prompt 'read-file-name-internal - pred mustmatch insdef + pred require-match insdef 'file-name-history default-filename))) ;; If DEFAULT-FILENAME not supplied and DIR contains ;; a file name, split it. From a45e1237b290a9c04b416703825b105321139608 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 7 Feb 2024 09:24:32 +0800 Subject: [PATCH 057/446] ; Fix typo in configure.ac * configure.ac: Fix typo. Reported by Juri Linkov . --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 901980c4d8e..b74eba879ab 100644 --- a/configure.ac +++ b/configure.ac @@ -1231,7 +1231,7 @@ package will likely install on older systems but crash on startup.]) passthrough="$passthrough --with-mailutils=$with_mailutils" passthrough="$passthrough --with-pop=$with_pop" passthrough="$passthrough --with-harfbuzz=$with_harfbuzz" - passthrough="$passthrough --with-threads=$with_png" + passthrough="$passthrough --with-threads=$with_threads" # Now pass through some checking options. emacs_val="--enable-check-lisp-object-type=$enable_check_lisp_object_type" From c1cdbb987299f6878072fec539bd363e2c3ca015 Mon Sep 17 00:00:00 2001 From: Wilhelm Kirschbaum Date: Fri, 29 Dec 2023 17:09:00 +0200 Subject: [PATCH 058/446] Add access_call fontification to elixir-ts-mode * lisp/progmodes/elixir-ts-mode.el (elixir-ts--font-lock-settings): Add access_call queries to the elixir-variable feature (bug#67246). --- lisp/progmodes/elixir-ts-mode.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index b493195eedd..2c7323c318d 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -546,7 +546,9 @@ (body (identifier) @font-lock-variable-name-face) (unary_operator operand: (identifier) @font-lock-variable-name-face) (interpolation (identifier) @font-lock-variable-name-face) - (do_block (identifier) @font-lock-variable-name-face)) + (do_block (identifier) @font-lock-variable-name-face) + (access_call target: (identifier) @font-lock-variable-name-face) + (access_call "[" key: (identifier) @font-lock-variable-name-face "]")) :language 'elixir :feature 'elixir-builtin From eb90fb52b08a16ae2bdc8bad6929492b9e693f72 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Wed, 7 Feb 2024 03:54:29 +0200 Subject: [PATCH 059/446] elixir-ts-mode: Bring the faces' use closer to other ts modes * lisp/progmodes/elixir-ts-mode.el (elixir-ts--font-lock-settings): Rename feature 'elixir-function-name' to 'elixir-definition' and update all deferences. Add parameters' highlighting with font-lock-variable-name-face. Change variable references' highlighting to use font-lock-variable-use-face. Move the feature 'elixir-variable' from feature level 3 to level 4, to match other ts modes (bug#67246). --- lisp/progmodes/elixir-ts-mode.el | 53 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index 2c7323c318d..57db211e881 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -360,13 +360,14 @@ (defvar elixir-ts--font-lock-settings (treesit-font-lock-rules :language 'elixir - :feature 'elixir-function-name + :feature 'elixir-definition `((call target: (identifier) @target-identifier (arguments (identifier) @font-lock-function-name-face) (:match ,elixir-ts--definition-keywords-re @target-identifier)) (call target: (identifier) @target-identifier (arguments - (call target: (identifier) @font-lock-function-name-face)) + (call target: (identifier) @font-lock-function-name-face + (arguments ((identifier)) @font-lock-variable-name-face))) (:match ,elixir-ts--definition-keywords-re @target-identifier)) (call target: (identifier) @target-identifier (arguments @@ -379,13 +380,15 @@ (:match ,elixir-ts--definition-keywords-re @target-identifier)) (call target: (identifier) @target-identifier (arguments - (call target: (identifier) @font-lock-function-name-face)) + (call target: (identifier) @font-lock-function-name-face + (arguments ((identifier)) @font-lock-variable-name-face))) (do_block) (:match ,elixir-ts--definition-keywords-re @target-identifier)) (call target: (identifier) @target-identifier (arguments (binary_operator - left: (call target: (identifier) @font-lock-function-name-face))) + left: (call target: (identifier) @font-lock-function-name-face + (arguments ((identifier)) @font-lock-variable-name-face)))) (do_block) (:match ,elixir-ts--definition-keywords-re @target-identifier)) (unary_operator @@ -521,8 +524,8 @@ operator: "/" right: (integer))) (call target: (dot right: (identifier) @font-lock-function-call-face)) - (unary_operator operator: "&" @font-lock-variable-name-face - operand: (integer) @font-lock-variable-name-face) + (unary_operator operator: "&" @font-lock-variable-use-face + operand: (integer) @font-lock-variable-use-face) (unary_operator operator: "&" @font-lock-operator-face operand: (list))) @@ -537,18 +540,18 @@ :language 'elixir :feature 'elixir-variable - '((binary_operator left: (identifier) @font-lock-variable-name-face) - (binary_operator right: (identifier) @font-lock-variable-name-face) - (arguments ( (identifier) @font-lock-variable-name-face)) - (tuple (identifier) @font-lock-variable-name-face) - (list (identifier) @font-lock-variable-name-face) - (pair value: (identifier) @font-lock-variable-name-face) - (body (identifier) @font-lock-variable-name-face) - (unary_operator operand: (identifier) @font-lock-variable-name-face) - (interpolation (identifier) @font-lock-variable-name-face) - (do_block (identifier) @font-lock-variable-name-face) - (access_call target: (identifier) @font-lock-variable-name-face) - (access_call "[" key: (identifier) @font-lock-variable-name-face "]")) + '((binary_operator left: (identifier) @font-lock-variable-use-face) + (binary_operator right: (identifier) @font-lock-variable-use-face) + (arguments ( (identifier) @font-lock-variable-use-face)) + (tuple (identifier) @font-lock-variable-use-face) + (list (identifier) @font-lock-variable-use-face) + (pair value: (identifier) @font-lock-variable-use-face) + (body (identifier) @font-lock-variable-use-face) + (unary_operator operand: (identifier) @font-lock-variable-use-face) + (interpolation (identifier) @font-lock-variable-use-face) + (do_block (identifier) @font-lock-variable-use-face) + (access_call target: (identifier) @font-lock-variable-use-face) + (access_call "[" key: (identifier) @font-lock-variable-use-face "]")) :language 'elixir :feature 'elixir-builtin @@ -699,11 +702,10 @@ Return nil if NODE is not a defun node or doesn't have a name." ;; Font-lock. (setq-local treesit-font-lock-settings elixir-ts--font-lock-settings) (setq-local treesit-font-lock-feature-list - '(( elixir-comment elixir-doc elixir-function-name) + '(( elixir-comment elixir-doc elixir-definition) ( elixir-string elixir-keyword elixir-data-type) - ( elixir-sigil elixir-variable elixir-builtin - elixir-string-escape) - ( elixir-function-call elixir-operator elixir-number ))) + ( elixir-sigil elixir-builtin elixir-string-escape) + ( elixir-function-call elixir-variable elixir-operator elixir-number ))) ;; Imenu. @@ -736,13 +738,12 @@ Return nil if NODE is not a defun node or doesn't have a name." heex-ts--indent-rules)) (setq-local treesit-font-lock-feature-list - '(( elixir-comment elixir-doc elixir-function-name + '(( elixir-comment elixir-doc elixir-definition heex-comment heex-keyword heex-doctype ) ( elixir-string elixir-keyword elixir-data-type heex-component heex-tag heex-attribute heex-string ) - ( elixir-sigil elixir-variable elixir-builtin - elixir-string-escape) - ( elixir-function-call elixir-operator elixir-number )))) + ( elixir-sigil elixir-builtin elixir-string-escape) + ( elixir-function-call elixir-variable elixir-operator elixir-number )))) (treesit-major-mode-setup) (setq-local syntax-propertize-function #'elixir-ts--syntax-propertize))) From 8a39216ce920d82b86a40471429e30d75c6ee42d Mon Sep 17 00:00:00 2001 From: Wilhelm Kirschbaum Date: Wed, 7 Feb 2024 04:18:30 +0200 Subject: [PATCH 060/446] elixir-ts-mode: Highlight more method definitions * lisp/progmodes/elixir-ts-mode.el (elixir-ts--font-lock-settings): Also highlight method definitions where the arguments are literal values, not identifiers (bug#67246). --- lisp/progmodes/elixir-ts-mode.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index 57db211e881..f26c3a49203 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -362,6 +362,11 @@ :language 'elixir :feature 'elixir-definition `((call target: (identifier) @target-identifier + (arguments + (call target: (identifier) @font-lock-function-name-face + (arguments))) + (:match ,elixir-ts--definition-keywords-re @target-identifier)) + (call target: (identifier) @target-identifier (arguments (identifier) @font-lock-function-name-face) (:match ,elixir-ts--definition-keywords-re @target-identifier)) (call target: (identifier) @target-identifier From 9ccaa09a63548770ca8902758985aeb2c609f5ad Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 7 Feb 2024 10:48:27 +0800 Subject: [PATCH 061/446] ; .dir-locals.el (log-edit-mode) : Set to 64. --- .dir-locals.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dir-locals.el b/.dir-locals.el index 1f08c882e0b..89fb76a55f3 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -32,7 +32,8 @@ (mode . bug-reference-prog))) (log-edit-mode . ((log-edit-font-lock-gnu-style . t) (log-edit-setup-add-author . t) - (vc-git-log-edit-summary-target-len . 50))) + (vc-git-log-edit-summary-target-len . 50) + (fill-column . 64))) (change-log-mode . ((add-log-time-zone-rule . t) (fill-column . 74) (mode . bug-reference))) From ccae58a425674c36cb6f17bcebc4416d34f23a37 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 7 Feb 2024 13:19:27 +0100 Subject: [PATCH 062/446] Declare function properties in Tramp * lisp/net/tramp-message.el (tramp-backtrace, tramp-error) (tramp-error-with-buffer, tramp-user-error): Declare `tramp-suppress-trace' property. --- lisp/net/tramp-message.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/net/tramp-message.el b/lisp/net/tramp-message.el index 96071e626a5..97e94a51e7a 100644 --- a/lisp/net/tramp-message.el +++ b/lisp/net/tramp-message.el @@ -353,6 +353,7 @@ applicable)." If VEC-OR-PROC is nil, the buffer *debug tramp* is used. FORCE forces the backtrace even if `tramp-verbose' is less than 10. This function is meant for debugging purposes." + (declare (tramp-suppress-trace t)) (let ((tramp-verbose (if force 10 tramp-verbose))) (when (>= tramp-verbose 10) (tramp-message @@ -364,6 +365,7 @@ VEC-OR-PROC identifies the connection to use, SIGNAL is the signal identifier to be raised, remaining arguments passed to `tramp-message'. Finally, signal SIGNAL is raised with FMT-STRING and ARGUMENTS." + (declare (tramp-suppress-trace t)) (let (signal-hook-function) (tramp-backtrace vec-or-proc) (unless arguments @@ -391,6 +393,7 @@ tramp-tests.el.") "Emit an error, and show BUF. If BUF is nil, show the connection buf. Wait for 30\", or until an input event arrives. The other arguments are passed to `tramp-error'." + (declare (tramp-suppress-trace t)) (save-window-excursion (let* ((buf (or (and (bufferp buf) buf) (and (processp vec-or-proc) (process-buffer vec-or-proc)) @@ -424,6 +427,7 @@ an input event arrives. The other arguments are passed to `tramp-error'." (defsubst tramp-user-error (vec-or-proc fmt-string &rest arguments) "Signal a user error (or \"pilot error\")." + (declare (tramp-suppress-trace t)) (unwind-protect (apply #'tramp-error vec-or-proc 'user-error fmt-string arguments) ;; Save exit. From e5cb268b2cf612492dfaf39d28f43357710003a6 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 7 Feb 2024 21:09:18 +0800 Subject: [PATCH 063/446] Fix DEBUG_THREADS in the Android port * java/org/gnu/emacs/EmacsService.java (EmacsService): New field `mainThread'. (onCreate): Set `mainThread' to the thread where the service's looper executes. (checkEmacsThread): Compare against SERVICE.mainThread. --- java/org/gnu/emacs/EmacsService.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index 93e34e6e694..b65b10b9528 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -136,6 +136,10 @@ public final class EmacsService extends Service been created yet. */ private EmacsSafThread storageThread; + /* The Thread object representing the Android user interface + thread. */ + private Thread mainThread; + static { servicingQuery = new AtomicInteger (); @@ -236,6 +240,7 @@ public final class EmacsService extends Service / metrics.density) * pixelDensityX); resolver = getContentResolver (); + mainThread = Thread.currentThread (); /* If the density used to compute the text size is lesser than 160, there's likely a bug with display density computation. @@ -384,7 +389,13 @@ invocation of app_process (through android-emacs) can { if (DEBUG_THREADS) { - if (Thread.currentThread () instanceof EmacsThread) + /* When SERVICE is NULL, Emacs is being executed non-interactively. */ + if (SERVICE == null + /* It was previously assumed that only instances of + `EmacsThread' were valid for graphics calls, but this is + no longer true now that Lisp threads can be attached to + the JVM. */ + || (Thread.currentThread () != SERVICE.mainThread)) return; throw new RuntimeException ("Emacs thread function" From d03f3a827d80e2a0962128216223bab21998cf0a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 7 Feb 2024 15:33:51 +0200 Subject: [PATCH 064/446] Don't compile lib/copy-file-range.c on MS-Windows * nt/gnulib-cfg.mk (OMIT_GNULIB_MODULE_copy-file-range): Set to true to avoid compiling copy-file-range.c on MS-Windows. The function 'copy_file_range' is not used on MS-Windows, while compiling the file triggers warnings because lib/unistd.h, where its prototype is declared, is omitted in the MS-Windows build. --- nt/gnulib-cfg.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/nt/gnulib-cfg.mk b/nt/gnulib-cfg.mk index 5b1c2c88ba5..048f812724a 100644 --- a/nt/gnulib-cfg.mk +++ b/nt/gnulib-cfg.mk @@ -46,6 +46,7 @@ OMIT_GNULIB_MODULE_allocator = true OMIT_GNULIB_MODULE_at-internal = true OMIT_GNULIB_MODULE_canonicalize-lgpl = true OMIT_GNULIB_MODULE_careadlinkat = true +OMIT_GNULIB_MODULE_copy-file-range = true OMIT_GNULIB_MODULE_dirent = true OMIT_GNULIB_MODULE_dirfd = true OMIT_GNULIB_MODULE_fchmodat = true From ef3fed1a4898c3e3d6012ba01006d827a4aba0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Wed, 7 Feb 2024 14:35:44 +0100 Subject: [PATCH 065/446] ; Fix last changes in buffer-menu.el and NEWS * etc/NEWS: Remove superfluous mention of key binding. * lisp/buff-menu.el (Buffer-menu--selection-message): Go back to previous wording. It's not about what is hidden but what is shown; the message is displayed in response to different actions. --- etc/NEWS | 2 +- lisp/buff-menu.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index ee7462cb2aa..960ad2b95ac 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1304,7 +1304,7 @@ This allows for rcirc logs to use a custom timestamp format, than the chat buffers use by default. --- -*** New command 'Buffer-menu-toggle-internal', locally bound to 'I'. +*** New command 'Buffer-menu-toggle-internal'. This command toggles the display of internal buffers in Buffer Menu mode; that is, buffers not visiting a file and whose names start with a space. Previously, such buffers were never shown. This command is bound to 'I' diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 29ca3b41f0c..be62fc51e4c 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -329,7 +329,7 @@ ARG, show only buffers that are visiting files." (defun Buffer-menu--selection-message () (message (cond (Buffer-menu-files-only "Showing only file-visiting buffers.") (Buffer-menu-show-internal "Showing all buffers.") - (t "Hiding internal buffers.")))) + (t "Showing all non-internal buffers.")))) (defun Buffer-menu-toggle-files-only (arg) "Toggle whether the current `buffer-menu' displays only file buffers. From b068725d40dd1ab918178b3cbca7b5672037210f Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 Feb 2024 11:11:38 -0500 Subject: [PATCH 066/446] Use slot names rather than their :initargs * test/lisp/emacs-lisp/eieio-tests/eieio-tests.el (eieio-test-39-clone-instance-inheritor-with-args): * test/lisp/auth-source-tests.el (auth-source-ensure-ignored-backend) (auth-source-backend-parse-macos-keychain) (auth-source-backend-parse-macos-keychain-generic-string) (auth-source-backend-parse-macos-keychain-internet-string) (auth-source-backend-parse-macos-keychain-internet-symbol) (auth-source-backend-parse-macos-keychain-generic-symbol) (auth-source-backend-parse-macos-keychain-internet-default-string) (auth-source-backend-parse-plstore, auth-source-backend-parse-netrc) (auth-source-backend-parse-netrc-string) (auth-source-backend-parse-secrets) (auth-source-backend-parse-secrets-strings) (auth-source-backend-parse-secrets-alias) (auth-source-backend-parse-secrets-symbol) (auth-source-backend-parse-secrets-no-alias): Use slot names rather than their :initargs. --- test/lisp/auth-source-tests.el | 139 ++++++++++-------- .../emacs-lisp/eieio-tests/eieio-tests.el | 28 ++-- 2 files changed, 95 insertions(+), 72 deletions(-) diff --git a/test/lisp/auth-source-tests.el b/test/lisp/auth-source-tests.el index 0a3c1cce590..c091a7dd060 100644 --- a/test/lisp/auth-source-tests.el +++ b/test/lisp/auth-source-tests.el @@ -33,8 +33,8 @@ (require 'secrets) (defun auth-source-ensure-ignored-backend (source) - (auth-source-validate-backend source '((:source . "") - (:type . ignore)))) + (auth-source-validate-backend source '((source . "") + (type . ignore)))) (defun auth-source-validate-backend (source validation-alist) (let ((backend (auth-source-backend-parse source))) @@ -44,84 +44,101 @@ (ert-deftest auth-source-backend-parse-macos-keychain () (auth-source-validate-backend '(:source (:macos-keychain-generic foobar)) - '((:source . "foobar") - (:type . macos-keychain-generic) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "foobar") + (type . macos-keychain-generic) + (search-function . auth-source-macos-keychain-search) + (create-function . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-macos-keychain-generic-string () (auth-source-validate-backend "macos-keychain-generic:foobar" - '((:source . "foobar") - (:type . macos-keychain-generic) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "foobar") + (type . macos-keychain-generic) + (search-function + . auth-source-macos-keychain-search) + (create-function + . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-macos-keychain-internet-string () (auth-source-validate-backend "macos-keychain-internet:foobar" - '((:source . "foobar") - (:type . macos-keychain-internet) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "foobar") + (type . macos-keychain-internet) + (search-function + . auth-source-macos-keychain-search) + (create-function + . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-macos-keychain-internet-symbol () (auth-source-validate-backend 'macos-keychain-internet - '((:source . "default") - (:type . macos-keychain-internet) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "default") + (type . macos-keychain-internet) + (search-function + . auth-source-macos-keychain-search) + (create-function + . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-macos-keychain-generic-symbol () (auth-source-validate-backend 'macos-keychain-generic - '((:source . "default") - (:type . macos-keychain-generic) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "default") + (type . macos-keychain-generic) + (search-function + . auth-source-macos-keychain-search) + (create-function + . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-macos-keychain-internet-default-string () (auth-source-validate-backend 'macos-keychain-internet - '((:source . "default") - (:type . macos-keychain-internet) - (:search-function . auth-source-macos-keychain-search) - (:create-function . auth-source-macos-keychain-create)))) + '((source . "default") + (type . macos-keychain-internet) + (search-function + . auth-source-macos-keychain-search) + (create-function + . auth-source-macos-keychain-create)))) (ert-deftest auth-source-backend-parse-plstore () (auth-source-validate-backend '(:source "foo.plist") - '((:source . "foo.plist") - (:type . plstore) - (:search-function . auth-source-plstore-search) - (:create-function . auth-source-plstore-create)))) + '((source . "foo.plist") + (type . plstore) + (search-function . auth-source-plstore-search) + (create-function + . auth-source-plstore-create)))) (ert-deftest auth-source-backend-parse-netrc () (auth-source-validate-backend '(:source "foo") - '((:source . "foo") - (:type . netrc) - (:search-function . auth-source-netrc-search) - (:create-function . auth-source-netrc-create)))) + '((source . "foo") + (type . netrc) + (search-function . auth-source-netrc-search) + (create-function + . auth-source-netrc-create)))) (ert-deftest auth-source-backend-parse-netrc-string () (auth-source-validate-backend "foo" - '((:source . "foo") - (:type . netrc) - (:search-function . auth-source-netrc-search) - (:create-function . auth-source-netrc-create)))) + '((source . "foo") + (type . netrc) + (search-function . auth-source-netrc-search) + (create-function + . auth-source-netrc-create)))) (ert-deftest auth-source-backend-parse-secrets () (provide 'secrets) ; simulates the presence of the `secrets' package (let ((secrets-enabled t)) (auth-source-validate-backend '(:source (:secrets "foo")) - '((:source . "foo") - (:type . secrets) - (:search-function . auth-source-secrets-search) - (:create-function . auth-source-secrets-create))))) + '((source . "foo") + (type . secrets) + (search-function + . auth-source-secrets-search) + (create-function + . auth-source-secrets-create))))) (ert-deftest auth-source-backend-parse-secrets-strings () (provide 'secrets) ; simulates the presence of the `secrets' package (let ((secrets-enabled t)) (auth-source-validate-backend "secrets:foo" - '((:source . "foo") - (:type . secrets) - (:search-function . auth-source-secrets-search) - (:create-function . auth-source-secrets-create))))) + '((source . "foo") + (type . secrets) + (search-function + . auth-source-secrets-search) + (create-function + . auth-source-secrets-create))))) (ert-deftest auth-source-backend-parse-secrets-alias () (provide 'secrets) ; simulates the presence of the `secrets' package @@ -129,10 +146,12 @@ ;; Redefine `secrets-get-alias' to map 'foo to "foo" (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) "foo"))) (auth-source-validate-backend '(:source (:secrets foo)) - '((:source . "foo") - (:type . secrets) - (:search-function . auth-source-secrets-search) - (:create-function . auth-source-secrets-create)))))) + '((source . "foo") + (type . secrets) + (search-function + . auth-source-secrets-search) + (create-function + . auth-source-secrets-create)))))) (ert-deftest auth-source-backend-parse-secrets-symbol () (provide 'secrets) ; simulates the presence of the `secrets' package @@ -140,10 +159,12 @@ ;; Redefine `secrets-get-alias' to map 'default to "foo" (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) "foo"))) (auth-source-validate-backend 'default - '((:source . "foo") - (:type . secrets) - (:search-function . auth-source-secrets-search) - (:create-function . auth-source-secrets-create)))))) + '((source . "foo") + (type . secrets) + (search-function + . auth-source-secrets-search) + (create-function + . auth-source-secrets-create)))))) (ert-deftest auth-source-backend-parse-secrets-no-alias () (provide 'secrets) ; simulates the presence of the `secrets' package @@ -152,10 +173,12 @@ ;; "Login" is used by default (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) nil))) (auth-source-validate-backend '(:source (:secrets foo)) - '((:source . "Login") - (:type . secrets) - (:search-function . auth-source-secrets-search) - (:create-function . auth-source-secrets-create)))))) + '((source . "Login") + (type . secrets) + (search-function + . auth-source-secrets-search) + (create-function + . auth-source-secrets-create)))))) (ert-deftest auth-source-backend-parse-invalid-or-nil-source () (provide 'secrets) ; simulates the presence of the `secrets' package diff --git a/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el b/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el index 83fc476c911..bc226757ff2 100644 --- a/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el +++ b/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el @@ -1011,24 +1011,24 @@ Subclasses to override slot attributes.")) (B (clone A :b "bb")) (C (clone B :a "aa"))) - (should (string= "aa" (oref C :a))) - (should (string= "bb" (oref C :b))) + (should (string= "aa" (oref C a))) + (should (string= "bb" (oref C b))) - (should (slot-boundp A :a)) - (should-not (slot-boundp A :b)) - (should-not (slot-boundp A :c)) + (should (slot-boundp A 'a)) + (should-not (slot-boundp A 'b)) + (should-not (slot-boundp A 'c)) - (should-not (slot-boundp B :a)) - (should (slot-boundp B :b)) - (should-not (slot-boundp A :c)) + (should-not (slot-boundp B 'a)) + (should (slot-boundp B 'b)) + (should-not (slot-boundp A 'c)) - (should (slot-boundp C :a)) - (should-not (slot-boundp C :b)) - (should-not (slot-boundp C :c)) + (should (slot-boundp C 'a)) + (should-not (slot-boundp C 'b)) + (should-not (slot-boundp C 'c)) - (should (eieio-instance-inheritor-slot-boundp C :a)) - (should (eieio-instance-inheritor-slot-boundp C :b)) - (should-not (eieio-instance-inheritor-slot-boundp C :c)))) + (should (eieio-instance-inheritor-slot-boundp C 'a)) + (should (eieio-instance-inheritor-slot-boundp C 'b)) + (should-not (eieio-instance-inheritor-slot-boundp C 'c)))) ;;;; Interaction with defstruct From cc5d4f15f96f97b6c4eb8b58144d0a0f217d393a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 Feb 2024 11:13:56 -0500 Subject: [PATCH 067/446] Use `defvar` for variables that are not constant * test/lisp/international/mule-tests.el (sgml-html-meta-pre) (sgml-html-meta-post): * test/lisp/net/tramp-archive-tests.el (tramp-archive-test-file-archive) (tramp-archive-test-archive): * test/lisp/emacs-lisp/macroexp-resources/vk.el (vk-b): Don't use `defconst` if it's not constant. --- test/lisp/emacs-lisp/macroexp-resources/vk.el | 2 +- test/lisp/international/mule-tests.el | 4 ++-- test/lisp/net/tramp-archive-tests.el | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/lisp/emacs-lisp/macroexp-resources/vk.el b/test/lisp/emacs-lisp/macroexp-resources/vk.el index 460b7a8e516..5358bcaeb5c 100644 --- a/test/lisp/emacs-lisp/macroexp-resources/vk.el +++ b/test/lisp/emacs-lisp/macroexp-resources/vk.el @@ -25,7 +25,7 @@ (if (macroexp--dynamic-variable-p var) ''dyn ''lex)) (defvar vk-a 1) -(defconst vk-b 2) +(defvar vk-b 2) (defvar vk-c) (defun vk-f1 (x) diff --git a/test/lisp/international/mule-tests.el b/test/lisp/international/mule-tests.el index 5c742451a57..9a80ced55ae 100644 --- a/test/lisp/international/mule-tests.el +++ b/test/lisp/international/mule-tests.el @@ -96,10 +96,10 @@ ;;; Testing `sgml-html-meta-auto-coding-function'. -(defconst sgml-html-meta-pre "" +(defvar sgml-html-meta-pre "" "The beginning of a minimal HTML document.") -(defconst sgml-html-meta-post "" +(defvar sgml-html-meta-post "" "The end of a minimal HTML document.") (defun sgml-html-meta-run (coding-system) diff --git a/test/lisp/net/tramp-archive-tests.el b/test/lisp/net/tramp-archive-tests.el index 978342b1bb1..1ca2fa9b9b3 100644 --- a/test/lisp/net/tramp-archive-tests.el +++ b/test/lisp/net/tramp-archive-tests.el @@ -77,7 +77,7 @@ A resource file is in the resource directory as per `ert-resource-directory'." `(expand-file-name ,file (ert-resource-directory))))) -(defconst tramp-archive-test-file-archive (ert-resource-file "foo.tar.gz") +(defvar tramp-archive-test-file-archive (ert-resource-file "foo.tar.gz") "The test file archive.") (defun tramp-archive-test-file-archive-hexlified () @@ -86,7 +86,7 @@ Do not hexlify \"/\". This hexlified string is used in `file:///' URLs." (let* ((url-unreserved-chars (cons ?/ url-unreserved-chars))) (url-hexify-string tramp-archive-test-file-archive))) -(defconst tramp-archive-test-archive +(defvar tramp-archive-test-archive (file-name-as-directory tramp-archive-test-file-archive) "The test archive.") From 2f3c435056dac17242b2d147bc73df8742c3e374 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 Feb 2024 11:15:59 -0500 Subject: [PATCH 068/446] * test/lisp/minibuffer-tests.el (completion-test--pcm-bug38458): New test --- test/lisp/minibuffer-tests.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el index 07c4dbc3197..c4a7de9e51f 100644 --- a/test/lisp/minibuffer-tests.el +++ b/test/lisp/minibuffer-tests.el @@ -201,6 +201,13 @@ 'completions-first-difference) return pos)) +(ert-deftest completion-test--pcm-bug38458 () + (should (equal (let ((completion-ignore-case t)) + (completion-pcm--merge-try '("tes" point "ing") + '("Testing" "testing") + "" "")) + '("testing" . 4)))) + (ert-deftest completion-pcm-test-1 () ;; Point is at end, this does not match anything (should (null From 12fb298e21d877c772a19fc8f2fec68a40bcda14 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 Feb 2024 11:17:35 -0500 Subject: [PATCH 069/446] Prefer \` and \' when matching the beg/end of string * test/lisp/net/tramp-tests.el (tramp--test-instrument-test-case) (tramp-test01-file-name-syntax): Use more precise regexp --- test/lisp/net/tramp-tests.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 489b682d0c3..4a964f0daf0 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -265,8 +265,8 @@ is greater than 10. `(let* ((tramp-verbose (max (or ,verbose 0) (or tramp-verbose 0))) (debug-ignored-errors (append - '("^make-symbolic-link not supported$" - "^error with add-name-to-file") + '("\\`make-symbolic-link not supported\\'" + "\\`error with add-name-to-file") debug-ignored-errors)) inhibit-message) (unwind-protect @@ -379,7 +379,7 @@ is greater than 10. (let (tramp-mode) (should-not (tramp-tramp-file-p "/method:user@host:"))) ;; `tramp-ignored-file-name-regexp' suppresses Tramp. - (let ((tramp-ignored-file-name-regexp "^/method:user@host:")) + (let ((tramp-ignored-file-name-regexp "\\`/method:user@host:")) (should-not (tramp-tramp-file-p "/method:user@host:"))) ;; Methods shall be at least two characters, except the ;; default method. From f9ffa0148c3fb9e07671fae8f8ca72dd2d403163 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 Feb 2024 11:20:46 -0500 Subject: [PATCH 070/446] (file-notify--test-wait-event): Rename from `file-notify--test-read-event` * test/lisp/filenotify-tests.el (file-notify--test-wait-event): Rename to better reflect its purpose rather than its implementation. Also make it return nil so callers won't be tempted to use the return value. --- test/lisp/filenotify-tests.el | 53 ++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el index 11af1f75574..28f4d5fa181 100644 --- a/test/lisp/filenotify-tests.el +++ b/test/lisp/filenotify-tests.el @@ -74,8 +74,8 @@ (defvar file-notify--test-events nil) (defvar file-notify--test-monitors nil) -(defun file-notify--test-read-event () - "Read one event. +(defun file-notify--test-wait-event () + "Wait for one event. There are different timeouts for local and remote file notification libraries." (read-event nil nil @@ -87,7 +87,8 @@ There are different timeouts for local and remote file notification libraries." ;; for any monitor. ((file-notify--test-monitor) 7) ((file-remote-p temporary-file-directory) 0.1) - (t 0.01)))) + (t 0.01))) + nil) (defun file-notify--test-timeout () "Timeout to wait for arriving a bunch of events, in seconds." @@ -103,7 +104,7 @@ There are different timeouts for local and remote file notification libraries." TIMEOUT is the maximum time to wait for, in seconds." `(with-timeout (,timeout (ignore)) (while (null ,until) - (file-notify--test-read-event)))) + (file-notify--test-wait-event)))) (defun file-notify--test-no-descriptors () "Check that `file-notify-descriptors' is an empty hash table. @@ -452,7 +453,7 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'." ;; Check, that removing watch descriptors out of order do not ;; harm. This fails on cygwin because of timing issues unless a ;; long `sit-for' is added before the call to - ;; `file-notify--test-read-event'. + ;; `file-notify--test-wait-event'. (unless (eq system-type 'cygwin) (let (results) (cl-flet ((first-callback (event) @@ -480,7 +481,7 @@ If UNSTABLE is non-nil, the test is tagged as `:unstable'." ;; Remove first watch. (file-notify-rm-watch file-notify--test-desc) ;; Only the second callback shall run. - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file-notify--test-tmpfile) (file-notify--test-wait-for-events (file-notify--test-timeout) results) @@ -622,7 +623,7 @@ delivered." (cons 'file-notify while-no-input-ignore-events)) create-lockfiles) ;; Flush pending actions. - (file-notify--test-read-event) + (file-notify--test-wait-event) (file-notify--test-wait-for-events (file-notify--test-timeout) (not (input-pending-p))) @@ -671,7 +672,7 @@ delivered." (t '(created changed deleted stopped))) (write-region "another text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file-notify--test-tmpfile)) (file-notify-rm-watch file-notify--test-desc) @@ -707,7 +708,7 @@ delivered." (changed changed deleted stopped)))) (write-region "another text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file-notify--test-tmpfile)) (file-notify-rm-watch file-notify--test-desc) @@ -755,7 +756,7 @@ delivered." (t '(created changed deleted deleted stopped))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-directory file-notify--test-tmpdir 'recursive)) (file-notify-rm-watch file-notify--test-desc) @@ -805,14 +806,14 @@ delivered." deleted deleted deleted stopped))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (copy-file file-notify--test-tmpfile file-notify--test-tmpfile1) ;; The next two events shall not be visible. - (file-notify--test-read-event) + (file-notify--test-wait-event) (set-file-modes file-notify--test-tmpfile 000 'nofollow) - (file-notify--test-read-event) + (file-notify--test-wait-event) (set-file-times file-notify--test-tmpfile '(0 0) 'nofollow) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-directory file-notify--test-tmpdir 'recursive)) (file-notify-rm-watch file-notify--test-desc) @@ -860,10 +861,10 @@ delivered." (t '(created changed renamed deleted deleted stopped))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (rename-file file-notify--test-tmpfile file-notify--test-tmpfile1) ;; After the rename, we won't get events anymore. - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-directory file-notify--test-tmpdir 'recursive)) (file-notify-rm-watch file-notify--test-desc) @@ -912,11 +913,11 @@ delivered." (t '(attribute-changed attribute-changed))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (set-file-modes file-notify--test-tmpfile 000 'nofollow) - (file-notify--test-read-event) + (file-notify--test-wait-event) (set-file-times file-notify--test-tmpfile '(0 0) 'nofollow) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file-notify--test-tmpfile)) (file-notify-rm-watch file-notify--test-desc) @@ -1087,7 +1088,7 @@ delivered." (changed changed deleted stopped)))) (write-region "another text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file-notify--test-tmpfile)) ;; After deleting the file, the descriptor is not valid anymore. (should-not (file-notify-valid-p file-notify--test-desc)) @@ -1134,7 +1135,7 @@ delivered." (t '(created changed deleted deleted stopped))) (write-region "any text" nil file-notify--test-tmpfile nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-directory file-notify--test-tmpdir 'recursive)) ;; After deleting the parent directory, the descriptor must ;; not be valid anymore. @@ -1247,9 +1248,9 @@ delivered." (let ((source-file-list source-file-list) (target-file-list target-file-list)) (while (and source-file-list target-file-list) - (file-notify--test-read-event) + (file-notify--test-wait-event) (write-region "" nil (pop source-file-list) nil 'no-message) - (file-notify--test-read-event) + (file-notify--test-wait-event) (write-region "" nil (pop target-file-list) nil 'no-message)))) (file-notify--test-with-actions (cond @@ -1272,11 +1273,11 @@ delivered." (let ((source-file-list source-file-list) (target-file-list target-file-list)) (while (and source-file-list target-file-list) - (file-notify--test-read-event) + (file-notify--test-wait-event) (rename-file (pop source-file-list) (pop target-file-list) t)))) (file-notify--test-with-actions (make-list n 'deleted) (dolist (file target-file-list) - (file-notify--test-read-event) + (file-notify--test-wait-event) (delete-file file))) (delete-directory file-notify--test-tmpfile) (if (or (string-equal (file-notify--test-library) "w32notify") @@ -1464,7 +1465,7 @@ the file watch." ;; does not report the `changed' event. (make-list (/ n 2) 'created))) (dotimes (i n) - (file-notify--test-read-event) + (file-notify--test-wait-event) (if (zerop (mod i 2)) (write-region "any text" nil file-notify--test-tmpfile1 t 'no-message) From 2ecaa60f0521446c9d2c054a3493faaf46275223 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 7 Feb 2024 19:14:20 +0200 Subject: [PATCH 071/446] Improve wording of message in buff-menu.el * lisp/buff-menu.el (Buffer-menu--selection-message): Improve wording of selection messages. --- lisp/buff-menu.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index be62fc51e4c..10ea99eae9a 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -329,7 +329,7 @@ ARG, show only buffers that are visiting files." (defun Buffer-menu--selection-message () (message (cond (Buffer-menu-files-only "Showing only file-visiting buffers.") (Buffer-menu-show-internal "Showing all buffers.") - (t "Showing all non-internal buffers.")))) + (t "Showing all buffers except internal ones.")))) (defun Buffer-menu-toggle-files-only (arg) "Toggle whether the current `buffer-menu' displays only file buffers. From f444786e58737a4ae6071957dfc60075bbd96edc Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Wed, 7 Feb 2024 21:50:37 +0200 Subject: [PATCH 072/446] Mention 'C-h' in echo for unfinished commands * etc/NEWS: Mention it here. * lisp/cus-start.el (standard): Add type and version for it. * src/keyboard.c (echo-keystrokes-help): New user option (https://lists.gnu.org/archive/html/emacs-devel/2024-02/msg00174.html). * src/keyboard.c (echo_dash): Use it. --- etc/NEWS | 3 +++ lisp/cus-start.el | 1 + src/keyboard.c | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 960ad2b95ac..f454b6d851c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -307,6 +307,9 @@ between the auto save file and the current file. ** 'ffap-lax-url' now defaults to nil. Previously, it was set to t but this broke remote file name detection. +** Unfinished commands' echo now ends with a suggestion to use Help. +Customize 'echo-keystrokes-help' to nil to prevent that. + * Editing Changes in Emacs 30.1 diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 7e0b64e9067..3fe62c8d0da 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -371,6 +371,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of (auto-save-timeout auto-save (choice (const :tag "off" nil) (integer :format "%v"))) (echo-keystrokes minibuffer number) + (echo-keystrokes-help minibuffer boolean "30.1") (polling-period keyboard float) (double-click-time mouse (restricted-sexp :match-alternatives (integerp 'nil 't))) diff --git a/src/keyboard.c b/src/keyboard.c index 1f7253a7da1..6d3db5ab615 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -589,6 +589,15 @@ echo_dash (void) AUTO_STRING (dash, "-"); kset_echo_string (current_kboard, concat2 (KVAR (current_kboard, echo_string), dash)); + + if (echo_keystrokes_help) + { + AUTO_STRING (help, " (\\`C-h' for help)"); + kset_echo_string (current_kboard, + concat2 (KVAR (current_kboard, echo_string), + calln (Qsubstitute_command_keys, help))); + } + echo_now (); } @@ -13228,6 +13237,10 @@ The value may be integer or floating point. If the value is zero, don't echo at all. */); Vecho_keystrokes = make_fixnum (1); + DEFVAR_BOOL ("echo-keystrokes-help", echo_keystrokes_help, + doc: /* Non-nil means append small help text to the unfinished commands' echo. */); + echo_keystrokes_help = true; + DEFVAR_LISP ("polling-period", Vpolling_period, doc: /* Interval between polling for input during Lisp execution. The reason for polling is to make C-g work to stop a running program. From e34ebc0ccc6c27e7e1217baad9ca74dd7bea4c37 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 7 Feb 2024 13:17:57 -0800 Subject: [PATCH 073/446] Port better to Autoconf 2.72 * configure.ac: Set ac_cv_type_gid_t=yes to pacify Autoconf 2.72 AC_TYPE_GETGROUPS. Problem reported by Nick Bowler in: https://lists.gnu.org/r/autoconf-patches/2024-02/msg00001.html --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index b74eba879ab..847fdbd54d2 100644 --- a/configure.ac +++ b/configure.ac @@ -2337,6 +2337,7 @@ fi AC_DEFUN([AC_TYPE_SIZE_T]) # Likewise for obsolescent test for uid_t, gid_t; Emacs assumes them. AC_DEFUN([AC_TYPE_UID_T]) +ac_cv_type_gid_t=yes # AC_TYPE_GETGROUPS needs this in Autoconf 2.72. # Check for all math.h functions that Emacs uses; on some platforms, # -lm is needed for some of these functions. From 1f9781ee7816ad3ec786ca7e10b4e82d1ad989c5 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 8 Feb 2024 10:01:57 +0800 Subject: [PATCH 074/446] Fix earlier change to keyboard.c * src/keyboard.c (echo_dash): Do not pass automatic string to Lisp! (syms_of_keyboard) : Improve doc string. --- src/keyboard.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 6d3db5ab615..cd6ccbd77d0 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -592,7 +592,9 @@ echo_dash (void) if (echo_keystrokes_help) { - AUTO_STRING (help, " (\\`C-h' for help)"); + Lisp_Object help; + + help = build_string (" (\\`C-h' for help)"); kset_echo_string (current_kboard, concat2 (KVAR (current_kboard, echo_string), calln (Qsubstitute_command_keys, help))); @@ -13232,13 +13234,15 @@ Emacs also does a garbage collection if that seems to be warranted. */); XSETFASTINT (Vauto_save_timeout, 30); DEFVAR_LISP ("echo-keystrokes", Vecho_keystrokes, - doc: /* Nonzero means echo unfinished commands after this many seconds of pause. + doc: /* Nonzero means echo unfinished commands after this many seconds of pause. The value may be integer or floating point. If the value is zero, don't echo at all. */); Vecho_keystrokes = make_fixnum (1); DEFVAR_BOOL ("echo-keystrokes-help", echo_keystrokes_help, - doc: /* Non-nil means append small help text to the unfinished commands' echo. */); + doc: /* Whether to append help text to echoed commands. +When non-nil, a reference to `C-h' is printed after echoed +keystrokes. */); echo_keystrokes_help = true; DEFVAR_LISP ("polling-period", Vpolling_period, From ed2450e79b597e0306f14b542e934a90dfd9786f Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 8 Feb 2024 10:32:28 +0800 Subject: [PATCH 075/446] Prevent echo area help message from being printed repeatedly * src/keyboard.c (echo_dash): Detect echo_keystrokes_help messages and return if they be present. --- src/keyboard.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index cd6ccbd77d0..78ea1893ba1 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -580,7 +580,10 @@ echo_dash (void) idx = make_fixnum (SCHARS (KVAR (current_kboard, echo_string)) - 1); last_char = Faref (KVAR (current_kboard, echo_string), idx); - if (XFIXNUM (last_char) == '-' && XFIXNUM (prev_char) != ' ') + if ((XFIXNUM (last_char) == '-' && XFIXNUM (prev_char) != ' ') + /* Or a keystroke help message. */ + || (echo_keystrokes_help + && XFIXNUM (last_char) == ')' && XFIXNUM (prev_char) == 'p')) return; } From 1db2255c7c7fc232e371d379cb60827a9931e24d Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 8 Feb 2024 13:20:28 +0800 Subject: [PATCH 076/446] * lisp/touch-screen.el (touch-screen): Fix defgroup version. --- lisp/touch-screen.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/touch-screen.el b/lisp/touch-screen.el index a1ec4bca89f..c8de1d8ee31 100644 --- a/lisp/touch-screen.el +++ b/lisp/touch-screen.el @@ -87,7 +87,7 @@ is being called from `read-sequence' or some similar function.") (defgroup touch-screen nil "Interact with Emacs from touch screen devices." :group 'mouse - :version "30.0") + :version "30.1") (defcustom touch-screen-display-keyboard nil "If non-nil, always display the on screen keyboard. From a48cf0c94ca4a4e3fe045be6149025955e9dfa4f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 08:48:20 +0200 Subject: [PATCH 077/446] ; * src/keyboard.c (echo_dash): Mention F1 in echo_keystrokes_help. --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index 78ea1893ba1..10cdef67348 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -597,7 +597,7 @@ echo_dash (void) { Lisp_Object help; - help = build_string (" (\\`C-h' for help)"); + help = build_string (" (\\`C-h' or \\`' for help)"); kset_echo_string (current_kboard, concat2 (KVAR (current_kboard, echo_string), calln (Qsubstitute_command_keys, help))); From d6c7092ff0713087f38b9492d53be0177af67514 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 08:56:42 +0200 Subject: [PATCH 078/446] ; Improve documentation of 'echo-keystrokes-help' * doc/emacs/display.texi (Display Custom): Document 'echo-keystrokes-help'. * etc/NEWS: Mark the 'echo-keystrokes-help' entry documented. --- doc/emacs/display.texi | 7 +++++++ etc/NEWS | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi index 6db9e8344c6..d2557d6148e 100644 --- a/doc/emacs/display.texi +++ b/doc/emacs/display.texi @@ -2210,6 +2210,13 @@ keys; its value is the number of seconds of pause required to cause echoing to start, or zero, meaning don't echo at all. The value takes effect when there is something to echo. @xref{Echo Area}. +@vindex echo-keystrokes-help + If the variable @code{echo-keystrokes-help} is non-@code{nil} (the +default), the multi-character key sequence echo shown according to +@code{echo-keystrokes} will include a short help text about keys which +will invoke @code{describe-prefix-bindings} (@pxref{Misc Help}) to show +the list of commands for the prefix you already typed. + @cindex mouse pointer @cindex hourglass pointer display @vindex display-hourglass diff --git a/etc/NEWS b/etc/NEWS index f454b6d851c..4d3c652aebc 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -307,7 +307,8 @@ between the auto save file and the current file. ** 'ffap-lax-url' now defaults to nil. Previously, it was set to t but this broke remote file name detection. -** Unfinished commands' echo now ends with a suggestion to use Help. ++++ +** Multi-character key echo now ends with a suggestion to use Help. Customize 'echo-keystrokes-help' to nil to prevent that. From 08c81db7c8e522278fb2c8de8fbe556d109c135f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Thu, 8 Feb 2024 11:17:22 +0100 Subject: [PATCH 079/446] `file-remote-p' must not return an error * lisp/net/tramp-gvfs.el (tramp-gvfs-file-name-handler): `file-remote-p' must not return an error. (Bug#68976) --- lisp/net/tramp-gvfs.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index 72589e7ce4a..4e949e7e60b 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -888,7 +888,8 @@ Operations not mentioned here will be handled by the default Emacs primitives.") "Invoke the GVFS related OPERATION and ARGS. First arg specifies the OPERATION, second arg is a list of arguments to pass to the OPERATION." - (unless tramp-gvfs-enabled + ;; `file-remote-p' must not return an error. (Bug#68976) + (unless (or tramp-gvfs-enabled (eq operation 'file-remote-p)) (tramp-user-error nil "Package `tramp-gvfs' not supported")) (if-let ((filename (apply #'tramp-file-name-for-operation operation args)) (tramp-gvfs-dbus-event-vector From bc099295dd24d059d3358acf5653ced9c9292e41 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Wed, 31 Jan 2024 21:37:18 +0100 Subject: [PATCH 080/446] ; Ensure 'thing-at-point-looking-at' finds full match * lisp/thingatpt.el (thing-at-point-looking-at): Regexp-search from the beginning forward, instead of the other way around. * test/lisp/thingatpt-tests.el (thing-at-point-test-data): Add tests. (Bug#68762) --- lisp/thingatpt.el | 43 +++++++++++------------------------- test/lisp/thingatpt-tests.el | 2 ++ 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el index 323d3d1cf6c..b532bafff82 100644 --- a/lisp/thingatpt.el +++ b/lisp/thingatpt.el @@ -619,36 +619,19 @@ point. Optional argument DISTANCE limits search for REGEXP forward and back from point." - (save-excursion - (let ((old-point (point)) - (forward-bound (and distance (+ (point) distance))) - (backward-bound (and distance (- (point) distance))) - match prev-pos new-pos) - (and (looking-at regexp) - (>= (match-end 0) old-point) - (setq match (point))) - ;; Search back repeatedly from end of next match. - ;; This may fail if next match ends before this match does. - (re-search-forward regexp forward-bound 'limit) - (setq prev-pos (point)) - (while (and (setq new-pos (re-search-backward regexp backward-bound t)) - ;; Avoid inflooping with some regexps, such as "^", - ;; matching which never moves point. - (< new-pos prev-pos) - (or (> (match-beginning 0) old-point) - (and (looking-at regexp) ; Extend match-end past search start - (>= (match-end 0) old-point) - (setq match (point)))))) - (if (not match) nil - (goto-char match) - ;; Back up a char at a time in case search skipped - ;; intermediate match straddling search start pos. - (while (and (not (bobp)) - (progn (backward-char 1) (looking-at regexp)) - (>= (match-end 0) old-point) - (setq match (point)))) - (goto-char match) - (looking-at regexp))))) + (let* ((old (point)) + (beg (if distance (max (point-min) (- old distance)) (point-min))) + (end (and distance (min (point-max) (+ old distance)))) + prev match) + (save-excursion + (goto-char beg) + (while (and (setq prev (point) + match (re-search-forward regexp end t)) + (< (match-end 0) old)) + ;; Avoid inflooping when `regexp' matches the empty string. + (unless (< prev (point)) (forward-char)))) + (and match (<= (match-beginning 0) old (match-end 0))))) + ;; Email addresses (defvar thing-at-point-email-regexp diff --git a/test/lisp/thingatpt-tests.el b/test/lisp/thingatpt-tests.el index ba51f375cc6..56bc4fdc9dc 100644 --- a/test/lisp/thingatpt-tests.el +++ b/test/lisp/thingatpt-tests.el @@ -92,6 +92,8 @@ ("1@example.com" 1 email "1@example.com") ;; email addresses user portion containing dots ("foo.bar@example.com" 1 email "foo.bar@example.com") + ("foo.bar@example.com" 5 email "foo.bar@example.com") + (" fo.ba@example.com" 6 email "fo.ba@example.com") (".foobar@example.com" 1 email nil) (".foobar@example.com" 2 email "foobar@example.com") ;; email addresses domain portion containing dots and dashes From e2682316867ecb22ee1db5e3028a8150d95d1a80 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 13:51:55 +0200 Subject: [PATCH 081/446] Don't skip links to "." and ".." in Dired when marking files * lisp/dired.el (dired-mark): Skip "." and "..", but not symlinks to those two. (Bug#38729) (Bug#68814) --- lisp/dired.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lisp/dired.el b/lisp/dired.el index c33569d79a2..d9fbafb98c3 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -4110,6 +4110,11 @@ this subdir." (prefix-numeric-value arg) (lambda () (when (or (not (looking-at-p dired-re-dot)) + ;; Don't skip symlinks to ".", "..", etc. + (save-excursion + (re-search-forward + dired-permission-flags-regexp nil t) + (eq (char-after (match-beginning 1)) ?l)) (not (equal dired-marker-char dired-del-marker))) (delete-char 1) (insert dired-marker-char)))))))) From ebf4ef2022a5f0a69cdd881eb41104e7b59d698e Mon Sep 17 00:00:00 2001 From: USAMI Kenta Date: Sun, 4 Feb 2024 03:20:24 +0900 Subject: [PATCH 082/446] Fix 'browse-url-url-at-point' so that scheme does not duplicate * lisp/net/browse-url.el (browse-url-url-at-point): Prepend the default scheme only if no scheme present. (Bug#68913) --- lisp/net/browse-url.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el index 359453ca433..bc2a7db9a8b 100644 --- a/lisp/net/browse-url.el +++ b/lisp/net/browse-url.el @@ -688,8 +688,10 @@ websites are increasingly rare, but they do still exist." (defun browse-url-url-at-point () (or (thing-at-point 'url t) ;; assume that the user is pointing at something like gnu.org/gnu - (let ((f (thing-at-point 'filename t))) - (and f (concat browse-url-default-scheme "://" f))))) + (when-let ((f (thing-at-point 'filename t))) + (if (string-match-p browse-url-button-regexp f) + f + (concat browse-url-default-scheme "://" f))))) ;; Having this as a separate function called by the browser-specific ;; functions allows them to be stand-alone commands, making it easier From 0b9c7148fd681c8ad63fd0eb3895db44403e9f8c Mon Sep 17 00:00:00 2001 From: Liu Hui Date: Thu, 18 Jan 2024 12:00:00 +0800 Subject: [PATCH 083/446] Respect the delimiter of completer in Python shell completion * lisp/progmodes/python.el: (python-shell-completion-setup-code): Fix the completion code of IPython. Change the return value to JSON string and ... (python-shell-completion-get-completions): ... simplify parsing. (inferior-python-mode): Update docstring. (python-shell-readline-completer-delims): New variable indicating the word delimiters of readline completer. (python-shell-completion-native-setup): Set the completer delimiter. (python-shell-completion-native-get-completions): Convert output string to completions properly. (python-shell--get-multiline-input) (python-shell--extra-completion-context) (python-shell-completion-extra-context): New functions. (python-shell-completion-at-point): Send text beginning from the line start if the completion backend does not need word splitting. Remove the detection of import statement because it is not needed anymore. Create proper completion table based on completions returned from different backends. * test/lisp/progmodes/python-tests.el (python-tests--completion-module) (python-tests--completion-parameters) (python-tests--completion-extra-context): New helper functions. (python-shell-completion-at-point-jedi-completer) (python-shell-completion-at-point-ipython): New tests. (bug#68559) --- lisp/progmodes/python.el | 218 ++++++++++++++++++++++------ test/lisp/progmodes/python-tests.el | 92 ++++++++++++ 2 files changed, 263 insertions(+), 47 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 9d840efb9da..b1654b6a5aa 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -5,7 +5,7 @@ ;; Author: FabiĆ”n E. Gallina ;; URL: https://github.com/fgallina/python.el ;; Version: 0.28 -;; Package-Requires: ((emacs "24.4") (compat "28.1.2.1") (seq "2.23")) +;; Package-Requires: ((emacs "24.4") (compat "29.1.1.0") (seq "2.23")) ;; Maintainer: emacs-devel@gnu.org ;; Created: Jul 2010 ;; Keywords: languages @@ -128,9 +128,9 @@ ;; receiving escape sequences (with some limitations, i.e. completion ;; in blocks does not work). The code executed for the "fallback" ;; completion can be found in `python-shell-completion-setup-code' and -;; `python-shell-completion-string-code' variables. Their default -;; values enable completion for both CPython and IPython, and probably -;; any readline based shell (it's known to work with PyPy). If your +;; `python-shell-completion-get-completions'. Their default values +;; enable completion for both CPython and IPython, and probably any +;; readline based shell (it's known to work with PyPy). If your ;; Python installation lacks readline (like CPython for Windows), ;; installing pyreadline (URL `https://ipython.org/pyreadline.html') ;; should suffice. To troubleshoot why you are not getting any @@ -141,6 +141,12 @@ ;; If you see an error, then you need to either install pyreadline or ;; setup custom code that avoids that dependency. +;; By default, the "native" completion uses the built-in rlcompleter. +;; To use other readline completer (e.g. Jedi) or a custom one, you just +;; need to set it in the PYTHONSTARTUP file. You can set an +;; Emacs-specific completer by testing the environment variable +;; INSIDE_EMACS. + ;; Shell virtualenv support: The shell also contains support for ;; virtualenvs and other special environment modifications thanks to ;; `python-shell-process-environment' and `python-shell-exec-path'. @@ -3604,7 +3610,6 @@ interpreter is run. Variables `python-shell-prompt-block-regexp', `python-shell-font-lock-enable', `python-shell-completion-setup-code', -`python-shell-completion-string-code', `python-eldoc-setup-code', `python-ffap-setup-code' can customize this mode for different Python interpreters. @@ -4244,8 +4249,9 @@ def __PYTHON_EL_get_completions(text): completions = [] completer = None + import json try: - import readline + import readline, re try: import __builtin__ @@ -4256,16 +4262,29 @@ def __PYTHON_EL_get_completions(text): is_ipython = ('__IPYTHON__' in builtins or '__IPYTHON__active' in builtins) - splits = text.split() - is_module = splits and splits[0] in ('from', 'import') - if is_ipython and is_module: - from IPython.core.completerlib import module_completion - completions = module_completion(text.strip()) - elif is_ipython and '__IP' in builtins: - completions = __IP.complete(text) - elif is_ipython and 'get_ipython' in builtins: - completions = get_ipython().Completer.all_completions(text) + if is_ipython and 'get_ipython' in builtins: + def filter_c(prefix, c): + if re.match('_+(i?[0-9]+)?$', c): + return False + elif c[0] == '%' and not re.match('[%a-zA-Z]+$', prefix): + return False + return True + + import IPython + try: + if IPython.version_info[0] >= 6: + from IPython.core.completer import provisionalcompleter + with provisionalcompleter(): + completions = [ + [c.text, c.start, c.end, c.type or '?', c.signature or ''] + for c in get_ipython().Completer.completions(text, len(text)) + if filter_c(text, c.text)] + else: + part, matches = get_ipython().Completer.complete(line_buffer=text) + completions = [text + m[len(part):] for m in matches if filter_c(text, m)] + except: + pass else: # Try to reuse current completer. completer = readline.get_completer() @@ -4288,7 +4307,7 @@ def __PYTHON_EL_get_completions(text): finally: if getattr(completer, 'PYTHON_EL_WRAPPED', False): completer.print_mode = True - return completions" + return json.dumps(completions)" "Code used to setup completion in inferior Python processes." :type 'string) @@ -4329,6 +4348,10 @@ When a match is found, native completion is disabled." :version "25.1" :type 'float) +(defvar python-shell-readline-completer-delims nil + "Word delimiters used by the readline completer. +It is automatically set by Python shell.") + (defvar python-shell-completion-native-redirect-buffer " *Python completions redirect*" "Buffer to be used to redirect output of readline commands.") @@ -4467,6 +4490,10 @@ def __PYTHON_EL_native_completion_setup(): __PYTHON_EL_native_completion_setup()" process))) (when (string-match-p "python\\.el: native completion setup loaded" output) + (setq-local python-shell-readline-completer-delims + (string-trim-right + (python-shell-send-string-no-output + "import readline; print(readline.get_completer_delims())"))) (python-shell-completion-native-try)))) (defun python-shell-completion-native-turn-off (&optional msg) @@ -4534,6 +4561,8 @@ With argument MSG show activation/deactivation message." (let* ((original-filter-fn (process-filter process)) (redirect-buffer (get-buffer-create python-shell-completion-native-redirect-buffer)) + (sep (if (string= python-shell-readline-completer-delims "") + "[\n\r]+" "[ \f\t\n\r\v()]+")) (trigger "\t") (new-input (concat input trigger)) (input-length @@ -4576,28 +4605,80 @@ With argument MSG show activation/deactivation message." process python-shell-completion-native-output-timeout comint-redirect-finished-regexp) (re-search-backward "0__dummy_completion__" nil t) - (cl-remove-duplicates - (split-string - (buffer-substring-no-properties - (line-beginning-position) (point-min)) - "[ \f\t\n\r\v()]+" t) - :test #'string=)))) + (let ((str (buffer-substring-no-properties + (line-beginning-position) (point-min)))) + ;; The readline completer is allowed to return a list + ;; of (text start end type signature) as a JSON + ;; string. See the return value for IPython in + ;; `python-shell-completion-setup-code'. + (if (string= "[" (substring str 0 1)) + (condition-case nil + (python--parse-json-array str) + (t (cl-remove-duplicates (split-string str sep t) + :test #'string=))) + (cl-remove-duplicates (split-string str sep t) + :test #'string=)))))) (set-process-filter process original-filter-fn))))) (defun python-shell-completion-get-completions (process input) "Get completions of INPUT using PROCESS." (with-current-buffer (process-buffer process) - (let ((completions - (python-util-strip-string - (python-shell-send-string-no-output - (format - "%s\nprint(';'.join(__PYTHON_EL_get_completions(%s)))" + (python--parse-json-array + (python-shell-send-string-no-output + (format "%s\nprint(__PYTHON_EL_get_completions(%s))" python-shell-completion-setup-code (python-shell--encode-string input)) - process)))) - (when (> (length completions) 2) - (split-string completions - "^'\\|^\"\\|;\\|'$\\|\"$" t))))) + process)))) + +(defun python-shell--get-multiline-input () + "Return lines at a multi-line input in Python shell." + (save-excursion + (let ((p (point)) lines) + (when (progn + (beginning-of-line) + (looking-back python-shell-prompt-block-regexp (pos-bol))) + (push (buffer-substring-no-properties (point) p) lines) + (while (progn (comint-previous-prompt 1) + (looking-back python-shell-prompt-block-regexp (pos-bol))) + (push (buffer-substring-no-properties (point) (pos-eol)) lines)) + (push (buffer-substring-no-properties (point) (pos-eol)) lines)) + lines))) + +(defun python-shell--extra-completion-context () + "Get extra completion context of current input in Python shell." + (let ((lines (python-shell--get-multiline-input)) + (python-indent-guess-indent-offset nil)) + (when (not (zerop (length lines))) + (with-temp-buffer + (delay-mode-hooks + (insert (string-join lines "\n")) + (python-mode) + (python-shell-completion-extra-context)))))) + +(defun python-shell-completion-extra-context (&optional pos) + "Get extra completion context at position POS in Python buffer. +If optional argument POS is nil, use current position. + +Readline completers could use current line as the completion +context, which may be insufficient. In this function, extra +context (e.g. multi-line function call) is found and reformatted +as one line, which is required by native completion." + (let (bound p) + (save-excursion + (and pos (goto-char pos)) + (setq bound (pos-bol)) + (python-nav-up-list -1) + (when (and (< (point) bound) + (or + (looking-back + (python-rx (group (+ (or "." symbol-name)))) (pos-bol) t) + (progn + (forward-line 0) + (looking-at "^[ \t]*\\(from \\)")))) + (setq p (match-beginning 1)))) + (when p + (replace-regexp-in-string + "\n[ \t]*" "" (buffer-substring-no-properties p (1- bound)))))) (defvar-local python-shell--capf-cache nil "Variable to store cached completions and invalidation keys.") @@ -4612,21 +4693,26 @@ using that one instead of current buffer's process." ;; Working on a shell buffer: use prompt end. (cdr (python-util-comint-last-prompt)) (line-beginning-position))) - (import-statement - (when (string-match-p - (rx (* space) word-start (or "from" "import") word-end space) - (buffer-substring-no-properties line-start (point))) - (buffer-substring-no-properties line-start (point)))) + (no-delims + (and (not (if is-shell-buffer + (eq 'font-lock-comment-face + (get-text-property (1- (point)) 'face)) + (python-syntax-context 'comment))) + (with-current-buffer (process-buffer process) + (if python-shell-completion-native-enable + (string= python-shell-readline-completer-delims "") + (string-match-p "ipython[23]?\\'" python-shell-interpreter))))) (start (if (< (point) line-start) (point) (save-excursion - (if (not (re-search-backward - (python-rx - (or whitespace open-paren close-paren - string-delimiter simple-operator)) - line-start - t 1)) + (if (or no-delims + (not (re-search-backward + (python-rx + (or whitespace open-paren close-paren + string-delimiter simple-operator)) + line-start + t 1))) line-start (forward-char (length (match-string-no-properties 0))) (point))))) @@ -4666,18 +4752,56 @@ using that one instead of current buffer's process." (t #'python-shell-completion-native-get-completions)))) (prev-prompt (car python-shell--capf-cache)) (re (or (cadr python-shell--capf-cache) regexp-unmatchable)) - (prefix (buffer-substring-no-properties start end))) + (prefix (buffer-substring-no-properties start end)) + (prefix-offset 0) + (extra-context (when no-delims + (if is-shell-buffer + (python-shell--extra-completion-context) + (python-shell-completion-extra-context)))) + (extra-offset (length extra-context))) + (unless (zerop extra-offset) + (setq prefix (concat extra-context prefix))) ;; To invalidate the cache, we check if the prompt position or the ;; completion prefix changed. (unless (and (equal prev-prompt (car prompt-boundaries)) - (string-match re prefix)) + (string-match re prefix) + (setq prefix-offset (- (length prefix) (match-end 1)))) (setq python-shell--capf-cache `(,(car prompt-boundaries) ,(if (string-empty-p prefix) regexp-unmatchable - (concat "\\`" (regexp-quote prefix) "\\(?:\\sw\\|\\s_\\)*\\'")) - ,@(funcall completion-fn process (or import-statement prefix))))) - (list start end (cddr python-shell--capf-cache)))) + (concat "\\`\\(" (regexp-quote prefix) "\\)\\(?:\\sw\\|\\s_\\)*\\'")) + ,@(funcall completion-fn process prefix)))) + (let ((cands (cddr python-shell--capf-cache))) + (cond + ((stringp (car cands)) + (if no-delims + ;; Reduce completion candidates due to long prefix. + (if-let ((Lp (length prefix)) + ((string-match "\\(\\sw\\|\\s_\\)+\\'" prefix)) + (L (match-beginning 0))) + ;; If extra-offset is not zero: + ;; start end + ;; o------------------o---------o-------o + ;; |<- extra-offset ->| + ;; |<----------- L ------------>| + ;; new-start + (list (+ start L (- extra-offset)) end + (mapcar (lambda (s) (substring s L)) cands)) + (list end end (mapcar (lambda (s) (substring s Lp)) cands))) + (list start end cands))) + ;; python-shell-completion(-native)-get-completions may produce a + ;; list of (text start end type signature) for completion. + ((consp (car cands)) + (list (+ start (nth 1 (car cands)) (- extra-offset)) + ;; Candidates may be cached, so the end position should + ;; be adjusted according to current completion prefix. + (+ start (nth 2 (car cands)) (- extra-offset) prefix-offset) + cands + :annotation-function + (lambda (c) (concat " " (nth 3 (assoc c cands)))) + :company-docsig + (lambda (c) (nth 4 (assoc c cands))))))))) (define-obsolete-function-alias 'python-shell-completion-complete-at-point diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index 59957ff0712..af6c199b5bd 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -4799,6 +4799,98 @@ def foo(): (end-of-line 0) (should-not (nth 2 (python-shell-completion-at-point)))))) +(defun python-tests--completion-module () + "Check if modules can be completed in Python shell." + (insert "import datet") + (completion-at-point) + (beginning-of-line) + (should (looking-at-p "import datetime")) + (kill-line) + (insert "from datet") + (completion-at-point) + (beginning-of-line) + (should (looking-at-p "from datetime")) + (end-of-line) + (insert " import timed") + (completion-at-point) + (beginning-of-line) + (should (looking-at-p "from datetime import timedelta")) + (kill-line)) + +(defun python-tests--completion-parameters () + "Check if parameters can be completed in Python shell." + (insert "import re") + (comint-send-input) + (python-tests-shell-wait-for-prompt) + (insert "re.split('b', 'abc', maxs") + (completion-at-point) + (should (string= "re.split('b', 'abc', maxsplit=" + (buffer-substring (line-beginning-position) (point)))) + (insert "0, ") + (should (python-shell-completion-at-point)) + ;; Test if cache is used. + (cl-letf (((symbol-function 'python-shell-completion-get-completions) + 'ignore) + ((symbol-function 'python-shell-completion-native-get-completions) + 'ignore)) + (insert "fla") + (completion-at-point) + (should (string= "re.split('b', 'abc', maxsplit=0, flags=" + (buffer-substring (line-beginning-position) (point))))) + (beginning-of-line) + (kill-line)) + +(defun python-tests--completion-extra-context () + "Check if extra context is used for completion." + (insert "re.split('b', 'abc',") + (comint-send-input) + (python-tests-shell-wait-for-prompt) + (insert "maxs") + (completion-at-point) + (should (string= "maxsplit=" + (buffer-substring (line-beginning-position) (point)))) + (insert "0)") + (comint-send-input) + (python-tests-shell-wait-for-prompt) + (insert "from re import (") + (comint-send-input) + (python-tests-shell-wait-for-prompt) + (insert "IGN") + (completion-at-point) + (should (string= "IGNORECASE" + (buffer-substring (line-beginning-position) (point))))) + +(ert-deftest python-shell-completion-at-point-jedi-completer () + "Check if Python shell completion works when Jedi completer is used." + (skip-unless (executable-find python-tests-shell-interpreter)) + (python-tests-with-temp-buffer-with-shell + "" + (python-shell-with-shell-buffer + (python-shell-completion-native-turn-on) + (skip-unless (string= python-shell-readline-completer-delims "")) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-tests--completion-extra-context)))) + +(ert-deftest python-shell-completion-at-point-ipython () + "Check if Python shell completion works for IPython." + (let ((python-shell-interpreter "ipython") + (python-shell-interpreter-args "-i --simple-prompt")) + (skip-unless + (and + (executable-find python-shell-interpreter) + (eql (call-process python-shell-interpreter nil nil nil "--version") 0))) + (python-tests-with-temp-buffer-with-shell + "" + (python-shell-with-shell-buffer + (python-shell-completion-native-turn-off) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-shell-completion-native-turn-on) + (skip-unless (string= python-shell-readline-completer-delims "")) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-tests--completion-extra-context))))) ;;; PDB Track integration From 571ec583d644b718ce52f938f111d4aa98192471 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 21:07:10 +0200 Subject: [PATCH 084/446] ; Clarify "ChangeLog entries" in CONTRIBUTE. --- CONTRIBUTE | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTE b/CONTRIBUTE index a71cc1b277a..049ca00089e 100644 --- a/CONTRIBUTE +++ b/CONTRIBUTE @@ -184,8 +184,9 @@ Here is an example commit message (indented): Deactivate the mark. Occasionally, commit messages are collected and prepended to a -ChangeLog file, where they can be corrected. It saves time to get -them right the first time, so here are guidelines for formatting them: +generated ChangeLog file, where they can be corrected. It saves time +to get them right the first time, so here are guidelines for +formatting them: - Start with a single unindented summary line explaining the change; do not end this line with a period. If possible, try to keep the @@ -194,9 +195,10 @@ them right the first time, so here are guidelines for formatting them: contexts. If the summary line starts with a semicolon and a space "; ", the - commit message will be ignored when generating the ChangeLog file. - Use this for minor commits that do not need separate ChangeLog - entries, such as changes in etc/NEWS. + commit message will be skipped and not added to the generated + ChangeLog file. Use this for minor commits that do not need to be + mentioned in the ChangeLog file, such as changes in etc/NEWS, typo + fixes, etc. - After the summary line, there should be an empty line. @@ -211,8 +213,8 @@ them right the first time, so here are guidelines for formatting them: enforced by a commit hook. - If only a single file is changed, the summary line can be the normal - file first line (starting with the asterisk). Then there is no - individual files section. + file first line (starting with the asterisk). Then there will be no + individual ChangeLog entries beyond the one in the summary line. - If the commit has more than one author, the commit message should contain separate lines to mention the other authors, like the @@ -245,10 +247,10 @@ them right the first time, so here are guidelines for formatting them: the rationale for a change; that can be done in the commit message between the summary line and the file entries. -- Emacs generally follows the GNU coding standards for ChangeLogs: see - https://www.gnu.org/prep/standards/html_node/Change-Logs.html - or run 'info "(standards)Change Logs"'. One exception is that - commits still sometimes quote `like-this' (as the standards used to +- Emacs follows the GNU coding standards for ChangeLog entries: see + https://www.gnu.org/prep/standards/html_node/Change-Logs.html or run + 'info "(standards)Change Logs"'. One exception is that commits + still sometimes quote `like-this' (as the standards used to recommend) rather than 'like-this' or ā€˜like this’ (as they do now), as `...' is so widely used elsewhere in Emacs. @@ -261,9 +263,9 @@ them right the first time, so here are guidelines for formatting them: in Emacs; that includes spelling and leaving 2 blanks between sentences. - They are preserved indefinitely, and have a reasonable chance of - being read in the future, so it's better that they have good - presentation. + The ChangeLog entries are preserved indefinitely, and have a + reasonable chance of being read in the future, so it's better that + they have good presentation. - Use the present tense; describe "what the change does", not "what the change did". From d65499e79083fb764517447d4d40ea3222ea2fa2 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 21:26:36 +0200 Subject: [PATCH 085/446] ; Another clarification in CONTRIBUTE. --- CONTRIBUTE | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTE b/CONTRIBUTE index 049ca00089e..687aa0888ab 100644 --- a/CONTRIBUTE +++ b/CONTRIBUTE @@ -213,8 +213,9 @@ formatting them: enforced by a commit hook. - If only a single file is changed, the summary line can be the normal - file first line (starting with the asterisk). Then there will be no - individual ChangeLog entries beyond the one in the summary line. + first line of a ChangeLog entry (starting with the asterisk). Then + there will be no individual ChangeLog entries beyond the one in the + summary line. - If the commit has more than one author, the commit message should contain separate lines to mention the other authors, like the @@ -245,7 +246,7 @@ formatting them: - Explaining the rationale for a design choice is best done in comments in the source code. However, sometimes it is useful to describe just the rationale for a change; that can be done in the commit message - between the summary line and the file entries. + between the summary line and the following ChangeLog entries. - Emacs follows the GNU coding standards for ChangeLog entries: see https://www.gnu.org/prep/standards/html_node/Change-Logs.html or run From 31ca4e5501ffa7c80f114c1145ae0ea55fb76d11 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 8 Feb 2024 22:28:08 +0200 Subject: [PATCH 086/446] ; And another fix of CONTRIBUTE. --- CONTRIBUTE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTE b/CONTRIBUTE index 687aa0888ab..69d7a2f114f 100644 --- a/CONTRIBUTE +++ b/CONTRIBUTE @@ -170,9 +170,9 @@ test 'out-of-tree' builds as well, i.e.: ** Commit messages -Ordinarily, a change you commit should contain a log entry in its -commit message and should not touch the repository's ChangeLog files. -Here is an example commit message (indented): +Ordinarily, a changeset you commit should contain a description of the +changes in its commit message and should not touch the repository's +ChangeLog files. Here is an example commit message (indented): Deactivate shifted region From 09c53b717d4941e2ddd113f3f6817bf65ae196f4 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Thu, 8 Feb 2024 22:19:40 +0100 Subject: [PATCH 087/446] * admin/notes/kind-communication: New file. --- admin/notes/kind-communication | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 admin/notes/kind-communication diff --git a/admin/notes/kind-communication b/admin/notes/kind-communication new file mode 100644 index 00000000000..80b2afb27b2 --- /dev/null +++ b/admin/notes/kind-communication @@ -0,0 +1,21 @@ +The GNU Project encourages contributions from anyone who wishes to +advance the development of the GNU system, regardless of gender, race, +ethnic group, physical appearance, religion, cultural background, and +any other demographic characteristics, as well as personal political +views. + +People are sometimes discouraged from participating in GNU development +because of certain patterns of communication that strike them as +unfriendly, unwelcoming, rejecting, or harsh. This discouragement +particularly affects members of disprivileged demographics, but it is +not limited to them. Therefore, we ask all contributors to make a +conscious effort, in GNU Project discussions, to communicate in ways +that avoid that outcome — to avoid practices that will predictably and +unnecessarily risk putting some contributors off. + +The GNU Kind Communications Guidelines suggest specific ways to +accomplish that goal. You can find the latest version at +https://www.gnu.org/philosophy/kind-communication.html + +When sending messages to Emacs mailing lists, we ask you to read and +respect these guidelines. From 8290a1bacb019f5026caa08334a7087802ebc6f9 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 9 Feb 2024 09:53:33 +0800 Subject: [PATCH 088/446] Replace a few calls to intern with constant strings * src/fns.c (do_yes_or_no_p, Fyes_or_no_p): Use symbol globals rather than intern. (syms_of_fns) : New symbols. * src/lread.c (readevalloop): Use symbol global. (syms_of_lread) : New symbol. --- src/fns.c | 6 ++++-- src/lread.c | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/fns.c b/src/fns.c index 7de2616b359..61d87752777 100644 --- a/src/fns.c +++ b/src/fns.c @@ -3211,7 +3211,7 @@ SEQUENCE may be a list, a vector, a bool-vector, or a string. */) Lisp_Object do_yes_or_no_p (Lisp_Object prompt) { - return call1 (intern ("yes-or-no-p"), prompt); + return call1 (Qyes_or_no_p, prompt); } DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0, @@ -3256,7 +3256,7 @@ by a mouse, or by some window-system gesture, or via a menu. */) } if (use_short_answers) - return call1 (intern ("y-or-n-p"), prompt); + return call1 (Qy_or_n_p, prompt); { char *s = SSDATA (prompt); @@ -6618,4 +6618,6 @@ For best results this should end in a space. */); DEFSYM (Qreal_this_command, "real-this-command"); DEFSYM (Qfrom__tty_menu_p, "from--tty-menu-p"); + DEFSYM (Qyes_or_no_p, "yes-or-no-p"); + DEFSYM (Qy_or_n_p, "y-or-n-p"); } diff --git a/src/lread.c b/src/lread.c index b5eeb55bb70..5aa7466cc12 100644 --- a/src/lread.c +++ b/src/lread.c @@ -2443,11 +2443,13 @@ readevalloop (Lisp_Object readcharfun, bool whole_buffer = 0; /* True on the first time around. */ bool first_sexp = 1; - Lisp_Object macroexpand = intern ("internal-macroexpand-for-load"); + Lisp_Object macroexpand; if (!NILP (sourcename)) CHECK_STRING (sourcename); + macroexpand = Qinternal_macroexpand_for_load; + if (NILP (Ffboundp (macroexpand)) || (STRINGP (sourcename) && suffix_p (sourcename, ".elc"))) /* Don't macroexpand before the corresponding function is defined @@ -6016,4 +6018,7 @@ See Info node `(elisp)Shorthands' for more details. */); doc: /* List of variables declared dynamic in the current scope. Only valid during macro-expansion. Internal use only. */); Vmacroexp__dynvars = Qnil; + + DEFSYM (Qinternal_macroexpand_for_load, + "internal-macroexpand-for-load"); } From 5af4e346b0b078d6e8f3dd90bb66899d3ed99810 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 9 Feb 2024 10:43:48 +0800 Subject: [PATCH 089/446] Don't lose track of adstyles during face merging * src/xfaces.c (merge_face_vectors): If an adstyle exists in FROM, guarantee that a font spec will exist in TO with the same. --- src/xfaces.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/xfaces.c b/src/xfaces.c index b9a78328661..a558e7328c0 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -2245,20 +2245,20 @@ merge_face_heights (Lisp_Object from, Lisp_Object to, Lisp_Object invalid) /* Merge two Lisp face attribute vectors on frame F, FROM and TO, and store the resulting attributes in TO, which must be already be - completely specified and contain only absolute attributes. - Every specified attribute of FROM overrides the corresponding - attribute of TO; relative attributes in FROM are merged with the - absolute value in TO and replace it. NAMED_MERGE_POINTS is used - internally to detect loops in face inheritance/remapping; it should - be 0 when called from other places. If window W is non-NULL, use W - to interpret face specifications. */ + completely specified and contain only absolute attributes. Every + specified attribute of FROM overrides the corresponding attribute of + TO; merge relative attributes in FROM with the absolute value in TO, + which attributes also replace it. Use NAMED_MERGE_POINTS internally + to detect loops in face inheritance/remapping; it should be 0 when + called from other places. If window W is non-NULL, use W to + interpret face specifications. */ static void merge_face_vectors (struct window *w, struct frame *f, const Lisp_Object *from, Lisp_Object *to, struct named_merge_point *named_merge_points) { int i; - Lisp_Object font = Qnil; + Lisp_Object font = Qnil, tospec, adstyle; /* If FROM inherits from some other faces, merge their attributes into TO before merging FROM's direct attributes. Note that an :inherit @@ -2318,6 +2318,25 @@ merge_face_vectors (struct window *w, to[LFACE_SLANT_INDEX] = FONT_SLANT_FOR_FACE (font); if (! NILP (AREF (font, FONT_WIDTH_INDEX))) to[LFACE_SWIDTH_INDEX] = FONT_WIDTH_FOR_FACE (font); + + if (!NILP (AREF (font, FONT_ADSTYLE_INDEX))) + { + /* If an adstyle is specified in FROM's font spec, create a + font spec for TO if none exists, and transfer the adstyle + there. */ + + tospec = to[LFACE_FONT_INDEX]; + adstyle = AREF (font, FONT_ADSTYLE_INDEX); + + if (!NILP (tospec)) + tospec = copy_font_spec (tospec); + else + tospec = Ffont_spec (0, NULL); + + to[LFACE_FONT_INDEX] = tospec; + ASET (tospec, FONT_ADSTYLE_INDEX, adstyle); + } + ASET (font, FONT_SIZE_INDEX, Qnil); } From b3821357696d44e3f553af14c209a21e69187c32 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 9 Feb 2024 13:15:57 +0800 Subject: [PATCH 090/446] Set adstyle within sfnt font objects * src/sfntfont.c (sfntfont_open): Don't incorrectly clear desc->adstyle. --- src/sfntfont.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sfntfont.c b/src/sfntfont.c index 860fc446184..3be770f650e 100644 --- a/src/sfntfont.c +++ b/src/sfntfont.c @@ -3308,7 +3308,7 @@ sfntfont_open (struct frame *f, Lisp_Object font_entity, ASET (font_object, FONT_TYPE_INDEX, sfnt_vendor_name); ASET (font_object, FONT_FOUNDRY_INDEX, desc->designer); ASET (font_object, FONT_FAMILY_INDEX, Fintern (desc->family, Qnil)); - ASET (font_object, FONT_ADSTYLE_INDEX, Qnil); + ASET (font_object, FONT_ADSTYLE_INDEX, desc->adstyle); ASET (font_object, FONT_REGISTRY_INDEX, sfntfont_registry_for_desc (desc)); @@ -3326,8 +3326,6 @@ sfntfont_open (struct frame *f, Lisp_Object font_entity, FONT_SET_STYLE (font_object, FONT_SLANT_INDEX, make_fixnum (desc->slant)); - ASET (font_object, FONT_ADSTYLE_INDEX, Qnil); - /* Clear various offsets. */ font_info->font.baseline_offset = 0; font_info->font.relative_compose = 0; @@ -3412,7 +3410,7 @@ sfntfont_open (struct frame *f, Lisp_Object font_entity, AREF (tem, 3)); FONT_SET_STYLE (font_object, FONT_SLANT_INDEX, AREF (tem, 4)); - ASET (font_object, FONT_ADSTYLE_INDEX, Qnil); + ASET (font_object, FONT_ADSTYLE_INDEX, AREF (tem, 1)); } } From 4e5068b7b3a06aaba6b93dff759a93b385ab8fd0 Mon Sep 17 00:00:00 2001 From: Dominique Quatravaux Date: Thu, 8 Feb 2024 10:19:10 +0100 Subject: [PATCH 091/446] Fix treesit_traverse_get_predicate (bug#68954) Commit d005e685e1df7692085378633348db39a5190374 should have used assq_no_signal, but didn't, this commit fixes that. * src/treesit.c (treesit_traverse_get_predicate): Replace assq_no_quit with assq_no_signal. Copyright-paperwork-exempt: yes --- src/treesit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/treesit.c b/src/treesit.c index 12915ea9a10..d86ab501187 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -3275,11 +3275,11 @@ treesit_traverse_child_helper (TSTreeCursor *cursor, static Lisp_Object treesit_traverse_get_predicate (Lisp_Object thing, Lisp_Object language) { - Lisp_Object cons = assq_no_quit (language, Vtreesit_thing_settings); + Lisp_Object cons = assq_no_signal (language, Vtreesit_thing_settings); if (NILP (cons)) return Qnil; Lisp_Object definitions = XCDR (cons); - Lisp_Object entry = assq_no_quit (thing, definitions); + Lisp_Object entry = assq_no_signal (thing, definitions); if (NILP (entry)) return Qnil; /* ENTRY looks like (THING PRED). */ From 7d3a144486461869b943f04a45e84c0c3d926732 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 9 Feb 2024 08:49:55 +0200 Subject: [PATCH 092/446] ; Mention defface's and their :version tags in CONTRIBUTE. --- CONTRIBUTE | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTE b/CONTRIBUTE index 69d7a2f114f..cdb47911d76 100644 --- a/CONTRIBUTE +++ b/CONTRIBUTE @@ -115,9 +115,10 @@ mode after hiding the body of each entry. Doc-strings should be updated together with the code. -New defcustom's should always have a ':version' tag stating the first -Emacs version in which they will appear. Likewise with defcustom's -whose value is changed -- update their ':version' tag. +New defcustom's and defface's should always have a ':version' tag +stating the first Emacs version in which they will appear. Likewise +with defcustom's or defface's whose value is changed -- update their +':version' tag. Think about whether your change requires updating the manuals. If you know it does not, mark the NEWS entry with "---" before the entry. If From 8d09e1def55e57a8c627ba704289f796c48a085d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 8 Feb 2024 23:17:04 -0800 Subject: [PATCH 093/446] Port to GNU Make 03ecd94488b85adc38746ec3e7c2a297a522598e MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem reported by Collin Funk (Bug#68996). * GNUmakefile (.): New macro. (help): Use ā€˜$.’ instead of ā€˜$ ’. * cross/verbose.mk.android, src/verbose.mk.in (.): New macro. (AM_V_AR, AM_V_CC, AM_V_CXX, AM_V_CCLD, AM_V_CXXLD, AM_V_GEN): Use ā€˜$.’ instead of ā€˜$ ’. * lib-src/Makefile.in (install): Use ā€˜$.’ instead of ā€˜$ ’. --- GNUmakefile | 50 +++++++++++++++++++++------------------- cross/verbose.mk.android | 13 ++++++----- lib-src/Makefile.in | 4 ++-- src/verbose.mk.in | 29 ++++++++++++----------- 4 files changed, 50 insertions(+), 46 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 16064672c65..58c0281e895 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -27,6 +27,8 @@ # newly-built Makefile. If the source tree is already configured, # this file defers to the existing Makefile. +. := + # If you want non-default build options, or if you want to build in an # out-of-source tree, you should run 'configure' before running 'make'. # But run 'autogen.sh' first, if the source was checked out directly @@ -36,30 +38,30 @@ ifeq (help,$(filter help,$(MAKECMDGOALS))) help: - $(info $ NOTE: This is a brief summary of some common make targets.) - $(info $ For more detailed information, please read the files INSTALL,) - $(info $ INSTALL.REPO, Makefile or visit this URL:) - $(info $ https://www.gnu.org/prep/standards/html_node/Standard-Targets.html) - $(info $ ) - $(info $ make all -- compile and build Emacs) - $(info $ make install -- install Emacs) - $(info $ make TAGS -- update tags tables) - $(info $ make clean -- delete built files but preserve configuration) - $(info $ make mostlyclean -- like 'make clean', but leave those files that) - $(info $ usually do not need to be recompiled) - $(info $ make distclean -- delete all build and configuration files,) - $(info $ leave only files included in source distribution) - $(info $ make maintainer-clean -- delete almost everything that can be regenerated) - $(info $ make extraclean -- like maintainer-clean, and also delete) - $(info $ backup and autosave files) - $(info $ make bootstrap -- delete all compiled files to force a new bootstrap) - $(info $ from a clean slate, then build in the normal way) - $(info $ make uninstall -- remove files installed by 'make install') - $(info $ make check -- run the Emacs test suite) - $(info $ make docs -- generate Emacs documentation in info format) - $(info $ make html -- generate documentation in html format) - $(info $ make ps -- generate documentation in ps format) - $(info $ make pdf -- generate documentation in pdf format ) + $(info $.NOTE: This is a brief summary of some common make targets.) + $(info $.For more detailed information, please read the files INSTALL,) + $(info $.INSTALL.REPO, Makefile or visit this URL:) + $(info $.https://www.gnu.org/prep/standards/html_node/Standard-Targets.html) + $(info $.) + $(info $.make all -- compile and build Emacs) + $(info $.make install -- install Emacs) + $(info $.make TAGS -- update tags tables) + $(info $.make clean -- delete built files but preserve configuration) + $(info $.make mostlyclean -- like 'make clean', but leave those files that) + $(info $. usually do not need to be recompiled) + $(info $.make distclean -- delete all build and configuration files,) + $(info $. leave only files included in source distribution) + $(info $.make maintainer-clean -- delete almost everything that can be regenerated) + $(info $.make extraclean -- like maintainer-clean, and also delete) + $(info $. backup and autosave files) + $(info $.make bootstrap -- delete all compiled files to force a new bootstrap) + $(info $. from a clean slate, then build in the normal way) + $(info $.make uninstall -- remove files installed by 'make install') + $(info $.make check -- run the Emacs test suite) + $(info $.make docs -- generate Emacs documentation in info format) + $(info $.make html -- generate documentation in html format) + $(info $.make ps -- generate documentation in ps format) + $(info $.make pdf -- generate documentation in pdf format ) @: .PHONY: help diff --git a/cross/verbose.mk.android b/cross/verbose.mk.android index 958cf237c58..7b9af76404b 100644 --- a/cross/verbose.mk.android +++ b/cross/verbose.mk.android @@ -44,12 +44,13 @@ have_working_info = $(filter notintermediate,$(value .FEATURES)) # The workaround is done only for AM_V_ELC and AM_V_ELN, # since the bug is not annoying elsewhere. -AM_V_AR = @$(info $ AR $@) +. := +AM_V_AR = @$(info $. AR $@) AM_V_at = @ -AM_V_CC = @$(info $ CC $@) -AM_V_CXX = @$(info $ CXX $@) -AM_V_CCLD = @$(info $ CCLD $@) -AM_V_CXXLD = @$(info $ CXXLD $@) -AM_V_GEN = @$(info $ GEN $@) +AM_V_CC = @$(info $. CC $@) +AM_V_CXX = @$(info $. CXX $@) +AM_V_CCLD = @$(info $. CCLD $@) +AM_V_CXXLD = @$(info $. CXXLD $@) +AM_V_GEN = @$(info $. GEN $@) AM_V_NO_PD = --no-print-directory endif diff --git a/lib-src/Makefile.in b/lib-src/Makefile.in index 7c059640862..3cdf1620781 100644 --- a/lib-src/Makefile.in +++ b/lib-src/Makefile.in @@ -319,7 +319,7 @@ maybe-blessmail: $(BLESSMAIL_TARGET) ## up if chown or chgrp fails, as the package responsible for ## installing Emacs can fix this problem later. $(DESTDIR)${archlibdir}: all - $(info $ ) + $(info $.) $(info Installing utilities run internally by Emacs.) umask 022 && ${MKDIR_P} "$(DESTDIR)${archlibdir}" exp_archlibdir=`cd "$(DESTDIR)${archlibdir}" && pwd -P` && \ @@ -361,7 +361,7 @@ $(DESTDIR)${archlibdir}: all .PHONY: bootstrap-clean check tags install: $(DESTDIR)${archlibdir} - $(info $ ) + $(info $.) $(info Installing utilities for users to run.) umask 022 && ${MKDIR_P} "$(DESTDIR)${bindir}" for file in ${INSTALLABLES} ; do \ diff --git a/src/verbose.mk.in b/src/verbose.mk.in index e72c182f276..6efb6b9416b 100644 --- a/src/verbose.mk.in +++ b/src/verbose.mk.in @@ -53,38 +53,39 @@ have_working_info = $(filter notintermediate,$(value .FEATURES)) # The workaround is done only for AM_V_ELC and AM_V_ELN, # since the bug is not annoying elsewhere. -AM_V_AR = @$(info $ AR $@) +. := +AM_V_AR = @$(info $. AR $@) AM_V_at = @ -AM_V_CC = @$(info $ CC $@) -AM_V_CXX = @$(info $ CXX $@) -AM_V_CCLD = @$(info $ CCLD $@) -AM_V_CXXLD = @$(info $ CXXLD $@) +AM_V_CC = @$(info $. CC $@) +AM_V_CXX = @$(info $. CXX $@) +AM_V_CCLD = @$(info $. CCLD $@) +AM_V_CXXLD = @$(info $. CXXLD $@) ifeq ($(HAVE_NATIVE_COMP)-$(NATIVE_DISABLED)-$(ANCIENT),yes--) ifneq (,$(have_working_info)) -AM_V_ELC = @$(info $ ELC+ELN $@) -AM_V_ELN = @$(info $ ELN $@) +AM_V_ELC = @$(info $. ELC+ELN $@) +AM_V_ELN = @$(info $. ELN $@) else AM_V_ELC = @echo " ELC+ELN " $@; AM_V_ELN = @echo " ELN " $@; endif else ifneq (,$(have_working_info)) -AM_V_ELC = @$(info $ ELC $@) +AM_V_ELC = @$(info $. ELC $@) else AM_V_ELC = @echo " ELC " $@; endif AM_V_ELN = endif -AM_V_GEN = @$(info $ GEN $@) -AM_V_GLOBALS = @$(info $ GEN globals.h) +AM_V_GEN = @$(info $. GEN $@) +AM_V_GLOBALS = @$(info $. GEN globals.h) AM_V_NO_PD = --no-print-directory -AM_V_RC = @$(info $ RC $@) +AM_V_RC = @$(info $. RC $@) # These are used for the Android port. -AM_V_JAVAC = @$(info $ JAVAC $@) -AM_V_D8 = @$(info $ D8 $@) -AM_V_AAPT = @$(info $ AAPT $@) +AM_V_JAVAC = @$(info $. JAVAC $@) +AM_V_D8 = @$(info $. D8 $@) +AM_V_AAPT = @$(info $. AAPT $@) AM_V_SILENT = @ endif From f1e7b5230ad93aab20af1fd7b09931a746a89d5d Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 9 Feb 2024 11:05:14 +0100 Subject: [PATCH 094/446] Tramp: Handle PIN requests from security keys (don't merge) * doc/misc/tramp.texi (Frequently Asked Questions): Clarify FIDO entry. * lisp/net/tramp-sh.el (tramp-actions-before-shell) (tramp-actions-copy-out-of-band): Use `tramp-security-key-pin-regexp'. * lisp/net/tramp.el (tramp-security-key-pin-regexp): New defcustom. (tramp-action-otp-password, tramp-read-passwd): Trim password prompt. (tramp-action-show-and-confirm-message): Expand for PIN requests. --- doc/misc/tramp.texi | 9 +++++++-- lisp/net/tramp-sh.el | 2 ++ lisp/net/tramp.el | 33 ++++++++++++++++++++++----------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 3be88d1767a..d6031d96d6b 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -5070,9 +5070,14 @@ Does @value{tramp} support @acronym{SSH} security keys? Yes. @command{OpenSSH} has added support for @acronym{FIDO} hardware devices via special key types @option{*-sk}. @value{tramp} supports the additional handshaking messages for them. This requires at least -@command{OpenSSH} 8.2, and a @acronym{FIDO} @acronym{U2F} compatible -security key, like yubikey, solokey, nitrokey, or titankey. +@command{OpenSSH} 8.2, and a @acronym{FIDO} @acronym{U2F} or +@acronym{FIDO2} compatible security key, like yubikey, solokey, +nitrokey, or titankey. +@c @uref{https://docs.fedoraproject.org/en-US/quick-docs/using-yubikeys/} +@strong{Note} that there are reports on problems of handling yubikey +residential keys by @command{ssh-agent}. As workaround, you might +disable @command{ssh-agent} for such keys. @item @value{tramp} does not connect to Samba or MS Windows hosts running diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 44c0bdc7aea..3e6fb384a8f 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -544,6 +544,7 @@ shell from reading its init file." (tramp-terminal-prompt-regexp tramp-action-terminal) (tramp-antispoof-regexp tramp-action-confirm-message) (tramp-security-key-confirm-regexp tramp-action-show-and-confirm-message) + (tramp-security-key-pin-regexp tramp-action-otp-password) (tramp-process-alive-regexp tramp-action-process-alive)) "List of pattern/action pairs. Whenever a pattern matches, the corresponding action is performed. @@ -563,6 +564,7 @@ corresponding PATTERN matches, the ACTION function is called.") (tramp-wrong-passwd-regexp tramp-action-permission-denied) (tramp-copy-failed-regexp tramp-action-permission-denied) (tramp-security-key-confirm-regexp tramp-action-show-and-confirm-message) + (tramp-security-key-pin-regexp tramp-action-otp-password) (tramp-process-alive-regexp tramp-action-out-of-band)) "List of pattern/action pairs. This list is used for copying/renaming with out-of-band methods. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index bd556753261..f3da56e7a4f 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -224,7 +224,7 @@ pair of the form (KEY VALUE). The following KEYs are defined: set this to any value other than \"/bin/sh\": Tramp wants to use a shell which groks tilde expansion, but it can search for it. Also note that \"/bin/sh\" exists on all Unixen - except Andtoid, this might not be true for the value that you + except Android, this might not be true for the value that you decide to use. You Have Been Warned. * `tramp-remote-shell-login' @@ -788,6 +788,13 @@ The regexp should match at end of buffer." :version "28.1" :type 'regexp) +(defcustom tramp-security-key-pin-regexp + (rx bol (* "\r") (group "Enter PIN for " (* nonl)) (* (any "\r\n"))) + "Regular expression matching security key PIN prompt. +The regexp should match at end of buffer." + :version "29.3" + :type 'regexp) + (defcustom tramp-operation-not-permitted-regexp (rx (| (: "preserving times" (* nonl)) "set mode") ":" (* blank) "Operation not permitted") @@ -5589,7 +5596,7 @@ of." prompt) (goto-char (point-min)) (tramp-check-for-regexp proc tramp-process-action-regexp) - (setq prompt (concat (match-string 1) " ")) + (setq prompt (concat (string-trim (match-string 1)) " ")) (tramp-message vec 3 "Sending %s" (match-string 1)) ;; We don't call `tramp-send-string' in order to hide the ;; password from the debug buffer and the traces. @@ -5665,14 +5672,17 @@ Wait, until the connection buffer changes." (ignore set-message-function clear-message-function) (tramp-message vec 6 "\n%s" (buffer-string)) (tramp-check-for-regexp proc tramp-process-action-regexp) - (with-temp-message - (replace-regexp-in-string (rx (any "\r\n")) "" (match-string 0)) + (with-temp-message (concat (string-trim (match-string 0)) " ") ;; Hide message in buffer. (narrow-to-region (point-max) (point-max)) ;; Wait for new output. (while (not (tramp-compat-ignore-error file-error (tramp-wait-for-regexp - proc 0.1 tramp-security-key-confirmed-regexp))) + proc 0.1 + (tramp-compat-rx + (| (regexp tramp-security-key-confirmed-regexp) + (regexp tramp-security-key-pin-regexp) + (regexp tramp-security-key-timeout-regexp)))))) (when (tramp-check-for-regexp proc tramp-security-key-timeout-regexp) (throw 'tramp-action 'timeout)) (redisplay 'force))) @@ -6726,12 +6736,13 @@ Consults the auth-source package." (tramp-get-connection-property key "login-as"))) (host (tramp-file-name-host-port vec)) (pw-prompt - (or prompt - (with-current-buffer (process-buffer proc) - (tramp-check-for-regexp proc tramp-password-prompt-regexp) - (if (string-match-p "passphrase" (match-string 1)) - (match-string 0) - (format "%s for %s " (capitalize (match-string 1)) key))))) + (string-trim-left + (or prompt + (with-current-buffer (process-buffer proc) + (tramp-check-for-regexp proc tramp-password-prompt-regexp) + (if (string-match-p "passphrase" (match-string 1)) + (match-string 0) + (format "%s for %s " (capitalize (match-string 1)) key)))))) (auth-source-creation-prompts `((secret . ,pw-prompt))) ;; Use connection-local value. (auth-sources (buffer-local-value 'auth-sources (process-buffer proc))) From 8d6a8e573f9a1e4eb9ebbc0ec244907263e61bb8 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 9 Feb 2024 11:21:05 +0100 Subject: [PATCH 095/446] Tramp: Handle PIN requests from security keys * doc/misc/tramp.texi (Frequently Asked Questions): Clarify FIDO entry. * lisp/net/tramp-sh.el (tramp-actions-before-shell) (tramp-actions-copy-out-of-band): Use `tramp-security-key-pin-regexp'. * lisp/net/tramp.el (tramp-security-key-pin-regexp): New defcustom. (tramp-action-otp-password, tramp-read-passwd): Trim password prompt. (tramp-action-show-and-confirm-message): Expand for PIN requests. --- doc/misc/tramp.texi | 9 +++++++-- lisp/net/tramp-sh.el | 2 ++ lisp/net/tramp.el | 30 ++++++++++++++++++++---------- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 56945d3071c..90824024c03 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -5238,9 +5238,14 @@ Does @value{tramp} support @acronym{SSH} security keys? Yes. @command{OpenSSH} has added support for @acronym{FIDO} hardware devices via special key types @option{*-sk}. @value{tramp} supports the additional handshaking messages for them. This requires at least -@command{OpenSSH} 8.2, and a @acronym{FIDO} @acronym{U2F} compatible -security key, like yubikey, solokey, nitrokey, or titankey. +@command{OpenSSH} 8.2, and a @acronym{FIDO} @acronym{U2F} or +@acronym{FIDO2} compatible security key, like yubikey, solokey, +nitrokey, or titankey. +@c @uref{https://docs.fedoraproject.org/en-US/quick-docs/using-yubikeys/} +@strong{Note} that there are reports on problems of handling yubikey +residential keys by @command{ssh-agent}. As workaround, you might +disable @command{ssh-agent} for such keys. @item @value{tramp} does not connect to Samba or MS Windows hosts running diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 68ee541bee6..3557b3a1b64 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -547,6 +547,7 @@ shell from reading its init file." (tramp-terminal-prompt-regexp tramp-action-terminal) (tramp-antispoof-regexp tramp-action-confirm-message) (tramp-security-key-confirm-regexp tramp-action-show-and-confirm-message) + (tramp-security-key-pin-regexp tramp-action-otp-password) (tramp-process-alive-regexp tramp-action-process-alive)) "List of pattern/action pairs. Whenever a pattern matches, the corresponding action is performed. @@ -566,6 +567,7 @@ corresponding PATTERN matches, the ACTION function is called.") (tramp-wrong-passwd-regexp tramp-action-permission-denied) (tramp-copy-failed-regexp tramp-action-permission-denied) (tramp-security-key-confirm-regexp tramp-action-show-and-confirm-message) + (tramp-security-key-pin-regexp tramp-action-otp-password) (tramp-process-alive-regexp tramp-action-out-of-band)) "List of pattern/action pairs. This list is used for copying/renaming with out-of-band methods. diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 8e114912527..ae59915b1e8 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -770,6 +770,13 @@ The regexp should match at end of buffer." :version "28.1" :type 'regexp) +(defcustom tramp-security-key-pin-regexp + (rx bol (* "\r") (group "Enter PIN for " (* nonl)) (* (any "\r\n"))) + "Regular expression matching security key PIN prompt. +The regexp should match at end of buffer." + :version "29.3" + :type 'regexp) + (defcustom tramp-operation-not-permitted-regexp (rx (| (: "preserving times" (* nonl)) "set mode") ":" (* blank) "Operation not permitted") @@ -5435,7 +5442,7 @@ of." prompt) (goto-char (point-min)) (tramp-check-for-regexp proc tramp-process-action-regexp) - (setq prompt (concat (match-string 1) " ")) + (setq prompt (concat (string-trim (match-string 1)) " ")) (tramp-message vec 3 "Sending %s" (match-string 1)) ;; We don't call `tramp-send-string' in order to hide the ;; password from the debug buffer and the traces. @@ -5511,14 +5518,16 @@ Wait, until the connection buffer changes." (ignore set-message-function clear-message-function) (tramp-message vec 6 "\n%s" (buffer-string)) (tramp-check-for-regexp proc tramp-process-action-regexp) - (with-temp-message - (replace-regexp-in-string (rx (any "\r\n")) "" (match-string 0)) + (with-temp-message (concat (string-trim (match-string 0)) " ") ;; Hide message in buffer. (narrow-to-region (point-max) (point-max)) ;; Wait for new output. (while (not (ignore-error file-error (tramp-wait-for-regexp - proc 0.1 tramp-security-key-confirmed-regexp))) + proc 0.1 + (rx (| (regexp tramp-security-key-confirmed-regexp) + (regexp tramp-security-key-pin-regexp) + (regexp tramp-security-key-timeout-regexp)))))) (when (tramp-check-for-regexp proc tramp-security-key-timeout-regexp) (throw 'tramp-action 'timeout)) (redisplay 'force)))))) @@ -6564,12 +6573,13 @@ Consults the auth-source package." (tramp-get-connection-property key "login-as"))) (host (tramp-file-name-host-port vec)) (pw-prompt - (or prompt - (with-current-buffer (process-buffer proc) - (tramp-check-for-regexp proc tramp-password-prompt-regexp) - (if (string-match-p "passphrase" (match-string 1)) - (match-string 0) - (format "%s for %s " (capitalize (match-string 1)) key))))) + (string-trim-left + (or prompt + (with-current-buffer (process-buffer proc) + (tramp-check-for-regexp proc tramp-password-prompt-regexp) + (if (string-match-p "passphrase" (match-string 1)) + (match-string 0) + (format "%s for %s " (capitalize (match-string 1)) key)))))) (auth-source-creation-prompts `((secret . ,pw-prompt))) ;; Use connection-local value. (auth-sources (buffer-local-value 'auth-sources (process-buffer proc))) From c4ec6d0472beac2a0cb4f5c8baec79e39dfc410b Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 9 Feb 2024 14:08:51 -0500 Subject: [PATCH 096/446] * lisp/subr.el (read-char-from-minibuffer): Fix bug#68995 --- lisp/subr.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index e53ef505522..f41bb34045e 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3726,10 +3726,10 @@ There is no need to explicitly add `help-char' to CHARS; (this-command this-command) (result (minibuffer-with-setup-hook (lambda () + (setq-local post-self-insert-hook nil) (add-hook 'post-command-hook (lambda () - ;; FIXME: Should we use `<='? - (if (= (1+ (minibuffer-prompt-end)) + (if (<= (1+ (minibuffer-prompt-end)) (point-max)) (exit-minibuffer))) nil 'local)) From 3c3702b9bbc79f63026606dc0f391da3d795226d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 9 Feb 2024 14:13:29 -0500 Subject: [PATCH 097/446] * lisp/subr.el (with-output-to-temp-buffer): Add `indent` rule --- lisp/emacs-lisp/lisp-mode.el | 1 - lisp/subr.el | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index ad0525e24be..3475d944337 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -1347,7 +1347,6 @@ Lisp function does not specify a special indentation." (put 'condition-case 'lisp-indent-function 2) (put 'handler-case 'lisp-indent-function 1) ;CL (put 'unwind-protect 'lisp-indent-function 1) -(put 'with-output-to-temp-buffer 'lisp-indent-function 1) (put 'closure 'lisp-indent-function 2) (defun indent-sexp (&optional endpos) diff --git a/lisp/subr.el b/lisp/subr.el index f41bb34045e..c317d558e24 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -5019,7 +5019,7 @@ read-only, and scans it for function and variable names to make them into clickable cross-references. See the related form `with-temp-buffer-window'." - (declare (debug t)) + (declare (debug t) (indent 1)) (let ((old-dir (make-symbol "old-dir")) (buf (make-symbol "buf"))) `(let* ((,old-dir default-directory) From efedb8f479f1f2cf4d7ce703c6411dd756d2843d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 9 Feb 2024 14:22:14 -0500 Subject: [PATCH 098/446] modula2.el: Avoid font-lock-*-face variables * lisp/progmodes/modula2.el (m3-font-lock-keywords-1) (m3-font-lock-keywords-2): Refer to the font-lock faces directly --- lisp/progmodes/modula2.el | 47 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/lisp/progmodes/modula2.el b/lisp/progmodes/modula2.el index 09cb848fd52..2bb31988290 100644 --- a/lisp/progmodes/modula2.el +++ b/lisp/progmodes/modula2.el @@ -325,20 +325,20 @@ followed by the first character of the construct. ;; ;; Module definitions. ("\\<\\(INTERFACE\\|MODULE\\|PROCEDURE\\)\\>[ \t]*\\(\\sw+\\)?" - (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t)) + (1 'font-lock-keyword-face) (2 'font-lock-function-name-face nil t)) ;; ;; Import directives. ("\\<\\(EXPORTS\\|FROM\\|IMPORT\\)\\>" - (1 font-lock-keyword-face) + (1 'font-lock-keyword-face) (font-lock-match-c-style-declaration-item-and-skip-to-next nil (goto-char (match-end 0)) - (1 font-lock-constant-face))) + (1 'font-lock-constant-face))) ;; ;; Pragmas as warnings. ;; Spencer Allain says do them as comments... ;; ("<\\*.*\\*>" . font-lock-warning-face) ;; ... but instead we fontify the first word. - ("<\\*[ \t]*\\(\\sw+\\)" 1 font-lock-warning-face prepend) + ("<\\*[ \t]*\\(\\sw+\\)" 1 'font-lock-warning-face prepend) ) "Subdued level highlighting for Modula-3 modes.") @@ -366,26 +366,29 @@ followed by the first character of the construct. "LOOPHOLE" "MAX" "MIN" "NARROW" "NEW" "NUMBER" "ORD" "ROUND" "SUBARRAY" "TRUNC" "TYPECODE" "VAL"))) ) - (list - ;; - ;; Keywords except those fontified elsewhere. - (concat "\\<\\(" m3-keywords "\\)\\>") - ;; - ;; Builtins. - (cons (concat "\\<\\(" m3-builtins "\\)\\>") 'font-lock-builtin-face) - ;; - ;; Type names. - (cons (concat "\\<\\(" m3-types "\\)\\>") 'font-lock-type-face) - ;; - ;; Fontify tokens as function names. - '("\\<\\(END\\|EXCEPTION\\|RAISES?\\)\\>[ \t{]*" - (1 font-lock-keyword-face) + `( + ;; + ;; Keywords except those fontified elsewhere. + ,(concat "\\<\\(" m3-keywords "\\)\\>") + ;; + ;; Builtins. + (,(concat "\\<\\(" m3-builtins "\\)\\>") + (0 'font-lock-builtin-face)) + ;; + ;; Type names. + (,(concat "\\<\\(" m3-types "\\)\\>") + (0 'font-lock-type-face)) + ;; + ;; Fontify tokens as function names. + ("\\<\\(END\\|EXCEPTION\\|RAISES?\\)\\>[ \t{]*" + (1 'font-lock-keyword-face) (font-lock-match-c-style-declaration-item-and-skip-to-next nil (goto-char (match-end 0)) - (1 font-lock-function-name-face))) - ;; - ;; Fontify constants as references. - '("\\<\\(FALSE\\|NIL\\|NULL\\|TRUE\\)\\>" . font-lock-constant-face) + (1 'font-lock-function-name-face))) + ;; + ;; Fontify constants as references. + ("\\<\\(FALSE\\|NIL\\|NULL\\|TRUE\\)\\>" + (0 'font-lock-constant-face)) )))) "Gaudy level highlighting for Modula-3 modes.") From 7a13e705b1aead8f527dfa5407d9f87301b1f252 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Wed, 7 Feb 2024 17:58:31 -0800 Subject: [PATCH 099/446] Put the list of built-in Eshell commands in its own manual node * doc/misc/eshell.texi (Built-ins): Fix capitalization of node to be more consistent with the rest of the manual. Fix a cross reference. List child nodes. (List of Built-ins): New section and node. (Defining New Built-ins): Make this a node. Fix capitalization. --- doc/misc/eshell.texi | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 5d3e5c7dbd6..9e5eea6cb61 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -416,7 +416,7 @@ elisp, The Emacs Lisp Reference Manual}). @end table @node Built-ins -@section Built-in commands +@section Built-in Commands Eshell provides a number of built-in commands, many of them implementing common command-line utilities, but enhanced for Eshell. (These built-in commands are just ordinary Lisp functions whose names @@ -477,7 +477,16 @@ default target for the commands @command{cp}, @command{mv}, and @command{ln} is the current directory. A few commands are wrappers for more niche Emacs features, and can be -loaded as part of the eshell-xtra module. @xref{Extension modules}. +loaded as part of the @code{eshell-xtra} module. @xref{Extra built-in +commands}. + +@menu +* List of Built-ins:: +* Defining New Built-ins:: +@end menu + +@node List of Built-ins +@subsection List of Built-in Commands @table @code @@ -1195,7 +1204,8 @@ connection-aware, so for remote directories, it will print the user associated with that connection. @end table -@subsection Defining new built-in commands +@node Defining New Built-ins +@subsection Defining New Built-in Commands While Eshell can run Lisp functions directly as commands, it may be more convenient to provide a special built-in command for Eshell. Built-in commands are just ordinary Lisp functions designed From b5b80de49c5a37778945d7a0234090b09acc104f Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 8 Feb 2024 11:31:17 -0800 Subject: [PATCH 100/446] In Eshell manual, put command index anchors above the item This makes sure that when navigating to the command's documentation from the index, it shows the item heading (which lists the supported arguments). * doc/misc/eshell.texi (List of Built-ins, Tramp extensions) (Extra built-in commands): Adjust placement of '@cmindex'. --- doc/misc/eshell.texi | 134 +++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 9e5eea6cb61..3ff8e55ed03 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -490,16 +490,16 @@ commands}. @table @code -@item . @var{file} [@var{argument}]@dots{} @cmindex . +@item . @var{file} [@var{argument}]@dots{} Source an Eshell script named @var{file} in the current environment, passing any @var{arguments} to the script (@pxref{Scripts}). This is not to be confused with the command @command{source}, which sources a file in a subshell environment. +@cmindex addpath @item addpath @itemx addpath [-b] @var{directory}@dots{} -@cmindex addpath Adds each specified @var{directory} to the @code{$PATH} environment variable. By default, this adds the directories to the end of @code{$PATH}, in the order they were passed on the command line; by @@ -509,30 +509,30 @@ directories to the beginning. With no directories, print the list of directories currently stored in @code{$PATH}. +@cmindex alias @item alias @itemx alias @var{name} [@var{command}] -@cmindex alias Define an alias named @var{name} and expanding to @var{command}, adding it to the aliases file (@pxref{Aliases}). If @var{command} is omitted, delete the alias named @var{name}. With no arguments at all, list all the currently-defined aliases. -@item basename @var{filename} @cmindex basename +@item basename @var{filename} Return @var{filename} without its directory. -@item cat @var{file}@dots{} @cmindex cat +@item cat @var{file}@dots{} Concatenate the contents of @var{file}s to standard output. If in a pipeline, or if any of the files is not a regular file, directory, or symlink, then this command reverts to the system's definition of @command{cat}. +@cmindex cd @item cd @itemx cd @var{directory} @itemx cd -[@var{n}] @itemx cd =[@var{regexp}] -@cmindex cd Change the current working directory. This command can take several forms: @@ -567,20 +567,20 @@ will report the directory it changes to. If @code{eshell-list-files-after-cd} is non-@code{nil}, then @command{ls} is called with any remaining arguments after changing directories. -@item clear [@var{scrollback}] @cmindex clear +@item clear [@var{scrollback}] Scrolls the contents of the Eshell window out of sight, leaving a blank window. If @var{scrollback} is non-@code{nil}, the scrollback contents are cleared instead, as with @command{clear-scrollback}. -@item clear-scrollback @cmindex clear-scrollback +@item clear-scrollback Clear the scrollback contents of the Eshell window. Unlike the command @command{clear}, this command deletes content in the Eshell buffer. -@item compile [-p | -i] [-m @var{mode-name}] @var{command}@dots{} @cmindex compile +@item compile [-p | -i] [-m @var{mode-name}] @var{command}@dots{} Run an external command, sending its output to a compilation buffer if the command would output to the screen and is not part of a pipeline or subcommand. @@ -598,9 +598,9 @@ you have a grep-like command on your system, you might define an alias for it like so: @samp{alias mygrep 'compile --mode=grep-mode -- mygrep $*'}. +@cmindex cp @item cp [@var{option}@dots{}] @var{source} @var{dest} @item cp [@var{option}@dots{}] @var{source}@dots{} @var{directory} -@cmindex cp Copy the file @var{source} to @var{dest} or @var{source} into @var{directory}. @@ -644,14 +644,14 @@ Print the name of each file before copying it. @end table -@item date [@var{specified-time} [@var{zone}]] @cmindex date +@item date [@var{specified-time} [@var{zone}]] Print the current local time as a human-readable string. This command is an alias to the Emacs Lisp function @code{current-time-string} (@pxref{Time of Day,,, elisp, GNU Emacs Lisp Reference Manual}). -@item diff [@var{option}]@dots{} @var{old} @var{new} @cmindex diff +@item diff [@var{option}]@dots{} @var{old} @var{new} Compare the files @var{old} and @var{new} using Emacs's internal @code{diff} (not to be confused with @code{ediff}). @xref{Comparing Files, , , emacs, The GNU Emacs Manual}. @@ -661,18 +661,18 @@ If @code{eshell-plain-diff-behavior} is non-@code{nil}, then this command does not use Emacs's internal @code{diff}. This is the same as using @samp{alias diff '*diff $@@*'}. -@item dirname @var{filename} @cmindex dirname +@item dirname @var{filename} Return the directory component of @var{filename}. -@item dirs @cmindex dirs +@item dirs Prints the directory stack. Directories can be added or removed from the stack using the commands @command{pushd} and @command{popd}, respectively. -@item du [@var{option}]@dots{} @var{file}@dots{} @cmindex du +@item du [@var{option}]@dots{} @var{file}@dots{} Summarize disk usage for each file, recursing into directories. @command{du} accepts the following options: @@ -720,8 +720,8 @@ Skip any directories that reside on different filesystems. @end table -@item echo [-n | -N] [@var{arg}]@dots{} @cmindex echo +@item echo [-n | -N] [@var{arg}]@dots{} Prints the value of each @var{arg}. By default, this prints in a Lisp-friendly fashion (so that the value is useful to a Lisp command using the result of @command{echo} as an argument). If a single @@ -739,16 +739,16 @@ using @code{-n} to disable the trailing newline (the default behavior) or @code{-N} to enable it (the default when @code{eshell-plain-echo-behavior} is non-@code{nil}). -@item env [@var{var}=@var{value}]@dots{} [@var{command}]@dots{} @cmindex env +@item env [@var{var}=@var{value}]@dots{} [@var{command}]@dots{} With no arguments, print the current environment variables. If you pass arguments to this command, then @command{env} will execute the arguments as a command. If you pass any initial arguments of the form @samp{@var{var}=@var{value}}, @command{env} will first set @var{var} to @var{value} before running the command. -@item eshell-debug [error | form | process]@dots{} @cmindex eshell-debug +@item eshell-debug [error | form | process]@dots{} Toggle debugging information for Eshell itself. You can pass this command one or more of the following arguments: @@ -768,30 +768,30 @@ buffer @code{*eshell last cmd*}; or @end itemize -@item exit @cmindex exit +@item exit @vindex eshell-kill-on-exit Exit Eshell and save the history. By default, this command kills the Eshell buffer, but if @code{eshell-kill-on-exit} is @code{nil}, then the buffer is merely buried instead. -@item export [@var{name}=@var{value}]@dots{} @cmindex export +@item export [@var{name}=@var{value}]@dots{} Set environment variables using input like Bash's @command{export}, as in @samp{export @var{var1}=@var{val1} @var{var2}=@var{val2} @dots{}}. -@item grep [@var{arg}]@dots{} @cmindex grep -@itemx agrep [@var{arg}]@dots{} +@item grep [@var{arg}]@dots{} @cmindex agrep -@itemx egrep [@var{arg}]@dots{} +@itemx agrep [@var{arg}]@dots{} @cmindex egrep -@itemx fgrep [@var{arg}]@dots{} +@itemx egrep [@var{arg}]@dots{} @cmindex fgrep -@itemx rgrep [@var{arg}]@dots{} +@itemx fgrep [@var{arg}]@dots{} @cmindex rgrep -@itemx glimpse [@var{arg}]@dots{} +@itemx rgrep [@var{arg}]@dots{} @cmindex glimpse +@itemx glimpse [@var{arg}]@dots{} The @command{grep} commands are compatible with GNU @command{grep}, but open a compilation buffer in @code{grep-mode} instead. @xref{Grep Searching, , , emacs, The GNU Emacs Manual}. @@ -803,9 +803,9 @@ to Eshell's buffer. This is the same as using @samp{alias grep '*grep $@@*'}, though this setting applies to all of the built-in commands for which you would need to create a separate alias. +@cmindex history @item history [@var{n}] @itemx history [-arw] [@var{filename}] -@cmindex history Prints Eshell's input history. With a numeric argument @var{n}, this command prints the @var{n} most recent items in the history. Alternately, you can specify the following options: @@ -824,8 +824,8 @@ Write the current history list to the history file. @end table -@item info [@var{manual} [@var{item}]@dots{}] @cmindex info +@item info [@var{manual} [@var{item}]@dots{}] Browse the available Info documentation. With no arguments, browse the top-level menu. Otherwise, show the manual for @var{manual}, selecting the menu entry for @var{item}. @@ -834,25 +834,25 @@ This command is the same as the external @command{info} command, but uses Emacs's internal Info reader. @xref{Misc Help, , , emacs, The GNU Emacs Manual}. -@item jobs @cmindex jobs +@item jobs List subprocesses of the Emacs process, if any, using the function @code{list-processes}. -@item kill [-@var{signal}] [@var{pid} | @var{process}] @cmindex kill +@item kill [-@var{signal}] [@var{pid} | @var{process}] Kill processes. Takes a PID or a process object and an optional @var{signal} specifier which can either be a number or a signal name. -@item listify [@var{arg}]@dots{} @cmindex listify +@item listify [@var{arg}]@dots{} Return the arguments as a single list. With a single argument, return it as-is if it's already a list, or otherwise wrap it in a list. With multiple arguments, return a list of all of them. +@cmindex ln @item ln [@var{option}]@dots{} @var{target} [@var{link-name}] @itemx ln [@var{option}]@dots{} @var{target}@dots{} @var{directory} -@cmindex ln Create a link to the specified @var{target} named @var{link-name} or create links to multiple @var{targets} in @var{directory}. @@ -886,8 +886,8 @@ Print the name of each file before linking it. @end table -@item locate @var{arg}@dots{} @cmindex locate +@item locate @var{arg}@dots{} Alias to Emacs's @code{locate} function, which simply runs the external @command{locate} command and parses the results. @xref{Dired and Find, , , emacs, The GNU Emacs Manual}. @@ -897,8 +897,8 @@ If @code{eshell-plain-locate-behavior} is non-@code{nil}, then Emacs's internal @code{locate} is not used. This is the same as using @samp{alias locate '*locate $@@*'}. -@item ls [@var{option}]@dots{} [@var{file}]@dots{} @cmindex ls +@item ls [@var{option}]@dots{} [@var{file}]@dots{} List information about each @var{file}, including the contents of any specified directories. If @var{file} is unspecified, list the contents of the current directory. @@ -999,25 +999,25 @@ List one file per line. @end table -@item make [@var{arg}]@dots{} @cmindex make +@item make [@var{arg}]@dots{} Run @command{make} through @code{compile} when run asynchronously (e.g., @samp{make &}). @xref{Compilation, , , emacs, The GNU Emacs Manual}. Otherwise call the external @command{make} command. -@item man [@var{arg}]@dots{} @cmindex man +@item man [@var{arg}]@dots{} Display Man pages using the Emacs @code{man} command. @xref{Man Page, , , emacs, The GNU Emacs Manual}. -@item mkdir [-p] @var{directory}@dots{} @cmindex mkdir +@item mkdir [-p] @var{directory}@dots{} Make new directories. With @code{-p} or @code{--parents}, automatically make any necessary parent directories as well. +@cmindex mv @item mv [@var{option}]@dots{} @var{source} @var{dest} @itemx mv [@var{option}]@dots{} @var{source}@dots{} @var{directory} -@cmindex mv Rename the file @var{source} to @var{dest} or move @var{source} into @var{directory}. @@ -1048,14 +1048,14 @@ Print the name of each item before moving it. @end table -@item occur @var{regexp} [@var{nlines}] @cmindex occur +@item occur @var{regexp} [@var{nlines}] Alias to Emacs's @code{occur}. @xref{Other Repeating Search, , , emacs, The GNU Emacs Manual}. +@cmindex popd @item popd @item popd +@var{n} -@cmindex popd Pop a directory from the directory stack and switch to a another place in the stack. This command can take the following forms: @@ -1071,14 +1071,14 @@ the @var{nth} directory in the stack (counting from zero). @end table -@item printnl [@var{arg}]@dots{} @cmindex printnl +@item printnl [@var{arg}]@dots{} Print all the @var{arg}s separated by newlines. +@cmindex pushd @item pushd @itemx pushd @var{directory} @itemx pushd +@var{n} -@cmindex pushd Push the current directory onto the directory stack, then change to another directory. This command can take the following forms: @@ -1107,12 +1107,12 @@ non-@code{nil}, then @samp{pushd +@var{n}} will instead pop the @end table -@item pwd @cmindex pwd +@item pwd Prints the current working directory. -@item rm [@var{option}]@dots{} @var{item}@dots{} @cmindex rm +@item rm [@var{option}]@dots{} @var{item}@dots{} Removes files, buffers, processes, or Emacs Lisp symbols, depending on the type of each @var{item}. @@ -1146,59 +1146,59 @@ Print the name of each item before removing it. @end table -@item rmdir @var{directory}@dots{} @cmindex rmdir +@item rmdir @var{directory}@dots{} Removes directories if they are empty. -@item set [@var{var} @var{value}]@dots{} @cmindex set +@item set [@var{var} @var{value}]@dots{} Set variable values, using the function @code{set} like a command (@pxref{Setting Variables,,, elisp, GNU Emacs Lisp Reference Manual}). The value of @var{var} can be a symbol, in which case it refers to a Lisp variable, or a string, referring to an environment variable (@pxref{Arguments}). -@item setq [@var{symbol} @var{value}]@dots{} @cmindex setq +@item setq [@var{symbol} @var{value}]@dots{} Set variable values, using the function @code{setq} like a command (@pxref{Setting Variables,,, elisp, GNU Emacs Lisp Reference Manual}). -@item source @var{file} [@var{argument}]@dots{} @cmindex source +@item source @var{file} [@var{argument}]@dots{} Source an Eshell script named @var{file} in a subshell environment, passing any @var{argument}s to the script (@pxref{Scripts}). This is not to be confused with the command @command{.}, which sources a file in the current environment. -@item time @var{command}@dots{} @cmindex time +@item time @var{command}@dots{} Show the time elapsed during the execution of @var{command}. +@cmindex umask @item umask [-S] @itemx umask @var{mode} -@cmindex umask View the default file permissions for newly created files and directories. If you pass @code{-S} or @code{--symbolic}, view the mode symbolically. With @var{mode}, set the default permissions to this value. -@item unset [@var{var}]@dots{} @cmindex unset +@item unset [@var{var}]@dots{} Unset one or more variables. As with @command{set}, the value of @var{var} can be a symbol, in which case it refers to a Lisp variable, or a string, referring to an environment variable. -@item wait [@var{process}]@dots{} @cmindex wait +@item wait [@var{process}]@dots{} Wait until each specified @var{process} has exited. -@item which @var{command}@dots{} @cmindex which +@item which @var{command}@dots{} For each @var{command}, identify what kind of command it is and its location. -@item whoami @cmindex whoami +@item whoami Print the current user. This Eshell version of @command{whoami} is connection-aware, so for remote directories, it will print the user associated with that connection. @@ -2601,17 +2601,17 @@ external commands. To enable it, add @code{eshell-tramp} to @table @code -@item su [- | -l] [@var{user}] @cmindex su +@item su [- | -l] [@var{user}] Uses TRAMP's @command{su} method (@pxref{Inline methods, , , tramp, The Tramp Manual}) to change the current user to @var{user} (or root if unspecified). With @code{-}, @code{-l}, or @code{--login}, provide a login environment. -@item sudo [-u @var{user}] [-s | @var{command}@dots{}] @cmindex sudo -@itemx doas [-u @var{user}] [-s | @var{command}@dots{}] +@item sudo [-u @var{user}] [-s | @var{command}@dots{}] @cmindex doas +@itemx doas [-u @var{user}] [-s | @var{command}@dots{}] Uses TRAMP's @command{sudo} or @command{doas} method (@pxref{Inline methods, , , tramp, The Tramp Manual}) to run @var{command} as root via @command{sudo} or @command{doas}. When specifying @code{-u @@ -2630,59 +2630,59 @@ add @code{eshell-xtra} to @code{eshell-modules-list}. @table @code -@item count @var{item} @var{seq} [@var{option}]@dots{} @cmindex count +@item count @var{item} @var{seq} [@var{option}]@dots{} A wrapper around the function @code{cl-count} (@pxref{Searching Sequences,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item expr @var{str} [@var{separator}] [@var{arg}]@dots{} @cmindex expr +@item expr @var{str} [@var{separator}] [@var{arg}]@dots{} An implementation of @command{expr} using the Calc package. @xref{Top,,, calc, The GNU Emacs Calculator}. -@item ff @var{directory} @var{pattern} @cmindex ff +@item ff @var{directory} @var{pattern} Shorthand for the the function @code{find-name-dired} (@pxref{Dired and Find, , , emacs, The Emacs Editor}). -@item gf @var{directory} @var{regexp} @cmindex gf +@item gf @var{directory} @var{regexp} Shorthand for the the function @code{find-grep-dired} (@pxref{Dired and Find, , , emacs, The Emacs Editor}). -@item intersection @var{list1} @var{list2} [@var{option}]@dots{} @cmindex intersection +@item intersection @var{list1} @var{list2} [@var{option}]@dots{} A wrapper around the function @code{cl-intersection} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item mismatch @var{seq1} @var{seq2} [@var{option}]@dots{} @cmindex mismatch +@item mismatch @var{seq1} @var{seq2} [@var{option}]@dots{} A wrapper around the function @code{cl-mismatch} (@pxref{Searching Sequences,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item set-difference @var{list1} @var{list2} [@var{option}]@dots{} @cmindex set-difference +@item set-difference @var{list1} @var{list2} [@var{option}]@dots{} A wrapper around the function @code{cl-set-difference} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item set-exclusive-or @var{list1} @var{list2} [@var{option}]@dots{} @cmindex set-exclusive-or +@item set-exclusive-or @var{list1} @var{list2} [@var{option}]@dots{} A wrapper around the function @code{cl-set-exclusive-or} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item substitute @var{new} @var{old} @var{seq} [@var{option}]@dots{} @cmindex substitute +@item substitute @var{new} @var{old} @var{seq} [@var{option}]@dots{} A wrapper around the function @code{cl-substitute} (@pxref{Sequence Functions,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. -@item union @var{list1} @var{list2} [@var{option}]@dots{} @cmindex union +@item union @var{list1} @var{list2} [@var{option}]@dots{} A wrapper around the function @code{cl-union} (@pxref{Lists as Sets,,, cl, GNU Emacs Common Lisp Emulation}). This command can be used for comparing lists of strings. From de5acc3b0d854aeb7dbf104c0977efe2f2266e1a Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 8 Feb 2024 11:44:05 -0800 Subject: [PATCH 101/446] Add concept indices for some Eshell commands * doc/misc/eshell.texi (List of Built-ins): Add indices for some directory- and process-related commands. (Aliases): Change to concept index. --- doc/misc/eshell.texi | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 3ff8e55ed03..30c85da795b 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -3,7 +3,7 @@ @setfilename ../../info/eshell.info @settitle Eshell: The Emacs Shell @include docstyle.texi -@defindex cm +@defcodeindex cm @syncodeindex vr fn @c %**end of header @@ -529,6 +529,7 @@ symlink, then this command reverts to the system's definition of @command{cat}. @cmindex cd +@cindex directories, changing @item cd @itemx cd @var{directory} @itemx cd -[@var{n}] @@ -666,6 +667,7 @@ as using @samp{alias diff '*diff $@@*'}. Return the directory component of @var{filename}. @cmindex dirs +@cindex directory stack, listing @item dirs Prints the directory stack. Directories can be added or removed from the stack using the commands @command{pushd} and @command{popd}, @@ -835,11 +837,13 @@ uses Emacs's internal Info reader. @xref{Misc Help, , , emacs, The GNU Emacs Manual}. @cmindex jobs +@cindex processes, listing @item jobs List subprocesses of the Emacs process, if any, using the function @code{list-processes}. @cmindex kill +@cindex processes, signaling @item kill [-@var{signal}] [@var{pid} | @var{process}] Kill processes. Takes a PID or a process object and an optional @var{signal} specifier which can either be a number or a signal name. @@ -1054,6 +1058,7 @@ Alias to Emacs's @code{occur}. @xref{Other Repeating Search, , , emacs, The GNU Emacs Manual}. @cmindex popd +@cindex directory stack, removing from @item popd @item popd +@var{n} Pop a directory from the directory stack and switch to a another place @@ -1076,6 +1081,7 @@ the @var{nth} directory in the stack (counting from zero). Print all the @var{arg}s separated by newlines. @cmindex pushd +@cindex directory stack, adding to @item pushd @itemx pushd @var{directory} @itemx pushd +@var{n} @@ -1189,6 +1195,7 @@ Unset one or more variables. As with @command{set}, the value of or a string, referring to an environment variable. @cmindex wait +@cindex processes, waiting for @item wait [@var{process}]@dots{} Wait until each specified @var{process} has exited. @@ -1501,7 +1508,7 @@ create and switch to a directory called @samp{foo}. @node Remote Access @section Remote Access -@cmindex remote access +@cindex remote access Since Eshell uses Emacs facilities for most of its functionality, you can access remote hosts transparently. To connect to a remote host, From 6568a9a0099e7745bfd142a0fd16b4d7215c0250 Mon Sep 17 00:00:00 2001 From: Mekeor Melire Date: Wed, 7 Feb 2024 23:00:08 +0100 Subject: [PATCH 102/446] Add option gnus-mode-line-logo * lisp/gnus/gnus.el (gnus-mode-line-logo): New option specifying whether and which logo will be displayed in the mode-line. * etc/NEWS: Announce the change. --- etc/NEWS | 5 +++++ lisp/gnus/gnus.el | 29 ++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 4d3c652aebc..76862bf500d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1102,6 +1102,11 @@ The gmane.org website is, sadly, down since a number of years with no prospect of it coming back. Therefore, it is no longer valid to set the user option 'nnweb-type' to 'gmane'. +*** New user option 'gnus-mode-line-logo'. +This allows the user to either disable the display of any logo or +specify which logo will be displayed as part of the +buffer-identification in the mode-line of Gnus-buffers. + ** Rmail --- diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index 99833e4eeca..cf4c3f7841c 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -309,12 +309,30 @@ be set in `.emacs' instead." :group 'gnus-start :type 'boolean) +(defcustom gnus-mode-line-logo + '((:type svg :file "gnus-pointer.svg" :ascent center) + (:type xpm :file "gnus-pointer.xpm" :ascent center) + (:type xbm :file "gnus-pointer.xbm" :ascent center)) + "Gnus logo displayed in mode-line. + +If non-nil, it should be a list of image specifications that will be +given as first argument to `find-image', which see. Then, in case of a +graphical display, the specified Gnus logo will be displayed as part of +the buffer-identification in the mode-line of Gnus-buffers. + +If nil, no logo will be displayed." + :group 'gnus-visual + :type '(choice + (repeat :tag "List of image specifications" (plist)) + (const :tag "No logo" nil))) + (defun gnus-mode-line-buffer-identification (line) (let* ((str (car-safe line)) (str (if (stringp str) (car (propertized-buffer-identification str)) str))) - (if (or (not (fboundp 'find-image)) + (if (or (not gnus-mode-line-logo) + (not (fboundp 'find-image)) (not (display-graphic-p)) (not (stringp str)) (not (string-match "^Gnus:" str))) @@ -325,14 +343,7 @@ be set in `.emacs' instead." (add-text-properties 0 5 (list 'display - (find-image - '((:type svg :file "gnus-pointer.svg" - :ascent center) - (:type xpm :file "gnus-pointer.xpm" - :ascent center) - (:type xbm :file "gnus-pointer.xbm" - :ascent center)) - t) + (find-image gnus-mode-line-logo t) 'help-echo (if gnus-emacs-version (format "This is %s, %s." From e7d1b12878ed83ad8c6995d8443f3367750ff0c9 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 10 Feb 2024 15:02:39 +0800 Subject: [PATCH 103/446] Make miscellaneous improvements to the Android port * java/org/gnu/emacs/EmacsActivity.java (onCreate): Deal with omitted calls to onWindowFocusChanged after activity recreation. * java/org/gnu/emacs/EmacsService.java (clearWindow, clearArea): Delete redundant wrapper functions. (getUsefulContentResolver, getContentResolverContext): Delete functions. (openContentUri, checkContentUri): Stop searching for an activity content resolver, as that's actually not necessary. * src/android.c (android_init_emacs_service) (android_init_emacs_window, android_clear_window) (android_clear_area): Adjust to match. --- java/org/gnu/emacs/EmacsActivity.java | 4 ++ java/org/gnu/emacs/EmacsService.java | 67 +-------------------------- src/android.c | 23 +++++---- 3 files changed, 16 insertions(+), 78 deletions(-) diff --git a/java/org/gnu/emacs/EmacsActivity.java b/java/org/gnu/emacs/EmacsActivity.java index b821694b18a..66a1e41d84c 100644 --- a/java/org/gnu/emacs/EmacsActivity.java +++ b/java/org/gnu/emacs/EmacsActivity.java @@ -247,6 +247,10 @@ public class EmacsActivity extends Activity } super.onCreate (savedInstanceState); + + /* Call `onWindowFocusChanged' to read the focus state, which fails + to be called after an activity is recreated. */ + onWindowFocusChanged (false); } @Override diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index b65b10b9528..d17ba597d8e 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -449,21 +449,6 @@ invocation of app_process (through android-emacs) can EmacsDrawPoint.perform (drawable, gc, x, y); } - public void - clearWindow (EmacsWindow window) - { - checkEmacsThread (); - window.clearWindow (); - } - - public void - clearArea (EmacsWindow window, int x, int y, int width, - int height) - { - checkEmacsThread (); - window.clearArea (x, y, width, height); - } - @SuppressWarnings ("deprecation") public void ringBell (int duration) @@ -926,48 +911,6 @@ invocation of app_process (through android-emacs) can /* Content provider functions. */ - /* Return a ContentResolver capable of accessing as many files as - possible, namely the content resolver of the last selected - activity if available: only they posses the rights to access drag - and drop files. */ - - public ContentResolver - getUsefulContentResolver () - { - EmacsActivity activity; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) - /* Since the system predates drag and drop, return this resolver - to avoid any unforeseen difficulties. */ - return resolver; - - activity = EmacsActivity.lastFocusedActivity; - if (activity == null) - return resolver; - - return activity.getContentResolver (); - } - - /* Return a context whose ContentResolver is granted access to most - files, as in `getUsefulContentResolver'. */ - - public Context - getContentResolverContext () - { - EmacsActivity activity; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) - /* Since the system predates drag and drop, return this resolver - to avoid any unforeseen difficulties. */ - return this; - - activity = EmacsActivity.lastFocusedActivity; - if (activity == null) - return this; - - return activity; - } - /* Open a content URI described by the bytes BYTES, a non-terminated string; make it writable if WRITABLE, and readable if READABLE. Truncate the file if TRUNCATE. @@ -981,9 +924,6 @@ invocation of app_process (through android-emacs) can String name, mode; ParcelFileDescriptor fd; int i; - ContentResolver resolver; - - resolver = getUsefulContentResolver (); /* Figure out the file access mode. */ @@ -1045,12 +985,8 @@ invocation of app_process (through android-emacs) can ParcelFileDescriptor fd; Uri uri; int rc, flags; - Context context; - ContentResolver resolver; ParcelFileDescriptor descriptor; - context = getContentResolverContext (); - uri = Uri.parse (name); flags = 0; @@ -1060,7 +996,7 @@ invocation of app_process (through android-emacs) can if (writable) flags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION; - rc = context.checkCallingUriPermission (uri, flags); + rc = checkCallingUriPermission (uri, flags); if (rc == PackageManager.PERMISSION_GRANTED) return true; @@ -1074,7 +1010,6 @@ invocation of app_process (through android-emacs) can try { - resolver = context.getContentResolver (); descriptor = resolver.openFileDescriptor (uri, "r"); return true; } diff --git a/src/android.c b/src/android.c index 46f4dcd5546..4d56df1da3f 100644 --- a/src/android.c +++ b/src/android.c @@ -113,6 +113,8 @@ struct android_emacs_window jmethodID define_cursor; jmethodID damage_rect; jmethodID recreate_activity; + jmethodID clear_window; + jmethodID clear_area; }; struct android_emacs_cursor @@ -1605,10 +1607,6 @@ android_init_emacs_service (void) FIND_METHOD (draw_point, "drawPoint", "(Lorg/gnu/emacs/EmacsDrawable;" "Lorg/gnu/emacs/EmacsGC;II)V"); - FIND_METHOD (clear_window, "clearWindow", - "(Lorg/gnu/emacs/EmacsWindow;)V"); - FIND_METHOD (clear_area, "clearArea", - "(Lorg/gnu/emacs/EmacsWindow;IIII)V"); FIND_METHOD (ring_bell, "ringBell", "(I)V"); FIND_METHOD (query_tree, "queryTree", "(Lorg/gnu/emacs/EmacsWindow;)[S"); @@ -1832,6 +1830,8 @@ android_init_emacs_window (void) android_damage_window. */ FIND_METHOD (damage_rect, "damageRect", "(IIII)V"); FIND_METHOD (recreate_activity, "recreateActivity", "()V"); + FIND_METHOD (clear_window, "clearWindow", "()V"); + FIND_METHOD (clear_area, "clearArea", "(IIII)V"); #undef FIND_METHOD } @@ -3431,10 +3431,9 @@ android_clear_window (android_window handle) window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); (*android_java_env)->CallNonvirtualVoidMethod (android_java_env, - emacs_service, - service_class.class, - service_class.clear_window, - window); + window, + window_class.class, + window_class.clear_window); android_exception_check (); } @@ -4745,10 +4744,10 @@ android_clear_area (android_window handle, int x, int y, window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); (*android_java_env)->CallNonvirtualVoidMethod (android_java_env, - emacs_service, - service_class.class, - service_class.clear_area, - window, (jint) x, (jint) y, + window, + window_class.class, + window_class.clear_area, + (jint) x, (jint) y, (jint) width, (jint) height); } From 6195a57b8e8ebff4eaaf4ff8d62719cbd55f579f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 09:28:11 +0200 Subject: [PATCH 104/446] ; Improve documentation of a recent change in Gnus * lisp/image.el (find-image): Doc fix. * lisp/gnus/gnus.el (gnus-mode-line-logo): Fix doc string and :type texts. Add :version. (Bug#68985) --- etc/NEWS | 1 + lisp/gnus/gnus.el | 15 ++++++++------- lisp/image.el | 26 +++++++++++++++----------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 76862bf500d..ca0a5ed8fc8 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1102,6 +1102,7 @@ The gmane.org website is, sadly, down since a number of years with no prospect of it coming back. Therefore, it is no longer valid to set the user option 'nnweb-type' to 'gmane'. +--- *** New user option 'gnus-mode-line-logo'. This allows the user to either disable the display of any logo or specify which logo will be displayed as part of the diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index cf4c3f7841c..dab66b60205 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -313,18 +313,19 @@ be set in `.emacs' instead." '((:type svg :file "gnus-pointer.svg" :ascent center) (:type xpm :file "gnus-pointer.xpm" :ascent center) (:type xbm :file "gnus-pointer.xbm" :ascent center)) - "Gnus logo displayed in mode-line. + "Image spec for the Gnus logo to be displayed in mode-line. -If non-nil, it should be a list of image specifications that will be -given as first argument to `find-image', which see. Then, in case of a -graphical display, the specified Gnus logo will be displayed as part of +If non-nil, it should be a list of image specifications to be passed +as the first argument to `find-image', which see. Then, if the display +is capable of showing images, the Gnus logo will be displayed as part of the buffer-identification in the mode-line of Gnus-buffers. -If nil, no logo will be displayed." +If nil, there will be no Gnus logo in the mode-line." :group 'gnus-visual :type '(choice - (repeat :tag "List of image specifications" (plist)) - (const :tag "No logo" nil))) + (repeat :tag "List of Gnus logo image specifications" (plist)) + (const :tag "Don't display Gnus logo" nil)) + :version "30.1") (defun gnus-mode-line-buffer-identification (line) (let* ((str (car-safe line)) diff --git a/lisp/image.el b/lisp/image.el index 73801f88d1e..2ebce59a98c 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -759,21 +759,25 @@ BUFFER nil or omitted means use the current buffer." ;;;###autoload (defun find-image (specs &optional cache) - "Find an image, choosing one of a list of image specifications. + "Find an image that satisfies one of a list of image specifications. SPECS is a list of image specifications. -Each image specification in SPECS is a property list. The contents of -a specification are image type dependent. All specifications must at -least contain either the property `:file FILE' or `:data DATA', -where FILE is the file to load the image from, and DATA is a string -containing the actual image data. If the property `:type TYPE' is -omitted or nil, try to determine the image type from its first few +Each image specification in SPECS is a property list. The +contents of a specification are image type dependent; see the +info node `(elisp)Image Descriptors' for details. All specifications +must at least contain either the property `:file FILE' or `:data DATA', +where FILE is the file from which to load the image, and DATA is a +string containing the actual image data. If the property `:type TYPE' +is omitted or nil, try to determine the image type from its first few bytes of image data. If that doesn't work, and the property `:file -FILE' provide a file name, use its file extension as image type. -If `:type TYPE' is provided, it must match the actual type -determined for FILE or DATA by `create-image'. Return nil if no -specification is satisfied. +FILE' provide a file name, use its file extension as idication of the +image type. If `:type TYPE' is provided, it must match the actual type +determined for FILE or DATA by `create-image'. + +The function returns the image specification for the first specification +in the list whose TYPE is supported and FILE, if specified, exists. It +returns nil if no specification in the list can be satisfied. If CACHE is non-nil, results are cached and returned on subsequent calls. From 4330eb2864181e49ace5736665c45d8683a5ce1d Mon Sep 17 00:00:00 2001 From: john muhl Date: Thu, 25 Jan 2024 21:23:45 -0600 Subject: [PATCH 105/446] Fix volume refresh bug in mpc * lisp/mpc.el (mpc-volume-refresh): Only refresh volume when mpd is playing. When stopped or paused, volume is nil. (Bug#68785) --- lisp/mpc.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lisp/mpc.el b/lisp/mpc.el index 9577e0f2f42..768c70c2e3a 100644 --- a/lisp/mpc.el +++ b/lisp/mpc.el @@ -1867,11 +1867,14 @@ A value of t means the main playlist.") (defvar mpc-volume nil) (put 'mpc-volume 'risky-local-variable t) (defun mpc-volume-refresh () - ;; Maintain the volume. - (setq mpc-volume - (mpc-volume-widget - (string-to-number (cdr (assq 'volume mpc-status))))) - (let ((status-buf (mpc-proc-buffer (mpc-proc) 'status))) + "Maintain the volume." + (let ((status-buf (mpc-proc-buffer (mpc-proc) 'status)) + (status-vol (cdr (assq 'volume mpc-status)))) + ;; If MPD is paused or stopped the volume is nil. + (when status-vol + (setq mpc-volume + (mpc-volume-widget + (string-to-number status-vol)))) (when (buffer-live-p status-buf) (with-current-buffer status-buf (force-mode-line-update))))) From 59b849d1eaffb8babb208f6a39c5e0dbc73e3127 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 10:35:18 +0200 Subject: [PATCH 106/446] Run 'read-only-mode-hook' when visiting a file that is not writable * lisp/files.el (after-find-file): Run 'read-only-mode-hook' when the visited file is not writable. (Bug#68648) --- lisp/files.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/files.el b/lisp/files.el index 229771810fb..f67b650cb92 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -2747,6 +2747,10 @@ Fifth arg NOMODES non-nil means don't alter the file's modes. Finishes by calling the functions in `find-file-hook' unless NOMODES is non-nil." (setq buffer-read-only (not (file-writable-p buffer-file-name))) + ;; The above is sufficiently like turning on read-only-mode, so run + ;; the mode hook here by hand. + (if buffer-read-only + (run-hooks 'read-only-mode-hook)) (if noninteractive nil (let* (not-serious From 55aea7967604112343ff67597cbe9fc20acd9196 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 10 Feb 2024 09:50:12 +0100 Subject: [PATCH 107/446] Fix warning in tramp-register-archive-autoload-file-name-handler * lisp/net/tramp-archive.el (tramp-register-archive-autoload-file-name-handler): Do not use read syntax #' for `tramp-archive-file-name-handler', it isn't autoloaded. --- lisp/net/tramp-archive.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el index 752462d8fa3..59c4223794c 100644 --- a/lisp/net/tramp-archive.el +++ b/lisp/net/tramp-archive.el @@ -387,9 +387,11 @@ arguments to pass to the OPERATION." ;;;###autoload (progn (defun tramp-register-archive-autoload-file-name-handler () "Add archive file name handler to `file-name-handler-alist'." + ;; Do not use read syntax #' for `tramp-archive-file-name-handler', it + ;; isn't autoloaded. (when (and tramp-archive-enabled (not - (rassq #'tramp-archive-file-name-handler file-name-handler-alist))) + (rassq 'tramp-archive-file-name-handler file-name-handler-alist))) (add-to-list 'file-name-handler-alist (cons (tramp-archive-autoload-file-name-regexp) #'tramp-archive-autoload-file-name-handler)) From 20f7a022f817eaed5f6889d9a892c22fc46f0d2f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 11:04:22 +0200 Subject: [PATCH 108/446] Avoid errors in winner.el's 'post-command-hook' * lisp/winner.el (winner-save-old-configurations): Don't save configuration of dead frames. (Bug#68977) --- lisp/winner.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/winner.el b/lisp/winner.el index 2aa59a86b25..19641a05bfc 100644 --- a/lisp/winner.el +++ b/lisp/winner.el @@ -178,7 +178,8 @@ You may want to include buffer names such as *Help*, *Apropos*, (setq winner-last-frames nil) (setq winner-last-command this-command)) (dolist (frame winner-modified-list) - (winner-insert-if-new frame)) + (if (frame-live-p frame) + (winner-insert-if-new frame))) (setq winner-modified-list nil) (winner-remember))) From 86c5b7c49c0b61413e41f8a95a2f0c7f09cd1db7 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 11:10:08 +0200 Subject: [PATCH 109/446] * lisp/bind-key.el (personal-keybindings): Autoload it (bug#68999). --- lisp/bind-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/bind-key.el b/lisp/bind-key.el index 94a39f795cd..378ad69b2bc 100644 --- a/lisp/bind-key.el +++ b/lisp/bind-key.el @@ -155,6 +155,7 @@ add keys to that keymap." (add-to-list 'emulation-mode-map-alists `((override-global-mode . ,override-global-map))) +;;;###autoload (defvar personal-keybindings nil "List of bindings performed by `bind-key'. From 13ee21eb48bedc1779985c3f60010aadbbd99630 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 11:20:22 +0200 Subject: [PATCH 110/446] Support Info files compressed by 'lzip' * lisp/info.el (Info-suffix-list): Support lzip compression of Info files. (Bug#69004) --- lisp/info.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/info.el b/lisp/info.el index e91cc7b8e54..d4d9085a787 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -499,6 +499,7 @@ or `Info-virtual-nodes'." (".info.bz2" . ("bzip2" "-dc")) (".info.xz" . "unxz") (".info.zst" . ("zstd" "-dc")) + (".info.lz" . ("lzip" "-dc")) (".info" . nil) ("-info.Z" . "uncompress") ("-info.Y" . "unyabba") @@ -507,6 +508,7 @@ or `Info-virtual-nodes'." ("-info.z" . "gunzip") ("-info.xz" . "unxz") ("-info.zst" . ("zstd" "-dc")) + ("-info.lz" . ("lzip" "-dc")) ("-info" . nil) ("/index.Z" . "uncompress") ("/index.Y" . "unyabba") @@ -515,6 +517,7 @@ or `Info-virtual-nodes'." ("/index.bz2" . ("bzip2" "-dc")) ("/index.xz" . "unxz") ("/index.zst" . ("zstd" "-dc")) + ("/index.lz" . ("lzip" "-dc")) ("/index" . nil) (".Z" . "uncompress") (".Y" . "unyabba") @@ -523,6 +526,7 @@ or `Info-virtual-nodes'." (".bz2" . ("bzip2" "-dc")) (".xz" . "unxz") (".zst" . ("zstd" "-dc")) + (".lz" . ("lzip" "-dc")) ("" . nil))) "List of file name suffixes and associated decoding commands. Each entry should be (SUFFIX . STRING); the file is given to From 7f3baf352bad03de50135556a561af0c7fb1bd6a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 11:22:01 +0200 Subject: [PATCH 111/446] ; * etc/NEWS: Announce support of 'lzip' compressed Info files (bug#69004). --- etc/NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index ca0a5ed8fc8..5ee1509859b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -450,6 +450,9 @@ This user option associates manual names with URLs. It affects the Emacs-included manuals are set. Further associations can be added for arbitrary Info manuals. +*** Emacs can now display Info manuals compressed with 'lzip'. +This requires the 'lzip' program to be installed on your system. + +++ ** New command 'lldb'. Run the LLDB debugger, analogous to the 'gud-gdb' command. From 717d8c4285fa6eecc0bbec9b5910f028f02aab59 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Feb 2024 13:00:51 +0200 Subject: [PATCH 112/446] Don't quote 't' in doc strings * lisp/outline.el (outline-minor-mode-use-buttons): Doc fix. Patch by Arash Esbati . (Bug#69012) --- lisp/outline.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/outline.el b/lisp/outline.el index 96e0d0df205..724263ef3d2 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -318,8 +318,8 @@ Using the value `insert' is not recommended in editable buffers because it modifies them. When the value is `in-margins', then clickable buttons are displayed in the margins before the headings. -When the value is `t', clickable buttons are displayed -in the buffer before the headings. The values `t' and +When the value is t, clickable buttons are displayed +in the buffer before the headings. The values t and `in-margins' can be used in editing buffers because they don't modify the buffer." ;; The value `insert' is not intended to be customizable. From 7e8b1863af8c820c2969c1a4666ae4451cbcea92 Mon Sep 17 00:00:00 2001 From: Damien Cassou Date: Wed, 7 Feb 2024 20:41:44 +0100 Subject: [PATCH 113/446] Add support for deriving major modes in which-func * lisp/progmodes/which-func.el (which-func-try-to-enable) (which-func-ff-hook): Use `derived-mode-p' to check if the current major mode is within `which-func-modes' or `which-func-non-auto-modes'. (Bug#68981) --- lisp/progmodes/which-func.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el index bd68672f905..631cb3b0aef 100644 --- a/lisp/progmodes/which-func.el +++ b/lisp/progmodes/which-func.el @@ -211,7 +211,7 @@ non-nil.") (when which-function-mode (unless (local-variable-p 'which-func-mode) (setq which-func-mode (or (eq which-func-modes t) - (member major-mode which-func-modes))) + (apply #'derived-mode-p which-func-modes))) (setq which-func--use-mode-line (member which-func-display '(mode mode-and-header))) (setq which-func--use-header-line @@ -239,7 +239,7 @@ It creates the Imenu index for the buffer, if necessary." (condition-case err (if (and which-func-mode - (not (member major-mode which-func-non-auto-modes)) + (not (apply #'derived-mode-p which-func-non-auto-modes)) (or (null which-func-maxout) (< buffer-saved-size which-func-maxout) (= which-func-maxout 0))) From 55b4a743b6f3d452d98f135763b00965caba5240 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 27 Jan 2024 08:17:08 -0800 Subject: [PATCH 114/446] Record dependencies in packages installed via package-vc * lisp/emacs-lisp/package-vc.el (package-vc--unpack-1): Record a package's declared dependencies in the package's metadata file. (Bug#68761) --- lisp/emacs-lisp/package-vc.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el index db0cc515e46..fc402716dab 100644 --- a/lisp/emacs-lisp/package-vc.el +++ b/lisp/emacs-lisp/package-vc.el @@ -532,6 +532,7 @@ documentation and marking the package as installed." (setq deps)))))) (dolist (dep deps) (cl-callf version-to-list (cadr dep))) + (setf (package-desc-reqs pkg-desc) deps) (setf missing (package-vc-install-dependencies (delete-dups deps))) (setf missing (delq (assq (package-desc-name pkg-desc) missing) From 939187fd7a07249a1a76d98e8d91051fa76b8727 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sat, 10 Feb 2024 17:30:27 +0100 Subject: [PATCH 115/446] ; Fix 'thing-at-point' edge case involving overlapping matches * lisp/thingatpt.el (thing-at-point-looking-at): When finding a match that ends before point, continue searching from the beginning of that match, not its end, in case the match we're looking is overlapping with this one. * test/lisp/thingatpt-tests.el (thing-at-point-looking-at-overlapping-matches): New test. --- lisp/thingatpt.el | 3 ++- test/lisp/thingatpt-tests.el | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el index b532bafff82..83ddc640d35 100644 --- a/lisp/thingatpt.el +++ b/lisp/thingatpt.el @@ -621,13 +621,14 @@ Optional argument DISTANCE limits search for REGEXP forward and back from point." (let* ((old (point)) (beg (if distance (max (point-min) (- old distance)) (point-min))) - (end (and distance (min (point-max) (+ old distance)))) + (end (if distance (min (point-max) (+ old distance)))) prev match) (save-excursion (goto-char beg) (while (and (setq prev (point) match (re-search-forward regexp end t)) (< (match-end 0) old)) + (goto-char (match-beginning 0)) ;; Avoid inflooping when `regexp' matches the empty string. (unless (< prev (point)) (forward-char)))) (and match (<= (match-beginning 0) old (match-end 0))))) diff --git a/test/lisp/thingatpt-tests.el b/test/lisp/thingatpt-tests.el index 56bc4fdc9dc..e50738f1122 100644 --- a/test/lisp/thingatpt-tests.el +++ b/test/lisp/thingatpt-tests.el @@ -182,6 +182,13 @@ position to retrieve THING.") (should (thing-at-point-looking-at "2abcd")) (should (equal (match-data) m2))))) +(ert-deftest thing-at-point-looking-at-overlapping-matches () + (with-temp-buffer + (insert "foo.bar.baz") + (goto-char (point-max)) + (should (thing-at-point-looking-at "[a-z]+\\.[a-z]+")) + (should (string= "bar.baz" (match-string 0))))) + (ert-deftest test-symbol-thing-1 () (with-temp-buffer (insert "foo bar zot") From 0a01b998d13027e5672592f9e60919aa683bad9e Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 10 Feb 2024 19:34:23 +0200 Subject: [PATCH 116/446] * lisp/menu-bar.el (menu-bar-showhide-menu): Add "Outlines" (bug#68979). The menu item "Outlines" toggles 'outline-minor-mode' when one of outline-search-function/outline-regexp/outline-level is defined in the current buffer. --- lisp/menu-bar.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 47c6a8f0613..5b290899ff5 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1353,6 +1353,15 @@ mail status in mode line")) (frame-visible-p (symbol-value 'speedbar-frame)))))) + (bindings--define-key menu [showhide-outline-minor-mode] + '(menu-item "Outlines" outline-minor-mode + :help "Turn outline-minor-mode on/off" + :visible (seq-some #'local-variable-p + '(outline-search-function + outline-regexp outline-level)) + :button (:toggle . (and (boundp 'outline-minor-mode) + outline-minor-mode)))) + (bindings--define-key menu [showhide-tab-line-mode] '(menu-item "Window Tab Line" global-tab-line-mode :help "Turn window-local tab-lines on/off" From 3e5aba883770312536ca7a8f289bf679e55802f5 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 10 Feb 2024 19:56:39 +0200 Subject: [PATCH 117/446] * lisp/buff-menu.el: Force other-window commands to use other window. (Buffer-menu-other-window, Buffer-menu-switch-other-window): Let-bind 'display-buffer-overriding-action' to '(nil (inhibit-same-window . t))' that will force the buffer to be displayed in another window in any case (bug#68978). --- lisp/buff-menu.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 10ea99eae9a..e13c3b56b4e 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -592,13 +592,17 @@ If UNMARK is non-nil, unmark them." (defun Buffer-menu-other-window () "Select this line's buffer in other window, leaving buffer menu visible." (interactive nil Buffer-menu-mode) - (switch-to-buffer-other-window (Buffer-menu-buffer t))) + (let ((display-buffer-overriding-action + '(nil (inhibit-same-window . t)))) + (switch-to-buffer-other-window (Buffer-menu-buffer t)))) (defun Buffer-menu-switch-other-window () "Make the other window select this line's buffer. The current window remains selected." (interactive nil Buffer-menu-mode) - (display-buffer (Buffer-menu-buffer t) t)) + (let ((display-buffer-overriding-action + '(nil (inhibit-same-window . t)))) + (display-buffer (Buffer-menu-buffer t) t))) (defun Buffer-menu-2-window () "Select this line's buffer, with previous buffer in second window." From 7a0ee5d65f214102734dd22edb641b164a1b73af Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Sat, 10 Feb 2024 10:33:51 -0800 Subject: [PATCH 118/446] Fix behavior of gnus-summary-very-wide-reply with prefix arg * lisp/gnus/gnus-msg.el (gnus-summary-very-wide-reply): If a prefix argument has been given, the value of YANK will be a list containing the current article number. This should not be used to retrieve a number of work articles; that should be derived from the value of the current-prefix-arg (or marked articles). * doc/misc/gnus.texi: The interplay of prefix arg and marked articles is complex; attempt to clarify. --- doc/misc/gnus.texi | 9 +++++---- lisp/gnus/gnus-msg.el | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 08554d0d9b9..2f8f97e5845 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -5832,10 +5832,11 @@ message to the mailing list, and include the original message @kindex S v @r{(Summary)} @findex gnus-summary-very-wide-reply Mail a very wide reply to the author of the current article -(@code{gnus-summary-very-wide-reply}). A @dfn{very wide reply} is a reply -that goes out to all people listed in the @code{To}, @code{From} (or -@code{Reply-To}) and @code{Cc} headers in all the process/prefixed -articles. This command uses the process/prefix convention. +(@code{gnus-summary-very-wide-reply}). A @dfn{very wide reply} is a +reply that goes out to all people listed in the @code{To}, @code{From} +(or @code{Reply-To}) and @code{Cc} headers in all the process/prefixed +articles. This command uses the process/prefix convention. If given a +prefix argument, the body of the current article will also be yanked. @item S V @kindex S V @r{(Summary)} diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el index fdf97e1aabd..b18ede58fbf 100644 --- a/lisp/gnus/gnus-msg.el +++ b/lisp/gnus/gnus-msg.el @@ -1189,12 +1189,12 @@ Uses the process/prefix convention. The reply will include all From/Cc headers from the original messages as the To/Cc headers. -If prefix argument YANK is non-nil, the original article(s) will +If prefix argument YANK is non-nil, the original article will be yanked automatically." (interactive (list (and current-prefix-arg (gnus-summary-work-articles 1))) gnus-summary-mode) - (gnus-summary-reply yank t (gnus-summary-work-articles yank))) + (gnus-summary-reply yank t (gnus-summary-work-articles current-prefix-arg))) (defun gnus-summary-very-wide-reply-with-original (n) "Start composing a very wide reply mail a set of messages. From e67e7185ce81e59c90741f92c2ba3209412f417e Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 11 Feb 2024 10:00:33 +0800 Subject: [PATCH 119/446] Fix signed/unsigned promotion errors involving Emacs_Rectangle * src/androidterm.c (android_note_mouse_movement): * src/pgtkterm.c (note_mouse_movement): * src/xdisp.c (get_glyph_string_clip_rects, remember_mouse_glyph) (expose_area, expose_window, gui_intersect_rectangles): Cast width or height fields in Emacs_Rectangles to int before summing with or subtracting them from their coordinate fields, as they are unsigned outside X, and the sign of the coordinates is thus not preserved. --- src/androidterm.c | 4 ++-- src/pgtkterm.c | 4 ++-- src/xdisp.c | 33 +++++++++++++++++---------------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/androidterm.c b/src/androidterm.c index d4612bb20fa..2bd2b45743d 100644 --- a/src/androidterm.c +++ b/src/androidterm.c @@ -495,8 +495,8 @@ android_note_mouse_movement (struct frame *frame, /* Has the mouse moved off the glyph it was on at the last sighting? */ r = &dpyinfo->last_mouse_glyph; if (frame != dpyinfo->last_mouse_glyph_frame - || event->x < r->x || event->x >= r->x + r->width - || event->y < r->y || event->y >= r->y + r->height) + || event->x < r->x || event->x >= r->x + (int) r->width + || event->y < r->y || event->y >= r->y + (int) r->height) { frame->mouse_moved = true; note_mouse_highlight (frame, event->x, event->y); diff --git a/src/pgtkterm.c b/src/pgtkterm.c index b731f52983d..1ec6bfcda4e 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c @@ -5825,8 +5825,8 @@ note_mouse_movement (struct frame *frame, /* Has the mouse moved off the glyph it was on at the last sighting? */ r = &dpyinfo->last_mouse_glyph; if (frame != dpyinfo->last_mouse_glyph_frame - || event->x < r->x || event->x >= r->x + r->width - || event->y < r->y || event->y >= r->y + r->height) + || event->x < r->x || event->x >= r->x + (int) r->width + || event->y < r->y || event->y >= r->y + (int) r->height) { frame->mouse_moved = true; dpyinfo->last_mouse_scroll_bar = NULL; diff --git a/src/xdisp.c b/src/xdisp.c index 2dcf0d58a14..0b8347214c7 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -2508,7 +2508,7 @@ get_glyph_string_clip_rects (struct glyph_string *s, NativeRectangle *rects, int r.x = s->clip_head->x; } if (s->clip_tail) - if (r.x + r.width > s->clip_tail->x + s->clip_tail->background_width) + if (r.x + (int) r.width > s->clip_tail->x + s->clip_tail->background_width) { if (s->clip_tail->x + s->clip_tail->background_width >= r.x) r.width = s->clip_tail->x + s->clip_tail->background_width - r.x; @@ -2588,7 +2588,7 @@ get_glyph_string_clip_rects (struct glyph_string *s, NativeRectangle *rects, int height = max (FRAME_LINE_HEIGHT (s->f), glyph->ascent + glyph->descent); if (height < r.height) { - max_y = r.y + r.height; + max_y = r.y + (int) r.height; r.y = min (max_y, max (r.y, s->ybase + glyph->descent - height)); r.height = min (max_y - r.y, height); } @@ -2629,7 +2629,7 @@ get_glyph_string_clip_rects (struct glyph_string *s, NativeRectangle *rects, int if (s->for_overlaps & OVERLAPS_PRED) { rs[i] = r; - if (r.y + r.height > row_y) + if (r.y + (int) r.height > row_y) { if (r.y < row_y) rs[i].height = row_y - r.y; @@ -2643,10 +2643,10 @@ get_glyph_string_clip_rects (struct glyph_string *s, NativeRectangle *rects, int rs[i] = r; if (r.y < row_y + s->row->visible_height) { - if (r.y + r.height > row_y + s->row->visible_height) + if (r.y + (int) r.height > row_y + s->row->visible_height) { rs[i].y = row_y + s->row->visible_height; - rs[i].height = r.y + r.height - rs[i].y; + rs[i].height = r.y + (int) r.height - rs[i].y; } else rs[i].height = 0; @@ -2831,7 +2831,7 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) text_glyph: gr = 0; gy = 0; for (; r <= end_row && r->enabled_p; ++r) - if (r->y + r->height > y) + if (r->y + (int) r->height > y) { gr = r; gy = r->y; break; @@ -2931,7 +2931,7 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) row_glyph: gr = 0, gy = 0; for (; r <= end_row && r->enabled_p; ++r) - if (r->y + r->height > y) + if (r->y + (int) r->height > y) { gr = r; gy = r->y; break; @@ -36464,7 +36464,7 @@ expose_area (struct window *w, struct glyph_row *row, const Emacs_Rectangle *r, /* Use a signed int intermediate value to avoid catastrophic failures due to comparison between signed and unsigned, when x is negative (can happen for wide images that are hscrolled). */ - int r_end = r->x + r->width; + int r_end = r->x + (int) r->width; while (last < end && x < r_end) { x += last->pixel_width; @@ -36763,7 +36763,7 @@ expose_window (struct window *w, const Emacs_Rectangle *fr) /* Use a signed int intermediate value to avoid catastrophic failures due to comparison between signed and unsigned, when y0 or y1 is negative (can happen for tall images). */ - int r_bottom = r.y + r.height; + int r_bottom = r.y + (int) r.height; /* We must temporarily switch to the window's buffer, in case the fringe face has been remapped in that buffer's @@ -36810,7 +36810,7 @@ expose_window (struct window *w, const Emacs_Rectangle *fr) /* We must redraw a row overlapping the exposed area. */ if (y0 < r.y ? y0 + row->phys_height > r.y - : y0 + row->ascent - row->phys_ascent < r.y +r.height) + : y0 + row->ascent - row->phys_ascent < r.y + (int) r.height) { if (first_overlapping_row == NULL) first_overlapping_row = row; @@ -36989,7 +36989,7 @@ gui_intersect_rectangles (const Emacs_Rectangle *r1, const Emacs_Rectangle *r2, const Emacs_Rectangle *upper, *lower; bool intersection_p = false; - /* Rearrange so that R1 is the left-most rectangle. */ + /* Rearrange so that left is the left-most rectangle. */ if (r1->x < r2->x) left = r1, right = r2; else @@ -36997,13 +36997,14 @@ gui_intersect_rectangles (const Emacs_Rectangle *r1, const Emacs_Rectangle *r2, /* X0 of the intersection is right.x0, if this is inside R1, otherwise there is no intersection. */ - if (right->x <= left->x + left->width) + if (right->x <= left->x + (int) left->width) { result->x = right->x; /* The right end of the intersection is the minimum of the right ends of left and right. */ - result->width = (min (left->x + left->width, right->x + right->width) + result->width = (min (left->x + (int) left->width, + right->x + (int) right->width) - result->x); /* Same game for Y. */ @@ -37014,14 +37015,14 @@ gui_intersect_rectangles (const Emacs_Rectangle *r1, const Emacs_Rectangle *r2, /* The upper end of the intersection is lower.y0, if this is inside of upper. Otherwise, there is no intersection. */ - if (lower->y <= upper->y + upper->height) + if (lower->y <= upper->y + (int) upper->height) { result->y = lower->y; /* The lower end of the intersection is the minimum of the lower ends of upper and lower. */ - result->height = (min (lower->y + lower->height, - upper->y + upper->height) + result->height = (min (lower->y + (int) lower->height, + upper->y + (int) upper->height) - result->y); intersection_p = true; } From 9f9da26e0dcb242327af7cd8414fad7afedbbaa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Lema=C3=AEtre?= Date: Sun, 11 Feb 2024 05:00:38 +0200 Subject: [PATCH 120/446] Handle typescript ts grammar breaking change for function_expression Starting from version 0.20.4 of the typescript/tsx grammar, "function" becomes "function_expression". The right expression is used depending on the grammar version. * lisp/progmodes/typescript-ts-mode.el (tsx-ts-mode--font-lock-compatibility-function-expression): New function (bug#69024). (typescript-ts-mode--font-lock-settings): Use it. Copyright-paperwork-exempt: yes --- lisp/progmodes/typescript-ts-mode.el | 288 ++++++++++++++------------- 1 file changed, 151 insertions(+), 137 deletions(-) diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el index 89ca47571eb..7021f012dcd 100644 --- a/lisp/progmodes/typescript-ts-mode.el +++ b/lisp/progmodes/typescript-ts-mode.el @@ -199,183 +199,197 @@ Argument LANGUAGE is either `typescript' or `tsx'." [(nested_identifier (identifier)) (identifier)] @typescript-ts-jsx-tag-face))))) +(defun tsx-ts-mode--font-lock-compatibility-function-expression (language) + "Handle tree-sitter grammar breaking change for `function' expression. + +LANGUAGE can be `typescript' or `tsx'. Starting from version 0.20.4 of the +typescript/tsx grammar, `function' becomes `function_expression'." + (condition-case nil + (progn (treesit-query-capture language '((function_expression) @cap)) + ;; New version of the grammar + 'function_expression) + (treesit-query-error + ;; Old version of the grammar + 'function))) + (defun typescript-ts-mode--font-lock-settings (language) "Tree-sitter font-lock settings. Argument LANGUAGE is either `typescript' or `tsx'." - (treesit-font-lock-rules - :language language - :feature 'comment - `([(comment) (hash_bang_line)] @font-lock-comment-face) + (let ((func-exp (tsx-ts-mode--font-lock-compatibility-function-expression language))) + (treesit-font-lock-rules + :language language + :feature 'comment + `([(comment) (hash_bang_line)] @font-lock-comment-face) - :language language - :feature 'constant - `(((identifier) @font-lock-constant-face - (:match "\\`[A-Z_][0-9A-Z_]*\\'" @font-lock-constant-face)) - [(true) (false) (null)] @font-lock-constant-face) + :language language + :feature 'constant + `(((identifier) @font-lock-constant-face + (:match "\\`[A-Z_][0-9A-Z_]*\\'" @font-lock-constant-face)) + [(true) (false) (null)] @font-lock-constant-face) - :language language - :feature 'keyword - `([,@typescript-ts-mode--keywords] @font-lock-keyword-face - [(this) (super)] @font-lock-keyword-face) + :language language + :feature 'keyword + `([,@typescript-ts-mode--keywords] @font-lock-keyword-face + [(this) (super)] @font-lock-keyword-face) - :language language - :feature 'string - `((regex pattern: (regex_pattern)) @font-lock-regexp-face - (string) @font-lock-string-face - (template_string) @js--fontify-template-string - (template_substitution ["${" "}"] @font-lock-misc-punctuation-face)) + :language language + :feature 'string + `((regex pattern: (regex_pattern)) @font-lock-regexp-face + (string) @font-lock-string-face + (template_string) @js--fontify-template-string + (template_substitution ["${" "}"] @font-lock-misc-punctuation-face)) - :language language - :override t ;; for functions assigned to variables - :feature 'declaration - `((function - name: (identifier) @font-lock-function-name-face) - (function_declaration - name: (identifier) @font-lock-function-name-face) - (function_signature - name: (identifier) @font-lock-function-name-face) + :language language + :override t ;; for functions assigned to variables + :feature 'declaration + `((,func-exp + name: (identifier) @font-lock-function-name-face) + (function_declaration + name: (identifier) @font-lock-function-name-face) + (function_signature + name: (identifier) @font-lock-function-name-face) - (method_definition - name: (property_identifier) @font-lock-function-name-face) - (method_signature - name: (property_identifier) @font-lock-function-name-face) - (required_parameter (identifier) @font-lock-variable-name-face) - (optional_parameter (identifier) @font-lock-variable-name-face) + (method_definition + name: (property_identifier) @font-lock-function-name-face) + (method_signature + name: (property_identifier) @font-lock-function-name-face) + (required_parameter (identifier) @font-lock-variable-name-face) + (optional_parameter (identifier) @font-lock-variable-name-face) - (variable_declarator - name: (identifier) @font-lock-function-name-face - value: [(function) (arrow_function)]) + (variable_declarator + name: (identifier) @font-lock-function-name-face + value: [(,func-exp) (arrow_function)]) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) - (enum_declaration (identifier) @font-lock-type-face) + (enum_declaration (identifier) @font-lock-type-face) - (extends_clause value: (identifier) @font-lock-type-face) - ;; extends React.Component - (extends_clause value: (member_expression - object: (identifier) @font-lock-type-face - property: (property_identifier) @font-lock-type-face)) + (extends_clause value: (identifier) @font-lock-type-face) + ;; extends React.Component + (extends_clause value: (member_expression + object: (identifier) @font-lock-type-face + property: (property_identifier) @font-lock-type-face)) - (arrow_function - parameter: (identifier) @font-lock-variable-name-face) + (arrow_function + parameter: (identifier) @font-lock-variable-name-face) - (variable_declarator - name: (array_pattern - (identifier) - (identifier) @font-lock-function-name-face) - value: (array (number) (function))) + (variable_declarator + name: (array_pattern + (identifier) + (identifier) @font-lock-function-name-face) + value: (array (number) (,func-exp))) - (catch_clause - parameter: (identifier) @font-lock-variable-name-face) + (catch_clause + parameter: (identifier) @font-lock-variable-name-face) - ;; full module imports - (import_clause (identifier) @font-lock-variable-name-face) - ;; named imports with aliasing - (import_clause (named_imports (import_specifier - alias: (identifier) @font-lock-variable-name-face))) - ;; named imports without aliasing - (import_clause (named_imports (import_specifier - !alias - name: (identifier) @font-lock-variable-name-face))) + ;; full module imports + (import_clause (identifier) @font-lock-variable-name-face) + ;; named imports with aliasing + (import_clause (named_imports (import_specifier + alias: (identifier) @font-lock-variable-name-face))) + ;; named imports without aliasing + (import_clause (named_imports (import_specifier + !alias + name: (identifier) @font-lock-variable-name-face))) - ;; full namespace import (* as alias) - (import_clause (namespace_import (identifier) @font-lock-variable-name-face))) + ;; full namespace import (* as alias) + (import_clause (namespace_import (identifier) @font-lock-variable-name-face))) - :language language - :feature 'identifier - `((nested_type_identifier - module: (identifier) @font-lock-type-face) + :language language + :feature 'identifier + `((nested_type_identifier + module: (identifier) @font-lock-type-face) - (type_identifier) @font-lock-type-face + (type_identifier) @font-lock-type-face - (predefined_type) @font-lock-type-face + (predefined_type) @font-lock-type-face - (new_expression - constructor: (identifier) @font-lock-type-face) + (new_expression + constructor: (identifier) @font-lock-type-face) - (enum_body (property_identifier) @font-lock-type-face) + (enum_body (property_identifier) @font-lock-type-face) - (enum_assignment name: (property_identifier) @font-lock-type-face) + (enum_assignment name: (property_identifier) @font-lock-type-face) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) - (for_in_statement - left: (identifier) @font-lock-variable-name-face) + (for_in_statement + left: (identifier) @font-lock-variable-name-face) - (arrow_function - parameters: - [(_ (identifier) @font-lock-variable-name-face) - (_ (_ (identifier) @font-lock-variable-name-face)) - (_ (_ (_ (identifier) @font-lock-variable-name-face)))])) + (arrow_function + parameters: + [(_ (identifier) @font-lock-variable-name-face) + (_ (_ (identifier) @font-lock-variable-name-face)) + (_ (_ (_ (identifier) @font-lock-variable-name-face)))])) - :language language - :feature 'property - `((property_signature - name: (property_identifier) @font-lock-property-name-face) - (public_field_definition - name: (property_identifier) @font-lock-property-name-face) + :language language + :feature 'property + `((property_signature + name: (property_identifier) @font-lock-property-name-face) + (public_field_definition + name: (property_identifier) @font-lock-property-name-face) - (pair key: (property_identifier) @font-lock-property-use-face) + (pair key: (property_identifier) @font-lock-property-use-face) - ((shorthand_property_identifier) @font-lock-property-use-face)) + ((shorthand_property_identifier) @font-lock-property-use-face)) - :language language - :feature 'expression - '((assignment_expression - left: [(identifier) @font-lock-function-name-face - (member_expression - property: (property_identifier) @font-lock-function-name-face)] - right: [(function) (arrow_function)])) + :language language + :feature 'expression + `((assignment_expression + left: [(identifier) @font-lock-function-name-face + (member_expression + property: (property_identifier) @font-lock-function-name-face)] + right: [(,func-exp) (arrow_function)])) - :language language - :feature 'function - '((call_expression - function: - [(identifier) @font-lock-function-call-face - (member_expression - property: (property_identifier) @font-lock-function-call-face)])) + :language language + :feature 'function + '((call_expression + function: + [(identifier) @font-lock-function-call-face + (member_expression + property: (property_identifier) @font-lock-function-call-face)])) - :language language - :feature 'pattern - `((pair_pattern - key: (property_identifier) @font-lock-property-use-face - value: [(identifier) @font-lock-variable-name-face - (assignment_pattern left: (identifier) @font-lock-variable-name-face)]) + :language language + :feature 'pattern + `((pair_pattern + key: (property_identifier) @font-lock-property-use-face + value: [(identifier) @font-lock-variable-name-face + (assignment_pattern left: (identifier) @font-lock-variable-name-face)]) - (array_pattern (identifier) @font-lock-variable-name-face) + (array_pattern (identifier) @font-lock-variable-name-face) - ((shorthand_property_identifier_pattern) @font-lock-variable-name-face)) + ((shorthand_property_identifier_pattern) @font-lock-variable-name-face)) - :language language - :feature 'jsx - (append (tsx-ts-mode--font-lock-compatibility-bb1f97b language) - `((jsx_attribute (property_identifier) @typescript-ts-jsx-attribute-face))) + :language language + :feature 'jsx + (append (tsx-ts-mode--font-lock-compatibility-bb1f97b language) + `((jsx_attribute (property_identifier) @typescript-ts-jsx-attribute-face))) - :language language - :feature 'number - `((number) @font-lock-number-face - ((identifier) @font-lock-number-face - (:match "\\`\\(?:NaN\\|Infinity\\)\\'" @font-lock-number-face))) + :language language + :feature 'number + `((number) @font-lock-number-face + ((identifier) @font-lock-number-face + (:match "\\`\\(?:NaN\\|Infinity\\)\\'" @font-lock-number-face))) - :language language - :feature 'operator - `([,@typescript-ts-mode--operators] @font-lock-operator-face - (ternary_expression ["?" ":"] @font-lock-operator-face)) + :language language + :feature 'operator + `([,@typescript-ts-mode--operators] @font-lock-operator-face + (ternary_expression ["?" ":"] @font-lock-operator-face)) - :language language - :feature 'bracket - '((["(" ")" "[" "]" "{" "}"]) @font-lock-bracket-face) + :language language + :feature 'bracket + '((["(" ")" "[" "]" "{" "}"]) @font-lock-bracket-face) - :language language - :feature 'delimiter - '((["," "." ";" ":"]) @font-lock-delimiter-face) + :language language + :feature 'delimiter + '((["," "." ";" ":"]) @font-lock-delimiter-face) - :language language - :feature 'escape-sequence - :override t - '((escape_sequence) @font-lock-escape-face))) + :language language + :feature 'escape-sequence + :override t + '((escape_sequence) @font-lock-escape-face)))) ;;;###autoload (define-derived-mode typescript-ts-base-mode prog-mode "TypeScript" From 30b4d902326546ca2b383d56caadbe0adaf0fe89 Mon Sep 17 00:00:00 2001 From: Mekeor Melire Date: Fri, 9 Feb 2024 23:30:52 +0100 Subject: [PATCH 121/446] In Info-url-alist, add .html extension to %e format-sequence * lisp/info.el (Info-url-for-node): Implement the change. (Bug#68970) (Info-url-alist): Document the change. * test/lisp/info-tests.el (test-info-urls): Adjust tests to account for the change and add a test for the "Top" node. --- lisp/info.el | 31 +++++++++++++++++-------------- test/lisp/info-tests.el | 16 +++++++++------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/lisp/info.el b/lisp/info.el index d4d9085a787..176bc9c0033 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -231,8 +231,9 @@ Each element of this list has the form (MANUALs . URL-SPEC). MANUALs represents the name of one or more manuals. It can either be a string or a list of strings. URL-SPEC can be a string in which the substring \"%m\" will be expanded to the -manual-name, \"%n\" to the node-name, and \"%e\" to the -URL-encoded node-name (without a `.html' suffix). (The +manual-name and \"%n\" to the node-name. \"%e\" will expand to +the URL-encoded node-name, including the `.html' extension; in +case of the Top node, it will expand to the empty string. (The URL-encoding of the node-name mimics GNU Texinfo, as documented at Info node `(texinfo)HTML Xref Node Name Expansion'.) Alternatively, URL-SPEC can be a function which is given @@ -1928,18 +1929,20 @@ NODE should be a string of the form \"(manual)Node\"." ;; (info "(texinfo) HTML Xref Node Name Expansion") (if (equal node "Top") "" - (url-hexify-string - (string-replace " " "-" - (mapconcat - (lambda (ch) - (if (or (< ch 32) ; ^@^A-^Z^[^\^]^^^- - (<= 33 ch 47) ; !"#$%&'()*+,-./ - (<= 58 ch 64) ; :;<=>?@ - (<= 91 ch 96) ; [\]_` - (<= 123 ch 127)) ; {|}~ DEL - (format "_00%x" ch) - (char-to-string ch))) - node "")))))) + (concat + (url-hexify-string + (string-replace " " "-" + (mapconcat + (lambda (ch) + (if (or (< ch 32) ; ^@^A-^Z^[^\^]^^^- + (<= 33 ch 47) ; !"#$%&'()*+,-./ + (<= 58 ch 64) ; :;<=>?@ + (<= 91 ch 96) ; [\]_` + (<= 123 ch 127)) ; {|}~ DEL + (format "_00%x" ch) + (char-to-string ch))) + node ""))) + ".html")))) (cond ((stringp url-spec) (format-spec url-spec diff --git a/test/lisp/info-tests.el b/test/lisp/info-tests.el index 0dfdbf417e8..8020a7419cf 100644 --- a/test/lisp/info-tests.el +++ b/test/lisp/info-tests.el @@ -28,18 +28,20 @@ (require 'ert-x) (ert-deftest test-info-urls () + (should (equal (Info-url-for-node "(tramp)Top") + "https://www.gnu.org/software/emacs/manual/html_node/tramp/")) (should (equal (Info-url-for-node "(emacs)Minibuffer") - "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer")) + "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer.html")) (should (equal (Info-url-for-node "(emacs)Minibuffer File") - "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-File")) + "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-File.html")) (should (equal (Info-url-for-node "(elisp)Backups and Auto-Saving") - "https://www.gnu.org/software/emacs/manual/html_node/elisp/Backups-and-Auto_002dSaving")) + "https://www.gnu.org/software/emacs/manual/html_node/elisp/Backups-and-Auto_002dSaving.html")) (should (equal (Info-url-for-node "(eintr)car & cdr") - "https://www.gnu.org/software/emacs/manual/html_node/eintr/car-_0026-cdr")) + "https://www.gnu.org/software/emacs/manual/html_node/eintr/car-_0026-cdr.html")) (should (equal (Info-url-for-node "(emacs-mime)\tIndex") - "https://www.gnu.org/software/emacs/manual/html_node/emacs-mime/Index")) - (should (equal (Info-url-for-node "(gnus) Don't Panic") - "https://www.gnu.org/software/emacs/manual/html_node/gnus/Don_0027t-Panic")) + "https://www.gnu.org/software/emacs/manual/html_node/emacs-mime/Index.html")) + (should (equal (Info-url-for-node "(gnus) Don't Panic") + "https://www.gnu.org/software/emacs/manual/html_node/gnus/Don_0027t-Panic.html")) (should-error (Info-url-for-node "(nonexistent)Example"))) ;;; info-tests.el ends here From 614b244a7fa03fcb27d76757e14ef0fa895d6f23 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 11 Feb 2024 10:43:57 +0100 Subject: [PATCH 122/446] * Improve reproducibility of inferred values by native comp * lisp/emacs-lisp/comp-cstr.el (comp-normalize-valset): Do not try to reorder conses using 'sxhash-equal' as its behavior is not reproducible over different sessions. --- lisp/emacs-lisp/comp-cstr.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 812a79f070d..ecbe6e38a1d 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -203,6 +203,8 @@ Return them as multiple value." t) ((and (not (symbolp x)) (symbolp y)) nil) + ((or (consp x) (consp y) + nil)) (t (< (sxhash-equal x) (sxhash-equal y))))))) From 67486ab4158655dd8bfe0ddf7dabadc6dd21a3c1 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 11 Feb 2024 15:21:14 +0200 Subject: [PATCH 123/446] Fix 'min-width' display property in 'buffer-text-pixel-size' * src/xdisp.c (display_min_width): Don't return without doing anything when called from the move_it_* functions. This is needed to have functions that simulate display layout handle the min-width display property correctly. (Bug#68374) --- src/xdisp.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 0b8347214c7..6087a25afcc 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5612,9 +5612,6 @@ display_min_width (struct it *it, ptrdiff_t bufpos, if (!NILP (it->min_width_property) && !EQ (width_spec, it->min_width_property)) { - if (!it->glyph_row) - return; - /* When called from display_string (i.e., the mode line), we're being called with a string as the object, and we may be called with many sub-strings belonging to the same From faa46eb8667c11a0725500a50e957eb78021c99f Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 11 Feb 2024 12:31:13 +0100 Subject: [PATCH 124/446] Rename a number of native compiler functions * lisp/emacs-lisp/comp.el (comp-passes): Update. (comp-mvar): Update constructor name. (comp--loop-insn-in-block, comp--lex-byte-func-p) (comp--spill-decl-spec, comp--spill-speed) (comp--decrypt-arg-list, comp--byte-frame-size) (comp--add-func-to-ctxt, comp--spill-lap-function) (comp--intern-func-in-ctxt, comp--spill-lap-function) (comp--spill-lap, comp--lap-eob-p, comp--lap-fall-through-p) (comp--sp, comp--with-sp, comp--slot-n, comp--slot, comp-slot+1) (comp--label-to-addr, comp--mark-curr-bb-closed) (comp--bb-maybe-add, comp--call, comp--callref, make-comp-mvar) (comp--new-frame, comp--emit, comp--emit-set-call) (comp--copy-slot, comp--emit-annotation, comp--emit-setimm) (comp--make-curr-block, comp--latch-make-fill) (comp--emit-uncond-jump, comp--emit-cond-jump) (comp--emit-handler, comp--limplify-listn, comp--new-block-sym) (comp--fill-label-h, comp--jump-table-optimizable) (comp--emit-switch, comp--emit-set-call-subr, comp--op-to-fun) (comp--body-eff, comp--op-case, comp--limplify-lap-inst) (comp--emit-narg-prologue, comp--limplify-finalize-function) (comp--prepare-args-for-top-level, comp--emit-for-top-level) (comp--emit-lambda-for-top-level, comp--limplify-top-level) (comp--addr-to-bb-name, comp--limplify-block) (comp--limplify-function, comp--limplify, comp--mvar-used-p) (comp--collect-mvars, comp--collect-rhs) (comp--negate-arithm-cmp-fun, comp--reverse-arithm-fun) (comp--emit-assume, comp--maybe-add-vmvar) (comp--add-new-block-between, comp--cond-cstrs-target-mvar) (comp--add-cond-cstrs-target-block, comp--add-cond-cstrs-simple) (comp--add-cond-cstrs, comp--insert-insn, comp--emit-call-cstr) (comp--lambda-list-gen, comp--add-call-cstr, comp--add-cstrs) (comp--collect-calls, comp--pure-infer-func, comp--ipa-pure) (make--comp--ssa-mvar, comp--clean-ssa, comp--compute-edges) (comp--collect-rev-post-order, comp--compute-dominator-tree) (comp--compute-dominator-frontiers, comp--log-block-info) (comp--place-phis, comp--dom-tree-walker, comp--ssa) (comp--ssa-rename-insn, comp--ssa-rename, comp--finalize-phis) (comp--remove-unreachable-blocks, comp--ssa) (comp--fwprop-max-insns-scan, comp--copy-insn) (comp--apply-in-env, comp--fwprop-prologue) (comp--function-foldable-p, comp--function-call-maybe-fold) (comp--fwprop-call, comp--fwprop-insn, comp--fwprop*) (comp--rewrite-non-locals, comp--fwprop, comp--func-in-unit) (comp--call-optim-form-call, comp--call-optim-func) (comp--call-optim, comp--collect-mvar-ids) (comp--dead-assignments-func, comp--dead-code) (comp--form-tco-call-seq, comp--tco-func, comp--tco) (comp--remove-type-hints-func, comp--remove-type-hints) (comp--args-to-lambda-list, comp--compute-function-type) (comp--finalize-container, comp--finalize-relocs) (comp--compile-ctxt-to-file, comp--final1, comp--final) (comp--make-lambda-list-from-subr, comp-trampoline-compile) (comp--write-bytecode-file): Rename and/or update due to renaming. * test/src/comp-resources/comp-test-funcs.el (comp-test-copy-insn-f): Update. * src/comp.c (Fcomp__compile_ctxt_to_file0): Rename. (syms_of_comp): Update. --- lisp/emacs-lisp/comp.el | 972 +++++++++++---------- src/comp.c | 6 +- test/src/comp-resources/comp-test-funcs.el | 4 +- 3 files changed, 492 insertions(+), 490 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index dcdc973e6c5..6879e6aeeb9 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -43,7 +43,7 @@ (defvar native-comp-eln-load-path) (defvar native-comp-enable-subr-trampolines) -(declare-function comp--compile-ctxt-to-file "comp.c") +(declare-function comp--compile-ctxt-to-file0 "comp.c") (declare-function comp--init-ctxt "comp.c") (declare-function comp--release-ctxt "comp.c") (declare-function comp-el-to-eln-filename "comp.c") @@ -155,17 +155,17 @@ native compilation runs.") "Current allocation class. Can be one of: `d-default', `d-impure' or `d-ephemeral'. See `comp-ctxt'.") -(defconst comp-passes '(comp-spill-lap - comp-limplify - comp-fwprop - comp-call-optim - comp-ipa-pure - comp-add-cstrs - comp-fwprop - comp-tco - comp-fwprop - comp-remove-type-hints - comp-final) +(defconst comp-passes '(comp--spill-lap + comp--limplify + comp--fwprop + comp--call-optim + comp--ipa-pure + comp--add-cstrs + comp--fwprop + comp--tco + comp--fwprop + comp--remove-type-hints + comp--final) "Passes to be executed in order.") (defvar comp-disabled-passes '() @@ -388,7 +388,7 @@ This is typically for top-level forms other than defun.") (closed nil :type boolean :documentation "t if closed.") ;; All the following are for SSA and CGF analysis. - ;; Keep in sync with `comp-clean-ssa'!! + ;; Keep in sync with `comp--clean-ssa'!! (in-edges () :type list :documentation "List of incoming edges.") (out-edges () :type list @@ -416,7 +416,7 @@ into it.") :documentation "Start block LAP address.") (non-ret-insn nil :type list :documentation "Insn known to perform a non local exit. -`comp-fwprop' may identify and store here basic blocks performing +`comp--fwprop' may identify and store here basic blocks performing non local exits and mark it rewrite it later.") (no-ret nil :type boolean :documentation "t when the block is known to perform a @@ -507,7 +507,7 @@ CFG is mutated by a pass.") (lambda-list nil :type list :documentation "Original lambda-list.")) -(cl-defstruct (comp-mvar (:constructor make--comp-mvar) +(cl-defstruct (comp-mvar (:constructor make--comp-mvar0) (:include comp-cstr)) "A meta-variable being a slot in the meta-stack." (id nil :type (or null number) @@ -516,6 +516,7 @@ CFG is mutated by a pass.") :documentation "Slot number in the array if a number or `scratch' for scratch slot.")) +;; In use by comp.c. (defun comp-mvar-type-hint-match-p (mvar type-hint) "Match MVAR against TYPE-HINT. In use by the back-end." @@ -636,7 +637,7 @@ VERBOSITY is a number between 0 and 3." -(defmacro comp-loop-insn-in-block (basic-block &rest body) +(defmacro comp--loop-insn-in-block (basic-block &rest body) "Loop over all insns in BASIC-BLOCK executing BODY. Inside BODY, `insn' and `insn-cell'can be used to read or set the current instruction or its cell." @@ -650,19 +651,19 @@ current instruction or its cell." ;;; spill-lap pass specific code. -(defun comp-lex-byte-func-p (f) +(defun comp--lex-byte-func-p (f) "Return t if F is a lexically-scoped byte compiled function." (and (byte-code-function-p f) (fixnump (aref f 0)))) -(defun comp-spill-decl-spec (function-name spec) +(defun comp--spill-decl-spec (function-name spec) "Return the declared specifier SPEC for FUNCTION-NAME." (plist-get (cdr (assq function-name byte-to-native-plist-environment)) spec)) -(defun comp-spill-speed (function-name) +(defun comp--spill-speed (function-name) "Return the speed for FUNCTION-NAME." - (or (comp-spill-decl-spec function-name 'speed) + (or (comp--spill-decl-spec function-name 'speed) (comp-ctxt-speed comp-ctxt))) ;; Autoloaded as might be used by `disassemble-internal'. @@ -701,7 +702,7 @@ clashes." ;; pick the first one. (concat prefix crypted "_" human-readable "_0")))) -(defun comp-decrypt-arg-list (x function-name) +(defun comp--decrypt-arg-list (x function-name) "Decrypt argument list X for FUNCTION-NAME." (unless (fixnump x) (signal 'native-compiler-error-dyn-func (list function-name))) @@ -716,21 +717,21 @@ clashes." :nonrest nonrest :rest rest)))) -(defsubst comp-byte-frame-size (byte-compiled-func) +(defsubst comp--byte-frame-size (byte-compiled-func) "Return the frame size to be allocated for BYTE-COMPILED-FUNC." (aref byte-compiled-func 3)) -(defun comp-add-func-to-ctxt (func) +(defun comp--add-func-to-ctxt (func) "Add FUNC to the current compiler context." (let ((name (comp-func-name func)) (c-name (comp-func-c-name func))) (puthash name c-name (comp-ctxt-sym-to-c-name-h comp-ctxt)) (puthash c-name func (comp-ctxt-funcs-h comp-ctxt)))) -(cl-defgeneric comp-spill-lap-function (input) +(cl-defgeneric comp--spill-lap-function (input) "Byte-compile INPUT and spill lap for further stages.") -(cl-defmethod comp-spill-lap-function ((function-name symbol)) +(cl-defmethod comp--spill-lap-function ((function-name symbol)) "Byte-compile FUNCTION-NAME, spilling data from the byte compiler." (unless (comp-ctxt-output comp-ctxt) (setf (comp-ctxt-output comp-ctxt) @@ -746,9 +747,9 @@ clashes." (list (make-byte-to-native-func-def :name function-name :c-name c-name :byte-func byte-code))) - (maphash #'comp-intern-func-in-ctxt byte-to-native-lambdas-h))) + (maphash #'comp--intern-func-in-ctxt byte-to-native-lambdas-h))) -(cl-defmethod comp-spill-lap-function ((form list)) +(cl-defmethod comp--spill-lap-function ((form list)) "Byte-compile FORM, spilling data from the byte compiler." (unless (memq (car-safe form) '(lambda closure)) (signal 'native-compiler-error @@ -762,9 +763,9 @@ clashes." (list (make-byte-to-native-func-def :name '--anonymous-lambda :c-name c-name :byte-func byte-code))) - (maphash #'comp-intern-func-in-ctxt byte-to-native-lambdas-h))) + (maphash #'comp--intern-func-in-ctxt byte-to-native-lambdas-h))) -(defun comp-intern-func-in-ctxt (_ obj) +(defun comp--intern-func-in-ctxt (_ obj) "Given OBJ of type `byte-to-native-lambda', create a function in `comp-ctxt'." (when-let ((byte-func (byte-to-native-lambda-byte-func obj))) (let* ((lap (byte-to-native-lambda-lap obj)) @@ -777,9 +778,9 @@ clashes." (name (when top-l-form (byte-to-native-func-def-name top-l-form))) (c-name (comp-c-func-name (or name "anonymous-lambda") "F")) - (func (if (comp-lex-byte-func-p byte-func) + (func (if (comp--lex-byte-func-p byte-func) (make-comp-func-l - :args (comp-decrypt-arg-list (aref byte-func 0) + :args (comp--decrypt-arg-list (aref byte-func 0) name)) (make-comp-func-d :lambda-list (aref byte-func 0))))) (setf (comp-func-name func) name @@ -789,9 +790,9 @@ clashes." (comp-func-command-modes func) (command-modes byte-func) (comp-func-c-name func) c-name (comp-func-lap func) lap - (comp-func-frame-size func) (comp-byte-frame-size byte-func) - (comp-func-speed func) (comp-spill-speed name) - (comp-func-pure func) (comp-spill-decl-spec name 'pure)) + (comp-func-frame-size func) (comp--byte-frame-size byte-func) + (comp-func-speed func) (comp--spill-speed name) + (comp-func-pure func) (comp--spill-decl-spec name 'pure)) ;; Store the c-name to have it retrievable from ;; `comp-ctxt-top-level-forms'. @@ -799,11 +800,11 @@ clashes." (setf (byte-to-native-func-def-c-name top-l-form) c-name)) (unless name (puthash byte-func func (comp-ctxt-byte-func-to-func-h comp-ctxt))) - (comp-add-func-to-ctxt func) + (comp--add-func-to-ctxt func) (comp-log (format "Function %s:\n" name) 1) (comp-log lap 1 t)))) -(cl-defmethod comp-spill-lap-function ((filename string)) +(cl-defmethod comp--spill-lap-function ((filename string)) "Byte-compile FILENAME, spilling data from the byte compiler." (byte-compile-file filename) (when (or (null byte-native-qualities) @@ -828,7 +829,7 @@ clashes." collect (if (and (byte-to-native-func-def-p form) (eq -1 - (comp-spill-speed (byte-to-native-func-def-name form)))) + (comp--spill-speed (byte-to-native-func-def-name form)))) (let ((byte-code (byte-to-native-func-def-byte-func form))) (remhash byte-code byte-to-native-lambdas-h) (make-byte-to-native-top-level @@ -836,11 +837,11 @@ clashes." ',(byte-to-native-func-def-name form) ,byte-code nil) - :lexical (comp-lex-byte-func-p byte-code))) + :lexical (comp--lex-byte-func-p byte-code))) form))) - (maphash #'comp-intern-func-in-ctxt byte-to-native-lambdas-h)) + (maphash #'comp--intern-func-in-ctxt byte-to-native-lambdas-h)) -(defun comp-spill-lap (input) +(defun comp--spill-lap (input) "Byte-compile and spill the LAP representation for INPUT. If INPUT is a symbol, it is the function-name to be compiled. If INPUT is a string, it is the filename to be compiled." @@ -848,7 +849,7 @@ If INPUT is a string, it is the filename to be compiled." (byte-to-native-lambdas-h (make-hash-table :test #'eq)) (byte-to-native-top-level-forms ()) (byte-to-native-plist-environment ()) - (res (comp-spill-lap-function input))) + (res (comp--spill-lap-function input))) (comp-cstr-ctxt-update-type-slots comp-ctxt) res)) @@ -877,55 +878,55 @@ Points to the next slot to be filled.") byte-switch byte-pushconditioncase) "LAP end of basic blocks op codes.") -(defun comp-lap-eob-p (inst) +(defun comp--lap-eob-p (inst) "Return t if INST closes the current basic blocks, nil otherwise." (when (memq (car inst) comp-lap-eob-ops) t)) -(defun comp-lap-fall-through-p (inst) +(defun comp--lap-fall-through-p (inst) "Return t if INST falls through, nil otherwise." (when (not (memq (car inst) '(byte-goto byte-return))) t)) -(defsubst comp-sp () +(defsubst comp--sp () "Current stack pointer." (declare (gv-setter (lambda (val) `(setf (comp-limplify-sp comp-pass) ,val)))) (comp-limplify-sp comp-pass)) -(defmacro comp-with-sp (sp &rest body) +(defmacro comp--with-sp (sp &rest body) "Execute BODY setting the stack pointer to SP. Restore the original value afterwards." (declare (debug (form body)) (indent defun)) (let ((sym (gensym))) - `(let ((,sym (comp-sp))) - (setf (comp-sp) ,sp) + `(let ((,sym (comp--sp))) + (setf (comp--sp) ,sp) (progn ,@body) - (setf (comp-sp) ,sym)))) + (setf (comp--sp) ,sym)))) -(defsubst comp-slot-n (n) +(defsubst comp--slot-n (n) "Slot N into the meta-stack." (comp-vec-aref (comp-limplify-frame comp-pass) n)) -(defsubst comp-slot () +(defsubst comp--slot () "Current slot into the meta-stack pointed by sp." - (comp-slot-n (comp-sp))) + (comp--slot-n (comp--sp))) -(defsubst comp-slot+1 () +(defsubst comp--slot+1 () "Slot into the meta-stack pointed by sp + 1." - (comp-slot-n (1+ (comp-sp)))) + (comp--slot-n (1+ (comp--sp)))) -(defsubst comp-label-to-addr (label) +(defsubst comp--label-to-addr (label) "Find the address of LABEL." (or (gethash label (comp-limplify-label-to-addr comp-pass)) (signal 'native-ice (list "label not found" label)))) -(defsubst comp-mark-curr-bb-closed () +(defsubst comp--mark-curr-bb-closed () "Mark the current basic block as closed." (setf (comp-block-closed (comp-limplify-curr-block comp-pass)) t)) -(defun comp-bb-maybe-add (lap-addr &optional sp) +(defun comp--bb-maybe-add (lap-addr &optional sp) "If necessary create a pending basic block for LAP-ADDR with stack depth SP. The basic block is returned regardless it was already declared or not." (let ((bb (or (cl-loop ; See if the block was already limplified. @@ -943,24 +944,24 @@ The basic block is returned regardless it was already declared or not." (signal 'native-ice (list "incoherent stack pointers" sp (comp-block-lap-sp bb)))) bb) - (car (push (make--comp-block-lap lap-addr sp (comp-new-block-sym)) + (car (push (make--comp-block-lap lap-addr sp (comp--new-block-sym)) (comp-limplify-pending-blocks comp-pass)))))) -(defsubst comp-call (func &rest args) +(defsubst comp--call (func &rest args) "Emit a call for function FUNC with ARGS." `(call ,func ,@args)) -(defun comp-callref (func nargs stack-off) +(defun comp--callref (func nargs stack-off) "Emit a call using narg abi for FUNC. NARGS is the number of arguments. STACK-OFF is the index of the first slot frame involved." `(callref ,func ,@(cl-loop repeat nargs for sp from stack-off - collect (comp-slot-n sp)))) + collect (comp--slot-n sp)))) -(cl-defun make-comp-mvar (&key slot (constant nil const-vld) type neg) +(cl-defun make--comp-mvar (&key slot (constant nil const-vld) type neg) "`comp-mvar' initializer." - (let ((mvar (make--comp-mvar :slot slot))) + (let ((mvar (make--comp-mvar0 :slot slot))) (when const-vld (comp--add-const-to-relocs constant) (setf (comp-cstr-imm mvar) constant)) @@ -970,49 +971,49 @@ STACK-OFF is the index of the first slot frame involved." (setf (comp-mvar-neg mvar) t)) mvar)) -(defun comp-new-frame (size vsize &optional ssa) +(defun comp--new-frame (size vsize &optional ssa) "Return a clean frame of meta variables of size SIZE and VSIZE. If SSA is non-nil, populate it with m-var in ssa form." (cl-loop with v = (make-comp-vec :beg (- vsize) :end size) for i from (- vsize) below size for mvar = (if ssa - (make-comp-ssa-mvar :slot i) - (make-comp-mvar :slot i)) + (make--comp--ssa-mvar :slot i) + (make--comp-mvar :slot i)) do (setf (comp-vec-aref v i) mvar) finally return v)) -(defun comp-emit (insn) +(defun comp--emit (insn) "Emit INSN into basic block BB." (let ((bb (comp-limplify-curr-block comp-pass))) (cl-assert (not (comp-block-closed bb))) (push insn (comp-block-insns bb)))) -(defun comp-emit-set-call (call) +(defun comp--emit-set-call (call) "Emit CALL assigning the result to the current slot frame. If the callee function is known to have a return type, propagate it." (cl-assert call) - (comp-emit (list 'set (comp-slot) call))) + (comp--emit (list 'set (comp--slot) call))) -(defun comp-copy-slot (src-n &optional dst-n) +(defun comp--copy-slot (src-n &optional dst-n) "Set slot number DST-N to slot number SRC-N as source. If DST-N is specified, use it; otherwise assume it to be the current slot." - (comp-with-sp (or dst-n (comp-sp)) - (let ((src-slot (comp-slot-n src-n))) + (comp--with-sp (or dst-n (comp--sp)) + (let ((src-slot (comp--slot-n src-n))) (cl-assert src-slot) - (comp-emit `(set ,(comp-slot) ,src-slot))))) + (comp--emit `(set ,(comp--slot) ,src-slot))))) -(defsubst comp-emit-annotation (str) +(defsubst comp--emit-annotation (str) "Emit annotation STR." - (comp-emit `(comment ,str))) + (comp--emit `(comment ,str))) -(defsubst comp-emit-setimm (val) +(defsubst comp--emit-setimm (val) "Set constant VAL to current slot." (comp--add-const-to-relocs val) ;; Leave relocation index nil on purpose, will be fixed-up in final ;; by `comp-finalize-relocs'. - (comp-emit `(setimm ,(comp-slot) ,val))) + (comp--emit `(setimm ,(comp--slot) ,val))) -(defun comp-make-curr-block (block-name entry-sp &optional addr) +(defun comp--make-curr-block (block-name entry-sp &optional addr) "Create a basic block with BLOCK-NAME and set it as current block. ENTRY-SP is the sp value when entering. Add block to the current function and return it." @@ -1024,104 +1025,104 @@ Add block to the current function and return it." (puthash (comp-block-name bb) bb (comp-func-blocks comp-func)) bb)) -(defun comp-latch-make-fill (target) +(defun comp--latch-make-fill (target) "Create a latch pointing to TARGET and fill it. Return the created latch." - (let ((latch (make-comp-latch :name (comp-new-block-sym "latch"))) + (let ((latch (make-comp-latch :name (comp--new-block-sym "latch"))) (curr-bb (comp-limplify-curr-block comp-pass))) - ;; See `comp-make-curr-block'. + ;; See `comp--make-curr-block'. (setf (comp-limplify-curr-block comp-pass) latch) (when (< (comp-func-speed comp-func) 3) ;; At speed 3 the programmer is responsible to manually ;; place `comp-maybe-gc-or-quit'. - (comp-emit '(call comp-maybe-gc-or-quit))) - ;; See `comp-emit-uncond-jump'. - (comp-emit `(jump ,(comp-block-name target))) - (comp-mark-curr-bb-closed) + (comp--emit '(call comp-maybe-gc-or-quit))) + ;; See `comp--emit-uncond-jump'. + (comp--emit `(jump ,(comp-block-name target))) + (comp--mark-curr-bb-closed) (puthash (comp-block-name latch) latch (comp-func-blocks comp-func)) (setf (comp-limplify-curr-block comp-pass) curr-bb) latch)) -(defun comp-emit-uncond-jump (lap-label) +(defun comp--emit-uncond-jump (lap-label) "Emit an unconditional branch to LAP-LABEL." (cl-destructuring-bind (label-num . stack-depth) lap-label (when stack-depth - (cl-assert (= (1- stack-depth) (comp-sp)))) - (let* ((target-addr (comp-label-to-addr label-num)) - (target (comp-bb-maybe-add target-addr - (comp-sp))) + (cl-assert (= (1- stack-depth) (comp--sp)))) + (let* ((target-addr (comp--label-to-addr label-num)) + (target (comp--bb-maybe-add target-addr + (comp--sp))) (latch (when (< target-addr (comp-limplify-pc comp-pass)) - (comp-latch-make-fill target))) + (comp--latch-make-fill target))) (eff-target-name (comp-block-name (or latch target)))) - (comp-emit `(jump ,eff-target-name)) - (comp-mark-curr-bb-closed)))) + (comp--emit `(jump ,eff-target-name)) + (comp--mark-curr-bb-closed)))) -(defun comp-emit-cond-jump (a b target-offset lap-label negated) +(defun comp--emit-cond-jump (a b target-offset lap-label negated) "Emit a conditional jump to LAP-LABEL when A and B satisfy EQ. TARGET-OFFSET is the positive offset on the SP when branching to the target block. If NEGATED is non null, negate the tested condition. Return value is the fall-through block name." (cl-destructuring-bind (label-num . label-sp) lap-label - (let* ((bb (comp-block-name (comp-bb-maybe-add + (let* ((bb (comp-block-name (comp--bb-maybe-add (1+ (comp-limplify-pc comp-pass)) - (comp-sp)))) ; Fall through block. - (target-sp (+ target-offset (comp-sp))) - (target-addr (comp-label-to-addr label-num)) - (target (comp-bb-maybe-add target-addr target-sp)) + (comp--sp)))) ; Fall through block. + (target-sp (+ target-offset (comp--sp))) + (target-addr (comp--label-to-addr label-num)) + (target (comp--bb-maybe-add target-addr target-sp)) (latch (when (< target-addr (comp-limplify-pc comp-pass)) - (comp-latch-make-fill target))) + (comp--latch-make-fill target))) (eff-target-name (comp-block-name (or latch target)))) (when label-sp - (cl-assert (= (1- label-sp) (+ target-offset (comp-sp))))) - (comp-emit (if negated + (cl-assert (= (1- label-sp) (+ target-offset (comp--sp))))) + (comp--emit (if negated (list 'cond-jump a b bb eff-target-name) (list 'cond-jump a b eff-target-name bb))) - (comp-mark-curr-bb-closed) + (comp--mark-curr-bb-closed) bb))) -(defun comp-emit-handler (lap-label handler-type) +(defun comp--emit-handler (lap-label handler-type) "Emit a nonlocal-exit handler to LAP-LABEL of type HANDLER-TYPE." (cl-destructuring-bind (label-num . label-sp) lap-label - (cl-assert (= (- label-sp 2) (comp-sp))) + (cl-assert (= (- label-sp 2) (comp--sp))) (setf (comp-func-has-non-local comp-func) t) - (let* ((guarded-bb (comp-bb-maybe-add (1+ (comp-limplify-pc comp-pass)) - (comp-sp))) - (handler-bb (comp-bb-maybe-add (comp-label-to-addr label-num) - (1+ (comp-sp)))) - (pop-bb (make--comp-block-lap nil (comp-sp) (comp-new-block-sym)))) - (comp-emit (list 'push-handler + (let* ((guarded-bb (comp--bb-maybe-add (1+ (comp-limplify-pc comp-pass)) + (comp--sp))) + (handler-bb (comp--bb-maybe-add (comp--label-to-addr label-num) + (1+ (comp--sp)))) + (pop-bb (make--comp-block-lap nil (comp--sp) (comp--new-block-sym)))) + (comp--emit (list 'push-handler handler-type - (comp-slot+1) + (comp--slot+1) (comp-block-name pop-bb) (comp-block-name guarded-bb))) - (comp-mark-curr-bb-closed) + (comp--mark-curr-bb-closed) ;; Emit the basic block to pop the handler if we got the non local. (puthash (comp-block-name pop-bb) pop-bb (comp-func-blocks comp-func)) (setf (comp-limplify-curr-block comp-pass) pop-bb) - (comp-emit `(fetch-handler ,(comp-slot+1))) - (comp-emit `(jump ,(comp-block-name handler-bb))) - (comp-mark-curr-bb-closed)))) + (comp--emit `(fetch-handler ,(comp--slot+1))) + (comp--emit `(jump ,(comp-block-name handler-bb))) + (comp--mark-curr-bb-closed)))) -(defun comp-limplify-listn (n) +(defun comp--limplify-listn (n) "Limplify list N." - (comp-with-sp (+ (comp-sp) n -1) - (comp-emit-set-call (comp-call 'cons - (comp-slot) - (make-comp-mvar :constant nil)))) - (cl-loop for sp from (+ (comp-sp) n -2) downto (comp-sp) - do (comp-with-sp sp - (comp-emit-set-call (comp-call 'cons - (comp-slot) - (comp-slot+1)))))) + (comp--with-sp (+ (comp--sp) n -1) + (comp--emit-set-call (comp--call 'cons + (comp--slot) + (make--comp-mvar :constant nil)))) + (cl-loop for sp from (+ (comp--sp) n -2) downto (comp--sp) + do (comp--with-sp sp + (comp--emit-set-call (comp--call 'cons + (comp--slot) + (comp--slot+1)))))) -(defun comp-new-block-sym (&optional postfix) +(defun comp--new-block-sym (&optional postfix) "Return a unique symbol postfixing POSTFIX naming the next new basic block." (intern (format (if postfix "bb_%s_%s" "bb_%s") (funcall (comp-func-block-cnt-gen comp-func)) postfix))) -(defun comp-fill-label-h () +(defun comp--fill-label-h () "Fill label-to-addr hash table for the current function." (setf (comp-limplify-label-to-addr comp-pass) (make-hash-table :test 'eql)) (cl-loop for insn in (comp-func-lap comp-func) @@ -1130,7 +1131,7 @@ Return value is the fall-through block name." (`(TAG ,label . ,_) (puthash label addr (comp-limplify-label-to-addr comp-pass)))))) -(defun comp-jump-table-optimizable (jmp-table) +(defun comp--jump-table-optimizable (jmp-table) "Return t if JMP-TABLE can be optimized out." ;; Identify LAP sequences like: ;; (byte-constant #s(hash-table test eq purecopy t data (created 126 deleted 126 changed 126)) . 24) @@ -1142,13 +1143,13 @@ Return value is the fall-through block name." (`(TAG ,target . ,_label-sp) (= target (car targets))))))) -(defun comp-emit-switch (var last-insn) +(defun comp--emit-switch (var last-insn) "Emit a Limple for a lap jump table given VAR and LAST-INSN." ;; FIXME this not efficient for big jump tables. We should have a second ;; strategy for this case. (pcase last-insn (`(setimm ,_ ,jmp-table) - (unless (comp-jump-table-optimizable jmp-table) + (unless (comp--jump-table-optimizable jmp-table) (cl-loop for test being each hash-keys of jmp-table using (hash-value target-label) @@ -1156,27 +1157,27 @@ Return value is the fall-through block name." with test-func = (hash-table-test jmp-table) for n from 1 for last = (= n len) - for m-test = (make-comp-mvar :constant test) - for target-name = (comp-block-name (comp-bb-maybe-add - (comp-label-to-addr target-label) - (comp-sp))) + for m-test = (make--comp-mvar :constant test) + for target-name = (comp-block-name (comp--bb-maybe-add + (comp--label-to-addr target-label) + (comp--sp))) for ff-bb = (if last - (comp-bb-maybe-add (1+ (comp-limplify-pc comp-pass)) - (comp-sp)) + (comp--bb-maybe-add (1+ (comp-limplify-pc comp-pass)) + (comp--sp)) (make--comp-block-lap nil - (comp-sp) - (comp-new-block-sym))) + (comp--sp) + (comp--new-block-sym))) for ff-bb-name = (comp-block-name ff-bb) if (eq test-func 'eq) - do (comp-emit (list 'cond-jump var m-test target-name ff-bb-name)) + do (comp--emit (list 'cond-jump var m-test target-name ff-bb-name)) else ;; Store the result of the comparison into the scratch slot before ;; emitting the conditional jump. - do (comp-emit (list 'set (make-comp-mvar :slot 'scratch) - (comp-call test-func var m-test))) - (comp-emit (list 'cond-jump - (make-comp-mvar :slot 'scratch) - (make-comp-mvar :constant nil) + do (comp--emit (list 'set (make--comp-mvar :slot 'scratch) + (comp--call test-func var m-test))) + (comp--emit (list 'cond-jump + (make--comp-mvar :slot 'scratch) + (make--comp-mvar :constant nil) ff-bb-name target-name)) unless last ;; All fall through are artificially created here except the last one. @@ -1191,7 +1192,7 @@ SUBR-NAME is the name of function." (or (gethash subr-name comp-subr-arities-h) (func-arity subr-name))) -(defun comp-emit-set-call-subr (subr-name sp-delta) +(defun comp--emit-set-call-subr (subr-name sp-delta) "Emit a call for SUBR-NAME. SP-DELTA is the stack adjustment." (let* ((nargs (1+ (- sp-delta))) @@ -1202,39 +1203,39 @@ SP-DELTA is the stack adjustment." (signal 'native-ice (list "subr contains unevalled args" subr-name))) (if (eq maxarg 'many) ;; callref case. - (comp-emit-set-call (comp-callref subr-name nargs (comp-sp))) + (comp--emit-set-call (comp--callref subr-name nargs (comp--sp))) ;; Normal call. (unless (and (>= maxarg nargs) (<= minarg nargs)) (signal 'native-ice (list "incoherent stack adjustment" nargs maxarg minarg))) (let* ((subr-name subr-name) (slots (cl-loop for i from 0 below maxarg - collect (comp-slot-n (+ i (comp-sp)))))) - (comp-emit-set-call (apply #'comp-call (cons subr-name slots))))))) + collect (comp--slot-n (+ i (comp--sp)))))) + (comp--emit-set-call (apply #'comp--call (cons subr-name slots))))))) (eval-when-compile - (defun comp-op-to-fun (x) + (defun comp--op-to-fun (x) "Given the LAP op strip \"byte-\" to have the subr name." (intern (string-replace "byte-" "" x))) - (defun comp-body-eff (body op-name sp-delta) + (defun comp--body-eff (body op-name sp-delta) "Given the original BODY, compute the effective one. When BODY is `auto', guess function name from the LAP byte-code name. Otherwise expect lname fnname." (pcase (car body) ('auto - `((comp-emit-set-call-subr ',(comp-op-to-fun op-name) ,sp-delta))) + `((comp--emit-set-call-subr ',(comp--op-to-fun op-name) ,sp-delta))) ((pred symbolp) - `((comp-emit-set-call-subr ',(car body) ,sp-delta))) + `((comp--emit-set-call-subr ',(car body) ,sp-delta))) (_ body)))) -(defmacro comp-op-case (&rest cases) +(defmacro comp--op-case (&rest cases) "Expand CASES into the corresponding `pcase' expansion. This is responsible for generating the proper stack adjustment, when known, and the annotation emission." (declare (debug (body)) (indent defun)) - (declare-function comp-body-eff nil (body op-name sp-delta)) + (declare-function comp--body-eff nil (body op-name sp-delta)) `(pcase op ,@(cl-loop for (op . body) in cases for sp-delta = (gethash op comp-op-stack-info) @@ -1243,55 +1244,55 @@ and the annotation emission." collect `(',op ;; Log all LAP ops except the TAG one. ;; ,(unless (eq op 'TAG) - ;; `(comp-emit-annotation + ;; `(comp--emit-annotation ;; ,(concat "LAP op " op-name))) ;; Emit the stack adjustment if present. ,(when (and sp-delta (not (eq 0 sp-delta))) - `(cl-incf (comp-sp) ,sp-delta)) - ,@(comp-body-eff body op-name sp-delta)) + `(cl-incf (comp--sp) ,sp-delta)) + ,@(comp--body-eff body op-name sp-delta)) else collect `(',op (signal 'native-ice (list "unsupported LAP op" ',op-name)))) (_ (signal 'native-ice (list "unexpected LAP op" (symbol-name op)))))) -(defun comp-limplify-lap-inst (insn) +(defun comp--limplify-lap-inst (insn) "Limplify LAP instruction INSN pushing it in the proper basic block." (let ((op (car insn)) (arg (if (consp (cdr insn)) (cadr insn) (cdr insn)))) - (comp-op-case + (comp--op-case (TAG (cl-destructuring-bind (_TAG label-num . label-sp) insn ;; Paranoid? (when label-sp (cl-assert (= (1- label-sp) (comp-limplify-sp comp-pass)))) - (comp-emit-annotation (format "LAP TAG %d" label-num)))) + (comp--emit-annotation (format "LAP TAG %d" label-num)))) (byte-stack-ref - (comp-copy-slot (- (comp-sp) arg 1))) + (comp--copy-slot (- (comp--sp) arg 1))) (byte-varref - (comp-emit-set-call (comp-call 'symbol-value (make-comp-mvar + (comp--emit-set-call (comp--call 'symbol-value (make--comp-mvar :constant arg)))) (byte-varset - (comp-emit (comp-call 'set_internal - (make-comp-mvar :constant arg) - (comp-slot+1)))) + (comp--emit (comp--call 'set_internal + (make--comp-mvar :constant arg) + (comp--slot+1)))) (byte-varbind ;; Verify - (comp-emit (comp-call 'specbind - (make-comp-mvar :constant arg) - (comp-slot+1)))) + (comp--emit (comp--call 'specbind + (make--comp-mvar :constant arg) + (comp--slot+1)))) (byte-call - (cl-incf (comp-sp) (- arg)) - (comp-emit-set-call (comp-callref 'funcall (1+ arg) (comp-sp)))) + (cl-incf (comp--sp) (- arg)) + (comp--emit-set-call (comp--callref 'funcall (1+ arg) (comp--sp)))) (byte-unbind - (comp-emit (comp-call 'helper_unbind_n - (make-comp-mvar :constant arg)))) + (comp--emit (comp--call 'helper_unbind_n + (make--comp-mvar :constant arg)))) (byte-pophandler - (comp-emit '(pop-handler))) + (comp--emit '(pop-handler))) (byte-pushconditioncase - (comp-emit-handler (cddr insn) 'condition-case)) + (comp--emit-handler (cddr insn) 'condition-case)) (byte-pushcatch - (comp-emit-handler (cddr insn) 'catcher)) + (comp--emit-handler (cddr insn) 'catcher)) (byte-nth auto) (byte-symbolp auto) (byte-consp auto) @@ -1300,19 +1301,19 @@ and the annotation emission." (byte-eq auto) (byte-memq auto) (byte-not - (comp-emit-set-call (comp-call 'eq (comp-slot-n (comp-sp)) - (make-comp-mvar :constant nil)))) + (comp--emit-set-call (comp--call 'eq (comp--slot-n (comp--sp)) + (make--comp-mvar :constant nil)))) (byte-car auto) (byte-cdr auto) (byte-cons auto) (byte-list1 - (comp-limplify-listn 1)) + (comp--limplify-listn 1)) (byte-list2 - (comp-limplify-listn 2)) + (comp--limplify-listn 2)) (byte-list3 - (comp-limplify-listn 3)) + (comp--limplify-listn 3)) (byte-list4 - (comp-limplify-listn 4)) + (comp--limplify-listn 4)) (byte-length auto) (byte-aref auto) (byte-aset auto) @@ -1323,11 +1324,11 @@ and the annotation emission." (byte-get auto) (byte-substring auto) (byte-concat2 - (comp-emit-set-call (comp-callref 'concat 2 (comp-sp)))) + (comp--emit-set-call (comp--callref 'concat 2 (comp--sp)))) (byte-concat3 - (comp-emit-set-call (comp-callref 'concat 3 (comp-sp)))) + (comp--emit-set-call (comp--callref 'concat 3 (comp--sp)))) (byte-concat4 - (comp-emit-set-call (comp-callref 'concat 4 (comp-sp)))) + (comp--emit-set-call (comp--callref 'concat 4 (comp--sp)))) (byte-sub1 1-) (byte-add1 1+) (byte-eqlsign =) @@ -1337,7 +1338,7 @@ and the annotation emission." (byte-geq >=) (byte-diff -) (byte-negate - (comp-emit-set-call (comp-call 'negate (comp-slot)))) + (comp--emit-set-call (comp--call 'negate (comp--slot)))) (byte-plus +) (byte-max auto) (byte-min auto) @@ -1352,9 +1353,9 @@ and the annotation emission." (byte-preceding-char preceding-char) (byte-current-column auto) (byte-indent-to - (comp-emit-set-call (comp-call 'indent-to - (comp-slot) - (make-comp-mvar :constant nil)))) + (comp--emit-set-call (comp--call 'indent-to + (comp--slot) + (make--comp-mvar :constant nil)))) (byte-scan-buffer-OBSOLETE) (byte-eolp auto) (byte-eobp auto) @@ -1363,7 +1364,7 @@ and the annotation emission." (byte-current-buffer auto) (byte-set-buffer auto) (byte-save-current-buffer - (comp-emit (comp-call 'record_unwind_current_buffer))) + (comp--emit (comp--call 'record_unwind_current_buffer))) (byte-set-mark-OBSOLETE) (byte-interactive-p-OBSOLETE) (byte-forward-char auto) @@ -1375,41 +1376,41 @@ and the annotation emission." (byte-buffer-substring auto) (byte-delete-region auto) (byte-narrow-to-region - (comp-emit-set-call (comp-call 'narrow-to-region - (comp-slot) - (comp-slot+1)))) + (comp--emit-set-call (comp--call 'narrow-to-region + (comp--slot) + (comp--slot+1)))) (byte-widen - (comp-emit-set-call (comp-call 'widen))) + (comp--emit-set-call (comp--call 'widen))) (byte-end-of-line auto) (byte-constant2) ; TODO ;; Branches. (byte-goto - (comp-emit-uncond-jump (cddr insn))) + (comp--emit-uncond-jump (cddr insn))) (byte-goto-if-nil - (comp-emit-cond-jump (comp-slot+1) (make-comp-mvar :constant nil) 0 + (comp--emit-cond-jump (comp--slot+1) (make--comp-mvar :constant nil) 0 (cddr insn) nil)) (byte-goto-if-not-nil - (comp-emit-cond-jump (comp-slot+1) (make-comp-mvar :constant nil) 0 + (comp--emit-cond-jump (comp--slot+1) (make--comp-mvar :constant nil) 0 (cddr insn) t)) (byte-goto-if-nil-else-pop - (comp-emit-cond-jump (comp-slot+1) (make-comp-mvar :constant nil) 1 + (comp--emit-cond-jump (comp--slot+1) (make--comp-mvar :constant nil) 1 (cddr insn) nil)) (byte-goto-if-not-nil-else-pop - (comp-emit-cond-jump (comp-slot+1) (make-comp-mvar :constant nil) 1 + (comp--emit-cond-jump (comp--slot+1) (make--comp-mvar :constant nil) 1 (cddr insn) t)) (byte-return - (comp-emit `(return ,(comp-slot+1)))) + (comp--emit `(return ,(comp--slot+1)))) (byte-discard 'pass) (byte-dup - (comp-copy-slot (1- (comp-sp)))) + (comp--copy-slot (1- (comp--sp)))) (byte-save-excursion - (comp-emit (comp-call 'record_unwind_protect_excursion))) + (comp--emit (comp--call 'record_unwind_protect_excursion))) (byte-save-window-excursion-OBSOLETE) (byte-save-restriction - (comp-emit (comp-call 'helper_save_restriction))) + (comp--emit (comp--call 'helper_save_restriction))) (byte-catch) ;; Obsolete (byte-unwind-protect - (comp-emit (comp-call 'helper_unwind_protect (comp-slot+1)))) + (comp--emit (comp--call 'helper_unwind_protect (comp--slot+1)))) (byte-condition-case) ;; Obsolete (byte-temp-output-buffer-setup-OBSOLETE) (byte-temp-output-buffer-show-OBSOLETE) @@ -1436,61 +1437,61 @@ and the annotation emission." (byte-numberp auto) (byte-integerp auto) (byte-listN - (cl-incf (comp-sp) (- 1 arg)) - (comp-emit-set-call (comp-callref 'list arg (comp-sp)))) + (cl-incf (comp--sp) (- 1 arg)) + (comp--emit-set-call (comp--callref 'list arg (comp--sp)))) (byte-concatN - (cl-incf (comp-sp) (- 1 arg)) - (comp-emit-set-call (comp-callref 'concat arg (comp-sp)))) + (cl-incf (comp--sp) (- 1 arg)) + (comp--emit-set-call (comp--callref 'concat arg (comp--sp)))) (byte-insertN - (cl-incf (comp-sp) (- 1 arg)) - (comp-emit-set-call (comp-callref 'insert arg (comp-sp)))) + (cl-incf (comp--sp) (- 1 arg)) + (comp--emit-set-call (comp--callref 'insert arg (comp--sp)))) (byte-stack-set - (comp-copy-slot (1+ (comp-sp)) (- (comp-sp) arg -1))) + (comp--copy-slot (1+ (comp--sp)) (- (comp--sp) arg -1))) (byte-stack-set2 (cl-assert nil)) ;; TODO (byte-discardN - (cl-incf (comp-sp) (- arg))) + (cl-incf (comp--sp) (- arg))) (byte-switch ;; Assume to follow the emission of a setimm. - ;; This is checked into comp-emit-switch. - (comp-emit-switch (comp-slot+1) + ;; This is checked into comp--emit-switch. + (comp--emit-switch (comp--slot+1) (cl-first (comp-block-insns (comp-limplify-curr-block comp-pass))))) (byte-constant - (comp-emit-setimm arg)) + (comp--emit-setimm arg)) (byte-discardN-preserve-tos - (cl-incf (comp-sp) (- arg)) - (comp-copy-slot (+ arg (comp-sp))))))) + (cl-incf (comp--sp) (- arg)) + (comp--copy-slot (+ arg (comp--sp))))))) -(defun comp-emit-narg-prologue (minarg nonrest rest) +(defun comp--emit-narg-prologue (minarg nonrest rest) "Emit the prologue for a narg function." (cl-loop for i below minarg - do (comp-emit `(set-args-to-local ,(comp-slot-n i))) - (comp-emit '(inc-args))) + do (comp--emit `(set-args-to-local ,(comp--slot-n i))) + (comp--emit '(inc-args))) (cl-loop for i from minarg below nonrest for bb = (intern (format "entry_%s" i)) for fallback = (intern (format "entry_fallback_%s" i)) - do (comp-emit `(cond-jump-narg-leq ,i ,fallback ,bb)) - (comp-make-curr-block bb (comp-sp)) - (comp-emit `(set-args-to-local ,(comp-slot-n i))) - (comp-emit '(inc-args)) - finally (comp-emit '(jump entry_rest_args))) + do (comp--emit `(cond-jump-narg-leq ,i ,fallback ,bb)) + (comp--make-curr-block bb (comp--sp)) + (comp--emit `(set-args-to-local ,(comp--slot-n i))) + (comp--emit '(inc-args)) + finally (comp--emit '(jump entry_rest_args))) (when (/= minarg nonrest) (cl-loop for i from minarg below nonrest for bb = (intern (format "entry_fallback_%s" i)) for next-bb = (if (= (1+ i) nonrest) 'entry_rest_args (intern (format "entry_fallback_%s" (1+ i)))) - do (comp-with-sp i - (comp-make-curr-block bb (comp-sp)) - (comp-emit-setimm nil) - (comp-emit `(jump ,next-bb))))) - (comp-make-curr-block 'entry_rest_args (comp-sp)) - (comp-emit `(set-rest-args-to-local ,(comp-slot-n nonrest))) - (setf (comp-sp) nonrest) + do (comp--with-sp i + (comp--make-curr-block bb (comp--sp)) + (comp--emit-setimm nil) + (comp--emit `(jump ,next-bb))))) + (comp--make-curr-block 'entry_rest_args (comp--sp)) + (comp--emit `(set-rest-args-to-local ,(comp--slot-n nonrest))) + (setf (comp--sp) nonrest) (when (and (> nonrest 8) (null rest)) - (cl-decf (comp-sp)))) + (cl-decf (comp--sp)))) -(defun comp-limplify-finalize-function (func) +(defun comp--limplify-finalize-function (func) "Reverse insns into all basic blocks of FUNC." (cl-loop for bb being the hash-value in (comp-func-blocks func) do (setf (comp-block-insns bb) @@ -1498,49 +1499,49 @@ and the annotation emission." (comp--log-func func 2) func) -(cl-defgeneric comp-prepare-args-for-top-level (function) +(cl-defgeneric comp--prepare-args-for-top-level (function) "Given FUNCTION, return the two arguments for comp--register-...") -(cl-defmethod comp-prepare-args-for-top-level ((function comp-func-l)) +(cl-defmethod comp--prepare-args-for-top-level ((function comp-func-l)) "Lexically-scoped FUNCTION." (let ((args (comp-func-l-args function))) - (cons (make-comp-mvar :constant (comp-args-base-min args)) - (make-comp-mvar :constant (cond + (cons (make--comp-mvar :constant (comp-args-base-min args)) + (make--comp-mvar :constant (cond ((comp-args-p args) (comp-args-max args)) ((comp-nargs-rest args) 'many) (t (comp-nargs-nonrest args))))))) -(cl-defmethod comp-prepare-args-for-top-level ((function comp-func-d)) +(cl-defmethod comp--prepare-args-for-top-level ((function comp-func-d)) "Dynamically scoped FUNCTION." - (cons (make-comp-mvar :constant (func-arity (comp-func-byte-func function))) + (cons (make--comp-mvar :constant (func-arity (comp-func-byte-func function))) (let ((comp-curr-allocation-class 'd-default)) ;; Lambda-lists must stay in the same relocation class of ;; the object referenced by code to respect uninterned ;; symbols. - (make-comp-mvar :constant (comp-func-d-lambda-list function))))) + (make--comp-mvar :constant (comp-func-d-lambda-list function))))) -(cl-defgeneric comp-emit-for-top-level (form for-late-load) +(cl-defgeneric comp--emit-for-top-level (form for-late-load) "Emit the Limple code for top level FORM.") -(cl-defmethod comp-emit-for-top-level ((form byte-to-native-func-def) +(cl-defmethod comp--emit-for-top-level ((form byte-to-native-func-def) for-late-load) (let* ((name (byte-to-native-func-def-name form)) (c-name (byte-to-native-func-def-c-name form)) (f (gethash c-name (comp-ctxt-funcs-h comp-ctxt))) - (args (comp-prepare-args-for-top-level f))) + (args (comp--prepare-args-for-top-level f))) (cl-assert (and name f)) - (comp-emit - `(set ,(make-comp-mvar :slot 1) - ,(comp-call (if for-late-load + (comp--emit + `(set ,(make--comp-mvar :slot 1) + ,(comp--call (if for-late-load 'comp--late-register-subr 'comp--register-subr) - (make-comp-mvar :constant name) - (make-comp-mvar :constant c-name) + (make--comp-mvar :constant name) + (make--comp-mvar :constant c-name) (car args) (cdr args) (setf (comp-func-type f) - (make-comp-mvar :constant nil)) - (make-comp-mvar + (make--comp-mvar :constant nil)) + (make--comp-mvar :constant (list (let* ((h (comp-ctxt-function-docs comp-ctxt)) @@ -1551,40 +1552,40 @@ and the annotation emission." (comp-func-command-modes f))) ;; This is the compilation unit it-self passed as ;; parameter. - (make-comp-mvar :slot 0)))))) + (make--comp-mvar :slot 0)))))) -(cl-defmethod comp-emit-for-top-level ((form byte-to-native-top-level) +(cl-defmethod comp--emit-for-top-level ((form byte-to-native-top-level) for-late-load) (unless for-late-load - (comp-emit - (comp-call 'eval + (comp--emit + (comp--call 'eval (let ((comp-curr-allocation-class 'd-impure)) - (make-comp-mvar :constant + (make--comp-mvar :constant (byte-to-native-top-level-form form))) - (make-comp-mvar :constant + (make--comp-mvar :constant (byte-to-native-top-level-lexical form)))))) -(defun comp-emit-lambda-for-top-level (func) +(defun comp--emit-lambda-for-top-level (func) "Emit the creation of subrs for lambda FUNC. These are stored in the reloc data array." - (let ((args (comp-prepare-args-for-top-level func))) + (let ((args (comp--prepare-args-for-top-level func))) (let ((comp-curr-allocation-class 'd-impure)) (comp--add-const-to-relocs (comp-func-byte-func func))) - (comp-emit - (comp-call 'comp--register-lambda + (comp--emit + (comp--call 'comp--register-lambda ;; mvar to be fixed-up when containers are ;; finalized. (or (gethash (comp-func-byte-func func) (comp-ctxt-lambda-fixups-h comp-ctxt)) (puthash (comp-func-byte-func func) - (make-comp-mvar :constant nil) + (make--comp-mvar :constant nil) (comp-ctxt-lambda-fixups-h comp-ctxt))) - (make-comp-mvar :constant (comp-func-c-name func)) + (make--comp-mvar :constant (comp-func-c-name func)) (car args) (cdr args) (setf (comp-func-type func) - (make-comp-mvar :constant nil)) - (make-comp-mvar + (make--comp-mvar :constant nil)) + (make--comp-mvar :constant (list (let* ((h (comp-ctxt-function-docs comp-ctxt)) @@ -1595,9 +1596,9 @@ These are stored in the reloc data array." (comp-func-command-modes func))) ;; This is the compilation unit it-self passed as ;; parameter. - (make-comp-mvar :slot 0))))) + (make--comp-mvar :slot 0))))) -(defun comp-limplify-top-level (for-late-load) +(defun comp--limplify-top-level (for-late-load) "Create a Limple function to modify the global environment at load. When FOR-LATE-LOAD is non-nil, the emitted function modifies only function definition. @@ -1627,22 +1628,22 @@ into the C code forwarding the compilation unit." (comp-func func) (comp-pass (make-comp-limplify :curr-block (make--comp-block-lap -1 0 'top-level) - :frame (comp-new-frame 1 0)))) - (comp-make-curr-block 'entry (comp-sp)) - (comp-emit-annotation (if for-late-load + :frame (comp--new-frame 1 0)))) + (comp--make-curr-block 'entry (comp--sp)) + (comp--emit-annotation (if for-late-load "Late top level" "Top level")) ;; Assign the compilation unit incoming as parameter to the slot frame 0. - (comp-emit `(set-par-to-local ,(comp-slot-n 0) 0)) + (comp--emit `(set-par-to-local ,(comp--slot-n 0) 0)) (maphash (lambda (_ func) - (comp-emit-lambda-for-top-level func)) + (comp--emit-lambda-for-top-level func)) (comp-ctxt-byte-func-to-func-h comp-ctxt)) - (mapc (lambda (x) (comp-emit-for-top-level x for-late-load)) + (mapc (lambda (x) (comp--emit-for-top-level x for-late-load)) (comp-ctxt-top-level-forms comp-ctxt)) - (comp-emit `(return ,(make-comp-mvar :slot 1))) - (comp-limplify-finalize-function func))) + (comp--emit `(return ,(make--comp-mvar :slot 1))) + (comp--limplify-finalize-function func))) -(defun comp-addr-to-bb-name (addr) +(defun comp--addr-to-bb-name (addr) "Search for a block starting at ADDR into pending or limplified blocks." ;; FIXME Actually we could have another hash for this. (cl-flet ((pred (bb) @@ -1654,7 +1655,7 @@ into the C code forwarding the compilation unit." when (pred bb) return (comp-block-name bb))))) -(defun comp-limplify-block (bb) +(defun comp--limplify-block (bb) "Limplify basic-block BB and add it to the current function." (setf (comp-limplify-curr-block comp-pass) bb (comp-limplify-sp comp-pass) (comp-block-lap-sp bb) @@ -1665,51 +1666,51 @@ into the C code forwarding the compilation unit." (comp-func-lap comp-func)) for inst = (car inst-cell) for next-inst = (car-safe (cdr inst-cell)) - do (comp-limplify-lap-inst inst) + do (comp--limplify-lap-inst inst) (cl-incf (comp-limplify-pc comp-pass)) - when (comp-lap-fall-through-p inst) + when (comp--lap-fall-through-p inst) do (pcase next-inst (`(TAG ,_label . ,label-sp) (when label-sp - (cl-assert (= (1- label-sp) (comp-sp)))) + (cl-assert (= (1- label-sp) (comp--sp)))) (let* ((stack-depth (if label-sp (1- label-sp) - (comp-sp))) - (next-bb (comp-block-name (comp-bb-maybe-add + (comp--sp))) + (next-bb (comp-block-name (comp--bb-maybe-add (comp-limplify-pc comp-pass) stack-depth)))) (unless (comp-block-closed bb) - (comp-emit `(jump ,next-bb)))) + (comp--emit `(jump ,next-bb)))) (cl-return))) - until (comp-lap-eob-p inst))) + until (comp--lap-eob-p inst))) -(defun comp-limplify-function (func) +(defun comp--limplify-function (func) "Limplify a single function FUNC." (let* ((frame-size (comp-func-frame-size func)) (comp-func func) (comp-pass (make-comp-limplify - :frame (comp-new-frame frame-size 0)))) - (comp-fill-label-h) + :frame (comp--new-frame frame-size 0)))) + (comp--fill-label-h) ;; Prologue - (comp-make-curr-block 'entry (comp-sp)) - (comp-emit-annotation (concat "Lisp function: " + (comp--make-curr-block 'entry (comp--sp)) + (comp--emit-annotation (concat "Lisp function: " (symbol-name (comp-func-name func)))) ;; Dynamic functions have parameters bound by the trampoline. (when (comp-func-l-p func) (let ((args (comp-func-l-args func))) (if (comp-args-p args) (cl-loop for i below (comp-args-max args) - do (cl-incf (comp-sp)) - (comp-emit `(set-par-to-local ,(comp-slot) ,i))) - (comp-emit-narg-prologue (comp-args-base-min args) + do (cl-incf (comp--sp)) + (comp--emit `(set-par-to-local ,(comp--slot) ,i))) + (comp--emit-narg-prologue (comp-args-base-min args) (comp-nargs-nonrest args) (comp-nargs-rest args))))) - (comp-emit '(jump bb_0)) + (comp--emit '(jump bb_0)) ;; Body - (comp-bb-maybe-add 0 (comp-sp)) + (comp--bb-maybe-add 0 (comp--sp)) (cl-loop for next-bb = (pop (comp-limplify-pending-blocks comp-pass)) while next-bb - do (comp-limplify-block next-bb)) + do (comp--limplify-block next-bb)) ;; Sanity check against block duplication. (cl-loop with addr-h = (make-hash-table) for bb being the hash-value in (comp-func-blocks func) @@ -1718,15 +1719,15 @@ into the C code forwarding the compilation unit." when addr do (cl-assert (null (gethash addr addr-h))) (puthash addr t addr-h)) - (comp-limplify-finalize-function func))) + (comp--limplify-finalize-function func))) -(defun comp-limplify (_) +(defun comp--limplify (_) "Compute LIMPLE IR for forms in `comp-ctxt'." - (maphash (lambda (_ f) (comp-limplify-function f)) + (maphash (lambda (_ f) (comp--limplify-function f)) (comp-ctxt-funcs-h comp-ctxt)) - (comp-add-func-to-ctxt (comp-limplify-top-level nil)) + (comp--add-func-to-ctxt (comp--limplify-top-level nil)) (when (comp-ctxt-with-late-load comp-ctxt) - (comp-add-func-to-ctxt (comp-limplify-top-level t)))) + (comp--add-func-to-ctxt (comp--limplify-top-level t)))) ;;; add-cstrs pass specific code. @@ -1750,22 +1751,22 @@ into the C code forwarding the compilation unit." ;; type specifier. -(defsubst comp-mvar-used-p (mvar) +(defsubst comp--mvar-used-p (mvar) "Non-nil when MVAR is used as lhs in the current function." (declare (gv-setter (lambda (val) `(puthash ,mvar ,val comp-pass)))) (gethash mvar comp-pass)) -(defun comp-collect-mvars (form) +(defun comp--collect-mvars (form) "Add rhs m-var present in FORM into `comp-pass'." (cl-loop for x in form if (consp x) - do (comp-collect-mvars x) + do (comp--collect-mvars x) else when (comp-mvar-p x) - do (setf (comp-mvar-used-p x) t))) + do (setf (comp--mvar-used-p x) t))) -(defun comp-collect-rhs () +(defun comp--collect-rhs () "Collect all lhs mvars into `comp-pass'." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) @@ -1773,11 +1774,11 @@ into the C code forwarding the compilation unit." for insn in (comp-block-insns b) for (op . args) = insn if (comp--assign-op-p op) - do (comp-collect-mvars (cdr args)) + do (comp--collect-mvars (cdr args)) else - do (comp-collect-mvars args)))) + do (comp--collect-mvars args)))) -(defun comp-negate-arithm-cmp-fun (function) +(defun comp--negate-arithm-cmp-fun (function) "Negate FUNCTION. Return nil if we don't want to emit constraints for its negation." (cl-ecase function @@ -1787,7 +1788,7 @@ Return nil if we don't want to emit constraints for its negation." (>= '<) (<= '>))) -(defun comp-reverse-arithm-fun (function) +(defun comp--reverse-arithm-fun (function) "Reverse FUNCTION." (cl-case function (= '=) @@ -1797,7 +1798,7 @@ Return nil if we don't want to emit constraints for its negation." (<= '>=) (t function))) -(defun comp-emit-assume (kind lhs rhs bb negated) +(defun comp--emit-assume (kind lhs rhs bb negated) "Emit an assume of kind KIND for mvar LHS being RHS. When NEGATED is non-nil, the assumption is negated. The assume is emitted at the beginning of the block BB." @@ -1807,41 +1808,41 @@ The assume is emitted at the beginning of the block BB." ((or 'and 'and-nhc) (if (comp-mvar-p rhs) (let ((tmp-mvar (if negated - (make-comp-mvar :slot (comp-mvar-slot rhs)) + (make--comp-mvar :slot (comp-mvar-slot rhs)) rhs))) - (push `(assume ,(make-comp-mvar :slot lhs-slot) + (push `(assume ,(make--comp-mvar :slot lhs-slot) (,kind ,lhs ,tmp-mvar)) (comp-block-insns bb)) (if negated (push `(assume ,tmp-mvar (not ,rhs)) (comp-block-insns bb)))) ;; If is only a constraint we can negate it directly. - (push `(assume ,(make-comp-mvar :slot lhs-slot) + (push `(assume ,(make--comp-mvar :slot lhs-slot) (,kind ,lhs ,(if negated (comp-cstr-negation-make rhs) rhs))) (comp-block-insns bb)))) ((pred comp--arithm-cmp-fun-p) (when-let ((kind (if negated - (comp-negate-arithm-cmp-fun kind) + (comp--negate-arithm-cmp-fun kind) kind))) - (push `(assume ,(make-comp-mvar :slot lhs-slot) + (push `(assume ,(make--comp-mvar :slot lhs-slot) (,kind ,lhs ,(if-let* ((vld (comp-cstr-imm-vld-p rhs)) (val (comp-cstr-imm rhs)) (ok (and (integerp val) (not (memq kind '(= !=)))))) val - (make-comp-mvar :slot (comp-mvar-slot rhs))))) + (make--comp-mvar :slot (comp-mvar-slot rhs))))) (comp-block-insns bb)))) (_ (cl-assert nil))) (setf (comp-func-ssa-status comp-func) 'dirty))) -(defun comp-maybe-add-vmvar (op cmp-res insns-seq) +(defun comp--maybe-add-vmvar (op cmp-res insns-seq) "If CMP-RES is clobbering OP emit a new constrained mvar and return it. Return OP otherwise." (if-let ((match (eql (comp-mvar-slot op) (comp-mvar-slot cmp-res))) - (new-mvar (make-comp-mvar + (new-mvar (make--comp-mvar :slot (- (cl-incf (comp-func-vframe-size comp-func)))))) (progn @@ -1849,7 +1850,7 @@ Return OP otherwise." new-mvar) op)) -(defun comp-add-new-block-between (bb-symbol bb-a bb-b) +(defun comp--add-new-block-between (bb-symbol bb-a bb-b) "Create a new basic-block named BB-SYMBOL and add it between BB-A and BB-B." (cl-loop with new-bb = (make-comp-block-cstr :name bb-symbol @@ -1872,7 +1873,7 @@ Return OP otherwise." finally (cl-assert nil))) ;; Cheap substitute to a copy propagation pass... -(defun comp-cond-cstrs-target-mvar (mvar exit-insn bb) +(defun comp--cond-cstrs-target-mvar (mvar exit-insn bb) "Given MVAR, search in BB the original mvar MVAR got assigned from. Keep on searching till EXIT-INSN is encountered." (cl-flet ((targetp (x) @@ -1889,7 +1890,7 @@ Keep on searching till EXIT-INSN is encountered." (setf res rhs))) finally (cl-assert nil)))) -(defun comp-add-cond-cstrs-target-block (curr-bb target-bb-sym) +(defun comp--add-cond-cstrs-target-block (curr-bb target-bb-sym) "Return the appropriate basic block to add constraint assumptions into. CURR-BB is the current basic block. TARGET-BB-SYM is the symbol name of the target block." @@ -1909,10 +1910,10 @@ TARGET-BB-SYM is the symbol name of the target block." until (null (gethash new-name (comp-func-blocks comp-func))) finally ;; Add it. - (cl-return (comp-add-new-block-between new-name curr-bb target-bb)))))) + (cl-return (comp--add-new-block-between new-name curr-bb target-bb)))))) -(defun comp-add-cond-cstrs-simple () - "`comp-add-cstrs' worker function for each selected function." +(defun comp--add-cond-cstrs-simple () + "`comp--add-cstrs' worker function for each selected function." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) do @@ -1928,26 +1929,26 @@ TARGET-BB-SYM is the symbol name of the target block." for branch-target-cell on blocks for branch-target = (car branch-target-cell) for negated in '(nil t) - when (comp-mvar-used-p tmp-mvar) + when (comp--mvar-used-p tmp-mvar) do - (let ((block-target (comp-add-cond-cstrs-target-block b branch-target))) + (let ((block-target (comp--add-cond-cstrs-target-block b branch-target))) (setf (car branch-target-cell) (comp-block-name block-target)) - (comp-emit-assume 'and tmp-mvar obj2 block-target negated)) + (comp--emit-assume 'and tmp-mvar obj2 block-target negated)) finally (cl-return-from in-the-basic-block))) (`((cond-jump ,obj1 ,obj2 . ,blocks)) (cl-loop for branch-target-cell on blocks for branch-target = (car branch-target-cell) for negated in '(nil t) - when (comp-mvar-used-p obj1) + when (comp--mvar-used-p obj1) do - (let ((block-target (comp-add-cond-cstrs-target-block b branch-target))) + (let ((block-target (comp--add-cond-cstrs-target-block b branch-target))) (setf (car branch-target-cell) (comp-block-name block-target)) - (comp-emit-assume 'and obj1 obj2 block-target negated)) + (comp--emit-assume 'and obj1 obj2 block-target negated)) finally (cl-return-from in-the-basic-block))))))) -(defun comp-add-cond-cstrs () - "`comp-add-cstrs' worker function for each selected function." +(defun comp--add-cond-cstrs () + "`comp--add-cstrs' worker function for each selected function." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) do @@ -1966,13 +1967,13 @@ TARGET-BB-SYM is the symbol name of the target block." (set ,(and (pred comp-mvar-p) mvar-3) (call memq ,(and (pred comp-mvar-p) mvar-1) ,(and (pred comp-mvar-p) mvar-2))) (cond-jump ,(and (pred comp-mvar-p) mvar-3) ,(pred comp-mvar-p) ,bb1 ,bb2)) - (comp-emit-assume 'and mvar-tested - (make-comp-mvar :type (comp-cstr-cl-tag mvar-tag)) - (comp-add-cond-cstrs-target-block b bb2) + (comp--emit-assume 'and mvar-tested + (make--comp-mvar :type (comp-cstr-cl-tag mvar-tag)) + (comp--add-cond-cstrs-target-block b bb2) nil) - (comp-emit-assume 'and mvar-tested - (make-comp-mvar :type (comp-cstr-cl-tag mvar-tag)) - (comp-add-cond-cstrs-target-block b bb1) + (comp--emit-assume 'and mvar-tested + (make--comp-mvar :type (comp-cstr-cl-tag mvar-tag)) + (comp--add-cond-cstrs-target-block b bb1) t)) (`((set ,(and (pred comp-mvar-p) cmp-res) (,(pred comp--call-op-p) @@ -1983,8 +1984,8 @@ TARGET-BB-SYM is the symbol name of the target block." ;; (comment ,_comment-str) (cond-jump ,cmp-res ,(pred comp-mvar-p) . ,blocks)) (cl-loop - with target-mvar1 = (comp-cond-cstrs-target-mvar op1 (car insns-seq) b) - with target-mvar2 = (comp-cond-cstrs-target-mvar op2 (car insns-seq) b) + with target-mvar1 = (comp--cond-cstrs-target-mvar op1 (car insns-seq) b) + with target-mvar2 = (comp--cond-cstrs-target-mvar op2 (car insns-seq) b) for branch-target-cell on blocks for branch-target = (car branch-target-cell) for negated in '(t nil) @@ -1993,19 +1994,19 @@ TARGET-BB-SYM is the symbol name of the target block." (eql 'and-nhc) (eq 'and) (t fun)) - when (or (comp-mvar-used-p target-mvar1) - (comp-mvar-used-p target-mvar2)) + when (or (comp--mvar-used-p target-mvar1) + (comp--mvar-used-p target-mvar2)) do - (let ((block-target (comp-add-cond-cstrs-target-block b branch-target))) + (let ((block-target (comp--add-cond-cstrs-target-block b branch-target))) (setf (car branch-target-cell) (comp-block-name block-target)) - (when (comp-mvar-used-p target-mvar1) - (comp-emit-assume kind target-mvar1 - (comp-maybe-add-vmvar op2 cmp-res prev-insns-seq) + (when (comp--mvar-used-p target-mvar1) + (comp--emit-assume kind target-mvar1 + (comp--maybe-add-vmvar op2 cmp-res prev-insns-seq) block-target negated)) - (when (comp-mvar-used-p target-mvar2) - (comp-emit-assume (comp-reverse-arithm-fun kind) + (when (comp--mvar-used-p target-mvar2) + (comp--emit-assume (comp--reverse-arithm-fun kind) target-mvar2 - (comp-maybe-add-vmvar op1 cmp-res prev-insns-seq) + (comp--maybe-add-vmvar op1 cmp-res prev-insns-seq) block-target negated))) finally (cl-return-from in-the-basic-block))) (`((set ,(and (pred comp-mvar-p) cmp-res) @@ -2015,16 +2016,16 @@ TARGET-BB-SYM is the symbol name of the target block." ;; (comment ,_comment-str) (cond-jump ,cmp-res ,(pred comp-mvar-p) . ,blocks)) (cl-loop - with target-mvar = (comp-cond-cstrs-target-mvar op (car insns-seq) b) + with target-mvar = (comp--cond-cstrs-target-mvar op (car insns-seq) b) with cstr = (comp--pred-to-cstr fun) for branch-target-cell on blocks for branch-target = (car branch-target-cell) for negated in '(t nil) - when (comp-mvar-used-p target-mvar) + when (comp--mvar-used-p target-mvar) do - (let ((block-target (comp-add-cond-cstrs-target-block b branch-target))) + (let ((block-target (comp--add-cond-cstrs-target-block b branch-target))) (setf (car branch-target-cell) (comp-block-name block-target)) - (comp-emit-assume 'and target-mvar cstr block-target negated)) + (comp--emit-assume 'and target-mvar cstr block-target negated)) finally (cl-return-from in-the-basic-block))) ;; Match predicate on the negated branch (unless). (`((set ,(and (pred comp-mvar-p) cmp-res) @@ -2034,20 +2035,20 @@ TARGET-BB-SYM is the symbol name of the target block." (set ,neg-cmp-res (call eq ,cmp-res ,(pred comp-cstr-null-p))) (cond-jump ,neg-cmp-res ,(pred comp-mvar-p) . ,blocks)) (cl-loop - with target-mvar = (comp-cond-cstrs-target-mvar op (car insns-seq) b) + with target-mvar = (comp--cond-cstrs-target-mvar op (car insns-seq) b) with cstr = (comp--pred-to-cstr fun) for branch-target-cell on blocks for branch-target = (car branch-target-cell) for negated in '(nil t) - when (comp-mvar-used-p target-mvar) + when (comp--mvar-used-p target-mvar) do - (let ((block-target (comp-add-cond-cstrs-target-block b branch-target))) + (let ((block-target (comp--add-cond-cstrs-target-block b branch-target))) (setf (car branch-target-cell) (comp-block-name block-target)) - (comp-emit-assume 'and target-mvar cstr block-target negated)) + (comp--emit-assume 'and target-mvar cstr block-target negated)) finally (cl-return-from in-the-basic-block)))) (setf prev-insns-seq insns-seq)))) -(defsubst comp-insert-insn (insn insn-cell) +(defsubst comp--insert-insn (insn insn-cell) "Insert INSN as second insn of INSN-CELL." (let ((next-cell (cdr insn-cell)) (new-cell `(,insn))) @@ -2055,15 +2056,15 @@ TARGET-BB-SYM is the symbol name of the target block." (cdr new-cell) next-cell (comp-func-ssa-status comp-func) 'dirty))) -(defun comp-emit-call-cstr (mvar call-cell cstr) +(defun comp--emit-call-cstr (mvar call-cell cstr) "Emit a constraint CSTR for MVAR after CALL-CELL." - (let* ((new-mvar (make-comp-mvar :slot (comp-mvar-slot mvar))) + (let* ((new-mvar (make--comp-mvar :slot (comp-mvar-slot mvar))) ;; Have new-mvar as LHS *and* RHS to ensure monotonicity and ;; fwprop convergence!! (insn `(assume ,new-mvar (and ,new-mvar ,mvar ,cstr)))) - (comp-insert-insn insn call-cell))) + (comp--insert-insn insn call-cell))) -(defun comp-lambda-list-gen (lambda-list) +(defun comp--lambda-list-gen (lambda-list) "Return a generator to iterate over LAMBDA-LIST." (lambda () (cl-case (car lambda-list) @@ -2079,12 +2080,12 @@ TARGET-BB-SYM is the symbol name of the target block." (car lambda-list) (setf lambda-list (cdr lambda-list))))))) -(defun comp-add-call-cstr () +(defun comp--add-call-cstr () "Add args assumptions for each function of which the type specifier is known." (cl-loop for bb being each hash-value of (comp-func-blocks comp-func) do - (comp-loop-insn-in-block bb + (comp--loop-insn-in-block bb (when-let ((match (pcase insn (`(set ,lhs (,(pred comp--call-op-p) ,f . ,args)) @@ -2095,10 +2096,10 @@ TARGET-BB-SYM is the symbol name of the target block." (cl-values f cstr-f nil args)))))) (cl-multiple-value-bind (f cstr-f lhs args) match (cl-loop - with gen = (comp-lambda-list-gen (comp-cstr-f-args cstr-f)) + with gen = (comp--lambda-list-gen (comp-cstr-f-args cstr-f)) for arg in args for cstr = (funcall gen) - for target = (comp-cond-cstrs-target-mvar arg insn bb) + for target = (comp--cond-cstrs-target-mvar arg insn bb) unless (comp-cstr-p cstr) do (signal 'native-ice (list "Incoherent type specifier for function" f)) @@ -2109,9 +2110,9 @@ TARGET-BB-SYM is the symbol name of the target block." (or (null lhs) (not (eql (comp-mvar-slot lhs) (comp-mvar-slot target))))) - do (comp-emit-call-cstr target insn-cell cstr))))))) + do (comp--emit-call-cstr target insn-cell cstr))))))) -(defun comp-add-cstrs (_) +(defun comp--add-cstrs (_) "Rewrite conditional branches adding appropriate `assume' insns. This is introducing and placing `assume' insns in use by fwprop to propagate conditional branch test information on target basic @@ -2125,10 +2126,10 @@ blocks." (not (comp-func-has-non-local f))) (let ((comp-func f) (comp-pass (make-hash-table :test #'eq))) - (comp-collect-rhs) - (comp-add-cond-cstrs-simple) - (comp-add-cond-cstrs) - (comp-add-call-cstr) + (comp--collect-rhs) + (comp--add-cond-cstrs-simple) + (comp--add-cond-cstrs) + (comp--add-call-cstr) (comp--log-func comp-func 3)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2140,7 +2141,7 @@ blocks." ;; avoid optimizing-out functions and preventing their redefinition ;; being effective. -(defun comp-collect-calls (f) +(defun comp--collect-calls (f) "Return a list with all the functions called by F." (cl-loop with h = (make-hash-table :test #'eq) @@ -2160,17 +2161,17 @@ blocks." (comp-ctxt-funcs-h comp-ctxt))) f)))) -(defun comp-pure-infer-func (f) +(defun comp--pure-infer-func (f) "If all functions called by F are pure then F is pure too." (when (and (cl-every (lambda (x) (or (comp--function-pure-p x) (eq x (comp-func-name f)))) - (comp-collect-calls f)) + (comp--collect-calls f)) (not (eq (comp-func-pure f) t))) (comp-log (format "%s inferred to be pure" (comp-func-name f))) (setf (comp-func-pure f) t))) -(defun comp-ipa-pure (_) +(defun comp--ipa-pure (_) "Infer function purity." (cl-loop with pure-n = 0 @@ -2183,7 +2184,7 @@ blocks." when (and (>= (comp-func-speed f) 3) (comp-func-l-p f) (not (comp-func-pure f))) - do (comp-pure-infer-func f) + do (comp--pure-infer-func f) count (comp-func-pure f)))) finally (comp-log (format "ipa-pure iterated %d times" n)))) @@ -2197,13 +2198,13 @@ blocks." ;; this form is called 'minimal SSA form'. ;; This pass should be run every time basic blocks or m-var are shuffled. -(cl-defun make-comp-ssa-mvar (&rest rest &key _slot _constant _type) - "Same as `make-comp-mvar' but set the `id' slot." - (let ((mvar (apply #'make-comp-mvar rest))) +(cl-defun make--comp--ssa-mvar (&rest rest &key _slot _constant _type) + "Same as `make--comp-mvar' but set the `id' slot." + (let ((mvar (apply #'make--comp-mvar rest))) (setf (comp-mvar-id mvar) (sxhash-eq mvar)) mvar)) -(defun comp-clean-ssa (f) +(defun comp--clean-ssa (f) "Clean-up SSA for function F." (setf (comp-func-edges-h f) (make-hash-table)) (cl-loop @@ -2219,7 +2220,7 @@ blocks." unless (eq 'phi (car insn)) collect insn)))) -(defun comp-compute-edges () +(defun comp--compute-edges () "Compute the basic block edges for the current function." (cl-loop with blocks = (comp-func-blocks comp-func) for bb being each hash-value of blocks @@ -2255,7 +2256,7 @@ blocks." (comp-block-in-edges (comp-edge-dst edge)))) (comp--log-edges comp-func))) -(defun comp-collect-rev-post-order (basic-block) +(defun comp--collect-rev-post-order (basic-block) "Walk BASIC-BLOCK children and return their name in reversed post-order." (let ((visited (make-hash-table)) (acc ())) @@ -2270,7 +2271,7 @@ blocks." (collect-rec basic-block) acc))) -(defun comp-compute-dominator-tree () +(defun comp--compute-dominator-tree () "Compute immediate dominators for each basic block in current function." ;; Originally based on: "A Simple, Fast Dominance Algorithm" ;; Cooper, Keith D.; Harvey, Timothy J.; Kennedy, Ken (2001). @@ -2295,7 +2296,7 @@ blocks." ;; No point to go on if the only bb is 'entry'. (bb0 (gethash 'bb_0 blocks))) (cl-loop - with rev-bb-list = (comp-collect-rev-post-order entry) + with rev-bb-list = (comp--collect-rev-post-order entry) with changed = t while changed initially (progn @@ -2322,7 +2323,7 @@ blocks." new-idom) changed t)))))) -(defun comp-compute-dominator-frontiers () +(defun comp--compute-dominator-frontiers () "Compute the dominator frontier for each basic block in `comp-func'." ;; Originally based on: "A Simple, Fast Dominance Algorithm" ;; Cooper, Keith D.; Harvey, Timothy J.; Kennedy, Ken (2001). @@ -2337,7 +2338,7 @@ blocks." (puthash b-name b (comp-block-df runner)) (setf runner (comp-block-idom runner)))))) -(defun comp-log-block-info () +(defun comp--log-block-info () "Log basic blocks info for the current function." (maphash (lambda (name bb) (let ((dom (comp-block-idom bb)) @@ -2350,7 +2351,7 @@ blocks." 3))) (comp-func-blocks comp-func))) -(defun comp-place-phis () +(defun comp--place-phis () "Place phi insns into the current function." ;; Originally based on: Static Single Assignment Book ;; Algorithm 3.1: Standard algorithm for inserting phi-functions @@ -2391,7 +2392,7 @@ blocks." (unless (cl-find y defs-v) (push y w)))))))) -(defun comp-dom-tree-walker (bb pre-lambda post-lambda) +(defun comp--dom-tree-walker (bb pre-lambda post-lambda) "Dominator tree walker function starting from basic block BB. PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." (when pre-lambda @@ -2401,18 +2402,18 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." for child = (comp-edge-dst ed) when (eq bb (comp-block-idom child)) ;; Current block is the immediate dominator then recur. - do (comp-dom-tree-walker child pre-lambda post-lambda))) + do (comp--dom-tree-walker child pre-lambda post-lambda))) (when post-lambda (funcall post-lambda bb))) -(cl-defstruct (comp-ssa (:copier nil)) +(cl-defstruct (comp--ssa (:copier nil)) "Support structure used while SSA renaming." - (frame (comp-new-frame (comp-func-frame-size comp-func) + (frame (comp--new-frame (comp-func-frame-size comp-func) (comp-func-vframe-size comp-func) t) :type comp-vec :documentation "`comp-vec' of m-vars.")) -(defun comp-ssa-rename-insn (insn frame) +(defun comp--ssa-rename-insn (insn frame) (cl-loop for slot-n from (- (comp-func-vframe-size comp-func)) below (comp-func-frame-size comp-func) @@ -2423,7 +2424,7 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." (eql slot-n (comp-mvar-slot x)))) (new-lvalue () ;; If is an assignment make a new mvar and put it as l-value. - (let ((mvar (make-comp-ssa-mvar :slot slot-n))) + (let ((mvar (make--comp--ssa-mvar :slot slot-n))) (setf (comp-vec-aref frame slot-n) mvar (cadr insn) mvar)))) (pcase insn @@ -2433,7 +2434,7 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." (new-lvalue)) (`(fetch-handler . ,_) ;; Clobber all no matter what! - (setf (comp-vec-aref frame slot-n) (make-comp-ssa-mvar :slot slot-n))) + (setf (comp-vec-aref frame slot-n) (make--comp--ssa-mvar :slot slot-n))) (`(phi ,n) (when (equal n slot-n) (new-lvalue))) @@ -2441,7 +2442,7 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." (let ((mvar (comp-vec-aref frame slot-n))) (setcdr insn (cl-nsubst-if mvar #'targetp (cdr insn))))))))) -(defun comp-ssa-rename () +(defun comp--ssa-rename () "Entry point to rename into SSA within the current function." (comp-log "Renaming\n" 2) (let ((visited (make-hash-table))) @@ -2449,7 +2450,7 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." (unless (gethash bb visited) (puthash bb t visited) (cl-loop for insn in (comp-block-insns bb) - do (comp-ssa-rename-insn insn in-frame)) + do (comp--ssa-rename-insn insn in-frame)) (setf (comp-block-final-frame bb) (copy-sequence in-frame)) (when-let ((out-edges (comp-block-out-edges bb))) @@ -2460,11 +2461,11 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." do (ssa-rename-rec child (comp-vec-copy in-frame))))))) (ssa-rename-rec (gethash 'entry (comp-func-blocks comp-func)) - (comp-new-frame (comp-func-frame-size comp-func) + (comp--new-frame (comp-func-frame-size comp-func) (comp-func-vframe-size comp-func) t))))) -(defun comp-finalize-phis () +(defun comp--finalize-phis () "Fixup r-values into phis in all basic blocks." (cl-flet ((finalize-phi (args b) ;; Concatenate into args all incoming m-vars for this phi. @@ -2481,7 +2482,7 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non-nil." when (eq op 'phi) do (finalize-phi args b))))) -(defun comp-remove-unreachable-blocks () +(defun comp--remove-unreachable-blocks () "Remove unreachable basic blocks. Return t when one or more block was removed, nil otherwise." (cl-loop @@ -2497,7 +2498,7 @@ Return t when one or more block was removed, nil otherwise." ret t) finally return ret)) -(defun comp-ssa () +(defun comp--ssa () "Port all functions into minimal SSA form." (maphash (lambda (_ f) (let* ((comp-func f) @@ -2505,15 +2506,15 @@ Return t when one or more block was removed, nil otherwise." (unless (eq ssa-status t) (cl-loop when (eq ssa-status 'dirty) - do (comp-clean-ssa f) - do (comp-compute-edges) - (comp-compute-dominator-tree) - until (null (comp-remove-unreachable-blocks))) - (comp-compute-dominator-frontiers) - (comp-log-block-info) - (comp-place-phis) - (comp-ssa-rename) - (comp-finalize-phis) + do (comp--clean-ssa f) + do (comp--compute-edges) + (comp--compute-dominator-tree) + until (null (comp--remove-unreachable-blocks))) + (comp--compute-dominator-frontiers) + (comp--log-block-info) + (comp--place-phis) + (comp--ssa-rename) + (comp--finalize-phis) (comp--log-func comp-func 3) (setf (comp-func-ssa-status f) t)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2525,12 +2526,12 @@ Return t when one or more block was removed, nil otherwise." ;; This is also responsible for removing function calls to pure functions if ;; possible. -(defconst comp-fwprop-max-insns-scan 4500 +(defconst comp--fwprop-max-insns-scan 4500 ;; Chosen as ~ the greatest required value for full convergence ;; native compiling all Emacs code-base. "Max number of scanned insn before giving-up.") -(defun comp-copy-insn (insn) +(defun comp--copy-insn (insn) "Deep copy INSN." ;; Adapted from `copy-tree'. (if (consp insn) @@ -2538,16 +2539,16 @@ Return t when one or more block was removed, nil otherwise." (while (consp insn) (let ((newcar (car insn))) (if (or (consp (car insn)) (comp-mvar-p (car insn))) - (setf newcar (comp-copy-insn (car insn)))) + (setf newcar (comp--copy-insn (car insn)))) (push newcar result)) (setf insn (cdr insn))) (nconc (nreverse result) - (if (comp-mvar-p insn) (comp-copy-insn insn) insn))) + (if (comp-mvar-p insn) (comp--copy-insn insn) insn))) (if (comp-mvar-p insn) (copy-comp-mvar insn) insn))) -(defmacro comp-apply-in-env (func &rest args) +(defmacro comp--apply-in-env (func &rest args) "Apply FUNC to ARGS in the current compilation environment." `(let ((env (cl-loop for f being the hash-value in (comp-ctxt-funcs-h comp-ctxt) @@ -2563,7 +2564,7 @@ Return t when one or more block was removed, nil otherwise." for (func-name . def) in env do (setf (symbol-function func-name) def))))) -(defun comp-fwprop-prologue () +(defun comp--fwprop-prologue () "Prologue for the propagate pass. Here goes everything that can be done not iteratively (read once). Forward propagate immediate involed in assignments." ; FIXME: Typo. Involved or invoked? @@ -2575,16 +2576,16 @@ Forward propagate immediate involed in assignments." ; FIXME: Typo. Involved or (`(setimm ,lval ,v) (setf (comp-cstr-imm lval) v)))))) -(defun comp-function-foldable-p (f args) +(defun comp--function-foldable-p (f args) "Given function F called with ARGS, return non-nil when optimizable." (and (comp--function-pure-p f) (cl-every #'comp-cstr-imm-vld-p args))) -(defun comp-function-call-maybe-fold (insn f args) +(defun comp--function-call-maybe-fold (insn f args) "Given INSN, when F is pure if all ARGS are known, remove the function call. Return non-nil if the function is folded successfully." (cl-flet ((rewrite-insn-as-setimm (insn value) - ;; See `comp-emit-setimm'. + ;; See `comp--emit-setimm'. (comp--add-const-to-relocs value) (setf (car insn) 'setimm (cddr insn) `(,value)))) @@ -2596,7 +2597,7 @@ Return non-nil if the function is folded successfully." comp-symbol-values-optimizable))) (rewrite-insn-as-setimm insn (symbol-value (comp-cstr-imm (car args)))))) - ((comp-function-foldable-p f args) + ((comp--function-foldable-p f args) (ignore-errors ;; No point to complain here in case of error because we ;; should do basic block pruning in order to be sure that this @@ -2607,14 +2608,14 @@ Return non-nil if the function is folded successfully." ;; and know to be pure. (comp-func-byte-func f-in-ctxt) f)) - (value (comp-apply-in-env f (mapcar #'comp-cstr-imm args)))) + (value (comp--apply-in-env f (mapcar #'comp-cstr-imm args)))) (rewrite-insn-as-setimm insn value))))))) -(defun comp-fwprop-call (insn lval f args) +(defun comp--fwprop-call (insn lval f args) "Propagate on a call INSN into LVAL. F is the function being called with arguments ARGS. Fold the call in case." - (unless (comp-function-call-maybe-fold insn f args) + (unless (comp--function-call-maybe-fold insn f args) (when (and (eq 'funcall f) (comp-cstr-imm-vld-p (car args))) (setf f (comp-cstr-imm (car args)) @@ -2635,16 +2636,16 @@ Fold the call in case." (comp-type-spec-to-cstr (comp-cstr-imm (car args))))))))) -(defun comp-fwprop-insn (insn) +(defun comp--fwprop-insn (insn) "Propagate within INSN." (pcase insn (`(set ,lval ,rval) (pcase rval (`(,(or 'call 'callref) ,f . ,args) - (comp-fwprop-call insn lval f args)) + (comp--fwprop-call insn lval f args)) (`(,(or 'direct-call 'direct-callref) ,f . ,args) (let ((f (comp-func-name (gethash f (comp-ctxt-funcs-h comp-ctxt))))) - (comp-fwprop-call insn lval f args))) + (comp--fwprop-call insn lval f args))) (_ (comp-cstr-shallow-copy lval rval)))) (`(assume ,lval ,(and (pred comp-mvar-p) rval)) @@ -2689,7 +2690,7 @@ Fold the call in case." (rvals (mapcar #'car rest))) (apply prop-fn lval rvals))))) -(defun comp-fwprop* () +(defun comp--fwprop* () "Propagate for set* and phi operands. Return t if something was changed." (cl-loop named outer @@ -2701,17 +2702,17 @@ Return t if something was changed." for insn in (comp-block-insns b) for orig-insn = (unless modified ;; Save consing after 1st change. - (comp-copy-insn insn)) + (comp--copy-insn insn)) do - (comp-fwprop-insn insn) + (comp--fwprop-insn insn) (cl-incf i) when (and (null modified) (not (equal insn orig-insn))) do (setf modified t)) - when (> i comp-fwprop-max-insns-scan) + when (> i comp--fwprop-max-insns-scan) do (cl-return-from outer nil) finally return modified)) -(defun comp-rewrite-non-locals () +(defun comp--rewrite-non-locals () "Make explicit in LIMPLE non-local exits if identified." (cl-loop for bb being each hash-value of (comp-func-blocks comp-func) @@ -2728,26 +2729,26 @@ Return t if something was changed." (cdr insn-seq) '((unreachable)) (comp-func-ssa-status comp-func) 'dirty)))) -(defun comp-fwprop (_) +(defun comp--fwprop (_) "Forward propagate types and consts within the lattice." - (comp-ssa) - (comp-dead-code) + (comp--ssa) + (comp--dead-code) (maphash (lambda (_ f) (when (and (>= (comp-func-speed f) 2) ;; FIXME remove the following condition when tested. (not (comp-func-has-non-local f))) (let ((comp-func f)) - (comp-fwprop-prologue) + (comp--fwprop-prologue) (cl-loop for i from 1 to 100 - while (comp-fwprop*) + while (comp--fwprop*) finally (when (= i 100) (display-warning 'comp (format "fwprop pass jammed into %s?" (comp-func-name f)))) (comp-log (format "Propagation run %d times\n" i) 2)) - (comp-rewrite-non-locals) + (comp--rewrite-non-locals) (comp--log-func comp-func 3)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2767,7 +2768,7 @@ Return t if something was changed." ;; the full compilation unit. ;; For this reason this is triggered only at native-comp-speed == 3. -(defun comp-func-in-unit (func) +(defun comp--func-in-unit (func) "Given FUNC return the `comp-fun' definition in the current context. FUNCTION can be a function-name or byte compiled function." (if (symbolp func) @@ -2775,11 +2776,11 @@ FUNCTION can be a function-name or byte compiled function." (cl-assert (byte-code-function-p func)) (gethash func (comp-ctxt-byte-func-to-func-h comp-ctxt)))) -(defun comp-call-optim-form-call (callee args) +(defun comp--call-optim-form-call (callee args) (cl-flet ((fill-args (args total) ;; Fill missing args to reach TOTAL (append args (cl-loop repeat (- total (length args)) - collect (make-comp-mvar :constant nil))))) + collect (make--comp-mvar :constant nil))))) (when (and callee (or (symbolp callee) (gethash callee (comp-ctxt-byte-func-to-func-h comp-ctxt))) @@ -2797,7 +2798,7 @@ FUNCTION can be a function-name or byte compiled function." ;; actually cheaper since it avoids the call to the ;; intermediate native trampoline (bug#67005). (subrp (subrp f)) - (comp-func-callee (comp-func-in-unit callee))) + (comp-func-callee (comp--func-in-unit callee))) (cond ((and subrp (not (subr-native-elisp-p f))) ;; Trampoline removal. @@ -2832,30 +2833,30 @@ FUNCTION can be a function-name or byte compiled function." ((comp--type-hint-p callee) `(call ,callee ,@args))))))) -(defun comp-call-optim-func () +(defun comp--call-optim-func () "Perform the trampoline call optimization for the current function." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) - do (comp-loop-insn-in-block b + do (comp--loop-insn-in-block b (pcase insn (`(set ,lval (callref funcall ,f . ,rest)) (when-let ((ok (comp-cstr-imm-vld-p f)) - (new-form (comp-call-optim-form-call + (new-form (comp--call-optim-form-call (comp-cstr-imm f) rest))) (setf insn `(set ,lval ,new-form)))) (`(callref funcall ,f . ,rest) (when-let ((ok (comp-cstr-imm-vld-p f)) - (new-form (comp-call-optim-form-call + (new-form (comp--call-optim-form-call (comp-cstr-imm f) rest))) (setf insn new-form))))))) -(defun comp-call-optim (_) +(defun comp--call-optim (_) "Try to optimize out funcall trampoline usage when possible." (maphash (lambda (_ f) (when (and (>= (comp-func-speed f) 2) (comp-func-l-p f)) (let ((comp-func f)) - (comp-call-optim-func)))) + (comp--call-optim-func)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2866,16 +2867,16 @@ FUNCTION can be a function-name or byte compiled function." ;; ;; This pass can be run as last optim. -(defun comp-collect-mvar-ids (insn) +(defun comp--collect-mvar-ids (insn) "Collect the m-var unique identifiers into INSN." (cl-loop for x in insn if (consp x) - append (comp-collect-mvar-ids x) + append (comp--collect-mvar-ids x) else when (comp-mvar-p x) collect (comp-mvar-id x))) -(defun comp-dead-assignments-func () +(defun comp--dead-assignments-func () "Clean-up dead assignments into current function. Return the list of m-var ids nuked." (let ((l-vals ()) @@ -2888,9 +2889,9 @@ Return the list of m-var ids nuked." for (op arg0 . rest) = insn if (comp--assign-op-p op) do (push (comp-mvar-id arg0) l-vals) - (setf r-vals (nconc (comp-collect-mvar-ids rest) r-vals)) + (setf r-vals (nconc (comp--collect-mvar-ids rest) r-vals)) else - do (setf r-vals (nconc (comp-collect-mvar-ids insn) r-vals)))) + do (setf r-vals (nconc (comp--collect-mvar-ids insn) r-vals)))) ;; Every l-value appearing that does not appear as r-value has no right to ;; exist and gets nuked. (let ((nuke-list (cl-set-difference l-vals r-vals))) @@ -2902,7 +2903,7 @@ Return the list of m-var ids nuked." 3) (cl-loop for b being each hash-value of (comp-func-blocks comp-func) - do (comp-loop-insn-in-block b + do (comp--loop-insn-in-block b (cl-destructuring-bind (op &optional arg0 arg1 &rest rest) insn (when (and (comp--assign-op-p op) (memq (comp-mvar-id arg0) nuke-list)) @@ -2913,7 +2914,7 @@ Return the list of m-var ids nuked." insn)))))))) nuke-list))) -(defun comp-dead-code () +(defun comp--dead-code () "Dead code elimination." (maphash (lambda (_ f) (when (and (>= (comp-func-speed f) 2) @@ -2922,7 +2923,7 @@ Return the list of m-var ids nuked." (cl-loop for comp-func = f for i from 1 - while (comp-dead-assignments-func) + while (comp--dead-assignments-func) finally (comp-log (format "dead code rm run %d times\n" i) 2) (comp--log-func comp-func 3)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2930,14 +2931,14 @@ Return the list of m-var ids nuked." ;;; Tail Call Optimization pass specific code. -(defun comp-form-tco-call-seq (args) +(defun comp--form-tco-call-seq (args) "Generate a TCO sequence for ARGS." `(,@(cl-loop for arg in args for i from 0 - collect `(set ,(make-comp-mvar :slot i) ,arg)) + collect `(set ,(make--comp-mvar :slot i) ,arg)) (jump bb_0))) -(defun comp-tco-func () +(defun comp--tco-func () "Try to pattern match and perform TCO within the current function." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) @@ -2950,20 +2951,20 @@ Return the list of m-var ids nuked." (return ,ret-val)) (when (and (string= func (comp-func-c-name comp-func)) (eq l-val ret-val)) - (let ((tco-seq (comp-form-tco-call-seq args))) + (let ((tco-seq (comp--form-tco-call-seq args))) (setf (car insns-seq) (car tco-seq) (cdr insns-seq) (cdr tco-seq) (comp-func-ssa-status comp-func) 'dirty) (cl-return-from in-the-basic-block)))))))) -(defun comp-tco (_) +(defun comp--tco (_) "Simple peephole pass performing self TCO." (maphash (lambda (_ f) (when (and (>= (comp-func-speed f) 3) (comp-func-l-p f) (not (comp-func-has-non-local f))) (let ((comp-func f)) - (comp-tco-func) + (comp--tco-func) (comp--log-func comp-func 3)))) (comp-ctxt-funcs-h comp-ctxt))) @@ -2973,29 +2974,29 @@ Return the list of m-var ids nuked." ;; This must run after all SSA prop not to have the type hint ;; information overwritten. -(defun comp-remove-type-hints-func () +(defun comp--remove-type-hints-func () "Remove type hints from the current function. These are substituted with a normal `set' op." (cl-loop for b being each hash-value of (comp-func-blocks comp-func) - do (comp-loop-insn-in-block b + do (comp--loop-insn-in-block b (pcase insn (`(set ,l-val (call ,(pred comp--type-hint-p) ,r-val)) (setf insn `(set ,l-val ,r-val))))))) -(defun comp-remove-type-hints (_) +(defun comp--remove-type-hints (_) "Dead code elimination." (maphash (lambda (_ f) (when (>= (comp-func-speed f) 2) (let ((comp-func f)) - (comp-remove-type-hints-func) + (comp--remove-type-hints-func) (comp--log-func comp-func 3)))) (comp-ctxt-funcs-h comp-ctxt))) ;;; Final pass specific code. -(defun comp-args-to-lambda-list (args) +(defun comp--args-to-lambda-list (args) "Return a lambda list for ARGS." (cl-loop with res @@ -3020,7 +3021,7 @@ These are substituted with a normal `set' op." (push 't res)))) (cl-return (reverse res)))) -(defun comp-compute-function-type (_ func) +(defun comp--compute-function-type (_ func) "Compute type specifier for `comp-func' FUNC. Set it into the `type' slot." (when (and (comp-func-l-p func) @@ -3040,13 +3041,13 @@ Set it into the `type' slot." (`(return ,mvar) (push mvar res)))) finally return res))) - (type `(function ,(comp-args-to-lambda-list (comp-func-l-args func)) + (type `(function ,(comp--args-to-lambda-list (comp-func-l-args func)) ,(comp-cstr-to-type-spec res-mvar)))) (comp--add-const-to-relocs type) ;; Fix it up. (setf (comp-cstr-imm (comp-func-type func)) type)))) -(defun comp-finalize-container (cont) +(defun comp--finalize-container (cont) "Finalize data container CONT." (setf (comp-data-container-l cont) (cl-loop with h = (comp-data-container-idx cont) @@ -3064,7 +3065,7 @@ Set it into the `type' slot." 'lambda-fixup obj)))) -(defun comp-finalize-relocs () +(defun comp--finalize-relocs () "Finalize data containers for each relocation class. Remove immediate duplicates within relocation classes. Update all insn accordingly." @@ -3080,7 +3081,7 @@ Update all insn accordingly." (d-ephemeral (comp-ctxt-d-ephemeral comp-ctxt)) (d-ephemeral-idx (comp-data-container-idx d-ephemeral))) ;; We never want compiled lambdas ending up in pure space. A copy must - ;; be already present in impure (see `comp-emit-lambda-for-top-level'). + ;; be already present in impure (see `comp--emit-lambda-for-top-level'). (cl-loop for obj being each hash-keys of d-default-idx when (gethash obj (comp-ctxt-lambda-fixups-h comp-ctxt)) do (cl-assert (gethash obj d-impure-idx)) @@ -3096,7 +3097,7 @@ Update all insn accordingly." do (remhash obj d-ephemeral-idx)) ;; Fix-up indexes in each relocation class and fill corresponding ;; reloc lists. - (mapc #'comp-finalize-container (list d-default d-impure d-ephemeral)) + (mapc #'comp--finalize-container (list d-default d-impure d-ephemeral)) ;; Make a vector from the function documentation hash table. (cl-loop with h = (comp-ctxt-function-docs comp-ctxt) with v = (make-vector (hash-table-count h) nil) @@ -3120,11 +3121,11 @@ Update all insn accordingly." (comp-mvar-range mvar) (list (cons idx idx))) (puthash idx t reverse-h)))) -(defun comp-compile-ctxt-to-file (name) +(defun comp--compile-ctxt-to-file (name) "Compile as native code the current context naming it NAME. Prepare every function for final compilation and drive the C back-end." (let ((dir (file-name-directory name))) - (comp-finalize-relocs) + (comp--finalize-relocs) (maphash (lambda (_ f) (comp--log-func f 1)) (comp-ctxt-funcs-h comp-ctxt)) @@ -3132,12 +3133,12 @@ Prepare every function for final compilation and drive the C back-end." ;; In case it's created in the meanwhile. (ignore-error file-already-exists (make-directory dir t))) - (comp--compile-ctxt-to-file name))) + (comp--compile-ctxt-to-file0 name))) -(defun comp-final1 () +(defun comp--final1 () (comp--init-ctxt) (unwind-protect - (comp-compile-ctxt-to-file (comp-ctxt-output comp-ctxt)) + (comp--compile-ctxt-to-file (comp-ctxt-output comp-ctxt)) (comp--release-ctxt))) (defvar comp-async-compilation nil @@ -3146,17 +3147,17 @@ Prepare every function for final compilation and drive the C back-end." (defvar comp-running-batch-compilation nil "Non-nil when compilation is driven by any `batch-*-compile' function.") -(defun comp-final (_) +(defun comp--final (_) "Final pass driving the C back-end for code emission." - (maphash #'comp-compute-function-type (comp-ctxt-funcs-h comp-ctxt)) + (maphash #'comp--compute-function-type (comp-ctxt-funcs-h comp-ctxt)) (unless comp-dry-run ;; Always run the C side of the compilation as a sub-process ;; unless during bootstrap or async compilation (bug#45056). GCC ;; leaks memory but also interfere with the ability of Emacs to ;; detect when a sub-process completes (TODO understand why). (if (or comp-running-batch-compilation comp-async-compilation) - (comp-final1) - ;; Call comp-final1 in a child process. + (comp--final1) + ;; Call comp--final1 in a child process. (let* ((output (comp-ctxt-output comp-ctxt)) (print-escape-newlines t) (print-length nil) @@ -3178,7 +3179,7 @@ Prepare every function for final compilation and drive the C back-end." load-path ',load-path) ,native-comp-async-env-modifier-form (message "Compiling %s..." ',output) - (comp-final1))) + (comp--final1))) (temp-file (make-temp-file (concat "emacs-int-comp-" (file-name-base output) "-") @@ -3222,7 +3223,7 @@ Prepare every function for final compilation and drive the C back-end." ;; Primitive function advice machinery -(defun comp-make-lambda-list-from-subr (subr) +(defun comp--make-lambda-list-from-subr (subr) "Given SUBR return the equivalent lambda-list." (pcase-let ((`(,min . ,max) (subr-arity subr)) (lambda-list '())) @@ -3266,7 +3267,7 @@ Prepare every function for final compilation and drive the C back-end." ;;;###autoload (defun comp-trampoline-compile (subr-name) "Synthesize compile and return a trampoline for SUBR-NAME." - (let* ((lambda-list (comp-make-lambda-list-from-subr + (let* ((lambda-list (comp--make-lambda-list-from-subr (symbol-function subr-name))) ;; The synthesized trampoline must expose the exact same ABI of ;; the primitive we are replacing in the function reloc table. @@ -3310,6 +3311,7 @@ filename (including FILE)." do (ignore-error file-error (comp-delete-or-replace-file f)))))) +;; In use by comp.c. (defun comp-delete-or-replace-file (oldfile &optional newfile) "Replace OLDFILE with NEWFILE. When NEWFILE is nil just delete OLDFILE. @@ -3493,7 +3495,7 @@ last directory in `native-comp-eln-load-path')." else collect (byte-compile-file file)))) -(defun comp-write-bytecode-file (eln-file) +(defun comp--write-bytecode-file (eln-file) "After native compilation write the bytecode file for ELN-FILE. Make sure that eln file is younger than byte-compiled one and return the filename of this last. @@ -3530,7 +3532,7 @@ variable \"NATIVE_DISABLED\" is set, only byte compile." (car (last native-comp-eln-load-path))) (byte-to-native-output-buffer-file nil) (eln-file (car (batch-native-compile)))) - (comp-write-bytecode-file eln-file) + (comp--write-bytecode-file eln-file) (setq command-line-args-left (cdr command-line-args-left))))) (defun native-compile-prune-cache () diff --git a/src/comp.c b/src/comp.c index 853757f6162..3f989c722d4 100644 --- a/src/comp.c +++ b/src/comp.c @@ -4859,8 +4859,8 @@ add_compiler_options (void) #endif } -DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file, - Scomp__compile_ctxt_to_file, +DEFUN ("comp--compile-ctxt-to-file0", Fcomp__compile_ctxt_to_file0, + Scomp__compile_ctxt_to_file0, 1, 1, 0, doc: /* Compile the current context as native code to file FILENAME. */) (Lisp_Object filename) @@ -5789,7 +5789,7 @@ natively-compiled one. */); defsubr (&Scomp__install_trampoline); defsubr (&Scomp__init_ctxt); defsubr (&Scomp__release_ctxt); - defsubr (&Scomp__compile_ctxt_to_file); + defsubr (&Scomp__compile_ctxt_to_file0); defsubr (&Scomp_libgccjit_version); defsubr (&Scomp__register_lambda); defsubr (&Scomp__register_subr); diff --git a/test/src/comp-resources/comp-test-funcs.el b/test/src/comp-resources/comp-test-funcs.el index 4cee084e211..dc4abf50767 100644 --- a/test/src/comp-resources/comp-test-funcs.el +++ b/test/src/comp-resources/comp-test-funcs.el @@ -367,11 +367,11 @@ (while (consp insn) (let ((newcar (car insn))) (if (or (consp (car insn)) (comp-mvar-p (car insn))) - (setf newcar (comp-copy-insn (car insn)))) + (setf newcar (comp--copy-insn (car insn)))) (push newcar result)) (setf insn (cdr insn))) (nconc (nreverse result) - (if (comp-mvar-p insn) (comp-copy-insn insn) insn))) + (if (comp-mvar-p insn) (comp--copy-insn insn) insn))) (if (comp-mvar-p insn) (copy-comp-mvar insn) insn))) From c0f656617d6848b94413b79b390788565d338fcd Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Sun, 11 Feb 2024 22:32:44 +0200 Subject: [PATCH 125/446] Make sure the binding shown by echo-keystrokes-help is not shadowed And choose just one binding to display rather than two together. (https://lists.gnu.org/archive/html/emacs-devel/2024-02/msg00311.html) * lisp/help.el (help--append-keystrokes-help): New function. * src/keyboard.c (syms_of_keyboard): Add a symbol for it. (echo_dash): Use them here. --- lisp/help.el | 21 +++++++++++++++++++++ src/keyboard.c | 13 +++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index 72a4f8a800d..07eed2861c2 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -2253,6 +2253,27 @@ The `temp-buffer-window-setup-hook' hook is called." (with-output-to-temp-buffer " *Char Help*" (princ msg))))) +(defun help--append-keystrokes-help (str) + (let* ((keys (this-single-command-keys)) + (bindings (delete nil + (mapcar (lambda (map) (lookup-key map keys t)) + (current-active-maps t))))) + (catch 'res + (dolist (val help-event-list) + (let ((key (vector (if (eql val 'help) + help-char + val)))) + (unless (seq-find (lambda (map) (and (keymapp map) (lookup-key map key))) + bindings) + (throw 'res + (concat + str + (substitute-command-keys + (format + " (\\`%s' for help)" + (key-description key)))))))) + str))) + (defun help--docstring-quote (string) "Return a doc string that represents STRING. diff --git a/src/keyboard.c b/src/keyboard.c index 10cdef67348..4b5e20fb24c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -594,14 +594,9 @@ echo_dash (void) concat2 (KVAR (current_kboard, echo_string), dash)); if (echo_keystrokes_help) - { - Lisp_Object help; - - help = build_string (" (\\`C-h' or \\`' for help)"); - kset_echo_string (current_kboard, - concat2 (KVAR (current_kboard, echo_string), - calln (Qsubstitute_command_keys, help))); - } + kset_echo_string (current_kboard, + calln (Qhelp__append_keystrokes_help, + KVAR (current_kboard, echo_string))); echo_now (); } @@ -12962,6 +12957,8 @@ syms_of_keyboard (void) DEFSYM (Qhelp_key_binding, "help-key-binding"); + DEFSYM (Qhelp__append_keystrokes_help, "help--append-keystrokes-help"); + DEFSYM (Qecho_keystrokes, "echo-keystrokes"); Fset (Qinput_method_exit_on_first_char, Qnil); From db195116a4279521e9cf03c52b7026032461e3e1 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Wed, 13 Sep 2023 12:26:22 +0200 Subject: [PATCH 126/446] Add the public API of Compat to the core * lisp/emacs-lisp/compat.el: Add stub file with minimal definitions, so that core packages, that haven't been installed from ELPA, can make use of the public API and use more recent function signatures. * lisp/progmodes/python.el (compat): Remove 'noerror flag, because Compat can now be required without the real package being available. * doc/lispref/package.texi (Forwards-Compatibility): Mention Compat and link to the manual. * etc/NEWS: Document change. (Bug#66554) --- doc/lispref/package.texi | 48 ++++++++++++++++++++ etc/NEWS | 7 +++ lisp/emacs-lisp/compat.el | 92 +++++++++++++++++++++++++++++++++++++++ lisp/progmodes/python.el | 2 +- 4 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 lisp/emacs-lisp/compat.el diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi index f75023d4039..421e64dd5d1 100644 --- a/doc/lispref/package.texi +++ b/doc/lispref/package.texi @@ -28,6 +28,7 @@ these archives). * Multi-file Packages:: How to package multiple files. * Package Archives:: Maintaining package archives. * Archive Web Server:: Interfacing to an archive web server. +* Forwards-Compatibility:: Supporting older versions of Emacs. @end menu @node Packaging Basics @@ -399,3 +400,50 @@ Return the file. This will be the tarball for a multi-file package, or the single file for a simple package. @end table + +@node Forwards-Compatibility +@section Supporting older versions of Emacs +@cindex compatibility compat + +Packages that wish to support older releases of Emacs, without giving +up on newer functionality from recent Emacs releases, one can make use +of the Compat package on GNU ELPA. By depending on the package, Emacs +can provide compatibility definitions for missing functionality. + +The versioning of Compat follows that of Emacs, so next to the oldest +version that a package relies on (via the @code{emacs}-package), one +can also indicate what the newest version of Emacs is, that a package +wishes to use definitions from: + +@example +;; Package-Requires: ((emacs "27.2") (compat "29.1")) +@end example + +Note that Compat provides replacement functions with extended +functionality for functions that are already defined (@code{sort}, +@code{assoc}, @dots{}). These functions may have changed their +calling convention (additional optional arguments) or may have changed +their behavior. These functions must be looked up explicitly with +@code{compat-function} or called explicitly with @code{compat-call}. +We call them @dfn{Extended Definitions}. In contrast, newly @dfn{Added +Definitions} can be called as usual. + +@defmac compat-call fun &rest args +This macro calls the compatibility function @var{fun} with @var{args}. +Many functions provided by Compat can be called directly without this +macro. However in the case where Compat provides an alternative +version of an existing function, the function call has to go through +@code{compat-call}. +@end defmac + +@defmac compat-function fun +This macro returns the compatibility function symbol for @var{fun}. +See @code{compat-call} for a more convenient macro to directly call +compatibility functions. +@end defmac + +For further details on how to make use of the package, see +@ref{Usage,, Usage, compat, "Compat" Manual}. In case you don't have +the manual installed, you can also read the +@url{https://elpa.gnu.org/packages/doc/compat.html#Usage, Online +Compat manual}. diff --git a/etc/NEWS b/etc/NEWS index 5ee1509859b..de1f2fd9d2a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1396,6 +1396,13 @@ This minor mode generates the tags table automatically based on the current project configuration, and later updates it as you edit the files and save the changes. ++++ +** New package Compat +Emacs now comes with a stub implementation of the +forwards-compatibility Compat package from GNU ELPA. This allows +built-in packages to use the library more effectively, and helps +preventing the installation of Compat if unnecessary. + * Incompatible Lisp Changes in Emacs 30.1 diff --git a/lisp/emacs-lisp/compat.el b/lisp/emacs-lisp/compat.el new file mode 100644 index 00000000000..f7037dc4101 --- /dev/null +++ b/lisp/emacs-lisp/compat.el @@ -0,0 +1,92 @@ +;;; compat.el --- Stub of the Compatibility Library -*- lexical-binding: t; -*- + +;; Copyright (C) 2021-2024 Free Software Foundation, Inc. + +;; Author: \ +;; Philip Kaludercic , \ +;; Daniel Mendler +;; Maintainer: \ +;; Daniel Mendler , \ +;; Compat Development <~pkal/compat-devel@lists.sr.ht>, +;; emacs-devel@gnu.org +;; URL: https://github.com/emacs-compat/compat +;; Keywords: lisp, maint + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; The Compat package on ELPA provides forward-compatibility +;; definitions for other packages. While mostly transparent, a +;; minimal API is necessary whenever core definitions change calling +;; conventions (e.g. `plist-get' can be invoked with a predicate from +;; Emacs 29.1 onward). For core packages on ELPA to be able to take +;; advantage of this functionality, the macros `compat-function' and +;; `compat-call' have to be available in the core, usable even if +;; users do not have the Compat package installed, which this file +;; ensures. + +;; A basic introduction to Compat is given in the Info node `(elisp) +;; Forwards Compatibility'. Further details on Compat are documented +;; in the Info node `(compat) Top' (installed along with the Compat +;; package) or read the same manual online: +;; https://elpa.gnu.org/packages/doc/compat.html. + +;;; Code: + +(defmacro compat-function (fun) + "Return compatibility function symbol for FUN. +This is a pseudo-compatibility stub for core packages on ELPA, +that depend on the Compat package, whenever the user doesn't have +the package installed on their current system." + `#',fun) + +(defmacro compat-call (fun &rest args) + "Call compatibility function or macro FUN with ARGS. +This is a pseudo-compatibility stub for core packages on ELPA, +that depend on the Compat package, whenever the user doesn't have +the package installed on their current system." + (cons fun args)) + +;;;; Clever trick to avoid installing Compat if not necessary + +;; The versioning scheme of the Compat package follows that of Emacs, +;; to indicate the version of Emacs, that functionality is being +;; provided for. For example, the Compat version number 29.2.3.9 +;; would attempt to provide compatibility definitions up to Emacs +;; 29.2, while also designating that this is the third major release +;; and ninth minor release of Compat, for the specific Emacs release. + +;; The package version of this file is specified programmatically, +;; instead of giving a fixed version in the header of this file. This +;; is done to ensure that the version of compat.el provided by Emacs +;; always corresponds to the current version of Emacs. In addition to +;; the major-minor version, a large "major release" makes sure that +;; the built-in version of Compat is always preferred over an external +;; installation. This means that if a package specifies a dependency +;; on Compat which matches the current or an older version of Emacs +;; that is being used, no additional dependencies have to be +;; downloaded. +;; +;; Further details and background on this file can be found in the +;; bug#66554 discussion. + +;;;###autoload (push (list 'compat +;;;###autoload emacs-major-version +;;;###autoload emacs-minor-version +;;;###autoload 9999) +;;;###autoload package--builtin-versions) + +(provide 'compat) +;;; compat.el ends here diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index b1654b6a5aa..b7e43f3fc68 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -273,7 +273,7 @@ (eval-when-compile (require 'subr-x)) ;For `string-empty-p' and `string-join'. (require 'treesit) (require 'pcase) -(require 'compat nil 'noerror) +(require 'compat) (require 'project nil 'noerror) (require 'seq) From 998f9d98c3b0611b472f4be963d24a96c0a9e197 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 6 Feb 2024 20:12:15 +0100 Subject: [PATCH 127/446] Tolerate errors while recompiling all packages * lisp/emacs-lisp/package.el (package-recompile-all): Demote errors raised by 'package-recompile'. (Bug#68678) --- lisp/emacs-lisp/package.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 868373f46c2..fe7b10f569a 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2610,7 +2610,8 @@ This is meant to be used only in the case the byte-compiled files are invalid due to changed byte-code, macros or the like." (interactive) (pcase-dolist (`(_ ,pkg-desc) package-alist) - (package-recompile pkg-desc))) + (with-demoted-errors "Error while recompiling: %S" + (package-recompile pkg-desc)))) ;;;###autoload (defun package-autoremove () From 052c2ce0284c5193c9d6768a45a9b3508af51230 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 11 Feb 2024 17:43:37 -0500 Subject: [PATCH 128/446] (pcase): Add buttons to the macros' defs in the docstring of `pcase` * lisp/emacs-lisp/pcase.el (pcase--find-macro-def-regexp): New var. (find-function-regexp-alist): Add entry for `pcase-macro`s. (help-fns--signature): Move declaration to where we know it is valid. (pcase--make-docstring): Add buttons to jump to the definition of Pcase macros. --- lisp/emacs-lisp/pcase.el | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el index 4754d4e720d..880a1829265 100644 --- a/lisp/emacs-lisp/pcase.el +++ b/lisp/emacs-lisp/pcase.el @@ -163,8 +163,12 @@ Emacs Lisp manual for more information and examples." ;; (puthash (car cases) `(,exp ,cases ,@expansion) pcase--memoize-2) expansion)))) -(declare-function help-fns--signature "help-fns" - (function doc real-def real-function buffer)) +(defconst pcase--find-macro-def-regexp "(pcase-defmacro[\s\t\n]+%s[\s\t\n]*(") + +(with-eval-after-load 'find-func + (defvar find-function-regexp-alist) + (add-to-list 'find-function-regexp-alist + `(pcase-macro . pcase--find-macro-def-regexp))) ;; FIXME: Obviously, this will collide with nadvice's use of ;; function-documentation if we happen to advise `pcase'. @@ -174,9 +178,10 @@ Emacs Lisp manual for more information and examples." (defun pcase--make-docstring () (let* ((main (documentation (symbol-function 'pcase) 'raw)) (ud (help-split-fundoc main 'pcase))) - ;; So that eg emacs -Q -l cl-lib --eval "(documentation 'pcase)" works, - ;; where cl-lib is anything using pcase-defmacro. (require 'help-fns) + (declare-function help-fns-short-filename "help-fns" (filename)) + (declare-function help-fns--signature "help-fns" + (function doc real-def real-function buffer)) (with-temp-buffer (insert (or (cdr ud) main)) ;; Presentation Note: For conceptual continuity, we guarantee @@ -197,11 +202,20 @@ Emacs Lisp manual for more information and examples." (let* ((pair (pop more)) (symbol (car pair)) (me (cdr pair)) - (doc (documentation me 'raw))) + (doc (documentation me 'raw)) + (filename (find-lisp-object-file-name me 'defun))) (insert "\n\n-- ") (setq doc (help-fns--signature symbol doc me (indirect-function me) nil)) + (when filename + (save-excursion + (forward-char -1) + (insert (format-message " in `")) + (help-insert-xref-button (help-fns-short-filename filename) + 'help-function-def symbol filename + 'pcase-macro) + (insert (format-message "'.")))) (insert "\n" (or doc "Not documented."))))) (let ((combined-doc (buffer-string))) (if ud (help-add-fundoc-usage combined-doc (car ud)) combined-doc))))) From 9a1522197fb16986c2f641f777d6bef41c348567 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 11 Feb 2024 18:13:27 -0500 Subject: [PATCH 129/446] (cl--generic-describe): Fix regression introduced by fix to bug#54628 Since that fix, we made other changes (put arg names in allcaps) which also happen to fix bug#54628, so we can remove the original fix which was suboptimal when the type includes quotes. * lisp/emacs-lisp/cl-generic.el (cl--generic-describe): Don't rebind `print-quoted` to nil. * test/lisp/emacs-lisp/cl-generic-tests.el (cl-generic-tests--print-quoted): New test. --- lisp/emacs-lisp/cl-generic.el | 5 ++--- test/lisp/emacs-lisp/cl-generic-tests.el | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index bdccdcc48ce..d1bd45120f1 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1145,7 +1145,7 @@ MET-NAME is as returned by `cl--generic-load-hist-format'." (declare-function help-fns-short-filename "help-fns" (filename)) (let ((generic (if (symbolp function) (cl--generic function)))) (when generic - (require 'help-mode) ;Needed for `help-function-def' button! + (require 'help-mode) ;Needed for `help-function-def' button! (save-excursion ;; Ensure that we have two blank lines (but not more). (unless (looking-back "\n\n" (- (point) 2)) @@ -1157,8 +1157,7 @@ MET-NAME is as returned by `cl--generic-load-hist-format'." (pcase-let* ((`(,qualifiers ,args ,doc) (cl--generic-method-info method))) ;; FIXME: Add hyperlinks for the types as well. - (let ((print-quoted nil) - (quals (if (length> qualifiers 0) + (let ((quals (if (length> qualifiers 0) (concat (substring qualifiers 0 (string-match " *\\'" qualifiers)) diff --git a/test/lisp/emacs-lisp/cl-generic-tests.el b/test/lisp/emacs-lisp/cl-generic-tests.el index 086ac399352..990fa580c54 100644 --- a/test/lisp/emacs-lisp/cl-generic-tests.el +++ b/test/lisp/emacs-lisp/cl-generic-tests.el @@ -319,5 +319,19 @@ Edebug symbols (Bug#42672)." (and (eq 'error (car err)) (string-match "Stray.*declare" (cadr err))))))) +(cl-defmethod cl-generic-tests--print-quoted-method ((function (eql '4))) + (+ function 1)) + +(ert-deftest cl-generic-tests--print-quoted () + (with-temp-buffer + (cl--generic-describe 'cl-generic-tests--print-quoted-method) + (goto-char (point-min)) + ;; Bug#54628: We don't want (function (eql '4)) to turn into #'(eql '4) + (should-not (re-search-forward "#'" nil t)) + (goto-char (point-min)) + ;; But we don't want (eql '4) to turn into (eql (quote 4)) either. + (should (re-search-forward "(eql '4)" nil t)))) + + (provide 'cl-generic-tests) ;;; cl-generic-tests.el ends here From 9ebc91795f22ca52ea019b8ce7fb1f6e4c8df826 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Mon, 12 Feb 2024 02:38:30 +0100 Subject: [PATCH 130/446] Remove redundant `apply` with `derived-mode-p` * lisp/cedet/mode-local.el (mode-local-map-mode-buffers): * lisp/progmodes/which-func.el (which-func-try-to-enable): (which-func-ff-hook): Remove redundant 'apply' with 'derived-mode-p'. Suggested by Philip Kaludercic . --- lisp/cedet/mode-local.el | 4 ++-- lisp/progmodes/which-func.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/cedet/mode-local.el b/lisp/cedet/mode-local.el index 28f14232704..9f11b9707bd 100644 --- a/lisp/cedet/mode-local.el +++ b/lisp/cedet/mode-local.el @@ -1,6 +1,6 @@ ;;; mode-local.el --- Support for mode local facilities -*- lexical-binding:t -*- ;; -;; Copyright (C) 2004-2005, 2007-2024 Free Software Foundation, Inc. +;; Copyright (C) 2004-2024 Free Software Foundation, Inc. ;; ;; Author: David Ponce ;; Created: 27 Apr 2004 @@ -84,7 +84,7 @@ MODES can be a symbol or a list of symbols. FUNCTION does not have arguments." (setq modes (ensure-list modes)) (mode-local-map-file-buffers - function (lambda () (apply #'derived-mode-p modes)))) + function (lambda () (derived-mode-p modes)))) ;;; Hook machinery ;; diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el index 631cb3b0aef..b36e13104e3 100644 --- a/lisp/progmodes/which-func.el +++ b/lisp/progmodes/which-func.el @@ -211,7 +211,7 @@ non-nil.") (when which-function-mode (unless (local-variable-p 'which-func-mode) (setq which-func-mode (or (eq which-func-modes t) - (apply #'derived-mode-p which-func-modes))) + (derived-mode-p which-func-modes))) (setq which-func--use-mode-line (member which-func-display '(mode mode-and-header))) (setq which-func--use-header-line @@ -239,7 +239,7 @@ It creates the Imenu index for the buffer, if necessary." (condition-case err (if (and which-func-mode - (not (apply #'derived-mode-p which-func-non-auto-modes)) + (not (derived-mode-p which-func-non-auto-modes)) (or (null which-func-maxout) (< buffer-saved-size which-func-maxout) (= which-func-maxout 0))) From 806759dc0a6a3b049ce35d0497011464e5fc4dcb Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 11 Feb 2024 22:00:44 -0500 Subject: [PATCH 131/446] (pcase): New `_` syntax in pred/app functions The current syntax for functions in `app` and `pred` patterns allows a shorthand (F ARGS) where the object being matched is added as an extra last argument. This is nice for things like (pred (< 5)) but sometimes the object needs to be at another position. Until now you had to use (pred (lambda (x) (memq x my-list))) or (pred (pcase--flip memq my-list)) in those cases. So, introduce a new shorthand where `_` can be used to indicate where the object should be passed: (pred (memq _ my-list)) * lisp/emacs-lisp/pcase.el (pcase--split-pred): Document new syntax for pred/app functions. (pcase--funcall): Support new syntax. (pcase--flip): Declare obsolete. (pcase--u1, \`): Use `_` instead. (pcase--split-pred): Adjust accordingly. * doc/lispref/control.texi (pcase Macro): Document new syntax for pred/app functions. * lisp/progmodes/opascal.el (pcase-defmacro): * lisp/emacs-lisp/seq.el (seq--make-pcase-bindings): * lisp/emacs-lisp/eieio.el (eieio): * lisp/emacs-lisp/cl-macs.el (cl-struct, cl-type): Use _ instead of `pcase--flip`. (cl--pcase-mutually-exclusive-p): Adjust accordingly. * lisp/emacs-lisp/map.el (map--pcase-map-elt): Declare obsolete. (map--make-pcase-bindings): Use `_` instead. --- doc/lispref/control.texi | 10 ++++++++++ etc/NEWS | 4 ++++ lisp/emacs-lisp/cl-macs.el | 15 ++++++++------- lisp/emacs-lisp/eieio.el | 4 ++-- lisp/emacs-lisp/map.el | 7 ++++--- lisp/emacs-lisp/pcase.el | 25 ++++++++++++++++--------- lisp/emacs-lisp/seq.el | 4 ++-- lisp/progmodes/opascal.el | 2 +- 8 files changed, 47 insertions(+), 24 deletions(-) diff --git a/doc/lispref/control.texi b/doc/lispref/control.texi index 0c6895332a0..78ad5b68a51 100644 --- a/doc/lispref/control.texi +++ b/doc/lispref/control.texi @@ -638,6 +638,16 @@ with @var{n} arguments (the other elements) and an additional Example: @code{(= 42)}@* In this example, the function is @code{=}, @var{n} is one, and the actual function call becomes: @w{@code{(= 42 @var{expval})}}. + +@item function call with an @code{_} arg +Call the function (the first element of the function call) +with the specified arguments (the other elements) and replacing +@code{_} with @var{expval}. + +Example: @code{(gethash _ memo-table)} +In this example, the function is @code{gethash}, and +the actual function call becomes: @w{@code{(gethash @var{expval} +memo-table)}}. @end table @item (app @var{function} @var{pattern}) diff --git a/etc/NEWS b/etc/NEWS index de1f2fd9d2a..afc2c22e68b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1526,6 +1526,10 @@ values. * Lisp Changes in Emacs 30.1 ++++ +** Pcase's functions (in 'pred' and 'app') can specify the argument position. +For example, instead of (pred (< 5)) you can write (pred (> _ 5)). + +++ ** 'define-advice' now sets the new advice's 'name' property to NAME. Named advices defined with 'define-advice' can now be removed with diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 88447203a64..06a09885c88 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -3344,14 +3344,14 @@ Elements of FIELDS can be of the form (NAME PAT) in which case the contents of field NAME is matched against PAT, or they can be of the form NAME which is a shorthand for (NAME NAME)." (declare (debug (sexp &rest [&or (sexp pcase-PAT) sexp]))) - `(and (pred (pcase--flip cl-typep ',type)) + `(and (pred (cl-typep _ ',type)) ,@(mapcar (lambda (field) (let* ((name (if (consp field) (car field) field)) (pat (if (consp field) (cadr field) field))) `(app ,(if (eq (cl-struct-sequence-type type) 'list) `(nth ,(cl-struct-slot-offset type name)) - `(pcase--flip aref ,(cl-struct-slot-offset type name))) + `(aref _ ,(cl-struct-slot-offset type name))) ,pat))) fields))) @@ -3368,13 +3368,13 @@ the form NAME which is a shorthand for (NAME NAME)." "Extra special cases for `cl-typep' predicates." (let* ((x1 pred1) (x2 pred2) (t1 - (and (eq 'pcase--flip (car-safe x1)) (setq x1 (cdr x1)) - (eq 'cl-typep (car-safe x1)) (setq x1 (cdr x1)) + (and (eq 'cl-typep (car-safe x1)) (setq x1 (cdr x1)) + (eq '_ (car-safe x1)) (setq x1 (cdr x1)) (null (cdr-safe x1)) (setq x1 (car x1)) (eq 'quote (car-safe x1)) (cadr x1))) (t2 - (and (eq 'pcase--flip (car-safe x2)) (setq x2 (cdr x2)) - (eq 'cl-typep (car-safe x2)) (setq x2 (cdr x2)) + (and (eq 'cl-typep (car-safe x2)) (setq x2 (cdr x2)) + (eq '_ (car-safe x2)) (setq x2 (cdr x2)) (null (cdr-safe x2)) (setq x2 (car x2)) (eq 'quote (car-safe x2)) (cadr x2)))) (or @@ -3818,7 +3818,8 @@ STRUCT-TYPE and SLOT-NAME are symbols. INST is a structure instance." (pcase-defmacro cl-type (type) "Pcase pattern that matches objects of TYPE. TYPE is a type descriptor as accepted by `cl-typep', which see." - `(pred (pcase--flip cl-typep ',type))) + `(pred (cl-typep _ ',type))) + ;; Local variables: ;; generated-autoload-file: "cl-loaddefs.el" diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el index df85a64baf3..fba69a36a97 100644 --- a/lisp/emacs-lisp/eieio.el +++ b/lisp/emacs-lisp/eieio.el @@ -387,9 +387,9 @@ contents of field NAME is matched against PAT, or they can be of ,@(mapcar (lambda (field) (pcase-exhaustive field (`(,name ,pat) - `(app (pcase--flip eieio-oref ',name) ,pat)) + `(app (eieio-oref _ ',name) ,pat)) ((pred symbolp) - `(app (pcase--flip eieio-oref ',field) ,field)))) + `(app (eieio-oref _ ',field) ,field)))) fields))) ;;; Simple generators, and query functions. None of these would do diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el index ffbb29615da..95a25978d1c 100644 --- a/lisp/emacs-lisp/map.el +++ b/lisp/emacs-lisp/map.el @@ -608,18 +608,19 @@ This allows using default values for `map-elt', which can't be done using `pcase--flip'. KEY is the key sought in the map. DEFAULT is the default value." + (declare (obsolete _ "30.1")) `(map-elt ,map ,key ,default)) (defun map--make-pcase-bindings (args) "Return a list of pcase bindings from ARGS to the elements of a map." (mapcar (lambda (elt) (cond ((consp elt) - `(app (map--pcase-map-elt ,(car elt) ,(caddr elt)) + `(app (map-elt _ ,(car elt) ,(caddr elt)) ,(cadr elt))) ((keywordp elt) (let ((var (intern (substring (symbol-name elt) 1)))) - `(app (pcase--flip map-elt ,elt) ,var))) - (t `(app (pcase--flip map-elt ',elt) ,elt)))) + `(app (map-elt _ ,elt) ,var))) + (t `(app (map-elt _ ',elt) ,elt)))) args)) (defun map--make-pcase-patterns (args) diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el index 880a1829265..ae9bd87997c 100644 --- a/lisp/emacs-lisp/pcase.el +++ b/lisp/emacs-lisp/pcase.el @@ -131,6 +131,8 @@ FUN in `pred' and `app' can take one of the forms: call it with one argument (F ARG1 .. ARGn) call F with ARG1..ARGn and EXPVAL as n+1'th argument + (F ARG1 .. _ .. ARGn) + call F, passing EXPVAL at the _ position. FUN, BOOLEXP, and subsequent PAT can refer to variables bound earlier in the pattern by a SYMBOL pattern. @@ -814,10 +816,10 @@ A and B can be one of: #'compiled-function-p)))) (pcase--mutually-exclusive-p (cadr upat) otherpred)) '(:pcase--fail . nil)) - ;; Since we turn (or 'a 'b 'c) into (pred (pcase--flip (memq '(a b c)))) + ;; Since we turn (or 'a 'b 'c) into (pred (memq _ '(a b c))) ;; try and preserve the info we get from that memq test. - ((and (eq 'pcase--flip (car-safe (cadr upat))) - (memq (cadr (cadr upat)) '(memq member memql)) + ((and (memq (car-safe (cadr upat)) '(memq member memql)) + (eq (cadr (cadr upat)) '_) (eq 'quote (car-safe (nth 2 (cadr upat)))) (eq 'quote (car-safe pat))) (let ((set (cadr (nth 2 (cadr upat))))) @@ -865,7 +867,7 @@ A and B can be one of: (defmacro pcase--flip (fun arg1 arg2) "Helper function, used internally to avoid (funcall (lambda ...) ...)." - (declare (debug (sexp body))) + (declare (debug (sexp body)) (obsolete _ "30.1")) `(,fun ,arg2 ,arg1)) (defun pcase--funcall (fun arg vars) @@ -886,9 +888,13 @@ A and B can be one of: (let ((newsym (gensym "x"))) (push (list newsym arg) env) (setq arg newsym))) - (if (or (functionp fun) (not (consp fun))) - `(funcall #',fun ,arg) - `(,@fun ,arg))))) + (cond + ((or (functionp fun) (not (consp fun))) + `(funcall #',fun ,arg)) + ((memq '_ fun) + (mapcar (lambda (x) (if (eq '_ x) arg x)) fun)) + (t + `(,@fun ,arg)))))) (if (null env) call ;; Let's not replace `vars' in `fun' since it's @@ -949,7 +955,7 @@ Otherwise, it defers to REST which is a list of branches of the form ;; Yes, we can use `memql' (or `member')! ((> (length simples) 1) (pcase--u1 (cons `(match ,var - . (pred (pcase--flip ,mem-fun ',simples))) + . (pred (,mem-fun _ ',simples))) (cdr matches)) code vars (if (null others) rest @@ -1096,12 +1102,13 @@ The predicate is the logical-AND of: (declare (debug (pcase-QPAT))) (cond ((eq (car-safe qpat) '\,) (cadr qpat)) + ((eq (car-safe qpat) '\,@) (error "Unsupported QPAT: %S" qpat)) ((vectorp qpat) `(and (pred vectorp) (app length ,(length qpat)) ,@(let ((upats nil)) (dotimes (i (length qpat)) - (push `(app (pcase--flip aref ,i) ,(list '\` (aref qpat i))) + (push `(app (aref _ ,i) ,(list '\` (aref qpat i))) upats)) (nreverse upats)))) ((consp qpat) diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el index 4c6553972c2..20077db9e60 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el @@ -619,12 +619,12 @@ SEQUENCE must be a sequence of numbers or markers." (unless rest-marker (pcase name (`&rest - (progn (push `(app (pcase--flip seq-drop ,index) + (progn (push `(app (seq-drop _ ,index) ,(seq--elt-safe args (1+ index))) bindings) (setq rest-marker t))) (_ - (push `(app (pcase--flip seq--elt-safe ,index) ,name) bindings)))) + (push `(app (seq--elt-safe _ ,index) ,name) bindings)))) (setq index (1+ index))) bindings)) diff --git a/lisp/progmodes/opascal.el b/lisp/progmodes/opascal.el index 5e8263cb646..a80e12b8129 100644 --- a/lisp/progmodes/opascal.el +++ b/lisp/progmodes/opascal.el @@ -281,7 +281,7 @@ nested routine.") (eval-when-compile (pcase-defmacro opascal--in (set) - `(pred (pcase--flip memq ,set)))) + `(pred (memq _ ,set)))) (defun opascal-string-of (start end) ;; Returns the buffer string from start to end. From 57544fa2a2e1f2d04aa6b6bdf49bde71141b945d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 11 Feb 2024 22:19:49 -0500 Subject: [PATCH 132/446] loaddefs-gen.el: Generate an autoload for `pcase-defmacro` Autoload cookies on uses of `pcase-defmacro` used to copy the definition wholesale instead of generating the expected autoload. * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--make-autoload): Look inside `eval-and-compile` as well. --- lisp/emacs-lisp/loaddefs-gen.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 1e91e84157d..238ec9d179b 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -183,7 +183,9 @@ expression, in which case we want to handle forms differently." (loaddefs-generate--shorten-autoload `(autoload ,(nth 1 form) ,file ,doc ,interactive ,type)))) - ((and expansion (memq car '(progn prog1))) + ;; Look inside `progn', and `eval-and-compile', since these + ;; are often used in the expansion of things like `pcase-defmacro'. + ((and expansion (memq car '(progn prog1 eval-and-compile))) (let ((end (memq :autoload-end form))) (when end ;Cut-off anything after the :autoload-end marker. (setq form (copy-sequence form)) From bc6c55c5cf3fc5bd248232c6332ea7cca19ffe91 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 12 Feb 2024 11:16:47 +0800 Subject: [PATCH 133/446] Disable exec loader when Emacs is running under an existing instance * src/androidfns.c (syms_of_androidfns_for_pdumper): Check if Emacs is running under process tracing, and if so, disable android_use_exec_loader. --- src/androidfns.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/androidfns.c b/src/androidfns.c index 48c3f3046d6..ea3d5f71c7c 100644 --- a/src/androidfns.c +++ b/src/androidfns.c @@ -3216,6 +3216,10 @@ syms_of_androidfns_for_pdumper (void) jstring string; Lisp_Object language, country, script, variant; const char *data; + FILE *fd; + char *line; + size_t size; + long pid; /* Find the Locale class. */ @@ -3386,6 +3390,35 @@ syms_of_androidfns_for_pdumper (void) /* Set Vandroid_os_language. */ Vandroid_os_language = list4 (language, country, script, variant); + + /* Detect whether Emacs is running under libloader.so or another + process tracing mechanism, and disable `android_use_exec_loader' if + so, leaving subprocesses started by Emacs to the care of that + loader instance. */ + + if (android_get_current_api_level () >= 29) /* Q */ + { + fd = fopen ("/proc/self/status", "r"); + if (!fd) + return; + + line = NULL; + while (getline (&line, &size, fd) != -1) + { + if (strncmp (line, "TracerPid:", sizeof "TracerPid:" - 1)) + continue; + + pid = atol (line + sizeof "TracerPid:" - 1); + + if (pid) + android_use_exec_loader = false; + + break; + } + + free (line); + fclose (fd); + } } #endif /* ANDROID_STUBIFY */ From 2f7d662dd4636a84e157a2af8f843c0589bc5dda Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Mon, 12 Feb 2024 12:07:37 +0100 Subject: [PATCH 134/446] ; Update Lisp_Hash_Table hash for CHECK_STRUCTS This follows commit 05e3183ede of 2024-02-06 "Rearrange and pack hash table fields to reduce space". --- src/pdumper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pdumper.c b/src/pdumper.c index b8006b035ea..5c488d8e90f 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2719,7 +2719,7 @@ dump_hash_table_contents (struct dump_context *ctx, struct Lisp_Hash_Table *h) static dump_off dump_hash_table (struct dump_context *ctx, Lisp_Object object) { -#if CHECK_STRUCTS && !defined HASH_Lisp_Hash_Table_313A489F0A +#if CHECK_STRUCTS && !defined HASH_Lisp_Hash_Table_0360833954 # error "Lisp_Hash_Table changed. See CHECK_STRUCTS comment in config.h." #endif const struct Lisp_Hash_Table *hash_in = XHASH_TABLE (object); From 17a395e04c62d6c6c3f3ff4c4889f03e427e00d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=ADn?= Date: Mon, 12 Feb 2024 13:21:08 +0100 Subject: [PATCH 135/446] ;; Fix typo in the Tramp documentation --- doc/misc/tramp.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index d6031d96d6b..db9cefbf966 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -522,7 +522,7 @@ is used as the group to change to. The default host name is the same. @cindex @option{doas} method If the @option{su}, @option{sudo} or @option{doas} option should be -performed on another host, it can be comnbined with a leading +performed on another host, it can be combined with a leading @option{ssh} or @option{plink} option. That means that @value{tramp} connects first to the other host with non-administrative credentials, and changes to administrative credentials on that host afterwards. In From 6aeeae68885e09a7253a0076d0f81cc46b37f20d Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Mon, 12 Feb 2024 17:37:16 +0100 Subject: [PATCH 136/446] Allow using 'vc-prepare-patch' in non-VC buffers * lisp/vc/vc.el (vc-prepare-patch): Remove 'vc-ensure-vc-buffer', as it is not necessary to verify this for the command to work. --- lisp/vc/vc.el | 1 - 1 file changed, 1 deletion(-) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index f612daaa569..ca6efeabac2 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -3639,7 +3639,6 @@ marked revisions, use those." (read-string "Subject: " "[PATCH] " nil nil t)) revs))) (save-current-buffer - (vc-ensure-vc-buffer) (let ((patches (mapcar (lambda (rev) (vc-call-backend (vc-responsible-backend default-directory) From 79cfc1eaa0b93f49559d74b6f7a76bf97e70ad2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Wed, 7 Feb 2024 21:50:03 +0100 Subject: [PATCH 137/446] Internal function for obarray performance analysis (bug#68244) * src/lread.c (Finternal__obarray_buckets): New function. --- src/lread.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/lread.c b/src/lread.c index 5aa7466cc12..8f355547268 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5296,6 +5296,32 @@ OBARRAY defaults to the value of `obarray'. */) return Qnil; } +DEFUN ("internal--obarray-buckets", + Finternal__obarray_buckets, Sinternal__obarray_buckets, 1, 1, 0, + doc: /* Symbols in each bucket of OBARRAY. Internal use only. */) + (Lisp_Object obarray) +{ + obarray = check_obarray (obarray); + ptrdiff_t size = ASIZE (obarray); + Lisp_Object ret = Qnil; + for (ptrdiff_t i = 0; i < size; i++) + { + Lisp_Object bucket = Qnil; + Lisp_Object sym = AREF (obarray, i); + if (BARE_SYMBOL_P (sym)) + while (1) + { + bucket = Fcons (sym, bucket); + struct Lisp_Symbol *s = XBARE_SYMBOL(sym)->u.s.next; + if (!s) + break; + sym = make_lisp_symbol (s); + } + ret = Fcons (Fnreverse (bucket), ret); + } + return Fnreverse (ret); +} + #define OBARRAY_SIZE 15121 void @@ -5693,6 +5719,7 @@ syms_of_lread (void) defsubr (&Sget_file_char); defsubr (&Smapatoms); defsubr (&Slocate_file_internal); + defsubr (&Sinternal__obarray_buckets); DEFVAR_LISP ("obarray", Vobarray, doc: /* Symbol table for use by `intern' and `read'. From bb77944306d3fbbbdf61ba4f3c9ef1bcb9b4b989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 8 Feb 2024 19:04:23 +0100 Subject: [PATCH 138/446] Make minibuf-tests independent of obarray hash order * test/src/minibuf-tests.el (minibuf-tests--set-equal): New. (minibuf-tests--all-completions) (minibuf-tests--all-completions-pred) (minibuf-tests--all-completions-regexp): Use it. --- test/src/minibuf-tests.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/src/minibuf-tests.el b/test/src/minibuf-tests.el index 14d160df25c..cb305ca0e55 100644 --- a/test/src/minibuf-tests.el +++ b/test/src/minibuf-tests.el @@ -61,6 +61,9 @@ ;;; Testing functions that are agnostic to type of COLLECTION. +(defun minibuf-tests--set-equal (a b) + (null (cl-set-exclusive-or a b :test #'equal))) + (defun minibuf-tests--try-completion (xform-collection) (let* ((abcdef (funcall xform-collection '("abc" "def"))) (+abba (funcall xform-collection '("abc" "abba" "def")))) @@ -101,7 +104,8 @@ (let* ((abcdef (funcall xform-collection '("abc" "def"))) (+abba (funcall xform-collection '("abc" "abba" "def")))) (should (equal (all-completions "a" abcdef) '("abc"))) - (should (equal (all-completions "a" +abba) '("abc" "abba"))) + (should (minibuf-tests--set-equal (all-completions "a" +abba) + '("abc" "abba"))) (should (equal (all-completions "abc" +abba) '("abc"))) (should (equal (all-completions "abcd" +abba) nil)))) @@ -111,7 +115,8 @@ (+abba (funcall xform-collection '("abc" "abba" "def"))) (+abba-member (funcall collection-member +abba))) (should (equal (all-completions "a" abcdef abcdef-member) '("abc"))) - (should (equal (all-completions "a" +abba +abba-member) '("abc" "abba"))) + (should (minibuf-tests--set-equal (all-completions "a" +abba +abba-member) + '("abc" "abba"))) (should (equal (all-completions "abc" +abba +abba-member) '("abc"))) (should (equal (all-completions "abcd" +abba +abba-member) nil)) (should-not (all-completions "a" abcdef #'ignore)) @@ -124,7 +129,8 @@ (+abba (funcall xform-collection '("abc" "abba" "def")))) (let ((completion-regexp-list '("."))) (should (equal (all-completions "a" abcdef) '("abc"))) - (should (equal (all-completions "a" +abba) '("abc" "abba"))) + (should (minibuf-tests--set-equal (all-completions "a" +abba) + '("abc" "abba"))) (should (equal (all-completions "abc" +abba) '("abc"))) (should (equal (all-completions "abcd" +abba) nil))) (let ((completion-regexp-list '("X"))) From 39cce137ba83713c960c201d8c3d8cf5079eee3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 8 Feb 2024 14:11:02 +0100 Subject: [PATCH 139/446] lread.c: Use bare symbol operations * src/lread.c (read0, intern_sym, intern_driver, intern_1) (intern_c_string_1, Fintern, Fintern_soft, Funintern, oblookup) (map_obarray, init_obarray_once, defvar_int, defvar_bool) (defvar_lisp_nopro, defvar_kboard, syms_of_lread): Use the faster bare-symbol operations where provably correct to do so. --- src/lread.c | 124 +++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 65 deletions(-) diff --git a/src/lread.c b/src/lread.c index 8f355547268..db8c4813426 100644 --- a/src/lread.c +++ b/src/lread.c @@ -4480,7 +4480,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms) &longhand_chars, &longhand_bytes); - if (SYMBOLP (found)) + if (BARE_SYMBOL_P (found)) result = found; else if (longhand) { @@ -4910,24 +4910,23 @@ check_obarray (Lisp_Object obarray) static Lisp_Object intern_sym (Lisp_Object sym, Lisp_Object obarray, Lisp_Object index) { - Lisp_Object *ptr; + struct Lisp_Symbol *s = XBARE_SYMBOL (sym); + s->u.s.interned = (BASE_EQ (obarray, initial_obarray) + ? SYMBOL_INTERNED_IN_INITIAL_OBARRAY + : SYMBOL_INTERNED); - XSYMBOL (sym)->u.s.interned = (EQ (obarray, initial_obarray) - ? SYMBOL_INTERNED_IN_INITIAL_OBARRAY - : SYMBOL_INTERNED); - - if (SREF (SYMBOL_NAME (sym), 0) == ':' && EQ (obarray, initial_obarray)) + if (SREF (s->u.s.name, 0) == ':' && BASE_EQ (obarray, initial_obarray)) { - make_symbol_constant (sym); - XSYMBOL (sym)->u.s.redirect = SYMBOL_PLAINVAL; + s->u.s.trapped_write = SYMBOL_NOWRITE; + s->u.s.redirect = SYMBOL_PLAINVAL; /* Mark keywords as special. This makes (let ((:key 'foo)) ...) in lexically bound elisp signal an error, as documented. */ - XSYMBOL (sym)->u.s.declared_special = true; - SET_SYMBOL_VAL (XSYMBOL (sym), sym); + s->u.s.declared_special = true; + SET_SYMBOL_VAL (s, sym); } - ptr = aref_addr (obarray, XFIXNUM (index)); - set_symbol_next (sym, SYMBOLP (*ptr) ? XSYMBOL (*ptr) : NULL); + Lisp_Object *ptr = aref_addr (obarray, XFIXNUM (index)); + s->u.s.next = BARE_SYMBOL_P (*ptr) ? XBARE_SYMBOL (*ptr) : NULL; *ptr = sym; return sym; } @@ -4937,7 +4936,7 @@ intern_sym (Lisp_Object sym, Lisp_Object obarray, Lisp_Object index) Lisp_Object intern_driver (Lisp_Object string, Lisp_Object obarray, Lisp_Object index) { - SET_SYMBOL_VAL (XSYMBOL (Qobarray_cache), Qnil); + SET_SYMBOL_VAL (XBARE_SYMBOL (Qobarray_cache), Qnil); return intern_sym (Fmake_symbol (string), obarray, index); } @@ -4950,7 +4949,7 @@ intern_1 (const char *str, ptrdiff_t len) Lisp_Object obarray = check_obarray (Vobarray); Lisp_Object tem = oblookup (obarray, str, len, len); - return (SYMBOLP (tem) ? tem + return (BARE_SYMBOL_P (tem) ? tem /* The above `oblookup' was done on the basis of nchars==nbytes, so the string has to be unibyte. */ : intern_driver (make_unibyte_string (str, len), @@ -4963,7 +4962,7 @@ intern_c_string_1 (const char *str, ptrdiff_t len) Lisp_Object obarray = check_obarray (Vobarray); Lisp_Object tem = oblookup (obarray, str, len, len); - if (!SYMBOLP (tem)) + if (!BARE_SYMBOL_P (tem)) { Lisp_Object string; @@ -5015,7 +5014,7 @@ it defaults to the value of `obarray'. */) &longhand, &longhand_chars, &longhand_bytes); - if (!SYMBOLP (tem)) + if (!BARE_SYMBOL_P (tem)) { if (longhand) { @@ -5064,10 +5063,10 @@ it defaults to the value of `obarray'. */) { /* If already a symbol, we don't do shorthand-longhand translation, as promised in the docstring. */ - string = SYMBOL_NAME (name); + string = XSYMBOL (name)->u.s.name; tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); - return EQ (name, tem) ? name : Qnil; + return BASE2_EQ (name, tem) ? name : Qnil; } } @@ -5088,7 +5087,11 @@ usage: (unintern NAME OBARRAY) */) obarray = check_obarray (obarray); if (SYMBOLP (name)) - string = SYMBOL_NAME (name); + { + if (!BARE_SYMBOL_P (name)) + name = XSYMBOL_WITH_POS (name)->sym; + string = SYMBOL_NAME (name); + } else { CHECK_STRING (name); @@ -5108,7 +5111,7 @@ usage: (unintern NAME OBARRAY) */) if (FIXNUMP (tem)) return Qnil; /* If arg was a symbol, don't delete anything but that symbol itself. */ - if (SYMBOLP (name) && !EQ (name, tem)) + if (BARE_SYMBOL_P (name) && !BASE_EQ (name, tem)) return Qnil; /* There are plenty of other symbols which will screw up the Emacs @@ -5118,16 +5121,16 @@ usage: (unintern NAME OBARRAY) */) /* if (NILP (tem) || EQ (tem, Qt)) error ("Attempt to unintern t or nil"); */ - XSYMBOL (tem)->u.s.interned = SYMBOL_UNINTERNED; + XBARE_SYMBOL (tem)->u.s.interned = SYMBOL_UNINTERNED; hash = oblookup_last_bucket_number; - if (EQ (AREF (obarray, hash), tem)) + if (BASE_EQ (AREF (obarray, hash), tem)) { - if (XSYMBOL (tem)->u.s.next) + if (XBARE_SYMBOL (tem)->u.s.next) { Lisp_Object sym; - XSETSYMBOL (sym, XSYMBOL (tem)->u.s.next); + XSETSYMBOL (sym, XBARE_SYMBOL (tem)->u.s.next); ASET (obarray, hash, sym); } else @@ -5138,13 +5141,13 @@ usage: (unintern NAME OBARRAY) */) Lisp_Object tail, following; for (tail = AREF (obarray, hash); - XSYMBOL (tail)->u.s.next; + XBARE_SYMBOL (tail)->u.s.next; tail = following) { - XSETSYMBOL (following, XSYMBOL (tail)->u.s.next); - if (EQ (following, tem)) + XSETSYMBOL (following, XBARE_SYMBOL (tail)->u.s.next); + if (BASE_EQ (following, tem)) { - set_symbol_next (tail, XSYMBOL (following)->u.s.next); + set_symbol_next (tail, XBARE_SYMBOL (following)->u.s.next); break; } } @@ -5176,18 +5179,19 @@ oblookup (Lisp_Object obarray, register const char *ptr, ptrdiff_t size, ptrdiff oblookup_last_bucket_number = hash; if (BASE_EQ (bucket, make_fixnum (0))) ; - else if (!SYMBOLP (bucket)) + else if (!BARE_SYMBOL_P (bucket)) /* Like CADR error message. */ xsignal2 (Qwrong_type_argument, Qobarrayp, build_string ("Bad data in guts of obarray")); else - for (tail = bucket; ; XSETSYMBOL (tail, XSYMBOL (tail)->u.s.next)) + for (tail = bucket; ; XSETSYMBOL (tail, XBARE_SYMBOL (tail)->u.s.next)) { - if (SBYTES (SYMBOL_NAME (tail)) == size_byte - && SCHARS (SYMBOL_NAME (tail)) == size - && !memcmp (SDATA (SYMBOL_NAME (tail)), ptr, size_byte)) + Lisp_Object name = XBARE_SYMBOL (tail)->u.s.name; + if (SBYTES (name) == size_byte + && SCHARS (name) == size + && !memcmp (SDATA (name), ptr, size_byte)) return tail; - else if (XSYMBOL (tail)->u.s.next == 0) + else if (XBARE_SYMBOL (tail)->u.s.next == 0) break; } XSETINT (tem, hash); @@ -5267,13 +5271,13 @@ map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Ob for (i = ASIZE (obarray) - 1; i >= 0; i--) { tail = AREF (obarray, i); - if (SYMBOLP (tail)) + if (BARE_SYMBOL_P (tail)) while (1) { (*fn) (tail, arg); - if (XSYMBOL (tail)->u.s.next == 0) + if (XBARE_SYMBOL (tail)->u.s.next == 0) break; - XSETSYMBOL (tail, XSYMBOL (tail)->u.s.next); + XSETSYMBOL (tail, XBARE_SYMBOL (tail)->u.s.next); } } } @@ -5337,14 +5341,14 @@ init_obarray_once (void) DEFSYM (Qunbound, "unbound"); DEFSYM (Qnil, "nil"); - SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil); + SET_SYMBOL_VAL (XBARE_SYMBOL (Qnil), Qnil); make_symbol_constant (Qnil); - XSYMBOL (Qnil)->u.s.declared_special = true; + XBARE_SYMBOL (Qnil)->u.s.declared_special = true; DEFSYM (Qt, "t"); - SET_SYMBOL_VAL (XSYMBOL (Qt), Qt); + SET_SYMBOL_VAL (XBARE_SYMBOL (Qt), Qt); make_symbol_constant (Qt); - XSYMBOL (Qt)->u.s.declared_special = true; + XBARE_SYMBOL (Qt)->u.s.declared_special = true; /* Qt is correct even if not dumping. loadup.el will set to nil at end. */ Vpurify_flag = Qt; @@ -5368,16 +5372,6 @@ defsubr (union Aligned_Lisp_Subr *aname) #endif } -#ifdef NOTDEF /* Use fset in subr.el now! */ -void -defalias (struct Lisp_Subr *sname, char *string) -{ - Lisp_Object sym; - sym = intern (string); - XSETSUBR (XSYMBOL (sym)->u.s.function, sname); -} -#endif /* NOTDEF */ - /* Define an "integer variable"; a symbol whose value is forwarded to a C variable of type intmax_t. Sample call (with "xx" to fool make-docfile): DEFxxVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */ @@ -5385,9 +5379,9 @@ void defvar_int (struct Lisp_Intfwd const *i_fwd, char const *namestring) { Lisp_Object sym = intern_c_string (namestring); - XSYMBOL (sym)->u.s.declared_special = true; - XSYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; - SET_SYMBOL_FWD (XSYMBOL (sym), i_fwd); + XBARE_SYMBOL (sym)->u.s.declared_special = true; + XBARE_SYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; + SET_SYMBOL_FWD (XBARE_SYMBOL (sym), i_fwd); } /* Similar but define a variable whose value is t if 1, nil if 0. */ @@ -5395,9 +5389,9 @@ void defvar_bool (struct Lisp_Boolfwd const *b_fwd, char const *namestring) { Lisp_Object sym = intern_c_string (namestring); - XSYMBOL (sym)->u.s.declared_special = true; - XSYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; - SET_SYMBOL_FWD (XSYMBOL (sym), b_fwd); + XBARE_SYMBOL (sym)->u.s.declared_special = true; + XBARE_SYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; + SET_SYMBOL_FWD (XBARE_SYMBOL (sym), b_fwd); Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars); } @@ -5410,9 +5404,9 @@ void defvar_lisp_nopro (struct Lisp_Objfwd const *o_fwd, char const *namestring) { Lisp_Object sym = intern_c_string (namestring); - XSYMBOL (sym)->u.s.declared_special = true; - XSYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; - SET_SYMBOL_FWD (XSYMBOL (sym), o_fwd); + XBARE_SYMBOL (sym)->u.s.declared_special = true; + XBARE_SYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; + SET_SYMBOL_FWD (XBARE_SYMBOL (sym), o_fwd); } void @@ -5429,9 +5423,9 @@ void defvar_kboard (struct Lisp_Kboard_Objfwd const *ko_fwd, char const *namestring) { Lisp_Object sym = intern_c_string (namestring); - XSYMBOL (sym)->u.s.declared_special = true; - XSYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; - SET_SYMBOL_FWD (XSYMBOL (sym), ko_fwd); + XBARE_SYMBOL (sym)->u.s.declared_special = true; + XBARE_SYMBOL (sym)->u.s.redirect = SYMBOL_FORWARDED; + SET_SYMBOL_FWD (XBARE_SYMBOL (sym), ko_fwd); } /* Check that the elements of lpath exist. */ @@ -5731,7 +5725,7 @@ to find all the symbols in an obarray, use `mapatoms'. */); doc: /* List of values of all expressions which were read, evaluated and printed. Order is reverse chronological. This variable is obsolete as of Emacs 28.1 and should not be used. */); - XSYMBOL (intern ("values"))->u.s.declared_special = false; + XBARE_SYMBOL (intern ("values"))->u.s.declared_special = false; DEFVAR_LISP ("standard-input", Vstandard_input, doc: /* Stream for read to get input from. From 3b90e5052ce1eea47430c85c0c35741e25269ce2 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Mon, 12 Feb 2024 20:16:35 +0200 Subject: [PATCH 140/446] Tree-sitter support for outline-minor-mode (bug#68824) * doc/emacs/text.texi (Outline Format): Add 'outline-search-function'. * doc/lispref/elisp.texi (Top): Add new menu item "Outline Minor Mode" after "Imenu". * doc/lispref/modes.texi (Modes): Add new menu item "Outline Minor Mode" after "Imenu". (Major Mode Conventions): Mention "Outline Minor Mode" with @pxref. (Outline Minor Mode): New node. * doc/lispref/parsing.texi (Tree-sitter Major Modes): Mention 'treesit-outline-predicate' with @pxref. * lisp/treesit.el (treesit-outline-predicate): New buffer-local variable. (treesit-outline-predicate--from-imenu): New internal function. (treesit-outline-search, treesit-outline-level): New functions. (treesit-major-mode-setup): Set up treesit-outline-predicate, outline-search-function and outline-level. * lisp/progmodes/c-ts-mode.el (c-ts-mode--outline-predicate): New internal function. (c-ts-base-mode): Set 'treesit-outline-predicate' to 'c-ts-mode--outline-predicate'. * lisp/progmodes/heex-ts-mode.el (heex-ts-mode): Kill inherited local variables 'outline-heading-end-regexp', 'outline-regexp', 'outline-level'. * lisp/progmodes/lua-ts-mode.el (lua-ts-mode): Remove 'outline-regexp'. Suggested by john muhl . * lisp/textmodes/html-ts-mode.el (html-ts-mode): Kill inherited local variables 'outline-heading-end-regexp', 'outline-regexp', 'outline-level'. --- doc/emacs/text.texi | 6 +++ doc/lispref/elisp.texi | 1 + doc/lispref/modes.texi | 62 +++++++++++++++++++++++++++ doc/lispref/parsing.texi | 4 ++ etc/NEWS | 7 ++++ lisp/progmodes/c-ts-mode.el | 15 +++++++ lisp/progmodes/heex-ts-mode.el | 10 +++++ lisp/progmodes/lua-ts-mode.el | 12 +----- lisp/textmodes/html-ts-mode.el | 11 +++++ lisp/treesit.el | 76 ++++++++++++++++++++++++++++++++++ 10 files changed, 193 insertions(+), 11 deletions(-) diff --git a/doc/emacs/text.texi b/doc/emacs/text.texi index 338bf014208..cb347d59948 100644 --- a/doc/emacs/text.texi +++ b/doc/emacs/text.texi @@ -1097,6 +1097,12 @@ so that Outline mode will know that sections are contained in chapters. This works as long as no other command starts with @samp{@@chap}. +@vindex outline-search-function + Instead of setting the variable @code{outline-regexp}, you can set +the variable @code{outline-search-function} to a function that +matches the current heading and searches for the next one +(@pxref{Outline Minor Mode,,,elisp, the Emacs Lisp Reference Manual}). + @vindex outline-level You can explicitly specify a rule for calculating the level of a heading line by setting the variable @code{outline-level}. The value diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi index cab1622337e..ed254795d90 100644 --- a/doc/lispref/elisp.texi +++ b/doc/lispref/elisp.texi @@ -883,6 +883,7 @@ Major and Minor Modes * Minor Modes:: Defining minor modes. * Mode Line Format:: Customizing the text that appears in the mode line. * Imenu:: Providing a menu of definitions made in a buffer. +* Outline Minor Mode:: Outline mode to use with other major modes. * Font Lock Mode:: How modes can highlight text according to syntax. * Auto-Indentation:: How to teach Emacs to indent for a major mode. * Desktop Save Mode:: How modes can have buffer state saved between diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 1d961249633..70d1a40f836 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -25,6 +25,7 @@ user. For related topics such as keymaps and syntax tables, see * Minor Modes:: Defining minor modes. * Mode Line Format:: Customizing the text that appears in the mode line. * Imenu:: Providing a menu of definitions made in a buffer. +* Outline Minor Mode:: Outline mode to use with other major modes. * Font Lock Mode:: How modes can highlight text according to syntax. * Auto-Indentation:: How to teach Emacs to indent for a major mode. * Desktop Save Mode:: How modes can have buffer state saved between @@ -507,6 +508,12 @@ variable @code{imenu-generic-expression}, for the two variables @code{imenu-extract-index-name-function}, or for the variable @code{imenu-create-index-function} (@pxref{Imenu}). +@item +The mode should specify how Outline minor mode should find the +heading lines, by setting up a buffer-local value for the variables +@code{outline-regexp} or @code{outline-search-function}, and also +for the variable @code{outline-level} (@pxref{Outline Minor Mode}). + @item The mode can tell ElDoc mode how to retrieve different types of documentation for whatever is at point, by adding one or more @@ -2994,6 +3001,61 @@ instead. automatically sets up Imenu if this variable is non-@code{nil}. @end defvar +@node Outline Minor Mode +@section Outline Minor Mode + +@cindex Outline minor mode + @dfn{Outline minor mode} is a buffer-local minor mode that hides +parts of the buffer and leaves only heading lines visible. +This minor mode can be used in conjunction with other major modes +(@pxref{Outline Minor Mode,, Outline Minor Mode, emacs, the Emacs Manual}). + + There are two ways to define which lines are headings: with the +variable @code{outline-regexp} or @code{outline-search-function}. + +@defvar outline-regexp +This variable is a regular expression. +Any line whose beginning has a match for this regexp is considered a +heading line. Matches that start within a line (not at the left +margin) do not count. +@end defvar + +@defvar outline-search-function +Alternatively, when it's impossible to create a regexp that +matches heading lines, you can define a function that helps +Outline minor mode to find heading lines. + +The variable @code{outline-search-function} specifies the function with +four arguments: @var{bound}, @var{move}, @var{backward}, and +@var{looking-at}. The function completes two tasks: to match the +current heading line, and to find the next or the previous heading line. +If the argument @var{looking-at} is non-@code{nil}, it should return +non-@code{nil} when point is at the beginning of the outline header line. +If the argument @var{looking-at} is @code{nil}, the first three arguments +are used. The argument @var{bound} is a buffer position that bounds +the search. The match found must not end after that position. A +value of nil means search to the end of the accessible portion of +the buffer. If the argument @var{move} is non-@code{nil}, the +failed search should move to the limit of search and return nil. +If the argument @var{backward} is non-@code{nil}, this function +should search for the previous heading backward. +@end defvar + +@defvar outline-level +This variable is a function that takes no arguments +and should return the level of the current heading. +It's required in both cases: whether you define +@code{outline-regexp} or @code{outline-search-function}. +@end defvar + +If built with tree-sitter, Emacs can automatically use +Outline minor mode if the major mode sets the following variable. + +@defvar treesit-outline-predicate +This variable instructs Emacs how to find lines with outline headings. +It should be a predicate that matches the node on the heading line. +@end defvar + @node Font Lock Mode @section Font Lock Mode @cindex Font Lock mode diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi index d685b7f32dc..3d2192ace64 100644 --- a/doc/lispref/parsing.texi +++ b/doc/lispref/parsing.texi @@ -1897,6 +1897,10 @@ add-log functions used by @code{add-log-current-defun}. @item If @code{treesit-simple-imenu-settings} (@pxref{Imenu}) is non-@code{nil}, it sets up Imenu. + +@item +If @code{treesit-outline-predicate} (@pxref{Outline Minor Mode}) is +non-@code{nil}, it sets up Outline minor mode. @end itemize @c TODO: Add treesit-thing-settings stuff once we finalize it. diff --git a/etc/NEWS b/etc/NEWS index afc2c22e68b..f89c8ce1d8d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -130,6 +130,13 @@ the signature) the automatically inferred function type as well. This user option controls outline visibility in the output buffer of 'describe-bindings' when 'describe-bindings-outline' is non-nil. +** Outline Mode + ++++ +*** 'outline-minor-mode' is supported in tree-sitter major modes. +It can be used in all tree-sitter major modes that set either the +variable 'treesit-simple-imenu-settings' or 'treesit-outline-predicate'. + ** X selection requests are now handled much faster and asynchronously. This means it should be less necessary to disable the likes of 'select-active-regions' when Emacs is running over a slow network diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index e5835bdb62d..c4b48f03d12 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -922,6 +922,17 @@ Return nil if NODE is not a defun node or doesn't have a name." name))) t)) +;;; Outline minor mode + +(defun c-ts-mode--outline-predicate (node) + "Match outlines on lines with function names." + (and (treesit-node-match-p + node "\\`function_declarator\\'" t) + (when-let ((parent (treesit-node-parent node))) + (treesit-node-match-p + parent + "\\`function_definition\\'" t)))) + ;;; Defun navigation (defun c-ts-mode--defun-valid-p (node) @@ -1259,6 +1270,10 @@ BEG and END are described in `treesit-range-rules'." eos) c-ts-mode--defun-for-class-in-imenu-p nil)))) + ;; Outline minor mode + (setq-local treesit-outline-predicate + #'c-ts-mode--outline-predicate) + (setq-local treesit-font-lock-feature-list c-ts-mode--feature-list)) diff --git a/lisp/progmodes/heex-ts-mode.el b/lisp/progmodes/heex-ts-mode.el index 7b53a44deb2..22e8956661d 100644 --- a/lisp/progmodes/heex-ts-mode.el +++ b/lisp/progmodes/heex-ts-mode.el @@ -166,6 +166,16 @@ With ARG, do it many times. Negative ARG means move backward." ("Slot" "\\`slot\\'" nil nil) ("Tag" "\\`tag\\'" nil nil))) + ;; Outline minor mode + ;; `heex-ts-mode' inherits from `html-mode' that sets + ;; regexp-based outline variables. So need to restore + ;; the default values of outline variables to be able + ;; to use `treesit-outline-predicate' derived + ;; from `treesit-simple-imenu-settings' above. + (kill-local-variable 'outline-heading-end-regexp) + (kill-local-variable 'outline-regexp) + (kill-local-variable 'outline-level) + (setq-local treesit-font-lock-settings heex-ts--font-lock-settings) (setq-local treesit-simple-indent-rules heex-ts--indent-rules) diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index 05a3ff6d7c6..dc2a8fcec1e 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -774,7 +774,7 @@ Calls REPORT-FN directly." "vararg_expression")))) (text "comment")))) - ;; Imenu. + ;; Imenu/Outline. (setq-local treesit-simple-imenu-settings `(("Requires" "\\`function_call\\'" @@ -789,16 +789,6 @@ Calls REPORT-FN directly." ;; Which-function. (setq-local which-func-functions (treesit-defun-at-point)) - ;; Outline. - (setq-local outline-regexp - (rx (seq (0+ space) - (or (seq "--[[" (0+ space) eol) - (seq symbol-start - (or "do" "for" "if" "repeat" "while" - (seq (? (seq "local" (1+ space))) - "function")) - symbol-end))))) - ;; Align. (setq-local align-indent-before-aligning t) diff --git a/lisp/textmodes/html-ts-mode.el b/lisp/textmodes/html-ts-mode.el index 301f3e8791c..9af2aa6748f 100644 --- a/lisp/textmodes/html-ts-mode.el +++ b/lisp/textmodes/html-ts-mode.el @@ -121,6 +121,17 @@ Return nil if there is no name or if NODE is not a defun node." ;; Imenu. (setq-local treesit-simple-imenu-settings '(("Element" "\\`tag_name\\'" nil nil))) + + ;; Outline minor mode. + (setq-local treesit-outline-predicate "\\`element\\'") + ;; `html-ts-mode' inherits from `html-mode' that sets + ;; regexp-based outline variables. So need to restore + ;; the default values of outline variables to be able + ;; to use `treesit-outline-predicate' above. + (kill-local-variable 'outline-regexp) + (kill-local-variable 'outline-heading-end-regexp) + (kill-local-variable 'outline-level) + (treesit-major-mode-setup)) (if (treesit-ready-p 'html) diff --git a/lisp/treesit.el b/lisp/treesit.el index 6a485ae591a..25ac582276b 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -2860,6 +2860,71 @@ ENTRY. MARKER marks the start of each tree-sitter node." index)))) treesit-simple-imenu-settings))) +;;; Outline minor mode + +(defvar-local treesit-outline-predicate nil + "Predicate used to find outline headings in the syntax tree. +The predicate can be a function, a regexp matching node type, +and more; see docstring of `treesit-thing-settings'. +It matches the nodes located on lines with outline headings. +Intended to be set by a major mode. When nil, the predicate +is constructed from the value of `treesit-simple-imenu-settings' +when a major mode sets it.") + +(defun treesit-outline-predicate--from-imenu (node) + ;; Return an outline searching predicate created from Imenu. + ;; Return the value suitable to set `treesit-outline-predicate'. + ;; Create this predicate from the value `treesit-simple-imenu-settings' + ;; that major modes set to find Imenu entries. The assumption here + ;; is that the positions of Imenu entries most of the time coincide + ;; with the lines of outline headings. When this assumption fails, + ;; you can directly set a proper value to `treesit-outline-predicate'. + (seq-some + (lambda (setting) + (and (string-match-p (nth 1 setting) (treesit-node-type node)) + (or (null (nth 2 setting)) + (funcall (nth 2 setting) node)))) + treesit-simple-imenu-settings)) + +(defun treesit-outline-search (&optional bound move backward looking-at) + "Search for the next outline heading in the syntax tree. +See the descriptions of arguments in `outline-search-function'." + (if looking-at + (when-let* ((node (or (treesit--thing-at (pos-eol) treesit-outline-predicate) + (treesit--thing-at (pos-bol) treesit-outline-predicate))) + (start (treesit-node-start node))) + (eq (pos-bol) (save-excursion (goto-char start) (pos-bol)))) + + (let* ((pos + ;; When function wants to find the current outline, point + ;; is at the beginning of the current line. When it wants + ;; to find the next outline, point is at the second column. + (if (eq (point) (pos-bol)) + (if (bobp) (point) (1- (point))) + (pos-eol))) + (found (treesit--navigate-thing pos (if backward -1 1) 'beg + treesit-outline-predicate))) + (if found + (if (or (not bound) (if backward (>= found bound) (<= found bound))) + (progn + (goto-char found) + (goto-char (pos-bol)) + (set-match-data (list (point) (pos-eol))) + t) + (when move (goto-char bound)) + nil) + (when move (goto-char (or bound (if backward (point-min) (point-max))))) + nil)))) + +(defun treesit-outline-level () + "Return the depth of the current outline heading." + (let* ((node (treesit-node-at (point))) + (level (if (treesit-node-match-p node treesit-outline-predicate t) + 1 0))) + (while (setq node (treesit-parent-until node treesit-outline-predicate)) + (setq level (1+ level))) + (if (zerop level) 1 level))) + ;;; Activating tree-sitter (defun treesit-ready-p (language &optional quiet) @@ -2990,6 +3055,17 @@ before calling this function." (setq-local imenu-create-index-function #'treesit-simple-imenu)) + ;; Outline minor mode. + (when (and (or treesit-outline-predicate treesit-simple-imenu-settings) + (not (seq-some #'local-variable-p + '(outline-search-function + outline-regexp outline-level)))) + (unless treesit-outline-predicate + (setq treesit-outline-predicate + #'treesit-outline-predicate--from-imenu)) + (setq-local outline-search-function #'treesit-outline-search + outline-level #'treesit-outline-level)) + ;; Remove existing local parsers. (dolist (ov (overlays-in (point-min) (point-max))) (when-let ((parser (overlay-get ov 'treesit-parser))) From 40994d2bafafa53464d3678b06f391fd13c884ec Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 12 Feb 2024 17:42:28 -0500 Subject: [PATCH 141/446] (cl--generic-describe): Refactor to ease reuse * lisp/emacs-lisp/cl-generic.el (cl--map-methods-documentation): New function, extrated from `cl--generic-describe`. (cl--generic-describe): Use it. --- lisp/emacs-lisp/cl-generic.el | 73 +++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index d1bd45120f1..f439a97f88c 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1140,12 +1140,8 @@ MET-NAME is as returned by `cl--generic-load-hist-format'." (add-hook 'help-fns-describe-function-functions #'cl--generic-describe) (defun cl--generic-describe (function) - ;; Supposedly this is called from help-fns, so help-fns should be loaded at - ;; this point. - (declare-function help-fns-short-filename "help-fns" (filename)) (let ((generic (if (symbolp function) (cl--generic function)))) (when generic - (require 'help-mode) ;Needed for `help-function-def' button! (save-excursion ;; Ensure that we have two blank lines (but not more). (unless (looking-back "\n\n" (- (point) 2)) @@ -1153,32 +1149,49 @@ MET-NAME is as returned by `cl--generic-load-hist-format'." (insert "This is a generic function.\n\n") (insert (propertize "Implementations:\n\n" 'face 'bold)) ;; Loop over fanciful generics - (dolist (method (cl--generic-method-table generic)) - (pcase-let* - ((`(,qualifiers ,args ,doc) (cl--generic-method-info method))) - ;; FIXME: Add hyperlinks for the types as well. - (let ((quals (if (length> qualifiers 0) - (concat (substring qualifiers - 0 (string-match " *\\'" - qualifiers)) - "\n") - ""))) - (insert (format "%s%S" - quals - (cons function - (cl--generic-upcase-formal-args args))))) - (let* ((met-name (cl--generic-load-hist-format - function - (cl--generic-method-qualifiers method) - (cl--generic-method-specializers method))) - (file (find-lisp-object-file-name met-name 'cl-defmethod))) - (when file - (insert (substitute-command-keys " in `")) - (help-insert-xref-button (help-fns-short-filename file) - 'help-function-def met-name file - 'cl-defmethod) - (insert (substitute-command-keys "'.\n")))) - (insert "\n" (or doc "Undocumented") "\n\n"))))))) + (cl--map-methods-documentation + function + (lambda (quals signature file doc) + (insert (format "%s%S%s\n\n%s\n\n" + quals signature + (if file (format-message " in `%s'." file) "") + (or doc "Undocumented"))))))))) + +(defun cl--map-methods-documentation (funname metname-printer) + "Iterate on FUNNAME's methods documentation at point." + ;; Supposedly this is called from help-fns, so help-fns should be loaded at + ;; this point. + (require 'help-fns) + (declare-function help-fns-short-filename "help-fns" (filename)) + (let ((generic (if (symbolp funname) (cl--generic funname)))) + (when generic + (require 'help-mode) ;Needed for `help-function-def' button! + ;; Loop over fanciful generics + (dolist (method (cl--generic-method-table generic)) + (pcase-let* + ((`(,qualifiers ,args ,doc) (cl--generic-method-info method)) + ;; FIXME: Add hyperlinks for the types as well. + (quals (if (length> qualifiers 0) + (concat (substring qualifiers + 0 (string-match " *\\'" + qualifiers)) + "\n") + "")) + (met-name (cl--generic-load-hist-format + funname + (cl--generic-method-qualifiers method) + (cl--generic-method-specializers method))) + (file (find-lisp-object-file-name met-name 'cl-defmethod))) + (funcall metname-printer + quals + (cons funname + (cl--generic-upcase-formal-args args)) + (when file + (make-text-button (help-fns-short-filename file) nil + 'type 'help-function-def + 'help-args + (list met-name file 'cl-defmethod))) + doc)))))) (defun cl--generic-specializers-apply-to-type-p (specializers type) "Return non-nil if a method with SPECIALIZERS applies to TYPE." From 6a18da80c2a3ff4bdede91bd3c28ecd41703ff98 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 13 Feb 2024 09:47:24 +0800 Subject: [PATCH 142/446] ; * src/lread.c (Finternal__obarray_buckets): Fix coding style. --- src/lread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lread.c b/src/lread.c index db8c4813426..d339b2f15ae 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5316,7 +5316,7 @@ DEFUN ("internal--obarray-buckets", while (1) { bucket = Fcons (sym, bucket); - struct Lisp_Symbol *s = XBARE_SYMBOL(sym)->u.s.next; + struct Lisp_Symbol *s = XBARE_SYMBOL (sym)->u.s.next; if (!s) break; sym = make_lisp_symbol (s); From d570864bebf9f038f696768f2da571ed272f0058 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 1 Feb 2024 13:58:20 -0800 Subject: [PATCH 143/446] Make outline.el ignore field properties in text * lisp/outline.el (outline-back-to-heading, outline-on-heading-p) (outline-next-visible-heading, outline-mark-subtree) (outline-hide-sublevels, outline--insert-button) (outline--fix-up-all-buttons): Inhibit field text motion (bug#68881). --- lisp/outline.el | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/lisp/outline.el b/lisp/outline.el index b50708c1a7b..5ac0f0707f1 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -686,7 +686,7 @@ If POS is nil, use `point' instead." (defun outline-back-to-heading (&optional invisible-ok) "Move to previous heading line, or beg of this line if it's a heading. Only visible heading lines are considered, unless INVISIBLE-OK is non-nil." - (beginning-of-line) + (forward-line 0) (or (outline-on-heading-p invisible-ok) (let (found) (save-excursion @@ -705,7 +705,7 @@ Only visible heading lines are considered, unless INVISIBLE-OK is non-nil." "Return t if point is on a (visible) heading line. If INVISIBLE-OK is non-nil, an invisible heading line is ok too." (save-excursion - (beginning-of-line) + (forward-line 0) (and (bolp) (or invisible-ok (not (outline-invisible-p))) (if outline-search-function (funcall outline-search-function nil nil nil t) @@ -725,7 +725,7 @@ If INVISIBLE-OK is non-nil, an invisible heading line is ok too." (not (string-match (concat "\\`\\(?:" outline-regexp "\\)") (concat head " ")))) (setq head (concat head " "))) - (unless (bolp) (end-of-line) (newline)) + (unless (bolp) (goto-char (pos-eol)) (newline)) (insert head) (unless (eolp) (save-excursion (newline-and-indent))) @@ -941,9 +941,7 @@ With ARG, repeats or can move backward if negative. A heading line is one that starts with a `*' (or that `outline-regexp' matches)." (interactive "p") - (if (< arg 0) - (beginning-of-line) - (end-of-line)) + (goto-char (if (< arg 0) (pos-bol) (pos-eol))) (let ((regexp (unless outline-search-function (concat "^\\(?:" outline-regexp "\\)"))) found-heading-p) @@ -963,7 +961,7 @@ A heading line is one that starts with a `*' (or that (re-search-forward regexp nil 'move))) (outline-invisible-p (match-beginning 0)))) (setq arg (1- arg))) - (if found-heading-p (beginning-of-line)))) + (if found-heading-p (forward-line 0)))) (defun outline-previous-visible-heading (arg) "Move to the previous heading line. @@ -980,7 +978,7 @@ This puts point at the start of the current subtree, and mark at the end." (let ((beg)) (if (outline-on-heading-p) ;; we are already looking at a heading - (beginning-of-line) + (forward-line 0) ;; else go back to previous heading (outline-previous-visible-heading 1)) (setq beg (point)) @@ -1183,7 +1181,7 @@ of the current heading, or to 1 if the current line is not a heading." (cond (current-prefix-arg (prefix-numeric-value current-prefix-arg)) ((save-excursion - (beginning-of-line) + (forward-line 0) (if outline-search-function (funcall outline-search-function nil nil nil t) (looking-at outline-regexp))) @@ -1243,7 +1241,7 @@ This also unhides the top heading-less body, if any." (interactive) (save-excursion (outline-back-to-heading) - (if (not (outline-invisible-p (line-end-position))) + (if (not (outline-invisible-p (pos-eol))) (outline-hide-subtree) (outline-show-children) (outline-show-entry)))) @@ -1834,7 +1832,7 @@ With a prefix argument, show headings up to that LEVEL." (defun outline--insert-button (type) (with-silent-modifications (save-excursion - (beginning-of-line) + (forward-line 0) (let ((icon (nth (if (eq type 'close) 1 0) outline--button-icons)) (o (seq-find (lambda (o) (overlay-get o 'outline-button)) (overlays-at (point))))) @@ -1842,7 +1840,7 @@ With a prefix argument, show headings up to that LEVEL." (when (eq outline-minor-mode-use-buttons 'insert) (let ((inhibit-read-only t)) (insert (apply #'propertize " " (text-properties-at (point)))) - (beginning-of-line))) + (forward-line 0))) (setq o (make-overlay (point) (1+ (point)))) (overlay-put o 'outline-button t) (overlay-put o 'evaporate t)) @@ -1866,7 +1864,7 @@ With a prefix argument, show headings up to that LEVEL." (when from (save-excursion (goto-char from) - (setq from (line-beginning-position)))) + (setq from (pos-bol)))) (outline-map-region (lambda () (let ((close-p (save-excursion From acc6732ca1d39352f1aae3074ad04564178c0954 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 13 Feb 2024 11:18:16 +0100 Subject: [PATCH 144/446] Reuse commit message when preparing a single patch * lisp/vc/vc.el (vc-prepare-patch): Check commit message if only a single revision was selected. --- lisp/vc/vc.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index ca6efeabac2..619b469bebb 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -3623,7 +3623,15 @@ revisions. When invoked interactively in a Log View buffer with marked revisions, use those." (interactive - (let ((revs (vc-prepare-patch-prompt-revisions)) to) + (let* ((revs (vc-prepare-patch-prompt-revisions)) + (subject + (and (length= revs 1) + (plist-get + (vc-call-backend + (vc-responsible-backend default-directory) + 'prepare-patch (car revs)) + :subject))) + to) (require 'message) (while (null (setq to (completing-read-multiple (format-prompt @@ -3636,7 +3644,7 @@ marked revisions, use those." (sit-for blink-matching-delay)) (list (string-join to ", ") (and (not vc-prepare-patches-separately) - (read-string "Subject: " "[PATCH] " nil nil t)) + (read-string "Subject: " (or subject "[PATCH] ") nil nil t)) revs))) (save-current-buffer (let ((patches (mapcar (lambda (rev) From 6ef8d29f221e010705184092600ac124bd0a14fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Bornemann?= Date: Mon, 12 Feb 2024 21:56:42 +0100 Subject: [PATCH 145/446] ; Resolve a FIXME in rst.el * lisp/textmodes/rst.el (rst-define-key): Use :documentation for the dynamically created docstrings of deprecated bindings. (Bug#69087) Copyright-paperwork-exempt: yes --- lisp/textmodes/rst.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/textmodes/rst.el b/lisp/textmodes/rst.el index 2cd78943883..5fbff4ba888 100644 --- a/lisp/textmodes/rst.el +++ b/lisp/textmodes/rst.el @@ -1147,14 +1147,14 @@ as well but give an additional message." (unless (fboundp forwarder-function) (defalias forwarder-function (lambda () + (:documentation + (format "Deprecated binding for %s, use \\[%s] instead." + def def)) (interactive) (call-interactively def) (message "[Deprecated use of key %s; use key %s instead]" (key-description (this-command-keys)) - (key-description key))) - ;; FIXME: In Emacs-25 we could use (:documentation ...) instead. - (format "Deprecated binding for %s, use \\[%s] instead." - def def))) + (key-description key))))) (dolist (dep-key deprecated) (define-key keymap dep-key forwarder-function))))) From 07bd7a0150eab1084a41f230cf59e620811e1778 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 13 Feb 2024 17:12:34 +0100 Subject: [PATCH 146/446] Add docstring for Tramp test macros * test/lisp/net/tramp-tests.el (tramp--test-set-ert-test-documentation): New defun. (tramp--test-deftest-with-stat, tramp--test-deftest-with-perl) (tramp--test-deftest-with-ls): Use it to define docstring. --- test/lisp/net/tramp-tests.el | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 4a964f0daf0..623e0860a01 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -3815,15 +3815,24 @@ This tests also `access-file', `file-readable-p', (ignore-errors (delete-file tmp-name1)) (ignore-errors (delete-file tmp-name2)))))) +(defun tramp--test-set-ert-test-documentation (test command) + "Set the documentation string for a derived test. +The test is derived from TEST and COMMAND." + (let ((test-doc + (string-split (ert-test-documentation (get test 'ert--test)) "\n"))) + ;; The first line must be extended. + (setcar + test-doc (format "%s Use the \"%s\" command." (car test-doc) command)) + (setf (ert-test-documentation + (get (intern (format "%s-with-%s" test command)) 'ert--test)) + (string-join test-doc "\n")))) + (defmacro tramp--test-deftest-with-stat (test) "Define ert `TEST-with-stat'." (declare (indent 1)) `(ert-deftest ,(intern (concat (symbol-name test) "-with-stat")) () - ;; This is the docstring. However, it must be expanded to a - ;; string inside the macro. No idea. - ;; (concat (ert-test-documentation (get ',test 'ert--test)) - ;; "\nUse the \"stat\" command.") :tags '(:expensive-test) + (tramp--test-set-ert-test-documentation ',test "stat") (skip-unless (tramp--test-enabled)) (skip-unless (tramp--test-sh-p)) (skip-unless (tramp-get-remote-stat tramp-test-vec)) @@ -3842,11 +3851,8 @@ This tests also `access-file', `file-readable-p', "Define ert `TEST-with-perl'." (declare (indent 1)) `(ert-deftest ,(intern (concat (symbol-name test) "-with-perl")) () - ;; This is the docstring. However, it must be expanded to a - ;; string inside the macro. No idea. - ;; (concat (ert-test-documentation (get ',test 'ert--test)) - ;; "\nUse the \"perl\" command.") :tags '(:expensive-test) + (tramp--test-set-ert-test-documentation ',test "perl") (skip-unless (tramp--test-enabled)) (skip-unless (tramp--test-sh-p)) (skip-unless (tramp-get-remote-perl tramp-test-vec)) @@ -3870,11 +3876,8 @@ This tests also `access-file', `file-readable-p', "Define ert `TEST-with-ls'." (declare (indent 1)) `(ert-deftest ,(intern (concat (symbol-name test) "-with-ls")) () - ;; This is the docstring. However, it must be expanded to a - ;; string inside the macro. No idea. - ;; (concat (ert-test-documentation (get ',test 'ert--test)) - ;; "\nUse the \"ls\" command.") :tags '(:expensive-test) + (tramp--test-set-ert-test-documentation ',test "ls") (skip-unless (tramp--test-enabled)) (skip-unless (tramp--test-sh-p)) (if-let ((default-directory ert-remote-temporary-file-directory) From d61145cc8cfb31ca170cd1b5deab59f0a5cbea63 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 13 Feb 2024 19:02:21 +0200 Subject: [PATCH 147/446] More changes for treesitter support of outline-minor-mode (bug#68824) * lisp/treesit.el (treesit-outline-level): Set NAMED arg of 'treesit-node-at' to t. Don't set IGNORE-MISSING arg of 'treesit-node-match-p' to t. * lisp/progmodes/ruby-ts-mode.el (ruby-ts-mode): Add "singleton_method" to 'treesit-thing-settings'. Set 'treesit-outline-predicate'. Kill local variables 'outline-regexp' and 'outline-level'. --- lisp/progmodes/ruby-ts-mode.el | 14 ++++++++++++++ lisp/treesit.el | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el index 598eaa461ff..426ae248cac 100644 --- a/lisp/progmodes/ruby-ts-mode.el +++ b/lisp/progmodes/ruby-ts-mode.el @@ -1133,6 +1133,7 @@ leading double colon is not added." "singleton_class" "module" "method" + "singleton_method" "array" "hash" "parenthesized_statements" @@ -1178,6 +1179,19 @@ leading double colon is not added." ;; Imenu. (setq-local imenu-create-index-function #'ruby-ts--imenu) + ;; Outline minor mode. + (setq-local treesit-outline-predicate + (rx bos (or "singleton_method" + "method" + "alias" + "class" + "module") + eos)) + ;; Restore default values of outline variables + ;; to use `treesit-outline-predicate'. + (kill-local-variable 'outline-regexp) + (kill-local-variable 'outline-level) + (setq-local treesit-simple-indent-rules (ruby-ts--indent-rules)) ;; Font-lock. diff --git a/lisp/treesit.el b/lisp/treesit.el index 25ac582276b..f811b8090bc 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -2918,8 +2918,8 @@ See the descriptions of arguments in `outline-search-function'." (defun treesit-outline-level () "Return the depth of the current outline heading." - (let* ((node (treesit-node-at (point))) - (level (if (treesit-node-match-p node treesit-outline-predicate t) + (let* ((node (treesit-node-at (point) nil t)) + (level (if (treesit-node-match-p node treesit-outline-predicate) 1 0))) (while (setq node (treesit-parent-until node treesit-outline-predicate)) (setq level (1+ level))) From d2a5d7534c7dcdc4432bf5456cb8a76680f7aa14 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:50 -0800 Subject: [PATCH 148/446] Simplify and speed up EQ * src/lisp.h (lisp_h_BASE2_EQ, lisp_h_EQ): Simplify by testing symbols_with_pos_enabled first. On x86-64 with GCC 13.2 this shrinks temacs text by 1.5% and after removing all *.elc files speeds up 'make' by 1.2%. --- src/lisp.h | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index 5326824bf38..f6133669ac1 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -384,27 +384,19 @@ typedef EMACS_INT Lisp_Word; ((ok) ? (void) 0 : wrong_type_argument (predicate, x)) #define lisp_h_CONSP(x) TAGGEDP (x, Lisp_Cons) #define lisp_h_BASE_EQ(x, y) (XLI (x) == XLI (y)) -#define lisp_h_BASE2_EQ(x, y) \ - (BASE_EQ (x, y) \ - || (symbols_with_pos_enabled \ - && SYMBOL_WITH_POS_P (x) \ - && BASE_EQ (XSYMBOL_WITH_POS (x)->sym, y))) +#define lisp_h_BASE2_EQ(x, y) \ + (symbols_with_pos_enabled \ + ? BASE_EQ (SYMBOL_WITH_POS_P (x) ? XSYMBOL_WITH_POS (x)->sym : (x), y) \ + : BASE_EQ (x, y)) /* FIXME: Do we really need to inline the whole thing? * What about keeping the part after `symbols_with_pos_enabled` in * a separate function? */ -#define lisp_h_EQ(x, y) \ - (XLI (x) == XLI (y) \ - || (symbols_with_pos_enabled \ - && (SYMBOL_WITH_POS_P (x) \ - ? (BARE_SYMBOL_P (y) \ - ? XLI (XSYMBOL_WITH_POS (x)->sym) == XLI (y) \ - : (SYMBOL_WITH_POS_P (y) \ - && (XLI (XSYMBOL_WITH_POS (x)->sym) \ - == XLI (XSYMBOL_WITH_POS (y)->sym)))) \ - : (SYMBOL_WITH_POS_P (y) \ - && BARE_SYMBOL_P (x) \ - && (XLI (x) == XLI (XSYMBOL_WITH_POS (y)->sym)))))) +#define lisp_h_EQ(x, y) \ + (symbols_with_pos_enabled \ + ? BASE_EQ (SYMBOL_WITH_POS_P (x) ? XSYMBOL_WITH_POS (x)->sym : (x), \ + SYMBOL_WITH_POS_P (y) ? XSYMBOL_WITH_POS (y)->sym : (y)) \ + : BASE_EQ (x, y)) #define lisp_h_FIXNUMP(x) \ (! (((unsigned) (XLI (x) >> (USE_LSB_TAG ? 0 : FIXNUM_BITS)) \ From 08c1863257469b4cb85e97a276ba635d44b22666 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 149/446] Simplify and speed up EQ again * src/lisp.h (lisp_h_BASE2_EQ, lisp_h_EQ): Simplify and refactor. On x86-64 with GCC 3.2 this shrinks temacs text by 0.055% and after removing all *.elc files speeds up 'make' by 1.0%. --- src/lisp.h | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index f6133669ac1..b609bef990c 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -385,18 +385,13 @@ typedef EMACS_INT Lisp_Word; #define lisp_h_CONSP(x) TAGGEDP (x, Lisp_Cons) #define lisp_h_BASE_EQ(x, y) (XLI (x) == XLI (y)) #define lisp_h_BASE2_EQ(x, y) \ - (symbols_with_pos_enabled \ - ? BASE_EQ (SYMBOL_WITH_POS_P (x) ? XSYMBOL_WITH_POS (x)->sym : (x), y) \ - : BASE_EQ (x, y)) - -/* FIXME: Do we really need to inline the whole thing? - * What about keeping the part after `symbols_with_pos_enabled` in - * a separate function? */ + BASE_EQ ((symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) \ + ? XSYMBOL_WITH_POS (x)->sym : (x)), \ + y) #define lisp_h_EQ(x, y) \ - (symbols_with_pos_enabled \ - ? BASE_EQ (SYMBOL_WITH_POS_P (x) ? XSYMBOL_WITH_POS (x)->sym : (x), \ - SYMBOL_WITH_POS_P (y) ? XSYMBOL_WITH_POS (y)->sym : (y)) \ - : BASE_EQ (x, y)) + BASE2_EQ (x, \ + (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) \ + ? XSYMBOL_WITH_POS (y)->sym : (y))) #define lisp_h_FIXNUMP(x) \ (! (((unsigned) (XLI (x) >> (USE_LSB_TAG ? 0 : FIXNUM_BITS)) \ From efdcd7b8f78ef22c0213ea770a552fb69b789381 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 150/446] Remove BASE2_EQ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * src/lisp.h (lisp_h_BASE2_EQ, BASE2_EQ): Remove. All uses removed. BASE2_EQ was present only for minor optimization and with current gcc -O2, BASE2_EQ does not affect performance, so it’s not worth the hassle. --- src/lisp.h | 18 +++--------------- src/lread.c | 4 +++- src/timefns.c | 6 +++--- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index b609bef990c..0b676a027eb 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -384,14 +384,11 @@ typedef EMACS_INT Lisp_Word; ((ok) ? (void) 0 : wrong_type_argument (predicate, x)) #define lisp_h_CONSP(x) TAGGEDP (x, Lisp_Cons) #define lisp_h_BASE_EQ(x, y) (XLI (x) == XLI (y)) -#define lisp_h_BASE2_EQ(x, y) \ +#define lisp_h_EQ(x, y) \ BASE_EQ ((symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) \ ? XSYMBOL_WITH_POS (x)->sym : (x)), \ - y) -#define lisp_h_EQ(x, y) \ - BASE2_EQ (x, \ - (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) \ - ? XSYMBOL_WITH_POS (y)->sym : (y))) + (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) \ + ? XSYMBOL_WITH_POS (y)->sym : (y))) #define lisp_h_FIXNUMP(x) \ (! (((unsigned) (XLI (x) >> (USE_LSB_TAG ? 0 : FIXNUM_BITS)) \ @@ -461,7 +458,6 @@ typedef EMACS_INT Lisp_Word; # define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x) # define CONSP(x) lisp_h_CONSP (x) # define BASE_EQ(x, y) lisp_h_BASE_EQ (x, y) -# define BASE2_EQ(x, y) lisp_h_BASE2_EQ (x, y) # define FLOATP(x) lisp_h_FLOATP (x) # define FIXNUMP(x) lisp_h_FIXNUMP (x) # define NILP(x) lisp_h_NILP (x) @@ -1339,14 +1335,6 @@ INLINE bool return lisp_h_BASE_EQ (x, y); } -/* Return true if X and Y are the same object, reckoning X to be the - same as a bare symbol Y if X is Y with position. */ -INLINE bool -(BASE2_EQ) (Lisp_Object x, Lisp_Object y) -{ - return lisp_h_BASE2_EQ (x, y); -} - /* Return true if X and Y are the same object, reckoning a symbol with position as being the same as the bare symbol. */ INLINE bool diff --git a/src/lread.c b/src/lread.c index d339b2f15ae..551bfd735a2 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5063,10 +5063,12 @@ it defaults to the value of `obarray'. */) { /* If already a symbol, we don't do shorthand-longhand translation, as promised in the docstring. */ + Lisp_Object sym = (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (name) + ? XSYMBOL_WITH_POS (name)->sym : name); string = XSYMBOL (name)->u.s.name; tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); - return BASE2_EQ (name, tem) ? name : Qnil; + return BASE_EQ (sym, tem) ? name : Qnil; } } diff --git a/src/timefns.c b/src/timefns.c index 1541583b485..fc1edf136cb 100644 --- a/src/timefns.c +++ b/src/timefns.c @@ -225,7 +225,7 @@ tzlookup (Lisp_Object zone, bool settz) if (NILP (zone)) return local_tz; - else if (BASE_EQ (zone, make_fixnum (0)) || BASE2_EQ (zone, Qt)) + else if (BASE_EQ (zone, make_fixnum (0)) || EQ (zone, Qt)) { zone_string = "UTC0"; new_tz = utc_tz; @@ -234,7 +234,7 @@ tzlookup (Lisp_Object zone, bool settz) { bool plain_integer = FIXNUMP (zone); - if (BASE2_EQ (zone, Qwall)) + if (EQ (zone, Qwall)) zone_string = 0; else if (STRINGP (zone)) zone_string = SSDATA (ENCODE_SYSTEM (zone)); @@ -1548,7 +1548,7 @@ usage: (decode-time &optional TIME ZONE FORM) */) /* Compute SEC from LOCAL_TM.tm_sec and HZ. */ Lisp_Object hz = lt.hz, sec; - if (BASE_EQ (hz, make_fixnum (1)) || !BASE2_EQ (form, Qt)) + if (BASE_EQ (hz, make_fixnum (1)) || !EQ (form, Qt)) sec = make_fixnum (local_tm.tm_sec); else { From 231af322b07447d87b4c250aa601219a4005d9a5 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 151/446] Remove lisp_h_PSEUDOVECTORP etc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * src/lisp.h (lisp_h_PSEUDOVECTORP, lisp_h_EQ, lisp_h_SYMBOLP): Refactor by removing these macros, moving each definiens to its only use. Now that we have symbols with position so that there is no longer a non-lisp_h_* macro counterpart if DEFINE_KEY_OPS_AS_MACROS, there’s no need to separate these definiens from their inline function bodies. --- src/lisp.h | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index 0b676a027eb..d1dcddcfb89 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -372,23 +372,12 @@ typedef EMACS_INT Lisp_Word; # define lisp_h_Qnil {0} #endif -#define lisp_h_PSEUDOVECTORP(a,code) \ - (lisp_h_VECTORLIKEP (a) \ - && ((XUNTAG (a, Lisp_Vectorlike, union vectorlike_header)->size \ - & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) \ - == (PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS)))) - #define lisp_h_CHECK_FIXNUM(x) CHECK_TYPE (FIXNUMP (x), Qfixnump, x) #define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x) #define lisp_h_CHECK_TYPE(ok, predicate, x) \ ((ok) ? (void) 0 : wrong_type_argument (predicate, x)) #define lisp_h_CONSP(x) TAGGEDP (x, Lisp_Cons) #define lisp_h_BASE_EQ(x, y) (XLI (x) == XLI (y)) -#define lisp_h_EQ(x, y) \ - BASE_EQ ((symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) \ - ? XSYMBOL_WITH_POS (x)->sym : (x)), \ - (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) \ - ? XSYMBOL_WITH_POS (y)->sym : (y))) #define lisp_h_FIXNUMP(x) \ (! (((unsigned) (XLI (x) >> (USE_LSB_TAG ? 0 : FIXNUM_BITS)) \ @@ -406,8 +395,6 @@ typedef EMACS_INT Lisp_Word; (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), (sym)->u.s.val.value) #define lisp_h_SYMBOL_WITH_POS_P(x) PSEUDOVECTORP (x, PVEC_SYMBOL_WITH_POS) #define lisp_h_BARE_SYMBOL_P(x) TAGGEDP (x, Lisp_Symbol) -#define lisp_h_SYMBOLP(x) \ - (BARE_SYMBOL_P (x) || (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x))) #define lisp_h_TAGGEDP(a, tag) \ (! (((unsigned) (XLI (a) >> (USE_LSB_TAG ? 0 : VALBITS)) \ - (unsigned) (tag)) \ @@ -465,7 +452,6 @@ typedef EMACS_INT Lisp_Word; # define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym) # define SYMBOL_TRAPPED_WRITE_P(sym) lisp_h_SYMBOL_TRAPPED_WRITE_P (sym) # define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym) -/* # define SYMBOLP(x) lisp_h_SYMBOLP (x) */ /* X is accessed more than once. */ # define TAGGEDP(a, tag) lisp_h_TAGGEDP (a, tag) # define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x) # define XCAR(c) lisp_h_XCAR (c) @@ -1104,7 +1090,10 @@ enum More_Lisp_Bits INLINE bool PSEUDOVECTORP (Lisp_Object a, int code) { - return lisp_h_PSEUDOVECTORP (a, code); + return (lisp_h_VECTORLIKEP (a) + && ((XUNTAG (a, Lisp_Vectorlike, union vectorlike_header)->size + & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) + == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS)))); } INLINE bool @@ -1120,9 +1109,10 @@ INLINE bool } INLINE bool -(SYMBOLP) (Lisp_Object x) +SYMBOLP (Lisp_Object x) { - return lisp_h_SYMBOLP (x); + return (BARE_SYMBOL_P (x) + || (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x))); } INLINE struct Lisp_Symbol_With_Pos * @@ -1338,9 +1328,12 @@ INLINE bool /* Return true if X and Y are the same object, reckoning a symbol with position as being the same as the bare symbol. */ INLINE bool -(EQ) (Lisp_Object x, Lisp_Object y) +EQ (Lisp_Object x, Lisp_Object y) { - return lisp_h_EQ (x, y); + return BASE_EQ ((symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) + ? XSYMBOL_WITH_POS (x)->sym : x), + (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) + ? XSYMBOL_WITH_POS (y)->sym : y)); } INLINE intmax_t From 473dac880105cf6055a185eb3b9764243f27697c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 152/446] Remove lisp_h_XCONS etc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When configured with --enable-checking and compiled with gcc -O0, these macros evaluated arguments multiple times, which made it too easy to mistakenly write code that behaves differently when debugging. This patch does not affect performance in normal builds. In --enable-checking builds with gcc -O0 it slows down my usual benchmark (remove all '*.elc’ files and then 'make') by 4.4%. I hope that’s good enough; if not I can complicate the macros to tune better for debugging builds. * src/lisp.h (lisp_h_SET_SYMBOL_VAL, lisp_h_SYMBOL_VAL) (lisp_h_XCONS): Remove, moving each definiens to the corresponding inline function. All uses removed. --- src/lisp.h | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index d1dcddcfb89..796c7867b4c 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -330,7 +330,8 @@ typedef EMACS_INT Lisp_Word; without worrying about the implementations diverging, since lisp_h_OP defines the actual implementation. The lisp_h_OP macros are intended to be private to this include file, and should not be - used elsewhere. + used elsewhere. They should evaluate each argument exactly once, + so that they behave like their functional counterparts. FIXME: Remove the lisp_h_OP macros, and define just the inline OP functions, once "gcc -Og" (new to GCC 4.8) or equivalent works well @@ -385,14 +386,9 @@ typedef EMACS_INT Lisp_Word; & ((1 << INTTYPEBITS) - 1))) #define lisp_h_FLOATP(x) TAGGEDP (x, Lisp_Float) #define lisp_h_NILP(x) BASE_EQ (x, Qnil) -#define lisp_h_SET_SYMBOL_VAL(sym, v) \ - (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), \ - (sym)->u.s.val.value = (v)) #define lisp_h_SYMBOL_CONSTANT_P(sym) \ (XSYMBOL (sym)->u.s.trapped_write == SYMBOL_NOWRITE) #define lisp_h_SYMBOL_TRAPPED_WRITE_P(sym) (XSYMBOL (sym)->u.s.trapped_write) -#define lisp_h_SYMBOL_VAL(sym) \ - (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), (sym)->u.s.val.value) #define lisp_h_SYMBOL_WITH_POS_P(x) PSEUDOVECTORP (x, PVEC_SYMBOL_WITH_POS) #define lisp_h_BARE_SYMBOL_P(x) TAGGEDP (x, Lisp_Symbol) #define lisp_h_TAGGEDP(a, tag) \ @@ -402,8 +398,6 @@ typedef EMACS_INT Lisp_Word; #define lisp_h_VECTORLIKEP(x) TAGGEDP (x, Lisp_Vectorlike) #define lisp_h_XCAR(c) XCONS (c)->u.s.car #define lisp_h_XCDR(c) XCONS (c)->u.s.u.cdr -#define lisp_h_XCONS(a) \ - (eassert (CONSP (a)), XUNTAG (a, Lisp_Cons, struct Lisp_Cons)) #define lisp_h_XHASH(a) XUFIXNUM_RAW (a) #if USE_LSB_TAG # define lisp_h_make_fixnum_wrap(n) \ @@ -448,15 +442,12 @@ typedef EMACS_INT Lisp_Word; # define FLOATP(x) lisp_h_FLOATP (x) # define FIXNUMP(x) lisp_h_FIXNUMP (x) # define NILP(x) lisp_h_NILP (x) -# define SET_SYMBOL_VAL(sym, v) lisp_h_SET_SYMBOL_VAL (sym, v) # define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym) # define SYMBOL_TRAPPED_WRITE_P(sym) lisp_h_SYMBOL_TRAPPED_WRITE_P (sym) -# define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym) # define TAGGEDP(a, tag) lisp_h_TAGGEDP (a, tag) # define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x) # define XCAR(c) lisp_h_XCAR (c) # define XCDR(c) lisp_h_XCDR (c) -# define XCONS(a) lisp_h_XCONS (a) # define XHASH(a) lisp_h_XHASH (a) # if USE_LSB_TAG # define make_fixnum(n) lisp_h_make_fixnum (n) @@ -1478,9 +1469,10 @@ CHECK_CONS (Lisp_Object x) } INLINE struct Lisp_Cons * -(XCONS) (Lisp_Object a) +XCONS (Lisp_Object a) { - return lisp_h_XCONS (a); + eassert (CONSP (a)); + return XUNTAG (a, Lisp_Cons, struct Lisp_Cons); } /* Take the car or cdr of something known to be a cons cell. */ @@ -2265,9 +2257,10 @@ typedef jmp_buf sys_jmp_buf; /* Value is name of symbol. */ INLINE Lisp_Object -(SYMBOL_VAL) (struct Lisp_Symbol *sym) +SYMBOL_VAL (struct Lisp_Symbol *sym) { - return lisp_h_SYMBOL_VAL (sym); + eassert (sym->u.s.redirect == SYMBOL_PLAINVAL); + return sym->u.s.val.value; } INLINE struct Lisp_Symbol * @@ -2290,9 +2283,10 @@ SYMBOL_FWD (struct Lisp_Symbol *sym) } INLINE void -(SET_SYMBOL_VAL) (struct Lisp_Symbol *sym, Lisp_Object v) +SET_SYMBOL_VAL (struct Lisp_Symbol *sym, Lisp_Object v) { - lisp_h_SET_SYMBOL_VAL (sym, v); + eassert (sym->u.s.redirect == SYMBOL_PLAINVAL); + sym->u.s.val.value = v; } INLINE void From 10c6aea4434b1c9ccea30a1f87f301ab2c9bade6 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 153/446] Remove SYMBOL_WITH_POS_{POS,SYM} * src/fns.c (internal_equal): Turn comment into eassert that !symbols_with_pos_enabled. (sxhash_obj): Simplify case of symbol with pos (when enabled). * src/lisp.h (XSYMBOL_WITH_POS_SYM, XSYMBOL_WITH_POS_POS) (maybe_remove_pos_from_symbol): New inline functions. (SYMBOL_WITH_POS_SYM, SYMBOL_WITH_POS_POS): Remove. All uses replaced by the new functions. This avoids some double-checking in the source code, simplifies the code overall, and avoids the need for "Type checking is done in the following macro" comments to explain unusual code. --- src/data.c | 16 +++++++--------- src/fns.c | 44 +++++++++++++++++++++----------------------- src/lisp.h | 43 ++++++++++++++++++++++++------------------- src/lread.c | 3 +-- src/timefns.c | 6 ++---- 5 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/data.c b/src/data.c index 0c47750cb75..530bb774171 100644 --- a/src/data.c +++ b/src/data.c @@ -791,18 +791,16 @@ DEFUN ("bare-symbol", Fbare_symbol, Sbare_symbol, 1, 1, 0, doc: /* Extract, if need be, the bare symbol from SYM, a symbol. */) (register Lisp_Object sym) { - if (BARE_SYMBOL_P (sym)) - return sym; - /* Type checking is done in the following macro. */ - return SYMBOL_WITH_POS_SYM (sym); + CHECK_SYMBOL (sym); + return BARE_SYMBOL_P (sym) ? sym : XSYMBOL_WITH_POS_SYM (sym); } DEFUN ("symbol-with-pos-pos", Fsymbol_with_pos_pos, Ssymbol_with_pos_pos, 1, 1, 0, doc: /* Extract the position from a symbol with position. */) (register Lisp_Object ls) { - /* Type checking is done in the following macro. */ - return SYMBOL_WITH_POS_POS (ls); + CHECK_TYPE (SYMBOL_WITH_POS_P (ls), Qsymbol_with_pos_p, ls); + return XSYMBOL_WITH_POS_POS (ls); } DEFUN ("remove-pos-from-symbol", Fremove_pos_from_symbol, @@ -812,7 +810,7 @@ Otherwise, return ARG unchanged. Compare with `bare-symbol'. */) (register Lisp_Object arg) { if (SYMBOL_WITH_POS_P (arg)) - return (SYMBOL_WITH_POS_SYM (arg)); + return XSYMBOL_WITH_POS_SYM (arg); return arg; } @@ -829,14 +827,14 @@ the position will be taken. */) if (BARE_SYMBOL_P (sym)) bare = sym; else if (SYMBOL_WITH_POS_P (sym)) - bare = XSYMBOL_WITH_POS (sym)->sym; + bare = XSYMBOL_WITH_POS_SYM (sym); else wrong_type_argument (Qsymbolp, sym); if (FIXNUMP (pos)) position = pos; else if (SYMBOL_WITH_POS_P (pos)) - position = XSYMBOL_WITH_POS (pos)->pos; + position = XSYMBOL_WITH_POS_POS (pos); else wrong_type_argument (Qfixnum_or_symbol_with_pos_p, pos); diff --git a/src/fns.c b/src/fns.c index 61d87752777..918ba0370e8 100644 --- a/src/fns.c +++ b/src/fns.c @@ -2782,13 +2782,8 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind, /* A symbol with position compares the contained symbol, and is `equal' to the corresponding ordinary symbol. */ - if (symbols_with_pos_enabled) - { - if (SYMBOL_WITH_POS_P (o1)) - o1 = SYMBOL_WITH_POS_SYM (o1); - if (SYMBOL_WITH_POS_P (o2)) - o2 = SYMBOL_WITH_POS_SYM (o2); - } + o1 = maybe_remove_pos_from_symbol (o1); + o2 = maybe_remove_pos_from_symbol (o2); if (BASE_EQ (o1, o2)) return true; @@ -2869,11 +2864,14 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind, if (TS_NODEP (o1)) return treesit_node_eq (o1, o2); #endif - if (SYMBOL_WITH_POS_P(o1)) /* symbols_with_pos_enabled is false. */ - return (BASE_EQ (XSYMBOL_WITH_POS (o1)->sym, - XSYMBOL_WITH_POS (o2)->sym) - && BASE_EQ (XSYMBOL_WITH_POS (o1)->pos, - XSYMBOL_WITH_POS (o2)->pos)); + if (SYMBOL_WITH_POS_P (o1)) + { + eassert (!symbols_with_pos_enabled); + return (BASE_EQ (XSYMBOL_WITH_POS_SYM (o1), + XSYMBOL_WITH_POS_SYM (o2)) + && BASE_EQ (XSYMBOL_WITH_POS_POS (o1), + XSYMBOL_WITH_POS_POS (o2))); + } /* Aside from them, only true vectors, char-tables, compiled functions, and fonts (font-spec, font-entity, font-object) @@ -4465,9 +4463,8 @@ reduce_emacs_uint_to_hash_hash (EMACS_UINT x) static EMACS_INT sxhash_eq (Lisp_Object key) { - if (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (key)) - key = SYMBOL_WITH_POS_SYM (key); - return XHASH (key) ^ XTYPE (key); + Lisp_Object k = maybe_remove_pos_from_symbol (key); + return XHASH (k) ^ XTYPE (k); } static EMACS_INT @@ -5247,12 +5244,15 @@ sxhash_obj (Lisp_Object obj, int depth) hash = sxhash_combine (hash, sxhash_obj (XOVERLAY (obj)->plist, depth)); return hash; } - else if (symbols_with_pos_enabled && pvec_type == PVEC_SYMBOL_WITH_POS) - return sxhash_obj (XSYMBOL_WITH_POS (obj)->sym, depth + 1); else - /* Others are 'equal' if they are 'eq', so take their - address as hash. */ - return XHASH (obj); + { + if (symbols_with_pos_enabled && pvec_type == PVEC_SYMBOL_WITH_POS) + obj = XSYMBOL_WITH_POS_SYM (obj); + + /* Others are 'equal' if they are 'eq', so take their + address as hash. */ + return XHASH (obj); + } } case Lisp_Cons: @@ -5447,9 +5447,7 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */) /* See if there's a `:test TEST' among the arguments. */ ptrdiff_t i = get_key_arg (QCtest, nargs, args, used); - Lisp_Object test = i ? args[i] : Qeql; - if (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (test)) - test = SYMBOL_WITH_POS_SYM (test); + Lisp_Object test = i ? maybe_remove_pos_from_symbol (args[i]) : Qeql; const struct hash_table_test *testdesc; if (BASE_EQ (test, Qeq)) testdesc = &hashtest_eq; diff --git a/src/lisp.h b/src/lisp.h index 796c7867b4c..e9b0bd522af 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1113,6 +1113,27 @@ XSYMBOL_WITH_POS (Lisp_Object a) return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Symbol_With_Pos); } +INLINE Lisp_Object +XSYMBOL_WITH_POS_SYM (Lisp_Object a) +{ + Lisp_Object sym = XSYMBOL_WITH_POS (a)->sym; + eassert (BARE_SYMBOL_P (sym)); + return sym; +} + +INLINE Lisp_Object +XSYMBOL_WITH_POS_POS (Lisp_Object a) +{ + return XSYMBOL_WITH_POS (a)->pos; +} + +INLINE Lisp_Object +maybe_remove_pos_from_symbol (Lisp_Object x) +{ + return (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) + ? XSYMBOL_WITH_POS_SYM (x) : x); +} + INLINE struct Lisp_Symbol * ATTRIBUTE_NO_SANITIZE_UNDEFINED XBARE_SYMBOL (Lisp_Object a) { @@ -1128,7 +1149,7 @@ XSYMBOL (Lisp_Object a) if (!BARE_SYMBOL_P (a)) { eassert (symbols_with_pos_enabled); - a = XSYMBOL_WITH_POS (a)->sym; + a = XSYMBOL_WITH_POS_SYM (a); } return XBARE_SYMBOL (a); } @@ -1322,9 +1343,9 @@ INLINE bool EQ (Lisp_Object x, Lisp_Object y) { return BASE_EQ ((symbols_with_pos_enabled && SYMBOL_WITH_POS_P (x) - ? XSYMBOL_WITH_POS (x)->sym : x), + ? XSYMBOL_WITH_POS_SYM (x) : x), (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (y) - ? XSYMBOL_WITH_POS (y)->sym : y)); + ? XSYMBOL_WITH_POS_SYM (y) : y)); } INLINE intmax_t @@ -2809,22 +2830,6 @@ XOVERLAY (Lisp_Object a) return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Overlay); } -INLINE Lisp_Object -SYMBOL_WITH_POS_SYM (Lisp_Object a) -{ - if (!SYMBOL_WITH_POS_P (a)) - wrong_type_argument (Qsymbol_with_pos_p, a); - return XSYMBOL_WITH_POS (a)->sym; -} - -INLINE Lisp_Object -SYMBOL_WITH_POS_POS (Lisp_Object a) -{ - if (!SYMBOL_WITH_POS_P (a)) - wrong_type_argument (Qsymbol_with_pos_p, a); - return XSYMBOL_WITH_POS (a)->pos; -} - INLINE bool USER_PTRP (Lisp_Object x) { diff --git a/src/lread.c b/src/lread.c index 551bfd735a2..c11c641440d 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5063,8 +5063,7 @@ it defaults to the value of `obarray'. */) { /* If already a symbol, we don't do shorthand-longhand translation, as promised in the docstring. */ - Lisp_Object sym = (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (name) - ? XSYMBOL_WITH_POS (name)->sym : name); + Lisp_Object sym = maybe_remove_pos_from_symbol (name); string = XSYMBOL (name)->u.s.name; tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); diff --git a/src/timefns.c b/src/timefns.c index fc1edf136cb..0ecbb6e6793 100644 --- a/src/timefns.c +++ b/src/timefns.c @@ -1765,10 +1765,8 @@ but new code should not rely on it. */) well, since we accept it as input? */ struct lisp_time t; enum timeform input_form = decode_lisp_time (time, false, &t, 0); - if (NILP (form)) - form = current_time_list ? Qlist : Qt; - if (symbols_with_pos_enabled && SYMBOL_WITH_POS_P (form)) - form = SYMBOL_WITH_POS_SYM (form); + form = (!NILP (form) ? maybe_remove_pos_from_symbol (form) + : current_time_list ? Qlist : Qt); if (BASE_EQ (form, Qlist)) return ticks_hz_list4 (t.ticks, t.hz); if (BASE_EQ (form, Qinteger)) From d202f1b9e74107c0e51c5d2fdbe094cbe1baaadb Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 154/446] XSYMBOL eassume speedups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * src/lisp.h (XSYMBOL_WITH_POS_SYM, XSYMBOL): Help the compiler by using eassume instead of eassert for XSYMBOL postconditions likely to be useful for optimization later. With gcc 13.2 -O2 x86-64 this improved speed on my usual ā€œcompile all .el filesā€ benchmark by 0.7% and shrank the text size of Emacs by 0.09%. --- src/lisp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index e9b0bd522af..bf96bfd39f7 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1117,7 +1117,7 @@ INLINE Lisp_Object XSYMBOL_WITH_POS_SYM (Lisp_Object a) { Lisp_Object sym = XSYMBOL_WITH_POS (a)->sym; - eassert (BARE_SYMBOL_P (sym)); + eassume (BARE_SYMBOL_P (sym)); return sym; } @@ -1148,7 +1148,7 @@ XSYMBOL (Lisp_Object a) { if (!BARE_SYMBOL_P (a)) { - eassert (symbols_with_pos_enabled); + eassume (symbols_with_pos_enabled); a = XSYMBOL_WITH_POS_SYM (a); } return XBARE_SYMBOL (a); From a4a99405d00b98aeb86040117402ed0e1f954833 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 13 Feb 2024 09:54:51 -0800 Subject: [PATCH 155/446] Simplify position-symbol * src/data.c (Fposition_symbol): Simplify by calling Fbare_symbol rather than open-coding it. --- src/data.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/data.c b/src/data.c index 530bb774171..f2f35fb355a 100644 --- a/src/data.c +++ b/src/data.c @@ -821,16 +821,9 @@ POS, the position, is either a fixnum or a symbol with position from which the position will be taken. */) (register Lisp_Object sym, register Lisp_Object pos) { - Lisp_Object bare; + Lisp_Object bare = Fbare_symbol (sym); Lisp_Object position; - if (BARE_SYMBOL_P (sym)) - bare = sym; - else if (SYMBOL_WITH_POS_P (sym)) - bare = XSYMBOL_WITH_POS_SYM (sym); - else - wrong_type_argument (Qsymbolp, sym); - if (FIXNUMP (pos)) position = pos; else if (SYMBOL_WITH_POS_P (pos)) From 10bf810e845061a83d466cd7367ab7d220653296 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 13 Feb 2024 21:59:03 +0200 Subject: [PATCH 156/446] Fix left-over from renaming 'comp-*' functions * lisp/progmodes/elisp-mode.el (comp--write-bytecode-file): Call this instead of 'comp-write-bytecode-file', its old name. Reported by Arthur Miller . --- lisp/progmodes/elisp-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index da0cb96e1cf..4e0e7552f8e 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -221,7 +221,7 @@ All commands in `lisp-mode-shared-map' are inherited by this map." (load (byte-compile-dest-file buffer-file-name))) (declare-function native-compile "comp") -(declare-function comp-write-bytecode-file "comp") +(declare-function comp--write-bytecode-file "comp") (defun emacs-lisp-native-compile () "Native-compile the current buffer's file (if it has changed). @@ -233,7 +233,7 @@ visited by the current buffer." (byte-to-native-output-buffer-file nil) (eln (native-compile buffer-file-name))) (when eln - (comp-write-bytecode-file eln)))) + (comp-write--bytecode-file eln)))) (defun emacs-lisp-native-compile-and-load () "Native-compile the current buffer's file (if it has changed), then load it. From 371ccf09fea26892a2fada028d27fb4b596636df Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Mon, 12 Feb 2024 18:29:50 +0100 Subject: [PATCH 157/446] Add 'custom-variable' command * lisp/cus-edit.el (customize-toggle-option): Add command. (toggle-option): Add shorter alias for 'customize-toggle-option'. * etc/NEWS: Document it. (Bug#69079) --- etc/NEWS | 4 ++++ lisp/cus-edit.el | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index f89c8ce1d8d..e6b1d424499 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1336,6 +1336,10 @@ in Buffer menu mode. *** New command 'customize-dirlocals'. This command pops up a buffer to edit the settings in ".dir-locals.el". +--- +** New command 'customize-toggle-option'. +This command can toggle boolean options for the duration of a session. + ** Calc +++ diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 38b6ec984ab..8fad51dc116 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -1227,6 +1227,41 @@ If OTHER-WINDOW is non-nil, display in another window." (unless (eq symbol basevar) (message "`%s' is an alias for `%s'" symbol basevar)))) +;;;###autoload +(defun customize-toggle-option (symbol) + "Toggle the value of boolean option SYMBOL for this session." + (interactive (let ((prompt "Toggle boolean option: ") opts) + (mapatoms + (lambda (sym) + (when (eq (get sym 'custom-type) 'boolean) + (push sym opts)))) + (list (intern (completing-read prompt opts nil nil nil nil + (symbol-at-point)))))) + (let* ((setter (or (get symbol 'custom-set) #'set-default)) + (getter (or (get symbol 'custom-get) #'symbol-value)) + (value (condition-case nil + (funcall getter symbol) + (void-variable (error "`%s' is not bound" symbol)))) + (type (get symbol 'custom-type))) + (cond + ((eq type 'boolean)) + ((and (null type) + (yes-or-no-p + (format "`%s' doesn't have a type, and has the value %S. \ +Proceed to toggle?" symbol value)))) + ((yes-or-no-p + (format "`%s' is of type %s, and has the value %S. \ +Proceed to toggle?" + symbol type value))) + ((error "Abort toggling of option `%s'" symbol))) + (message "%s user options `%s'." + (if (funcall setter symbol (not value)) + "Enabled" "Disabled") + symbol))) + +;;;###autoload +(defalias 'toggle-option #'customize-toggle-option) + ;;;###autoload (defalias 'customize-variable-other-window 'customize-option-other-window) From 160165e8a97cfa3f3ffd803be373a3b34ed87597 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Tue, 13 Feb 2024 12:27:38 -0800 Subject: [PATCH 158/446] ; Compute the list of symbols for 'eshell-eval-using-options' once * lisp/eshell/esh-opt.el (eshell--get-option-symbols): New function... (eshell-eval-using-options): ... use it. (eshell--do-opts, eshell--process-args): Take OPTION-SYMS. * test/lisp/eshell/esh-opt-tests.el (esh-opt-test/process-args): (esh-opt-test/process-args-parse-leading-options-only): (esh-opt-test/process-args-external): Pass OPTION-SYMS in. --- lisp/eshell/esh-opt.el | 62 +++++++++++++++++-------------- test/lisp/eshell/esh-opt-tests.el | 24 ++++++++---- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/lisp/eshell/esh-opt.el b/lisp/eshell/esh-opt.el index d01e3569d57..e6f5fc9629a 100644 --- a/lisp/eshell/esh-opt.el +++ b/lisp/eshell/esh-opt.el @@ -100,29 +100,37 @@ the new process for its value. Lastly, any remaining arguments will be available in the locally let-bound variable `args'." (declare (debug (form form sexp body))) - `(let* ((temp-args - ,(if (memq ':preserve-args (cadr options)) - (list 'copy-tree macro-args) - (list 'eshell-stringify-list - (list 'flatten-tree macro-args)))) - (processed-args (eshell--do-opts ,name ,options temp-args ,macro-args)) - ,@(delete-dups - (delq nil (mapcar (lambda (opt) - (and (listp opt) (nth 3 opt) - `(,(nth 3 opt) (pop processed-args)))) - ;; `options' is of the form (quote OPTS). - (cadr options)))) - (args processed-args)) - ;; Silence unused lexical variable warning if body does not use `args'. - (ignore args) - ,@body-forms)) + (let ((option-syms (eshell--get-option-symbols + ;; `options' is of the form (quote OPTS). + (cadr options)))) + `(let* ((temp-args + ,(if (memq ':preserve-args (cadr options)) + (list 'copy-tree macro-args) + (list 'eshell-stringify-list + (list 'flatten-tree macro-args)))) + (args (eshell--do-opts ,name temp-args ,macro-args + ,options ',option-syms)) + ;; Bind all the option variables. When done, `args' will + ;; contain any remaining positional arguments. + ,@(mapcar (lambda (sym) `(,sym (pop args))) option-syms)) + ;; Silence unused lexical variable warning if body does not use `args'. + (ignore args) + ,@body-forms))) ;;; Internal Functions: ;; Documented part of the interface; see eshell-eval-using-options. (defvar eshell--args) -(defun eshell--do-opts (name options args orig-args) +(defun eshell--get-option-symbols (options) + "Get a list of symbols for the specified OPTIONS. +OPTIONS is a list of command-line options from +`eshell-eval-using-options' (which see)." + (delete-dups + (delq nil (mapcar (lambda (opt) (and (listp opt) (nth 3 opt))) + options)))) + +(defun eshell--do-opts (name args orig-args options option-syms) "Helper function for `eshell-eval-using-options'. This code doesn't really need to be macro expanded everywhere." (require 'esh-ext) @@ -134,7 +142,8 @@ This code doesn't really need to be macro expanded everywhere." (if (and (= (length args) 0) (memq ':show-usage options)) (eshell-show-usage name options) - (setq args (eshell--process-args name args options)) + (setq args (eshell--process-args name args options + option-syms)) nil)))) (when usage-msg (user-error "%s" usage-msg)))))) @@ -269,16 +278,13 @@ triggered to say that the switch is unrecognized." "%s: unrecognized option --%s") name (car switch))))))) -(defun eshell--process-args (name args options) - "Process the given ARGS using OPTIONS." - (let* ((seen ()) - (opt-vals (delq nil (mapcar (lambda (opt) - (when (listp opt) - (let ((sym (nth 3 opt))) - (when (and sym (not (memq sym seen))) - (push sym seen) - (list sym))))) - options))) +(defun eshell--process-args (name args options option-syms) + "Process the given ARGS for the command NAME using OPTIONS. +OPTION-SYMS is a list of symbols that will hold the processed arguments. + +Return a list of values corresponding to each element in OPTION-SYMS, +followed by any additional positional arguments." + (let* ((opt-vals (mapcar #'list option-syms)) (ai 0) arg (eshell--args args) (pos-argument-found nil)) diff --git a/test/lisp/eshell/esh-opt-tests.el b/test/lisp/eshell/esh-opt-tests.el index 8d6e0c1e426..4e5373e53cd 100644 --- a/test/lisp/eshell/esh-opt-tests.el +++ b/test/lisp/eshell/esh-opt-tests.el @@ -29,13 +29,15 @@ (eshell--process-args "sudo" '("-a") '((?a "all" nil show-all - "do not ignore entries starting with ."))))) + "do not ignore entries starting with .")) + '(show-all)))) (should (equal '("root" "world") (eshell--process-args "sudo" '("-u" "root" "world") '((?u "user" t user - "execute a command as another USER")))))) + "execute a command as another USER")) + '(user))))) (ert-deftest esh-opt-test/process-args-parse-leading-options-only () "Test behavior of :parse-leading-options-only in `eshell--process-args'." @@ -45,20 +47,23 @@ "sudo" '("emerge" "-uDN" "world") '((?u "user" t user "execute a command as another USER") - :parse-leading-options-only)))) + :parse-leading-options-only) + '(user)))) (should (equal '("root" "emerge" "-uDN" "world") (eshell--process-args "sudo" '("-u" "root" "emerge" "-uDN" "world") '((?u "user" t user "execute a command as another USER") - :parse-leading-options-only)))) + :parse-leading-options-only) + '(user)))) (should (equal '("DN" "emerge" "world") (eshell--process-args "sudo" '("-u" "root" "emerge" "-uDN" "world") '((?u "user" t user - "execute a command as another USER")))))) + "execute a command as another USER")) + '(user))))) (ert-deftest esh-opt-test/process-args-external () "Test behavior of :external in `eshell--process-args'." @@ -69,7 +74,8 @@ "ls" '("/some/path") '((?a "all" nil show-all "do not ignore entries starting with .") - :external "ls"))))) + :external "ls") + '(show-all))))) (cl-letf (((symbol-function 'eshell-search-path) #'identity)) (should (equal '(no-catch eshell-ext-command "ls") @@ -78,7 +84,8 @@ "ls" '("-u" "/some/path") '((?a "all" nil show-all "do not ignore entries starting with .") - :external "ls")) + :external "ls") + '(show-all)) :type 'no-catch)))) (cl-letf (((symbol-function 'eshell-search-path) #'ignore)) (should-error @@ -86,7 +93,8 @@ "ls" '("-u" "/some/path") '((?a "all" nil show-all "do not ignore entries starting with .") - :external "ls")) + :external "ls") + '(show-all)) :type 'error))) (ert-deftest esh-opt-test/eval-using-options-short () From 7c23234b4ea43a033e06eb466008e0dc8485920b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 10 Feb 2024 10:05:11 -0800 Subject: [PATCH 159/446] Respect :lisp-dir whilst scanning for VC package dependencies * lisp/emacs-lisp/package-vc.el (package-vc--unpack-1): Scan 'lisp-dir', if set, for lisp files instead of scanning the root package directory. (Bug#69019) --- lisp/emacs-lisp/package-vc.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el index fc402716dab..37980c28b02 100644 --- a/lisp/emacs-lisp/package-vc.el +++ b/lisp/emacs-lisp/package-vc.el @@ -501,8 +501,10 @@ This includes downloading missing dependencies, generating autoloads, generating a package description file (used to identify a package as a VC package later on), building documentation and marking the package as installed." - (let ((pkg-spec (package-vc--desc->spec pkg-desc)) - missing) + (let* ((pkg-spec (package-vc--desc->spec pkg-desc)) + (lisp-dir (plist-get pkg-spec :lisp-dir)) + (lisp-path (file-name-concat pkg-dir lisp-dir)) + missing) ;; In case the package was installed directly from source, the ;; dependency list wasn't know beforehand, and they might have @@ -519,7 +521,7 @@ documentation and marking the package as installed." "\\|") regexp-unmatchable)) (deps '())) - (dolist (file (directory-files pkg-dir t "\\.el\\'" t)) + (dolist (file (directory-files lisp-path t "\\.el\\'" t)) (unless (string-match-p ignored-files file) (with-temp-buffer (insert-file-contents file) @@ -542,10 +544,8 @@ documentation and marking the package as installed." (pkg-file (expand-file-name (package--description-file pkg-dir) pkg-dir))) ;; Generate autoloads (let* ((name (package-desc-name pkg-desc)) - (auto-name (format "%s-autoloads.el" name)) - (lisp-dir (plist-get pkg-spec :lisp-dir))) - (package-generate-autoloads - name (file-name-concat pkg-dir lisp-dir)) + (auto-name (format "%s-autoloads.el" name))) + (package-generate-autoloads name lisp-path) (when lisp-dir (write-region (with-temp-buffer From 70d6f6c41c9b1985e0ec70b45aeeac6982a050bb Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 13 Feb 2024 20:35:05 -0500 Subject: [PATCH 160/446] hideif.el: Minor cleanup * lisp/progmodes/hideif.el: Prefer #' to quote function names. (hif-eval): Use `lexical-binding`. (hif-ifx-regexp): Don't use `defconst` since `bovine/c.el` let-binds it. (hif--intern-safe): Rename from `intern-safe` to fix this namespace violation. (hif-strtok): Adjust accordingly. --- lisp/progmodes/hideif.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el index 71f55379d96..98e567299a1 100644 --- a/lisp/progmodes/hideif.el +++ b/lisp/progmodes/hideif.el @@ -390,7 +390,7 @@ If there is a marked region from START to END it only shows the symbols within." (defun hif-after-revert-function () (and hide-ifdef-mode hide-ifdef-hiding (hide-ifdefs nil nil t))) -(add-hook 'after-revert-hook 'hif-after-revert-function) +(add-hook 'after-revert-hook #'hif-after-revert-function) (defun hif-end-of-line () "Find the end-point of line concatenation." @@ -474,7 +474,7 @@ Everything including these lines is made invisible." (defun hif-eval (form) "Evaluate hideif internal representation." - (let ((val (eval form))) + (let ((val (eval form t))) (if (stringp val) (or (get-text-property 0 'hif-value val) val) @@ -542,7 +542,7 @@ that form should be displayed.") (defconst hif-cpp-prefix "\\(^\\|\r\\)?[ \t]*#[ \t]*") (defconst hif-ifxdef-regexp (concat hif-cpp-prefix "if\\(n\\)?def")) (defconst hif-ifndef-regexp (concat hif-cpp-prefix "ifndef")) -(defconst hif-ifx-regexp (concat hif-cpp-prefix "if\\((\\|\\(n?def\\)?[ \t]+\\)")) +(defvar hif-ifx-regexp (concat hif-cpp-prefix "if\\((\\|\\(n?def\\)?[ \t]+\\)")) (defconst hif-elif-regexp (concat hif-cpp-prefix "elif")) (defconst hif-else-regexp (concat hif-cpp-prefix "else")) (defconst hif-endif-regexp (concat hif-cpp-prefix "endif")) @@ -679,7 +679,7 @@ that form should be displayed.") ("..." . hif-etc) ("defined" . hif-defined))) -(defconst hif-valid-token-list (mapcar 'cdr hif-token-alist)) +(defconst hif-valid-token-list (mapcar #'cdr hif-token-alist)) (defconst hif-token-regexp ;; The ordering of regexp grouping is crucial to `hif-strtok' @@ -690,7 +690,7 @@ that form should be displayed.") ;; decimal/octal: "\\|\\(\\([+-]?[0-9']+\\(\\.[0-9']*\\)?\\)\\([eE][+-]?[0-9]+\\)?" hif-numtype-suffix-regexp "?\\)" - "\\|" (regexp-opt (mapcar 'car hif-token-alist) t) + "\\|" (regexp-opt (mapcar #'car hif-token-alist) t) "\\|\\(\\w+\\)")) ;; C++11 Unicode string literals (L"" u8"" u"" U"" R"" LR"" u8R"" uR"") @@ -867,7 +867,7 @@ Assuming we've just performed a `hif-token-regexp' lookup." (t (setq hif-simple-token-only nil) - (intern-safe string))))) + (hif--intern-safe string))))) (defun hif-backward-comment (&optional start end) "If we're currently within a C(++) comment, skip them backwards." @@ -1448,7 +1448,7 @@ This macro cannot be evaluated alone without parameters input." (t (error "Invalid token to stringify")))) -(defun intern-safe (str) +(defun hif--intern-safe (str) (if (stringp str) (intern str))) From b54db9c9ac7599fc84f108eb6f469e2af4834bed Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 14 Feb 2024 05:24:36 +0200 Subject: [PATCH 161/446] ; * lisp/progmodes/elisp-mode.el (emacs-lisp-native-compile): Fix typo. --- lisp/progmodes/elisp-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index 4e0e7552f8e..e0c18214ef7 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -233,7 +233,7 @@ visited by the current buffer." (byte-to-native-output-buffer-file nil) (eln (native-compile buffer-file-name))) (when eln - (comp-write--bytecode-file eln)))) + (comp--write-bytecode-file eln)))) (defun emacs-lisp-native-compile-and-load () "Native-compile the current buffer's file (if it has changed), then load it. From fa74c7f88a8f3216665ea386c5b6355e3660fb79 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 14 Feb 2024 09:20:48 +0200 Subject: [PATCH 162/446] Detect DEFUNs as outline-minor-mode headings in Emacs sources in c-ts-mode. * lisp/progmodes/c-ts-mode.el (c-ts-mode--outline-predicate): When c-ts-mode-emacs-sources-support is t, use c-ts-mode--emacs-defun-p (bug#68824). --- lisp/progmodes/c-ts-mode.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index c4b48f03d12..4ef17daf876 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -926,12 +926,12 @@ Return nil if NODE is not a defun node or doesn't have a name." (defun c-ts-mode--outline-predicate (node) "Match outlines on lines with function names." - (and (treesit-node-match-p - node "\\`function_declarator\\'" t) - (when-let ((parent (treesit-node-parent node))) - (treesit-node-match-p - parent - "\\`function_definition\\'" t)))) + (or (and (equal (treesit-node-type node) "function_declarator") + (equal (treesit-node-type (treesit-node-parent node)) + "function_definition")) + ;; DEFUNs in Emacs sources. + (and c-ts-mode-emacs-sources-support + (c-ts-mode--emacs-defun-p node)))) ;;; Defun navigation From decfdd4f1a1e3b1539eafdaaf11191e8477f0636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerd=20M=C3=B6llmann?= Date: Wed, 14 Feb 2024 08:54:04 +0100 Subject: [PATCH 163/446] Take file-local variables into account in elint-file (bug#69076) * lisp/emacs-lisp/elint.el (elint-file): Use hack-local-variables. --- lisp/emacs-lisp/elint.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/elint.el b/lisp/emacs-lisp/elint.el index a8bc4bdd1e0..27c169cc657 100644 --- a/lisp/emacs-lisp/elint.el +++ b/lisp/emacs-lisp/elint.el @@ -266,6 +266,7 @@ This environment can be passed to `macroexpand'." (insert-file-contents file) (let ((buffer-file-name file) (max-lisp-eval-depth (max 1000 max-lisp-eval-depth))) + (hack-local-variables) (with-syntax-table emacs-lisp-mode-syntax-table (mapc 'elint-top-form (elint-update-env))))) (elint-set-mode-line) From 3a93e301ddc913758abe05c876aa3016e8b23af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 13 Feb 2024 14:52:39 +0100 Subject: [PATCH 164/446] String hashing improvements (spread and performance) Fix gaps in hashing coverage in the middle and end of even fairly short strings. E.g., `outline-1`, `outline-2` etc all hashed to the exact same value but with the patch, there are no collisions among the ~160000 symbols in the Emacs tree. This change also improves average hashing speed by using fewer mixing operations. * src/fns.c (hash_string): Use unit stride for fairly short strings, while retaining the cap of 8 samples for long ones. Always hash the last word to ensure that the end of the string is covered. For strings shorter than a word, use fewer loads and a single reduction step. --- src/fns.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/fns.c b/src/fns.c index 918ba0370e8..f94e8519957 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5069,24 +5069,49 @@ hash_string (char const *ptr, ptrdiff_t len) EMACS_UINT hash = len; /* At most 8 steps. We could reuse SXHASH_MAX_LEN, of course, * but dividing by 8 is cheaper. */ - ptrdiff_t step = sizeof hash + ((end - p) >> 3); + ptrdiff_t step = max (sizeof hash, ((end - p) >> 3)); - while (p + sizeof hash <= end) + if (p + sizeof hash <= end) { + do + { + EMACS_UINT c; + /* We presume that the compiler will replace this `memcpy` with + a single load/move instruction when applicable. */ + memcpy (&c, p, sizeof hash); + p += step; + hash = sxhash_combine (hash, c); + } + while (p + sizeof hash <= end); + /* Hash the last wordful of bytes in the string, because that is + is often the part where strings differ. This may cause some + bytes to be hashed twice but we assume that's not a big problem. */ EMACS_UINT c; - /* We presume that the compiler will replace this `memcpy` with - a single load/move instruction when applicable. */ - memcpy (&c, p, sizeof hash); - p += step; + memcpy (&c, end - sizeof c, sizeof c); hash = sxhash_combine (hash, c); } - /* A few last bytes may remain (smaller than an EMACS_UINT). */ - /* FIXME: We could do this without a loop, but it'd require - endian-dependent code :-( */ - while (p < end) + else { - unsigned char c = *p++; - hash = sxhash_combine (hash, c); + /* String is shorter than an EMACS_UINT. Use smaller loads. */ + eassume (p <= end && end - p < sizeof (EMACS_UINT)); + EMACS_UINT tail = 0; + if (end - p >= 4) + { + uint32_t c; + memcpy (&c, p, sizeof c); + tail = (tail << (8 * sizeof c)) + c; + p += sizeof c; + } + if (end - p >= 2) + { + uint16_t c; + memcpy (&c, p, sizeof c); + tail = (tail << (8 * sizeof c)) + c; + p += sizeof c; + } + if (p < end) + tail = (tail << 8) + (unsigned char)*p; + hash = sxhash_combine (hash, tail); } return hash; From 0c7c8210cb6a87a06b61451d19f3601975569946 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 14 Feb 2024 17:27:43 +0100 Subject: [PATCH 165/446] Minor Tramp doc adaption * doc/misc/tramp.texi (Frequently Asked Questions): Be more precise with FIDO2 keys. * lisp/net/tramp.el: Adapt comments. --- doc/misc/tramp.texi | 4 ++-- lisp/net/tramp.el | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index db9cefbf966..0bed7dbe215 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -5075,8 +5075,8 @@ the additional handshaking messages for them. This requires at least nitrokey, or titankey. @c @uref{https://docs.fedoraproject.org/en-US/quick-docs/using-yubikeys/} -@strong{Note} that there are reports on problems of handling yubikey -residential keys by @command{ssh-agent}. As workaround, you might +@strong{Note} that there are reports on problems of handling FIDO2 +(residential) keys by @command{ssh-agent}. As workaround, you might disable @command{ssh-agent} for such keys. @item diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index f3da56e7a4f..9d883c96252 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -763,9 +763,8 @@ The regexp should match at end of buffer." ;; A security key requires the user physically to touch the device ;; with their finger. We must tell it to the user. -;; Added in OpenSSH 8.2. I've tested it with yubikey. Nitrokey and -;; Titankey, which have also passed the tests, do not show such a -;; message. +;; Added in OpenSSH 8.2. I've tested it with Nitrokey, Titankey, and +;; Yubikey. (defcustom tramp-security-key-confirm-regexp (rx bol (* "\r") "Confirm user presence for key " (* nonl) (* (any "\r\n"))) "Regular expression matching security key confirmation message. @@ -788,6 +787,7 @@ The regexp should match at end of buffer." :version "28.1" :type 'regexp) +;; Needed only for FIDO2 (residential) keys. Tested with Nitrokey and Yubikey. (defcustom tramp-security-key-pin-regexp (rx bol (* "\r") (group "Enter PIN for " (* nonl)) (* (any "\r\n"))) "Regular expression matching security key PIN prompt. From 61a145076275a9da79d0372d50def4aaf5117587 Mon Sep 17 00:00:00 2001 From: Joseph Turner Date: Tue, 30 Jan 2024 00:52:39 -0800 Subject: [PATCH 166/446] Improve directory prompt used by package-vc-checkout * lisp/emacs-lisp/package-vc.el (package-vc--read-package-name): Use read-directory-name instead of read-file-name. (Bug#66114) --- lisp/emacs-lisp/package-vc.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el index e89ead89d4b..5c5486de290 100644 --- a/lisp/emacs-lisp/package-vc.el +++ b/lisp/emacs-lisp/package-vc.el @@ -825,8 +825,8 @@ for the last released version of the package." (interactive (let* ((name (package-vc--read-package-name "Fetch package source: "))) (list (cadr (assoc name package-archive-contents #'string=)) - (read-file-name "Clone into new or empty directory: " nil nil t nil - (lambda (dir) (or (not (file-exists-p dir)) + (read-directory-name "Clone into new or empty directory: " nil nil + (lambda (dir) (or (not (file-exists-p dir)) (directory-empty-p dir)))) (and current-prefix-arg :last-release)))) (setf directory (expand-file-name directory)) From fbef8ff2a4106ff7f0f3d026071fb8096280cc61 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 14 Feb 2024 17:18:50 -0500 Subject: [PATCH 167/446] titdic-cnv.el: Bring all definitions under the `tit-` namespace Add a `tit-` or `tit--` prefix where necessary. Adjust all callers. I kept the old names via obsolete aliases for now, although it's probably not worth the trouble. * lisp/international/titdic-cnv.el: Bring all definitions under the `tit-` namespace. (tit-quail-cxterm-package-ext-info): Rename var from `quail-cxterm-package-ext-info`. Adjust value to new names. (tit-dic-convert): Rename from `titdic-convert`. (batch-tit-dic-convert): Rename from `batch-titdic-convert`. (tit-quail-misc-package-ext-info): Rename var from `quail-misc-package-ext-info`. Adjust value to new names. (tit--tsang-quick-converter): Rename from `tsang-quick-converter`. (tit--tsang-b5-converter): Rename from `tsang-b5-converter`. (tit--quick-b5-converter): Rename from `quick-b5-converter`. (tit--tsang-cns-converter): Rename from `tsang-cns-converter`. (tit--quick-cns-converter): Rename from `quick-cns-converter`. (tit--py-converter): Rename from `py-converter`. (tit--ziranma-converter): Rename from `ziranma-converter`. (tit--ctlau-converter): Rename from `ctlau-converter`. (tit--ctlau-gb-converter): Rename from `ctlau-gb-converter`. (tit--ctlau-b5-converter): Rename from `ctlau-b5-converter`. (tit-miscdic-convert): Rename from `miscdic-convert`. (batch-tit-miscdic-convert): Rename from `batch-miscdic-convert`. (tit-pinyin-convert): Rename from `pinyin-convert`. * leim/Makefile.in (${leimdir}/quail/%.el, misc_convert) (${srcdir}/../lisp/language/pinyin.el): Use the new names. --- etc/NEWS | 5 ++ leim/Makefile.in | 6 +- lisp/international/titdic-cnv.el | 119 ++++++++++++++++++------------- 3 files changed, 79 insertions(+), 51 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index e6b1d424499..dc24d775bb1 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -430,6 +430,11 @@ respectively, in addition to the existing translations 'C-x 8 / e' and * Changes in Specialized Modes and Packages in Emacs 30.1 +--- +** Titdic-cnv +Most of the variables and functions in the file have been renamed to +make sure they all use a 'tit-' namespace prefix. + --- ** Trace In batch mode, tracing now sends the trace to stdout. diff --git a/leim/Makefile.in b/leim/Makefile.in index f7a23178919..bc1eeb5e634 100644 --- a/leim/Makefile.in +++ b/leim/Makefile.in @@ -101,11 +101,11 @@ ${leimdir}/quail ${leimdir}/ja-dic: ## All of TIT_GB and TIT_BIG5. ${leimdir}/quail/%.el: ${srcdir}/CXTERM-DIC/%.tit $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv \ - -f batch-titdic-convert -dir ${leimdir}/quail $< + -f batch-tit-dic-convert -dir ${leimdir}/quail $< misc_convert = $(AM_V_GEN)${RUN_EMACS} \ - -l titdic-cnv -f batch-miscdic-convert -dir ${leimdir}/quail + -l titdic-cnv -f batch-tit-miscdic-convert -dir ${leimdir}/quail ## CTLau.el, CTLau-b5.el. ${leimdir}/quail/CT%.el: ${srcdir}/MISC-DIC/CT%.html @@ -148,7 +148,7 @@ ${leimdir}/ja-dic/ja-dic.el: $(srcdir)/SKK-DIC/SKK-JISYO.L small-ja-dic-option -f batch-skkdic-convert -dir "$(leimdir)/ja-dic" $(JA_DIC_NO_REDUCTION_OPTION) "$<" ${srcdir}/../lisp/language/pinyin.el: ${srcdir}/MISC-DIC/pinyin.map - $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f pinyin-convert $< $@ + $(AM_V_GEN)${RUN_EMACS} -l titdic-cnv -f tit-pinyin-convert $< $@ .PHONY: bootstrap-clean distclean maintainer-clean gen-clean diff --git a/lisp/international/titdic-cnv.el b/lisp/international/titdic-cnv.el index c4706e061e3..42584f6548c 100644 --- a/lisp/international/titdic-cnv.el +++ b/lisp/international/titdic-cnv.el @@ -31,12 +31,12 @@ ;; Convert cxterm dictionary (of TIT format) to quail-package. ;; ;; Usage (within Emacs): -;; M-x titdic-convertCXTERM-DICTIONARY-NAME +;; M-x tit-dic-convertCXTERM-DICTIONARY-NAME ;; Usage (from shell): -;; % emacs -batch -l titdic-cnv -f batch-titdic-convert\ +;; % emacs -batch -l titdic-cnv -f batch-tit-dic-convert\ ;; [-dir DIR] [DIR | FILE] ... ;; -;; When you run titdic-convert within Emacs, you have a chance to +;; When you run `tit-dic-convert' within Emacs, you have a chance to ;; modify arguments of `quail-define-package' before saving the ;; converted file. For instance, you are likely to modify TITLE, ;; DOCSTRING, and KEY-BINDINGS. @@ -90,7 +90,8 @@ ;; \ is replaced by a description about ;; how to select a translation from a list of candidates. -(defvar quail-cxterm-package-ext-info +(define-obsolete-variable-alias 'quail-cxterm-package-ext-info 'tit-quail-cxterm-package-ext-info "30.1") +(defvar tit-quail-cxterm-package-ext-info '(("chinese-4corner" "四角") ("chinese-array30" "30") ("chinese-ccdospy" "缩拼" @@ -277,7 +278,7 @@ SPC, 6, 3, 4, or 7 specifying a tone (SPC:陰平, 6:陽平, 3:上聲, 4:åŽ»č², (tit-moveleft ",<") (tit-keyprompt nil)) - (generate-lisp-file-heading filename 'titdic-convert :code nil) + (generate-lisp-file-heading filename 'tit-dic-convert :code nil) (princ ";; Quail package `") (princ package) (princ "\n") @@ -354,7 +355,7 @@ SPC, 6, 3, 4, or 7 specifying a tone (SPC:陰平, 6:陽平, 3:上聲, 4:åŽ»č², (princ "(quail-define-package ") ;; Args NAME, LANGUAGE, TITLE - (let ((title (nth 1 (assoc package quail-cxterm-package-ext-info)))) + (let ((title (nth 1 (assoc package tit-quail-cxterm-package-ext-info)))) (princ "\"") (princ package) (princ "\" \"") @@ -383,7 +384,7 @@ SPC, 6, 3, 4, or 7 specifying a tone (SPC:陰平, 6:陽平, 3:上聲, 4:åŽ»č², (let ((doc (concat tit-prompt "\n")) (comments (if tit-comments (mapconcat #'identity (nreverse tit-comments) "\n"))) - (doc-ext (nth 2 (assoc package quail-cxterm-package-ext-info)))) + (doc-ext (nth 2 (assoc package tit-quail-cxterm-package-ext-info)))) (if comments (setq doc (concat doc "\n" comments "\n"))) (if doc-ext @@ -476,6 +477,9 @@ SPC, 6, 3, 4, or 7 specifying a tone (SPC:陰平, 6:陽平, 3:上聲, 4:åŽ»č², ;;;###autoload (defun titdic-convert (filename &optional dirname) + (declare (obsolete tit-dic-convert "30.1")) + (tit-dic-convert filename dirname)) +(defun tit-dic-convert (filename &optional dirname) "Convert a TIT dictionary of FILENAME into a Quail package. Optional argument DIRNAME if specified is the directory name under which the generated Quail package is saved." @@ -531,21 +535,24 @@ the generated Quail package is saved." ;;;###autoload (defun batch-titdic-convert (&optional force) - "Run `titdic-convert' on the files remaining on the command line. + (declare (obsolete batch-tit-dic-convert "30.1")) + (batch-tit-dic-convert force)) +(defun batch-tit-dic-convert (&optional force) + "Run `tit-dic-convert' on the files remaining on the command line. Use this from the command line, with `-batch'; it won't work in an interactive Emacs. -For example, invoke \"emacs -batch -f batch-titdic-convert XXX.tit\" to +For example, invoke \"emacs -batch -f batch-tit-dic-convert XXX.tit\" to generate Quail package file \"xxx.el\" from TIT dictionary file \"XXX.tit\". -To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." +To get complete usage, invoke \"emacs -batch -f batch-tit-dic-convert -h\"." (defvar command-line-args-left) ; Avoid compiler warning. (if (not noninteractive) - (error "`batch-titdic-convert' should be used only with -batch")) + (error "`batch-tit-dic-convert' should be used only with -batch")) (if (string= (car command-line-args-left) "-h") (progn (message "To convert XXX.tit and YYY.tit into xxx.el and yyy.el:") - (message " %% emacs -batch -l titdic-cnv -f batch-titdic-convert XXX.tit YYY.tit") + (message " %% emacs -batch -l titdic-cnv -f batch-tit-dic-convert XXX.tit YYY.tit") (message "To convert XXX.tit into DIR/xxx.el:") - (message " %% emacs -batch -l titdic-cnv -f batch-titdic-convert -dir DIR XXX.tit")) + (message " %% emacs -batch -l titdic-cnv -f batch-tit-dic-convert -dir DIR XXX.tit")) (let (targetdir filename files file) (if (string= (car command-line-args-left) "-dir") (progn @@ -564,7 +571,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." (when (or force (file-newer-than-file-p file (tit-make-quail-package-file-name file targetdir))) - (titdic-convert file targetdir)) + (tit-dic-convert file targetdir)) (setq files (cdr files))) (setq command-line-args-left (cdr command-line-args-left))))) (kill-emacs 0)) @@ -583,10 +590,11 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ;; COPYRIGHT-NOTICE ;; Copyright notice of the source dictionary. ;; ) -(defvar quail-misc-package-ext-info +(define-obsolete-variable-alias 'quail-misc-package-ext-info 'tit-quail-misc-package-ext-info "30.1") +(defvar tit-quail-misc-package-ext-info '(("chinese-b5-tsangchi" "倉B" "cangjie-table.b5" big5 "tsang-b5.el" - tsang-b5-converter + tit--tsang-b5-converter "\ ;; # Copyright 2001 Christian Wittern ;; # @@ -596,7 +604,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-b5-quick" "ē°”B" "cangjie-table.b5" big5 "quick-b5.el" - quick-b5-converter + tit--quick-b5-converter "\ ;; # Copyright 2001 Christian Wittern ;; # @@ -606,7 +614,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-cns-tsangchi" "倉C" "cangjie-table.cns" iso-2022-cn-ext "tsang-cns.el" - tsang-cns-converter + tit--tsang-cns-converter "\ ;; # Copyright 2001 Christian Wittern ;; # @@ -616,7 +624,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-cns-quick" "ē°”C" "cangjie-table.cns" iso-2022-cn-ext "quick-cns.el" - quick-cns-converter + tit--quick-cns-converter "\ ;; # Copyright 2001 Christian Wittern ;; # @@ -626,7 +634,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-py" "拼G" "pinyin.map" cn-gb-2312 "PY.el" - py-converter + tit--py-converter "\ ;; \"pinyin.map\" is included in a free package called CCE. It is ;; available at: [link needs updating -- SK 2021-09-27] @@ -654,7 +662,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-ziranma" "自然" "ziranma.cin" cn-gb-2312 "ZIRANMA.el" - ziranma-converter + tit--ziranma-converter "\ ;; \"ziranma.cin\" is included in a free package called CCE. It is ;; available at: [link needs updating -- SK 2021-09-27] @@ -682,7 +690,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-ctlau" "刘粤" "CTLau.html" cn-gb-2312 "CTLau.el" - ctlau-gb-converter + tit--ctlau-gb-converter "\ ;; \"CTLau.html\" is available at: ;; @@ -707,7 +715,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ("chinese-ctlaub" "åŠ‰ē²µ" "CTLau-b5.html" big5 "CTLau-b5.el" - ctlau-b5-converter + tit--ctlau-b5-converter "\ ;; \"CTLau-b5.html\" is available at: ;; @@ -740,7 +748,8 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." ;; input method is for inputting Big5 characters. Otherwise the input ;; method is for inputting CNS characters. -(defun tsang-quick-converter (dicbuf tsang-p big5-p) +(define-obsolete-function-alias 'tsang-quick-converter #'tit--tsang-quick-converter "30.1") +(defun tit--tsang-quick-converter (dicbuf tsang-p big5-p) (let ((fulltitle (if tsang-p "倉頔" "ē°”ę˜“")) dic) (goto-char (point-max)) @@ -822,23 +831,28 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\"." (if big5-p (nth 1 elt) (nth 2 elt)))))) (insert ")\n"))) -(defun tsang-b5-converter (dicbuf) - (tsang-quick-converter dicbuf t t)) +(define-obsolete-function-alias 'tsang-b5-converter #'tit--tsang-b5-converter "30.1") +(defun tit--tsang-b5-converter (dicbuf) + (tit--tsang-quick-converter dicbuf t t)) -(defun quick-b5-converter (dicbuf) - (tsang-quick-converter dicbuf nil t)) +(define-obsolete-function-alias 'quick-b5-converter #'tit--quick-b5-converter "30.1") +(defun tit--quick-b5-converter (dicbuf) + (tit--tsang-quick-converter dicbuf nil t)) -(defun tsang-cns-converter (dicbuf) - (tsang-quick-converter dicbuf t nil)) +(define-obsolete-function-alias 'tsang-cns-converter #'tit--tsang-cns-converter "30.1") +(defun tit--tsang-cns-converter (dicbuf) + (tit--tsang-quick-converter dicbuf t nil)) -(defun quick-cns-converter (dicbuf) - (tsang-quick-converter dicbuf nil nil)) +(define-obsolete-function-alias 'quick-cns-converter #'tit--quick-cns-converter "30.1") +(defun tit--quick-cns-converter (dicbuf) + (tit--tsang-quick-converter dicbuf nil nil)) ;; Generate a code of a Quail package in the current buffer from ;; Pinyin dictionary in the buffer DICBUF. The input method name of ;; the Quail package is NAME, and the title string is TITLE. -(defun py-converter (dicbuf) +(define-obsolete-function-alias 'py-converter #'tit--py-converter "30.1") +(defun tit--py-converter (dicbuf) (goto-char (point-max)) (insert (format "%S\n" "ę±‰å­—č¾“å…„āˆ·ę‹¼éŸ³āˆ· @@ -913,7 +927,8 @@ method `chinese-tonepy' with which you must specify tones by digits ;; Ziranma dictionary in the buffer DICBUF. The input method name of ;; the Quail package is NAME, and the title string is TITLE. -(defun ziranma-converter (dicbuf) +(define-obsolete-function-alias 'ziranma-converter #'tit--ziranma-converter "30.1") +(defun tit--ziranma-converter (dicbuf) (let (dic) (with-current-buffer dicbuf (goto-char (point-min)) @@ -1022,7 +1037,8 @@ To input symbols and punctuation, type `/' followed by one of `a' to ;; method name of the Quail package is NAME, and the title string is ;; TITLE. DESCRIPTION is the string shown by describe-input-method. -(defun ctlau-converter (dicbuf description) +(define-obsolete-function-alias 'ctlau-converter #'tit--ctlau-converter "30.1") +(defun tit--ctlau-converter (dicbuf description) (goto-char (point-max)) (insert (format "%S\n" description)) (insert " '((\"\C-?\" . quail-delete-last-char) @@ -1071,8 +1087,9 @@ To input symbols and punctuation, type `/' followed by one of `a' to (forward-line 1))) (insert ")\n")) -(defun ctlau-gb-converter (dicbuf) - (ctlau-converter dicbuf +(define-obsolete-function-alias 'ctlau-gb-converter #'tit--ctlau-gb-converter "30.1") +(defun tit--ctlau-gb-converter (dicbuf) + (tit--ctlau-converter dicbuf "ę±‰å­—č¾“å…„āˆ·åˆ˜é””ē„„å¼ē²¤éŸ³āˆ· åˆ˜é””ē„„å¼ē²¤čÆ­ę³ØéŸ³ę–¹ę”ˆ @@ -1085,8 +1102,9 @@ To input symbols and punctuation, type `/' followed by one of `a' to Some infrequent GB characters are accessed by typing \\, followed by the Cantonese romanization of the respective radical (éƒØé¦–).")) -(defun ctlau-b5-converter (dicbuf) - (ctlau-converter dicbuf +(define-obsolete-function-alias 'ctlau-b5-converter #'tit--ctlau-b5-converter "30.1") +(defun tit--ctlau-b5-converter (dicbuf) + (tit--ctlau-converter dicbuf "ę¼¢å­—č¼øå…„ļ¼šåŠ‰éŒ«ē„„å¼ē²µéŸ³ļ¼š åŠ‰éŒ«ē„„å¼ē²µčŖžę³ØéŸ³ę–¹ę”ˆ @@ -1101,14 +1119,15 @@ To input symbols and punctuation, type `/' followed by one of `a' to (declare-function dos-8+3-filename "dos-fns.el" (filename)) -(defun miscdic-convert (filename &optional dirname) +(define-obsolete-function-alias 'miscdic-convert #'tit-miscdic-convert "30.1") +(defun tit-miscdic-convert (filename &optional dirname) "Convert a dictionary file FILENAME into a Quail package. Optional argument DIRNAME if specified is the directory name under which the generated Quail package is saved." (interactive "FInput method dictionary file: ") (or (file-readable-p filename) (error "%s does not exist" filename)) - (let ((tail quail-misc-package-ext-info) + (let ((tail tit-quail-misc-package-ext-info) coding-system-for-write slot name title dicfile coding quailfile converter copyright) @@ -1137,7 +1156,7 @@ the generated Quail package is saved." ;; Explicitly set eol format to `unix'. (setq coding-system-for-write 'utf-8-unix) (with-temp-file (expand-file-name quailfile dirname) - (generate-lisp-file-heading quailfile 'miscdic-convert) + (generate-lisp-file-heading quailfile 'tit-miscdic-convert) (insert (format-message ";; Quail package `%s'\n" name)) (insert ";; Source dictionary file: " dicfile "\n") (insert ";; Copyright notice of the source file\n") @@ -1164,15 +1183,17 @@ the generated Quail package is saved." quailfile :inhibit-provide t :compile t :coding nil))) (setq tail (cdr tail))))) -(defun batch-miscdic-convert () - "Run `miscdic-convert' on the files remaining on the command line. +;; Used in `Makefile.in'. +(define-obsolete-function-alias 'batch-miscdic-convert #'batch-tit-miscdic-convert "30.1") +(defun batch-tit-miscdic-convert () + "Run `tit-miscdic-convert' on the files remaining on the command line. Use this from the command line, with `-batch'; it won't work in an interactive Emacs. If there's an argument \"-dir\", the next argument specifies a directory to store generated Quail packages." (defvar command-line-args-left) ; Avoid compiler warning. (if (not noninteractive) - (error "`batch-miscdic-convert' should be used only with -batch")) + (error "`batch-tit-miscdic-convert' should be used only with -batch")) (let ((dir default-directory) filename) (while command-line-args-left @@ -1186,11 +1207,13 @@ to store generated Quail packages." (if (file-directory-p filename) (dolist (file (directory-files filename t nil t)) (or (file-directory-p file) - (miscdic-convert file dir))) - (miscdic-convert filename dir)))) + (tit-miscdic-convert file dir))) + (tit-miscdic-convert filename dir)))) (kill-emacs 0)) -(defun pinyin-convert () +;; Used in `Makefile.in'. +(define-obsolete-function-alias 'pinyin-convert #'tit-pinyin-convert "30.1") +(defun tit-pinyin-convert () "Convert text file pinyin.map into an elisp library. The library is named pinyin.el, and contains the constant `pinyin-character-map'." From 1035669b38b5aa2aa277e7423837c80534332c19 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Thu, 15 Feb 2024 00:39:00 +0100 Subject: [PATCH 168/446] Add cross-reference to ELisp manual Caveats * doc/lispref/intro.texi (Caveats): Add cross-reference to Emacs manual. Talking about "contributing code" makes little sense in a section about reporting mistakes in the ELisp manual, so skip that part. --- doc/lispref/intro.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lispref/intro.texi b/doc/lispref/intro.texi index 2062ae64866..486125acb0d 100644 --- a/doc/lispref/intro.texi +++ b/doc/lispref/intro.texi @@ -89,9 +89,9 @@ you are criticizing. @cindex bugs @cindex suggestions -Please send comments and corrections using @kbd{M-x -report-emacs-bug}. If you wish to contribute new code (or send a -patch to fix a problem), use @kbd{M-x submit-emacs-patch}. +Please send comments and corrections using @kbd{M-x report-emacs-bug}. +For more details, @xref{Bugs,, Reporting Bugs, emacs, The GNU Emacs +Manual}. @node Lisp History @section Lisp History From 7256690a3ca4840e0f682a552d45321a1b710398 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Thu, 15 Feb 2024 00:51:05 +0100 Subject: [PATCH 169/446] * BUGS: Note how to report critical security issues. --- BUGS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BUGS b/BUGS index ee473213c89..f23faa7c756 100644 --- a/BUGS +++ b/BUGS @@ -21,6 +21,10 @@ If necessary, you can read the manual without an info program: cat info/emacs* | more "+/^File: emacs.*, Node: Bugs," +If you think you may have found a critical security issue that needs +to be communicated privately, please contact the GNU Emacs maintainers +directly. See admin/MAINTAINERS for their contact details. + Please first check the file etc/PROBLEMS (e.g. with C-h C-p in Emacs) to make sure it isn't a known issue. From 7c32f3bcd6d390510d9463b3100255cecab41e1c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 14 Feb 2024 21:18:25 -0800 Subject: [PATCH 170/446] Adjust to recent Gnulib nstrftime changes * admin/merge-gnulib (AVOIDED_MODULES): Add localename. * configure.ac (REQUIRE_GNUISH_STRFTIME_AM_PM): Define. --- admin/merge-gnulib | 2 +- configure.ac | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/admin/merge-gnulib b/admin/merge-gnulib index 5246fb14e1e..35966852e27 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib @@ -53,7 +53,7 @@ GNULIB_MODULES=' AVOIDED_MODULES=' access btowc chmod close crypto/af_alg dup fchdir fstat - iswblank iswctype iswdigit iswxdigit langinfo lock + iswblank iswctype iswdigit iswxdigit langinfo localename lock mbrtowc mbsinit memchr mkdir msvc-inval msvc-nothrow nl_langinfo openat-die opendir pthread-h raise save-cwd select setenv sigprocmask stat stdarg diff --git a/configure.ac b/configure.ac index 847fdbd54d2..c162f880e48 100644 --- a/configure.ac +++ b/configure.ac @@ -1566,6 +1566,8 @@ AC_DEFUN([gt_TYPE_WINT_T], AC_DEFUN_ONCE([gl_STDLIB_H], [AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_NEXT_HEADERS([stdlib.h])]) +AC_DEFINE([REQUIRE_GNUISH_STRFTIME_AM_PM], [false], + [Emacs does not need glibc strftime behavior for AM and PM indicators.]) # Initialize gnulib right after choosing the compiler. dnl Amongst other things, this sets AR and ARFLAGS. From 377e4212e9df293ba2021238bae2bdccf5c8b8d3 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 14 Feb 2024 21:18:25 -0800 Subject: [PATCH 171/446] Update from Gnulib by running admin/merge-gnulib * lib/strftime.c: New file, copied from Gnulib. --- doc/misc/texinfo.tex | 37 +- lib/gnulib.mk.in | 5 +- lib/limits.in.h | 2 +- lib/nstrftime.c | 1501 +---------------------------- lib/strftime.c | 2051 ++++++++++++++++++++++++++++++++++++++++ lib/strftime.h | 71 +- lib/time.in.h | 6 +- lib/time_r.c | 5 + lib/warn-on-use.h | 4 + lib/xalloc-oversized.h | 3 +- m4/gnulib-common.m4 | 76 +- m4/gnulib-comp.m4 | 3 +- m4/nanosleep.m4 | 6 +- m4/nstrftime.m4 | 5 +- m4/utimens.m4 | 15 +- m4/utimensat.m4 | 5 +- 16 files changed, 2210 insertions(+), 1585 deletions(-) create mode 100644 lib/strftime.c diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex index e8c382f5967..93d592193a0 100644 --- a/doc/misc/texinfo.tex +++ b/doc/misc/texinfo.tex @@ -3,9 +3,9 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2023-09-19.19} +\def\texinfoversion{2024-02-10.22} % -% Copyright 1985, 1986, 1988, 1990-2023 Free Software Foundation, Inc. +% Copyright 1985, 1986, 1988, 1990-2024 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as @@ -5238,14 +5238,14 @@ % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} -% Use \ in index files by default. texi2dvi didn't support @ as the escape -% character (as it checked for "\entry" in the files, and not "@entry"). When -% the new version of texi2dvi has had a chance to become more prevalent, then -% the escape character can change back to @ again. This should be an easy -% change to make now because both @ and \ are only used as escape characters in -% index files, never standing for themselves. +% Uncomment to use \ in index files by default. Old texi2dvi (before 2019) +% didn't support @ as the escape character (as it checked for "\entry" in +% the files, and not "@entry"). +% In the future we can remove this flag and simplify the code for +% index files and backslashes, once the support is no longer likely to be +% useful. % -\set txiindexescapeisbackslash +% \set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % @@ -6137,8 +6137,7 @@ % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% - \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 - \global\advance\unnumberedno by 1 + \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty @@ -6194,8 +6193,8 @@ % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% - \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 - \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% + \global\advance\unnumberedno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}% } % Subsections. @@ -6218,9 +6217,8 @@ % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% - \global\subsubsecno=0 \global\advance\subsecno by 1 - \sectionheading{#1}{subsec}{Ynothing}% - {\the\unnumberedno.\the\secno.\the\subsecno}% + \global\advance\unnumberedno by 1 + \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}% } % Subsubsections. @@ -6244,9 +6242,8 @@ % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% - \global\advance\subsubsecno by 1 - \sectionheading{#1}{subsubsec}{Ynothing}% - {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% + \global\advance\unnumberedno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}% } % These macros control what the section commands do, according @@ -8205,8 +8202,6 @@ \let\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup - \else - \errmessage{Macro #1 not defined}% \fi } diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index e10aab5fc8d..9970f7810e2 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -47,6 +47,7 @@ # --avoid=iswdigit \ # --avoid=iswxdigit \ # --avoid=langinfo \ +# --avoid=localename \ # --avoid=lock \ # --avoid=mbrtowc \ # --avoid=mbsinit \ @@ -2745,7 +2746,9 @@ ifeq (,$(OMIT_GNULIB_MODULE_nstrftime)) libgnu_a_SOURCES += nstrftime.c -EXTRA_DIST += strftime.h +EXTRA_DIST += strftime.c strftime.h + +EXTRA_libgnu_a_SOURCES += strftime.c endif ## end gnulib module nstrftime diff --git a/lib/limits.in.h b/lib/limits.in.h index 236fc58e525..c65eb4c1cfe 100644 --- a/lib/limits.in.h +++ b/lib/limits.in.h @@ -130,7 +130,7 @@ # define BOOL_WIDTH 1 # define BOOL_MAX 1 # elif ! defined BOOL_MAX -# define BOOL_MAX ((((1U << (BOOL_WIDTH - 1)) - 1) << 1) + 1) +# define BOOL_MAX 1 # endif #endif diff --git a/lib/nstrftime.c b/lib/nstrftime.c index 69e4164dc0c..88490064297 100644 --- a/lib/nstrftime.c +++ b/lib/nstrftime.c @@ -1,5 +1,6 @@ -/* Copyright (C) 1991-2024 Free Software Foundation, Inc. - This file is part of the GNU C Library. +/* Generate time strings. + + Copyright (C) 2024 Free Software Foundation, Inc. This file is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -14,1497 +15,5 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ -#ifdef _LIBC -# define USE_IN_EXTENDED_LOCALE_MODEL 1 -# define HAVE_STRUCT_ERA_ENTRY 1 -# define HAVE_TM_GMTOFF 1 -# define HAVE_STRUCT_TM_TM_ZONE 1 -# define HAVE_TZNAME 1 -# include "../locale/localeinfo.h" -#else -# include -# if FPRINTFTIME -# include "fprintftime.h" -# else -# include "strftime.h" -# endif -# include "time-internal.h" -#endif - -#include -#include -#include - -#if HAVE_TZNAME && !HAVE_DECL_TZNAME -extern char *tzname[]; -#endif - -/* Do multibyte processing if multibyte encodings are supported, unless - multibyte sequences are safe in formats. Multibyte sequences are - safe if they cannot contain byte sequences that look like format - conversion specifications. The multibyte encodings used by the - C library on the various platforms (UTF-8, GB2312, GBK, CP936, - GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949, - SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%' - cannot occur in a multibyte character except in the first byte. - - The DEC-HANYU encoding used on OSF/1 is not safe for formats, but - this encoding has never been seen in real-life use, so we ignore - it. */ -#if !(defined __osf__ && 0) -# define MULTIBYTE_IS_FORMAT_SAFE 1 -#endif -#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE) - -#if DO_MULTIBYTE -# include - static const mbstate_t mbstate_zero; -#endif - -#include -#include -#include -#include -#include - -#include "attribute.h" -#include - -#ifdef COMPILE_WIDE -# include -# define CHAR_T wchar_t -# define UCHAR_T unsigned int -# define L_(Str) L##Str -# define NLW(Sym) _NL_W##Sym - -# define MEMCPY(d, s, n) __wmemcpy (d, s, n) -# define STRLEN(s) __wcslen (s) - -#else -# define CHAR_T char -# define UCHAR_T unsigned char -# define L_(Str) Str -# define NLW(Sym) Sym -# define ABALTMON_1 _NL_ABALTMON_1 - -# define MEMCPY(d, s, n) memcpy (d, s, n) -# define STRLEN(s) strlen (s) - -#endif - -/* Shift A right by B bits portably, by dividing A by 2**B and - truncating towards minus infinity. A and B should be free of side - effects, and B should be in the range 0 <= B <= INT_BITS - 2, where - INT_BITS is the number of useful bits in an int. GNU code can - assume that INT_BITS is at least 32. - - ISO C99 says that A >> B is implementation-defined if A < 0. Some - implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift - right in the usual way when A < 0, so SHR falls back on division if - ordinary A >> B doesn't seem to be the usual signed shift. */ -#define SHR(a, b) \ - (-1 >> 1 == -1 \ - ? (a) >> (b) \ - : ((a) + ((a) < 0)) / (1 << (b)) - ((a) < 0)) - -#define TM_YEAR_BASE 1900 - -#ifndef __isleap -/* Nonzero if YEAR is a leap year (every 4 years, - except every 100th isn't, and every 400th is). */ -# define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) -#endif - - -#ifdef _LIBC -# define mktime_z(tz, tm) mktime (tm) -# define tzname __tzname -# define tzset __tzset -#endif - -#ifndef FPRINTFTIME -# define FPRINTFTIME 0 -#endif - -#if FPRINTFTIME -# define STREAM_OR_CHAR_T FILE -# define STRFTIME_ARG(x) /* empty */ -#else -# define STREAM_OR_CHAR_T CHAR_T -# define STRFTIME_ARG(x) x, -#endif - -#if FPRINTFTIME -# define memset_byte(P, Len, Byte) \ - do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0) -# define memset_space(P, Len) memset_byte (P, Len, ' ') -# define memset_zero(P, Len) memset_byte (P, Len, '0') -#elif defined COMPILE_WIDE -# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len)) -# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len)) -#else -# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len)) -# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len)) -#endif - -#if FPRINTFTIME -# define advance(P, N) -#else -# define advance(P, N) ((P) += (N)) -#endif - -#define add(n, f) width_add (width, n, f) -#define width_add(width, n, f) \ - do \ - { \ - size_t _n = (n); \ - size_t _w = pad == L_('-') || width < 0 ? 0 : width; \ - size_t _incr = _n < _w ? _w : _n; \ - if (_incr >= maxsize - i) \ - { \ - errno = ERANGE; \ - return 0; \ - } \ - if (p) \ - { \ - if (_n < _w) \ - { \ - size_t _delta = _w - _n; \ - if (pad == L_('0') || pad == L_('+')) \ - memset_zero (p, _delta); \ - else \ - memset_space (p, _delta); \ - } \ - f; \ - advance (p, _n); \ - } \ - i += _incr; \ - } while (0) - -#define add1(c) width_add1 (width, c) -#if FPRINTFTIME -# define width_add1(width, c) width_add (width, 1, fputc (c, p)) -#else -# define width_add1(width, c) width_add (width, 1, *p = c) -#endif - -#define cpy(n, s) width_cpy (width, n, s) -#if FPRINTFTIME -# define width_cpy(width, n, s) \ - width_add (width, n, \ - do \ - { \ - if (to_lowcase) \ - fwrite_lowcase (p, (s), _n); \ - else if (to_uppcase) \ - fwrite_uppcase (p, (s), _n); \ - else \ - { \ - /* Ignore the value of fwrite. The caller can determine whether \ - an error occurred by inspecting ferror (P). All known fwrite \ - implementations set the stream's error indicator when they \ - fail due to ENOMEM etc., even though C11 and POSIX.1-2008 do \ - not require this. */ \ - fwrite (s, _n, 1, p); \ - } \ - } \ - while (0) \ - ) -#else -# define width_cpy(width, n, s) \ - width_add (width, n, \ - if (to_lowcase) \ - memcpy_lowcase (p, (s), _n LOCALE_ARG); \ - else if (to_uppcase) \ - memcpy_uppcase (p, (s), _n LOCALE_ARG); \ - else \ - MEMCPY ((void *) p, (void const *) (s), _n)) -#endif - -#ifdef COMPILE_WIDE -# ifndef USE_IN_EXTENDED_LOCALE_MODEL -# undef __mbsrtowcs_l -# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st) -# endif -#endif - - -#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL -/* We use this code also for the extended locale handling where the - function gets as an additional argument the locale which has to be - used. To access the values we have to redefine the _NL_CURRENT - macro. */ -# define strftime __strftime_l -# define wcsftime __wcsftime_l -# undef _NL_CURRENT -# define _NL_CURRENT(category, item) \ - (current->values[_NL_ITEM_INDEX (item)].string) -# define LOCALE_PARAM , locale_t loc -# define LOCALE_ARG , loc -# define HELPER_LOCALE_ARG , current -#else -# define LOCALE_PARAM -# define LOCALE_ARG -# ifdef _LIBC -# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) -# else -# define HELPER_LOCALE_ARG -# endif -#endif - -#ifdef COMPILE_WIDE -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define TOUPPER(Ch, L) __towupper_l (Ch, L) -# define TOLOWER(Ch, L) __towlower_l (Ch, L) -# else -# define TOUPPER(Ch, L) towupper (Ch) -# define TOLOWER(Ch, L) towlower (Ch) -# endif -#else -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define TOUPPER(Ch, L) __toupper_l (Ch, L) -# define TOLOWER(Ch, L) __tolower_l (Ch, L) -# else -# define TOUPPER(Ch, L) toupper (Ch) -# define TOLOWER(Ch, L) tolower (Ch) -# endif -#endif -/* We don't use 'isdigit' here since the locale dependent - interpretation is not what we want here. We only need to accept - the arabic digits in the ASCII range. One day there is perhaps a - more reliable way to accept other sets of digits. */ -#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) - -/* Avoid false GCC warning "'memset' specified size 18446744073709551615 exceeds - maximum object size 9223372036854775807", caused by insufficient data flow - analysis and value propagation of the 'width_add' expansion when GCC is not - optimizing. Cf. . */ -#if __GNUC__ >= 7 && !__OPTIMIZE__ -# pragma GCC diagnostic ignored "-Wstringop-overflow" -#endif - -#if FPRINTFTIME -static void -fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len) -{ - while (len-- > 0) - { - fputc (TOLOWER ((UCHAR_T) *src, loc), fp); - ++src; - } -} - -static void -fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len) -{ - while (len-- > 0) - { - fputc (TOUPPER ((UCHAR_T) *src, loc), fp); - ++src; - } -} -#else -static CHAR_T *memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM); - -static CHAR_T * -memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) -{ - while (len-- > 0) - dest[len] = TOLOWER ((UCHAR_T) src[len], loc); - return dest; -} - -static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, - size_t len LOCALE_PARAM); - -static CHAR_T * -memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) -{ - while (len-- > 0) - dest[len] = TOUPPER ((UCHAR_T) src[len], loc); - return dest; -} -#endif - - -#if ! HAVE_TM_GMTOFF -/* Yield the difference between *A and *B, - measured in seconds, ignoring leap seconds. */ -# define tm_diff ftime_tm_diff -static int tm_diff (const struct tm *, const struct tm *); -static int -tm_diff (const struct tm *a, const struct tm *b) -{ - /* Compute intervening leap days correctly even if year is negative. - Take care to avoid int overflow in leap day calculations, - but it's OK to assume that A and B are close to each other. */ - int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); - int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); - int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0); - int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0); - int a400 = SHR (a100, 2); - int b400 = SHR (b100, 2); - int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); - int years = a->tm_year - b->tm_year; - int days = (365 * years + intervening_leap_days - + (a->tm_yday - b->tm_yday)); - return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) - + (a->tm_min - b->tm_min)) - + (a->tm_sec - b->tm_sec)); -} -#endif /* ! HAVE_TM_GMTOFF */ - - - -/* The number of days from the first day of the first ISO week of this - year to the year day YDAY with week day WDAY. ISO weeks start on - Monday; the first ISO week has the year's first Thursday. YDAY may - be as small as YDAY_MINIMUM. */ -#define ISO_WEEK_START_WDAY 1 /* Monday */ -#define ISO_WEEK1_WDAY 4 /* Thursday */ -#define YDAY_MINIMUM (-366) -static int iso_week_days (int, int); -static __inline int -iso_week_days (int yday, int wday) -{ - /* Add enough to the first operand of % to make it nonnegative. */ - int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; - return (yday - - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7 - + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY); -} - - -/* When compiling this file, GNU applications can #define my_strftime - to a symbol (typically nstrftime) to get an extended strftime with - extra arguments TZ and NS. */ - -#if FPRINTFTIME -# undef my_strftime -# define my_strftime fprintftime -#endif - -#ifdef my_strftime -# define extra_args , tz, ns -# define extra_args_spec , timezone_t tz, int ns -#else -# if defined COMPILE_WIDE -# define my_strftime wcsftime -# define nl_get_alt_digit _nl_get_walt_digit -# else -# define my_strftime strftime -# define nl_get_alt_digit _nl_get_alt_digit -# endif -# define extra_args -# define extra_args_spec -/* We don't have this information in general. */ -# define tz 1 -# define ns 0 -#endif - -static size_t __strftime_internal (STREAM_OR_CHAR_T *, STRFTIME_ARG (size_t) - const CHAR_T *, const struct tm *, - bool, int, int, bool * - extra_args_spec LOCALE_PARAM); - -/* Write information from TP into S according to the format - string FORMAT, writing no more that MAXSIZE characters - (including the terminating '\0') and returning number of - characters written. If S is NULL, nothing will be written - anywhere, so to determine how many characters would be - written, use NULL for S and (size_t) -1 for MAXSIZE. */ -size_t -my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) - const CHAR_T *format, - const struct tm *tp extra_args_spec LOCALE_PARAM) -{ - bool tzset_called = false; - return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, false, - 0, -1, &tzset_called extra_args LOCALE_ARG); -} -libc_hidden_def (my_strftime) - -/* Just like my_strftime, above, but with more parameters. - UPCASE indicates that the result should be converted to upper case. - YR_SPEC and WIDTH specify the padding and width for the year. - *TZSET_CALLED indicates whether tzset has been called here. */ -static size_t -__strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) - const CHAR_T *format, - const struct tm *tp, bool upcase, - int yr_spec, int width, bool *tzset_called - extra_args_spec LOCALE_PARAM) -{ -#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL - struct __locale_data *const current = loc->__locales[LC_TIME]; -#endif -#if FPRINTFTIME - size_t maxsize = (size_t) -1; -#endif - - int saved_errno = errno; - int hour12 = tp->tm_hour; -#ifdef _NL_CURRENT - /* We cannot make the following values variables since we must delay - the evaluation of these values until really needed since some - expressions might not be valid in every situation. The 'struct tm' - might be generated by a strptime() call that initialized - only a few elements. Dereference the pointers only if the format - requires this. Then it is ok to fail if the pointers are invalid. */ -# define a_wkday \ - ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) -# define f_wkday \ - ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) -# define a_month \ - ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) -# define f_month \ - ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) -# define a_altmonth \ - ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ABALTMON_1) + tp->tm_mon))) -# define f_altmonth \ - ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ - ? "?" : _NL_CURRENT (LC_TIME, NLW(ALTMON_1) + tp->tm_mon))) -# define ampm \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ - ? NLW(PM_STR) : NLW(AM_STR))) - -# define aw_len STRLEN (a_wkday) -# define am_len STRLEN (a_month) -# define aam_len STRLEN (a_altmonth) -# define ap_len STRLEN (ampm) -#endif -#if HAVE_TZNAME - char **tzname_vec = tzname; -#endif - const char *zone; - size_t i = 0; - STREAM_OR_CHAR_T *p = s; - const CHAR_T *f; -#if DO_MULTIBYTE && !defined COMPILE_WIDE - const char *format_end = NULL; -#endif - - zone = NULL; -#if HAVE_STRUCT_TM_TM_ZONE - /* The POSIX test suite assumes that setting - the environment variable TZ to a new value before calling strftime() - will influence the result (the %Z format) even if the information in - TP is computed with a totally different time zone. - This is bogus: though POSIX allows bad behavior like this, - POSIX does not require it. Do the right thing instead. */ - zone = (const char *) tp->tm_zone; -#endif -#if HAVE_TZNAME - if (!tz) - { - if (! (zone && *zone)) - zone = "GMT"; - } - else - { -# if !HAVE_STRUCT_TM_TM_ZONE - /* Infer the zone name from *TZ instead of from TZNAME. */ - tzname_vec = tz->tzname_copy; -# endif - } - /* The tzset() call might have changed the value. */ - if (!(zone && *zone) && tp->tm_isdst >= 0) - { - /* POSIX.1 requires that local time zone information be used as - though strftime called tzset. */ -# ifndef my_strftime - if (!*tzset_called) - { - tzset (); - *tzset_called = true; - } -# endif - zone = tzname_vec[tp->tm_isdst != 0]; - } -#endif - if (! zone) - zone = ""; - - if (hour12 > 12) - hour12 -= 12; - else - if (hour12 == 0) - hour12 = 12; - - for (f = format; *f != '\0'; width = -1, f++) - { - int pad = 0; /* Padding for number ('_', '-', '+', '0', or 0). */ - int modifier; /* Field modifier ('E', 'O', or 0). */ - int digits = 0; /* Max digits for numeric format. */ - int number_value; /* Numeric value to be printed. */ - unsigned int u_number_value; /* (unsigned int) number_value. */ - bool negative_number; /* The number is negative. */ - bool always_output_a_sign; /* +/- should always be output. */ - int tz_colon_mask; /* Bitmask of where ':' should appear. */ - const CHAR_T *subfmt; - CHAR_T *bufp; - CHAR_T buf[1 - + 2 /* for the two colons in a %::z or %:::z time zone */ - + (sizeof (int) < sizeof (time_t) - ? INT_STRLEN_BOUND (time_t) - : INT_STRLEN_BOUND (int))]; - bool to_lowcase = false; - bool to_uppcase = upcase; - size_t colons; - bool change_case = false; - int format_char; - int subwidth; - -#if DO_MULTIBYTE && !defined COMPILE_WIDE - switch (*f) - { - case L_('%'): - break; - - case L_('\b'): case L_('\t'): case L_('\n'): - case L_('\v'): case L_('\f'): case L_('\r'): - case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'): - case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'): - case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'): - case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'): - case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'): - case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'): - case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'): - case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'): - case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'): - case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'): - case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'): - case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'): - case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'): - case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'): - case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'): - case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'): - case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'): - case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'): - case L_('~'): - /* The C Standard requires these 98 characters (plus '%') to - be in the basic execution character set. None of these - characters can start a multibyte sequence, so they need - not be analyzed further. */ - add1 (*f); - continue; - - default: - /* Copy this multibyte sequence until we reach its end, find - an error, or come back to the initial shift state. */ - { - mbstate_t mbstate = mbstate_zero; - size_t len = 0; - size_t fsize; - - if (! format_end) - format_end = f + strlen (f) + 1; - fsize = format_end - f; - - do - { - size_t bytes = mbrlen (f + len, fsize - len, &mbstate); - - if (bytes == 0) - break; - - if (bytes == (size_t) -2) - { - len += strlen (f + len); - break; - } - - if (bytes == (size_t) -1) - { - len++; - break; - } - - len += bytes; - } - while (! mbsinit (&mbstate)); - - cpy (len, f); - f += len - 1; - continue; - } - } - -#else /* ! DO_MULTIBYTE */ - - /* Either multibyte encodings are not supported, they are - safe for formats, so any non-'%' byte can be copied through, - or this is the wide character version. */ - if (*f != L_('%')) - { - add1 (*f); - continue; - } - -#endif /* ! DO_MULTIBYTE */ - - char const *percent = f; - - /* Check for flags that can modify a format. */ - while (1) - { - switch (*++f) - { - /* This influences the number formats. */ - case L_('_'): - case L_('-'): - case L_('+'): - case L_('0'): - pad = *f; - continue; - - /* This changes textual output. */ - case L_('^'): - to_uppcase = true; - continue; - case L_('#'): - change_case = true; - continue; - - default: - break; - } - break; - } - - if (ISDIGIT (*f)) - { - width = 0; - do - { - if (ckd_mul (&width, width, 10) - || ckd_add (&width, width, *f - L_('0'))) - width = INT_MAX; - ++f; - } - while (ISDIGIT (*f)); - } - - /* Check for modifiers. */ - switch (*f) - { - case L_('E'): - case L_('O'): - modifier = *f++; - break; - - default: - modifier = 0; - break; - } - - /* Now do the specified format. */ - format_char = *f; - switch (format_char) - { -#define DO_NUMBER(d, v) \ - do \ - { \ - digits = d; \ - number_value = v; \ - goto do_number; \ - } \ - while (0) -#define DO_SIGNED_NUMBER(d, negative, v) \ - DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_signed_number) -#define DO_YEARISH(d, negative, v) \ - DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_yearish) -#define DO_MAYBE_SIGNED_NUMBER(d, negative, v, label) \ - do \ - { \ - digits = d; \ - negative_number = negative; \ - u_number_value = v; \ - goto label; \ - } \ - while (0) - - /* The mask is not what you might think. - When the ordinal i'th bit is set, insert a colon - before the i'th digit of the time zone representation. */ -#define DO_TZ_OFFSET(d, mask, v) \ - do \ - { \ - digits = d; \ - tz_colon_mask = mask; \ - u_number_value = v; \ - goto do_tz_offset; \ - } \ - while (0) -#define DO_NUMBER_SPACEPAD(d, v) \ - do \ - { \ - digits = d; \ - number_value = v; \ - goto do_number_spacepad; \ - } \ - while (0) - - case L_('%'): - if (f - 1 != percent) - goto bad_percent; - add1 (*f); - break; - - case L_('a'): - if (modifier != 0) - goto bad_format; - if (change_case) - { - to_uppcase = true; - to_lowcase = false; - } -#ifdef _NL_CURRENT - cpy (aw_len, a_wkday); - break; -#else - goto underlying_strftime; -#endif - - case 'A': - if (modifier != 0) - goto bad_format; - if (change_case) - { - to_uppcase = true; - to_lowcase = false; - } -#ifdef _NL_CURRENT - cpy (STRLEN (f_wkday), f_wkday); - break; -#else - goto underlying_strftime; -#endif - - case L_('b'): - case L_('h'): - if (change_case) - { - to_uppcase = true; - to_lowcase = false; - } - if (modifier == L_('E')) - goto bad_format; -#ifdef _NL_CURRENT - if (modifier == L_('O')) - cpy (aam_len, a_altmonth); - else - cpy (am_len, a_month); - break; -#else - goto underlying_strftime; -#endif - - case L_('B'): - if (modifier == L_('E')) - goto bad_format; - if (change_case) - { - to_uppcase = true; - to_lowcase = false; - } -#ifdef _NL_CURRENT - if (modifier == L_('O')) - cpy (STRLEN (f_altmonth), f_altmonth); - else - cpy (STRLEN (f_month), f_month); - break; -#else - goto underlying_strftime; -#endif - - case L_('c'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == L_('E') - && (*(subfmt = - (const CHAR_T *) _NL_CURRENT (LC_TIME, - NLW(ERA_D_T_FMT))) - != '\0'))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); -#else - goto underlying_strftime; -#endif - - subformat: - subwidth = -1; - subformat_width: - { - size_t len = __strftime_internal (NULL, STRFTIME_ARG ((size_t) -1) - subfmt, tp, to_uppcase, - pad, subwidth, tzset_called - extra_args LOCALE_ARG); - add (len, __strftime_internal (p, - STRFTIME_ARG (maxsize - i) - subfmt, tp, to_uppcase, - pad, subwidth, tzset_called - extra_args LOCALE_ARG)); - } - break; - -#if !(defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY) - underlying_strftime: - { - /* The relevant information is available only via the - underlying strftime implementation, so use that. */ - char ufmt[5]; - char *u = ufmt; - char ubuf[1024]; /* enough for any single format in practice */ - size_t len; - /* Make sure we're calling the actual underlying strftime. - In some cases, config.h contains something like - "#define strftime rpl_strftime". */ -# ifdef strftime -# undef strftime - size_t strftime (); -# endif - - /* The space helps distinguish strftime failure from empty - output. */ - *u++ = ' '; - *u++ = '%'; - if (modifier != 0) - *u++ = modifier; - *u++ = format_char; - *u = '\0'; - len = strftime (ubuf, sizeof ubuf, ufmt, tp); - if (len != 0) - cpy (len - 1, ubuf + 1); - } - break; -#endif - - case L_('C'): - if (modifier == L_('E')) - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -# ifdef COMPILE_WIDE - size_t len = __wcslen (era->era_wname); - cpy (len, era->era_wname); -# else - size_t len = strlen (era->era_name); - cpy (len, era->era_name); -# endif - break; - } -#else - goto underlying_strftime; -#endif - } - - { - bool negative_year = tp->tm_year < - TM_YEAR_BASE; - bool zero_thru_1899 = !negative_year & (tp->tm_year < 0); - int century = ((tp->tm_year - 99 * zero_thru_1899) / 100 - + TM_YEAR_BASE / 100); - DO_YEARISH (2, negative_year, century); - } - - case L_('x'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == L_('E') - && (*(subfmt = - (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) - != L_('\0')))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); - goto subformat; -#else - goto underlying_strftime; -#endif - case L_('D'): - if (modifier != 0) - goto bad_format; - subfmt = L_("%m/%d/%y"); - goto subformat; - - case L_('d'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_mday); - - case L_('e'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, tp->tm_mday); - - /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE) - and then jump to one of these labels. */ - - do_tz_offset: - always_output_a_sign = true; - goto do_number_body; - - do_yearish: - if (pad == 0) - pad = yr_spec; - always_output_a_sign - = (pad == L_('+') - && ((digits == 2 ? 99 : 9999) < u_number_value - || digits < width)); - goto do_maybe_signed_number; - - do_number_spacepad: - if (pad == 0) - pad = L_('_'); - - do_number: - /* Format NUMBER_VALUE according to the MODIFIER flag. */ - negative_number = number_value < 0; - u_number_value = number_value; - - do_signed_number: - always_output_a_sign = false; - - do_maybe_signed_number: - tz_colon_mask = 0; - - do_number_body: - /* Format U_NUMBER_VALUE according to the MODIFIER flag. - NEGATIVE_NUMBER is nonzero if the original number was - negative; in this case it was converted directly to - unsigned int (i.e., modulo (UINT_MAX + 1)) without - negating it. */ - if (modifier == L_('O') && !negative_number) - { -#ifdef _NL_CURRENT - /* Get the locale specific alternate representation of - the number. If none exist NULL is returned. */ - const CHAR_T *cp = nl_get_alt_digit (u_number_value - HELPER_LOCALE_ARG); - - if (cp != NULL) - { - size_t digitlen = STRLEN (cp); - if (digitlen != 0) - { - cpy (digitlen, cp); - break; - } - } -#else - goto underlying_strftime; -#endif - } - - bufp = buf + sizeof (buf) / sizeof (buf[0]); - - if (negative_number) - u_number_value = - u_number_value; - - do - { - if (tz_colon_mask & 1) - *--bufp = ':'; - tz_colon_mask >>= 1; - *--bufp = u_number_value % 10 + L_('0'); - u_number_value /= 10; - } - while (u_number_value != 0 || tz_colon_mask != 0); - - do_number_sign_and_padding: - if (pad == 0) - pad = L_('0'); - if (width < 0) - width = digits; - - { - CHAR_T sign_char = (negative_number ? L_('-') - : always_output_a_sign ? L_('+') - : 0); - int numlen = buf + sizeof buf / sizeof buf[0] - bufp; - int shortage = width - !!sign_char - numlen; - int padding = pad == L_('-') || shortage <= 0 ? 0 : shortage; - - if (sign_char) - { - if (pad == L_('_')) - { - if (p) - memset_space (p, padding); - i += padding; - width -= padding; - } - width_add1 (0, sign_char); - width--; - } - - cpy (numlen, bufp); - } - break; - - case L_('F'): - if (modifier != 0) - goto bad_format; - if (pad == 0 && width < 0) - { - pad = L_('+'); - subwidth = 4; - } - else - { - subwidth = width - 6; - if (subwidth < 0) - subwidth = 0; - } - subfmt = L_("%Y-%m-%d"); - goto subformat_width; - - case L_('H'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_hour); - - case L_('I'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, hour12); - - case L_('k'): /* GNU extension. */ - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, tp->tm_hour); - - case L_('l'): /* GNU extension. */ - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER_SPACEPAD (2, hour12); - - case L_('j'): - if (modifier == L_('E')) - goto bad_format; - - DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U); - - case L_('M'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_min); - - case L_('m'): - if (modifier == L_('E')) - goto bad_format; - - DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U); - -#ifndef _LIBC - case L_('N'): /* GNU extension. */ - if (modifier == L_('E')) - goto bad_format; - { - int n = ns, ns_digits = 9; - if (width <= 0) - width = ns_digits; - int ndigs = ns_digits; - while (width < ndigs || (1 < ndigs && n % 10 == 0)) - ndigs--, n /= 10; - for (int j = ndigs; 0 < j; j--) - buf[j - 1] = n % 10 + L_('0'), n /= 10; - if (!pad) - pad = L_('0'); - width_cpy (0, ndigs, buf); - width_add (width - ndigs, 0, (void) 0); - } - break; -#endif - - case L_('n'): - add1 (L_('\n')); - break; - - case L_('P'): - to_lowcase = true; -#ifndef _NL_CURRENT - format_char = L_('p'); -#endif - FALLTHROUGH; - case L_('p'): - if (change_case) - { - to_uppcase = false; - to_lowcase = true; - } -#ifdef _NL_CURRENT - cpy (ap_len, ampm); - break; -#else - goto underlying_strftime; -#endif - - case L_('q'): /* GNU extension. */ - DO_SIGNED_NUMBER (1, false, ((tp->tm_mon * 11) >> 5) + 1); - - case L_('R'): - subfmt = L_("%H:%M"); - goto subformat; - - case L_('r'): -#ifdef _NL_CURRENT - if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, - NLW(T_FMT_AMPM))) - == L_('\0')) - subfmt = L_("%I:%M:%S %p"); - goto subformat; -#else - goto underlying_strftime; -#endif - - case L_('S'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, tp->tm_sec); - - case L_('s'): /* GNU extension. */ - { - struct tm ltm; - time_t t; - - ltm = *tp; - ltm.tm_yday = -1; - t = mktime_z (tz, <m); - if (ltm.tm_yday < 0) - { - errno = EOVERFLOW; - return 0; - } - - /* Generate string value for T using time_t arithmetic; - this works even if sizeof (long) < sizeof (time_t). */ - - bufp = buf + sizeof (buf) / sizeof (buf[0]); - negative_number = t < 0; - - do - { - int d = t % 10; - t /= 10; - *--bufp = (negative_number ? -d : d) + L_('0'); - } - while (t != 0); - - digits = 1; - always_output_a_sign = false; - goto do_number_sign_and_padding; - } - - case L_('X'): - if (modifier == L_('O')) - goto bad_format; -#ifdef _NL_CURRENT - if (! (modifier == L_('E') - && (*(subfmt = - (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT))) - != L_('\0')))) - subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT)); - goto subformat; -#else - goto underlying_strftime; -#endif - case L_('T'): - subfmt = L_("%H:%M:%S"); - goto subformat; - - case L_('t'): - add1 (L_('\t')); - break; - - case L_('u'): - DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); - - case L_('U'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); - - case L_('V'): - case L_('g'): - case L_('G'): - if (modifier == L_('E')) - goto bad_format; - { - /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE) - is a leap year, except that YEAR and YEAR - 1 both work - correctly even when (tp->tm_year + TM_YEAR_BASE) would - overflow. */ - int year = (tp->tm_year - + (tp->tm_year < 0 - ? TM_YEAR_BASE % 400 - : TM_YEAR_BASE % 400 - 400)); - int year_adjust = 0; - int days = iso_week_days (tp->tm_yday, tp->tm_wday); - - if (days < 0) - { - /* This ISO week belongs to the previous year. */ - year_adjust = -1; - days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)), - tp->tm_wday); - } - else - { - int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), - tp->tm_wday); - if (0 <= d) - { - /* This ISO week belongs to the next year. */ - year_adjust = 1; - days = d; - } - } - - switch (*f) - { - case L_('g'): - { - int yy = (tp->tm_year % 100 + year_adjust) % 100; - DO_YEARISH (2, false, - (0 <= yy - ? yy - : tp->tm_year < -TM_YEAR_BASE - year_adjust - ? -yy - : yy + 100)); - } - - case L_('G'): - DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE - year_adjust, - (tp->tm_year + (unsigned int) TM_YEAR_BASE - + year_adjust)); - - default: - DO_NUMBER (2, days / 7 + 1); - } - } - - case L_('W'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); - - case L_('w'): - if (modifier == L_('E')) - goto bad_format; - - DO_NUMBER (1, tp->tm_wday); - - case L_('Y'): - if (modifier == L_('E')) - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -# ifdef COMPILE_WIDE - subfmt = era->era_wformat; -# else - subfmt = era->era_format; -# endif - if (pad == 0) - pad = yr_spec; - goto subformat; - } -#else - goto underlying_strftime; -#endif - } - if (modifier == L_('O')) - goto bad_format; - - DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE, - tp->tm_year + (unsigned int) TM_YEAR_BASE); - - case L_('y'): - if (modifier == L_('E')) - { -#if HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { - int delta = tp->tm_year - era->start_date[0]; - if (pad == 0) - pad = yr_spec; - DO_NUMBER (2, (era->offset - + delta * era->absolute_direction)); - } -#else - goto underlying_strftime; -#endif - } - - { - int yy = tp->tm_year % 100; - if (yy < 0) - yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100; - DO_YEARISH (2, false, yy); - } - - case L_('Z'): - if (change_case) - { - to_uppcase = false; - to_lowcase = true; - } - -#ifdef COMPILE_WIDE - { - /* The zone string is always given in multibyte form. We have - to convert it to wide character. */ - size_t w = pad == L_('-') || width < 0 ? 0 : width; - char const *z = zone; - mbstate_t st = {0}; - size_t len = __mbsrtowcs_l (p, &z, maxsize - i, &st, loc); - if (len == (size_t) -1) - return 0; - size_t incr = len < w ? w : len; - if (incr >= maxsize - i) - { - errno = ERANGE; - return 0; - } - if (p) - { - if (len < w) - { - size_t delta = w - len; - __wmemmove (p + delta, p, len); - wchar_t wc = pad == L_('0') || pad == L_('+') ? L'0' : L' '; - wmemset (p, wc, delta); - } - p += incr; - } - i += incr; - } -#else - cpy (strlen (zone), zone); -#endif - break; - - case L_(':'): - /* :, ::, and ::: are valid only just before 'z'. - :::: etc. are rejected later. */ - for (colons = 1; f[colons] == L_(':'); colons++) - continue; - if (f[colons] != L_('z')) - goto bad_format; - f += colons; - goto do_z_conversion; - - case L_('z'): - colons = 0; - - do_z_conversion: - if (tp->tm_isdst < 0) - break; - - { - int diff; - int hour_diff; - int min_diff; - int sec_diff; -#if HAVE_TM_GMTOFF - diff = tp->tm_gmtoff; -#else - if (!tz) - diff = 0; - else - { - struct tm gtm; - struct tm ltm; - time_t lt; - - /* POSIX.1 requires that local time zone information be used as - though strftime called tzset. */ -# ifndef my_strftime - if (!*tzset_called) - { - tzset (); - *tzset_called = true; - } -# endif - - ltm = *tp; - ltm.tm_wday = -1; - lt = mktime_z (tz, <m); - if (ltm.tm_wday < 0 || ! localtime_rz (0, <, >m)) - break; - diff = tm_diff (<m, >m); - } -#endif - - negative_number = diff < 0 || (diff == 0 && *zone == '-'); - hour_diff = diff / 60 / 60; - min_diff = diff / 60 % 60; - sec_diff = diff % 60; - - switch (colons) - { - case 0: /* +hhmm */ - DO_TZ_OFFSET (5, 0, hour_diff * 100 + min_diff); - - case 1: tz_hh_mm: /* +hh:mm */ - DO_TZ_OFFSET (6, 04, hour_diff * 100 + min_diff); - - case 2: tz_hh_mm_ss: /* +hh:mm:ss */ - DO_TZ_OFFSET (9, 024, - hour_diff * 10000 + min_diff * 100 + sec_diff); - - case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */ - if (sec_diff != 0) - goto tz_hh_mm_ss; - if (min_diff != 0) - goto tz_hh_mm; - DO_TZ_OFFSET (3, 0, hour_diff); - - default: - goto bad_format; - } - } - - case L_('\0'): /* GNU extension: % at end of format. */ - bad_percent: - --f; - FALLTHROUGH; - default: - /* Unknown format; output the format, including the '%', - since this is most likely the right thing to do if a - multibyte string has been misparsed. */ - bad_format: - cpy (f - percent + 1, percent); - break; - } - } - -#if ! FPRINTFTIME - if (p && maxsize != 0) - *p = L_('\0'); -#endif - - errno = saved_errno; - return i; -} +#define my_strftime nstrftime +#include "strftime.c" diff --git a/lib/strftime.c b/lib/strftime.c new file mode 100644 index 00000000000..c7256c3d354 --- /dev/null +++ b/lib/strftime.c @@ -0,0 +1,2051 @@ +/* Copyright (C) 1991-2024 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#ifndef FPRINTFTIME +# define FPRINTFTIME 0 +#endif + +#ifndef USE_C_LOCALE +# define USE_C_LOCALE 0 +#endif + +#ifdef _LIBC +# define USE_IN_EXTENDED_LOCALE_MODEL 1 +# define HAVE_STRUCT_ERA_ENTRY 1 +# define HAVE_TM_GMTOFF 1 +# define HAVE_STRUCT_TM_TM_ZONE 1 +# define HAVE_TZNAME 1 +# include "../locale/localeinfo.h" +#else +# include +# if FPRINTFTIME +# include "fprintftime.h" +# else +# include "strftime.h" +# endif +# include "time-internal.h" +#endif + +/* Whether to require GNU behavior for AM and PM indicators, even on + other platforms. This matters only in non-C locales. + The default is to require it; you can override this via + AC_DEFINE([REQUIRE_GNUISH_STRFTIME_AM_PM], 1) and if you do that + you may be able to omit Gnulib's localename module and its dependencies. */ +#ifndef REQUIRE_GNUISH_STRFTIME_AM_PM +# define REQUIRE_GNUISH_STRFTIME_AM_PM true +#endif +#if USE_C_LOCALE +# undef REQUIRE_GNUISH_STRFTIME_AM_PM +# define REQUIRE_GNUISH_STRFTIME_AM_PM false +#endif + +#if USE_C_LOCALE +# include "c-ctype.h" +#else +# include +#endif +#include +#include + +#if HAVE_TZNAME && !HAVE_DECL_TZNAME +extern char *tzname[]; +#endif + +/* Do multibyte processing if multibyte encodings are supported, unless + multibyte sequences are safe in formats. Multibyte sequences are + safe if they cannot contain byte sequences that look like format + conversion specifications. The multibyte encodings used by the + C library on the various platforms (UTF-8, GB2312, GBK, CP936, + GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949, + SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%' + cannot occur in a multibyte character except in the first byte. + + The DEC-HANYU encoding used on OSF/1 is not safe for formats, but + this encoding has never been seen in real-life use, so we ignore + it. */ +#if !(defined __osf__ && 0) +# define MULTIBYTE_IS_FORMAT_SAFE 1 +#endif +#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE) + +#if DO_MULTIBYTE +# include + static const mbstate_t mbstate_zero; +#endif + +#include +#include +#include +#include +#include + +#if USE_C_LOCALE && HAVE_STRFTIME_L +# include +#endif + +#if (defined __NetBSD__ || defined __sun) && REQUIRE_GNUISH_STRFTIME_AM_PM +# include +# include "localename.h" +#endif + +#include "attribute.h" +#include + +#ifdef COMPILE_WIDE +# include +# define CHAR_T wchar_t +# define UCHAR_T unsigned int +# define L_(Str) L##Str +# define NLW(Sym) _NL_W##Sym + +# define MEMCPY(d, s, n) __wmemcpy (d, s, n) +# define STRLEN(s) __wcslen (s) + +#else +# define CHAR_T char +# define UCHAR_T unsigned char +# define L_(Str) Str +# define NLW(Sym) Sym +# define ABALTMON_1 _NL_ABALTMON_1 + +# define MEMCPY(d, s, n) memcpy (d, s, n) +# define STRLEN(s) strlen (s) + +#endif + +/* Shift A right by B bits portably, by dividing A by 2**B and + truncating towards minus infinity. A and B should be free of side + effects, and B should be in the range 0 <= B <= INT_BITS - 2, where + INT_BITS is the number of useful bits in an int. GNU code can + assume that INT_BITS is at least 32. + + ISO C99 says that A >> B is implementation-defined if A < 0. Some + implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift + right in the usual way when A < 0, so SHR falls back on division if + ordinary A >> B doesn't seem to be the usual signed shift. */ +#define SHR(a, b) \ + (-1 >> 1 == -1 \ + ? (a) >> (b) \ + : ((a) + ((a) < 0)) / (1 << (b)) - ((a) < 0)) + +#define TM_YEAR_BASE 1900 + +#ifndef __isleap +/* Nonzero if YEAR is a leap year (every 4 years, + except every 100th isn't, and every 400th is). */ +# define __isleap(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#endif + + +#ifdef _LIBC +# define mktime_z(tz, tm) mktime (tm) +# define tzname __tzname +# define tzset __tzset + +# define time_t __time64_t +# define __gmtime_r(t, tp) __gmtime64_r (t, tp) +# define mktime(tp) __mktime64 (tp) +#endif + +#if FPRINTFTIME +# define STREAM_OR_CHAR_T FILE +# define STRFTIME_ARG(x) /* empty */ +#else +# define STREAM_OR_CHAR_T CHAR_T +# define STRFTIME_ARG(x) x, +#endif + +#if FPRINTFTIME +# define memset_byte(P, Len, Byte) \ + do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0) +# define memset_space(P, Len) memset_byte (P, Len, ' ') +# define memset_zero(P, Len) memset_byte (P, Len, '0') +#elif defined COMPILE_WIDE +# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len)) +# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len)) +#else +# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len)) +# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len)) +#endif + +#if FPRINTFTIME +# define advance(P, N) +#else +# define advance(P, N) ((P) += (N)) +#endif + +#define add(n, f) width_add (width, n, f) +#define width_add(width, n, f) \ + do \ + { \ + size_t _n = (n); \ + size_t _w = pad == L_('-') || width < 0 ? 0 : width; \ + size_t _incr = _n < _w ? _w : _n; \ + if (_incr >= maxsize - i) \ + { \ + errno = ERANGE; \ + return 0; \ + } \ + if (p) \ + { \ + if (_n < _w) \ + { \ + size_t _delta = _w - _n; \ + if (pad == L_('0') || pad == L_('+')) \ + memset_zero (p, _delta); \ + else \ + memset_space (p, _delta); \ + } \ + f; \ + advance (p, _n); \ + } \ + i += _incr; \ + } while (0) + +#define add1(c) width_add1 (width, c) +#if FPRINTFTIME +# define width_add1(width, c) width_add (width, 1, fputc (c, p)) +#else +# define width_add1(width, c) width_add (width, 1, *p = c) +#endif + +#define cpy(n, s) width_cpy (width, n, s) +#if FPRINTFTIME +# define width_cpy(width, n, s) \ + width_add (width, n, \ + do \ + { \ + if (to_lowcase) \ + fwrite_lowcase (p, (s), _n); \ + else if (to_uppcase) \ + fwrite_uppcase (p, (s), _n); \ + else \ + { \ + /* Ignore the value of fwrite. The caller can determine whether \ + an error occurred by inspecting ferror (P). All known fwrite \ + implementations set the stream's error indicator when they \ + fail due to ENOMEM etc., even though C11 and POSIX.1-2008 do \ + not require this. */ \ + fwrite (s, _n, 1, p); \ + } \ + } \ + while (0) \ + ) +#else +# define width_cpy(width, n, s) \ + width_add (width, n, \ + if (to_lowcase) \ + memcpy_lowcase (p, (s), _n LOCALE_ARG); \ + else if (to_uppcase) \ + memcpy_uppcase (p, (s), _n LOCALE_ARG); \ + else \ + MEMCPY ((void *) p, (void const *) (s), _n)) +#endif + +#ifdef COMPILE_WIDE +# ifndef USE_IN_EXTENDED_LOCALE_MODEL +# undef __mbsrtowcs_l +# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st) +# endif +#endif + + +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL +/* We use this code also for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT + macro. */ +# define strftime __strftime_l +# define wcsftime __wcsftime_l +# undef _NL_CURRENT +# define _NL_CURRENT(category, item) \ + (current->values[_NL_ITEM_INDEX (item)].string) +# define LOCALE_PARAM , locale_t loc +# define LOCALE_ARG , loc +# define HELPER_LOCALE_ARG , current +#else +# define LOCALE_PARAM +# define LOCALE_ARG +# ifdef _LIBC +# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME) +# else +# define HELPER_LOCALE_ARG +# endif +#endif + +#ifdef COMPILE_WIDE +# ifdef USE_IN_EXTENDED_LOCALE_MODEL +# define TOUPPER(Ch, L) __towupper_l (Ch, L) +# define TOLOWER(Ch, L) __towlower_l (Ch, L) +# else +# define TOUPPER(Ch, L) towupper (Ch) +# define TOLOWER(Ch, L) towlower (Ch) +# endif +#else +# ifdef USE_IN_EXTENDED_LOCALE_MODEL +# define TOUPPER(Ch, L) __toupper_l (Ch, L) +# define TOLOWER(Ch, L) __tolower_l (Ch, L) +# else +# if USE_C_LOCALE +# define TOUPPER(Ch, L) c_toupper (Ch) +# define TOLOWER(Ch, L) c_tolower (Ch) +# else +# define TOUPPER(Ch, L) toupper (Ch) +# define TOLOWER(Ch, L) tolower (Ch) +# endif +# endif +#endif +/* We don't use 'isdigit' here since the locale dependent + interpretation is not what we want here. We only need to accept + the arabic digits in the ASCII range. One day there is perhaps a + more reliable way to accept other sets of digits. */ +#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) + +/* Avoid false GCC warning "'memset' specified size 18446744073709551615 exceeds + maximum object size 9223372036854775807", caused by insufficient data flow + analysis and value propagation of the 'width_add' expansion when GCC is not + optimizing. Cf. . */ +#if __GNUC__ >= 7 && !__OPTIMIZE__ +# pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif + +#if FPRINTFTIME +static void +fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len) +{ + while (len-- > 0) + { + fputc (TOLOWER ((UCHAR_T) *src, loc), fp); + ++src; + } +} + +static void +fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len) +{ + while (len-- > 0) + { + fputc (TOUPPER ((UCHAR_T) *src, loc), fp); + ++src; + } +} +#else +static CHAR_T *memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, + size_t len LOCALE_PARAM); + +static CHAR_T * +memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) +{ + while (len-- > 0) + dest[len] = TOLOWER ((UCHAR_T) src[len], loc); + return dest; +} + +static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, + size_t len LOCALE_PARAM); + +static CHAR_T * +memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM) +{ + while (len-- > 0) + dest[len] = TOUPPER ((UCHAR_T) src[len], loc); + return dest; +} +#endif + + +#if USE_C_LOCALE && HAVE_STRFTIME_L + +/* Cache for the C locale object. + Marked volatile so that different threads see the same value + (avoids locking). */ +static volatile locale_t c_locale_cache; + +/* Return the C locale object, or (locale_t) 0 with errno set + if it cannot be created. */ +static locale_t +c_locale (void) +{ + if (!c_locale_cache) + c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0); + return c_locale_cache; +} + +#endif + + +#if (defined __NetBSD__ || defined __sun) && REQUIRE_GNUISH_STRFTIME_AM_PM + +/* Return true if an AM/PM indicator should be removed. */ +static bool +should_remove_ampm (void) +{ + /* According to glibc's 'am_pm' attribute in the locale database, an AM/PM + indicator should be absent in the locales for the following languages: + ab an ast az be ber bg br bs ce cs csb cv da de dsb eo et eu fa fi fo fr + fur fy ga gl gv hr hsb ht hu hy it ka kk kl ku kv kw ky lb lg li lij ln + lt lv mg mhr mi mk mn ms mt nb nds nhn nl nn nr nso oc os pap pl pt ro + ru rw sah sc se sgs sk sl sm sr ss st su sv szl tg tk tn ts tt ug uk unm + uz ve wae wo xh zu */ + const char *loc = gl_locale_name (LC_TIME, "LC_TIME"); + bool remove_ampm = false; + switch (loc[0]) + { + case 'a': + switch (loc[1]) + { + case 'b': case 'n': case 'z': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 's': + if (loc[2] == 't' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'b': + switch (loc[1]) + { + case 'e': + if (loc[2] == '\0' || loc[2] == '_' + || (loc[2] == 'r' && (loc[3] == '\0' || loc[3] == '_'))) + remove_ampm = true; + break; + case 'g': case 'r': case 's': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'c': + switch (loc[1]) + { + case 'e': case 'v': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 's': + if (loc[2] == '\0' || loc[2] == '_' + || (loc[2] == 'b' && (loc[3] == '\0' || loc[3] == '_'))) + remove_ampm = true; + break; + default: + break; + } + break; + case 'd': + switch (loc[1]) + { + case 'a': case 'e': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 's': + if (loc[2] == 'b' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'e': + switch (loc[1]) + { + case 'o': case 't': case 'u': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'f': + switch (loc[1]) + { + case 'a': case 'i': case 'o': case 'r': case 'y': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'u': + if (loc[2] == 'r' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'g': + switch (loc[1]) + { + case 'a': case 'l': case 'v': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'h': + switch (loc[1]) + { + case 'r': case 't': case 'u': case 'y': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 's': + if (loc[2] == 'b' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'i': + switch (loc[1]) + { + case 't': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'k': + switch (loc[1]) + { + case 'a': case 'k': case 'l': case 'u': case 'v': case 'w': case 'y': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'l': + switch (loc[1]) + { + case 'b': case 'g': case 'n': case 't': case 'v': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'i': + if (loc[2] == 'j' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'm': + switch (loc[1]) + { + case 'g': case 'i': case 'k': case 'n': case 's': case 't': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'h': + if (loc[2] == 'r' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'n': + switch (loc[1]) + { + case 'b': case 'l': case 'n': case 'r': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'd': + if (loc[2] == 's' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + case 'h': + if (loc[2] == 'n' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + case 's': + if (loc[2] == 'o' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'o': + switch (loc[1]) + { + case 'c': case 's': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'p': + switch (loc[1]) + { + case 'l': case 't': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'a': + if (loc[2] == 'p' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'r': + switch (loc[1]) + { + case 'o': case 'u': case 'w': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 's': + switch (loc[1]) + { + case 'c': case 'e': case 'k': case 'l': case 'm': case 'r': case 's': + case 't': case 'u': case 'v': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'a': + if (loc[2] == 'h' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + case 'g': + if (loc[2] == 's' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + case 'z': + if (loc[2] == 'l' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 't': + switch (loc[1]) + { + case 'g': case 'k': case 'n': case 's': case 't': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'u': + switch (loc[1]) + { + case 'g': case 'k': case 'z': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + case 'n': + if (loc[2] == 'm'&& (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + default: + break; + } + break; + case 'v': + switch (loc[1]) + { + case 'e': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'w': + switch (loc[1]) + { + case 'a': + if (loc[2] == 'e' && (loc[3] == '\0' || loc[3] == '_')) + remove_ampm = true; + break; + case 'o': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'x': + switch (loc[1]) + { + case 'h': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + case 'z': + switch (loc[1]) + { + case 'u': + if (loc[2] == '\0' || loc[2] == '_') + remove_ampm = true; + break; + default: + break; + } + break; + default: + break; + } + return remove_ampm; +} + +#endif + + +#if ! HAVE_TM_GMTOFF +/* Yield the difference between *A and *B, + measured in seconds, ignoring leap seconds. */ +# define tm_diff ftime_tm_diff +static int tm_diff (const struct tm *, const struct tm *); +static int +tm_diff (const struct tm *a, const struct tm *b) +{ + /* Compute intervening leap days correctly even if year is negative. + Take care to avoid int overflow in leap day calculations, + but it's OK to assume that A and B are close to each other. */ + int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3); + int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3); + int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0); + int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0); + int a400 = SHR (a100, 2); + int b400 = SHR (b100, 2); + int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); + int years = a->tm_year - b->tm_year; + int days = (365 * years + intervening_leap_days + + (a->tm_yday - b->tm_yday)); + return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) + + (a->tm_min - b->tm_min)) + + (a->tm_sec - b->tm_sec)); +} +#endif /* ! HAVE_TM_GMTOFF */ + + + +/* The number of days from the first day of the first ISO week of this + year to the year day YDAY with week day WDAY. ISO weeks start on + Monday; the first ISO week has the year's first Thursday. YDAY may + be as small as YDAY_MINIMUM. */ +#define ISO_WEEK_START_WDAY 1 /* Monday */ +#define ISO_WEEK1_WDAY 4 /* Thursday */ +#define YDAY_MINIMUM (-366) +static int iso_week_days (int, int); +static __inline int +iso_week_days (int yday, int wday) +{ + /* Add enough to the first operand of % to make it nonnegative. */ + int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; + return (yday + - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7 + + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY); +} + + +#if !defined _NL_CURRENT && (USE_C_LOCALE && !HAVE_STRFTIME_L) +static CHAR_T const c_weekday_names[][sizeof "Wednesday"] = + { + L_("Sunday"), L_("Monday"), L_("Tuesday"), L_("Wednesday"), + L_("Thursday"), L_("Friday"), L_("Saturday") + }; +static CHAR_T const c_month_names[][sizeof "September"] = + { + L_("January"), L_("February"), L_("March"), L_("April"), L_("May"), + L_("June"), L_("July"), L_("August"), L_("September"), L_("October"), + L_("November"), L_("December") + }; +#endif + + +/* When compiling this file, GNU applications can #define my_strftime + to a symbol (typically nstrftime) to get an extended strftime with + extra arguments TZ and NS. */ + +#ifdef my_strftime +# define extra_args , tz, ns +# define extra_args_spec , timezone_t tz, int ns +#else +# if defined COMPILE_WIDE +# define my_strftime wcsftime +# define nl_get_alt_digit _nl_get_walt_digit +# else +# define my_strftime strftime +# define nl_get_alt_digit _nl_get_alt_digit +# endif +# define extra_args +# define extra_args_spec +/* We don't have this information in general. */ +# define tz 1 +# define ns 0 +#endif + +static size_t __strftime_internal (STREAM_OR_CHAR_T *, STRFTIME_ARG (size_t) + const CHAR_T *, const struct tm *, + bool, int, int, bool * + extra_args_spec LOCALE_PARAM); + +/* Write information from TP into S according to the format + string FORMAT, writing no more that MAXSIZE characters + (including the terminating '\0') and returning number of + characters written. If S is NULL, nothing will be written + anywhere, so to determine how many characters would be + written, use NULL for S and (size_t) -1 for MAXSIZE. */ +size_t +my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) + const CHAR_T *format, + const struct tm *tp extra_args_spec LOCALE_PARAM) +{ + bool tzset_called = false; + return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, false, + 0, -1, &tzset_called extra_args LOCALE_ARG); +} +libc_hidden_def (my_strftime) + +/* Just like my_strftime, above, but with more parameters. + UPCASE indicates that the result should be converted to upper case. + YR_SPEC and WIDTH specify the padding and width for the year. + *TZSET_CALLED indicates whether tzset has been called here. */ +static size_t +__strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) + const CHAR_T *format, + const struct tm *tp, bool upcase, + int yr_spec, int width, bool *tzset_called + extra_args_spec LOCALE_PARAM) +{ +#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL + struct __locale_data *const current = loc->__locales[LC_TIME]; +#endif +#if FPRINTFTIME + size_t maxsize = (size_t) -1; +#endif + + int saved_errno = errno; + int hour12 = tp->tm_hour; +#ifdef _NL_CURRENT + /* We cannot make the following values variables since we must delay + the evaluation of these values until really needed since some + expressions might not be valid in every situation. The 'struct tm' + might be generated by a strptime() call that initialized + only a few elements. Dereference the pointers only if the format + requires this. Then it is ok to fail if the pointers are invalid. */ +# define a_wkday \ + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) +# define f_wkday \ + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) +# define a_month \ + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) +# define f_month \ + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) +# define a_altmonth \ + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABALTMON_1) + tp->tm_mon))) +# define f_altmonth \ + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ALTMON_1) + tp->tm_mon))) +# define ampm \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ + ? NLW(PM_STR) : NLW(AM_STR))) + +# define aw_len STRLEN (a_wkday) +# define am_len STRLEN (a_month) +# define aam_len STRLEN (a_altmonth) +# define ap_len STRLEN (ampm) +#elif USE_C_LOCALE && !HAVE_STRFTIME_L +/* The English abbreviated weekday names are just the first 3 characters of the + English full weekday names. */ +# define a_wkday \ + (tp->tm_wday < 0 || tp->tm_wday > 6 ? L_("?") : c_weekday_names[tp->tm_wday]) +# define aw_len 3 +# define f_wkday \ + (tp->tm_wday < 0 || tp->tm_wday > 6 ? L_("?") : c_weekday_names[tp->tm_wday]) +/* The English abbreviated month names are just the first 3 characters of the + English full month names. */ +# define a_month \ + (tp->tm_mon < 0 || tp->tm_mon > 11 ? L_("?") : c_month_names[tp->tm_mon]) +# define am_len 3 +# define f_month \ + (tp->tm_mon < 0 || tp->tm_mon > 11 ? L_("?") : c_month_names[tp->tm_mon]) +/* The English AM/PM strings happen to have the same length, namely 2. */ +# define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) +# define ap_len 2 +#endif +#if HAVE_TZNAME + char **tzname_vec = tzname; +#endif + const char *zone; + size_t i = 0; + STREAM_OR_CHAR_T *p = s; + const CHAR_T *f; +#if DO_MULTIBYTE && !defined COMPILE_WIDE + const char *format_end = NULL; +#endif + + zone = NULL; +#if HAVE_STRUCT_TM_TM_ZONE + /* The POSIX test suite assumes that setting + the environment variable TZ to a new value before calling strftime() + will influence the result (the %Z format) even if the information in + TP is computed with a totally different time zone. + This is bogus: though POSIX allows bad behavior like this, + POSIX does not require it. Do the right thing instead. */ + zone = (const char *) tp->tm_zone; +#endif +#if HAVE_TZNAME + if (!tz) + { + if (! (zone && *zone)) + zone = "GMT"; + } + else + { +# if !HAVE_STRUCT_TM_TM_ZONE + /* Infer the zone name from *TZ instead of from TZNAME. */ + tzname_vec = tz->tzname_copy; +# endif + } + /* The tzset() call might have changed the value. */ + if (!(zone && *zone) && tp->tm_isdst >= 0) + { + /* POSIX.1 requires that local time zone information be used as + though strftime called tzset. */ +# ifndef my_strftime + if (!*tzset_called) + { + tzset (); + *tzset_called = true; + } +# endif + zone = tzname_vec[tp->tm_isdst != 0]; + } +#endif + if (! zone) + zone = ""; + + if (hour12 > 12) + hour12 -= 12; + else + if (hour12 == 0) + hour12 = 12; + + for (f = format; *f != '\0'; width = -1, f++) + { + int pad = 0; /* Padding for number ('_', '-', '+', '0', or 0). */ + int modifier; /* Field modifier ('E', 'O', or 0). */ + int digits = 0; /* Max digits for numeric format. */ + int number_value; /* Numeric value to be printed. */ + unsigned int u_number_value; /* (unsigned int) number_value. */ + bool negative_number; /* The number is negative. */ + bool always_output_a_sign; /* +/- should always be output. */ + int tz_colon_mask; /* Bitmask of where ':' should appear. */ + const CHAR_T *subfmt; + CHAR_T *bufp; + CHAR_T buf[1 + + 2 /* for the two colons in a %::z or %:::z time zone */ + + (sizeof (int) < sizeof (time_t) + ? INT_STRLEN_BOUND (time_t) + : INT_STRLEN_BOUND (int))]; + bool to_lowcase = false; + bool to_uppcase = upcase; + size_t colons; + bool change_case = false; + int format_char; + int subwidth; + +#if DO_MULTIBYTE && !defined COMPILE_WIDE + switch (*f) + { + case L_('%'): + break; + + case L_('\b'): case L_('\t'): case L_('\n'): + case L_('\v'): case L_('\f'): case L_('\r'): + case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'): + case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'): + case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'): + case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'): + case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'): + case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'): + case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'): + case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'): + case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'): + case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'): + case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'): + case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'): + case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'): + case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'): + case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'): + case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'): + case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'): + case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'): + case L_('~'): + /* The C Standard requires these 98 characters (plus '%') to + be in the basic execution character set. None of these + characters can start a multibyte sequence, so they need + not be analyzed further. */ + add1 (*f); + continue; + + default: + /* Copy this multibyte sequence until we reach its end, find + an error, or come back to the initial shift state. */ + { + mbstate_t mbstate = mbstate_zero; + size_t len = 0; + size_t fsize; + + if (! format_end) + format_end = f + strlen (f) + 1; + fsize = format_end - f; + + do + { + size_t bytes = mbrlen (f + len, fsize - len, &mbstate); + + if (bytes == 0) + break; + + if (bytes == (size_t) -2) + { + len += strlen (f + len); + break; + } + + if (bytes == (size_t) -1) + { + len++; + break; + } + + len += bytes; + } + while (! mbsinit (&mbstate)); + + cpy (len, f); + f += len - 1; + continue; + } + } + +#else /* ! DO_MULTIBYTE */ + + /* Either multibyte encodings are not supported, they are + safe for formats, so any non-'%' byte can be copied through, + or this is the wide character version. */ + if (*f != L_('%')) + { + add1 (*f); + continue; + } + +#endif /* ! DO_MULTIBYTE */ + + char const *percent = f; + + /* Check for flags that can modify a format. */ + while (1) + { + switch (*++f) + { + /* This influences the number formats. */ + case L_('_'): + case L_('-'): + case L_('+'): + case L_('0'): + pad = *f; + continue; + + /* This changes textual output. */ + case L_('^'): + to_uppcase = true; + continue; + case L_('#'): + change_case = true; + continue; + + default: + break; + } + break; + } + + if (ISDIGIT (*f)) + { + width = 0; + do + { + if (ckd_mul (&width, width, 10) + || ckd_add (&width, width, *f - L_('0'))) + width = INT_MAX; + ++f; + } + while (ISDIGIT (*f)); + } + + /* Check for modifiers. */ + switch (*f) + { + case L_('E'): + case L_('O'): + modifier = *f++; + break; + + default: + modifier = 0; + break; + } + + /* Now do the specified format. */ + format_char = *f; + switch (format_char) + { +#define DO_NUMBER(d, v) \ + do \ + { \ + digits = d; \ + number_value = v; \ + goto do_number; \ + } \ + while (0) +#define DO_SIGNED_NUMBER(d, negative, v) \ + DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_signed_number) +#define DO_YEARISH(d, negative, v) \ + DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_yearish) +#define DO_MAYBE_SIGNED_NUMBER(d, negative, v, label) \ + do \ + { \ + digits = d; \ + negative_number = negative; \ + u_number_value = v; \ + goto label; \ + } \ + while (0) + + /* The mask is not what you might think. + When the ordinal i'th bit is set, insert a colon + before the i'th digit of the time zone representation. */ +#define DO_TZ_OFFSET(d, mask, v) \ + do \ + { \ + digits = d; \ + tz_colon_mask = mask; \ + u_number_value = v; \ + goto do_tz_offset; \ + } \ + while (0) +#define DO_NUMBER_SPACEPAD(d, v) \ + do \ + { \ + digits = d; \ + number_value = v; \ + goto do_number_spacepad; \ + } \ + while (0) + + case L_('%'): + if (f - 1 != percent) + goto bad_percent; + add1 (*f); + break; + + case L_('a'): + if (modifier != 0) + goto bad_format; + if (change_case) + { + to_uppcase = true; + to_lowcase = false; + } +#if defined _NL_CURRENT || (USE_C_LOCALE && !HAVE_STRFTIME_L) + cpy (aw_len, a_wkday); + break; +#else + goto underlying_strftime; +#endif + + case 'A': + if (modifier != 0) + goto bad_format; + if (change_case) + { + to_uppcase = true; + to_lowcase = false; + } +#if defined _NL_CURRENT || (USE_C_LOCALE && !HAVE_STRFTIME_L) + cpy (STRLEN (f_wkday), f_wkday); + break; +#else + goto underlying_strftime; +#endif + + case L_('b'): + case L_('h'): + if (change_case) + { + to_uppcase = true; + to_lowcase = false; + } + if (modifier == L_('E')) + goto bad_format; +#ifdef _NL_CURRENT + if (modifier == L_('O')) + cpy (aam_len, a_altmonth); + else + cpy (am_len, a_month); + break; +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + cpy (am_len, a_month); + break; +#else + goto underlying_strftime; +#endif + + case L_('B'): + if (modifier == L_('E')) + goto bad_format; + if (change_case) + { + to_uppcase = true; + to_lowcase = false; + } +#ifdef _NL_CURRENT + if (modifier == L_('O')) + cpy (STRLEN (f_altmonth), f_altmonth); + else + cpy (STRLEN (f_month), f_month); + break; +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + cpy (STRLEN (f_month), f_month); + break; +#else + goto underlying_strftime; +#endif + + case L_('c'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == L_('E') + && (*(subfmt = + (const CHAR_T *) _NL_CURRENT (LC_TIME, + NLW(ERA_D_T_FMT))) + != '\0'))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + subfmt = L_("%a %b %e %H:%M:%S %Y"); +#else + goto underlying_strftime; +#endif + + subformat: + subwidth = -1; + subformat_width: + { + size_t len = __strftime_internal (NULL, STRFTIME_ARG ((size_t) -1) + subfmt, tp, to_uppcase, + pad, subwidth, tzset_called + extra_args LOCALE_ARG); + add (len, __strftime_internal (p, + STRFTIME_ARG (maxsize - i) + subfmt, tp, to_uppcase, + pad, subwidth, tzset_called + extra_args LOCALE_ARG)); + } + break; + +#if !((defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY) || (USE_C_LOCALE && !HAVE_STRFTIME_L)) + underlying_strftime: + { + /* The relevant information is available only via the + underlying strftime implementation, so use that. */ + char ufmt[5]; + char *u = ufmt; + char ubuf[1024]; /* enough for any single format in practice */ + size_t len; + /* Make sure we're calling the actual underlying strftime. + In some cases, config.h contains something like + "#define strftime rpl_strftime". */ +# ifdef strftime +# undef strftime + size_t strftime (char *, size_t, const char *, struct tm const *); +# endif + + /* The space helps distinguish strftime failure from empty + output. */ + *u++ = ' '; + *u++ = '%'; + if (modifier != 0) + *u++ = modifier; + *u++ = format_char; + *u = '\0'; + +# if USE_C_LOCALE /* implies HAVE_STRFTIME_L */ + locale_t locale = c_locale (); + if (!locale) + return 0; /* errno is set here */ + len = strftime_l (ubuf, sizeof ubuf, ufmt, tp, locale); +# else + len = strftime (ubuf, sizeof ubuf, ufmt, tp); +# endif + if (len != 0) + { +# if defined __NetBSD__ || defined __sun /* NetBSD, Solaris */ + if (format_char == L_('c')) + { + /* The output of the strftime %c directive consists of the + date, the time, and the time zone. But the time zone is + wrong, since neither TZ nor ZONE was passed as argument. + Therefore, remove the the last space-delimited word. + In order not to accidentally remove a date or a year + (that contains no letter) or an AM/PM indicator (that has + length 2), remove that last word only if it contains a + letter and has length >= 3. */ + char *space; + for (space = ubuf + len - 1; *space != ' '; space--) + ; + if (space > ubuf) + { + /* Found a space. */ + if (strlen (space + 1) >= 3) + { + /* The last word has length >= 3. */ + bool found_letter = false; + const char *p; + for (p = space + 1; *p != '\0'; p++) + if ((*p >= 'A' && *p <= 'Z') + || (*p >= 'a' && *p <= 'z')) + { + found_letter = true; + break; + } + if (found_letter) + { + /* The last word contains a letter. */ + *space = '\0'; + len = space - ubuf; + } + } + } + } +# if REQUIRE_GNUISH_STRFTIME_AM_PM + /* The output of the strftime %p and %r directives contains + an AM/PM indicator even for locales where it is not + suitable, such as French. Remove this indicator. */ + else if (format_char == L_('p')) + { + bool found_ampm = (len > 1); + if (found_ampm && should_remove_ampm ()) + { + ubuf[1] = '\0'; + len = 1; + } + } + else if (format_char == L_('r')) + { + char last_char = ubuf[len - 1]; + bool found_ampm = !(last_char >= '0' && last_char <= '9'); + if (found_ampm && should_remove_ampm ()) + { + char *space; + for (space = ubuf + len - 1; *space != ' '; space--) + ; + if (space > ubuf) + { + *space = '\0'; + len = space - ubuf; + } + } + } +# endif +# endif + cpy (len - 1, ubuf + 1); + } + } + break; +#endif + + case L_('C'): + if (modifier == L_('E')) + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); + if (era) + { +# ifdef COMPILE_WIDE + size_t len = __wcslen (era->era_wname); + cpy (len, era->era_wname); +# else + size_t len = strlen (era->era_name); + cpy (len, era->era_name); +# endif + break; + } +#elif USE_C_LOCALE && !HAVE_STRFTIME_L +#else + goto underlying_strftime; +#endif + } + + { + bool negative_year = tp->tm_year < - TM_YEAR_BASE; + bool zero_thru_1899 = !negative_year & (tp->tm_year < 0); + int century = ((tp->tm_year - 99 * zero_thru_1899) / 100 + + TM_YEAR_BASE / 100); + DO_YEARISH (2, negative_year, century); + } + + case L_('x'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == L_('E') + && (*(subfmt = + (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) + != L_('\0')))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); + goto subformat; +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + subfmt = L_("%m/%d/%y"); + goto subformat; +#else + goto underlying_strftime; +#endif + case L_('D'): + if (modifier != 0) + goto bad_format; + subfmt = L_("%m/%d/%y"); + goto subformat; + + case L_('d'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_mday); + + case L_('e'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, tp->tm_mday); + + /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE) + and then jump to one of these labels. */ + + do_tz_offset: + always_output_a_sign = true; + goto do_number_body; + + do_yearish: + if (pad == 0) + pad = yr_spec; + always_output_a_sign + = (pad == L_('+') + && ((digits == 2 ? 99 : 9999) < u_number_value + || digits < width)); + goto do_maybe_signed_number; + + do_number_spacepad: + if (pad == 0) + pad = L_('_'); + + do_number: + /* Format NUMBER_VALUE according to the MODIFIER flag. */ + negative_number = number_value < 0; + u_number_value = number_value; + + do_signed_number: + always_output_a_sign = false; + + do_maybe_signed_number: + tz_colon_mask = 0; + + do_number_body: + /* Format U_NUMBER_VALUE according to the MODIFIER flag. + NEGATIVE_NUMBER is nonzero if the original number was + negative; in this case it was converted directly to + unsigned int (i.e., modulo (UINT_MAX + 1)) without + negating it. */ + if (modifier == L_('O') && !negative_number) + { +#ifdef _NL_CURRENT + /* Get the locale specific alternate representation of + the number. If none exist NULL is returned. */ + const CHAR_T *cp = nl_get_alt_digit (u_number_value + HELPER_LOCALE_ARG); + + if (cp != NULL) + { + size_t digitlen = STRLEN (cp); + if (digitlen != 0) + { + cpy (digitlen, cp); + break; + } + } +#elif USE_C_LOCALE && !HAVE_STRFTIME_L +#else + goto underlying_strftime; +#endif + } + + bufp = buf + sizeof (buf) / sizeof (buf[0]); + + if (negative_number) + u_number_value = - u_number_value; + + do + { + if (tz_colon_mask & 1) + *--bufp = ':'; + tz_colon_mask >>= 1; + *--bufp = u_number_value % 10 + L_('0'); + u_number_value /= 10; + } + while (u_number_value != 0 || tz_colon_mask != 0); + + do_number_sign_and_padding: + if (pad == 0) + pad = L_('0'); + if (width < 0) + width = digits; + + { + CHAR_T sign_char = (negative_number ? L_('-') + : always_output_a_sign ? L_('+') + : 0); + int numlen = buf + sizeof buf / sizeof buf[0] - bufp; + int shortage = width - !!sign_char - numlen; + int padding = pad == L_('-') || shortage <= 0 ? 0 : shortage; + + if (sign_char) + { + if (pad == L_('_')) + { + if (p) + memset_space (p, padding); + i += padding; + width -= padding; + } + width_add1 (0, sign_char); + width--; + } + + cpy (numlen, bufp); + } + break; + + case L_('F'): + if (modifier != 0) + goto bad_format; + if (pad == 0 && width < 0) + { + pad = L_('+'); + subwidth = 4; + } + else + { + subwidth = width - 6; + if (subwidth < 0) + subwidth = 0; + } + subfmt = L_("%Y-%m-%d"); + goto subformat_width; + + case L_('H'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_hour); + + case L_('I'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, hour12); + + case L_('k'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, tp->tm_hour); + + case L_('l'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, hour12); + + case L_('j'): + if (modifier == L_('E')) + goto bad_format; + + DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U); + + case L_('M'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_min); + + case L_('m'): + if (modifier == L_('E')) + goto bad_format; + + DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U); + +#ifndef _LIBC + case L_('N'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + { + int n = ns, ns_digits = 9; + if (width <= 0) + width = ns_digits; + int ndigs = ns_digits; + while (width < ndigs || (1 < ndigs && n % 10 == 0)) + ndigs--, n /= 10; + for (int j = ndigs; 0 < j; j--) + buf[j - 1] = n % 10 + L_('0'), n /= 10; + if (!pad) + pad = L_('0'); + width_cpy (0, ndigs, buf); + width_add (width - ndigs, 0, (void) 0); + } + break; +#endif + + case L_('n'): + add1 (L_('\n')); + break; + + case L_('P'): + to_lowcase = true; +#ifndef _NL_CURRENT + format_char = L_('p'); +#endif + FALLTHROUGH; + case L_('p'): + if (change_case) + { + to_uppcase = false; + to_lowcase = true; + } +#if defined _NL_CURRENT || (USE_C_LOCALE && !HAVE_STRFTIME_L) + cpy (ap_len, ampm); + break; +#else + goto underlying_strftime; +#endif + + case L_('q'): /* GNU extension. */ + DO_SIGNED_NUMBER (1, false, ((tp->tm_mon * 11) >> 5) + 1); + + case L_('R'): + subfmt = L_("%H:%M"); + goto subformat; + + case L_('r'): +#ifdef _NL_CURRENT + if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, + NLW(T_FMT_AMPM))) + == L_('\0')) + subfmt = L_("%I:%M:%S %p"); + goto subformat; +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + subfmt = L_("%I:%M:%S %p"); + goto subformat; +#elif (defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ + /* macOS, FreeBSD strftime() may produce empty output for "%r". */ + subfmt = L_("%I:%M:%S %p"); + goto subformat; +#else + goto underlying_strftime; +#endif + + case L_('S'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_sec); + + case L_('s'): /* GNU extension. */ + { + struct tm ltm; + time_t t; + + ltm = *tp; + ltm.tm_yday = -1; + t = mktime_z (tz, <m); + if (ltm.tm_yday < 0) + { + errno = EOVERFLOW; + return 0; + } + + /* Generate string value for T using time_t arithmetic; + this works even if sizeof (long) < sizeof (time_t). */ + + bufp = buf + sizeof (buf) / sizeof (buf[0]); + negative_number = t < 0; + + do + { + int d = t % 10; + t /= 10; + *--bufp = (negative_number ? -d : d) + L_('0'); + } + while (t != 0); + + digits = 1; + always_output_a_sign = false; + goto do_number_sign_and_padding; + } + + case L_('X'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == L_('E') + && (*(subfmt = + (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT))) + != L_('\0')))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT)); + goto subformat; +#elif USE_C_LOCALE && !HAVE_STRFTIME_L + subfmt = L_("%H:%M:%S"); + goto subformat; +#else + goto underlying_strftime; +#endif + case L_('T'): + subfmt = L_("%H:%M:%S"); + goto subformat; + + case L_('t'): + add1 (L_('\t')); + break; + + case L_('u'): + DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); + + case L_('U'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); + + case L_('V'): + case L_('g'): + case L_('G'): + if (modifier == L_('E')) + goto bad_format; + { + /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE) + is a leap year, except that YEAR and YEAR - 1 both work + correctly even when (tp->tm_year + TM_YEAR_BASE) would + overflow. */ + int year = (tp->tm_year + + (tp->tm_year < 0 + ? TM_YEAR_BASE % 400 + : TM_YEAR_BASE % 400 - 400)); + int year_adjust = 0; + int days = iso_week_days (tp->tm_yday, tp->tm_wday); + + if (days < 0) + { + /* This ISO week belongs to the previous year. */ + year_adjust = -1; + days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)), + tp->tm_wday); + } + else + { + int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), + tp->tm_wday); + if (0 <= d) + { + /* This ISO week belongs to the next year. */ + year_adjust = 1; + days = d; + } + } + + switch (*f) + { + case L_('g'): + { + int yy = (tp->tm_year % 100 + year_adjust) % 100; + DO_YEARISH (2, false, + (0 <= yy + ? yy + : tp->tm_year < -TM_YEAR_BASE - year_adjust + ? -yy + : yy + 100)); + } + + case L_('G'): + DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE - year_adjust, + (tp->tm_year + (unsigned int) TM_YEAR_BASE + + year_adjust)); + + default: + DO_NUMBER (2, days / 7 + 1); + } + } + + case L_('W'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); + + case L_('w'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (1, tp->tm_wday); + + case L_('Y'): + if (modifier == L_('E')) + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); + if (era) + { +# ifdef COMPILE_WIDE + subfmt = era->era_wformat; +# else + subfmt = era->era_format; +# endif + if (pad == 0) + pad = yr_spec; + goto subformat; + } +#elif USE_C_LOCALE && !HAVE_STRFTIME_L +#else + goto underlying_strftime; +#endif + } + if (modifier == L_('O')) + goto bad_format; + + DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE, + tp->tm_year + (unsigned int) TM_YEAR_BASE); + + case L_('y'): + if (modifier == L_('E')) + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); + if (era) + { + int delta = tp->tm_year - era->start_date[0]; + if (pad == 0) + pad = yr_spec; + DO_NUMBER (2, (era->offset + + delta * era->absolute_direction)); + } +#elif USE_C_LOCALE && !HAVE_STRFTIME_L +#else + goto underlying_strftime; +#endif + } + + { + int yy = tp->tm_year % 100; + if (yy < 0) + yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100; + DO_YEARISH (2, false, yy); + } + + case L_('Z'): + if (change_case) + { + to_uppcase = false; + to_lowcase = true; + } + +#ifdef COMPILE_WIDE + { + /* The zone string is always given in multibyte form. We have + to convert it to wide character. */ + size_t w = pad == L_('-') || width < 0 ? 0 : width; + char const *z = zone; + mbstate_t st = {0}; + size_t len = __mbsrtowcs_l (p, &z, maxsize - i, &st, loc); + if (len == (size_t) -1) + return 0; + size_t incr = len < w ? w : len; + if (incr >= maxsize - i) + { + errno = ERANGE; + return 0; + } + if (p) + { + if (len < w) + { + size_t delta = w - len; + __wmemmove (p + delta, p, len); + wchar_t wc = pad == L_('0') || pad == L_('+') ? L'0' : L' '; + wmemset (p, wc, delta); + } + p += incr; + } + i += incr; + } +#else + cpy (strlen (zone), zone); +#endif + break; + + case L_(':'): + /* :, ::, and ::: are valid only just before 'z'. + :::: etc. are rejected later. */ + for (colons = 1; f[colons] == L_(':'); colons++) + continue; + if (f[colons] != L_('z')) + goto bad_format; + f += colons; + goto do_z_conversion; + + case L_('z'): + colons = 0; + + do_z_conversion: + if (tp->tm_isdst < 0) + break; + + { + int diff; + int hour_diff; + int min_diff; + int sec_diff; +#if HAVE_TM_GMTOFF + diff = tp->tm_gmtoff; +#else + if (!tz) + diff = 0; + else + { + struct tm gtm; + struct tm ltm; + time_t lt; + + /* POSIX.1 requires that local time zone information be used as + though strftime called tzset. */ +# ifndef my_strftime + if (!*tzset_called) + { + tzset (); + *tzset_called = true; + } +# endif + + ltm = *tp; + ltm.tm_wday = -1; + lt = mktime_z (tz, <m); + if (ltm.tm_wday < 0 || ! localtime_rz (0, <, >m)) + break; + diff = tm_diff (<m, >m); + } +#endif + + negative_number = diff < 0 || (diff == 0 && *zone == '-'); + hour_diff = diff / 60 / 60; + min_diff = diff / 60 % 60; + sec_diff = diff % 60; + + switch (colons) + { + case 0: /* +hhmm */ + DO_TZ_OFFSET (5, 0, hour_diff * 100 + min_diff); + + case 1: tz_hh_mm: /* +hh:mm */ + DO_TZ_OFFSET (6, 04, hour_diff * 100 + min_diff); + + case 2: tz_hh_mm_ss: /* +hh:mm:ss */ + DO_TZ_OFFSET (9, 024, + hour_diff * 10000 + min_diff * 100 + sec_diff); + + case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */ + if (sec_diff != 0) + goto tz_hh_mm_ss; + if (min_diff != 0) + goto tz_hh_mm; + DO_TZ_OFFSET (3, 0, hour_diff); + + default: + goto bad_format; + } + } + + case L_('\0'): /* GNU extension: % at end of format. */ + bad_percent: + --f; + FALLTHROUGH; + default: + /* Unknown format; output the format, including the '%', + since this is most likely the right thing to do if a + multibyte string has been misparsed. */ + bad_format: + cpy (f - percent + 1, percent); + break; + } + } + +#if ! FPRINTFTIME + if (p && maxsize != 0) + *p = L_('\0'); +#endif + + errno = saved_errno; + return i; +} diff --git a/lib/strftime.h b/lib/strftime.h index d6efdb848a3..8ce62cdb6d7 100644 --- a/lib/strftime.h +++ b/lib/strftime.h @@ -21,17 +21,68 @@ extern "C" { #endif -/* Just like strftime, but with two more arguments: - POSIX requires that strftime use the local timezone information. - Use the timezone __TZ instead. Use __NS as the number of - nanoseconds in the %N directive. +/* Formats the broken-down time *__TP, with additional __NS nanoseconds, + into the buffer __S of size __MAXSIZE, according to the rules of the + LC_TIME category of the current locale. - On error, set errno and return 0. Otherwise, return the number of - bytes generated (not counting the trailing NUL), preserving errno - if the number is 0. This errno behavior is in draft POSIX 202x - plus some requested changes to POSIX. */ -size_t nstrftime (char *restrict, size_t, char const *, struct tm const *, - timezone_t __tz, int __ns); + Uses the time zone __TZ. + If *__TP represents local time, __TZ should be set to + tzalloc (getenv ("TZ")). + If *__TP represents universal time (a.k.a. GMT), __TZ should be set to + (timezone_t) 0. + + The format string __FORMAT, including GNU extensions, is described in + the GNU libc's strftime() documentation: + + Additionally, the following conversion is supported: + %N The number of nanoseconds, passed as __NS argument. + Here's a summary of the available conversions (= format directives): + literal characters %n %t %% + date: + century %C + year %Y %y + week-based year %G %g + month (in year) %m %B %b %h + week in year %U %W %V + day in year %j + day (in month) %d %e + day in week %u %w %A %a + year, month, day %x %F %D + time: + half-day %p %P + hour %H %k %I %l + minute (in hour) %M + hour, minute %R + second (in minute) %S + hour, minute, second %r %T %X + second (since epoch) %s + date and time: %c + time zone: %z %Z + nanosecond %N + + Stores the result, as a string with a trailing NUL character, at the + beginning of the array __S[0..__MAXSIZE-1], if it fits, and returns + the length of that string, not counting the trailing NUL. In this case, + errno is preserved if the return value is 0. + If it does not fit, this function sets errno to ERANGE and returns 0. + Upon other errors, this function sets errno and returns 0 as well. + + Note: The errno behavior is in draft POSIX 202x plus some requested + changes to POSIX. + + This function is like strftime, but with two more arguments: + * __TZ instead of the local timezone information, + * __NS as the number of nanoseconds in the %N directive. + */ +size_t nstrftime (char *restrict __s, size_t __maxsize, + char const *__format, + struct tm const *__tp, timezone_t __tz, int __ns); + +/* Like nstrftime, except that it uses the "C" locale instead of the + current locale. */ +size_t c_nstrftime (char *restrict __s, size_t __maxsize, + char const *__format, + struct tm const *__tp, timezone_t __tz, int __ns); #ifdef __cplusplus } diff --git a/lib/time.in.h b/lib/time.in.h index ce28f1af25d..df99c8abca9 100644 --- a/lib/time.in.h +++ b/lib/time.in.h @@ -438,11 +438,7 @@ _GL_CXXALIAS_SYS (ctime, char *, (time_t const *__tp)); _GL_CXXALIASWARN (ctime); # endif # elif defined GNULIB_POSIXCHECK -# undef ctime -# if HAVE_RAW_DECL_CTIME -_GL_WARN_ON_USE (ctime, "ctime has portability problems - " - "use gnulib module ctime for portability"); -# endif +/* No need to warn about portability, as a more serious warning is below. */ # endif /* Convert *TP to a date and time string. See diff --git a/lib/time_r.c b/lib/time_r.c index 3ef0b36802c..b724f3b38de 100644 --- a/lib/time_r.c +++ b/lib/time_r.c @@ -21,6 +21,11 @@ #include +/* The replacement functions in this file are only used on native Windows. + They are multithread-safe, because the gmtime() and localtime() functions + on native Windows — both in the ucrt and in the older MSVCRT — return a + pointer to a 'struct tm' in thread-local memory. */ + static struct tm * copy_tm_result (struct tm *dest, struct tm const *src) { diff --git a/lib/warn-on-use.h b/lib/warn-on-use.h index 8f4d40dcbeb..701013a07f4 100644 --- a/lib/warn-on-use.h +++ b/lib/warn-on-use.h @@ -32,6 +32,10 @@ _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline' linkage. + _GL_WARN_ON_USE should not be used more than once for a given function + in a given compilation unit (because this may generate a warning even + if the function is never called). + However, one of the reasons that a function is a portability trap is if it has the wrong signature. Declaring FUNCTION with a different signature in C is a compilation error, so this macro must use the diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h index 0b7bb2cee85..7f30f83e769 100644 --- a/lib/xalloc-oversized.h +++ b/lib/xalloc-oversized.h @@ -29,8 +29,7 @@ is SIZE_MAX - 1. */ #define __xalloc_oversized(n, s) \ ((s) != 0 \ - && ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) \ - < (n))) + && (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n)) /* Return 1 if and only if an array of N objects, each of size S, cannot exist reliably because its total size in bytes would exceed diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index 00691c0d6c3..d8d0904f787 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -1,4 +1,4 @@ -# gnulib-common.m4 serial 91 +# gnulib-common.m4 serial 92 dnl Copyright (C) 2007-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -76,42 +76,48 @@ AC_DEFUN([gl_COMMON_BODY], [ #endif]) AH_VERBATIM([attribute], [/* Attributes. */ -#if (defined __has_attribute \ - && (!defined __clang_minor__ \ - || (defined __apple_build_version__ \ - ? 7000000 <= __apple_build_version__ \ - : 5 <= __clang_major__))) -# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__) -#else -# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr -# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3) -# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2) -# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3) -# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3) -# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95) -# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1) -# define _GL_ATTR_diagnose_if 0 -# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3) -# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1) -# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0) -# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7) -# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6) -# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0) -# ifdef _ICC -# define _GL_ATTR_may_alias 0 +/* Define _GL_HAS_ATTRIBUTE only once, because on FreeBSD, with gcc < 5, if + gets included once again after , __has_attribute(x) + expands to 0 always, and redefining _GL_HAS_ATTRIBUTE would turn off all + attributes. */ +#ifndef _GL_HAS_ATTRIBUTE +# if (defined __has_attribute \ + && (!defined __clang_minor__ \ + || (defined __apple_build_version__ \ + ? 7000000 <= __apple_build_version__ \ + : 5 <= __clang_major__))) +# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__) # else -# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3) +# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr +# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3) +# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2) +# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3) +# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3) +# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95) +# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1) +# define _GL_ATTR_diagnose_if 0 +# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3) +# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1) +# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0) +# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7) +# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6) +# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0) +# ifdef _ICC +# define _GL_ATTR_may_alias 0 +# else +# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3) +# endif +# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1) +# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3) +# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0) +# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) +# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) +# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) +# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) +# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) +# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) +# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) # endif -# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1) -# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3) -# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0) -# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) -# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) -# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) -# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) -# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) -# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) -# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) #endif /* Use __has_c_attribute if available. However, do not use with diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index 7a7ebb0f34e..d8b92e7b122 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -1024,7 +1024,7 @@ AC_DEFUN([gl_INIT], if test $ac_use_included_regex = yes; then func_gl_gnulib_m4code_fd38c7e463b54744b77b98aeafb4fa7c fi - if { test $HAVE_DECL_STRTOIMAX = 0 || test $REPLACE_STRTOIMAX = 1; } && test $ac_cv_type_long_long_int = yes; then + if test $HAVE_DECL_STRTOIMAX = 0 || test $REPLACE_STRTOIMAX = 1; then func_gl_gnulib_m4code_strtoll fi if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then @@ -1422,6 +1422,7 @@ AC_DEFUN([gl_FILE_LIST], [ lib/stdlib.in.h lib/stpcpy.c lib/str-two-way.h + lib/strftime.c lib/strftime.h lib/string.in.h lib/strnlen.c diff --git a/m4/nanosleep.m4 b/m4/nanosleep.m4 index c51f590402f..ff730b676cd 100644 --- a/m4/nanosleep.m4 +++ b/m4/nanosleep.m4 @@ -1,4 +1,4 @@ -# serial 46 +# serial 47 dnl From Jim Meyering. dnl Check for the nanosleep function. @@ -119,6 +119,10 @@ AC_DEFUN([gl_FUNC_NANOSLEEP], # Guess it halfway works when the kernel is Linux. linux*) gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;; + # Midipix generally emulates the Linux system calls, + # but here it handles large arguments correctly. + midipix*) + gl_cv_func_nanosleep='guessing yes' ;; # Guess no on native Windows. mingw* | windows*) gl_cv_func_nanosleep='guessing no' ;; diff --git a/m4/nstrftime.m4 b/m4/nstrftime.m4 index 67250dc9455..aa5d63a54b5 100644 --- a/m4/nstrftime.m4 +++ b/m4/nstrftime.m4 @@ -1,4 +1,4 @@ -# serial 37 +# serial 38 # Copyright (C) 1996-1997, 1999-2007, 2009-2024 Free Software Foundation, Inc. # @@ -16,7 +16,4 @@ AC_DEFUN([gl_FUNC_GNU_STRFTIME], AC_REQUIRE([AC_STRUCT_TIMEZONE]) AC_REQUIRE([gl_TM_GMTOFF]) - - AC_DEFINE([my_strftime], [nstrftime], - [Define to the name of the strftime replacement function.]) ]) diff --git a/m4/utimens.m4 b/m4/utimens.m4 index af03e6b52be..0f5bfd4c843 100644 --- a/m4/utimens.m4 +++ b/m4/utimens.m4 @@ -3,7 +3,7 @@ dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. -dnl serial 15 +dnl serial 16 AC_DEFUN([gl_UTIMENS], [ @@ -36,12 +36,13 @@ AC_DEFUN([gl_UTIMENS], [gl_cv_func_futimesat_works=yes], [gl_cv_func_futimesat_works=no], [case "$host_os" in - # Guess yes on Linux systems. - linux-* | linux) gl_cv_func_futimesat_works="guessing yes" ;; - # Guess yes on glibc systems. - *-gnu*) gl_cv_func_futimesat_works="guessing yes" ;; - # If we don't know, obey --enable-cross-guesses. - *) gl_cv_func_futimesat_works="$gl_cross_guess_normal" ;; + # Guess yes on Linux systems + # and on systems that emulate the Linux system calls. + linux* | midipix*) gl_cv_func_futimesat_works="guessing yes" ;; + # Guess yes on glibc systems. + *-gnu*) gl_cv_func_futimesat_works="guessing yes" ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_futimesat_works="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.file]) diff --git a/m4/utimensat.m4 b/m4/utimensat.m4 index e595b333d17..4af7f6f81c8 100644 --- a/m4/utimensat.m4 +++ b/m4/utimensat.m4 @@ -1,4 +1,4 @@ -# serial 11 +# serial 12 # See if we need to provide utimensat replacement. dnl Copyright (C) 2009-2024 Free Software Foundation, Inc. @@ -83,6 +83,9 @@ AC_DEFUN([gl_FUNC_UTIMENSAT], # Guess yes on Linux or glibc systems. linux-* | linux | *-gnu* | gnu*) gl_cv_func_utimensat_works="guessing yes" ;; + # Guess yes on systems that emulate the Linux system calls. + midipix*) + gl_cv_func_utimensat_works="guessing yes" ;; # Guess 'nearly' on AIX. aix*) gl_cv_func_utimensat_works="guessing nearly" ;; From 783a511d1e31b5c9e5f9cb8ec27fd91d1b9078c9 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 15 Feb 2024 14:23:43 +0800 Subject: [PATCH 172/446] Handle /assets and /content file names in `android-browse-url' * lisp/net/browse-url.el (android-browse-url): New function. * lisp/term/android-win.el (android-browse-url-internal): Update function declaration. * src/androidselect.c (Fandroid_browse_url): Rename to... (Fandroid_browse_url_internal): ... this. (syms_of_androidselect): Adjust to match. --- lisp/net/browse-url.el | 2 +- lisp/term/android-win.el | 44 ++++++++++++++++++++++++++++++++++++++++ src/androidselect.c | 20 +++++++++++------- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el index bc2a7db9a8b..ddc57724343 100644 --- a/lisp/net/browse-url.el +++ b/lisp/net/browse-url.el @@ -1324,7 +1324,7 @@ and instant messengers instead of opening it in a web browser." :type 'boolean :version "30.1") -(declare-function android-browse-url "androidselect.c") +(declare-function android-browse-url "../term/android-win") ;;;###autoload (defun browse-url-default-android-browser (url &optional _new-window) diff --git a/lisp/term/android-win.el b/lisp/term/android-win.el index e0d252f17e0..b7b0920626e 100644 --- a/lisp/term/android-win.el +++ b/lisp/term/android-win.el @@ -479,6 +479,50 @@ the UTF-8 coding system." ;; Return the concatenation of both these values. (concat locale-base locale-modifier))) + +;; Miscellaneous functions. + +(declare-function android-browse-url-internal "androidselect.c") + +(defun android-browse-url (url &optional send) + "Open URL in an external application. + +URL should be a URL-encoded URL with a scheme specified unless +SEND is non-nil. Signal an error upon failure. + +If SEND is nil, start a program that is able to display the URL, +such as a web browser. Otherwise, try to share URL using +programs such as email clients. + +If URL is a file URI, convert it into a `content' address +accessible to other programs." + (when-let* ((uri (url-generic-parse-url url)) + (filename (url-filename uri)) + ;; If `uri' is a file URI and the file resides in /content + ;; or /assets, copy it to a temporary file before + ;; providing it to other programs. + (replacement-url (and (string-match-p + "/\\(content\\|assets\\)[/$]" + filename) + (prog1 t + (copy-file + filename + (setq filename + (make-temp-file + "local" + nil + (let ((extension + (file-name-extension + filename))) + (if extension + (concat "." + extension) + nil)))) + t)) + (concat "file://" filename)))) + (setq url replacement-url)) + (android-browse-url-internal url send)) + (provide 'android-win) ;; android-win.el ends here. diff --git a/src/androidselect.c b/src/androidselect.c index 5b23c559d2c..61f1c6045db 100644 --- a/src/androidselect.c +++ b/src/androidselect.c @@ -237,15 +237,21 @@ DEFUN ("android-clipboard-exists-p", Fandroid_clipboard_exists_p, return rc ? Qt : Qnil; } -DEFUN ("android-browse-url", Fandroid_browse_url, - Sandroid_browse_url, 1, 2, 0, - doc: /* Open URL in an external application. URL should be a -URL-encoded URL with a scheme specified unless SEND is non-nil. -Signal an error upon failure. +DEFUN ("android-browse-url-internal", Fandroid_browse_url_internal, + Sandroid_browse_url_internal, 1, 2, 0, + doc: /* Open URL in an external application. + +URL should be a URL-encoded URL with a scheme specified unless SEND is +non-nil. Signal an error upon failure. If SEND is nil, start a program that is able to display the URL, such as a web browser. Otherwise, try to share URL using programs such as -email clients. */) +email clients. + +If URL is a file URI, convert it into a `content' address accessible to +other programs. Files inside the /content or /assets directories cannot +be opened through such addresses, which this function does not provide +for. Use `android-browse-url' instead. */) (Lisp_Object url, Lisp_Object send) { Lisp_Object value; @@ -803,7 +809,7 @@ syms_of_androidselect (void) defsubr (&Sandroid_set_clipboard); defsubr (&Sandroid_get_clipboard); defsubr (&Sandroid_clipboard_exists_p); - defsubr (&Sandroid_browse_url); + defsubr (&Sandroid_browse_url_internal); defsubr (&Sandroid_get_clipboard_targets); defsubr (&Sandroid_get_clipboard_data); From 60cff1ac9d216e5abcb350ea5e623ab0b377c131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20Heggest=C3=B8yl?= Date: Tue, 16 Jan 2024 08:21:41 +0100 Subject: [PATCH 173/446] Add support for reading/writing IELM input history (bug#67000) * lisp/ielm.el (inferior-emacs-lisp-mode): Add support for saving input history to a file. (ielm--history-file-name): New variable indicating IELM input history file. (ielm--exit): Holds a function to call when Emacs is killed to write out the input history. (ielm--input-history-writer): Helper function for writing the IELM input history out to file. * lisp/comint.el (comint-input-ring-file-name): Improve defcustom tag. --- etc/NEWS | 8 ++++++++ lisp/comint.el | 2 +- lisp/ielm.el | 29 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index dc24d775bb1..5220a7fb337 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1357,6 +1357,14 @@ characters, such as ½ (U+00BD VULGAR FRACTION ONE HALF), are also recognized as rational fractions. They have been since 2004, but it looks like it was never mentioned in the NEWS, or even the manual. +** IELM + +--- +*** IELM now remembers input history between sessions. +The new user option 'ielm-history-file-name' is the name of the file +where IELM input history will be saved. Customize it to nil to revert +to the old behavior of not remembering input history between sessions. + * New Modes and Packages in Emacs 30.1 diff --git a/lisp/comint.el b/lisp/comint.el index 0a9cdb44bef..655ff30469c 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -254,7 +254,7 @@ This variable is buffer-local." See also `comint-read-input-ring' and `comint-write-input-ring'. `comint-mode' makes this a buffer-local variable. You probably want to set this in a mode hook, rather than customize the default value." - :type '(choice (const :tag "nil" nil) + :type '(choice (const :tag "Disable input history" nil) file) :group 'comint) diff --git a/lisp/ielm.el b/lisp/ielm.el index 777aebb70cf..e583e0fe32c 100644 --- a/lisp/ielm.el +++ b/lisp/ielm.el @@ -110,6 +110,13 @@ This gives more frame width for large indented sexps, and allows functions such as `edebug-defun' to work with such inputs." :type 'boolean) +(defcustom ielm-history-file-name + (locate-user-emacs-file "ielm-history.eld") + "If non-nil, name of the file to read/write IELM input history." + :type '(choice (const :tag "Disable input history" nil) + file) + :version "30.1") + (defvaralias 'inferior-emacs-lisp-mode-hook 'ielm-mode-hook) (defcustom ielm-mode-hook nil "Hooks to be run when IELM (`inferior-emacs-lisp-mode') is started." @@ -503,6 +510,17 @@ behavior of the indirect buffer." (funcall pp-default-function beg end) end)) +;;; Input history + +(defvar ielm--exit nil + "Function to call when Emacs is killed.") + +(defun ielm--input-history-writer (buf) + "Return a function writing IELM input history to BUF." + (lambda () + (with-current-buffer buf + (comint-write-input-ring)))) + ;;; Major mode (define-derived-mode inferior-emacs-lisp-mode comint-mode "IELM" @@ -605,6 +623,17 @@ Customized bindings may be defined in `ielm-map', which currently contains: #'ielm-indirect-setup-hook 'append t) (setq comint-indirect-setup-function #'emacs-lisp-mode) + ;; Input history + (setq-local comint-input-ring-file-name ielm-history-file-name) + (setq-local ielm--exit (ielm--input-history-writer (current-buffer))) + (setq-local kill-buffer-hook + (lambda () + (funcall ielm--exit) + (remove-hook 'kill-emacs-hook ielm--exit))) + (unless noninteractive + (add-hook 'kill-emacs-hook ielm--exit)) + (comint-read-input-ring t) + ;; A dummy process to keep comint happy. It will never get any input (unless (comint-check-proc (current-buffer)) ;; Was cat, but on non-Unix platforms that might not exist, so From 3d6137116f6be8ee38f9f49c9811b97ef92e0e58 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 15 Feb 2024 12:04:07 +0200 Subject: [PATCH 174/446] Allow font-spec in 'face-font-rescale-alist' set at startup * lisp/startup.el (startup--rescale-elt-match-p): New function. (normal-top-level): Use it, instead of the naive 'string-match-p', to match the default font against the elements of 'face-font-rescale-alist'. Reported by Rahguzar . --- lisp/startup.el | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lisp/startup.el b/lisp/startup.el index 773765a4b97..1c21b5de857 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -556,6 +556,17 @@ the updated value." (setq startup--original-eln-load-path (copy-sequence native-comp-eln-load-path)))) +(defun startup--rescale-elt-match-p (font-pattern font-object) + "Test whether FONT-OBJECT matches an element of `face-font-rescale-alist'. +FONT-OBJECT is a font-object that specifies a font to test. +FONT-PATTERN is the car of an element of `face-font-rescale-alist', +which can be either a regexp matching a font name or a font-spec." + (if (stringp font-pattern) + ;; FONT-PATTERN is a regexp, we need the name of FONT-OBJECT to match. + (string-match-p font-pattern (font-xlfd-name font-object)) + ;; FONT-PATTERN is a font-spec. + (font-match-p font-pattern font-object))) + (defvar android-fonts-enumerated nil "Whether or not fonts have been enumerated already. On Android, Emacs uses this variable internally at startup.") @@ -816,8 +827,9 @@ It is the default value of the variable `top-level'." (when (and (display-multi-font-p) (not (eq face-font-rescale-alist old-face-font-rescale-alist)) - (assoc (font-xlfd-name (face-attribute 'default :font)) - face-font-rescale-alist #'string-match-p)) + (assoc (face-attribute 'default :font) + face-font-rescale-alist + #'startup--rescale-elt-match-p)) (set-face-attribute 'default nil :font (font-spec))) ;; Modify the initial frame based on what .emacs puts into From e058380324e462c234bb3407d504807f22d825b0 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 15 Feb 2024 22:11:14 +0800 Subject: [PATCH 175/446] Fix the MS-DOS build * configure.ac (REQUIRE_GNUISH_STRFTIME_AM_PM): Move definition to... * src/conf_post.h (REQUIRE_GNUISH_STRFTIME_AM_PM): ...conf_post.h. --- configure.ac | 2 -- src/conf_post.h | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index c162f880e48..847fdbd54d2 100644 --- a/configure.ac +++ b/configure.ac @@ -1566,8 +1566,6 @@ AC_DEFUN([gt_TYPE_WINT_T], AC_DEFUN_ONCE([gl_STDLIB_H], [AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_NEXT_HEADERS([stdlib.h])]) -AC_DEFINE([REQUIRE_GNUISH_STRFTIME_AM_PM], [false], - [Emacs does not need glibc strftime behavior for AM and PM indicators.]) # Initialize gnulib right after choosing the compiler. dnl Amongst other things, this sets AR and ARFLAGS. diff --git a/src/conf_post.h b/src/conf_post.h index 83a0dd1b09b..f2353803074 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -471,3 +471,7 @@ extern int emacs_setenv_TZ (char const *); #undef MB_CUR_MAX #define MB_CUR_MAX REPLACEMENT_MB_CUR_MAX #endif /* REPLACEMENT_MB_CUR_MAX */ + +/* Emacs does not need glibc strftime behavior for AM and PM + indicators. */ +#define REQUIRE_GNUISH_STRFTIME_AM_PM false From 8a63e50036f0d4284f21660efb5dd20b63748d1b Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 16:08:00 +0100 Subject: [PATCH 176/446] * Define 'cl--type-hierarchy' and compute 'cl--typeof-types' from it * lisp/emacs-lisp/cl-preloaded.el (cl--type-hierarchy) (cl--direct-supertypes-of-type, cl--direct-subtypes-of-type): Define. (cl--typeof-types): Compute automatically. (cl--supertypes-for-typeof-types): New function. --- lisp/emacs-lisp/cl-preloaded.el | 97 ++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 33 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 20e68555578..248c1fd7c24 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -50,44 +50,75 @@ (apply #'error string (append sargs args)) (signal 'cl-assertion-failed `(,form ,@sargs))))) -(defconst cl--typeof-types - ;; Hand made from the source code of `type-of'. - '((integer number integer-or-marker number-or-marker atom) - (symbol-with-pos symbol atom) (symbol atom) (string array sequence atom) - (cons list sequence) - ;; Markers aren't `numberp', yet they are accepted wherever integers are - ;; accepted, pretty much. - (marker integer-or-marker number-or-marker atom) - (overlay atom) (float number number-or-marker atom) - (window-configuration atom) (process atom) (window atom) - ;; FIXME: We'd want to put `function' here, but that's only true - ;; for those `subr's which aren't special forms! - (subr atom) - ;; FIXME: We should probably reverse the order between - ;; `compiled-function' and `byte-code-function' since arguably - ;; `subr' is also "compiled functions" but not "byte code functions", - ;; but it would require changing the value returned by `type-of' for - ;; byte code objects, which risks breaking existing code, which doesn't - ;; seem worth the trouble. - (compiled-function byte-code-function function atom) - (module-function function atom) - (buffer atom) (char-table array sequence atom) - (bool-vector array sequence atom) - (frame atom) (hash-table atom) (terminal atom) - (thread atom) (mutex atom) (condvar atom) - (font-spec atom) (font-entity atom) (font-object atom) - (vector array sequence atom) - (user-ptr atom) - (tree-sitter-parser atom) - (tree-sitter-node atom) - (tree-sitter-compiled-query atom) - ;; Plus, really hand made: - (null symbol list sequence atom)) + +(defconst cl--type-hierarchy + ;; Please run `sycdoc-update-type-hierarchy' in + ;; etc/syncdoc-type-hierarchy.el each time this is updated to + ;; reflect in the documentation. + '((t sequence atom) + (sequence list array) + (atom + class structure tree-sitter-compiled-query tree-sitter-node + tree-sitter-parser user-ptr font-object font-entity font-spec + condvar mutex thread terminal hash-table frame buffer function + window process window-configuration overlay integer-or-marker + number-or-marker symbol array) + (number float integer) + (number-or-marker marker number) + (integer bignum fixum) + (symbol keyword boolean symbol-with-pos) + (array vector bool-vector char-table string) + (list null cons) + (integer-or-marker integer marker) + (compiled-function byte-code-function) + (function subr module-function compiled-function) + (boolean null) + (subr subr-native-elisp subr-primitive) + (symbol-with-pos keyword)) + "List of lists describing all the edges of the builtin type +hierarchy. +Each sublist is in the form (TYPE . DIRECT_SUBTYPES)" + ;; Given type hierarchy is a DAG (but mostly a tree) I believe this + ;; is the most compact way to express it. + ) + +(defconst cl--direct-supertypes-of-type + (make-hash-table :test #'eq) + "Hash table TYPE -> SUPERTYPES.") + +(defconst cl--direct-subtypes-of-type + (make-hash-table :test #'eq) + "Hash table TYPE -> SUBTYPES.") + +(cl-loop for (parent . children) in cl--type-hierarchy + do (cl-loop + for child in children + do (cl-pushnew parent (gethash child cl--direct-supertypes-of-type)) + do (cl-pushnew child (gethash parent cl--direct-subtypes-of-type)))) + +(defconst cl--typeof-types nil "Alist of supertypes. Each element has the form (TYPE . SUPERTYPES) where TYPE is one of the symbols returned by `type-of', and SUPERTYPES is the list of its supertypes from the most specific to least specific.") +(defun cl--supertypes-for-typeof-types (type) + (cl-loop with res = () + with agenda = (list type) + while agenda + for element = (car agenda) + unless (or (eq element t) ;; no t in `cl--typeof-types'. + (memq element res)) + append (list element) into res + do (cl-loop for c in (gethash element cl--direct-supertypes-of-type) + do (setq agenda (append agenda (list c)))) + do (setq agenda (cdr agenda)) + finally (cl-return res))) + +(maphash (lambda (type _) + (push (cl--supertypes-for-typeof-types type) cl--typeof-types)) + cl--direct-supertypes-of-type) + (defconst cl--all-builtin-types (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) From 3211825fe7cab2c330d703a9e77090d551854d53 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 16:09:07 +0100 Subject: [PATCH 177/446] Generate automatically graphical and textual type hierarchy representation * etc/syncdoc-type-hierarchy.el: New file. * doc/lispref/type_hierarchy.txt: Likewise. * doc/lispref/type_hierarchy.jpg: Likewise. --- doc/lispref/type_hierarchy.jpg | Bin 0 -> 217746 bytes doc/lispref/type_hierarchy.txt | 147 +++++++++++++++++++++++++++++++++ etc/syncdoc-type-hierarchy.el | 72 ++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 doc/lispref/type_hierarchy.jpg create mode 100644 doc/lispref/type_hierarchy.txt create mode 100644 etc/syncdoc-type-hierarchy.el diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/type_hierarchy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b551b5f01e8ff1b704d3cc53a42aa4a95449a4a GIT binary patch literal 217746 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%0ApZ4RXDeuwjCt_k&w_Tix>TZ}Mr|jX&2|Kh5{~ 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

hYPyq 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®pn=M1IqP4GX` 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 literal 0 HcmV?d00001 diff --git a/doc/lispref/type_hierarchy.txt b/doc/lispref/type_hierarchy.txt new file mode 100644 index 00000000000..c6e762b04a8 --- /dev/null +++ b/doc/lispref/type_hierarchy.txt @@ -0,0 +1,147 @@ + +--------------------+ + | bignum | + +--------------------+ + | + | + v + +-------------+ +--------------------+ +----------------------+ +--------+ + | fixum | --> | integer | --> | integer-or-marker | <-- | marker | + +-------------+ +--------------------+ +----------------------+ +--------+ + | | | + | | | + v | | + +-------------+ +--------------------+ | | + | float | --> | number | | | + +-------------+ +--------------------+ | | + | | | + | | | + v | | + +--------------------+ | | +------------------+ +--------------------+ +----------+ +--------+ + | number-or-marker | <-----+----------------------------+ | tree-sitter-node | | tree-sitter-parser | | user-ptr | | window | + +--------------------+ | +------------------+ +--------------------+ +----------+ +--------+ + | | | | | | + | | | | | | + v v v v v v + +-------------+ +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +----------------------------+ + | font-entity | --> | | <-- | overlay | + +-------------+ | | +----------------------------+ + +-------------+ | | +----------------------------+ + | font-object | --> | | <-- | process | + +-------------+ | | +----------------------------+ + +-------------+ | | +----------------------------+ + | font-spec | --> | | <-- | structure | + +-------------+ | atom | +----------------------------+ + +-------------+ | | +----------------------------+ + | frame | --> | | <-- | terminal | + +-------------+ | | +----------------------------+ + +-------------+ | | +----------------------------+ + | hash-table | --> | | <-- | thread | + +-------------+ | | +----------------------------+ + +-------------+ | | +----------------------------+ + | mutex | --> | | <-- | tree-sitter-compiled-query | + +-------------+ +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +----------------------------+ + | ^ ^ ^ ^ ^ ^ ^ + | | | | | | | | + v | | | | | | | + +--------------------+ | +----------------------+ | | +--------+ +-------+ +---------+ + +--------------------> | t | | | window-configuration | | | | buffer | | class | | condvar | + | +--------------------+ | +----------------------+ | | +--------+ +-------+ +---------+ + | +--------------------+ | | | + | | byte-code-function | | | | + | +--------------------+ | | | + | | | | | + | | | | | + | v | | | + | +--------------------+ | | | + | | compiled-function | | | | + | +--------------------+ | | | + | | | | | + | | | | | + | v | | | + | +--------------------+ | | | + | +> | function | -+ | | + | | +--------------------+ | | + | | ^ | | + | | +--------------------------------------------------+--------------+------------------------+ + | | | | | + | | +--------------------+ | | | + | | | subr-primitive | | | | + | | +--------------------+ | | | + | | | | | | + | | | | | | + | | v | | | + | | +--------------------+ | | | + | +- | subr | <-----------------------------+----+ | | + | +--------------------+ | | | | + | +--------------------+ | | | | + | | keyword | -+ | | | | + | +--------------------+ | | | | | + | | | | | | | + | | | | | | | + | v | | | | | + | +--------------------+ | | | | | + | | symbol-with-pos | | | | | | + | +--------------------+ | | | | | + | | | | | | | + | | +----+ | | | | + | v | | | | | + | +--------------------+ | | | | | + | +> | symbol | ------+-----------------------+ | | | + | | +--------------------+ | | | | + | | ^ | | | | + | | +--------------------------+ | | | + | | | | | + | | +--------------------+ | | | + | | | null | -+ | | | + | | +--------------------+ | | | | + | | | | | | | + | | | | | | | + | | v | | | | + | | +--------------------+ | | | | + | +- | boolean | | | | | + | +--------------------+ | | | | + | +--------------------+ | | | | + | | cons | | | | | + | +--------------------+ | | | | + | | | | | | + | | | | | | + | v | | | | + | +--------------------+ | | | | + | | list | <+ | | | + | +--------------------+ | | | + | | | | | + | | | | | + | v | | | + | +--------------------+ | | | + +--------------------- | sequence | | | | + +--------------------+ | | | + ^ | | | + +------------------------+ | | | + | | | | + | +--------------------+ | | | + | | subr-native-elisp | -----------------------------------+ | | + | +--------------------+ | | + | | | + | +-------------------------------------------+ | + | | | + | +--------------------+ | | + | | bool-vector | | | + | +--------------------+ | | + | | | | + | | | | + | v | | + | +-------------+ +-------------------------------------------------+ | + | | string | --> | array | | + | +-------------+ +-------------------------------------------------+ | + | ^ | ^ | + | | | | | + | | | | | + | +--------------------+ | +----------------------+ | + | | vector | | | char-table | | + | +--------------------+ | +----------------------+ | + | | | + +----------------------------------------------+ | + | + +--------------------+ | + | module-function | ----------------------------------------------------------------------+ + +--------------------+ diff --git a/etc/syncdoc-type-hierarchy.el b/etc/syncdoc-type-hierarchy.el new file mode 100644 index 00000000000..eebb092abae --- /dev/null +++ b/etc/syncdoc-type-hierarchy.el @@ -0,0 +1,72 @@ +;;; syncdoc-type-hierarchy.el--- -*- lexical-binding: t -*- + +;; Copyright (C) 2023-2024 Free Software Foundation, Inc. + +;; Author: Andrea Corallo +;; Keywords: documentation + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This file is used to keep the type hierarchy representation present +;; in the elisp manual in sync with the current type hierarchy. This +;; is specified in `cl--type-hierarchy' in cl-preloaded.el, so each +;; time `cl--type-hierarchy' is modified +;; `syncdoc-update-type-hierarchy' must be run before the +;; documentation is regenerated. + +;; We do not call this directly from make docs in order not to add a +;; dependency on the tools "dot" and "graph-easy". + +;;; Code: + +(require 'cl-lib) + +(eval-and-compile + (defconst syncdoc-lispref-dir (concat (file-name-directory + (or load-file-name + buffer-file-name)) + "../doc/lispref/"))) + +(defun syncdoc-insert-dot-content (rankdir) + (maphash (lambda (child parents) + (cl-loop for parent in parents + do (insert " \"" (symbol-name child) "\" -> \"" + (symbol-name parent) "\";\n"))) + cl--direct-supertypes-of-type) + (sort-lines nil (point-min) (point-max)) + + (goto-char (point-min)) + (insert "digraph {\n rankdir=\"" rankdir "\";\n") + (goto-char (point-max)) + (insert "}\n")) + +(defun syncdoc-update-type-hierarchy () + "Update the type hierarchy representation used by the elisp manual." + (interactive) + (with-temp-buffer + (syncdoc-insert-dot-content "LR") + (call-process-region nil nil "dot" t (current-buffer) nil "-Tjpg" "-o" + (expand-file-name "type_hierarchy.jpg" + syncdoc-lispref-dir))) + (with-temp-buffer + (syncdoc-insert-dot-content "TB") + (call-process-region nil nil "graph-easy" t (current-buffer) nil "--output" + (expand-file-name "type_hierarchy.txt" + syncdoc-lispref-dir)))) + +;;; syncdoc-type-hierarchy.el ends here From 74f060230f70ba986a1c78e4e0d1181492567597 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 16:10:59 +0100 Subject: [PATCH 178/446] * Add initial "Type Hierarchy" node to the elisp manual * doc/lispref/objects.texi (Lisp Data Types, Type Hierarchy): Add Type Hierarchy node. --- doc/lispref/objects.texi | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index b8fd5ed4345..18484bac368 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -60,6 +60,7 @@ to use these types can be found in later chapters. * Type Predicates:: Tests related to types. * Equality Predicates:: Tests of equality between any two objects. * Mutability:: Some objects should not be modified. +* Type Hierarchy:: Type Hierarchy. @end menu @node Printed Representation @@ -2493,3 +2494,23 @@ their components. For example, @code{(eq "abc" "abc")} returns literal @code{"abc"}, and returns @code{nil} if it creates two instances. Lisp programs should be written so that they work regardless of whether this optimization is in use. + +@node Type Hierarchy + +Lisp types are organized in a hierarchy, this means that types can +derive from other types. Objects of a type A (which derives from type +B) inherite all the charateristics of type B. This also means that +every objects of type A is at the same time of type B. + +Every type derives from type @code{t}. + +New types can be defined by the user through @code{defclass} or +@code{cl-defstruct}. + +The Lisp Type Hierarchy for primitive types can be represented as +follow: + +@image{type_hierarchy,,,,png} + +For example type @code{list} derives from (is a special kind of) type +@code{sequence} wich on itself derives from @code{t}. From aa849984896ce393afe92dd4fb7fbce494e131a4 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 16:13:16 +0100 Subject: [PATCH 179/446] * make use of 'cl--direct-supertypes-of-type' in the native-compiler * lisp/emacs-lisp/comp-cstr.el (comp--direct-supertypes): Use cl--direct-supertypes-of-type. --- lisp/emacs-lisp/comp-cstr.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 2984bedb1dd..0a8b3b7efb2 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -270,18 +270,19 @@ Return them as multiple value." (symbol-name y))) (defun comp--direct-supertypes (type) - "Return the direct supertypes of TYPE." - (let ((supers (comp-supertypes type))) - (cl-assert (eq type (car supers))) - (cl-loop - with notdirect = nil - with direct = nil - for parent in (cdr supers) - unless (memq parent notdirect) - do (progn - (push parent direct) - (setq notdirect (append notdirect (comp-supertypes parent)))) - finally return direct))) + (or + (gethash type cl--direct-supertypes-of-type) + (let ((supers (comp-supertypes type))) + (cl-assert (eq type (car supers))) + (cl-loop + with notdirect = nil + with direct = nil + for parent in (cdr supers) + unless (memq parent notdirect) + do (progn + (push parent direct) + (setq notdirect (append notdirect (comp-supertypes parent)))) + finally return direct)))) (defsubst comp-subtype-p (type1 type2) "Return t if TYPE1 is a subtype of TYPE2 or nil otherwise." From 4a0d430bdc3650ca3dfd8bdd14781764fbcbdc7e Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 17:48:43 +0100 Subject: [PATCH 180/446] Update some native comp tests * test/src/comp-tests.el (comp-tests-ret-type-spec-13) (comp-tests-ret-type-spec-35): Update. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-test-62) (comp-cstr-test-75): Likewise. --- test/lisp/emacs-lisp/comp-cstr-tests.el | 4 ++-- test/src/comp-tests.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/lisp/emacs-lisp/comp-cstr-tests.el b/test/lisp/emacs-lisp/comp-cstr-tests.el index edc70b12d4b..c3a7092819d 100644 --- a/test/lisp/emacs-lisp/comp-cstr-tests.el +++ b/test/lisp/emacs-lisp/comp-cstr-tests.el @@ -170,7 +170,7 @@ The arg is an alist of: type specifier -> expected type specifier." ;; 61 ((and atom (not symbol)) . atom) ;; 62 - ((and atom (not string)) . (or array sequence atom)) + ((and atom (not string)) . (or array atom)) ;; 63 Conservative ((and symbol (not (member foo))) . symbol) ;; 64 Conservative @@ -196,7 +196,7 @@ The arg is an alist of: type specifier -> expected type specifier." ;; 74 ((and boolean (or number marker)) . nil) ;; 75 - ((and atom (or number marker)) . number-or-marker) + ((and atom (or number marker)) . (or integer-or-marker number-or-marker)) ;; 76 ((and symbol (or number marker)) . nil) ;; 77 diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el index 54a9a6c11cc..8bfe939fb23 100644 --- a/test/src/comp-tests.el +++ b/test/src/comp-tests.el @@ -1022,7 +1022,7 @@ Return a list of results." (if (= x y) x 'foo)) - '(or (member foo) number-or-marker)) + '(or (member foo) number-or-marker integer-or-marker)) ;; 14 ((defun comp-tests-ret-type-spec-f (x) @@ -1162,7 +1162,7 @@ Return a list of results." ((defun comp-tests-ret-type-spec-f (x) (when (> x 1.0) x)) - '(or null number-or-marker)) + '(or null number-or-marker integer-or-marker)) ;; 36 ((defun comp-tests-ret-type-spec-f (x y) From 80dce18a393a3267b72901328bf24e518d0a6fc9 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 19:10:35 +0100 Subject: [PATCH 181/446] * lisp/emacs-lisp/cl-preloaded.el (cl--direct-subtypes-of-type): Remove. --- lisp/emacs-lisp/cl-preloaded.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 248c1fd7c24..323d826f323 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -86,15 +86,11 @@ Each sublist is in the form (TYPE . DIRECT_SUBTYPES)" (make-hash-table :test #'eq) "Hash table TYPE -> SUPERTYPES.") -(defconst cl--direct-subtypes-of-type - (make-hash-table :test #'eq) - "Hash table TYPE -> SUBTYPES.") - -(cl-loop for (parent . children) in cl--type-hierarchy - do (cl-loop - for child in children - do (cl-pushnew parent (gethash child cl--direct-supertypes-of-type)) - do (cl-pushnew child (gethash parent cl--direct-subtypes-of-type)))) +(cl-loop + for (parent . children) in cl--type-hierarchy + do (cl-loop + for child in children + do (cl-pushnew parent (gethash child cl--direct-supertypes-of-type)))) (defconst cl--typeof-types nil "Alist of supertypes. From 7b34bb5c928798e0d40fce062c1b6d4b2ce06979 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Thu, 15 Feb 2024 19:36:05 +0200 Subject: [PATCH 182/446] project-or-external-find-regexp: Fix the docstring * lisp/progmodes/project.el (project-or-external-find-regexp): Fix the docstring (bug#68958). --- lisp/progmodes/project.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 983c0ed2ac2..aa92a73336e 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -992,9 +992,7 @@ requires quoting, e.g. `\\[quoted-insert]'." ;;;###autoload (defun project-or-external-find-regexp (regexp) - "Find all matches for REGEXP in the project roots or external roots. -With \\[universal-argument] prefix, you can specify the file name -pattern to search for." + "Find all matches for REGEXP in the project roots or external roots." (interactive (list (project--read-regexp))) (require 'xref) (let* ((pr (project-current t)) From 4dbc3bbcc568182380d4646310a652285e210876 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 15 Feb 2024 19:17:07 +0100 Subject: [PATCH 183/446] ; * lisp/emacs-lisp/comp.el (comp--write-bytecode-file): Add comment. --- lisp/emacs-lisp/comp.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 6879e6aeeb9..593291a379e 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -3495,6 +3495,7 @@ last directory in `native-comp-eln-load-path')." else collect (byte-compile-file file)))) +;; In use by elisp-mode.el (defun comp--write-bytecode-file (eln-file) "After native compilation write the bytecode file for ELN-FILE. Make sure that eln file is younger than byte-compiled one and From cea72c1757cc45b42baf3a35fb4d963f3e722b9c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 15 Feb 2024 15:09:13 -0500 Subject: [PATCH 184/446] (tex-font-lock-keywords-1): Fix bug#68827 * lisp/textmodes/tex-mode.el (tex-font-lock-keywords-1): Don't apply `tex-verbatim` in comments. --- lisp/textmodes/tex-mode.el | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 8968d8ec23b..5c5ca573f38 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -514,14 +514,19 @@ An alternative value is \" . \", if you use a font with a narrow period." (inbraces-re (lambda (re) (concat "\\(?:[^{}\\]\\|\\\\.\\|" re "\\)"))) (arg (concat "{\\(" (funcall inbraces-re "{[^}]*}") "+\\)"))) - `( ;; Highlight $$math$$ and $math$. + `(;; Verbatim-like args. + ;; Do it first, because we don't want to highlight them + ;; in comments (bug#68827), but we do want to highlight them + ;; in $math$. + (,(concat slash verbish opt arg) 3 'tex-verbatim keep) + ;; Highlight $$math$$ and $math$. ;; This is done at the very beginning so as to interact with the other ;; keywords in the same way as comments and strings. (,(concat "\\$\\$?\\(?:[^$\\{}]\\|\\\\.\\|{" (funcall inbraces-re (concat "{" (funcall inbraces-re "{[^}]*}") "*}")) "*}\\)+\\$?\\$") - (0 'tex-math)) + (0 'tex-math keep)) ;; Heading args. (,(concat slash headings "\\*?" opt arg) ;; If ARG ends up matching too much (if the {} don't match, e.g.) @@ -543,8 +548,6 @@ An alternative value is \" . \", if you use a font with a narrow period." (,(concat slash variables " *" arg) 2 font-lock-variable-name-face) ;; Include args. (,(concat slash includes opt arg) 3 font-lock-builtin-face) - ;; Verbatim-like args. - (,(concat slash verbish opt arg) 3 'tex-verbatim t) ;; Definitions. I think. ("^[ \t]*\\\\def *\\\\\\(\\(\\w\\|@\\)+\\)" 1 font-lock-function-name-face)))) From 45f9af61b8ecbe500de915f63de53e9c598184b9 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Mon, 8 Jan 2024 19:38:33 +0100 Subject: [PATCH 185/446] Remove references to phst@google.com. I don't work for Google any more, so I'll use my private address going forward. * .mailmap: Remove references to phst@google.com. --- .mailmap | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.mailmap b/.mailmap index 8454eb9154c..5e733728b5a 100644 --- a/.mailmap +++ b/.mailmap @@ -143,8 +143,7 @@ Philip Kaludercic Philip Kaludercic Philip Kaludercic Philip Kaludercic -Philipp Stephani -Philipp Stephani Philipp Stephani +Philipp Stephani Phillip Lord Pierre Lorenzon Pieter van Oostrum From 572d58b5e8d0f1f1244b9ccab8f02c4f50ca8d12 Mon Sep 17 00:00:00 2001 From: Tomas Volf <~@wolfsden.cz> Date: Thu, 15 Feb 2024 18:23:23 -0800 Subject: [PATCH 186/446] When deleting output in Eshell, optionally add it to the kill ring. * lisp/eshell/esh-mode.el (eshell-kill-output): Rename to... (eshell-delete-output): ... this, for consistency with 'comint-mode', and accept KILL argument. Update callers. Copyright-paperwork-exempt: yes --- lisp/eshell/esh-mode.el | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el index fd279f61673..b15f99a0359 100644 --- a/lisp/eshell/esh-mode.el +++ b/lisp/eshell/esh-mode.el @@ -290,7 +290,7 @@ non-interactive sessions, such as when using `eshell-command'.") "C-e" #'eshell-show-maximum-output "C-f" #'eshell-forward-argument "C-m" #'eshell-copy-old-input - "C-o" #'eshell-kill-output + "C-o" #'eshell-delete-output "C-r" #'eshell-show-output "C-t" #'eshell-truncate-buffer "C-u" #'eshell-kill-input @@ -832,15 +832,23 @@ This function should be in the list `eshell-output-filter-functions'." eshell-last-output-start eshell-last-output-end)) -(defun eshell-kill-output () - "Kill all output from interpreter since last input. -Does not delete the prompt." - (interactive) +(defun eshell-delete-output (&optional kill) + "Delete all output from interpreter since last input. +If KILL is non-nil (interactively, the prefix), save the killed text in +the kill ring. + +This command does not delete the prompt." + (interactive "P") (save-excursion (goto-char (eshell-beginning-of-output)) (insert "*** output flushed ***\n") + (when kill + (copy-region-as-kill (point) (eshell-end-of-output))) (delete-region (point) (eshell-end-of-output)))) +(define-obsolete-function-alias 'eshell-kill-output + #'eshell-delete-output "30.1") + (defun eshell-show-output (&optional arg) "Display start of this batch of interpreter output at top of window. Sets mark to the value of point when this command is run. From 44a1721156ec29e5799da94f7918f217f52fd751 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 16 Feb 2024 09:04:46 -0500 Subject: [PATCH 187/446] * lisp/loadup.el (lexical-binding): Add a comment --- lisp/loadup.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/loadup.el b/lisp/loadup.el index c498c0e53af..c6a8dcbb909 100644 --- a/lisp/loadup.el +++ b/lisp/loadup.el @@ -635,6 +635,8 @@ directory got moved. This is set to be a pair in the form of: (unwind-protect (let ((tmp-dump-mode dump-mode) (dump-mode nil) + ;; Set `lexical-binding' to nil by default + ;; in the dumped Emacs. (lexical-binding nil)) (if (member tmp-dump-mode '("pdump" "pbootstrap")) (dump-emacs-portable (expand-file-name output invocation-directory)) From 4b89fb08bdd7d0249698bc0ed578555d6755724d Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 16 Feb 2024 22:17:01 +0800 Subject: [PATCH 188/446] * src/androidvfs.c (android_scan_directory_tree): Get rid of xstrdup. --- src/androidvfs.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/androidvfs.c b/src/androidvfs.c index 78f6b6da6a8..3030bd56cdc 100644 --- a/src/androidvfs.c +++ b/src/androidvfs.c @@ -1018,8 +1018,8 @@ android_extract_long (char *pointer) static const char * android_scan_directory_tree (char *file, size_t *limit_return) { - char *token, *saveptr, *copy, *copy1, *start, *max, *limit; - size_t token_length, ntokens, i; + char *token, *saveptr, *copy, *start, *max, *limit; + size_t token_length, ntokens, i, len; char *tokens[10]; USE_SAFE_ALLOCA; @@ -1031,11 +1031,14 @@ android_scan_directory_tree (char *file, size_t *limit_return) limit = (char *) directory_tree + directory_tree_size; /* Now, split `file' into tokens, with the delimiter being the file - name separator. Look for the file and seek past it. */ + name separator. Look for the file and seek past it. Create a copy + of FILE for the enjoyment of `strtok_r'. */ ntokens = 0; saveptr = NULL; - copy = copy1 = xstrdup (file); + len = strlen (file) + 1; + copy = SAFE_ALLOCA (len); + memcpy (copy, file, len); memset (tokens, 0, sizeof tokens); while ((token = strtok_r (copy, "/", &saveptr))) @@ -1044,19 +1047,14 @@ android_scan_directory_tree (char *file, size_t *limit_return) /* Make sure ntokens is within bounds. */ if (ntokens == ARRAYELTS (tokens)) - { - xfree (copy1); - goto fail; - } + goto fail; - tokens[ntokens] = SAFE_ALLOCA (strlen (token) + 1); - memcpy (tokens[ntokens], token, strlen (token) + 1); + len = strlen (token) + 1; + tokens[ntokens] = SAFE_ALLOCA (len); + memcpy (tokens[ntokens], token, len); ntokens++; } - /* Free the copy created for strtok_r. */ - xfree (copy1); - /* If there are no tokens, just return the start of the directory tree. */ From 5b65c2ad7526ec081ac37d32c87e9b58e787d66a Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 17 Feb 2024 10:27:26 +0800 Subject: [PATCH 189/446] Properly record mtime after insert-file-contents on Android * src/fileio.c (write_region): Do not verify file identity after retreiving file status for the second time if st_ino is 0. --- src/fileio.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/fileio.c b/src/fileio.c index a92da93ae48..483498fd879 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5628,7 +5628,15 @@ write_region (Lisp_Object start, Lisp_Object end, Lisp_Object filename, changed to a call to `stat'. */ if (emacs_fstatat (AT_FDCWD, fn, &st1, 0) == 0 - && st.st_dev == st1.st_dev && st.st_ino == st1.st_ino) + && st.st_dev == st1.st_dev + && (st.st_ino == st1.st_ino +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + /* `st1.st_ino' == 0 indicates that the inode number + cannot be extracted from this document file, despite + `st' potentially being backed by a real file. */ + || st1.st_ino == 0 +#endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ + )) { /* Use the heuristic if it appears to be valid. With neither O_EXCL nor O_TRUNC, if Emacs happened to write nothing to the From 537914561eb3809e34b9daf8c2b4719ae9b30a6b Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 17 Feb 2024 10:33:54 +0800 Subject: [PATCH 190/446] * java/debug.sh: Print errors correctly if device is ambiguous. --- java/debug.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java/debug.sh b/java/debug.sh index 8fc03d014cf..c5d40141355 100755 --- a/java/debug.sh +++ b/java/debug.sh @@ -104,13 +104,14 @@ if [ -z "$devices" ]; then exit 1 fi -if [ -z $device ]; then - device=$devices +if [ `wc -w <<< "$devices"` -gt 1 ] && [ -z $device ]; then + echo "Multiple devices are available. Please specify one with" + echo "the option --device and try again." + exit 1 fi -if [ `wc -w <<< "$devices"` -gt 1 ] && [ -z device ]; then - echo "Multiple devices are available. Please pick one using" - echo "--device and try again." +if [ -z $device ]; then + device=$devices fi echo "Looking for $package on device $device" @@ -189,6 +190,8 @@ if [ "$attach_existing" != "yes" ]; then package_pids=`awk -f tmp.awk <<< $package_pids` fi +rm tmp.awk + pid=$package_pids num_pids=`wc -w <<< "$package_pids"` From e288e1b2f352952e826727967a406c8675fd5594 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Thu, 15 Feb 2024 20:17:20 -0800 Subject: [PATCH 191/446] Remove "erc-" prefixed Compat definitions * lisp/erc/erc-compat.el: Remove NO-ERROR argument from top-level `require' for library `compat' because it's guaranteed to be present. (erc-compat-function, erc-compat-call): Redefine as obsolete aliases for unprefixed namesakes. * lisp/erc/erc-fill.el (erc-fill-wrap-nudge): Use `compat-call' instead of `erc-compat-call'. --- lisp/erc/erc-compat.el | 46 +++--------------------------------------- lisp/erc/erc-fill.el | 2 +- 2 files changed, 4 insertions(+), 44 deletions(-) diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el index 9b8699f6949..b5b8fbaf8ab 100644 --- a/lisp/erc/erc-compat.el +++ b/lisp/erc/erc-compat.el @@ -31,51 +31,11 @@ ;;; Code: -(require 'compat nil 'noerror) +(require 'compat) (eval-when-compile (require 'cl-lib)) -;; Except for the "erc-" namespacing, these two definitions should be -;; continuously updated to match the latest upstream ones verbatim. -;; Although they're pretty simple, it's likely not worth checking for -;; and possibly deferring to the non-prefixed versions. -;; -;; BEGIN Compat macros - -;;;; Macros for extended compatibility function calls - -(defmacro erc-compat-function (fun) - "Return compatibility function symbol for FUN. - -If the Emacs version provides a sufficiently recent version of -FUN, the symbol FUN is returned itself. Otherwise the macro -returns the symbol of a compatibility function which supports the -behavior and calling convention of the current stable Emacs -version. For example Compat 29.1 will provide compatibility -functions which implement the behavior and calling convention of -Emacs 29.1. - -See also `compat-call' to directly call compatibility functions." - (let ((compat (intern (format "compat--%s" fun)))) - `#',(if (fboundp compat) compat fun))) - -(defmacro erc-compat-call (fun &rest args) - "Call compatibility function or macro FUN with ARGS. - -A good example function is `plist-get' which was extended with an -additional predicate argument in Emacs 29.1. The compatibility -function, which supports this additional argument, can be -obtained via (compat-function plist-get) and called -via (compat-call plist-get plist prop predicate). It is not -possible to directly call (plist-get plist prop predicate) on -Emacs older than 29.1, since the original `plist-get' function -does not yet support the predicate argument. Note that the -Compat library never overrides existing functions. - -See also `compat-function' to lookup compatibility functions." - (let ((compat (intern (format "compat--%s" fun)))) - `(,(if (fboundp compat) compat fun) ,@args))) - -;; END Compat macros +(define-obsolete-function-alias 'erc-compat-function #'compat-function "30.1") +(define-obsolete-function-alias 'erc-compat-call #'compat-call "30.1") ;;;###autoload(autoload 'erc-define-minor-mode "erc-compat") (define-obsolete-function-alias 'erc-define-minor-mode diff --git a/lisp/erc/erc-fill.el b/lisp/erc/erc-fill.el index b91ce007087..547b3a11043 100644 --- a/lisp/erc/erc-fill.el +++ b/lisp/erc/erc-fill.el @@ -832,7 +832,7 @@ decorations applied by third-party modules." (line (count-screen-lines (window-start) (window-point)))) (when (zerop arg) (setq arg 1)) - (erc-compat-call + (compat-call set-transient-map (let ((map (make-sparse-keymap))) (dolist (key '(?= ?- ?0)) From a43b062ee57fd9b7c410e741946e51281db5b92a Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Thu, 8 Feb 2024 19:19:53 -0800 Subject: [PATCH 192/446] ; Load erc-compat before ert-x in ERC tests Avoid eager macro-expansion error in tests files on Emacs 27 and 28 by ensuring definitions provided by Compat, like `macroexp-file-name', load first. * lisp/erc/erc-speedbar.el (erc-speedbar--reset-last-ran-on-timer): Suppress "`buffer-local-value' is an obsolete generalized variable" warning on Emacs 29 and below. * lisp/erc/erc-stamp.el (erc-stamp--time-as-day): Avoid "unused lexical variable `current-time-list'" warning on 28 and below. * lisp/erc/erc.el (erc-check-text-conversion): Add `defvar' for `text-conversion-style' to avoid "reference to free variable" warning on Emacs 29 and below. * test/lisp/erc/erc-button-tests.el: Load `erc-button' before `ert-x'. * test/lisp/erc/erc-fill-tests.el: Load `erc-fill' before `ert-x'. * test/lisp/erc/erc-goodies-tests.el: Load `erc-goodies' before `ert-x'. * test/lisp/erc/erc-networks-tests.el: Explicitly load `erc-compat' before anything else. * test/lisp/erc/erc-scenarios-base-renick.el: Update timeouts. * test/lisp/erc/erc-stamp-tests.el: Load `erc-stamp' before `ert-x'. * test/lisp/erc/erc-tests.el: Load `erc-ring' before `ert-x'. --- lisp/erc/erc-speedbar.el | 5 +++-- lisp/erc/erc-stamp.el | 1 + lisp/erc/erc.el | 1 + test/lisp/erc/erc-button-tests.el | 3 +-- test/lisp/erc/erc-fill-tests.el | 4 ++-- test/lisp/erc/erc-goodies-tests.el | 4 ++-- test/lisp/erc/erc-networks-tests.el | 1 + test/lisp/erc/erc-scenarios-base-renick.el | 8 ++++---- test/lisp/erc/erc-stamp-tests.el | 6 +++--- test/lisp/erc/erc-tests.el | 2 +- 10 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lisp/erc/erc-speedbar.el b/lisp/erc/erc-speedbar.el index e3d28aa60dd..a81a3869436 100644 --- a/lisp/erc/erc-speedbar.el +++ b/lisp/erc/erc-speedbar.el @@ -566,8 +566,9 @@ The INDENT level is ignored." (defun erc-speedbar--reset-last-ran-on-timer () "Reset `erc-speedbar--last-ran'." (when speedbar-buffer - (setf (buffer-local-value 'erc-speedbar--last-ran speedbar-buffer) - (current-time)))) + (with-suppressed-warnings ((obsolete buffer-local-value)) ; <=29 + (setf (buffer-local-value 'erc-speedbar--last-ran speedbar-buffer) + (current-time))))) ;;;###autoload(autoload 'erc-nickbar-mode "erc-speedbar" nil t) (define-erc-module nickbar nil diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el index a11739a4195..a8190a2c94a 100644 --- a/lisp/erc/erc-stamp.el +++ b/lisp/erc/erc-stamp.el @@ -828,6 +828,7 @@ left-sided stamps and date stamps inserted by this function." ;; perform day alignments via this function only when needed. (defun erc-stamp--time-as-day (current-time) "Discard hour, minute, and second info from timestamp CURRENT-TIME." + (defvar current-time-list) ; <=28 (let* ((current-time-list) ; flag (decoded (decode-time current-time erc-stamp--tz))) (setf (decoded-time-second decoded) 0 diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 08dfa4b8f1b..88227688064 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -9492,6 +9492,7 @@ guarantee that the input method functions properly for the purpose of typing within the ERC prompt." (when (and (eq major-mode 'erc-mode) (fboundp 'set-text-conversion-style)) + (defvar text-conversion-style) ; avoid free variable warning on <=29 (if (>= (point) (erc-beg-of-input-line)) (unless (eq text-conversion-style 'action) (set-text-conversion-style 'action)) diff --git a/test/lisp/erc/erc-button-tests.el b/test/lisp/erc/erc-button-tests.el index ba6fe9fd8c1..603b3745a27 100644 --- a/test/lisp/erc/erc-button-tests.el +++ b/test/lisp/erc/erc-button-tests.el @@ -20,14 +20,13 @@ ;;; Commentary: ;;; Code: +(require 'erc-button) (require 'ert-x) ; cl-lib (eval-and-compile (let ((load-path (cons (ert-resource-directory) load-path))) (require 'erc-tests-common))) -(require 'erc-button) - (ert-deftest erc-button-alist--url () (erc-tests-common-init-server-proc "sleep" "1") (with-current-buffer (erc--open-target "#chan") diff --git a/test/lisp/erc/erc-fill-tests.el b/test/lisp/erc/erc-fill-tests.el index 0f19b481f37..2c3537676a7 100644 --- a/test/lisp/erc/erc-fill-tests.el +++ b/test/lisp/erc/erc-fill-tests.el @@ -23,13 +23,13 @@ ;; scenarios. ;;; Code: +(require 'erc-fill) + (require 'ert-x) (eval-and-compile (let ((load-path (cons (ert-resource-directory) load-path))) (require 'erc-tests-common))) -(require 'erc-fill) - (defvar erc-fill-tests--buffers nil) (defvar erc-fill-tests--current-time-value nil) diff --git a/test/lisp/erc/erc-goodies-tests.el b/test/lisp/erc/erc-goodies-tests.el index 170e28bda96..7013ce0c8fc 100644 --- a/test/lisp/erc/erc-goodies-tests.el +++ b/test/lisp/erc/erc-goodies-tests.el @@ -19,13 +19,13 @@ ;;; Commentary: ;;; Code: +(require 'erc-goodies) + (require 'ert-x) (eval-and-compile (let ((load-path (cons (ert-resource-directory) load-path))) (require 'erc-tests-common))) -(require 'erc-goodies) - (defun erc-goodies-tests--assert-face (beg end-str present &optional absent) (setq beg (+ beg (point-min))) (let ((end (+ beg (1- (length end-str))))) diff --git a/test/lisp/erc/erc-networks-tests.el b/test/lisp/erc/erc-networks-tests.el index 53cff8f489c..90b8aa99741 100644 --- a/test/lisp/erc/erc-networks-tests.el +++ b/test/lisp/erc/erc-networks-tests.el @@ -18,6 +18,7 @@ ;; along with GNU Emacs. If not, see . ;;; Code: +(require 'erc-compat) (require 'ert-x) ; cl-lib (eval-and-compile diff --git a/test/lisp/erc/erc-scenarios-base-renick.el b/test/lisp/erc/erc-scenarios-base-renick.el index ca22728b152..e0fcb8b9366 100644 --- a/test/lisp/erc/erc-scenarios-base-renick.el +++ b/test/lisp/erc/erc-scenarios-base-renick.el @@ -281,12 +281,12 @@ (should-not (get-buffer "rando@barnet")) (with-current-buffer "frenemy@foonet" - (funcall expect 1 "now known as") - (funcall expect 1 "doubly so")) + (funcall expect 10 "now known as") + (funcall expect 10 "doubly so")) (with-current-buffer "frenemy@barnet" - (funcall expect 1 "now known as") - (funcall expect 1 "reality picture")) + (funcall expect 10 "now known as") + (funcall expect 10 "reality picture")) (when noninteractive (with-current-buffer "frenemy@barnet" (kill-buffer)) diff --git a/test/lisp/erc/erc-stamp-tests.el b/test/lisp/erc/erc-stamp-tests.el index 70ca224ac74..a49173ffa2f 100644 --- a/test/lisp/erc/erc-stamp-tests.el +++ b/test/lisp/erc/erc-stamp-tests.el @@ -20,14 +20,14 @@ ;;; Commentary: ;;; Code: +(require 'erc-stamp) +(require 'erc-goodies) ; for `erc-make-read-only' + (require 'ert-x) (eval-and-compile (let ((load-path (cons (ert-resource-directory) load-path))) (require 'erc-tests-common))) -(require 'erc-stamp) -(require 'erc-goodies) ; for `erc-make-read-only' - ;; These display-oriented tests are brittle because many factors ;; influence how text properties are applied. We should just ;; rework these into full scenarios. diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 7d189d37929..dad161a2827 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -20,13 +20,13 @@ ;; along with GNU Emacs. If not, see . ;;; Code: +(require 'erc-ring) (require 'ert-x) (eval-and-compile (let ((load-path (cons (ert-resource-directory) load-path))) (require 'erc-tests-common))) -(require 'erc-ring) (ert-deftest erc--read-time-period () (cl-letf (((symbol-function 'read-string) (lambda (&rest _) ""))) From 1a36d52413c784750f650ccba95436e4f76ab104 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sat, 3 Feb 2024 17:17:48 -0800 Subject: [PATCH 193/446] Autoload custom-loads for new Custom groups in erc.el * lisp/erc/erc.el: Add `custom-loads' library features for group symbols `erc-spelling' and `erc-imenu' since they aren't defined in all supported Emacs versions. Also add groups `erc-sasl' and `erc-nicks', new libraries recently added to ERC. Note that this is unrelated to prefixes generated for the help system. (Bug#68943) --- lisp/erc/erc.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 88227688064..db5a9baf5c3 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -135,6 +135,13 @@ concerning buffers." "Running scripts at startup and with /LOAD." :group 'erc) +;; Add `custom-loads' features for group symbols missing from a +;; supported Emacs version, possibly because they belong to a new ERC +;; library. These groups all share their library's feature name. +;;;###autoload(dolist (symbol '( erc-sasl erc-spelling ; 29 +;;;###autoload erc-imenu erc-nicks)) ; 30 +;;;###autoload (custom-add-load symbol symbol)) + (defvar erc-message-parsed) ; only known to this file (defvar erc--msg-props nil From 9668b4f97c2fc6bfff83258861d455a6d02516a8 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 13 Nov 2023 12:07:36 -0800 Subject: [PATCH 194/446] Make erc-fill-wrap depend on scrolltobottom * lisp/erc/erc-fill.el (erc-fill-mode): Add reference to `erc-fill-wrap-mode' in doc string. (erc--fill-wrap-scrolltobottom-exempt-p): New variable to allow tests involving `fill-wrap' to opt out of having to enable `scrolltobottom'. (erc-fill--wrap-ensure-dependencies): Warn and enable `erc-scrolltobottom-mode' if necessary. (erc-fill-wrap-mode): Mention workaround for automatically enabling `scrolltobottom'. * test/lisp/erc/erc-fill-tests.el (erc-fill-tests--wrap-populate): Exempt tests from `scrolltobottom' dependency. * test/lisp/erc/resources/erc-scenarios-common.el: Load `erc-fill' when compiling. (erc-scenarios-common--print-trace): Exempt tests using `fill-wrap' from the `scrolltobottom' dependency by making `erc--fill-wrap-scrolltobottom-exempt-p' non-nil during test runs. (Bug#60936) --- lisp/erc/erc-fill.el | 62 ++++++++++--------- test/lisp/erc/erc-fill-tests.el | 1 + .../erc/resources/erc-scenarios-common.el | 4 +- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/lisp/erc/erc-fill.el b/lisp/erc/erc-fill.el index 547b3a11043..aa12b807fbc 100644 --- a/lisp/erc/erc-fill.el +++ b/lisp/erc/erc-fill.el @@ -44,11 +44,7 @@ (define-erc-module fill nil "Manage filling in ERC buffers. ERC fill mode is a global minor mode. When enabled, messages in -the channel buffers are filled." - ;; FIXME ensure a consistent ordering relative to hook members from - ;; other modules. Ideally, this module's processing should happen - ;; after "morphological" modifications to a message's text but - ;; before superficial decorations. +channel buffers are filled. See also `erc-fill-wrap-mode'." ((add-hook 'erc-insert-modify-hook #'erc-fill 60) (add-hook 'erc-send-modify-hook #'erc-fill 60)) ((remove-hook 'erc-insert-modify-hook #'erc-fill) @@ -425,8 +421,11 @@ is 0, reset to value of `erc-fill-wrap-visual-keys'." " " #'erc-fill--wrap-beginning-of-line) (defvar erc-button-mode) +(defvar erc-scrolltobottom-mode) (defvar erc-legacy-invisible-bounds-p) +(defvar erc--fill-wrap-scrolltobottom-exempt-p nil) + (defun erc-fill--wrap-ensure-dependencies () (with-suppressed-warnings ((obsolete erc-legacy-invisible-bounds-p)) (when erc-legacy-invisible-bounds-p @@ -439,6 +438,10 @@ is 0, reset to value of `erc-fill-wrap-visual-keys'." (unless erc-fill-mode (push 'fill missing-deps) (erc-fill-mode +1)) + (unless (or erc-scrolltobottom-mode erc--fill-wrap-scrolltobottom-exempt-p + (memq 'scrolltobottom erc-modules)) + (push 'scrolltobottom missing-deps) + (erc-scrolltobottom-mode +1)) (when erc-fill-wrap-merge (require 'erc-button) (unless erc-button-mode @@ -459,27 +462,25 @@ is 0, reset to value of `erc-fill-wrap-visual-keys'." ;;;###autoload(put 'fill-wrap 'erc--feature 'erc-fill) (define-erc-module fill-wrap nil "Fill style leveraging `visual-line-mode'. -This module displays nicks overhanging leftward to a common -offset, as determined by the option `erc-fill-static-center'. -And it \"wraps\" messages at a common margin width, as determined -by the option `erc-fill-wrap-margin-width'. To use it, either -include `fill-wrap' in `erc-modules' or set `erc-fill-function' -to `erc-fill-wrap'. Most users will want to enable the -`scrolltobottom' module as well. -During sessions in which this module is active, use -\\[erc-fill-wrap-nudge] to adjust the width of the indent and the -stamp margin, and use \\[erc-fill-wrap-toggle-truncate-lines] for -cycling between logical- and screen-line oriented command -movement. Similarly, use \\[erc-fill-wrap-refill-buffer] to fix -alignment problems after running certain commands, like -`text-scale-adjust'. Also see related stylistic options -`erc-fill-wrap-merge', and `erc-fill-wrap-merge-indicator'. -\(Hint: in narrow windows, where is space tight, try setting -`erc-fill-static-center' to 1. And if you also use the option -`erc-fill-wrap-merge-indicator', set that to value-menu item -\"Leading MIDDLE DOT sans gap\" or one of the various -\"trailing\" items.) +This module displays nicks overhanging leftward to a common +offset, as determined by the option `erc-fill-static-center'. It +also \"wraps\" messages at a common width, as determined by the +option `erc-fill-wrap-margin-width'. To use it, either include +`fill-wrap' in `erc-modules' or set `erc-fill-function' to +`erc-fill-wrap'. + +Once enabled, use \\[erc-fill-wrap-nudge] to adjust the width of +the indent and the stamp margin. And For cycling between +logical- and screen-line oriented command movement, see +\\[erc-fill-wrap-toggle-truncate-lines]. Similarly, use +\\[erc-fill-wrap-refill-buffer] to fix alignment problems after +running certain commands, like `text-scale-adjust'. Also see +related stylistic options `erc-fill-wrap-merge', and +`erc-fill-wrap-merge-indicator'. (Hint: in narrow windows, try +setting `erc-fill-static-center' to 1, and if you use +`erc-fill-wrap-merge-indicator', choose \"Leading MIDDLE DOT sans +gap\" or one of the \"trailing\" items from the Customize menu.) This module imposes various restrictions on the appearance of timestamps. Most notably, it insists on displaying them in the @@ -497,11 +498,12 @@ a workaround provided by `erc-stamp-prefix-log-filter', which strips trailing stamps from logged messages and instead prepends them to every line. -As a so-called \"local\" module, `fill-wrap' depends on the -global modules `fill', `stamp', and `button'; it activates them -as needed when initializing. Please note that enabling and -disabling this module by invoking one of its minor-mode toggles -is not recommended." +A so-called \"local\" module, `fill-wrap' depends on the global +modules `fill', `stamp', `button', and `scrolltobottom'. It +activates them as needed when initializing and leaves them +enabled when shutting down. To opt out of `scrolltobottom' +specifically, disable its minor mode, `erc-scrolltobottom-mode', +via `erc-fill-wrap-mode-hook'." ((erc-fill--wrap-ensure-dependencies) (erc--restore-initialize-priors erc-fill-wrap-mode erc-fill--wrap-visual-keys erc-fill-wrap-visual-keys diff --git a/test/lisp/erc/erc-fill-tests.el b/test/lisp/erc/erc-fill-tests.el index 2c3537676a7..3c4ad04abd7 100644 --- a/test/lisp/erc/erc-fill-tests.el +++ b/test/lisp/erc/erc-fill-tests.el @@ -52,6 +52,7 @@ (defun erc-fill-tests--wrap-populate (test) (let ((original-window-buffer (window-buffer (selected-window))) + (erc--fill-wrap-scrolltobottom-exempt-p t) (erc-stamp--tz t) (erc-fill-function 'erc-fill-wrap) (pre-command-hook pre-command-hook) diff --git a/test/lisp/erc/resources/erc-scenarios-common.el b/test/lisp/erc/resources/erc-scenarios-common.el index 042b3a8c05b..9ad5ce49429 100644 --- a/test/lisp/erc/resources/erc-scenarios-common.el +++ b/test/lisp/erc/resources/erc-scenarios-common.el @@ -94,7 +94,8 @@ (require 'erc) (eval-when-compile (require 'erc-join) - (require 'erc-services)) + (require 'erc-services) + (require 'erc-fill)) (declare-function erc-network "erc-networks") (defvar erc-network) @@ -148,6 +149,7 @@ (timer-list (copy-sequence timer-list)) (timer-idle-list (copy-sequence timer-idle-list)) (erc-auth-source-parameters-join-function nil) + (erc--fill-wrap-scrolltobottom-exempt-p t) (erc-autojoin-channels-alist nil) (erc-server-auto-reconnect nil) (erc-after-connect nil) From d7c18a7b4f218de8c4d2178c9124ea26c7dc5b6b Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 11 Feb 2024 20:42:18 -0800 Subject: [PATCH 195/446] Ignore the TGT-LIST parameter in erc-open * etc/ERC-NEWS: Mention `erc-open' now ignores TGT-LIST. * lisp/erc/erc.el (erc-open): Set `erc-default-recipients' to a list containing only the supplied target. Other values may cause ERC to malfunction. Also redo doc string. --- etc/ERC-NEWS | 10 ++++++++++ lisp/erc/erc.el | 37 +++++++++++++++---------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index 1e88500d169..b2aceaa9f39 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -502,6 +502,16 @@ encouraged to keep a module's name aligned with its group's as well as the provided feature of its containing library, if only for the usual reasons of namespace hygiene and discoverability. +*** The function 'erc-open' no longer uses the 'TGT-LIST' parameter. +ERC has always used the parameter to initialize the local variable +'erc-default-recipients', which stores a list of routing targets with +the topmost considered "active." However, since at least ERC 5.1, a +buffer and its active target effectively mate for life, making +'TGT-LIST', in practice, a read-only list of a single target. And +because that target must also appear as the 'CHANNEL' parameter, +'TGT-LIST' mainly serves to reinforce 'erc-open's reputation of being +unruly. + *** ERC supports arbitrary CHANTYPES. Specifically, channels can be prefixed with any predesignated character, mainly to afford more flexibility to specialty services, diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index db5a9baf5c3..94e98bd7660 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2486,29 +2486,22 @@ nil." (cl-assert (= (point) (point-max))))) (defun erc-open (&optional server port nick full-name - connect passwd tgt-list channel process + connect passwd _tgt-list channel process client-certificate user id) - "Connect to SERVER on PORT as NICK with USER and FULL-NAME. + "Return a new or reinitialized server or target buffer. +If CONNECT is non-nil, connect to SERVER and return its new or +reassociated buffer. Otherwise, assume PROCESS is non-nil and belongs +to an active session, and return a new or refurbished target buffer for +CHANNEL, which may also be a query target (the parameter name remains +for historical reasons). Pass SERVER, PORT, NICK, USER, FULL-NAME, and +PASSWD to `erc-determine-parameters' for preserving as session-local +variables. Do something similar for CLIENT-CERTIFICATE and ID, which +should be as described by `erc-tls'. -If CONNECT is non-nil, connect to the server. Otherwise assume -already connected and just create a separate buffer for the new -target given by CHANNEL, meaning these parameters are mutually -exclusive. Note that CHANNEL may also be a query; its name has -been retained for historical reasons. - -Use PASSWD as user password on the server. If TGT-LIST is -non-nil, use it to initialize `erc-default-recipients'. - -CLIENT-CERTIFICATE, if non-nil, should either be a list where the -first element is the file name of the private key corresponding -to a client certificate and the second element is the file name -of the client certificate itself to use when connecting over TLS, -or t, which means that `auth-source' will be queried for the -private key and the certificate. - -When non-nil, ID should be a symbol for identifying the connection. - -Returns the buffer for the given server or channel." +Note that ERC ignores TGT-LIST and initializes `erc-default-recipients' +with CHANNEL as its only member. Note also that this function has the +side effect of setting the current buffer to the one it returns. Use +`with-current-buffer' or `save-excursion' to nullify this effect." (let* ((target (and channel (erc--target-from-string channel))) (buffer (erc-get-buffer-create server port nil target id)) (old-buffer (current-buffer)) @@ -2545,7 +2538,7 @@ Returns the buffer for the given server or channel." ;; connection parameters (setq erc-server-process process) ;; stack of default recipients - (setq erc-default-recipients tgt-list) + (when channel (setq erc-default-recipients (list channel))) (when target (setq erc--target target erc-network (erc-network))) From 25d15391f2683ea95c4d7ee291fb82e0c9858d73 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 11 Feb 2024 17:15:14 -0800 Subject: [PATCH 196/446] Normalize ISUPPORT params with empty values in ERC * lisp/erc/erc-backend.el (erc-server-parameters) (erc--isupport-params): Mention parsing and storage behavior regarding nonstandard "FOO=" tokens. (erc--parse-isupport-value): Move comment closer to code. (erc--get-isupport-entry): Treat the empty string as truly null, as prescribed by the Brocklesby draft cited in the top-level comment. * test/lisp/erc/erc-tests.el (erc--get-isupport-entry): Add case for the empty string appearing as a value for an `erc-server-parameters' item. (erc-server-005): Assert compat-related behavior of retaining the empty string as a valid value from a raw "FOO=" token. (Bug#67220) --- lisp/erc/erc-backend.el | 21 +++++++++++++-------- test/lisp/erc/erc-tests.el | 26 ++++++++++++++++++-------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index e379066b08e..2aaedad1b64 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -254,6 +254,11 @@ Entries are of the form: or (PARAMETER) if no value is provided. +where PARAMETER is a string and VALUE is a string or nil. For +compatibility, a raw parameter of the form \"FOO=\" becomes +(\"FOO\" . \"\") even though it's equivalent to the preferred +canonical form \"FOO\" and its lisp representation (\"FOO\"). + Some examples of possible parameters sent by servers: CHANMODES=b,k,l,imnpst - list of supported channel modes CHANNELLEN=50 - maximum length of channel names @@ -273,7 +278,8 @@ WALLCHOPS - supports sending messages to all operators in a channel") (defvar-local erc--isupport-params nil "Hash map of \"ISUPPORT\" params. Keys are symbols. Values are lists of zero or more strings with hex -escapes removed.") +escapes removed. ERC normalizes incoming parameters of the form +\"FOO=\" to (FOO).") ;;; Server and connection state @@ -2150,10 +2156,6 @@ Then display the welcome message." ;; ;; > The server SHOULD send "X", not "X="; this is the normalized form. ;; - ;; Note: for now, assume the server will only send non-empty values, - ;; possibly with printable ASCII escapes. Though in practice, the - ;; only two escapes we're likely to see are backslash and space, - ;; meaning the pattern is too liberal. (let (case-fold-search) (mapcar (lambda (v) @@ -2164,7 +2166,9 @@ Then display the welcome message." (string-match "[\\]x[0-9A-F][0-9A-F]" v start)) (setq m (substring v (+ 2 (match-beginning 0)) (match-end 0)) c (string-to-number m 16)) - (if (<= ?\ c ?~) + ;; In practice, this range is too liberal. The only + ;; escapes we're likely to see are ?\\, ?=, and ?\s. + (if (<= ?\s c ?~) (setq v (concat (substring v 0 (match-beginning 0)) (string c) (substring v (match-end 0))) @@ -2189,8 +2193,9 @@ primitive value." (or erc-server-parameters (erc-with-server-buffer erc-server-parameters))))) - (if (cdr v) - (erc--parse-isupport-value (cdr v)) + (if-let ((val (cdr v)) + ((not (string-empty-p val)))) + (erc--parse-isupport-value val) '--empty--))))) (pcase value ('--empty-- (unless single (list key))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index dad161a2827..4762be468a5 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1054,7 +1054,8 @@ (ert-deftest erc--get-isupport-entry () (let ((erc--isupport-params (make-hash-table)) - (erc-server-parameters '(("FOO" . "1") ("BAR") ("BAZ" . "A,B,C"))) + (erc-server-parameters '(("FOO" . "1") ("BAR") ("BAZ" . "A,B,C") + ("SPAM" . ""))) (items (lambda () (cl-loop for k being the hash-keys of erc--isupport-params using (hash-values v) collect (cons k v))))) @@ -1075,7 +1076,9 @@ (should (equal (erc--get-isupport-entry 'FOO) '(FOO "1"))) (should (equal (funcall items) - '((BAR . --empty--) (BAZ "A" "B" "C") (FOO "1")))))) + '((BAR . --empty--) (BAZ "A" "B" "C") (FOO "1")))) + (should (equal (erc--get-isupport-entry 'SPAM) '(SPAM))) + (should-not (erc--get-isupport-entry 'SPAM 'single)))) (ert-deftest erc-server-005 () (let* ((hooked 0) @@ -1093,34 +1096,41 @@ (lambda (_ _ _ line) (push line calls)))) (ert-info ("Baseline") - (setq args '("tester" "BOT=B" "EXCEPTS" "PREFIX=(ov)@+" "are supp...") + (setq args '("tester" "BOT=B" "CHANTYPES=" "EXCEPTS" "PREFIX=(ov)@+" + "are supp...") parsed (make-erc-response :command-args args :command "005")) (setq verify (lambda () (should (equal erc-server-parameters '(("PREFIX" . "(ov)@+") ("EXCEPTS") + ;; Should be ("CHANTYPES") but + ;; retained for compatibility. + ("CHANTYPES" . "") ("BOT" . "B")))) (should (zerop (hash-table-count erc--isupport-params))) (should (equal "(ov)@+" (erc--get-isupport-entry 'PREFIX t))) (should (equal '(EXCEPTS) (erc--get-isupport-entry 'EXCEPTS))) (should (equal "B" (erc--get-isupport-entry 'BOT t))) - (should (string= (pop calls) - "BOT=B EXCEPTS PREFIX=(ov)@+ are supp...")) + (should (string= + (pop calls) + "BOT=B CHANTYPES= EXCEPTS PREFIX=(ov)@+ are supp...")) (should (equal args (erc-response.command-args parsed))))) (erc-call-hooks nil parsed)) (ert-info ("Negated, updated") - (setq args '("tester" "-EXCEPTS" "-FAKE" "PREFIX=(ohv)@%+" "are su...") + (setq args '("tester" "-EXCEPTS" "-CHANTYPES" "-FAKE" "PREFIX=(ohv)@%+" + "are su...") parsed (make-erc-response :command-args args :command "005")) (setq verify (lambda () (should (equal erc-server-parameters '(("PREFIX" . "(ohv)@%+") ("BOT" . "B")))) - (should (string= (pop calls) - "-EXCEPTS -FAKE PREFIX=(ohv)@%+ are su...")) + (should (string-prefix-p + "-EXCEPTS -CHANTYPES -FAKE PREFIX=(ohv)@%+ " + (pop calls))) (should (equal "(ohv)@%+" (erc--get-isupport-entry 'PREFIX t))) (should (equal "B" (erc--get-isupport-entry 'BOT t))) (should-not (erc--get-isupport-entry 'EXCEPTS)) From 3d87e343276081247102838b827b8a1f5e9e0c54 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 11 Feb 2024 20:01:54 -0800 Subject: [PATCH 197/446] Use modern fallback for channel name detection in ERC * lisp/erc/erc-backend.el (erc-query-buffer-p): Remove forward declaration. * lisp/erc/erc.el (erc-query-buffer-p): Defer to `erc-channel-p'. (erc-channel-p): Refactor and use `erc--fallback-channel-prefixes' for the default CHANTYPES value. Honor an empty CHANTYPES value as valid, e.g., for servers that only support direct messages. (erc--fallback-channel-prefixes): New variable to hold fallback CHANTYPES prefixes recommended by RFC1459 and modern authorities on the matter. * test/lisp/erc/erc-tests.el (erc-channel-p): Revise test. (Bug#67220) --- lisp/erc/erc-backend.el | 1 - lisp/erc/erc.el | 32 ++++++++++++++--------------- test/lisp/erc/erc-tests.el | 42 ++++++++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 2aaedad1b64..7b782d0ef44 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -158,7 +158,6 @@ (declare-function erc-parse-user "erc" (string)) (declare-function erc-process-away "erc" (proc away-p)) (declare-function erc-process-ctcp-query "erc" (proc parsed nick login host)) -(declare-function erc-query-buffer-p "erc" (&optional buffer)) (declare-function erc-remove-channel-member "erc" (channel nick)) (declare-function erc-remove-channel-users "erc" nil) (declare-function erc-remove-user "erc" (nick)) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 94e98bd7660..f250584e47a 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1663,11 +1663,7 @@ If BUFFER is nil, the current buffer is used." (defun erc-query-buffer-p (&optional buffer) "Return non-nil if BUFFER is an ERC query buffer. If BUFFER is nil, the current buffer is used." - (with-current-buffer (or buffer (current-buffer)) - (let ((target (erc-target))) - (and (eq major-mode 'erc-mode) - target - (not (memq (aref target 0) '(?# ?& ?+ ?!))))))) + (not (erc-channel-p (or buffer (current-buffer))))) (defun erc-ison-p (nick) "Return non-nil if NICK is online." @@ -1882,18 +1878,20 @@ buries those." :group 'erc-buffers :type 'boolean) -(defun erc-channel-p (channel) - "Return non-nil if CHANNEL seems to be an IRC channel name." - (cond ((stringp channel) - (memq (aref channel 0) - (if-let ((types (erc--get-isupport-entry 'CHANTYPES 'single))) - (append types nil) - '(?# ?& ?+ ?!)))) - ((and-let* (((bufferp channel)) - ((buffer-live-p channel)) - (target (buffer-local-value 'erc--target channel))) - (erc-channel-p (erc--target-string target)))) - (t nil))) +(defvar erc--fallback-channel-prefixes "#&" + "Prefix chars for distinguishing channel targets when CHANTYPES is unknown.") + +(defun erc-channel-p (target) + "Return non-nil if TARGET is a valid channel name or a channel buffer." + (cond ((stringp target) + (and-let* + (((not (string-empty-p target))) + (value (let ((entry (erc--get-isupport-entry 'CHANTYPES))) + (if entry (cadr entry) erc--fallback-channel-prefixes))) + ((erc--strpos (aref target 0) value))))) + ((and-let* (((buffer-live-p target)) + (target (buffer-local-value 'erc--target target)) + ((erc--target-channel-p target))))))) ;; For the sake of compatibility, a historical quirk concerning this ;; option, when nil, has been preserved: all buffers are suffixed with diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 4762be468a5..085b063bdb2 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1167,25 +1167,37 @@ (should (equal (erc-downcase "\\O/") "|o/" ))))) (ert-deftest erc-channel-p () - (let ((erc--isupport-params (make-hash-table)) - erc-server-parameters) + (erc-tests-common-make-server-buf) - (should (erc-channel-p "#chan")) - (should (erc-channel-p "##chan")) - (should (erc-channel-p "&chan")) - (should (erc-channel-p "+chan")) - (should (erc-channel-p "!chan")) - (should-not (erc-channel-p "@chan")) + (should (erc-channel-p "#chan")) + (should (erc-channel-p "##chan")) + (should (erc-channel-p "&chan")) + (should-not (erc-channel-p "+chan")) + (should-not (erc-channel-p "!chan")) + (should-not (erc-channel-p "@chan")) - (push '("CHANTYPES" . "#&@+!") erc-server-parameters) + ;; Server sends "CHANTYPES=#&+!" + (should-not erc-server-parameters) + (setq erc-server-parameters '(("CHANTYPES" . "#&+!"))) + (should (erc-channel-p "#chan")) + (should (erc-channel-p "&chan")) + (should (erc-channel-p "+chan")) + (should (erc-channel-p "!chan")) - (should (erc-channel-p "!chan")) - (should (erc-channel-p "#chan")) + (with-current-buffer (erc--open-target "#chan") + (should (erc-channel-p (current-buffer)))) + (with-current-buffer (erc--open-target "+chan") + (should (erc-channel-p (current-buffer)))) + (should (erc-channel-p (get-buffer "#chan"))) + (should (erc-channel-p (get-buffer "+chan"))) - (with-current-buffer (get-buffer-create "#chan") - (setq erc--target (erc--target-from-string "#chan"))) - (should (erc-channel-p (get-buffer "#chan")))) - (kill-buffer "#chan")) + ;; Server sends "CHANTYPES=" because it's query only. + (puthash 'CHANTYPES '("CHANTYPES") erc--isupport-params) + (should-not (erc-channel-p "#spam")) + (should-not (erc-channel-p "&spam")) + (should-not (erc-channel-p (save-excursion (erc--open-target "#spam")))) + + (erc-tests-common-kill-buffers)) (ert-deftest erc--valid-local-channel-p () (ert-info ("Local channels not supported") From de6f7f3c86ea0e52e8f9825585c726a7f93fa9cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Sat, 10 Feb 2024 16:14:08 +0100 Subject: [PATCH 198/446] Refine shebang tests (bug#64939) * test/lisp/files-tests.el (files-tests--check-shebang): For shell-script modes, verify that the correct shell is set. (files-tests-auto-mode-interpreter): Prefer 'sh-base-mode' to 'sh-mode' to stay tree-sitter-agnostic; re-organize test cases to make future ones easier to add. --- test/lisp/files-tests.el | 45 ++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 718ecd51f8b..23516ff0d7d 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -1656,30 +1656,39 @@ The door of all subtleties! (should (equal (file-name-base "foo") "foo")) (should (equal (file-name-base "foo/bar") "bar"))) -(defun files-tests--check-shebang (shebang expected-mode) - "Assert that mode for SHEBANG derives from EXPECTED-MODE." - (let ((actual-mode - (ert-with-temp-file script-file - :text shebang - (find-file script-file) - (if (derived-mode-p expected-mode) - expected-mode - major-mode)))) - ;; Tuck all the information we need in the `should' form: input - ;; shebang, expected mode vs actual. - (should - (equal (list shebang actual-mode) - (list shebang expected-mode))))) +(defvar sh-shell) + +(defun files-tests--check-shebang (shebang expected-mode &optional expected-dialect) + "Assert that mode for SHEBANG derives from EXPECTED-MODE. + +If EXPECTED-MODE is sh-base-mode, DIALECT says what `sh-shell' should be +set to." + (ert-with-temp-file script-file + :text shebang + (find-file script-file) + (let ((actual-mode (if (derived-mode-p expected-mode) + expected-mode + major-mode))) + ;; Tuck all the information we need in the `should' form: input + ;; shebang, expected mode vs actual. + (should + (equal (list shebang actual-mode) + (list shebang expected-mode))) + (when (eq expected-mode 'sh-base-mode) + (should (eq sh-shell expected-dialect)))))) (ert-deftest files-tests-auto-mode-interpreter () "Test that `set-auto-mode' deduces correct modes from shebangs." - (files-tests--check-shebang "#!/bin/bash" 'sh-mode) - (files-tests--check-shebang "#!/usr/bin/env bash" 'sh-mode) + ;; Straightforward interpreter invocation. + (files-tests--check-shebang "#!/bin/bash" 'sh-base-mode 'bash) + (files-tests--check-shebang "#!/usr/bin/make -f" 'makefile-mode) + ;; Invocation through env. + (files-tests--check-shebang "#!/usr/bin/env bash" 'sh-base-mode 'bash) (files-tests--check-shebang "#!/usr/bin/env python" 'python-base-mode) (files-tests--check-shebang "#!/usr/bin/env python3" 'python-base-mode) + ;; Invocation through env, with supplementary arguments. (files-tests--check-shebang "#!/usr/bin/env -S awk -v FS=\"\\t\" -v OFS=\"\\t\" -f" 'awk-mode) - (files-tests--check-shebang "#!/usr/bin/env -S make -f" 'makefile-mode) - (files-tests--check-shebang "#!/usr/bin/make -f" 'makefile-mode)) + (files-tests--check-shebang "#!/usr/bin/env -S make -f" 'makefile-mode)) (ert-deftest files-test-dir-locals-auto-mode-alist () "Test an `auto-mode-alist' entry in `.dir-locals.el'" From ecb9641ecb5f42899042ff9c164ec7dbb8e166fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Sat, 10 Feb 2024 17:37:35 +0100 Subject: [PATCH 199/446] Support more complex env invocations in shebang lines This is not an exact re-implementation of what env accepts, but hopefully it should be "good enough". Example of known limitation: we assume that arguments for --long-options will be set with '=', but that is not necessarily the case. '--unset' (mandatory argument) can be passed as '--unset=VAR' or '--unset VAR', but '--default-signal' (optional argument) requires an '=' sign. For bug#64939. * lisp/files.el (auto-mode-interpreter-regexp): Account for supplementary arguments passed beside -S/--split-string. * test/lisp/files-tests.el (files-tests-auto-mode-interpreter): Test some of these combinations. --- lisp/files.el | 8 +++++++- test/lisp/files-tests.el | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lisp/files.el b/lisp/files.el index f67b650cb92..5098d49048e 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3274,7 +3274,13 @@ and `inhibit-local-variables-suffixes'. If ;; Optional group 1: env(1) invocation. "\\(" "[^ \t\n]*/bin/env[ \t]*" - "\\(?:-S[ \t]*\\|--split-string\\(?:=\\|[ \t]*\\)\\)?" + ;; Within group 1: possible -S/--split-string. + "\\(?:" + ;; -S/--split-string + "\\(?:-[0a-z]*S[ \t]*\\|--split-string=\\)" + ;; More env arguments. + "\\(?:-[^ \t\n]+[ \t]+\\)*" + "\\)?" "\\)?" ;; Group 2: interpreter. "\\([^ \t\n]+\\)")) diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 23516ff0d7d..0a5c3b897e4 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -1687,8 +1687,14 @@ set to." (files-tests--check-shebang "#!/usr/bin/env python" 'python-base-mode) (files-tests--check-shebang "#!/usr/bin/env python3" 'python-base-mode) ;; Invocation through env, with supplementary arguments. + (files-tests--check-shebang "#!/usr/bin/env --split-string=bash -eux" 'sh-base-mode 'bash) + (files-tests--check-shebang "#!/usr/bin/env --split-string=-iv --default-signal bash -eux" 'sh-base-mode 'bash) (files-tests--check-shebang "#!/usr/bin/env -S awk -v FS=\"\\t\" -v OFS=\"\\t\" -f" 'awk-mode) - (files-tests--check-shebang "#!/usr/bin/env -S make -f" 'makefile-mode)) + (files-tests--check-shebang "#!/usr/bin/env -S make -f" 'makefile-mode) + (files-tests--check-shebang "#!/usr/bin/env -S-vi bash -eux" 'sh-base-mode 'bash) + (files-tests--check-shebang "#!/usr/bin/env -ivS --default-signal=INT bash -eux" 'sh-base-mode 'bash) + (files-tests--check-shebang "#!/usr/bin/env -ivS --default-signal bash -eux" 'sh-base-mode 'bash) + (files-tests--check-shebang "#!/usr/bin/env -vS -uFOOBAR bash -eux" 'sh-base-mode 'bash)) (ert-deftest files-test-dir-locals-auto-mode-alist () "Test an `auto-mode-alist' entry in `.dir-locals.el'" From c64e650fb346d92294703d22f8cd7deb7c47b49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Sat, 10 Feb 2024 17:56:57 +0100 Subject: [PATCH 200/446] Support shebang lines with amended environment For bug#64939. * lisp/files.el (auto-mode-interpreter-regexp): Account for possible VARIABLE=[VALUE] operands. * test/lisp/files-tests.el (files-tests-auto-mode-interpreter): Add an example from the coreutils manual. --- lisp/files.el | 5 ++++- test/lisp/files-tests.el | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lisp/files.el b/lisp/files.el index 5098d49048e..524385edc84 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3274,12 +3274,15 @@ and `inhibit-local-variables-suffixes'. If ;; Optional group 1: env(1) invocation. "\\(" "[^ \t\n]*/bin/env[ \t]*" - ;; Within group 1: possible -S/--split-string. + ;; Within group 1: possible -S/--split-string and environment + ;; adjustments. "\\(?:" ;; -S/--split-string "\\(?:-[0a-z]*S[ \t]*\\|--split-string=\\)" ;; More env arguments. "\\(?:-[^ \t\n]+[ \t]+\\)*" + ;; Interpreter environment modifications. + "\\(?:[^ \t\n]+=[^ \t\n]*[ \t]+\\)*" "\\)?" "\\)?" ;; Group 2: interpreter. diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 0a5c3b897e4..d4c1ef3ba67 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -1694,7 +1694,9 @@ set to." (files-tests--check-shebang "#!/usr/bin/env -S-vi bash -eux" 'sh-base-mode 'bash) (files-tests--check-shebang "#!/usr/bin/env -ivS --default-signal=INT bash -eux" 'sh-base-mode 'bash) (files-tests--check-shebang "#!/usr/bin/env -ivS --default-signal bash -eux" 'sh-base-mode 'bash) - (files-tests--check-shebang "#!/usr/bin/env -vS -uFOOBAR bash -eux" 'sh-base-mode 'bash)) + (files-tests--check-shebang "#!/usr/bin/env -vS -uFOOBAR bash -eux" 'sh-base-mode 'bash) + ;; Invocation through env, with modified environment. + (files-tests--check-shebang "#!/usr/bin/env -S PYTHONPATH=/...:${PYTHONPATH} python" 'python-base-mode)) (ert-deftest files-test-dir-locals-auto-mode-alist () "Test an `auto-mode-alist' entry in `.dir-locals.el'" From 84e4f1259b54442f52183c1ccee72a417e0a2658 Mon Sep 17 00:00:00 2001 From: john muhl Date: Mon, 12 Feb 2024 18:46:51 -0600 Subject: [PATCH 201/446] Eagerly indent first field in tables in 'lua-ts-mode' * lisp/progmodes/lua-ts-mode.el (lua-ts--simple-indent-rules): Properly indent the first field of a table when it appears on a line by itself. (Bug#69088) --- lisp/progmodes/lua-ts-mode.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index dc2a8fcec1e..c7f5ac50b04 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -317,6 +317,8 @@ values of OVERRIDE." (node-is ")") (node-is "}")) standalone-parent 0) + ((match null "table_constructor") + standalone-parent lua-ts-indent-offset) ((or (and (parent-is "arguments") lua-ts--first-child-matcher) (and (parent-is "parameters") lua-ts--first-child-matcher) (and (parent-is "table_constructor") lua-ts--first-child-matcher)) From 6477be93bd8a29cba8ce383f9ea3fba23c45f225 Mon Sep 17 00:00:00 2001 From: Aleksandr Vityazev Date: Thu, 15 Feb 2024 22:51:24 +0300 Subject: [PATCH 202/446] Make key selection method configurable in EPA. * lisp/epa.el (epa-keys-select-method): New defcustom. (epa--select-keys-in-minibuffer): New function. (epa-select-keys): Use new option and function. * etc/NEWS: Announce it. * doc/misc/epa.texi (Key Management): Document it. (Bug#69133) --- doc/misc/epa.texi | 7 +++++++ etc/NEWS | 8 ++++++++ lisp/epa.el | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/doc/misc/epa.texi b/doc/misc/epa.texi index 27a9e2b0ebb..cd6da1dadba 100644 --- a/doc/misc/epa.texi +++ b/doc/misc/epa.texi @@ -289,6 +289,13 @@ also ask you whether or not to sign the text before encryption and if you answered yes, it will let you select the signing keys. @end deffn +You can change the default method that is used to select keys with the +variable @code{epa-file-select-keys}. + +@defvar epa-keys-select-method +Method used to select keys in @code{epa-select-keys}. +@end defvar + @node Cryptographic operations on files @section Cryptographic Operations on Files @cindex cryptographic operations on files diff --git a/etc/NEWS b/etc/NEWS index 5220a7fb337..4477116248e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1365,6 +1365,14 @@ The new user option 'ielm-history-file-name' is the name of the file where IELM input history will be saved. Customize it to nil to revert to the old behavior of not remembering input history between sessions. +** EasyPG + ++++ +*** New user option 'epa-keys-select-method'. +This allows the user to customize the key selection method, which can be +either by using a pop-up buffer or from the minibuffer. The pop-up +buffer method is the default, which preserves previous behavior. + * New Modes and Packages in Emacs 30.1 diff --git a/lisp/epa.el b/lisp/epa.el index 53da3bf6cce..b2593bc62ba 100644 --- a/lisp/epa.el +++ b/lisp/epa.el @@ -73,6 +73,16 @@ The command `epa-mail-encrypt' uses this." :group 'epa :version "24.4") +(defcustom epa-keys-select-method 'buffer + "Method used to select keys in `epa-select-keys'. +If the value is \\='buffer, the default, keys are selected via a +pop-up buffer. If the value is \\='minibuffer, keys are selected +via the minibuffer instead, using `completing-read-multiple'." + :type '(choice (const :tag "Read keys from a pop-up buffer" buffer) + (const :tag "Read keys from minibuffer" minibuffer)) + :group 'epa + :version "30.1") + ;;; Faces (defgroup epa-faces nil @@ -450,6 +460,25 @@ q trust status questionable. - trust status unspecified. (epa--marked-keys)) (kill-buffer epa-keys-buffer))))) +(defun epa--select-keys-in-minibuffer (prompt keys) + (let* ((prompt (pcase-let ((`(,first ,second ,third) + (string-split prompt "\\.")) + (hint "(separated by comma)")) + (if third + (format "%s %s. %s: " first hint second) + (format "%s %s: " first hint)))) + (keys-alist + (seq-map + (lambda (key) + (cons (substring-no-properties + (epa--button-key-text key)) + key)) + keys)) + (selected-keys (completing-read-multiple prompt keys-alist))) + (seq-map + (lambda (key) (cdr (assoc key keys-alist))) + selected-keys))) + ;;;###autoload (defun epa-select-keys (context prompt &optional names secret) "Display a user's keyring and ask him to select keys. @@ -459,7 +488,9 @@ NAMES is a list of strings to be matched with keys. If it is nil, all the keys are listed. If SECRET is non-nil, list secret keys instead of public keys." (let ((keys (epg-list-keys context names secret))) - (epa--select-keys prompt keys))) + (pcase epa-keys-select-method + ('minibuffer (epa--select-keys-in-minibuffer prompt keys)) + (_ (epa--select-keys prompt keys))))) ;;;; Key Details From d85461ac61c5ea99ea194f99c771de1efdabbef4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 17 Feb 2024 11:31:20 +0200 Subject: [PATCH 203/446] ; Fix last change * doc/misc/epa.texi (Cryptographic operations on regions): Fix wording of the 'epa-keys-select-method's documentation. * lisp/epa.el (epa-keys-select-method): Doc fix (bug#69133). --- doc/misc/epa.texi | 10 ++++++---- lisp/epa.el | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/misc/epa.texi b/doc/misc/epa.texi index cd6da1dadba..f450b9cbdd9 100644 --- a/doc/misc/epa.texi +++ b/doc/misc/epa.texi @@ -289,11 +289,13 @@ also ask you whether or not to sign the text before encryption and if you answered yes, it will let you select the signing keys. @end deffn -You can change the default method that is used to select keys with the -variable @code{epa-file-select-keys}. - @defvar epa-keys-select-method -Method used to select keys in @code{epa-select-keys}. +This variable controls the method used for key selection in +@code{epa-select-keys}. The default value @code{buffer} pops up a +special buffer where you can select the keys. If the value is +@code{minibuffer}, @code{epa-select-keys} will instead prompt for the +keys in the minibuffer, where you should type the keys separated by +commas. @end defvar @node Cryptographic operations on files diff --git a/lisp/epa.el b/lisp/epa.el index b2593bc62ba..c29df18bb58 100644 --- a/lisp/epa.el +++ b/lisp/epa.el @@ -77,7 +77,8 @@ The command `epa-mail-encrypt' uses this." "Method used to select keys in `epa-select-keys'. If the value is \\='buffer, the default, keys are selected via a pop-up buffer. If the value is \\='minibuffer, keys are selected -via the minibuffer instead, using `completing-read-multiple'." +via the minibuffer instead, using `completing-read-multiple'. +Any other value is treated as \\='buffer." :type '(choice (const :tag "Read keys from a pop-up buffer" buffer) (const :tag "Read keys from minibuffer" minibuffer)) :group 'epa From 77576cd7626e4a99a5c88aa854091d701edd53a8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 17 Feb 2024 12:15:11 +0200 Subject: [PATCH 204/446] ; Don't use non-ASCII characters in C comments in xdisp.c. --- src/xdisp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xdisp.c b/src/xdisp.c index 6087a25afcc..4d60915f31c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -24774,7 +24774,7 @@ maybe_produce_line_number (struct it *it) /* NOTE: We use `base_line_number` without checking BASE_LINE_NUMBER_VALID_P because we assume that `redisplay_window` has already flushed this cache for us when needed. - NOTE²: Checking BASE_LINE_NUMBER_VALID_P here would be + NOTE2: Checking BASE_LINE_NUMBER_VALID_P here would be overly pessimistic because it might say that the cache was invalid before entering `redisplay_window` yet the value has just been refreshed. */ From 07a392f445eb21c5e4681027eee9d981300a4309 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sat, 17 Feb 2024 10:17:41 -0500 Subject: [PATCH 205/446] Update to Org 9.6.19 --- doc/misc/org.org | 22 +++++++--------------- etc/refcards/orgcard.tex | 2 +- lisp/org/ol-man.el | 14 ++++++++++++++ lisp/org/ol.el | 5 +---- lisp/org/org-compat.el | 2 +- lisp/org/org-id.el | 12 ++++++------ lisp/org/org-lint.el | 7 +++++-- lisp/org/org-table.el | 8 ++++---- lisp/org/org-tempo.el | 2 +- lisp/org/org-version.el | 4 ++-- lisp/org/org.el | 10 ++++++---- lisp/org/ox-latex.el | 5 +++-- lisp/org/ox-odt.el | 5 +++-- lisp/org/ox.el | 9 ++++----- 14 files changed, 58 insertions(+), 49 deletions(-) diff --git a/doc/misc/org.org b/doc/misc/org.org index 9535eccc1e6..441985c905f 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -16712,6 +16712,7 @@ to HTML, the following links all point to a dedicated anchor in :END: #+cindex: sitemap, of published pages +#+vindex: org-publish-project-alist The following properties may be used to control publishing of a map of files for a given project. @@ -16729,6 +16730,12 @@ a map of files for a given project. Title of sitemap page. Defaults to name of file. +- ~:sitemap-style~ :: + + Can be ~list~ (site-map is just an itemized list of the titles of + the files involved) or ~tree~ (the directory structure of the + source files is reflected in the site-map). Defaults to ~tree~. + - ~:sitemap-format-entry~ :: #+findex: org-publish-find-date @@ -16774,21 +16781,6 @@ a map of files for a given project. Should sorting be case-sensitive? Default ~nil~. -- ~:sitemap-file-entry-format~ :: - - With this option one can tell how a sitemap's entry is formatted in - the sitemap. This is a format string with some escape sequences: - ~%t~ stands for the title of the file, ~%a~ stands for the author of - the file and ~%d~ stands for the date of the file. The date is - retrieved with the ~org-publish-find-date~ function and formatted - with ~org-publish-sitemap-date-format~. Default ~%t~. - -- ~:sitemap-date-format~ :: - - Format string for the ~format-time-string~ function that tells how - a sitemap entry's date is to be formatted. This property bypasses - ~org-publish-sitemap-date-format~ which defaults to ~%Y-%m-%d~. - *** Generating an index :PROPERTIES: :DESCRIPTION: An index that reaches across pages. diff --git a/etc/refcards/orgcard.tex b/etc/refcards/orgcard.tex index 705ab62d69d..e1d40d8632f 100644 --- a/etc/refcards/orgcard.tex +++ b/etc/refcards/orgcard.tex @@ -1,5 +1,5 @@ % Reference Card for Org Mode -\def\orgversionnumber{9.6.15} +\def\orgversionnumber{9.6.19} \def\versionyear{2023} % latest update \input emacsver.tex diff --git a/lisp/org/ol-man.el b/lisp/org/ol-man.el index b6cada1b3c3..d3d7db04700 100644 --- a/lisp/org/ol-man.el +++ b/lisp/org/ol-man.el @@ -39,13 +39,27 @@ :group 'org-link :type '(choice (const man) (const woman))) +(declare-function Man-translate-references "man" (ref)) (defun org-man-open (path _) "Visit the manpage on PATH. PATH should be a topic that can be thrown at the man command. If PATH contains extra ::STRING which will use `occur' to search matched strings in man buffer." + (require 'man) ; For `Man-translate-references' (string-match "\\(.*?\\)\\(?:::\\(.*\\)\\)?$" path) (let* ((command (match-string 1 path)) + ;; FIXME: Remove after we drop Emacs 29 support. + ;; Working around security bug #66390. + (command (if (not (equal (Man-translate-references ";id") ";id")) + ;; We are on Emacs that escapes man command args + ;; (see Emacs commit 820f0793f0b). + command + ;; Older Emacs without the fix - escape the + ;; arguments ourselves. + (mapconcat 'identity + (mapcar #'shell-quote-argument + (split-string command "\\s-+")) + " "))) (search (match-string 2 path)) (buffer (funcall org-man-command command))) (when search diff --git a/lisp/org/ol.el b/lisp/org/ol.el index 4c84e62f4c9..c3b03087842 100644 --- a/lisp/org/ol.el +++ b/lisp/org/ol.el @@ -291,10 +291,7 @@ or emacs-wiki packages to Org syntax. The function must accept two parameters, a TYPE containing the link protocol name like \"rmail\" or \"gnus\" as a string, and the linked path, which is everything after the link protocol. It should return a cons -with possibly modified values of type and path. -Org contains a function for this, so if you set this variable to -`org-translate-link-from-planner', you should be able follow many -links created by planner." +with possibly modified values of type and path." :group 'org-link-follow :type '(choice (const nil) (function)) :safe #'null) diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el index 33a510cd7f2..c17a100d3c1 100644 --- a/lisp/org/org-compat.el +++ b/lisp/org/org-compat.el @@ -664,7 +664,7 @@ You could use brackets to delimit on what part the link will be. %t is the title. %a is the author. -%d is the date formatted using `org-publish-sitemap-date-format'." +%d is the date." :group 'org-export-publish :type 'string) (make-obsolete-variable diff --git a/lisp/org/org-id.el b/lisp/org/org-id.el index 9561f2de184..fe7d5f4c1a5 100644 --- a/lisp/org/org-id.el +++ b/lisp/org/org-id.el @@ -29,13 +29,13 @@ ;; are provided that create and retrieve such identifiers, and that find ;; entries based on the identifier. -;; Identifiers consist of a prefix (default "Org" given by the variable +;; Identifiers consist of a prefix (given by the variable ;; `org-id-prefix') and a unique part that can be created by a number -;; of different methods, see the variable `org-id-method'. -;; Org has a builtin method that uses a compact encoding of the creation -;; time of the ID, with microsecond accuracy. This virtually -;; guarantees globally unique identifiers, even if several people are -;; creating IDs at the same time in files that will eventually be used +;; of different methods, see the variable `org-id-method'. Org has a +;; builtin method that uses a compact encoding of the creation time of +;; the ID, with microsecond accuracy. This virtually guarantees +;; globally unique identifiers, even if several people are creating +;; IDs at the same time in files that will eventually be used ;; together. ;; ;; By default Org uses UUIDs as global unique identifiers. diff --git a/lisp/org/org-lint.el b/lisp/org/org-lint.el index dc12ec272fa..a503de7d364 100644 --- a/lisp/org/org-lint.el +++ b/lisp/org/org-lint.el @@ -1209,8 +1209,11 @@ Use \"export %s\" instead" (`(,(and (pred symbolp) name) ,(pred string-or-null-p) ,(pred string-or-null-p)) - (unless (org-cite-get-processor name) - (list source "Unknown cite export processor %S" name))) + (unless (or (org-cite-get-processor name) + (progn + (org-cite-try-load-processor name) + (org-cite-get-processor name))) + (list source (format "Unknown cite export processor %S" name)))) (_ (list source "Invalid cite export processor declaration"))) (error diff --git a/lisp/org/org-table.el b/lisp/org/org-table.el index 6408f48ccbd..92490f9f6bf 100644 --- a/lisp/org/org-table.el +++ b/lisp/org/org-table.el @@ -1922,8 +1922,8 @@ However, when N is 0, do not increment the field at all." (let ((org-table-may-need-update nil)) (org-table-next-row)) (org-table-blank-field)) ;; Insert the new field. NEW-FIELD may be nil if - ;; `org-table-increment' is nil, or N = 0. In that case, copy - ;; FIELD. + ;; `org-table-copy-increment' is nil, or N = 0. In that case, + ;; copy FIELD. (insert (or next-field field)) (org-table-maybe-recalculate-line) (org-table-align))) @@ -4084,8 +4084,8 @@ already hidden." "Read column selection select as a list of numbers. SELECT is a string containing column ranges, separated by white -space characters, see `org-table-hide-column' for details. MAX -is the maximum column number. +space characters, see `org-table-toggle-column-width' for details. +MAX is the maximum column number. Return value is a sorted list of numbers. Ignore any number outside of the [1;MAX] range." diff --git a/lisp/org/org-tempo.el b/lisp/org/org-tempo.el index 44b04a9f4be..afa69867f2a 100644 --- a/lisp/org/org-tempo.el +++ b/lisp/org/org-tempo.el @@ -24,7 +24,7 @@ ;;; Commentary: ;; ;; Org Tempo reimplements completions of structure template before -;; point like `org-try-structure-completion' in Org v9.1 and earlier. +;; point in Org v9.1 and earlier. ;; For example, strings like " Date: Sat, 17 Feb 2024 18:53:05 +0200 Subject: [PATCH 206/446] Revert "Update to Org 9.6.19" This reverts commit 07a392f445eb21c5e4681027eee9d981300a4309. It was installed by mistake. --- doc/misc/org.org | 22 +++++++++++++++------- etc/refcards/orgcard.tex | 2 +- lisp/org/ol-man.el | 14 -------------- lisp/org/ol.el | 5 ++++- lisp/org/org-compat.el | 2 +- lisp/org/org-id.el | 12 ++++++------ lisp/org/org-lint.el | 7 ++----- lisp/org/org-table.el | 8 ++++---- lisp/org/org-tempo.el | 2 +- lisp/org/org-version.el | 4 ++-- lisp/org/org.el | 10 ++++------ lisp/org/ox-latex.el | 5 ++--- lisp/org/ox-odt.el | 5 ++--- lisp/org/ox.el | 9 +++++---- 14 files changed, 49 insertions(+), 58 deletions(-) diff --git a/doc/misc/org.org b/doc/misc/org.org index 441985c905f..9535eccc1e6 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -16712,7 +16712,6 @@ to HTML, the following links all point to a dedicated anchor in :END: #+cindex: sitemap, of published pages -#+vindex: org-publish-project-alist The following properties may be used to control publishing of a map of files for a given project. @@ -16730,12 +16729,6 @@ a map of files for a given project. Title of sitemap page. Defaults to name of file. -- ~:sitemap-style~ :: - - Can be ~list~ (site-map is just an itemized list of the titles of - the files involved) or ~tree~ (the directory structure of the - source files is reflected in the site-map). Defaults to ~tree~. - - ~:sitemap-format-entry~ :: #+findex: org-publish-find-date @@ -16781,6 +16774,21 @@ a map of files for a given project. Should sorting be case-sensitive? Default ~nil~. +- ~:sitemap-file-entry-format~ :: + + With this option one can tell how a sitemap's entry is formatted in + the sitemap. This is a format string with some escape sequences: + ~%t~ stands for the title of the file, ~%a~ stands for the author of + the file and ~%d~ stands for the date of the file. The date is + retrieved with the ~org-publish-find-date~ function and formatted + with ~org-publish-sitemap-date-format~. Default ~%t~. + +- ~:sitemap-date-format~ :: + + Format string for the ~format-time-string~ function that tells how + a sitemap entry's date is to be formatted. This property bypasses + ~org-publish-sitemap-date-format~ which defaults to ~%Y-%m-%d~. + *** Generating an index :PROPERTIES: :DESCRIPTION: An index that reaches across pages. diff --git a/etc/refcards/orgcard.tex b/etc/refcards/orgcard.tex index e1d40d8632f..705ab62d69d 100644 --- a/etc/refcards/orgcard.tex +++ b/etc/refcards/orgcard.tex @@ -1,5 +1,5 @@ % Reference Card for Org Mode -\def\orgversionnumber{9.6.19} +\def\orgversionnumber{9.6.15} \def\versionyear{2023} % latest update \input emacsver.tex diff --git a/lisp/org/ol-man.el b/lisp/org/ol-man.el index d3d7db04700..b6cada1b3c3 100644 --- a/lisp/org/ol-man.el +++ b/lisp/org/ol-man.el @@ -39,27 +39,13 @@ :group 'org-link :type '(choice (const man) (const woman))) -(declare-function Man-translate-references "man" (ref)) (defun org-man-open (path _) "Visit the manpage on PATH. PATH should be a topic that can be thrown at the man command. If PATH contains extra ::STRING which will use `occur' to search matched strings in man buffer." - (require 'man) ; For `Man-translate-references' (string-match "\\(.*?\\)\\(?:::\\(.*\\)\\)?$" path) (let* ((command (match-string 1 path)) - ;; FIXME: Remove after we drop Emacs 29 support. - ;; Working around security bug #66390. - (command (if (not (equal (Man-translate-references ";id") ";id")) - ;; We are on Emacs that escapes man command args - ;; (see Emacs commit 820f0793f0b). - command - ;; Older Emacs without the fix - escape the - ;; arguments ourselves. - (mapconcat 'identity - (mapcar #'shell-quote-argument - (split-string command "\\s-+")) - " "))) (search (match-string 2 path)) (buffer (funcall org-man-command command))) (when search diff --git a/lisp/org/ol.el b/lisp/org/ol.el index c3b03087842..4c84e62f4c9 100644 --- a/lisp/org/ol.el +++ b/lisp/org/ol.el @@ -291,7 +291,10 @@ or emacs-wiki packages to Org syntax. The function must accept two parameters, a TYPE containing the link protocol name like \"rmail\" or \"gnus\" as a string, and the linked path, which is everything after the link protocol. It should return a cons -with possibly modified values of type and path." +with possibly modified values of type and path. +Org contains a function for this, so if you set this variable to +`org-translate-link-from-planner', you should be able follow many +links created by planner." :group 'org-link-follow :type '(choice (const nil) (function)) :safe #'null) diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el index c17a100d3c1..33a510cd7f2 100644 --- a/lisp/org/org-compat.el +++ b/lisp/org/org-compat.el @@ -664,7 +664,7 @@ You could use brackets to delimit on what part the link will be. %t is the title. %a is the author. -%d is the date." +%d is the date formatted using `org-publish-sitemap-date-format'." :group 'org-export-publish :type 'string) (make-obsolete-variable diff --git a/lisp/org/org-id.el b/lisp/org/org-id.el index fe7d5f4c1a5..9561f2de184 100644 --- a/lisp/org/org-id.el +++ b/lisp/org/org-id.el @@ -29,13 +29,13 @@ ;; are provided that create and retrieve such identifiers, and that find ;; entries based on the identifier. -;; Identifiers consist of a prefix (given by the variable +;; Identifiers consist of a prefix (default "Org" given by the variable ;; `org-id-prefix') and a unique part that can be created by a number -;; of different methods, see the variable `org-id-method'. Org has a -;; builtin method that uses a compact encoding of the creation time of -;; the ID, with microsecond accuracy. This virtually guarantees -;; globally unique identifiers, even if several people are creating -;; IDs at the same time in files that will eventually be used +;; of different methods, see the variable `org-id-method'. +;; Org has a builtin method that uses a compact encoding of the creation +;; time of the ID, with microsecond accuracy. This virtually +;; guarantees globally unique identifiers, even if several people are +;; creating IDs at the same time in files that will eventually be used ;; together. ;; ;; By default Org uses UUIDs as global unique identifiers. diff --git a/lisp/org/org-lint.el b/lisp/org/org-lint.el index a503de7d364..dc12ec272fa 100644 --- a/lisp/org/org-lint.el +++ b/lisp/org/org-lint.el @@ -1209,11 +1209,8 @@ Use \"export %s\" instead" (`(,(and (pred symbolp) name) ,(pred string-or-null-p) ,(pred string-or-null-p)) - (unless (or (org-cite-get-processor name) - (progn - (org-cite-try-load-processor name) - (org-cite-get-processor name))) - (list source (format "Unknown cite export processor %S" name)))) + (unless (org-cite-get-processor name) + (list source "Unknown cite export processor %S" name))) (_ (list source "Invalid cite export processor declaration"))) (error diff --git a/lisp/org/org-table.el b/lisp/org/org-table.el index 92490f9f6bf..6408f48ccbd 100644 --- a/lisp/org/org-table.el +++ b/lisp/org/org-table.el @@ -1922,8 +1922,8 @@ However, when N is 0, do not increment the field at all." (let ((org-table-may-need-update nil)) (org-table-next-row)) (org-table-blank-field)) ;; Insert the new field. NEW-FIELD may be nil if - ;; `org-table-copy-increment' is nil, or N = 0. In that case, - ;; copy FIELD. + ;; `org-table-increment' is nil, or N = 0. In that case, copy + ;; FIELD. (insert (or next-field field)) (org-table-maybe-recalculate-line) (org-table-align))) @@ -4084,8 +4084,8 @@ already hidden." "Read column selection select as a list of numbers. SELECT is a string containing column ranges, separated by white -space characters, see `org-table-toggle-column-width' for details. -MAX is the maximum column number. +space characters, see `org-table-hide-column' for details. MAX +is the maximum column number. Return value is a sorted list of numbers. Ignore any number outside of the [1;MAX] range." diff --git a/lisp/org/org-tempo.el b/lisp/org/org-tempo.el index afa69867f2a..44b04a9f4be 100644 --- a/lisp/org/org-tempo.el +++ b/lisp/org/org-tempo.el @@ -24,7 +24,7 @@ ;;; Commentary: ;; ;; Org Tempo reimplements completions of structure template before -;; point in Org v9.1 and earlier. +;; point like `org-try-structure-completion' in Org v9.1 and earlier. ;; For example, strings like " Date: Sun, 11 Feb 2024 21:26:41 +0000 Subject: [PATCH 207/446] Add manual entries for which-key * doc/emacs/display.texi (Display Custom): Briefly introduce which-key. * doc/emacs/help.texi (Key Help): Briefly mention which-key. --- doc/emacs/display.texi | 3 ++- doc/emacs/help.texi | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi index d2557d6148e..bda57d2b30e 100644 --- a/doc/emacs/display.texi +++ b/doc/emacs/display.texi @@ -2215,7 +2215,8 @@ there is something to echo. @xref{Echo Area}. default), the multi-character key sequence echo shown according to @code{echo-keystrokes} will include a short help text about keys which will invoke @code{describe-prefix-bindings} (@pxref{Misc Help}) to show -the list of commands for the prefix you already typed. +the list of commands for the prefix you already typed. For a related +help facility, see @ref{which-key}. @cindex mouse pointer @cindex hourglass pointer display diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi index 99a4173ac29..1a76e663657 100644 --- a/doc/emacs/help.texi +++ b/doc/emacs/help.texi @@ -260,6 +260,11 @@ by these buttons, Emacs provides the @code{button-describe} and @code{widget-describe} commands, that should be run with point over the button. +@anchor which-key +@kbd{M-x which-key} is a global minor mode which helps in discovering + keymaps. It displays keybindings following your currently entered + incomplete command (prefix), in a popup. + @node Name Help @section Help by Command or Variable Name From c14a67a80f4263c13db55b6a79fb545b82a8b5b7 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 17 Feb 2024 18:57:12 +0200 Subject: [PATCH 208/446] ; Fix markup in last change (bug#68929). --- doc/emacs/help.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi index 1a76e663657..05457a3f34f 100644 --- a/doc/emacs/help.texi +++ b/doc/emacs/help.texi @@ -260,7 +260,7 @@ by these buttons, Emacs provides the @code{button-describe} and @code{widget-describe} commands, that should be run with point over the button. -@anchor which-key +@anchor{which-key} @kbd{M-x which-key} is a global minor mode which helps in discovering keymaps. It displays keybindings following your currently entered incomplete command (prefix), in a popup. From e56f0ef51bfdd0e03e817670754bc813fb3702a2 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Fri, 2 Feb 2024 20:59:41 +0100 Subject: [PATCH 209/446] org: Fix security prompt for downloading remote resource * lisp/org.el (org--confirm-resource-safe): Do not assume that resource is safe when user replies "n" (do not download). Reported-by: Max Nikulin Link: https://orgmode.org/list/upj6uk$b7o$1@ciao.gmane.io --- lisp/org/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/org/org.el b/lisp/org/org.el index 3075729d01d..c75afbf5a67 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -4685,7 +4685,7 @@ returns non-nil if any of them match." (if (and (= char ?f) current-file) (concat "file://" current-file) uri)) "\\'"))))) - (prog1 (memq char '(?y ?n ?! ?d ?\s ?f)) + (prog1 (memq char '(?y ?! ?d ?\s ?f)) (quit-window t))))))) (defun org-extract-log-state-settings (x) From db5e84af202532b138918295ea6dd1b0ea910d78 Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Sat, 17 Feb 2024 09:31:50 -0800 Subject: [PATCH 210/446] Alias some gnus-specific do-nothing functions Replace with #'always and #'ignore * lisp/gnus/gnus-agent.el: `gnus-agent-true' and `gnus-agent-false' * lisp/gnus/gnus-util.el: `gnus-not-ignore' --- lisp/gnus/gnus-agent.el | 13 +++++-------- lisp/gnus/gnus-util.el | 3 +-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 3ee93031119..0928b179787 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -2910,13 +2910,9 @@ The following commands are available: (car func) (gnus-byte-compile `(lambda () ,func))))) -(defun gnus-agent-true () - "Return t." - t) +(defalias 'gnus-agent-true #'always) -(defun gnus-agent-false () - "Return nil." - nil) +(defalias 'gnus-agent-false #'ignore) (defun gnus-category-make-function-1 (predicate) "Make a function from PREDICATE." @@ -2924,8 +2920,9 @@ The following commands are available: ;; Functions are just returned as is. ((or (symbolp predicate) (functionp predicate)) - `(,(or (cdr (assq predicate gnus-category-predicate-alist)) - predicate))) + (let ((fun (or (cdr (assq predicate gnus-category-predicate-alist)) + predicate))) + (if (symbolp fun) `(,fun) `(funcall ',fun)))) ;; More complex predicate. ((consp predicate) `(,(cond diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index b5aa0b02d34..7218c686a2a 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -1113,8 +1113,7 @@ sure of changing the value of `foo'." (setq gnus-info-buffer (current-buffer)) (gnus-configure-windows 'info))) -(defun gnus-not-ignore (&rest _args) - t) +(defalias gnus-not-ignore #'always) (defvar gnus-directory-sep-char-regexp "/" "The regexp of directory separator character. From 32c5bdfa971220bae37991a298628605c82f866c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C4=8Dm=C3=ADnek?= Date: Sat, 17 Feb 2024 09:34:36 -0800 Subject: [PATCH 211/446] Provide better default value for date in Gnus scoring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug#61002, thanks to Kamil Jońca for reporting * lisp/gnus/gnus-score.el (gnus-summary-score-entry): When scoring on Date header, the default value for the prompt should be number of days between the date of the article under point, and "now". --- lisp/gnus/gnus-score.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/gnus-score.el b/lisp/gnus/gnus-score.el index bd19e7d7cd7..479b7496cf1 100644 --- a/lisp/gnus/gnus-score.el +++ b/lisp/gnus/gnus-score.el @@ -893,9 +893,14 @@ If optional argument `EXTRA' is non-nil, it's a non-standard overview header." (t "permanent")) header (if (< score 0) "lower" "raise")) - (if (numberp match) - (int-to-string match) - match)))) + (cond ((numberp match) (int-to-string match)) + ((string= header "date") + (int-to-string + (- + (/ (car (time-convert (current-time) 1)) 86400) + (/ (car (time-convert (gnus-date-get-time match) 1)) + 86400)))) + (t match))))) ;; If this is an integer comparison, we transform from string to int. (if (eq (nth 2 (assoc header gnus-header-index)) 'gnus-score-integer) From 20997aa20728a6fc2a3de736e9fc718b97dcef99 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sat, 17 Feb 2024 19:20:42 +0100 Subject: [PATCH 212/446] ; Fix typo from commit 32c5bdfa971 * lisp/gnus/gnus-util.el (gnus-not-ignore): Quote the argument to defalias. --- lisp/gnus/gnus-util.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 7218c686a2a..0b0a9bbfc1d 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -1113,7 +1113,7 @@ sure of changing the value of `foo'." (setq gnus-info-buffer (current-buffer)) (gnus-configure-windows 'info))) -(defalias gnus-not-ignore #'always) +(defalias 'gnus-not-ignore #'always) (defvar gnus-directory-sep-char-regexp "/" "The regexp of directory separator character. From 9e56bd5ed8775f53c3025b114525cee7c578e2d0 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sun, 11 Feb 2024 18:38:13 +0100 Subject: [PATCH 213/446] Removed decommissioned PGP keyservers * lisp/epa-ks.el (epa-keyserver): Update the user option type of `epa-keyserver'. See https://mail.gnu.org/archive/html/emacs-devel/2023-11/msg00857.html. --- lisp/epa-ks.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/lisp/epa-ks.el b/lisp/epa-ks.el index c3c11bb0b0b..13840da0bd9 100644 --- a/lisp/epa-ks.el +++ b/lisp/epa-ks.el @@ -47,11 +47,8 @@ This is used by `epa-search-keys', for looking up public keys." (repeat :tag "Random pool" (string :tag "Keyserver address")) (const "keyring.debian.org") - (const "keys.gnupg.net") (const "keyserver.ubuntu.com") (const "pgp.mit.edu") - (const "pool.sks-keyservers.net") - (const "zimmermann.mayfirst.org") (string :tag "Custom keyserver")) :version "28.1") From 5a64d2c7595dc393504c6eee9321d74dbd8ae9e2 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Sat, 17 Feb 2024 22:34:55 +0200 Subject: [PATCH 214/446] java-ts-mode: Indentation for opening brace on a separate line * lisp/progmodes/java-ts-mode.el (java-ts-mode--indent-rules): Support putting the opening brace on a separate line (bug#67556). * test/lisp/progmodes/java-ts-mode-resources/indent.erts: Add a test. --- lisp/progmodes/java-ts-mode.el | 13 +++++--- .../java-ts-mode-resources/indent.erts | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el index 52d025e365a..5c4bce340f0 100644 --- a/lisp/progmodes/java-ts-mode.el +++ b/lisp/progmodes/java-ts-mode.el @@ -74,7 +74,12 @@ ((parent-is "program") column-0 0) ((match "}" "element_value_array_initializer") parent-bol 0) - ((node-is "}") column-0 c-ts-common-statement-offset) + ((node-is + ,(format "\\`%s\\'" + (regexp-opt '("constructor_body" "class_body" "interface_body" + "block" "switch_block" "array_initializer")))) + parent-bol 0) + ((node-is "}") standalone-parent 0) ((node-is ")") parent-bol 0) ((node-is "else") parent-bol 0) ((node-is "]") parent-bol 0) @@ -86,10 +91,10 @@ ((parent-is "array_initializer") parent-bol java-ts-mode-indent-offset) ((parent-is "annotation_type_body") column-0 c-ts-common-statement-offset) ((parent-is "interface_body") column-0 c-ts-common-statement-offset) - ((parent-is "constructor_body") column-0 c-ts-common-statement-offset) + ((parent-is "constructor_body") standalone-parent java-ts-mode-indent-offset) ((parent-is "enum_body_declarations") parent-bol 0) ((parent-is "enum_body") column-0 c-ts-common-statement-offset) - ((parent-is "switch_block") column-0 c-ts-common-statement-offset) + ((parent-is "switch_block") standalone-parent java-ts-mode-indent-offset) ((parent-is "record_declaration_body") column-0 c-ts-common-statement-offset) ((query "(method_declaration (block _ @indent))") parent-bol java-ts-mode-indent-offset) ((query "(method_declaration (block (_) @indent))") parent-bol java-ts-mode-indent-offset) @@ -125,7 +130,7 @@ ((parent-is "case_statement") parent-bol java-ts-mode-indent-offset) ((parent-is "labeled_statement") parent-bol java-ts-mode-indent-offset) ((parent-is "do_statement") parent-bol java-ts-mode-indent-offset) - ((parent-is "block") column-0 c-ts-common-statement-offset))) + ((parent-is "block") standalone-parent java-ts-mode-indent-offset))) "Tree-sitter indent rules.") (defvar java-ts-mode--keywords diff --git a/test/lisp/progmodes/java-ts-mode-resources/indent.erts b/test/lisp/progmodes/java-ts-mode-resources/indent.erts index 4fca74dd2e1..514d2e08977 100644 --- a/test/lisp/progmodes/java-ts-mode-resources/indent.erts +++ b/test/lisp/progmodes/java-ts-mode-resources/indent.erts @@ -110,3 +110,34 @@ public class Java { } } =-=-= + +Name: Opening bracket on separate line (bug#67556) + +=-= +public class Java { + void foo( + String foo) + { + for (var f : rs) + return new String[] + { + "foo", + "bar" + }; + if (a == 0) + { + return 0; + } else if (a == 1) + { + return 1; + } + + switch(expr) + { + case x: + // code block + break; + } + } +} +=-=-= From 37bb33dae791e5f59f1d0d27c0221db3b3b4c16d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 15 Feb 2024 18:45:29 -0800 Subject: [PATCH 215/446] =?UTF-8?q?Adjust=20to=20yesterday=E2=80=99s=20Gnu?= =?UTF-8?q?lib=20nstrftime=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bruno Haible fixed Gnulib so that nstrftime no longer requires locking code, which means we no longer need to avoid localename. However, nstrftime now requires localename-unsafe-limited which pulls in some Gnulib-specific locale code, and it’s likely this needs to be replaced with Emacs-specific locale code. In the meantime let’s continue to finess this by avoiding localename-unsafe-limited. * admin/merge-gnulib (AVOIDED_MODULES): Avoid localename-unsafe-limited instead of localename. --- admin/merge-gnulib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/merge-gnulib b/admin/merge-gnulib index 35966852e27..41531d573b0 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib @@ -53,7 +53,7 @@ GNULIB_MODULES=' AVOIDED_MODULES=' access btowc chmod close crypto/af_alg dup fchdir fstat - iswblank iswctype iswdigit iswxdigit langinfo localename lock + iswblank iswctype iswdigit iswxdigit langinfo localename-unsafe-limited lock mbrtowc mbsinit memchr mkdir msvc-inval msvc-nothrow nl_langinfo openat-die opendir pthread-h raise save-cwd select setenv sigprocmask stat stdarg From bd0e281a6a27c048b12847811bc0385acbaa1eec Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 17 Feb 2024 15:58:03 -0800 Subject: [PATCH 216/446] Update from Gnulib by running admin/merge-gnulib --- lib/gnulib.mk.in | 2 +- lib/strftime.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index 9970f7810e2..711ddcf1260 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -47,7 +47,7 @@ # --avoid=iswdigit \ # --avoid=iswxdigit \ # --avoid=langinfo \ -# --avoid=localename \ +# --avoid=localename-unsafe-limited \ # --avoid=lock \ # --avoid=mbrtowc \ # --avoid=mbsinit \ diff --git a/lib/strftime.c b/lib/strftime.c index c7256c3d354..128176cad40 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -401,7 +401,7 @@ should_remove_ampm (void) lt lv mg mhr mi mk mn ms mt nb nds nhn nl nn nr nso oc os pap pl pt ro ru rw sah sc se sgs sk sl sm sr ss st su sv szl tg tk tn ts tt ug uk unm uz ve wae wo xh zu */ - const char *loc = gl_locale_name (LC_TIME, "LC_TIME"); + const char *loc = gl_locale_name_unsafe (LC_TIME, "LC_TIME"); bool remove_ampm = false; switch (loc[0]) { From c2d714886ef139f601d89463675b0d5b49d18ff9 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 18 Feb 2024 12:48:41 +0800 Subject: [PATCH 217/446] Implement tooltip_reuse_hidden_frame for Android * java/org/gnu/emacs/EmacsWindow.java (findSuitableActivityContext): Return Activity rather than Context. (mapWindow): Provide window token manually. * src/androidfns.c (Fx_show_tip, Fx_hide_tip): Respect tooltip_reuse_hidden_frame. --- java/org/gnu/emacs/EmacsWindow.java | 27 ++++++++++++--- src/androidfns.c | 53 ++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 978891ba619..427a1a92332 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -27,6 +27,8 @@ import java.util.LinkedHashMap; import java.util.Map; +import android.app.Activity; + import android.content.ClipData; import android.content.ClipDescription; import android.content.Context; @@ -362,6 +364,9 @@ private static class Coordinate requestViewLayout (); } + /* Return WM layout parameters for an override redirect window with + the geometry provided here. */ + private WindowManager.LayoutParams getWindowLayoutParams () { @@ -384,15 +389,15 @@ private static class Coordinate return params; } - private Context + private Activity findSuitableActivityContext () { /* Find a recently focused activity. */ if (!EmacsActivity.focusedActivities.isEmpty ()) return EmacsActivity.focusedActivities.get (0); - /* Return the service context, which probably won't work. */ - return EmacsService.SERVICE; + /* Resort to the last activity to be focused. */ + return EmacsActivity.lastFocusedActivity; } public synchronized void @@ -416,7 +421,7 @@ private static class Coordinate { EmacsWindowAttachmentManager manager; WindowManager windowManager; - Context ctx; + Activity ctx; Object tem; WindowManager.LayoutParams params; @@ -447,11 +452,23 @@ private static class Coordinate activity using the system window manager. */ ctx = findSuitableActivityContext (); + + if (ctx == null) + { + Log.w (TAG, "failed to attach override-redirect window" + + " for want of activity"); + return; + } + tem = ctx.getSystemService (Context.WINDOW_SERVICE); windowManager = (WindowManager) tem; - /* Calculate layout parameters. */ + /* Calculate layout parameters and propagate the + activity's token into it. */ + params = getWindowLayoutParams (); + params.token = (ctx.findViewById (android.R.id.content) + .getWindowToken ()); view.setLayoutParams (params); /* Attach the view. */ diff --git a/src/androidfns.c b/src/androidfns.c index ea3d5f71c7c..0675a0a3c98 100644 --- a/src/androidfns.c +++ b/src/androidfns.c @@ -2287,6 +2287,57 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0, goto start_timer; } + else if (tooltip_reuse_hidden_frame && BASE_EQ (frame, tip_last_frame)) + { + bool delete = false; + Lisp_Object tail, elt, parm, last; + + /* Check if every parameter in PARMS has the same value in + tip_last_parms. This may destruct tip_last_parms which, + however, will be recreated below. */ + for (tail = parms; CONSP (tail); tail = XCDR (tail)) + { + elt = XCAR (tail); + parm = CAR (elt); + /* The left, top, right and bottom parameters are handled + by compute_tip_xy so they can be ignored here. */ + if (!EQ (parm, Qleft) && !EQ (parm, Qtop) + && !EQ (parm, Qright) && !EQ (parm, Qbottom)) + { + last = Fassq (parm, tip_last_parms); + if (NILP (Fequal (CDR (elt), CDR (last)))) + { + /* We lost, delete the old tooltip. */ + delete = true; + break; + } + else + tip_last_parms + = call2 (Qassq_delete_all, parm, tip_last_parms); + } + else + tip_last_parms + = call2 (Qassq_delete_all, parm, tip_last_parms); + } + + /* Now check if every parameter in what is left of + tip_last_parms with a non-nil value has an association in + PARMS. */ + for (tail = tip_last_parms; CONSP (tail); tail = XCDR (tail)) + { + elt = XCAR (tail); + parm = CAR (elt); + if (!EQ (parm, Qleft) && !EQ (parm, Qtop) && !EQ (parm, Qright) + && !EQ (parm, Qbottom) && !NILP (CDR (elt))) + { + /* We lost, delete the old tooltip. */ + delete = true; + break; + } + } + + android_hide_tip (delete); + } else android_hide_tip (true); } @@ -2453,7 +2504,7 @@ DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0, #endif /* 0 */ return Qnil; #else /* !ANDROID_STUBIFY */ - return android_hide_tip (true); + return android_hide_tip (!tooltip_reuse_hidden_frame); #endif /* ANDROID_STUBIFY */ } From aa8baf77b47e3de114f5dc5e9aaa987bb96ed248 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Helary Date: Sun, 18 Feb 2024 00:04:18 +0900 Subject: [PATCH 218/446] Add README file about translations of Emacs manuals * doc/README: New file. --- doc/README | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 doc/README diff --git a/doc/README b/doc/README new file mode 100644 index 00000000000..81b54c91a76 --- /dev/null +++ b/doc/README @@ -0,0 +1,204 @@ +* Translating the Emacs manuals + +** Copyright assignment + +People who contribute translated documents should provide a copyright +assignment to the Free Software Foundation. See the 'Copyright +Assignment' section in the Emacs manual. + + +** Translated documents license + +The translated documents are distributed under the same license as the +original documents: the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation. + +See https://www.gnu.org/licenses/fdl-1.3.html for more information. + +If you have questions regarding the use of the FDL license in your +translation work that are not answered in the FAQ, do not hesitate to +contact the GNU project: https://www.gnu.org/contact/ + +** Location + +*** Texinfo source files + +The source files of the translated manuals are located in the doc/ +directory, under the directory whose name corresponds to the translated +language. + + E.g. French manuals sources are found under doc/fr. + +The structure of the language folders should match the structure of the +English manuals (i.e. include misc, man, lispref, lispintro, emacs). + +*** built files + +Translated deliverables in info format are built at release time and are +made available for local installation. + + +** Format + +The manuals and their translations are written in the Texinfo format +(with the exception of the org-mode manual that is written in org-mode +and of illustrations for the Introduction to Emacs Lisp Programming that +are written in eps). + +See https://www.gnu.org/software/Texinfo/ for more information. + +You should install the Texinfo utilities to be able to verify the +translated files, and refer to the Texinfo manual if you do not +understand the meaning of the various Texinfo declarations. + +Emacs has a Texinfo mode that properly highlights the Texinfo code to +make it easier to see which parts are text to be translated and which +parts are not. + + +*** Texinfo specific issues + +Until the Emacs/Texinfo projects provide better solutions, here are a +few rules to follow: + +- Under each @node, add an @anchor that has the same content at the +original English @node. + +- Translate the @node content but leave the @anchor in English. + +- Most Emacs manuals are set to include the docstyle.Texi file. This +file adds the @documentencoding UTF-8 directive to the targeted manual. +There is no need to add this directive in a manual that includes +docstyle.Texi. + +- Add a @documentlanguage directive that includes your language. + + E.g. @documentlanguage zh + +This directive has currently little effect but will be useful in the +future. + +- The @author directive can be used for the translator's name. + + E.g. @author traduit en français par Achile Talon + + +** Fixing the original document + +During the course of the translation, you might find parts of the +original document that need to be updated or otherwise fixed, or even +bugs in Emacs. If you do not intend to provide fixes right away, please +file a bug report promptly so someone can fix it soon. + +See the 'Bugs' section in the Emacs manual. + +** Sending contributions + +Send your contributions (either files or revisions) to +emacs-devel@gnu.org for review. + +Always send contributions in the format of the original document. Most +of the contents in the Emacs manuals are in Texinfo format, so do not +send contributions that are in derivative formats (e.g. info, html, +docbook, plain text, etc.) + +Before sending files for review, ensure that they have been properly +checked for spelling/grammar/typography by at least using the tools that +Emacs provides. + +You should also make sure that the Texinfo files build properly on your +system. + +Send your contributions as patches (git diff -p --stat), and prefer the +git format-patch form because the format allows easier review and easier +installation of the changes by someone with write access to the +repository. + +The Emacs project has a lot of coding, documentation and commenting +conventions. Sending such patches allows the project managers to make +sure that the contributions comply with the various conventions. + + +** Discussing translation issues + +Translation-related discussions are welcome on the emacs-devel list. +Discussions specific to your language do not have to take place in +English. + + +** Translation teams + +The number of words in the Emacs manuals is above 2,000,000 words and +growing. While one individual could theoretically translate all the +files, it is more practical to work in language teams. + +If you have a small group of translators willing to help, make sure that +the files are properly reviewed before sending them to emacs-devel (see +above). + +You are invited to refer to the translation-related documents that the +GNU Project maintains and to get in touch with your language's +translation team to learn from the practices they have developed over +the years. + +See https://www.gnu.org/server/standards/README.translations.html for +more information. + + +** Translation processes + +Emacs does not yet provide tools that significantly help the translation +process. A few useful functions would be + +- automatic lookup of a list of glossary items when starting to work on +a translation "unit" (paragraph or otherwise), such glossary terms +should be easily insertable at point, + +- automatic lookup of past translations to check for similarity and +improve homogeneity over the whole document set, such past translation +matches should be easily insertable at point, + +etc. + + +*** Using the PO format as an intermediate translation format + +Although the PO format has not been developed with documentation in +mind, it is well known among free software translation teams and you can +easily use the po4a utility to convert Texinfo to PO for work in +translation tools that support the PO format. + +See https://po4a.org for more information. + +However, regardless of the intermediate file format that you might use, +you should only send Texinfo files for review to emacs-devel. + + +*** Free tools that you can use in your processes + +A number of free software tools exist, outside the Emacs ecosystem, to +help translators (amateurs and professionals alike) with the translation +process. + +If you find that Emacs should implement some of their features, you are +welcome to provide patches to the Emacs project. + +Such tools include: + +- the GNOME Translation Editor, https://wiki.gnome.org/Apps/Gtranslator/ +- KDE's Lokalize, https://apps.kde.org/lokalize/ +- OmegaT, http://omegat.org +- the Okapi Framework, https://www.okapiframework.org +- pootle, https://pootle.translatehouse.org + +etc. + + +* Licence of this document + +Copyright (C) 2024 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, are +permitted in any medium without royalty provided the copyright notice +and this notice are preserved. This file is offered as-is, without any +warranty. From a58bcb96ac898d218b3169e76db798f192107d52 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Helary Date: Sun, 18 Feb 2024 00:02:09 +0900 Subject: [PATCH 219/446] Move French translations to the top-level doc/ directory. --- doc/{lang => }/fr/misc/ses-fr.texi | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{lang => }/fr/misc/ses-fr.texi (100%) diff --git a/doc/lang/fr/misc/ses-fr.texi b/doc/fr/misc/ses-fr.texi similarity index 100% rename from doc/lang/fr/misc/ses-fr.texi rename to doc/fr/misc/ses-fr.texi From 42179750c5f3f722b1ce2f82d2b2e73bba8e4de8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 18 Feb 2024 09:49:16 +0200 Subject: [PATCH 220/446] Move translations-related files to do/translations/. --- doc/{ => translations}/README | 0 doc/{ => translations}/fr/misc/ses-fr.texi | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename doc/{ => translations}/README (100%) rename doc/{ => translations}/fr/misc/ses-fr.texi (100%) diff --git a/doc/README b/doc/translations/README similarity index 100% rename from doc/README rename to doc/translations/README diff --git a/doc/fr/misc/ses-fr.texi b/doc/translations/fr/misc/ses-fr.texi similarity index 100% rename from doc/fr/misc/ses-fr.texi rename to doc/translations/fr/misc/ses-fr.texi From d80f1352d80938bb4ef61c5d74aa056902abd9b4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 18 Feb 2024 09:56:14 +0200 Subject: [PATCH 221/446] ; Fix punctuation and encoding of doc/translations/README * doc/translations/README: Fix non-ASCII characters and punctuation. Add local variables section. --- doc/translations/README | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/translations/README b/doc/translations/README index 81b54c91a76..c689f0b14b3 100644 --- a/doc/translations/README +++ b/doc/translations/README @@ -3,14 +3,14 @@ ** Copyright assignment People who contribute translated documents should provide a copyright -assignment to the Free Software Foundation. See the 'Copyright -Assignment' section in the Emacs manual. +assignment to the Free Software Foundation. See the "Copyright +Assignment" section in the Emacs manual. ** Translated documents license The translated documents are distributed under the same license as the -original documents: the GNU Free Documentation License, Version 1.3 or +original documents: the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation. See https://www.gnu.org/licenses/fdl-1.3.html for more information. @@ -27,7 +27,7 @@ The source files of the translated manuals are located in the doc/ directory, under the directory whose name corresponds to the translated language. - E.g. French manuals sources are found under doc/fr. + E.g., French manuals sources are found under doc/fr. The structure of the language folders should match the structure of the English manuals (i.e. include misc, man, lispref, lispintro, emacs). @@ -73,14 +73,14 @@ docstyle.Texi. - Add a @documentlanguage directive that includes your language. - E.g. @documentlanguage zh + E.g., @documentlanguage zh This directive has currently little effect but will be useful in the future. - The @author directive can be used for the translator's name. - E.g. @author traduit en français par Achile Talon + E.g., @author traduit en franƧais par Achile Talon ** Fixing the original document @@ -99,7 +99,7 @@ emacs-devel@gnu.org for review. Always send contributions in the format of the original document. Most of the contents in the Emacs manuals are in Texinfo format, so do not -send contributions that are in derivative formats (e.g. info, html, +send contributions that are in derivative formats (e.g., info, html, docbook, plain text, etc.) Before sending files for review, ensure that they have been properly @@ -202,3 +202,10 @@ Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. + + +Local Variables: +mode: outline +paragraph-separate: "[ ]*$" +coding: utf-8 +End: From f8d27a8a1fd5bdc8e25569cc05a9298e186a8c63 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 17 Feb 2024 23:12:18 -0800 Subject: [PATCH 222/446] Ignore fewer GCC -fanalyzer diagnostics in ccl.c * src/ccl.c: Do not ignore -Wanalyzer-use-of-uninitialized-value, as that bug has been fixed in GCC. Ignore -Wanalyzer-out-of-bounds only if GCC 13, as the bug will reportedly be fixed when GCC 14 comes out. --- src/ccl.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ccl.c b/src/ccl.c index a3a03a5b7b1..8bb8a78fe3d 100644 --- a/src/ccl.c +++ b/src/ccl.c @@ -35,11 +35,6 @@ along with GNU Emacs. If not, see . */ #include "coding.h" #include "keyboard.h" -/* Avoid GCC 12 bug . */ -#if GNUC_PREREQ (12, 0, 0) -# pragma GCC diagnostic ignored "-Wanalyzer-use-of-uninitialized-value" -#endif - /* Table of registered CCL programs. Each element is a vector of NAME, CCL_PROG, RESOLVEDP, and UPDATEDP, where NAME (symbol) is the name of the program, CCL_PROG (vector) is the compiled code of the @@ -609,7 +604,7 @@ while (0) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109579 which causes GCC to mistakenly complain about popping the mapping stack. */ -#if GNUC_PREREQ (13, 0, 0) +#if __GNUC__ == 13 # pragma GCC diagnostic ignored "-Wanalyzer-out-of-bounds" #endif From 42c6cf4e5804312defa9d9caac8882500bd38179 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 17 Feb 2024 23:38:30 -0800 Subject: [PATCH 223/446] Remove no-longer-needed pdumper_load workaround * src/pdumper.c (pdumper_load): Revert my commit "Pacify GCC 12.1.1 in default developer build" dated 2022-06-13 13:21:18 -07, as GCC bug 105961 is fixed, and this workaround is not needed for unfixed GCC as these builds should not use --enable-gcc-warnings. --- src/pdumper.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index 5c488d8e90f..509fb079db7 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -5593,10 +5593,7 @@ pdumper_load (const char *dump_filename, char *argv0) struct dump_header header_buf = { 0 }; struct dump_header *header = &header_buf; - struct dump_memory_map sections[NUMBER_DUMP_SECTIONS]; - - /* Use memset instead of "= { 0 }" to work around GCC bug 105961. */ - memset (sections, 0, sizeof sections); + struct dump_memory_map sections[NUMBER_DUMP_SECTIONS] = { 0 }; const struct timespec start_time = current_timespec (); char *dump_filename_copy; From 659770fdf535ca683a97d965d2e4ed0f9f321145 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 17 Feb 2024 23:48:20 -0800 Subject: [PATCH 224/446] Do not ignore -Wanalyzer-allocation-size in GCC 14 * src/lisp.h (SAFE_ALLOCA_LISP_EXTRA): Use pragma to ignore the warning only in GCC 13, as the GCC developers say GCC bug 109577 is fixed in GCC 14. --- src/lisp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lisp.h b/src/lisp.h index bf96bfd39f7..79a6a054b81 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -5525,7 +5525,7 @@ safe_free_unbind_to (specpdl_ref count, specpdl_ref sa_count, Lisp_Object val) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109577 which causes GCC to mistakenly complain about the memory allocation in SAFE_ALLOCA_LISP_EXTRA. */ -#if GNUC_PREREQ (13, 0, 0) +#if GNUC_PREREQ (13, 0, 0) && !GNUC_PREREQ (14, 0, 0) # pragma GCC diagnostic ignored "-Wanalyzer-allocation-size" #endif From 4a8d3c5b75b28167300d2df061d053935809d43e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 18 Feb 2024 00:12:28 -0800 Subject: [PATCH 225/446] Use -Wanalyzer-deref-before-check in GCC 14 * src/marker.c: Work around GCC bug 113253 only if GCC 13. The GCC bug reportedly will be fixed in GCC 14. --- src/marker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/marker.c b/src/marker.c index 0101e144b4d..1559dd52719 100644 --- a/src/marker.c +++ b/src/marker.c @@ -21,7 +21,7 @@ along with GNU Emacs. If not, see . */ #include /* Work around GCC bug 113253. */ -#if 13 <= __GNUC__ +#if __GNUC__ == 13 # pragma GCC diagnostic ignored "-Wanalyzer-deref-before-check" #endif From 24e8fceb960e0b3b7e270211bd7f460c4c871008 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 18 Feb 2024 20:03:53 +0100 Subject: [PATCH 226/446] Fix typo in 'cl--type-hierarchy' * lisp/emacs-lisp/cl-preloaded.el (cl--type-hierarchy): Fix typo. * doc/lispref/type_hierarchy.txt: Regenerate. * doc/lispref/type_hierarchy.jpg: Likewise. --- doc/lispref/type_hierarchy.jpg | Bin 217746 -> 217931 bytes doc/lispref/type_hierarchy.txt | 2 +- lisp/emacs-lisp/cl-preloaded.el | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/type_hierarchy.jpg index 0b551b5f01e8ff1b704d3cc53a42aa4a95449a4a..729968971652209bb154a2ab8c15172b0f8e7da7 100644 GIT binary patch delta 50852 zcmaI-c|4Tg|38jjs3?2(bqb}jWsfjYNU}v_OR^J_eRqi>>m*xI$iB;-UG^npXJp^^ z85xEdGvDj^e7!!e+xz#=?~m&rH@7+GI@dXm$9+2=b7=c>X@lRARgoL3f!PALK0XB8 zGZQYLaeKBH~Et#Gmu z*|DPxUdSN z-kLH<2nv?37mAlpjz0XBddAvs6zrM&=u@XCd^;hJ67AQLg=<%vDAoEROOMFE(LXh( z_TnqJKpUd|qvtq-7Ih;t_|pHLLN?T1Tuz85tzp+FPtfq|xaGf6WI>Uurc3a5nk?00 zDJQ4rzk@YNEAb@Y)mWqs?s1vuozX^E*&p!@+sL~%gn&u?Q(a0URkw5$uUrEO(93XO zr9RspP|ZQ$*Y03Q08;NPaoMTaB|s-{8Z5WWb>SzT7pf(OD)X4jXz)i+_iVkFujD2( zt0i2O_~V}MQ`TW*eYR>^U8|2%$p=k5K)L`>pyJ~7;mk(Y!R<}n6%w#w=m=B>E|*<$ z7^v9pkayG|0SXg~<|JT0QGl4Z3}aWi`nnt zId-2P+hlK|9CyEu?m8QdP(7vG5TfWJl8*-XUP!-?BQ@OaAeZp|HOEhOq4?h(gnSB% z^)vpZybjo9bami<~E|8&s(C*H8S_Ob>!Jq@@m zX+HUipqLj}y8p{^N z3N1l=x8L)Q89Nu%>kICEhrEq|=a|to|D^%L`L20% z%)M_jLjpBgz6khCWP$Eaolgoa@gIZsh;xm4QQfDBgUBKaQyjv5W2B!oi#hq5N|lu` z-&Ok02MY&G`5AP3m7ZTI9%0UZuN@bDS*I$eW*HuRnnh=T521ZFidY;6r5dzU=9N^( zZYubP(M{;K!`~DckacRf7vb1Xk|&wAh+LFwbst>n%X!O?*z(xjB*-VexD*#cwGg@7$l*Zuu4J3Y6(XSNq`}`%)fQ~Xam|$#xPz{b$gHNh5Y}0h{s@HU4+& zv8p?642}-pV*Rt(EI#?-&@?=96FlH!B>~+v*O$N0o9N6m9Rf2(NN)kg(4G~)l8MPylvavdxX%_~aRQXv{M5zj)HNB~c1X(W)B zw<+%xM;VtpWis7)*6(8|enMuHOlCnI4qmCNtZqW~*Vlx35O?y~gVet71&}RL*UXBA zRedJ`^Rd%8&03#~@{HI3nV>{8%MpPxbN(HV%-?d+>0;J3L`Q6~7$%0RR1Zo`G&PoC4d zu1eG&ULimW6NK(30W)8=NkFyMzaO%82_OMU%^dKfKIj`(>X868iph3C^p}6fOAWdL z4(ZS!apy?DvU(y0`rrQfFn!{z9pWrs=-)3;j>8g5& zlLVMmy@ns&{C6ZF=#Z~RWRn2X<V1?ven%HMjy1k+Qjwammn6>2n^~ z9sAY62^#W>0g*zbbU5Df0y}8n>1?O{yV&GdzabVit1T9NW{j>G_F9v05$p&F*gX$Fp2t^@ zZl*kqjmqn^%tduOJ2A9%v$vk6Kk<+6&7j$(XlJl5livB;3l{x(a|C`>c`e&Z?2COL zS`kZGw^nQa|9W+)MVEX`Z`e#b$}C6P-0agw)olb7v^KJY^V*d7$5mvesw5yXt23FG z50R=p8a3@;RoUz+wY;U)8pzV*R9;x`mF}FqS%V5pP!V#npSbbCOZWDzae!sbZ{V-I z&vA!F68>5qc%&Eyo4=&Fye(YVg1)rxIbg^`uhKGZM*@r-D1NCQ*MzuY72%wVE>Z=> z3QUXU7uMGr$Er1b#nin6*S1~}Z?pwVVKrH*n$fHwpAL3QX~JQ%A=9nU@%!vF=z)*( zUYs#EfF@*y))CK!N^Qs`4Bj%wgXj}Vjn58JXP0nT=Eliov8&|XY*J<`L@?^`n7I^oVvKI zwy%!sNd1h{Coz$cr3s()kb89k5$!_sy6P8#i58J%P@M!`oQLtqk7F>JECH| zvLAXmqJz&pz99K!J?)EUzRie&4qFFT3!|yA!{wRY7d7JDqTg=GQS;w%e^13R8`HQv zHtD1a_;v&_Va$`tt(JuNb9vlsU5ks8N8XFR?3sG65Fe94n+KHM_FhSuloxF#0hco{ z)TRz0ol?u-i#{;{3Cpk6qLhiDA=y?6v2OB4ma4#OKlod0mebO<;&VkMD(T}C<)dUB z$p_Za>Q!M8lED`T1Iy297;2Spa07Dn9&PzgDhQ=J?s2Ab`C@ijB084(u|yl zhr3Lzr{XVF#HtYNOXRy}C$Kg)If}GTJWjv!GiVSOrz|#~vy4g&Xow^&^`Y**bk22P zY`dX5ZSzDjdYRiVWjYh;r{E*>+4mpgVwp9DcT}yCKb-Q#KEnfAfPE!|>aX135J&?` zHQVT)oRt?lr3oqr^#)*2)8bG8`=G+^8#?`Ug?|k2AG>U_MU=ZMw!1!}AQOZw`dVw$ zK8zt2O3nsh_TO}R>8WxvWZ&*8@8o><;9hXXYk=n+pp?v5N>&G|*{BM4+=|WqLS}6A z{3aS3!MFc>WVdJQT0;!@IfK?wC=n5%L{DR==ry+xJJB}^ZU7@-+s_dJ2p4OLxb4r; za;_kMWiXSC4?`5-`bf)Z`bD1<3%tie5^yNTnoPVL6QunDEn2KzJZV@?Omlz;i=J88 z(SB6wo{tC{NUYx~N3P_?KeQ|a~d^+I<35a?_0-g*J)idZyBUdFc6!Z z9u5V5Z@&VS3>zu1EzlB12-xK1tKs>TqOe1`RH*vTPeO2lTCh!%2sS*Gna5(CrQoNW zmztcGEiTP1@5~8|*a+eb4-|;T1Axo0Ub`!88zSV{s?I+D1z3)T@_A;x|2~FF3(?*cc!D4)~G=Qz%w zqL1{{VF=o9Gx5TEEo`Aes=Suxq!w2Rw_A3fHVOWmsPXPE-13%mJZx9>A&eEghJau{gR)d80m& zQ(2UhaisGWSdwgHYdvU^cZwIsEm`L)MLz-Z8Qd)BPIDP!~JEg*iNLg0+^ z5hA>0$#q%8-&~>nm0G-gVAkDSOYDbT5>Vr@%XTKY1dAxs5prNDP3JgltNH~$xJ5J| zYY({BI9r56w#a)1lK@YeWH%&!;i;nS)Qpd+7X8Y7 zU~ca%Yr-<~_1CHYyO^2rZ!fG6_;n@h7=#W#A$T0_)1+uOU4lw%rLi_hBhQ2@5ra-I zicnwn4vW7I^Zhtx4(;GKDi+B9V8tQ~e;Zdwe@XkR?rM}`9U)uKC=-+S&WgQ54y{Iwt*0u%dE~{X0m6vqV^2y?bBzxEw7LS$714L zbj%MWM5L4r|M#Zo^d9c<;l+}3+%ZgAl#@FJL>5O{iMFZG^D$KqJPwwg5>ps-ZqB*Yr&RG4Fo0q zmTaP7xjNEAwEUeW`$I+B6zVlDNhWGEpALPe?BIL1&K!wf7s}{1;{!8!L^)heQyYqh z;N#&j0E(+v?ipH>J=51AO{>fqE&FhX|W6EdJYwovT&(gMX)K~@%#)C z7Xg*n?(P4O0+7R;F!@}lx^f8ZfO5n@>?biDo_G_joK95X6~M5p1s$aBU)5Qp(iSR& zScEFhX_0m&cQ~uwrLHkWGZaE497WG3+vREBlaD?ab;gYLRjU$Jz-oGJxk3}If!(>! z=T2kO&(ggXPLi74`d1H>Pm)8s=$Dn*Se`Q93I;ZSoXpI6)9~sz=WCHdAuSEQRuX*a zPrfC@?Z#mPln(kD&7pU@Ya* zm{c%c0!#P;tscayR@FG<#12x=_}Vy}bJ2IN?`e=QK(mzZEAtHeuM|QhQLld3qv+3B z+2hI|Ll!dU!L?iTbWTUjf@o}MwH0?S!lSq+9^kf&JRsxG#};w^|9dU=(EtT>09b0~ z8tRHLP8~jE zeM-z*$sn6^cG#?4UWJM^bGXVl131*wQBxWe*#|Ws-hX%JOxLLKRr&6B*cqNIVN7c+ zw1eh#D`CGb^^Fn*be6!+b2DwHo&|B*Bd0kBDh8(~H%#v1-j&@e9x!cB5pCifFw(4Q z>{d&;VjL7R7IYz499(3b!0M$l_@u3L`Jo&%j~+I^JFw;_o)fZDN6$rN@QWtq&Y+U; z2Ydnh#J}mETP{1X<23b0)JOoWPuSl1=Se0JvR*5Gf-r) zUeM4@c!4|nQeb`gUdIu6u+$;#<@t7$f_z}5LaM~bz}5Z%e(uI-|H{i6CGs~i$jb@( z#a}7fWl_-%YdW0HwMe4h;|^gbT)CbpOV1Vwz$jwo60^kyoN~mDa^~|sxqY}w@NOZH z*;81x%il(mfUq5@CZg3(hQHQOrTqv4KhI!Zc4LZ>Kt+GX{5H+&`lK9B@A$K!+nEq+ zD{;c5>l3@sr6mOvVbxVhPf38!%_~7Z#dm+SEHdL1rQlwgw9I)E_gLYEL=UpH=Ui%I z1ff8`Wx*$7huc(Br;0sw@z^h+#9dF5{e6N)X_?;jmP}N7=BE|-DT^Vx>yw^vBMg1e zdef+RoGt_6Ag@)WicZ9m;Fl@|_p2SU6;hF09T}(ZOD0dd>;atRUtH|!na3IezpvZq zh&4GVd)uP)O(7jiRSiEL?;Hh9uqMghgegQILNN*o#iF4%X<16Iw!%B%p-u)d*qtd} zwfQ3%Ki39tza1wgb985EwXkf2!jXK=5576#*tx zM#Ei|ubRX>zFZXFLW>WAe{4^mp55(g<{7_^SCG#ZH$Rj~HV%0ms8CDR@(7sEjJ!c! z4W7NrEwGf1!8UrcR*FvZ#oZU8|5nCWHBySDzc}kd{aDW_e}n0dnT`PCTgk>}GCAMn zBwX~OL$>_$OTNV}EhEw;)F}F^EWLU2DBh$ckhS8TD6%cl5}Jj6j0or6 zw_*7tF;m1E7w<7G;0AaiiR8<5r7BKba$t+C9Ln?=Pf5yRh6ww0{-atBi@h(G@9aMR zU9Xms;=b9RXCe}vT028!@L(p^R4AJJqsH==ak7OWYHF)j3es6;Uw(Y(JYug&0)nSz zq8H-Q{eV?Z^Xo(HL?yH}%9`(D+4Uc_4RJx(k&|ncH;IxzDB|N&@)r9Q#f&kO(R(1_ z$<=th^0AdjCO4durgBCH<|F7u)%)j%z~7X;YiMLx-ffOX#q1vE-|BSu8$$^hA6eWQ z0gXF6y+uZTym6o}%j#O9mAfaa0>rY_J-V|Ph_oR`6PkyM~ z=(nGIvVSf7)TJDM)OG4+6&TYfIkYCTm8%MYd%4@-RJ@i23 zJ#XRP;WiC)Ryv=e(foF;ds{wyO?P(;TU_wo)8FuRi7RJW{k(R`Uv_3EU3|MA4bnvDM|wH^?q6zhV42PjG%?CM zU-X-M*5=>m1?OD^YScbh<+4YQJjc1;A1ixu1c_jyrKP`t_#wyGEwY|=#<);r?(lG_ zel7&er$sq(kSwdII=khCcqm|JME@3_A#*`ZuG7s=Hq7H<5ZRVVLJDunaj!#u#h>bI z+owVTKOerbW&pYsUKkb0f^P{j$NICf;fGnSt}TNJ)9TGyB*5RbOWVyotuEVw%Ev}{ zrP6|KliGK4^4 zA2+5Cbgo~<<`{oBDtcoCyKjrcd|fTRXh-8D>?F~_DLc=}I>^R<9#rSHsu9YcP!J7B z6*3om_}g~m+hyN+t=al+>bne2#|mX8*b$3Y_7z+6a60Ww_O&UcIle~^8phJDIPWC9 zcV3F{>Wcbsap9vj<@1nWg_>>r9pW#;O^>8qPnWJchN@36k3}C|b?odPeAva2Wv|SiBnFe;23vB_}i)+I10I+GRoG6Xfe+lX`zt;N!;2#k3I# z8;+r04^QfVzni)P3-i=}-oGVs4X-j@iM@R!F4J-DLzYnM3T9uKJ2|3ih;Bm`B^qJ% zO>LmaLi2TviYvlKID+Ac&0?5%)m!R*n&r}$XzNP>mP;+Pvzw+ zEe$)+lVN@Sn%7bj9SL~+ecZWuD1U0^`MobEMvTHy>1Mb2icEbFDiw{9d!wqO8FlYu z)TIpbOQVL!f_u2rC`$m}ExcIt(%oD+ev+RjFL)pf>|_Qii6d|aGRo9PSDwL~iT z8M2gg9D(No?lMdCg3h@EC8>dro;}M;hU!E3N%$q$ z9nDLb;}@I$&HnUZf&=Pl%%|jt^G)^YE!$Nzz3d5>BTa7bM2Cm<0ltJ{?P9O?Y~?PExPhX34+2Y z(ef?t_Xmse+r00w>xiPpPP=(^28c74=RRf7er4JPTc+f_kCF-CS&~>4me?3LWM0jK2rwjA_YV);Oyt7;CBElCJiYS+Lpf@7XB++LbOYX{wD zmGN%$txrgR4Gz^!R18qhbEG~SP}iB7KmPNWk|<|x&P>(^zVhiCU9Cswl&ry#+GEM- zIGVywgiUZ!mcb5xzx_F1W%rzw)p|a`QmoU{0Mw)mX{%hmvgzA^BQ9ahR@DoPE z>XHDh3=6|_=mcbPgUJork;yh)Gez*?oG}EF#gg% zhF15nf_{$Xu4r`oi5BFlv-AZfclVDPq9LBtl=};wFy;$F;$4#uB;KL^(dokeRsLom z<0 zMh(H!dG7f)5IB03J}CKL<&VPya)7oQZI(3X11sCvA!7cL8Em7l6eI*X60g?rOlZA) zO}|hK$%&q7+a@E$l}An5ee*m4)8p{Z#bP+axyuMFN(TjQZ><@(9Lh-hP5umGt>~U^ zl+Er?$A~2O5-=%1iC71mvSXF)5g5KrRCtj%Y-Jr_1;WT z&1uYwzYRunaBZy%gG{DU|C9OtmHgBnSyyz^=m?jVcSRb19VCA<7C&Xg{MVeI;!a!C z@35%sD$=%kZLG;qX`8;t(SJYXLrZWq1p0h7(bMfz)Qxq zcz8=s&&;$tII~nYYA`e2c(|e+?8&VkkQ5#^c?!`^`N|V_wYHDz}NPF=u{{Bmwxjcw?6~f@(QVq!dEJQU; zWGzi6kbsWfw}w~4Z`yHOrLQ?K(ZMksmezl!5udro&5+s6?8wNdMxM_OfchI03B&MF z;uTyHfza!~QIl z@pQ+RK`x};5Ni!u1wo&e>;gGTyC&& zZl^XJ>Tg${qrg5wMClrvZ0*LE9+?ZZd!^5CrtnlGIM+<%5mWkq!;aKUrwmfm-x5mhNq_a)#v7Rc zJBi7!WHPYNtTwW0mXj2R9D#4Vi3L6*2K5-)hN%t5p9{lNgulxlChzS2d2ok#4soGfG*4td%4OLm)u0W< zAI<)1Qt4Uu%V`PNad?hor*MF3F$$+buGNrVKmJ)~ww7`=YMY-1tS>S5`^U{cPXXBmI~+ z6ga!`7JRg|0c0kRnUTvSmyD3jgJprBL$0x=f1o={b(K)PhRut@tUoD0xt^KXPX`Je zcd6HHp&|mYEb3z^E0abTSft$VlCHR1SuJ(lw^bv^XBl@|5ACq{+~OG=rK;>j@1l#? zhH*KjEjQnvI(TsmCzNS0(50|gf`zB4MQNw38zpc%kL+64!H!Wep%_O{2dB|^-*X^5 z1kvW@g#RHz0+a{mb3Dbn;?$r5^gioS;cehlKc6B2Z-KO3l|s_bP@v4!9H^jEWl4d} zf-}Gy7UOp7-Ov7G_TTNs9J~sUy>rMG-vu6;>YX($^#{2$a;)WVz4E-14G;dH{!gKV z9R0S|QRkKwP$bVuUYU5d8hQdAA1L;~<>yAFze<{f4vk=`O{W@~8v7OkU;7k|zbU|p zwVxJ~0EblVSgyIrq_;oi(=Ehr&qJ=;sSr}8Sp+>b>)=iTF7l=|IqyYw`h=cE02c*^ zgW3P`|< zZQ`|)MvcHD>I)>`lVR%3^WoW*=z%>Z`(tTHN3aQtvrY1I{=%Bnd;Buwb`-XCf8TI} zye2)*c+*hN*x~3qYUaW1xCd_xg2;=9RRLzb|2!Rz^2=t~?xBMvJPz>*xpsrKCA{yif1z7spf@jM?-QIDmxn{2%gd8 z@ZLGw!ubuAp*$O2A@w*Mki@7AijG#zrIriR%PVZ7W{i+axtmRabu}x^!{cGhX~)m? zg}&GFE}HxX@0%Ou5aTfLb~N(DYqZRTe(84x(YDS4TmRZ+Qt3|5@d1>(8p)t5Y9*v! zh96h=r;j?4fJa-~322y%{3xUan6;c;w;?8u|BnB8Pb8UyCf@?dFSBTh17sg{9G9y6 zb#Pi`@f|5C`y($ueC6#8?@<;A%<1-WDWsn@xI^=pc4o3~sw^x6B~80kNt3#&ij9Sa4|A0J7O>}d zsUQQPj3P?C0<1nu&z-#TRvq#rq>^f#I+9jhrpP#mEZeOME0gYEjxi2gvI}jgyvn*8 zBzCpY6E5BJ%)8(Nlxe)c(YqF`NLSIQUWUS1sr(quq;v{`O>FT=(1SvBIgzV7R=?r@B%*M)O@fq^#p!}#>Qg=6}l;IICY@|eVA?@yfeAk}lyXJ5^ zn&Fd6p$9j=s^bGtp%epB4 z$%c3U8_?mO&&~{%RDhSRY`fMZn$jy4g9+#%`9Ab4ey5#pW?~M)H=*`dcXU8Tf>hGj@F8)e!NpwCpaGW>OY@U%3 z)9%0fd*w(O6?ysxdI$MCloPf8R&esPl6>{-jY$xd(6Y5FvhuY#G6#832FJm3`%WLE z%>KTv!Ebu!B5_OH;S<<&w=XENx&ZUscjl+MMrHSmXKKF3hUBQ|^eeox;ee-~QZgdb ze!|2&zk~Hd@y#ujXls006a&fkNrmtX{F<^+bc954G!RO~klmsQJuzGE(=q zDS|Rx{FEesUvIJOu!S90tH+)B=iZBO)QwPCqM~Gwf#9i5XT&Er;VJ|D9otXot5g}} zuz7+}gJny-P1ESA2_^d|IrD7|3=M!NIo@%hs1p$(zDVQUMVwt|hy-kLViF7fv78pvc4d|MhWMLY(XtTC@H@wJ^KRg zthXM;oZ+MLpblOt0H3I@|9>XOLOeqbHK;;y(+~)`eQ)2)5D5hZsI(4z5c)4u9#=4C z&6S@pU)Gt1!X(sUs)GBXlzNf7g-zIZxp_7siP$P58EEPF5+P^ewLN*Ks=M>~)qiS} zy29lG4ZcJQp@JLYt;!0Gr;Geq*PU{MG(a4ovpJ5z=of|YES*@N0y+ZJBP$SmIxu$%ir zWJHf4DO$p-lKed{QcEXTcV(=cKk)%RstG-pyZmh8;jB5kjj{GU-mb68%r1xKw}=N^ z{R0w%OIt9kz7}~y_x$Qh2{?GkCihL&GgC8D<4smpG~_RrMRHlICfEJ~+JmICQ~`tP zk*aMjCMyR^Cxoqgs?Rrr==HL`3v&6d8sV9n6p5uuayB^`D#Y3Ld%((-D!FhlH`yHG;;Hobxp;Hq{69nDZmVHPIrM zuQU*?@uXbqezW^{)~B)~)H$b?z@Osp`J6|v3;@< zzh?GCZQTV%TLh244he(zW|)C}`i<{6@P5sxWn9j|8wtpe^fP8p@Q)LAz1h!;P1 z1$^p{$D2#E`EPHI%uSpV6R6-mPab@A9P2Mat(mUZlH6bW*7}Qe`38%+mmokkmePTq zi}&@;heu$i8k-(@9PBz@?D-!2xAN?0p$^;1eW@&a+T5q;X=sOEXTwh`7jFmofUNW2 z<`U%dDpKK#2*7FDUCw_~D>pJL0<^#qdU{;YwjSe2CEwfHx1LG1SFP@0U!DhCcLNkO zG4<4U2Djm~#=Sxxd}Jkpf50Co_%V!cjIV>#Qnuga&sIi!C+U5Uj0F`=${2o?q~Di{ z4+8v*^p|NLY%0-Al#P8rPxlQkH|$yY6WR|zuc1?=b|V&ERJdi1|Q<&=CM)H5@^=S^|XoyJ{dnU*_}!*q*Q z6N(;JK(7A5!x6~Z+PqvocqY1~X$e{QSE)c2C^q%hu0y8rnGcEt*x58!g)Cz)#hgz5 zo0GQ2>?m9>U&Mdg7X2#xkH#d)c=}|y`%D&Rjodr zfmk6TctjZ`dZ!+fmynlVKFSwOym0^8KM7<(C`wKOwEk&c&EJY0m+{H9`>W88R-wWV zO3q}}N2Tl)VkC8{E28R6+sZ?+t!q%Ww_JuFGz_XNd1lY)KJO^`{@W84Wv&!8MMh?~ zU;bpuO!M<72QMZI3o~_u6M6DSV>3OENh8wQb$tIMVrh9TELQu0dR66-gCbj|f0|SIe?*gigp(hN2)#%W2z1mM zxd))&Zx@{E&aO2c^xuM#)lvc^pmBTCTrdLrbMfqw(|FWS{mbtt)7VPwb;m2GA0;;= z{EY;QHo_mHpC>MQCl57ER8uWCr#AljW%~pCX5hL*#Y{Hh1Jg-&|KM2Qo9A38kQec43RQ$qFq&inq-*()T5NV@~7s1MdIu z2g6b8381fZk!c=>!w_e6v|bD4QTLu^j$}^|Juu*&}9)wHp*E;E!sVc?u~_CSt{s zhzy^iiAE-5nt$UQA77bX9(ZDLa*Xbm9rY+90bN@NmKkbip*ED`A!k$c3x74J@$AYE zOhRiFF^_Zs*C*RQbkUEQ)e#fOMsc^`f~`S3NPLRTcSy?9G_6iu#1YbI9rQrAK^DRX z!^HnkpIW;Oa&|J%*rYb1N`yK_->9O>rB}F*r#WhjNFFS04~ei$Gk1|E=QmJCxlL*F zIv)2AeZ6iHHi+{WYr>4rjV}88{so;J1Qp7E|k%bRlMvh5$})tl4qpFX%T)Iq<8 zv-Wp^l9UuhnRPm{-J3(x3esY=s66OXI8?)Clq5q{BMAHsN_SC?t?THI(onA9Kf%w6 z8P@`wQHP8VelV%XEfn+a%QCvi4~$h1FBm%VcXk{zJH#vOSSAy30kWIQJn@!7JRr;G z5}$A=|5`s#FsFXu@B8J|?1WQ3no8IU+83V{be78BCn0DzMJCjN`Nz%ueQk<^rc=7- z&k&s-9412_jh1AOOV^tBTe&Dt!JC8*V*-Z+ze}?s7kyi*^vy6VZH}C+lzo?|LVocU zT}mUC23hUgDKTfeHyQx9b@rICybM+%;(CP->b3^gldK>?^MBeAnJQ#{v^=e^t*IG4 zOr9xrEPYY?%C1LQQlNX9E#2$Z-QVYh#Bha;PNJDX&O$0)wN=EON$Z!!ift6%{gV$1 zY@n~4*U9BWJd_vxGE#F_>-CJ0(jq^I->W^0xixuzM8ugUW`A&QCH;wxo3@5x zuk@P*i^Gj-B!es*RsR;r1ddX*xWg76*t9GdkU^?TCJD$3P{BxJPLf81oaH5_7;^2- zY%KbqQ=r640F1)8D4uo}88|JJ$2Fy_eAG+o1Xg@V`@hHxw^((+#V>Ic$InQ1!Z z8owisH@vIq*=ZL-aDf+Z-It_OzCy!fE(7Ta4l<0-Hjm0pO*&+<^+d-h2*(+8uYD{` zCLm$rvQG#oQa|M&Frz~G?L!b2x_*?yJ6@9QV+!8;T{kL~s_8&~{pr8z_8L5*#P9zo zD|LwXoNEP(Wf#r1O-zlGt8Y9P%ICay#qMeAt?eqp^pK*wk-qYI{V}Ppca1`O#)?G{ ze8klb%`1fWMG3l;0&^F%6i(7O$M+A7c&@1b-9=7tNKg{al}O>T4AIB^OW=SU>u>Ov zsWzyVK* z3};*p{8i$8`*%Nt_U6SaE8z;TnhuuO(DMr3Y5}v0bZtq{MJi zr?R%H_Icbrc2!s~bhj)#6Q`;1d)?{B%a7}Nt`TDU0+MF%nxhTHFv@C||H?)GPc|}Y zZmt;>78NVI{>-^#SwfTF<0*x}q}-wqSL${ul4UDS%BVi%Ty7Em%i^ zbF5y3kilq2-eaBAdn4Cr{pQ;}-5QIPw!&%Vcb$1+yb{RXEh|1ThqZAg&NgdJCa%no zjSXDA2w6bQpB;}Paym2Z4LQy39PI3l0P2B-7eH>??~NMJ(a>STAs%pdGnW;by_vS; zvKpFD*N6P7(u!bl1Rq&yJ3cjCtYvN6=Xw2fQtfsEGgA+Hm zH!6ea)KD0<*@&|Fu6%Th$ z`Sgmw>;Mh)7)5#|>iO*LLlW?m9kL4Z(c!1sW(ntTiz(}FgJU&h%$J_;nh9aV^=FcQcgi zRe|#X4>1qA)32lYru7K)gmpAXaWrjN8ZGdo2dV(*DEP zRtRLsohDO|0D11O=Faja!7no)W=M>8slrMUYHolgk<{IGar4P3PYg?V; zUm0Eb^!AZ>@I|!`Z#H?IMvIG`rM7Kq%Bw>rW`lNg)fm-()7^C5DRJiYuBizF+0t}m zY-4Zds<(2b@@NAq(DmfFsp;8m;&qJggj5Xd$&Z>bUiPrO{6>1GSIoZ7obN4OT-lqW z5?CL-POGWoPXfZ5sgj@8)sBgU)j2uy=0Twn@o$n0GCh4|zr}t5gA_Dqr-`yd9@x_q zxoV#4Z3oYA>OX2UID+22>6Fz2(MJ)*zHpSEQo8?2NO@rHw7|j7E|on>9!i}@z+$ri z&Pnw*k=y6vw&v)I%9O3Uo?luU9=y43p8cjP$abAWZsp6Rx~1M%)i551Q?5-$$J&rK z&BWR<(YJ<{)bD0vkj=_Q$b^NBW6n-k_O{(>qq}jg@zn@m2JWwkH*Bg>%>n6GMdB?TiFpD%dPi`p=(@ zh@8D9^k7tGXF=VA#8o8N^Ox_O%ae_FmBHd4)F~q4+x>(#j%uHnom?jpSNHZ%jBn>= zfgyog@66JE4EX`5%t#gGbMe9Q@yg6tWCaO$X>nGIm{uAPOmD~?$nyeeCYcsRygT)9 zcU8lQ4BK_H!j=|FrW^d1EiZ6!MbY4c9p}Dz1%PfSnNONNesZ9AfkoM$I+Snid+5@N zfaTQd3(CC;UR&P`prAE7;FUpVgxBe2!ax_AQV~a`p0lA@=V@hnluZ@VTH;i33 z{pxu3ws!K$YtxGBetdMyL5dm~w6t6gtA1CdI!kn3GHq=z5)|$(uvMJ;^3ngJBbMd! zlA^g345V|EFN&GBd9(7Ah$lNJTY3%W1Uk`^1T6)lB}I?FoR8|w%i({*ud66kG$3(6 zX-#?KwQQw#i(0bU341>x8AfZ5a}X)_aSh@nDZt8J%aSEVT_?QQ&oEV_->NG9PK+c8 zAdA%*tgo?oAlh+W@1u^TS>9X7)PsTtERO47cI{Fh{8;4oO$e&Th?rwK|2j0EpA?N( zdO7{5d>Ox!V}#`kz7-&6h@g08{)12RDCs0(>+y(G=%J;?V)`MH4cCTt%iN<@g<}WL zS)KMcfg0uJl4|9nqg>9;%WtiQ4a5$M=>Z~Ma~uH$l8>J?Ch8Ox=SrXPGXrVNuXRo* zqY+aJJO--iM=xvNfoV>kMiZbW-GK9nR&t7YG@_3SPd+tlegjWjuwdHyyyP^iy{J>s z%ZD63Z}d!|1h)7tOitt59VpS@_2f5YW-ZwOIU89#`sh3;7Pzp;b6B4qj!0J@+ShDz)-W;O4xp6jLvuXBEzy2q!{x4-=5E24U&Tn(> zfuEW_&g**LJJj&bC*%`bF=pJRKI7RG8BL>nABfj3{pU)U9p=#N|KsYrGita zNrf7tXNb4AgW-`zgILO$6h5fj$htCnt{BZ}CSi8Eu{%`=dn_ZNCcD0kiiQdWS0p;- zjVKESp1?5|ZEdz23TIh-401CJ;m2=R+A{o4m6w(hS9Xg_iWnVS0sdHtL55W zEfDRCC}YX#BN&SHfH|wVphe@oi)~{(;#w~YU*Jg*dg$lZor5=2mbeDakOn29Psy;v zmKu?b_O!{HBXgu*eg^VxxK!I;mpZl>?ma(NJ^hk94_sjG*c~eftL8REiE;B(DUz9T zN32B9Ke@Pn=R@$cU15=G3t~rXM=wN5)-#Zu!33Nj*)L^Sp6(px?_Z}0}?nnw*UcaGcx=Jo(aawwJ3fvAY$Yy^Y50Y*pIMIsg zOFQ;~lG?r)0Sw@O!s(aLRdZ4wf}^{>7C{yg^AE7x$H;F&e~h$6J-S zRK88+>qWvJlNzs8eZ`qp9^93RruAUy#e0w@fUnr$5b#;@W)-LK?{;dE^a#t6vX0YU zY6w+vpgxIJ+n%?;>#rOQAluS3u{|(1?YNlp{E1P^ggdeDI}i=BU`y3%#?p#+BzIo{=3e^Mm{rqi5w? z?#833{Hmc6&Yc1i3p}TvG40$)u_8w(doo%;~V9Q@3A`i{RR`qYLU84q)d@3uj% zG+q@sjXScpFSL)tElzRcBbfo)?{O8!F=jYi6DhA(9m6=xc7p~hNVg_S+zOwvrcH*h ze_*Tb?j5)(>1&NU!?v$lgUq-03?m;gc%1)s(%Fo_C4Za+^DHgqUK4JrQq7|U&Ba8C zwf0iT=$NV>aQ(qI;??&4p|tkHBIv#_ELB1W|Fgef$eaUZujP2keWwAzo)x!*DFX-d z!*X$G=XmfBEF_~1Tz-_#bz6yslEs(}=DHqiQ~KCZBh3LVGi$%YyHna^fTDo*w7UFX zQ!W{lttPD7C$-ldqri~h$^80Dz)-9g$vn`txQ8kh1u?1*jl%tq=&FVEij#KYUj89- z2%SdJP$HsEk8x2<>}o_6%p&jZp8K4|`J0Xhy4}MPI81B-M4=#B4)@Y{AnIol7V0?m$4O2LJfmRqp8H3m)FB60eapD^JYjL2~Rv z4mI=wQ{#BRLZ%$Ba@eCQ%(lv=ca~RLkOEk&t8=hU?Bc%N$~+?TUIbPazZIlZ2}JAW zv*F?Wo(wA|;@S4khAEpA#NkIxT=AUp-H*-gS3&=RUA`NZMFj8mH!cNXIrI|7ZDlU+ zoG)QEq_?Os!@gZtU(hlHj;7`jt#FqDdApZh@;-&OOJnw*Rj}MyxqRz|j?)6BM)FRV z)|mQ(wJ;2@B<5$b%irUJVljP?k}3qI~L+98&z(M?vMTqrkFj@NEY3At{5I zt>a6-m5N6BjS9u3YTt9Q6cXHpFa*7)!k}(NTiDl5ZKOb9GwBuc&vWrNJ-AxFl&0zg ze})a8W$>>;1ruhi42o~SSUu#hLFC&O)4n7VRu7`uc9eK3$}4t_oWc9LrIm=i%P8u0 z!PR$^DUH)c=V7i@Cy@#9mNyqayO9@`pJi}qlxFP`Bv7@p#S<83x)Mc+R&;^o8ww2VVKmg|b%S3?!ZUYgsV?x97+y;4F(%~UB$b1RdhZt#qfvrY z_IPmP&V9_!hY|P-fV(gb$30s|;%P)qGwv-s$kn@WDWlD7g@tq5H_;-u%Xvz9W4>ec zhf?q#*nrQg*|A^wR}Dw=p=!DhN=qWZdbNU}cGdSbw0ZT4cy)_}vQGr|h+%8Xj}`L( zzIk(_V}T(DKb)a}TWU3<>B4pLm}3(_e(v}3$D=7)o}pdda+QzE&yoeP8Nv;8xUDd( z1tpC6Qy=UR2FZLSC7TYJk zjk-kpJomp-z%$md$5-+tA8M8=u6;E4F|Zo8Bh`WlSk3hyIyavx>8A08Mwa9PjQL9g z^3ZJkhgpfkDQ9e|;^apG(YZ1Dd|?pM^L!MY=3zTGTNTN}Z_o4ao}{>?MVYJS6^=V5 zhrR>9*%sRs=T@zWhI5OF8>1w*UN;C*rBB+NxaUZD3GYPt*RDRGPWwGsnQjzgZ~9!8041|Rc9hk3uvN4!*kc}dgE;}e}O6S6@C7_Sc1 zoePa~*L;k~>w6ATv)DB{JmhFm=5nF$;NLFtydtwg`Af@$?bP-;*6Gbe-X2vd@Ng=3 zPwtj}zNu_c`$6VTYiqmWrSd?_Wf!DDMp^2J%1(BYXoY!(O~GLonY-RqW2GF`>m*%u z?f%@c)j9~)r;iAFU|t6_iznwG_ZrTqa-66y?cl?P>aq{*XzBJfqj;0d@{)L6U3hbc zv~pLGI~R|u1Jw_sny?Yw(&Q8I8$0B07kL$`ev$+$8CRJUe6F!tpr0l}=YnBr;b4la z=dgXGPNK`ED2=g0x%fTwLp&Ig#p$iI*)B5-v9R{14Lwl`_tRB=HZudosOTvk>7MhW z$uV`w^a!zG;n;abixw@0Y)?LTpxej1E=hf8&2VD1@(^dKPNP%=3_M0v#Itd3u<2y( zwD)E?+d(2C3qHmogbb0oX>|b#+tMY1zjdnG`%C9b6~m3UNBo$-Y7KRq8{v^jvhG+> z0v_yx5$szZyF3~QzYtg_+Omi40kVn)v9_`fPb*BE{jkXEw8M{XaB=r0s_@x2kb9*4 zX$5HdXxUlDm|0;t5j_Xv?D4?cGyq(BQ_p1KX9c zvG$VtZ!kKFFl-=9KRrxBgO~%zNg|lf47g=iHK~%r)S0h{D@+c+o;zY-jP!3Dbe)hl zdtqeIkg#xRZN7MO7Jk$W&|iQaAlPz35QBA2GbUnN?EFr74;oSpJ+0NTB#r<{F9`SU zZ-sho^qac8}@Cnvb$Zy0ABV#<0(C;Iv28cvUERnEC^h6(x#PeTqV>2>ziWn9&0%8?xt>2gfX1=0 zZiO%3X|dZR^r)X+<4a2P#m7eCtAbm4(2Pjp zLq;Ffw5b)3H5U@bT8pg)0RyGe?uzQHHMC;YvY?13bJh%(i;Ym$Fq21;nXBY0D>>JH5F!qGEAMN9^CK0IT-)O;}&L z|LrN8WWOA{Lz8>$=*=nd-J%-?S9e*%l!fbMP)(yoqv*Eha&W6C8vSiAY}(Vpe%Wg$ z?tz&$6kFLgx}s{FQ=+JqYmP;ILeN8X3TvlTIQmkC%@6OCDH|hgDytE9Aw#$G6B~tZ zFL?j>;4s7dELk=TaaHzezi}q=vT%N|ptbH%&Hiz_@Th7lWnE7QNJ|80TRqyb3W4Tt zd9wsQnQ#zZ+T%0!5}r4Qril<68s|>7LbJsp(=cw2w@hA&rIzUD0VyYrMSAkHMAcw2 zs!v#73Xvg~BfG_)m=J42VQK@+6c(#LRj@WEGU3_FqNJADhDr{wn<1vEf~!9}5;%uq zZEt6LKF#y6wjK9eH2+%>UxiD1Pby;4JG3|i z-s}K##&Zl2j$3(1@@zxUwuh`^3ETa%8(R)HicSyG1E`PXdsIPII3^-5o=Pb zklmuTxEMyGl*Y`Rh=EQwC{939354i=cbqnO18s0FmpiNWn~|#crrD-Eqw^OlgV%?RzPlX5$rpxHj=tno#7;+KN&|JR3rK9N& zYa&b}&?lsh`^rE8{X!ko!YNmxA?UjP5GYitUT`_mq{|nSf^iWxhPv(d2@l6y7ZV$y zU@a}z3QD!;_YHRThN%fPpO7vm`$WDHs2+A?7o$63g$mvuvV>)jWPBx>%=7S8s;?RP z*gDA?!I5>Fe#1cs&@+f8N>9euJs1jNX|=y50Gcijhz-x7R^Sm|%}_W)yM#~qj2nki znL+T*&8|ai@3)8UEF;GlrVjiE_)ifygKhPko@OIR8K zHkWYN*$*&*4;g5~#PR*Z=6hFBTrQG$cr6i_$g9NwnVZ9>;b$v{sSB4 z+2}oOa4v)9a)<3Y63r}tzxUy_j!6@lmyKK0tbUmq7tZHOm^HC>1V^_NUIzsXO-9Gb z>*dxmKR(+WVmjg-7%Z04^n~WT9ZP&T8on|;?Us~_J`C%?*_Fe9bC%@HDk%7`@N^ma zA`w-QWxcaCbigfnvt906ibe0D9VwocKX`HOksVI6mRzRUCIFnA=f{8mdR7^`onU(e z-f75GF zv)U}TpQF^3TqosAMo67Dx@-c!4wKt=d#^Sh4hrpk(OI0pH6 zhx?=BMcKyZzeZ3+?{F!;KJn8(eKBS(1O6gFGQVnQeS`j?^Teu{IBg~EoNF1<9D7@` zq=`mJX?tO!Ju?~HOQzxnI>hU!{!ibZ%#Uhg#PSH^L z)P(49_916_?s^8yOLyX5+rNhCq+E`^vFU^|TUAwLR($XFmx#Dy64;^@_{&SJ;oeZa zO_~udU0vQy;P#uYwt0>_?R>k+u)*{+zFHDqlX3Hof&llRTWyn zzYdYwq7&8`jl`d8ZRRTDoYb}}KjNZic-bDYkvmvXtKqlhkRy;VLE>!mK9U9_(+Vi6 z9`}DJD!@?9ifu_T^5&k7B2zM+n%rbG55P=ap$dw>Lo#2 zQY7=fm#)!-`H<4YOwHizboxhK!zABG!6P1T65)x$*0|Cr?yvgs_5nTZR#r=)Az+xe zZ{1}nBua&*$9#*?n{Dax_bzBiu0f#)lrKZGZjW#(Nt$c9pEkMu?~#*A`! zc?QnuoPYv3&UQVCj!o>%Ow~N1j3x+^jg&kSz|l8PUk9# zPYs^(_-TRX3^)#H$M?paYckW$TsSj`LPaN=AoRg>Fmn)eTbr%OAa+cqG%uEyXsuKV z-GYB=j`Tj7L~KVe`!rUXT*0s31B~jtp%n4yDX*30Du2btYU-0Oh}fLn5RIuuOc}jY zxUlq<=)NC!;ivce2xj4vn5FOAhXzHPg823Gh{H1jycuwFX!U1o*kw-iVCvp+;T8Y? zCwLxfPz5RriE$Zt@NwlxcQ4O|`>DFnv_VG$cR|6%D}{=k3o)W8t|pHk-ch;M(z@zg zlv8#K7M*2oGs*RBfbVI4o$+Jzc1prYl<1h5*JUsE)Ld`eco+=G2Vt7R!m|Yr3QkFaQuKixdthCtu;X2=G$=Z5Rl(+YoQ5m=KA`Ka3OsWO@0yYM&%IrCWO&V>t#UVA3PM}a<)c|YUKmL*Kab6<;i zhu@vQoss@p3A~2_CsHbKWn-pBEl!TCEp2y*bx+=WPotptZBI8h(K|X9@Z6D-w%YnV z;eh8_eU~6Pi}QGJ$cDp0g+(b<(;4P30I2U zXN*KSA@9D4X^j4u>ba%6Kf$TiUx=Pk9o*n~V#U{wZZ5fHPY_E@@Chcg&PCL^vCfx? zamiV8cd~Z(`h2-t1U1YNyOF~q#{Fe1!MWqM#dymnm$0K}6PHR}`7<)jW!t_^EDj`~ zht6t0F4WG}n%r<3+<5A%WEk&4kzz0R4m=u5nKr9E0V|+KDtOl6p$+27zGS!^}uagN8TteIGy2hH1H)j-WGCFSy={OO2STqm^k9-y%2S@@ov ziYcrQCS0`yK2b8LT7^4ce+$i33~S0VA+fB@Ybi#pUii<*x}d%F9nc4H{ca(-*!Kp; z0row6S5>a;Up{k}Jue-(|A7ChiX)(+hHk~FGS}Tv6Dn|0%t{%Z=3Gi3Ug`IzjNZ=e;!LAnU6g{{cuc9jL8TQA zRmmCIDKC^X2ASXDNemjNg$dv-^EOyXjzMqe%*k-wFCMd&`5N3Um7;m zUVkkTC9juSz6Hje!q|S!INZu#d6**f6o`9%+~1^*1%De7t-SRF1b%0Fjh&Hed3g}} zddQ4Iq|#Si2N#{u>=j*U|{bfccfCf|!FT+=O9L2;`r%ur2M z5B?@1O-;~Ad1*EI+Qf{B&9uMkpxfmU+G#JgXHpi+%7;0?y@<9RE5?|f+%&B+v^jmo zIYk-@16-}1fdcHwN`uHYstB)>TJe04=*_uUPv___GW32r_1bRCbPrH$zw=fqU*$&- zI1zS5LqB!tu-wIzEx%H$PK?|oe6f85K(W;w10>~Nyc4>52ws$Pa}KtM!xxVyr=hw2 zrGt!9&i1c+bYc6)xFXl+)!5?Q|6!zaunibnGZz~PXhU96h86N|;heIc`v*LIlwlRa z)_GV;V?%*!*oqpm@>ql%4;t9|3p;RFA;x6tF{ME|VZXjHgL@!| zI}=KvZ1pq1qhvG`eDtD1{2l;27j>Wqu+br`Li+NTM>+Wh26N?mU#{+-n@8Q+8G6-W z6}+!zq;D~xT_qrg`N7wxbXr{qpt&h?{|A|rbo~cL%Hn%$0k8195y)Sa)3qhg_i~zMLtzPxHDnjEurp-gMc(#({Pew;!R5MXF6njg`YvigPJX zce385Hd?7qv>kuh1dz6m*hoKBaA-_v`$Y-F;xk&vzFRWXsdyQhy01I&4^1FJ0ce80 z|3ed`k@pZkG+}H(zxeQ>Evx*c)0Axha-c-Y3IEPVGCRr-`du)#X{HnIy0ne!1As$K z3zX@a1#bkaa&yLP}mR5IV*r}#w zsd`ekZyY@5^uOKEIIGG}*+$h}YHT`ARaq&zR$~{mud~lQI!&=yw(m%3YGSK0OG))% zVHk$6ESIlgJTD!0I&kF(xlPY3O9wnR>nCqhZ;tfwXYflk@3zDi(lb#FIWariXi(FE@vZPY&9ne}7 z8^SVRe)p>L5VNm#ZgX{r)|@YisVDzAMk-u~{$${)E!H`nu1JYJ6&I73sODb1K@N;#{ZETLX4lpwO$m3-ciw$A zn8S@fY$jd{gT0xVCwBzm(<;Cs>rdkwifVgThX-|}IY!ncL?S_k%&3DFF`4vk`K7)?*CFl^dMuUbzrKi+xubb~j4j;4 zQwn+dP!kyfpV;m^oDc^={IizXq#XiiVXWnjw{N;D(45KP=v45Ia|{yBkM?$e41$-p zqnG||?lCAZg1{O2+U-4jvOJbF;P?`e-+RiC2Ii2!p__FB$ic^@3FDNQt9(-+GkcGS z@FGxXgb55=v<459eKurH(3|{QW8J0vikVK?nAt^x5tiew#Vv^ty2M9r6e?^L~!Kne~&y zJ+Vv|%J)c%iu(LqaQ&`A_Oa}m<*^d!Tt9@EVA3i@x{gfWJ-LlMo;Le>O*3a3Ia8s8 z@Iy-rSURV}G>XC`O;tgXv@^-PND-nnv5S+Aev=lp5g(@Z^Zv8YqA=IYXeHUL2RFE0RT-KcUr(c` zzI?mKSw;X5Qok}XF`DA4zh#Dfi0$-4*x^T0Pkl)>&LfHR$Bi)F8%JGb8pF>W?k%Wm z+lXs}>L~v-1@LP`Re_oS_*@NK`N?e!^Pk{i(JI=I=j)V=oxAWzg&FCa<%mlwUiL|M zzT3Zk?A@tojOS4)Xk-M@AZAKACUBG6Y9{HS=v{>H#7~Q{BsJZzocyVx#Pq3E%E-#f z-A69VUx2H^>NO9e+O}w@9f!|wS!7o4#iQTyXRZqE#9C6K8~V9K@hE7(kIln$)aB5c zpI_h0{4p!E%dNQsU)olf_`2pMQjyEj@NDNZJdS}EROjEeb&jqz&m05fBVmFH6F%g< z$J|kHi+jBf&Uq}_jNi5K^bvTE$CVHYpXGX%parZP7|y)P{TTWz^&K1rE zh=AyGOvrV)efDi}pbKuNB4*fjqEmq92#L0-mG(iFwJqS`-a9=oyJbJ-K_6-R9sOpX zu171ImJWN5KqE~INcwiR*@CVROOI%?itYA5r~Jtd;e_ow+&rvwk`o$FsEBo$PaxgG zmxyaTg)bTyZLg}^k(C;C5w-6s(sv|fkjY8Q7=t2*f?~LuMHWVXrGfVKK=-i7M{5zc zal?&5Be)&3|7&?ayC|J%ZEn-zY=vBeCNx;M=PI+ zt6$fqxqCdiS9@)qi1Ia-Ze~Is(+v%rs#GTTi*!wg5q?nC`w@-PryuoP{U$}>kw&SL zUe}_yT^a1XgJ@5vVlc@^^N8{uI&yg`Ot9bV-sk;Y_(@8iIL(P=w>MR@?HL_2 z>s-iwtK@2-qbn7NPJ8mw*_sIbg3mEyn5S@h5W6P+HfVP3m(Hm;%z=@T_Zu|tG)UwA zji35AI;YKyaPnq3w;Ov^$lf`E-wL%)Xjf&snvM!K;LRsDx7y$gM&mXK#kOBZ8-GX0 zck``X=hOOZzqGj4b&y8+DEpfW*beUiZ!voj z+Ml()v|^}Wp{%|tY!Pj*&{nk4d0f?H=3}+)MRq7DTqUP_{Du&V zA;(<}_1ntlrX$=deq!ZC=VnGi)OyEH$!dLldKx*Tk2X3QxQMdTzpbf<7^)h`N~Jtq zo%>-XAeS*AYQ(g+FjuGsIugobp^mDzSXIG|k2e8~QxX8e z_pWRS+wUBVkn=;qt_#xr95v?0AKI;n@^gz`6t2(M6y=0nOw8||(e~r0PT0;a^9EBV z;@WCa^Ya5VwX z8D+CSdwSU4jV0%a*i-$%RxUcMnhck*%F*Y3*M+xM<%5-r*n5h|qX}Rk^+D)X_Z5kB z5m4Fb#ZI{lDLxtv#+}|TD)NWK)v2ItOh>bqmA1;#5IfNTS9dWUaR;vhj%8rsY z5+ghzN~(#+77YNKM2wyuc=f(*9B|vBv*pAa+CKdaO$5<{!Tlb;QV0T?>%C~?cBNwC zH+-{g0m#5Hxfr+8DdG-4zr)XNE?(-nu~wD?h2LRqjH_FeX3jRc`}(Sl+54_5&szzuC_y7_QOJO z?}nsRWxTr@5!m{1Un&ppTV_}hSm>dyhAMize~dExWMS_W7w50rNMOB%2Po2gWMVFBUA|@0W;&Pn~hmo(MXSsL6-CZ|*hB4%G$9H%#yUf?K zq`CJ|drHD;{c}&6@E{YRpNLQ;5{8C=*|_5^_HNbHaZ1XSdv^Y7!mocx4+NclkGkVB zC2fP;4)!ox4;sW@sfVw(VOuCipZ;#7pQw5v^dGRT3+%rSpQfGw8d9A+b8D!Er1-(a1kvYXOa*D5|+L?yIx~rh=_5d3z z>6FUgYXIjo9LdniWn&$8;^Q>pJyou$b5ng1AWmSV61eaJ?ZJ1=@y3vpysv0A zboE8}1_|vX?LpL)-8Y-B#OmD=`{@7z)pqHnDXgoy+F8;Dlx%%oH^J5!bc)4H|9? zUkIJ4SJ!5T(ha)=dY!*0g90H74@MjxucLt!FiNhLl{>64-IqlM-RPY&Y`8UqDD}Bn zV0-O*WofdG%*-Wt(XCXf0q9rw3_07Qmp+}mYz9IThp#(!o~k{^-p3sUDt?kV%<{H- zMqKvuW8+TW5CO=kAWk`(YZOx=7>(|xvrT9aouD55C4y3KpAkU@|3w7VEJ)Fvt`$?8 zran9w>ZB}JVbaIWorO^TtHc-VMTq;ub2D+0hLAk*WfZ|QL=Efu95%}l<`JtuY92Er zfY7k}h@4ppe4dmYt{l~EfijU%s<1yes)JN0|YARe6uv7xLZQJ2pEVExB2(E%zmfV{aN)fhtl z2gYxDEqZEwuMz)?3osmYpu5yZGi&VB$mSfrSP-0pe?R+%S6eR@!i*U>;l}i*tKgZI zjfTW6#T4E0wwEVXi$^5l*Q>z2(qs_!7o5=83;!VJgLA5vRF;RIChYLo9m8%9|7%75 z3v{V9;u!_<{KN_M=#!w5}9EC<)N*B=iv0`BFqUr*!w)%p71riP`-S5g$PqJLM>LGyLs8@PHU9}{1VN7Y#Xf-A?m@fF=t z1rkrJTj!FiZaHH!Q|eH4@+K=Vr@S;JpmCZNWIX&)zdq)C&$4k(cKfpN8buu>xcmin zRzIxAIR~80DK}b_;CnPfg&X>>c3X~P!G?&cB_J%l0(_YuCM6T}iu{n~YqlE!<9<J8H6bNZ{8}#`B>k20 z7Z{@#WSD&L7fNdpUWY1Mmk#!xdlCSuq$>1`D!El)W_4k*+eYpPG%`K*F#T~V)@&#e zCE&1b9un;)OAfOGcVyMMbwVbBSl$bePQy@vYpsh@uIU(BR-()4c6(!zFoA6tXo@vo zj{9VzX=~WxwSv0y0C}`WfY@0@%&_n9_KKQbs?nBaI60wLpU>+2r%GaYZl&6Uv!$}> zFis=+9)ipNzls$9DU*=wSm`R=9-3_4^ytNh+aju@%v6Z6J|3dt{;T#C`cnwG8#(_N zSrIc*6_vmxR1{il6DH9m{YI4@@KY^yl1D`0u5Ai_tL55nW$uA6ep!0Y*2I+8^>7LLTIO>QON0zuW}l>1JtT3!%`W!>C^SX z${_*uj_y;Z1``KSkI@Y5mB|q!PdvNodp#j^ApzrD$IhahgEyT2d#8_V) zFGaiyN0ztqNkWChMl#+FwgE~D?nWYh!$UctRnKnMtbXDjN z>`O(!5|p0Dd914*P=4$>b#6t#80z@Z#0lb6|JJIcQ3O@1UxKpM@I1qkD!JkJ!2oeF zMjbEntSDPaKf{Lkb^7a{>QA^oU|b_XX_iRfc-Z}_Mb#tDJR#+QKQInz*i^_86yUg_ zG+F0i-*m8NseEJSSg@#ojEo|_+hg$P$dB$TQ$>5()p#ImuzQAL=V<;m35q2CIU!tw z47`>?gtsV-*hls*4^(!tMymdh1T9aOojX=A{j)nnx1>5!sLJnx0Tbfc?N~`Id^>H=OY5io{;^Jdpc^M%5HaVFvYY)58yZW*mX?@eP z=GmD47GnV`(SF=Y_D(2ZO_sI^_JoW;!Q9rc?Pmi?obdn)SEi_$Lx@T9Ge&nubazo* zOuM|(maddgo>~D$PkES+RwQ+|n=zDD;9ig`8R%2LCX)>+T7X)5wxWz14(V=ZzbX3a ztNNfa)x5j6%sziV=4H#aNRDe2rQHp*Dz)Bu$bGl{nSxA~{4KUIwl#g3b0fu4YSUx9 zhB#K$yktu!!g%#qJvo0Bwm{|{n3e=_$UZ+(7L|-2hkhdTEm%9!A6)>(oB&4}NO8xq zGRw>L$Cyody(OKC{)B}KM6tn0nV@i_bwF4{@?)e90h;=*ICw=cGyZ%%%Q41V_a-C5 zO&5-{h>>M@uO~L+V0dD~FDz{tU*Rj9>#5^jIK+$Odm?Fd?y|(4)X}2Y|JvV_`J5!{ zgFi8Q>JY44Pt1F6iriqFQF|!iaIc~$HPVgGSG1i10Ws-78^tuM<2EwPY7$om)(k#e zz+R7tg{HwKP!tu6{S$$4{Zy3ep6j6mlaO7_>rcX>^wx8T{Q<3A&RLfYP0Dkk*{?7e zhIJ?<>`C;#x7q1F(i?xF$3!G6r3h)8fO78}Gin!zxfejA^p%MOw$M1kfRa*tg(*6w z>f9fIgqJKsPF4BIIr|*UEKGE=vMK@#KxNsE(b!o<2&<0fSy$Q6e=1>&qa&gZ+W^~t z_t@xIrr$SuraUC*2{h#!y3cE3cPBmJDIu7vrb*`O=nL~FY-M;qz%fYzVXXqE2~M$> zPaSU}@#mzuh(L;#izsgA4+J|gjkNq+Jc;6;DSIMuY_N9|JjT{@J4Iz#&Mr{v;A~*I z#Rpdt>1=!VWOsC9i1HNv^vsAb#bR0??0--VET6`xVlsW;;*9kP1;#Le!W7Xi;SIil zcEo{uUncjy4h*`zBxMJ}7c)JqE{79_oH4!@Z-tj+en%?J37S{}SuN+pthJYNEGofW z>{a9e$KAwzt22&X630L5Ui;DuRInz5A3Tp$#F6Offd(qk#FrNdBohU)35y}7oQM)! z&J4dKUb?X|?kAA7x)Oi%VksTx!dBOWS|xZ)S^N2fSDtwoZ1+DxdR@~FQZjRULOEkF z$+W|s=u#P8m~QCt`nL;@G}Vj}wh|m{RPaY%JY=SsZ@Q!+N?(H<9KMnIu;18Wa4A+K zhG+&Qdb^1wf|B)srhnivJ#<-?bz3ftQhb1I8;5N1&R63@bx&y|w!}=B;F8C$#~9L* z{OT5HeTRGGm3r{n^`kWR%#pua?cMucpT7;#6m^`8s1OE4e$0EwvxT+KTxl z7ty;RDMXej)-jaxYnAn4-?QWysjsv%ZQTffaPi4&Awj(|N9jL=JmnmK2BD?0%Azle`N{1ztcf{Q{3lFZqV zM?^fa7$htE~n+l^q^$=fKj&13IctF5SIcNLN886F9h!q`Udg5z#obp zfIc10mIN=;vRTS&6PQeSjtq;uE^3a2ZB#;lT<9D-e*H>Z^-Gl{k>c%_Z?=n-uZI&J zA%xrzD^$*Q`L%uf;isL&{KEN+A9G6Kc2@@P|{q2f&sDlg=dqqhKHuGoyts)<|}==E+I?1Cx_i0X)#g zC*;mbIwow{U2sK+6%igt^UoZ8({Q2#>w#g@Wjh^-8*4)BTfhgRD?E0$K9tuJKQc24 z?|NZ`Kh_3lJo@hr>Nm1GYBPXE4vsLSMtDizX}$}=Kx^C1Y{2%GY!XUM)6oqICFqn$ znU5>RZ9nS8x&tpXVSP$qY6|Ri`v9r6lJa!Kjp!zwv+lP4^K)A=Jj8)Fs~WuBg4p@l zN&u_EjDG*}c4F2FicfsnA{qmcMjx4v!asWW;ZYu%+dG5ZZ zKk#S4p+M(J^4BJh?0RV@+q-0P3DJsk7f3~V6TYn*-RwPWaxbbpTjK|{qu-;=-W*(V zP(OLr$y+EZm6UZuxC47B0Lw*)41flwhq1EbVE=+y7dv3m9x4`5Y)3954*)XFktf_NU#xM+B0r8=@!9zS$KtIS_)#H_0ypXq&p(4ds+ zY>yts^q2?S2ksY}5SY_06Rn!|h)r3YYhZ;6K{rMWcjFJNO(JxD+>Yu#<*7irLUa!U z2<$X4WkAiBa*V%S-}3o^>eX60n{+s7hR%8g|95Pe3f|wkY?vvw9osL8;fxGZB?3Vi zCg+?L3@Qt#^xPh`EgzIZeN=P!RW28ZKxoVC3p`auEKlnT|NGXd$c@jEG(Q^i&^793O~bZ zT{#oqp}*q$K8T-#1+?=R{3G(CpwBGn1D=%l2t&kItQi8#Yy>rrKz&%)u5~nIvn^^rqWm#Gm6LDg>M^TX{wD;`1?T zt^x6VjXSo63;63l=f3MzzAT|*h*QdGi>gj(wb~_9pOGcqKAcqcq0H`)n4LW^Jh4BR z61w&X+N$%TvFM=d$?>2wsd;!DZpjr5pR&B&D4R!94Yp5wXA?UN6}`NLO_?RmpbbL!)S>L|P8-n=b7$KjP+B z>~k!x5Z<8+ea);ON9)ctmi|?KhzR@mO#5bXgF!+2cJ1{aTfKI*X3_298jRtT8CB zJm9+4TDb-1_(751DV`H~g@=c@$0q%rW6r)972&(QBhp2&*$Uu8GDe1gPM0||(iQnd z;Z|;v`CC60&v`mAM_HiV!|IIgxxj2XWx@kdKj>za?<$*PbAB1dFJP| zYUL;WO`%Z!>eZ&SXnJeT-iN=$a1NA>eT3RX1gj5j6pY}OtN^f4=L3MeD&{H?DFMXI zslB84COuX}`gwc*A6PZdYJp$)r{pdfnUYU{{w`J-ag+PKQNE;&P>Oqs2UD)5an50H zgd<{Zu-P3I<|UJrcRS`lAN)SX9DM}wUiU?Id`s141~pk5&6 zPTSEf(VOTtM;MNc^B@yJ36&=`&YheZHGqQONW(e!QTI1Eh!s$&GI5z20B5#EfWa#k z?(Kzazro@ajk)3^PmnPbGAIEJs`f9K>!dA(D2_;;BQVDzg^n}zB)#zG{jSS`XM12f zKttC}JiCX8{ufMG`*Y?rNEqB*)!D#O+_t^<2bSybX!=AB%AAmauCQ?D-B%vEef$44 z_SI2QwQcu9iAo95sgg=5sS+b7B_btVD$Nkm%|THR5D*YXLAs^8L8SzwJBO04A%~cG zemD9&@B6NAt@rzVe+(>G183%*bMA9pd+%%SFX1ociSC|F{5(#9_N7_Se2s?}BjI~e zVAC@90xk_cbaM*u4F&rEKx%yWeb-Ccj>1HOkq-|#HG*M-H7%S5BfQeb80G%W3ci+^ zPmgmT;lKo++D`nKxP#z6mbE&uj4;Ryp4|heiuaR`f5CYE&TW_junv-fv=H0S zjXF_OZ#?@smX(3+U>pFiCBJ=L;~TC(J#bPW8Unw1!-fU~%U~%$@7K1 ztr|xx&lDO4b+VBrogl!p%-EloAwCD7FC?6_5?kNhc=D(ZIw)ilG-7Xxz-?yS#J%|Q zmc|ortJcr@UNbpf$^*Yt2SMUAC(~s9z*bkvh+C;u&h-R$uGZoBSN4QB?scca zDd+KLXzi484q$l&7UMFI?c5NyhHvvMm|)NSR(aui(Op@`SYpLS69XxkRELvAMKmahp3pT&)DGDGiaq?6 z$gY=Wc=SSs<*Vs>UoENkXEkDT!-AB#rRq8)^l-bp#HJ>SrSzczZAB0+?#JDv13Lb_ zHN%#`db|1Hx_pNgS}(g&=qGvqOp|bgQu>Pm-;2rWn}~jq6B2%*R$dk9aVCUrD|-m_ z#bjWq3rrT?M61;L>ZsTFsv5+&wR_)qSqxQE?S)ANaaW7>{*y*QHZ&-v?K}ld{$PJ~ zeq4!pPfI-tx~i$eJ}>KPy@$Hc?BsgKr}HO7mTo5UX>ZaENHPedKj4YKb3@W?M4MEN;<{wT1ii z+D)6wIR;_cdaew3YbQ$rY1@!&+I9veKr(dZB%Yo=zdMJ+%jJRV&!3l)zA3YPuTi`b zK0eKJRSm>xP%1n<2TQ)d`(a!B_#xsrXK7=+<(tC3Vlh6Btp=Xp!kE8f?IpFD!X>8v zjbkH8PNVHeTjyn-36Kng+6nk!OCh@n@%0{``Oj*E zp@oH@M+Vt z5%TB^jHyiDO_wg#)*+}3-GUzk*KSpvL+Jk*ASbxdWKurpI%T35cqexLp_R7V3w-g9 z@gvs6+~L&(aYKc?{VrQ1D-e~WxqG&CoXhj^wZ{l~v5+q2s4K8m{3sGd1@=bn;mp2M z{uGpt20Ej@8;Rij(qsmZty>h=6NY8Ge{|{}>s!8}M6`aPRRSRf z7vY*sBP%vIZzS`T!}%2t!6Z-N&7%Izy(HFUOV#pT7u|wupX~X{PTDQ$9A9@-%i#0e z7(Hr-7^dFs5ZPf;M|6N}QsGIc9$GBPl63if#!&w2BG1SDH^SPwp_t%{j_=NKi{OoG zOU4bggooy?##O`}6kFqbLLxg#%C=j@iRr%*`NOYEx{J11y%<}@-3G@llaLbI-0ZLm zQmmptxTIN|@|iygWC`wel27C`=vP>r}>Q4fAGen32Pt<|V(I zZxme&c)VTf!`WC=G9a>5*%;V=>>ASN)V0uvWWQ-hH_06CM6RM;Usc*CO+FQI!C-<# ze=X}lX-%~^(~EFZTLSjG;RdYM%nLvfF=ADCH9Bs98|wW(eURXDB=1xj+-v90=MxlJ zc2Rz!m|7;LA(G3Ojps8Uc40o}K4!mAYC9qPWu6DI+Hjq5UzoK;HDk;|J}%N?bsfLe z(`q}#?aRpvaOmv9TP0=1BYvD~j1cs8&{$u8f)S>;gM`76=jO zYxCYtYr9p#zlh9S6^N7ErMTJr@&hH)=Y-@~HJN3_E|_-<&7%HRkjn%c8|Lox@a2m( zaGOvyo@S;NMfaE2aqv%`-Of>W8LMaQgjxj|FsP#cjN0Z$74t4QQbBQggDl}|-b`1a)z5uC2Pw+r668=ytYa@jw|igjxyr1N~eb6D`M zg>U*g#wcf1tT?mO+2Lm0$5vYTXI78t=Ow8;)|EiQOjFHbj`tjjYPlv58sVG?H*%?nVB}SCa8GU2~B^S+X~*b{$h-i;FYgX6MB?7E}O=3)Z%!6yuwbv z3BkN;19`rkCkwy80K@Wr+BUAuK{z5DR|EU923+-QX*Ql)4Gqzd&*iPla7I867iY`L zM*R2@2Y%dvB(F6;U$lm(-2p++)Yx;C)Hd^3(3c z8~m0*VvR``iFyhVyp<<9aUNX`6Gq$iNNA3?6Y$)fV=cQfBnD0FKrmxZ(ja5IZ9vR& z`^!NMU64W>Td{%eSUXXJf4^^hr%uSUiIlvS>Up=s05)%_?t4;?L(m)2WYt z;=M&G%ZEfM1jgo#icgbU%DpINCn9V$MLiwjn;=p?!WZr7Qxo!)k&~0}jFuQ9x* zy4~dDH+;mlb%I0-gJP*x<5bG$eZRQfzq`5f-B6mwm+sdu1!C?i3%$f&`iun;Abg3~ z2xC#>TN$4{oi=vo<>M2j3vQ7m(iYHbc7IhgA%6X<*6#z4iUT`Zr+K|~b!;6Uq-ZG= zQR6)aP{T#!v2oIu`wOeIVk3@_(;Vk}zXv+ferzk+=?%fI*~?C>j#-mMz(csbQURz( zf0togs*F}9BJGGdWzp5%?DARyY`;(C=|%1CpgAdt=1U#J8dY)U#vJV+A^OFaU~tZp z?Z*LEIpQ6fcnqL~@a?4oH+V&5>Srw<3~%e7Y9xej-u<@iL}L$QCoTz;X3z!(&k3oRW$`^fK_`1 zansXG%2rT*{=Dw&8$!p_cSLG8VF1CqQHtCl@iIuVNGHAy7QHhwFi4KG4FOzB zcr5&l>y3ZRJ_~f3L2D_po%w0#5__z#ycTPuLNO>;2|lUL{v%|jKNB){LNo?y1MB++ z47Ls%snzA5+}f#gW1eXPhYlGR3Q8+x4{sgiPR^4WzXH7qiU*&~zpfJypWSf~qA$Vd zfV1|1<6%~aVEI?6!Aan#F~3^<<5Uiz{Wxbf zj99;Ya1X&$fjjNxy?G3Y3Gs4Z@V`?W5v`7I#!7G&q^<`nM>(h;shxR6Cyh4TDqS3C zsW`N`%axItdwJjL6Fi2^7Cn^(%tKg{8}~MRIY3kGQ)dg9M%Z+`;(&nY`SJ^UYf28! z=)-@_Xh#y4QbuC5ydlzM+BoDv3{Y@1LDfkc>f`byo3??F#Mkb}k3E;TN`gYlKY|YF z+uiRJTl!rNx3L_=d+7jv&4%WW+YE~jtNQJ40b%hC%H!U12WbFf{C>^G%PwIjrGx(` z36JJR74wr7OPko|UHmBqYVm|uVJZ#rUZ&&KKhBzbs~B@shDW>YtC2f+QZ7m4<89$W^{HCHGZS6IOnfZe8=l zNg>O6IM$loKGJShw<$@3nl!Fj4rZz60m%*6C$6?B7L`}|Y{ik7DcAyAI2(!ovbz5) zZn;%5eraZ}2qHnwm0>Ubg2RVbm4dcmSK1yyw-`V$41W0E3kpEnvjrXev!I#+dt^*% zC4n7>N=4OWuNQxttq8yK0cO60duMqv40Y_YSspB>Qt71=*^0Vj@{b;p-!nn_U*LEi zfl(-{zw5cr&wj68Q~PPN@-IHp^(lA7Y+cLhZ~1XN1VP&hFGm!0dTsMgWzwxG>4y1m za+CLaY(?H-jYY4&8l6cp=1p$^gIPJ#{EI26)|KuLVS1bV8VWF%Cdx!!jSyI8>Gp6y z7OETz>@_Eh#he|1Wr5$M|L`Z2z%+BQQJR+4_2|~LHB;l!3#!&r6 zYveQ0ft0YUs4<2y#cxD!yKl8hU4Pc=;_Z8@?1xJ{{W^2haE|>eF75&~QoopFMFQ@Z zPwYkOZw$b#2iH^DOoV22j^bc;4FPH6*1OgR<0`MkH1Rnr!^ddv;LQZ8-Gms;W8Y+2 zy*K;|_6*3qUY80=%hfa&d}XOUzY@uwt-vZ%98xsUA1K-v@ zfS5qxU?E4=j^$n*>#cxL5R`^e#Hkw+^au7qzyw&maC&L$nqlbQ)~zrH)M}g`k|F`9 zwe{t&C&Ajcj-m|@Px;7htbgd^cV%&sX>~cVxV400tUjgbEGJs9j9=ynJqcj~MQ&?2!7Or`d@1SGj7@M-o=)vr>vXPV?XIBBl= zQAzBo^GguIW6%Js+I}j>^4%?H- zB1l&VWVT!5GnSku48AC$rhUxg(PybhWnk_wGXa-`78KX7!I9lLpq+W3a%4B@{xg7l2egAI$Tm_zh&qyHa9^8&CdP5rgnVjg z6TF0!dqiukG& zvbvm1u8F&(3sR=v)+y6rTg-eQly?p^OIEMCFD-(;#&(eY5`-yI{!Zh8&oZJJp)Y7? zI8`CNLM;C@jT(C9QSG-C2JXlsDqO;+AOAo!W71-(wR2sf*z~@Ly^rb#aMnTksyx2;lv5pa^$30p8d>!Dgoky$JW5G}aFk>ZRrhh?XcD$#%LCvEM|Nh11MuPVw;lGUxzQqxhm_a< zf+Z6HV&#o@Dxd&*@}}7I_Co=_H~xF(BpYKlv*XMaM7V@YWLX3#(&*3{M1;{FV6)tw zj$~jN?zjm_YX73fBdgCSPu-}f458Tz!;k3CJOc&*QTMku!P)mx*Dm{>rej0oVcvwy z1!ncIewC}U>U5ZoiLm60i991HxsnhPo;TgaJ~+8I#c;nzPF>3((iYMIgCX%vUZj3( z{c@FYBXk&|-Ozg$e}Zzg?cq=_2QD;iT@JR?EuM--BDRBcK{l&;6Y82g z!7~#5$2`Xb$2HA`CVp$M7}3pW{s{nPYSDEOd3hk8;zzzJErKG&hw-d}jZ6+AqcbOJ)I!+1=HBn0Ua2mC#DPbv@Eq1Wp5=kIF3E=Z3 z)`txMZrOBpg0rg5(wf6TV0xMc#orv1dTpNrm++X#+-jU=AD5kY4SgePVvy4Oc~}iE zq0|c~L_>NPM-W~i0w)P286MgV;B_F_&=Tmy$aKLjyNtqv3{=*qj(b@s2^0>-TTr0+^?kc@mJzUL zy*RlR9bc4pNAXq#(J4C&t2?3tESDVt&CoOVq31BQudI*0$GU*c@l^IfiY@Xo%Fn89{8;L{~=mzl5+=I?Dc zWO-y|w9L@zszt7nCf#9sAkz38-3`tGHpYtRbnZjj{J2HclTBGVu*02&c>H6mG>@L46xt?-$= zmAw@~mQc$@$W7!T{9)X`oF>x+92zUe2Ujpfv~x1vOM*i7ZOGEX$L=m0_vozh@{#mK zc+9G4_eVBd_Xin=@4VMVDVqw$!G1=5zGZlMXSel*Z#IGUe{k;SYB=6%JkZu0(lujj zuHQC!vwu0hk-|Ev^04a*C}bM^yKIe+qMP_)5KTnW#tl}N&JD|l@V%v+hjciMQ~R+x zHgxWU+*VSPY$rU@rs9SY+kXGGAoMr_v}bqV7)42yEM^-Vjpsazy@+?rXJ4Pn^ML1A zZA`~>$_(49WRxGbc}edlbd+6=II)-!U*L5s-M6E7IAYh(^JV4WFw*U^Jbhu6l*}P? z7QpM+m5RVIusQ@4nhmb&6vSlz)brm9blxRcF0AqnneHuLgI}^d(W~xGU)VzUrc@aa*f3sD}I+;dcK)eZEBLLp84@PHvxu;O7ZHTIuO(?;7&v-IT<2>S0WR2u}SNstno>+&CZFJ#zM zIp@GBF99W2@pXf!tPf?6MA|0UFM!s&pzJegV$2VZ2avr@O;V`YB5&G(iiA|Ysp&4o zAr3?cUsuhcDEO&oY~ga8 znU}zuXS^9r5dz&)S2QFx)P#?<=|bRh=5wGKGyQOK-$n=K77i0zTH|d44f2Q{&|*pd z>vBzooZy!ZAX96U&6%~{K}O|4px;(>Bc^c-RVqDJP?K6+@#lp5vt)T?y`@mhCY*YYT;IenIEPVJ*R&mgfLM=`vvDevdb@g z;NICZW|$K=OOX;*gnCPVm`v6I&=1M^Rxd~(!V`V}8}PiW5N>m1+36m+#C}1nIfKB= zIpX8Hy(Jpe|F1<0{kKBJL6Lg6_RFVdDOp#wC)umtn5p@`_`0hlSjRg%_1FwJh{^PC z{(3-}JE_-pRf~n1>NY{YzvM~lv4sdDZSHKnpu&LdMwyDLTAY#WR2BkZok__P%o1Z@ zQ!%jfrio_3InDrKWO{#Of1z)t-#uMTK+X zv97(2RwduB@F#86LARG^))VFHTsfmp?yDG(z8VHS)%(tOPJ|6FSe(0iz9%NK^_dQa zr^m@BRxWIcD}!lHU-x-qnB#SYq4Bw zr`a|vhDd9J?l&^@G*}VzoDyVtm^`i<_Up^E?wf857PPhfQKoq@UsE zspXrh`GQSrf@Icr0}DCg+>*|v`Y3x^K3}tGupy;U5Lx;mWuop-isK@i^<@P``PE(Ru2J3XkYoff*fIg|XwrU|T--i%o?- z&+vmvHtQh=SG{XBMKOA>W*_jGlDzqz`}CdHTn(Ad!%z)0caxs0?o1qR^?K~iBG0&3 z6^X3@VT{iBV?S+ztxF1A^{n$v$NbaDm4|oblSEf%@|$CS^pk?l9*T=l-|l{yI~kgw zdVj#d^5P|BXKUuLG8cxYkMD@!J%p1frKU$>z<8lzpy#6zN~Pz!ywzH2Px!JgzhQtm zj}$m}8et%nI?NEEd#rYe=QNwA{m|8mNC7Un&O(Wx$MlH-{q+K+Oigi2tBvFNY1VD( zlV^)8x$*TW3#QwVs7)WXGlu+j4UY|9#|QbA9gm&aOCWx>i$Xr;SO1>T-Bu+!)B5}` z5A?idVhFA!M5D9mAiO0Ub7}v6(j|}Xt(I#HqD(B06;s3o1Ix-TlBzOrA3lAT(D_RB z4j_d$ai|%Jz?Khr`~{+#WPAC%veG|Cgf>yvUa2dMlfYhFnAt0|`ft)YWhoMcft0Gi zwui;#A@iU5NnGTR*coCeNL3#;11uevl+XvSZS6$(X&L4|+1r+_jai(SJ##8hyBCsS zz;=gSqB!xMbixyn4GN{cpFxlM*Yn;bLF>aStXsgLR%aQQ3ib?@Pw~oBoXF>98;rG# zc3sh!?zkHbjC*A34tDRIrRjv|pzl;8boWNXQ)udcM#}FZrFEc>l!1$5wE+`$Ru$!i zn2(;utR>OP#m{zaYTilcM(93;-;#cJqEMW_K_XMSeUNBpC)sA{%(we%16@Ab*|LhT=as;w=JrS` z*yR22t0RbI1achR=hjBYxCZ@|c_yEJv&g#j&P}j0>Ck_}$PV-%Ph1lov(Ph!ng~9ugl|#^X#$9{$^=8?8uM}{U&xO8`&}P8 z6ZFY7rubB^PZ?ZF!az0k9DWf6Cg`Qlx&{IzY;Fz#LB*HNjc)jG-4{bqKky_z*i zssBWc80d@7yB>UYPWDLCELHEH-VPnTw}-F#nIbL3q{3qf_^3pLaVrhY)ZJ^jUwN&p;;4aN~kSnvC?$IE_V{|h>m^lcjo{HeST=X0|O?6eN^)OLpT}} zd}aaj8fsC(6}IlevF^~o6$dOK|Czdt7aKG0fm;f3$??tX8}-Y*nYNCD8^<97(~n0V zH=gMB5^Kph#rs{MII^1sa?T3P2<*qczhHC(BS0c|`7ElVK=V(d4*WS!t9x)=3eoci zK<}|dnuVVmk}`u=yn z@O}Ugug&FPu7cMdyjgIS zW6=wTaPy0)s}3g%%tIm=$62BmJ63Lod=k^bhHR&A^()q0AS2#K z;8P?M>K?#V-75wk*gblFH1WguFrhZRA&UIO`0F6H=zG?h!okQpK}^whnb-|4lc1 z!&=olVClk@{p2eFC>+8QO+-osRiQ44pK<~?OB=vhb|q(UR-x|3?&^a5Gi)Dj$i^eh zI9k3eaJrSVdRXvt(=%IDl#kQK?kzoF1m{0s=2zOI3=q6gp! zZQ=X%Pj}BH=B7`uY12nJgNusV~$TDNDdcmiyD@A@mx=F@H)tIV;u2p)8e6Y4(MG~f}AyqLIDEAG5b z%;<405%2LvrS4&X_phA|UVu!5~0m1UiJK8V>mW zfOcf#2Wn5$B_^Dqq)^hq34q?N{>IwuG5*jmWS~OjCvbv~flVg#<;rX%ru(<>>u-z$ z+5(sP_lSQ~V2#*%u&+G&jTa`_p%)x7sQpe|u&<}c zm;X_Qb2PAremW(~rktFZo=`fb(^NR+>dyiyT;=B8WAME6#$*2R-!B}1bHT}NE#o#7 zDl4w(lbLWfLAHF|3e3w{l8Q09V3DtX!6svWnL4z;73~|O1EU(b6|2J+M*1P$CW>Ky z5=5uL=xL|HM@!YM2eUzoH@p@%eehuGd8nJsHMGY|*hY1pd4bkTk z!b8bZcalMe)>#K6UBA_eI$?aCWoXXu)HIylsx}inxX$Lx0U)SC&@9b0fEn`PHO8GF0ew}NV%>PTb&qN2=jt^71;1nImk4ZbULgge*wykLv=_8#PWk+BwJl5lB-<& z6YR>fR~0!s-{F)<5cQXzd7sp6TY-=Vm<&-;%AYldn#evwd;#DqPL15ULofx6*w(?H z3KZ(KyHhriDmUmYfP{D7ML5>^rLJ-&CaJlxZm7^iw#Z()N%cKbAlqKQk58i_h%8Q1 zb_aXI_tBygH!;W@e&F^OtaiyWsbK;)+#`r$s$VNiCJh6Y9$W#j11_UiVj50Q+#iC! zQyjB6RY9ETonw3p$48M@oA4Q-azwYJW$N-_6161rabUcuq&p>wZ^IG)X0+`?H8F+T zM{j!`JKkfBkn^;t&%!`@=%A*~1nGV}b2kA>jzBh!cKnH`;9i!G^A3-wZUv}gQ1St? zLq6ge%g1&J6~Q^HmzA>($~NrmM80!UvX|uAX^;DMIg)B;DxZVNnrYq%*qh><$%r6B$6C3W9ZWmsUEym}9_WPWDu@%Ev zsxAJNR3xZ7p3!cS^$A|iwOKZWDQgEc$E#!r<{x|x8O6vhn1y0DeZhqz&-vTZLmlxX zw{dqCB@{1BdAMm;@zS$8?#?s#Nt^l;OXc!@z3cvFZ>`I6gV7>^WepQ`(E2k}PUuDq zhkUw#mSp{O03mR@gHqO5|Cb}=8tWk$I0)Fa;`;Im%Nq%8YBF=pQ^U-Z9S;(;54ECr zb1!Ip6rh%Ey;)^=qvCv90T016Pa*e^OLn;+m5(S=EBr#?X6h#gf#+dq2>*(fA|)-~ z^rc@B(7#bMo4p{FubZ{IQjaii502gWOgb12NZ#e2`C@Nb{K7nL+u*Y>8m}9G4liy~9f> zGETI6cakgLt@r3>@JaSkj8@47veth3m%w+%Jhg75=@^ojzyLZzC2HV7dB45OB?Dgz2-`1Y*@dV{0vEvLX+K_cT^geP0PMT#CCOfk* zXVDFC40PcuZo_pCl-9%%d!2G|sOAh2{)aHq*h3-w5`w-Iha;=3Q8Sk-YCfjk*3_b{{P57hagQ%%%(X2}tM0J~e_B!wTAj+U=fQNTU*6#X*Y(6RgcI53f`9L<$QXx6 zyPRc9&_w>_^*T(a?N8skxIF790>~h9$af>Bc3 zw_H3v!?QxxdCvBxmbs7v{TudXCbhiD zRNN;8(&ndRX3%%GY+dIROraK3uHH}5FZi5b;4ta-DJv*oa{h~7Ft}-#VK$qv_DQL$ z=x|{>iE%~WgDTLBw!IMqfplU`j9IVu*JP!4ddm4?fHxy!@xf;hv&q~Y4{8G+>SOT= z5U;IW$+w@+tJXGJE+O%GZ^u%nXTb_@+%F~zpn)P2BnCXe?cw7zVM_boU#f#FIo*Bs z9InW${3D65{)sCel8i7tYx*K;czVIJUF1^tPh>>w?l?HtZt&W?dUPzg*@}1!R16Me zR;phh8?oTbinKcTc-I#Ock&=V;Uu5Im2~UioQlji*Hl#1_=qeKRpbB>I%&9|?;bT$ zii3a-QgEEb(r&34oFuTT#_hk*o>MlnK6m%o+b$~*M57-O=t5?^V7ThV8t;8u?Ug~i z;(}dTawooHd%iwTGC9{_6Juf;nylP=N?f6)FJ2YbV`W)o>1J|MX_5Mt9XF6OcrTT^ z#vWTFSwA}d_ZtJY0n{!zy)XPY$gnZ4~r`c z>s6waCa>P7#!G-^v2sv|`JNNj=^b%Y9SAUL8>VFf>QOmr*PWqZW zzlG?@1G zbJ-mUW+F8qCFzejykR49qnJVy)r;Svvka)KhRs+m?uVmR7tT2xD4aaO6MTIIsZ~>p zc3roPTD`$u9NbDOX5$n9d|wQ)Prz8;dss3IM&M7x50ZT3&V*-6keFislk3-bQ&#hY z$etT}@O~dT5;tb<&oDhzv1Z-sVaOi`l{YA09cN#I{?uC{{{F-|aQ6DULvu4-)5>;KLETa|BT5QlKVo%F+Rw{b!`4*kebvzF?UW8j%vvZd;OK z8*LDR8t0iHEl}v|-;Katl>eKBXGAmCsm>=n5Oj1fw_{s1HB|u7!e_&EmCXZQVCUm7 zIp(MRr>u8RR_dCtLFTWyewl1f`r01RpJ(7f@SQfS0bsA7x^Cnw`GJbZN2I0tU#%!D zFOBFduLvZ>tt(Rd$^NF;qldU@0QNKG)YCNn1bO%-6 z5^0N)ejp9XV`rdF5)FF}z`n4PqB3Bh6uExpn}%fDA>S^1TPS>}mrpyTIxl>+ZC2p` z_0HlinC8s#wI1(!JvuhEw|~LTd{1~k?4Cm0?5f+7?0ton?*VI_BJXzva&Kava9R3e zPn>AkY)=GG8WYm?je}1Ef5FT|KorY3ITuLUaNI)VCM}=^|M3_R9NefHlw>Hlj~l9t zc51{d01KdT7ZXa!o94O&`{xEMxLJ)e95_>YGR?Hu@?owbPqYuk4&U<~l(tB!9GV3; zT|cJO=#7pPVuWbAY;gR#4)F@T8;#|zDTm2nXqqD2UcZaXMknicf06PjuePRPHk*1k z&QS$YN`V#2_j?c2J8$isV)A_H?l%m&DxNCLJyG}a4`m{<>l?kg)+7HRqHd~&{O)L< zq`+_`IFauT^$wP|X*75m6;E7WeV?^0m~+xKc~B7Ue=*vW_R*QI;xd#MLAjPQi{+T| zBy)CV&!esQ@nYcT$L0Y%yM3Q6B5BMRnOx-0L`^YLwLJZJkx_%QSc z4@go0TJ-P7CqDHaCIvog4%?d@^H*>*@xN(WsN9O+WA!$1ka>L zB+XJhKn@O`n`qUi6RUK?v6q<~nYz(VFH;DXk=0@J7FmwSIl(iD;ezhLsVGtN&yEM^?v|4c_aj2+$Q=tL~*=YslfQ{b6bJ-Ba zL8tM=wI`^2Sbiw4R}p!>R(l8k1t&pq4{3eGPZCEHbatM{MRd+~5oiqItvFxvjRj5)(S#9)TG<47c~X`wHPS&s<2^41P*p$O zXtOPT5Xe}E%u`T1;OzmPdY z&rijpYS=Ca8z~IgDJ;1la7vWTzTvoAyyPbQ;~X0iMzE=-7#)*w5N#)#iirM3O?2~pA(HL5=vLA0&7bWGU>OVJY=KDqWtHND_i0K9o5)*+0k57A zyz_Tl=fM|T?|Qsyoxg98z;&qjUMOBTv*>x_cZN6%?KXy^I|qf=whxfAnV8G2Ig_5e zIeINFrZuSG{0u$j=Hd#c&l^|e@p|gL-wYULKzU)-)Ebj`Csm6dTHpDS5IrZJL4^HQ z-TrT)TONYA+5vu76Dl9E8Z;}?oPTOD!4aEmpWk~FMdI?5jXjEd4sWIV#_<0SM1TN_ zU>x~hO8PJVOMMPgPPe+N{gS0wU*(;cx}nNaJ2Sft-8kJ*#l5 zkk19h>hah+zSdhav?WR@{k&u$pBa_v;c3m(NFAhW&w6#NLs|5?PMtsz*?ZmQNz7&s_1Z#9qcC@B%8*s!v8{7jo;7Y*=$*VBzQi#a2 zb-^_5opWCRRMWlksS5l!U$S4*1f_z;+63Gt<}ryVV&OYUuM)`U5=W* zi}TZ8+7=v^M3GatdsEn*PwC9W~I9`%Kx|4>D#RT1$o(a$;P(fP; zVfwe`M{IR63NlXwsJ-}RE}^zXdrq`QfT7$+G%ms7ffqIb_eN0GA(@NHHxqb6u70nP zV3BXr^jCT2>EKF0odi-%^tA8BF^Vv9{oW zlRlR+TOE|Er^?7va(1pvyITtbr@T4fytT5aw*|{tJgYeeS+Q&2^322#Me|q zXHkKKx%|VQ$KQQj`Z<^twZ1e$B}~!pPrEcn9P~UUf4u;uRm1F?q#Rt3B>g&53z~WG zgv}ZqTi;Ti(HO+fgflRrsj6YeejHrCkJ}aR7paN&w&I)7z7N2Ab&-ZJ$p-*_&|hQ! E4-n|&ApigX delta 50267 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 I_+Nwn2T20>!T | integer | --> | integer-or-marker | <-- | marker | + | fixnum | --> | integer | --> | integer-or-marker | <-- | marker | +-------------+ +--------------------+ +----------------------+ +--------+ | | | | | | diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 323d826f323..0b30e10b344 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -65,7 +65,7 @@ number-or-marker symbol array) (number float integer) (number-or-marker marker number) - (integer bignum fixum) + (integer bignum fixnum) (symbol keyword boolean symbol-with-pos) (array vector bool-vector char-table string) (list null cons) From f6743099cc907f1f2847f028ff8f3712288c559f Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Sun, 18 Feb 2024 18:08:51 -0800 Subject: [PATCH 227/446] Back out part of commit db5e84af202 * lisp/gnus/gnus-agent.el (gnus-category-make-function-1): This code is untested and was not meant to be part of the earlier commit. --- lisp/gnus/gnus-agent.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 0928b179787..1726b806913 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -2920,9 +2920,8 @@ The following commands are available: ;; Functions are just returned as is. ((or (symbolp predicate) (functionp predicate)) - (let ((fun (or (cdr (assq predicate gnus-category-predicate-alist)) - predicate))) - (if (symbolp fun) `(,fun) `(funcall ',fun)))) + `(,(or (cdr (assq predicate gnus-category-predicate-alist)) + predicate))) ;; More complex predicate. ((consp predicate) `(,(cond From 8f260bb93f534b24d9a93d3315804ffe0c1fec4f Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Sun, 18 Feb 2024 21:39:31 -0800 Subject: [PATCH 228/446] Don't update ranges for the whole buffer in treesit--pre-redisplay * lisp/treesit.el (treesit--pre-redisplay): Only update two screen-full of text around point. --- lisp/treesit.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lisp/treesit.el b/lisp/treesit.el index f811b8090bc..fa82ad898a9 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -1382,7 +1382,15 @@ as comment due to incomplete parse tree." ;; `treesit-update-ranges' will force the host language's parser to ;; reparse and set correct ranges for embedded parsers. Then ;; `treesit-parser-root-node' will force those parsers to reparse. - (treesit-update-ranges) + (let ((len (+ (* (window-body-height) (window-body-width)) 800))) + ;; FIXME: As a temporary fix, this prevents Emacs from updating + ;; every single local parsers in the buffer every time there's an + ;; edit. Moving forward, we need some way to properly track the + ;; regions which need update on parser ranges, like what jit-lock + ;; and syntax-ppss does. + (treesit-update-ranges + (max (point-min) (- (point) len)) + (min (point-max) (+ (point) len)))) ;; Force repase on _all_ the parsers might not be necessary, but ;; this is probably the most robust way. (dolist (parser (treesit-parser-list)) From be8f3e68a88a00bc12f1cc405a8a341666c41858 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Tue, 2 Jan 2024 12:06:16 +0100 Subject: [PATCH 229/446] * test/src/eval-tests.el (eval-tests/default-value): Add new test case. Bug#66117 --- test/src/eval-tests.el | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/test/src/eval-tests.el b/test/src/eval-tests.el index e1c90feb09a..187dc2f34d5 100644 --- a/test/src/eval-tests.el +++ b/test/src/eval-tests.el @@ -282,26 +282,39 @@ expressions works for identifiers starting with period." (should-error (defvaralias 'eval-tests--my-c 'eval-tests--my-d) :type 'cyclic-variable-indirection)) -(defvar eval-tests/global-var 'value) -(defvar-local eval-tests/buffer-local-var 'value) +(defvar eval-tests/global-var 'global-value) +(defvar-local eval-tests/buffer-local-var 'default-value) (ert-deftest eval-tests/default-value () ;; `let' overrides the default value for global variables. (should (default-boundp 'eval-tests/global-var)) - (should (eq 'value (default-value 'eval-tests/global-var))) - (should (eq 'value eval-tests/global-var)) - (let ((eval-tests/global-var 'bar)) - (should (eq 'bar (default-value 'eval-tests/global-var))) - (should (eq 'bar eval-tests/global-var))) + (should (eq 'global-value (default-value 'eval-tests/global-var))) + (should (eq 'global-value eval-tests/global-var)) + (let ((eval-tests/global-var 'let-value)) + (should (eq 'let-value (default-value 'eval-tests/global-var))) + (should (eq 'let-value eval-tests/global-var))) ;; `let' overrides the default value everywhere, but leaves ;; buffer-local values unchanged in current buffer and in the ;; buffers where there is no explicitly set buffer-local value. (should (default-boundp 'eval-tests/buffer-local-var)) - (should (eq 'value (default-value 'eval-tests/buffer-local-var))) - (should (eq 'value eval-tests/buffer-local-var)) + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'default-value eval-tests/buffer-local-var)) (with-temp-buffer - (let ((eval-tests/buffer-local-var 'bar)) - (should (eq 'bar (default-value 'eval-tests/buffer-local-var))) - (should (eq 'bar eval-tests/buffer-local-var))))) + (let ((eval-tests/buffer-local-var 'let-value)) + (should (eq 'let-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'let-value eval-tests/buffer-local-var)))) + ;; When current buffer has explicit buffer-local binding, `let' does + ;; not alter the default binding. + (with-temp-buffer + (setq-local eval-tests/buffer-local-var 'local-value) + (let ((eval-tests/buffer-local-var 'let-value)) + ;; Let in a buffer with local binding does not change the + ;; default value for variable. + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'let-value eval-tests/buffer-local-var)) + (with-temp-buffer + ;; We are in a new buffer - `eval-tests/buffer-local-var' has its global default value. + (should (eq 'default-value (default-value 'eval-tests/buffer-local-var))) + (should (eq 'default-value eval-tests/buffer-local-var)))))) (ert-deftest eval-tests--handler-bind () ;; A `handler-bind' has no effect if no error is signaled. From 5d3ecd7358252349dd26e6015a83054893af4474 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Helary Date: Mon, 19 Feb 2024 20:05:14 +0900 Subject: [PATCH 230/446] ; Proofreading changes in doc/translations/README. --- doc/translations/README | 135 ++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/doc/translations/README b/doc/translations/README index c689f0b14b3..35b9b9e9cf9 100644 --- a/doc/translations/README +++ b/doc/translations/README @@ -15,22 +15,23 @@ any later version published by the Free Software Foundation. See https://www.gnu.org/licenses/fdl-1.3.html for more information. -If you have questions regarding the use of the FDL license in your -translation work that are not answered in the FAQ, do not hesitate to -contact the GNU project: https://www.gnu.org/contact/ +If you have any questions regarding the use of the FDL license in your +translation work that do not appear in the FAQ, feel free to contact the +GNU project. -** Location +See https://www.gnu.org/contact/ for more information. + +** Location of the translated files *** Texinfo source files -The source files of the translated manuals are located in the doc/ -directory, under the directory whose name corresponds to the translated -language. +The source files of the translated manuals are located in the +doc/translations directory, under the translated language sub-directory. - E.g., French manuals sources are found under doc/fr. + E.g., French manual sources are found under doc/translations/fr. -The structure of the language folders should match the structure of the -English manuals (i.e. include misc, man, lispref, lispintro, emacs). +The structure of each language folder should match that of the English +manuals (i.e. include misc, man, lispref, lispintro, emacs). *** built files @@ -38,22 +39,21 @@ Translated deliverables in info format are built at release time and are made available for local installation. -** Format +** Source files format The manuals and their translations are written in the Texinfo format -(with the exception of the org-mode manual that is written in org-mode -and of illustrations for the Introduction to Emacs Lisp Programming that -are written in eps). +(with the exception of the org-mode manual, which is written in +org-mode, and illustrations for the Introduction to Emacs Lisp +Programming, which are written in eps). See https://www.gnu.org/software/Texinfo/ for more information. -You should install the Texinfo utilities to be able to verify the -translated files, and refer to the Texinfo manual if you do not -understand the meaning of the various Texinfo declarations. +You must install the Texinfo utilities in order to verify the translated +files, and refer to the Texinfo manual for information on the various +Texinfo declarations. -Emacs has a Texinfo mode that properly highlights the Texinfo code to -make it easier to see which parts are text to be translated and which -parts are not. +Emacs has a Texinfo mode that highlights the parts of the Texinfo code +to be translated for easy reference. *** Texinfo specific issues @@ -61,21 +61,21 @@ parts are not. Until the Emacs/Texinfo projects provide better solutions, here are a few rules to follow: -- Under each @node, add an @anchor that has the same content at the -original English @node. +- Under each @node, add an @anchor that has the same content as the + original English @node. - Translate the @node content but leave the @anchor in English. - Most Emacs manuals are set to include the docstyle.Texi file. This -file adds the @documentencoding UTF-8 directive to the targeted manual. -There is no need to add this directive in a manual that includes -docstyle.Texi. + file adds the @documentencoding UTF-8 directive to the targeted + manual. There is no need to add this directive in a manual that + includes docstyle.texi. - Add a @documentlanguage directive that includes your language. E.g., @documentlanguage zh -This directive has currently little effect but will be useful in the +This directive currently has little effect but will be useful in the future. - The @author directive can be used for the translator's name. @@ -85,34 +85,35 @@ future. ** Fixing the original document -During the course of the translation, you might find parts of the -original document that need to be updated or otherwise fixed, or even -bugs in Emacs. If you do not intend to provide fixes right away, please -file a bug report promptly so someone can fix it soon. +During the course of the translation, you might encounter passages in +the original document that need to be updated or otherwise corrected, or +even run into a bug in Emacs. If you cannot immediately correct the +problem, please file a bug report promptly. See the 'Bugs' section in the Emacs manual. -** Sending contributions +** Sending your contributions -Send your contributions (either files or revisions) to -emacs-devel@gnu.org for review. +Send your contributions (files or revisions) for review to the Emacs +development list at emacs-devel@gnu.org. Subscribing to the list is not +obligatory. Always send contributions in the format of the original document. Most -of the contents in the Emacs manuals are in Texinfo format, so do not -send contributions that are in derivative formats (e.g., info, html, -docbook, plain text, etc.) +of the content in the Emacs manuals is in Texinfo format, so please do +not send contributions in derivative formats (e.g. info, html, docbook, +plain text, etc.) -Before sending files for review, ensure that they have been properly -checked for spelling/grammar/typography by at least using the tools that -Emacs provides. +Before sending files for review, please ensure that they have been +thoroughly checked for spelling/grammar/typography by at least using the +tools provided by Emacs. -You should also make sure that the Texinfo files build properly on your +Please also make sure that the Texinfo files build properly on your system. Send your contributions as patches (git diff -p --stat), and prefer the -git format-patch form because the format allows easier review and easier -installation of the changes by someone with write access to the -repository. +git format-patch form, since the format allows for easier review and +easier installation of the changes by the persons with write access to +the repository. The Emacs project has a lot of coding, documentation and commenting conventions. Sending such patches allows the project managers to make @@ -121,25 +122,24 @@ sure that the contributions comply with the various conventions. ** Discussing translation issues -Translation-related discussions are welcome on the emacs-devel list. -Discussions specific to your language do not have to take place in +Translation-related discussions are welcome on the emacs development +list. Discussions specific to your language do not have to be in English. ** Translation teams -The number of words in the Emacs manuals is above 2,000,000 words and +The number of words in the Emacs manuals is over 2,000,000 words and growing. While one individual could theoretically translate all the files, it is more practical to work in language teams. -If you have a small group of translators willing to help, make sure that -the files are properly reviewed before sending them to emacs-devel (see -above). +If you have a small group of translators willing to help, please make +sure that the files are properly reviewed before sending them to the +Emacs development list (see above). -You are invited to refer to the translation-related documents that the -GNU Project maintains and to get in touch with your language's -translation team to learn from the practices they have developed over -the years. +Please refer to the translation-related documents maintained by the GNU +Project, and contact your language translation team to learn the +practices they have developed over the years. See https://www.gnu.org/server/standards/README.translations.html for more information. @@ -148,46 +148,45 @@ more information. ** Translation processes Emacs does not yet provide tools that significantly help the translation -process. A few useful functions would be +process. A few useful functions would be: - automatic lookup of a list of glossary items when starting to work on -a translation "unit" (paragraph or otherwise), such glossary terms -should be easily insertable at point, + a translation "unit" (paragraph or otherwise); such glossary terms + should be easily insertable at point, - automatic lookup of past translations to check for similarity and -improve homogeneity over the whole document set, such past translation -matches should be easily insertable at point, - -etc. + improve homogeneity over the whole document set; such past translation + matches should be easily insertable at point, etc. *** Using the PO format as an intermediate translation format Although the PO format has not been developed with documentation in -mind, it is well known among free software translation teams and you can -easily use the po4a utility to convert Texinfo to PO for work in +mind, it is well-known among free software translation teams, and you +can easily use the po4a utility to convert Texinfo to PO for work in translation tools that support the PO format. See https://po4a.org for more information. However, regardless of the intermediate file format that you might use, -you should only send Texinfo files for review to emacs-devel. +you should only send files in the original format (Texinfo, org-mode, +eps) for review and installation. *** Free tools that you can use in your processes -A number of free software tools exist, outside the Emacs ecosystem, to -help translators (amateurs and professionals alike) with the translation -process. +A number of free software tools are available outside the Emacs +ecosystem, to help translators (both amateur and professional) in the +translation process. -If you find that Emacs should implement some of their features, you are +If they have any features that you think Emacs should implement, you are welcome to provide patches to the Emacs project. Such tools include: - the GNOME Translation Editor, https://wiki.gnome.org/Apps/Gtranslator/ - KDE's Lokalize, https://apps.kde.org/lokalize/ -- OmegaT, http://omegat.org +- OmegaT, https://omegat.org - the Okapi Framework, https://www.okapiframework.org - pootle, https://pootle.translatehouse.org From 70dc1700562309c2612a71be35f9c71e9e1641b8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 19 Feb 2024 15:19:54 +0200 Subject: [PATCH 231/446] ; Further copyedits of doc/translations/README. --- doc/translations/README | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/doc/translations/README b/doc/translations/README index 35b9b9e9cf9..02edb829dcf 100644 --- a/doc/translations/README +++ b/doc/translations/README @@ -26,31 +26,32 @@ See https://www.gnu.org/contact/ for more information. *** Texinfo source files The source files of the translated manuals are located in the -doc/translations directory, under the translated language sub-directory. +doc/translations directory, under the sub-directory corresponding to the +translated language. E.g., French manual sources are found under doc/translations/fr. -The structure of each language folder should match that of the English +The structure of each language's folder should match that of the English manuals (i.e. include misc, man, lispref, lispintro, emacs). -*** built files +*** Built files -Translated deliverables in info format are built at release time and are +Translated deliverables in Info format are built at release time and are made available for local installation. ** Source files format The manuals and their translations are written in the Texinfo format -(with the exception of the org-mode manual, which is written in -org-mode, and illustrations for the Introduction to Emacs Lisp -Programming, which are written in eps). +(with the exception of the org-mode manual, which is written in Org, and +illustrations for the Introduction to Emacs Lisp Programming, which are +EPS files). See https://www.gnu.org/software/Texinfo/ for more information. -You must install the Texinfo utilities in order to verify the translated +You must install the Texinfo package in order to verify the translated files, and refer to the Texinfo manual for information on the various -Texinfo declarations. +Texinfo features. Emacs has a Texinfo mode that highlights the parts of the Texinfo code to be translated for easy reference. @@ -67,7 +68,7 @@ few rules to follow: - Translate the @node content but leave the @anchor in English. - Most Emacs manuals are set to include the docstyle.Texi file. This - file adds the @documentencoding UTF-8 directive to the targeted + file adds the "@documentencoding UTF-8" directive to the targeted manual. There is no need to add this directive in a manual that includes docstyle.texi. @@ -111,7 +112,7 @@ Please also make sure that the Texinfo files build properly on your system. Send your contributions as patches (git diff -p --stat), and prefer the -git format-patch form, since the format allows for easier review and +git format-patch form, since that format allows for easier review and easier installation of the changes by the persons with write access to the repository. @@ -123,7 +124,7 @@ sure that the contributions comply with the various conventions. ** Discussing translation issues Translation-related discussions are welcome on the emacs development -list. Discussions specific to your language do not have to be in +list. Discussions specific to your language do not have to be in English. @@ -175,9 +176,9 @@ eps) for review and installation. *** Free tools that you can use in your processes -A number of free software tools are available outside the Emacs -ecosystem, to help translators (both amateur and professional) in the -translation process. +A number of free software tools are available outside the Emacs project, +to help translators (both amateur and professional) in the translation +process. If they have any features that you think Emacs should implement, you are welcome to provide patches to the Emacs project. From ddfba511c190e5bb44e44a50aef5ab8c08e3d798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 19 Feb 2024 10:27:02 +0100 Subject: [PATCH 232/446] Check shortdoc keywords and fix one mistake * lisp/emacs-lisp/shortdoc.el (shortdoc--check) (define-short-documentation-group): Check that used keywords exist. * lisp/emacs-lisp/shortdoc.el (list): Fix a typo. --- lisp/emacs-lisp/shortdoc.el | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el index a6a49c72f74..cde28985cd0 100644 --- a/lisp/emacs-lisp/shortdoc.el +++ b/lisp/emacs-lisp/shortdoc.el @@ -50,6 +50,17 @@ '((t :inherit variable-pitch)) "Face used for a section.") +;;;###autoload +(defun shortdoc--check (group functions) + (let ((keywords '( :no-manual :args :eval :no-eval :no-value :no-eval* + :result :result-string :eg-result :eg-result-string :doc))) + (dolist (f functions) + (when (consp f) + (dolist (x f) + (when (and (keywordp x) (not (memq x keywords))) + (error "Shortdoc %s function `%s': bad keyword `%s'" + group (car f) x))))))) + ;;;###autoload (progn (defvar shortdoc--groups nil) @@ -118,6 +129,7 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'), `:no-eval*', `:result', `:result-string', `:eg-result' and `:eg-result-string' properties." (declare (indent defun)) + (shortdoc--check group functions) `(progn (setq shortdoc--groups (delq (assq ',group shortdoc--groups) shortdoc--groups)) @@ -715,7 +727,7 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'), :eval (plist-get '(a 1 b 2 c 3) 'b)) (plist-put :no-eval (setq plist (plist-put plist 'd 4)) - :eq-result (a 1 b 2 c 3 d 4)) + :eg-result (a 1 b 2 c 3 d 4)) (plist-member :eval (plist-member '(a 1 b 2 c 3) 'b)) "Data About Lists" From 188fe6bffa69e08b60a7d65709998bd803b7ada5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 19 Feb 2024 11:44:53 +0100 Subject: [PATCH 233/446] Replace XSET_HASH_TABLE with make_lisp_hash_table * src/lisp.h (XSET_HASH_TABLE): Remove, replace with... (make_lisp_hash_table): ...this. All callers adapted. --- src/alloc.c | 3 +-- src/fns.c | 13 ++----------- src/lisp.h | 8 ++++++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 6abe9e28650..8c94c7eb33c 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6034,8 +6034,7 @@ purecopy (Lisp_Object obj) return obj; /* Don't hash cons it. */ } - struct Lisp_Hash_Table *h = purecopy_hash_table (table); - XSET_HASH_TABLE (obj, h); + obj = make_lisp_hash_table (purecopy_hash_table (table)); } else if (COMPILEDP (obj) || VECTORP (obj) || RECORDP (obj)) { diff --git a/src/fns.c b/src/fns.c index f94e8519957..0a9692f36e8 100644 --- a/src/fns.c +++ b/src/fns.c @@ -4608,13 +4608,7 @@ make_hash_table (const struct hash_table_test *test, EMACS_INT size, h->next_weak = NULL; h->purecopy = purecopy; h->mutable = true; - - Lisp_Object table; - XSET_HASH_TABLE (table, h); - eassert (HASH_TABLE_P (table)); - eassert (XHASH_TABLE (table) == h); - - return table; + return make_lisp_hash_table (h); } @@ -4624,7 +4618,6 @@ make_hash_table (const struct hash_table_test *test, EMACS_INT size, static Lisp_Object copy_hash_table (struct Lisp_Hash_Table *h1) { - Lisp_Object table; struct Lisp_Hash_Table *h2; h2 = allocate_hash_table (); @@ -4649,9 +4642,7 @@ copy_hash_table (struct Lisp_Hash_Table *h1) h2->index = hash_table_alloc_bytes (index_bytes); memcpy (h2->index, h1->index, index_bytes); } - XSET_HASH_TABLE (table, h2); - - return table; + return make_lisp_hash_table (h2); } diff --git a/src/lisp.h b/src/lisp.h index 79a6a054b81..db053ba9f70 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2547,8 +2547,12 @@ XHASH_TABLE (Lisp_Object a) return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Hash_Table); } -#define XSET_HASH_TABLE(VAR, PTR) \ - XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE) +INLINE Lisp_Object +make_lisp_hash_table (struct Lisp_Hash_Table *h) +{ + eassert (PSEUDOVECTOR_TYPEP (&h->header, PVEC_HASH_TABLE)); + return make_lisp_ptr (h, Lisp_Vectorlike); +} /* Value is the key part of entry IDX in hash table H. */ INLINE Lisp_Object From 23793600778c4efe5615b646f2d3895624c23ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 19 Feb 2024 14:42:55 +0100 Subject: [PATCH 234/446] Slight switch byte op speedup * src/bytecode.c (exec_byte_code): Hoist symbols_with_pos_enabled check from fast loop, and eliminate the initial index check. --- src/bytecode.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/bytecode.c b/src/bytecode.c index dd805cbd97a..8d7240b9966 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1737,28 +1737,29 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, if (BYTE_CODE_SAFE && !HASH_TABLE_P (jmp_table)) emacs_abort (); Lisp_Object v1 = POP; - ptrdiff_t i; struct Lisp_Hash_Table *h = XHASH_TABLE (jmp_table); - - /* h->count is a faster approximation for HASH_TABLE_SIZE (h) - here. */ - if (h->count <= 5 && !h->test->cmpfn) - { /* Do a linear search if there are not many cases - FIXME: 5 is arbitrarily chosen. */ - for (i = h->count; 0 <= --i; ) - if (EQ (v1, HASH_KEY (h, i))) - break; + /* Do a linear search if there are few cases and the test is `eq'. + (The table is assumed to be sized exactly; all entries are + consecutive at the beginning.) + FIXME: 5 is arbitrarily chosen. */ + if (h->count <= 5 && !h->test->cmpfn && !symbols_with_pos_enabled) + { + eassume (h->count >= 2); + for (ptrdiff_t i = h->count - 1; i >= 0; i--) + if (BASE_EQ (v1, HASH_KEY (h, i))) + { + op = XFIXNUM (HASH_VALUE (h, i)); + goto op_branch; + } } else - i = hash_lookup (h, v1); - - if (i >= 0) { - Lisp_Object val = HASH_VALUE (h, i); - if (BYTE_CODE_SAFE && !FIXNUMP (val)) - emacs_abort (); - op = XFIXNUM (val); - goto op_branch; + ptrdiff_t i = hash_lookup (h, v1); + if (i >= 0) + { + op = XFIXNUM (HASH_VALUE (h, i)); + goto op_branch; + } } } NEXT; From 0393bfdc912912e3368b786d062894f3069d210b Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Mon, 19 Feb 2024 17:40:04 +0100 Subject: [PATCH 235/446] Make type hierarchy textual representation a table * etc/syncdoc-type-hierarchy.el (syncdoc-make-type-table): New function. (syncdoc-update-type-hierarchy): Make use of. * doc/lispref/type_hierarchy.txt: Regenerate. --- doc/lispref/type_hierarchy.txt | 169 +++++---------------------------- etc/syncdoc-type-hierarchy.el | 25 ++++- 2 files changed, 42 insertions(+), 152 deletions(-) diff --git a/doc/lispref/type_hierarchy.txt b/doc/lispref/type_hierarchy.txt index 2ffee0b6a85..f68218b507a 100644 --- a/doc/lispref/type_hierarchy.txt +++ b/doc/lispref/type_hierarchy.txt @@ -1,147 +1,22 @@ - +--------------------+ - | bignum | - +--------------------+ - | - | - v - +-------------+ +--------------------+ +----------------------+ +--------+ - | fixnum | --> | integer | --> | integer-or-marker | <-- | marker | - +-------------+ +--------------------+ +----------------------+ +--------+ - | | | - | | | - v | | - +-------------+ +--------------------+ | | - | float | --> | number | | | - +-------------+ +--------------------+ | | - | | | - | | | - v | | - +--------------------+ | | +------------------+ +--------------------+ +----------+ +--------+ - | number-or-marker | <-----+----------------------------+ | tree-sitter-node | | tree-sitter-parser | | user-ptr | | window | - +--------------------+ | +------------------+ +--------------------+ +----------+ +--------+ - | | | | | | - | | | | | | - v v v v v v - +-------------+ +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +----------------------------+ - | font-entity | --> | | <-- | overlay | - +-------------+ | | +----------------------------+ - +-------------+ | | +----------------------------+ - | font-object | --> | | <-- | process | - +-------------+ | | +----------------------------+ - +-------------+ | | +----------------------------+ - | font-spec | --> | | <-- | structure | - +-------------+ | atom | +----------------------------+ - +-------------+ | | +----------------------------+ - | frame | --> | | <-- | terminal | - +-------------+ | | +----------------------------+ - +-------------+ | | +----------------------------+ - | hash-table | --> | | <-- | thread | - +-------------+ | | +----------------------------+ - +-------------+ | | +----------------------------+ - | mutex | --> | | <-- | tree-sitter-compiled-query | - +-------------+ +-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +----------------------------+ - | ^ ^ ^ ^ ^ ^ ^ - | | | | | | | | - v | | | | | | | - +--------------------+ | +----------------------+ | | +--------+ +-------+ +---------+ - +--------------------> | t | | | window-configuration | | | | buffer | | class | | condvar | - | +--------------------+ | +----------------------+ | | +--------+ +-------+ +---------+ - | +--------------------+ | | | - | | byte-code-function | | | | - | +--------------------+ | | | - | | | | | - | | | | | - | v | | | - | +--------------------+ | | | - | | compiled-function | | | | - | +--------------------+ | | | - | | | | | - | | | | | - | v | | | - | +--------------------+ | | | - | +> | function | -+ | | - | | +--------------------+ | | - | | ^ | | - | | +--------------------------------------------------+--------------+------------------------+ - | | | | | - | | +--------------------+ | | | - | | | subr-primitive | | | | - | | +--------------------+ | | | - | | | | | | - | | | | | | - | | v | | | - | | +--------------------+ | | | - | +- | subr | <-----------------------------+----+ | | - | +--------------------+ | | | | - | +--------------------+ | | | | - | | keyword | -+ | | | | - | +--------------------+ | | | | | - | | | | | | | - | | | | | | | - | v | | | | | - | +--------------------+ | | | | | - | | symbol-with-pos | | | | | | - | +--------------------+ | | | | | - | | | | | | | - | | +----+ | | | | - | v | | | | | - | +--------------------+ | | | | | - | +> | symbol | ------+-----------------------+ | | | - | | +--------------------+ | | | | - | | ^ | | | | - | | +--------------------------+ | | | - | | | | | - | | +--------------------+ | | | - | | | null | -+ | | | - | | +--------------------+ | | | | - | | | | | | | - | | | | | | | - | | v | | | | - | | +--------------------+ | | | | - | +- | boolean | | | | | - | +--------------------+ | | | | - | +--------------------+ | | | | - | | cons | | | | | - | +--------------------+ | | | | - | | | | | | - | | | | | | - | v | | | | - | +--------------------+ | | | | - | | list | <+ | | | - | +--------------------+ | | | - | | | | | - | | | | | - | v | | | - | +--------------------+ | | | - +--------------------- | sequence | | | | - +--------------------+ | | | - ^ | | | - +------------------------+ | | | - | | | | - | +--------------------+ | | | - | | subr-native-elisp | -----------------------------------+ | | - | +--------------------+ | | - | | | - | +-------------------------------------------+ | - | | | - | +--------------------+ | | - | | bool-vector | | | - | +--------------------+ | | - | | | | - | | | | - | v | | - | +-------------+ +-------------------------------------------------+ | - | | string | --> | array | | - | +-------------+ +-------------------------------------------------+ | - | ^ | ^ | - | | | | | - | | | | | - | +--------------------+ | +----------------------+ | - | | vector | | | char-table | | - | +--------------------+ | +----------------------+ | - | | | - +----------------------------------------------+ | - | - +--------------------+ | - | module-function | ----------------------------------------------------------------------+ - +--------------------+ +| Type | Derived Types | +|-------------------+----------------------------------------------------------| +| t | sequence atom | +| sequence | list array | +| atom | class structure tree-sitter-compiled-query | +| | tree-sitter-node tree-sitter-parser user-ptr font-object | +| | font-entity font-spec condvar mutex thread terminal | +| | hash-table frame buffer function window process | +| | window-configuration overlay integer-or-marker | +| | number-or-marker symbol array | +| number | float integer | +| number-or-marker | marker number | +| integer | bignum fixnum | +| symbol | keyword boolean symbol-with-pos | +| array | vector bool-vector char-table string | +| list | null cons | +| integer-or-marker | integer marker | +| compiled-function | byte-code-function | +| function | subr module-function compiled-function | +| boolean | null | +| subr | subr-native-elisp subr-primitive | +| symbol-with-pos | keyword | diff --git a/etc/syncdoc-type-hierarchy.el b/etc/syncdoc-type-hierarchy.el index eebb092abae..cd0cae2f954 100644 --- a/etc/syncdoc-type-hierarchy.el +++ b/etc/syncdoc-type-hierarchy.el @@ -35,6 +35,7 @@ ;;; Code: (require 'cl-lib) +(require 'org-table) (eval-and-compile (defconst syncdoc-lispref-dir (concat (file-name-directory @@ -55,6 +56,23 @@ (goto-char (point-max)) (insert "}\n")) +(defun syncdoc-make-type-table (file) + (with-temp-file file + (insert "|Type| Derived Types|\n|-\n") + (cl-loop for (type . children) in cl--type-hierarchy + do (insert "|" (symbol-name type) " |") + do (cl-loop with x = 0 + for child in children + for child-len = (length (symbol-name child)) + when (> (+ x child-len 2) 60) + do (progn + (insert "|\n||") + (setq x 0)) + do (insert (symbol-name child) " ") + do (cl-incf x (1+ child-len)) ) + do (insert "\n")) + (org-table-align))) + (defun syncdoc-update-type-hierarchy () "Update the type hierarchy representation used by the elisp manual." (interactive) @@ -63,10 +81,7 @@ (call-process-region nil nil "dot" t (current-buffer) nil "-Tjpg" "-o" (expand-file-name "type_hierarchy.jpg" syncdoc-lispref-dir))) - (with-temp-buffer - (syncdoc-insert-dot-content "TB") - (call-process-region nil nil "graph-easy" t (current-buffer) nil "--output" - (expand-file-name "type_hierarchy.txt" - syncdoc-lispref-dir)))) + (syncdoc-make-type-table (expand-file-name "type_hierarchy.txt" + syncdoc-lispref-dir))) ;;; syncdoc-type-hierarchy.el ends here From afed7f959a39c077aba6dc585cdfc0edcf05ddc8 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Mon, 19 Feb 2024 17:42:14 +0100 Subject: [PATCH 236/446] * etc/syncdoc-type-hierarchy.el: Update comment. --- etc/syncdoc-type-hierarchy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/syncdoc-type-hierarchy.el b/etc/syncdoc-type-hierarchy.el index cd0cae2f954..10bcb059ac8 100644 --- a/etc/syncdoc-type-hierarchy.el +++ b/etc/syncdoc-type-hierarchy.el @@ -30,7 +30,7 @@ ;; documentation is regenerated. ;; We do not call this directly from make docs in order not to add a -;; dependency on the tools "dot" and "graph-easy". +;; dependency on the tool "dot". ;;; Code: From 6a2b43c5692e7427be0ddc6b084052f283b77d65 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Mon, 19 Feb 2024 17:47:45 +0100 Subject: [PATCH 237/446] * etc/syncdoc-type-hierarchy.el (syncdoc-lispref-dir): Clean-up. --- etc/syncdoc-type-hierarchy.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/etc/syncdoc-type-hierarchy.el b/etc/syncdoc-type-hierarchy.el index 10bcb059ac8..b3dfe63406a 100644 --- a/etc/syncdoc-type-hierarchy.el +++ b/etc/syncdoc-type-hierarchy.el @@ -37,11 +37,10 @@ (require 'cl-lib) (require 'org-table) -(eval-and-compile - (defconst syncdoc-lispref-dir (concat (file-name-directory - (or load-file-name - buffer-file-name)) - "../doc/lispref/"))) +(defconst syncdoc-lispref-dir (concat (file-name-directory + (or load-file-name + buffer-file-name)) + "../doc/lispref/")) (defun syncdoc-insert-dot-content (rankdir) (maphash (lambda (child parents) From 6893106fe9302b1be68dd04034441799e6d29b68 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Thu, 15 Feb 2024 12:10:12 +0100 Subject: [PATCH 238/446] Allow attaching files at point using 'gnus-dired-attach' * lisp/gnus/gnus-dired.el (gnus-dired-attach-at-end): Add option. (gnus-dired-attach): Respect it. * doc/misc/gnus.texi (Other modes): Document it. (Bug#69141) --- doc/misc/gnus.texi | 5 ++++- lisp/gnus/gnus-dired.el | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 2f8f97e5845..98196310b5c 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -26695,9 +26695,12 @@ buffers. It is enabled with @table @kbd @item C-c C-m C-a @findex gnus-dired-attach +@vindex gnus-dired-attach-at-end @cindex attachments, selection via dired Send dired's marked files as an attachment (@code{gnus-dired-attach}). -You will be prompted for a message buffer. +You will be prompted for a message buffer. By default it will attach +files to the end of the message buffer, but you can modify that +behaviour by customising @code{gnus-dired-attach-at-end}. @item C-c C-m C-l @findex gnus-dired-find-file-mailcap diff --git a/lisp/gnus/gnus-dired.el b/lisp/gnus/gnus-dired.el index 48c1aef968b..f33c5f7f2e5 100644 --- a/lisp/gnus/gnus-dired.el +++ b/lisp/gnus/gnus-dired.el @@ -111,6 +111,12 @@ See `mail-user-agent' for more information." (autoload 'gnus-completing-read "gnus-util") +(defcustom gnus-dired-attach-at-end t + "Non-nil means that files should be attached at the end of a buffer." + :group 'mail ;; dired? + :version "30.1" + :type 'boolean) + ;; Method to attach files to a mail composition. (defun gnus-dired-attach (files-to-attach) "Attach dired's marked files to a gnus message composition. @@ -161,7 +167,8 @@ filenames." ;; set buffer to destination buffer, and attach files (set-buffer destination) - (goto-char (point-max)) ;attach at end of buffer + (when gnus-dired-attach-at-end + (goto-char (point-max))) ;attach at end of buffer (while files-to-attach (mml-attach-file (car files-to-attach) (or (mm-default-file-type (car files-to-attach)) From a1cbc4d810bc1b525fa46b23249b414c1ad6b031 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 19 Feb 2024 21:34:43 +0200 Subject: [PATCH 239/446] ; * doc/misc/gnus.texi (Other modes): Fix last change. --- doc/misc/gnus.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 98196310b5c..419a5390374 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -26698,9 +26698,9 @@ buffers. It is enabled with @vindex gnus-dired-attach-at-end @cindex attachments, selection via dired Send dired's marked files as an attachment (@code{gnus-dired-attach}). -You will be prompted for a message buffer. By default it will attach -files to the end of the message buffer, but you can modify that -behaviour by customising @code{gnus-dired-attach-at-end}. +The function prompts for a message buffer, and by default attaches files +to the end of that buffer; customize @code{gnus-dired-attach-at-end} to +place the attachments at point instead. @item C-c C-m C-l @findex gnus-dired-find-file-mailcap From 4e9993cada32a866a75b458092de0028db2f5f41 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 20 Feb 2024 12:52:40 +0100 Subject: [PATCH 240/446] Add Tramp methods dockercp and podmancp * doc/misc/tramp.texi (External methods): Add dockercp and podmancp. * etc/NEWS: Add Tramp methods "dockercp" and "podmancp". * lisp/net/tramp.el (tramp-handle-make-process): * lisp/net/tramp-adb.el (tramp-adb-maybe-open-connection): * lisp/net/tramp-sh.el (tramp-do-copy-or-rename-file-out-of-band) (tramp-maybe-open-connection): * lisp/net/tramp-sshfs.el (tramp-sshfs-handle-process-file) (tramp-sshfs-maybe-open-connection): * lisp/net/tramp-sudoedit.el (tramp-sudoedit-send-command): Adapt `tramp-expand-args' calls. * lisp/net/tramp-container.el (tramp-dockercp-method) (tramp-podmancp-method): New defconst. (tramp-methods) : Add new methods. (tramp-container--completion-function): Adapt docstring. Use it for "dockercp" and "podmancp" completion. * lisp/net/tramp.el (tramp-get-remote-tmpdir): * lisp/net/tramp-gvfs.el (tramp-gvfs-maybe-open-connection): * lisp/net/tramp-sh.el (tramp-maybe-open-connection): Use a default value with `tramp-get-method-parameter'. * lisp/net/tramp-sh.el (tramp-methods) : Add `tramp-copy-file-name'. (tramp-default-copy-file-name): New defconst. (tramp-make-copy-file-name): Rename from `tramp-make-copy-program-file-name'. Use method parameter `tramp-copy-file-name'. (Bug#69085) (tramp-do-copy-or-rename-file-out-of-band): Adapt callees. * lisp/net/tramp.el (tramp-methods): Adapt docstring. (tramp-get-method-parameter, tramp-expand-args): New optional argument DEFAULT. * test/lisp/net/tramp-tests.el (tramp--test-container-p): Adapt. (tramp--test-container-oob-p): New defun. (tramp-test17-dired-with-wildcards, tramp-test35-remote-path) (tramp-test41-special-characters): Use it. (tramp--test-set-ert-test-documentation): Use `split-string'. --- doc/misc/tramp.texi | 14 ++++++ etc/NEWS | 12 +++-- lisp/net/tramp-adb.el | 2 +- lisp/net/tramp-container.el | 60 ++++++++++++++++++++++++- lisp/net/tramp-gvfs.el | 4 +- lisp/net/tramp-sh.el | 38 ++++++++-------- lisp/net/tramp-sshfs.el | 4 +- lisp/net/tramp-sudoedit.el | 2 +- lisp/net/tramp.el | 35 ++++++++++----- test/lisp/net/tramp-tests.el | 85 +++++++++++++++++++++--------------- 10 files changed, 182 insertions(+), 74 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index affd760730b..6d4654f1a8a 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -1059,6 +1059,20 @@ session. These methods support the @samp{-P} argument. +@item @option{dockercp} +@item @option{podmancp} +@cindex method @option{dockercp} +@cindex @option{dockercp} method +@cindex method @option{podmancp} +@cindex @option{podmancp} method + +These methods are similar to @option{docker} or @option{podman}, but +they use the command @command{docker cp} or @command{podman cp} for +transferring large files. + +These copy commands do not support file globs, and they ignore a user +name. + @item @option{fcp} @cindex method @option{fcp} @cindex @option{fcp} method diff --git a/etc/NEWS b/etc/NEWS index 4477116248e..7b248c3fe78 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -884,6 +884,10 @@ mode line. 'header' will display in the header line; ** Tramp ++++ +*** New connection methods "dockercp" and "podmancp". +These are the external methods counterparts of "docker" and "podman". + +++ *** New connection methods "toolbox" and "flatpak". They allow accessing system containers provided by Toolbox or @@ -1121,7 +1125,7 @@ the user option 'nnweb-type' to 'gmane'. *** New user option 'gnus-mode-line-logo'. This allows the user to either disable the display of any logo or specify which logo will be displayed as part of the -buffer-identification in the mode-line of Gnus-buffers. +buffer-identification in the mode-line of Gnus buffers. ** Rmail @@ -1333,7 +1337,7 @@ chat buffers use by default. This command toggles the display of internal buffers in Buffer Menu mode; that is, buffers not visiting a file and whose names start with a space. Previously, such buffers were never shown. This command is bound to 'I' -in Buffer menu mode. +in Buffer Menu mode. ** Customize @@ -1429,7 +1433,7 @@ current project configuration, and later updates it as you edit the files and save the changes. +++ -** New package Compat +** New package Compat. Emacs now comes with a stub implementation of the forwards-compatibility Compat package from GNU ELPA. This allows built-in packages to use the library more effectively, and helps @@ -1560,7 +1564,7 @@ values. +++ ** Pcase's functions (in 'pred' and 'app') can specify the argument position. -For example, instead of (pred (< 5)) you can write (pred (> _ 5)). +For example, instead of '(pred (< 5))' you can write '(pred (> _ 5))'. +++ ** 'define-advice' now sets the new advice's 'name' property to NAME. diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 2e4ad1cc412..96625fc5680 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -1230,7 +1230,7 @@ connection if a previous connection has died for some reason." (let* ((coding-system-for-read 'utf-8-dos) ; Is this correct? (process-connection-type tramp-process-connection-type) (args (tramp-expand-args - vec 'tramp-login-args ?d (or device ""))) + vec 'tramp-login-args nil ?d (or device ""))) (p (let ((default-directory tramp-compat-temporary-file-directory)) (apply diff --git a/lisp/net/tramp-container.el b/lisp/net/tramp-container.el index 1f578949e4d..30639cbeb85 100644 --- a/lisp/net/tramp-container.el +++ b/lisp/net/tramp-container.el @@ -31,15 +31,20 @@ ;; Open a file on a running Docker container: ;; ;; C-x C-f /docker:USER@CONTAINER:/path/to/file +;; C-x C-f /dockercp:USER@CONTAINER:/path/to/file ;; ;; or Podman: ;; ;; C-x C-f /podman:USER@CONTAINER:/path/to/file +;; C-x C-f /podmancp:USER@CONTAINER:/path/to/file ;; ;; Where: ;; USER is the user on the container to connect as (optional). ;; CONTAINER is the container to connect to. ;; +;; "docker" and "podman" are inline methods, "dockercp" and "podmancp" +;; are out-of-band methods. +;; ;; ;; ;; Open file in a Kubernetes container: @@ -141,10 +146,20 @@ If it is nil, the default context will be used." (defconst tramp-docker-method "docker" "Tramp method name to use to connect to Docker containers.") +;;;###tramp-autoload +(defconst tramp-dockercp-method "dockercp" + "Tramp method name to use to connect to Docker containers. +This is for out-of-band connections.") + ;;;###tramp-autoload (defconst tramp-podman-method "podman" "Tramp method name to use to connect to Podman containers.") +;;;###tramp-autoload +(defconst tramp-podmancp-method "podmancp" + "Tramp method name to use to connect to Podman containers. +This is for out-of-band connections.") + ;;;###tramp-autoload (defconst tramp-kubernetes-method "kubernetes" "Tramp method name to use to connect to Kubernetes containers.") @@ -183,7 +198,8 @@ BODY is the backend specific code." (defun tramp-container--completion-function (method) "List running containers available for connection. METHOD is the Tramp method to be used for \"ps\", either -`tramp-docker-method' or `tramp-podman-method'. +`tramp-docker-method', `tramp-dockercp-method', `tramp-podman-method', +or `tramp-podmancp-method'. This function is used by `tramp-set-completion-function', please see its function help for a description of the format." @@ -375,6 +391,23 @@ see its function help for a description of the format." (tramp-remote-shell-login ("-l")) (tramp-remote-shell-args ("-i" "-c")))) + (add-to-list 'tramp-methods + `(,tramp-dockercp-method + (tramp-login-program ,tramp-docker-program) + (tramp-login-args (("exec") + ("-it") + ("-u" "%u") + ("%h") + ("%l"))) + (tramp-direct-async (,tramp-default-remote-shell "-c")) + (tramp-remote-shell ,tramp-default-remote-shell) + (tramp-remote-shell-login ("-l")) + (tramp-remote-shell-args ("-i" "-c")) + (tramp-copy-program ,tramp-docker-program) + (tramp-copy-args (("cp"))) + (tramp-copy-file-name (("%h" ":") ("%f"))) + (tramp-copy-recursive t))) + (add-to-list 'tramp-methods `(,tramp-podman-method (tramp-login-program ,tramp-podman-program) @@ -388,6 +421,23 @@ see its function help for a description of the format." (tramp-remote-shell-login ("-l")) (tramp-remote-shell-args ("-i" "-c")))) + (add-to-list 'tramp-methods + `(,tramp-podmancp-method + (tramp-login-program ,tramp-podman-program) + (tramp-login-args (("exec") + ("-it") + ("-u" "%u") + ("%h") + ("%l"))) + (tramp-direct-async (,tramp-default-remote-shell "-c")) + (tramp-remote-shell ,tramp-default-remote-shell) + (tramp-remote-shell-login ("-l")) + (tramp-remote-shell-args ("-i" "-c")) + (tramp-copy-program ,tramp-podman-program) + (tramp-copy-args (("cp"))) + (tramp-copy-file-name (("%h" ":") ("%f"))) + (tramp-copy-recursive t))) + (add-to-list 'tramp-methods `(,tramp-kubernetes-method (tramp-login-program ,tramp-kubernetes-program) @@ -431,10 +481,18 @@ see its function help for a description of the format." tramp-docker-method `((tramp-container--completion-function ,tramp-docker-method))) + (tramp-set-completion-function + tramp-dockercp-method + `((tramp-container--completion-function ,tramp-dockercp-method))) + (tramp-set-completion-function tramp-podman-method `((tramp-container--completion-function ,tramp-podman-method))) + (tramp-set-completion-function + tramp-podmancp-method + `((tramp-container--completion-function ,tramp-podmancp-method))) + (tramp-set-completion-function tramp-kubernetes-method `((tramp-kubernetes--completion-function ,tramp-kubernetes-method))) diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el index 4e949e7e60b..93071ed7350 100644 --- a/lisp/net/tramp-gvfs.el +++ b/lisp/net/tramp-gvfs.el @@ -2294,8 +2294,8 @@ connection if a previous connection has died for some reason." ;; indicated by the "mounted" signal, i.e. the ;; "fuse-mountpoint" file property. (with-timeout - ((or (tramp-get-method-parameter vec 'tramp-connection-timeout) - tramp-connection-timeout) + ((tramp-get-method-parameter + vec 'tramp-connection-timeout tramp-connection-timeout) (if (tramp-string-empty-or-nil-p (tramp-file-name-user vec)) (tramp-error vec 'file-error diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 3557b3a1b64..66e648624b2 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -282,6 +282,7 @@ The string is used in `tramp-methods'.") (tramp-copy-program "nc") ;; We use "-v" for better error tracking. (tramp-copy-args (("-w" "1") ("-v") ("%h") ("%r"))) + (tramp-copy-file-name (("%f"))) (tramp-remote-copy-program "nc") ;; We use "-p" as required for newer busyboxes. For older ;; busybox/nc versions, the value must be (("-l") ("%r")). This @@ -428,6 +429,9 @@ The string is used in `tramp-methods'.") eos) nil ,(user-login-name)))) +(defconst tramp-default-copy-file-name '(("%u" "@") ("%h" ":") ("%f")) + "Default `tramp-copy-file-name' entry for out-of-band methods.") + ;;;###tramp-autoload (defconst tramp-completion-function-alist-rsh '((tramp-parse-rhosts "/etc/hosts.equiv") @@ -2399,10 +2403,10 @@ The method used must be an out-of-band method." #'file-name-as-directory #'identity) (if v1 - (tramp-make-copy-program-file-name v1) + (tramp-make-copy-file-name v1) (file-name-unquote filename))) target (if v2 - (tramp-make-copy-program-file-name v2) + (tramp-make-copy-file-name v2) (file-name-unquote newname))) ;; Check for listener port. @@ -2441,7 +2445,7 @@ The method used must be an out-of-band method." ;; " " has either been a replacement of "%k" (when ;; KEEP-DATE argument is non-nil), or a replacement for ;; the whole keep-date sublist. - (delete " " (apply #'tramp-expand-args v 'tramp-copy-args spec)) + (delete " " (apply #'tramp-expand-args v 'tramp-copy-args nil spec)) ;; `tramp-ssh-controlmaster-options' is a string instead ;; of a list. Unflatten it. copy-args @@ -2450,11 +2454,11 @@ The method used must be an out-of-band method." (lambda (x) (if (tramp-compat-string-search " " x) (split-string x) x)) copy-args)) - copy-env (apply #'tramp-expand-args v 'tramp-copy-env spec) + copy-env (apply #'tramp-expand-args v 'tramp-copy-env nil spec) remote-copy-program (tramp-get-method-parameter v 'tramp-remote-copy-program) remote-copy-args - (apply #'tramp-expand-args v 'tramp-remote-copy-args spec)) + (apply #'tramp-expand-args v 'tramp-remote-copy-args nil spec)) ;; Check for local copy program. (unless (executable-find copy-program) @@ -5290,7 +5294,8 @@ connection if a previous connection has died for some reason." (tramp-get-method-parameter hop 'tramp-async-args))) (connection-timeout (tramp-get-method-parameter - hop 'tramp-connection-timeout)) + hop 'tramp-connection-timeout + tramp-connection-timeout)) (command (tramp-get-method-parameter hop 'tramp-login-program)) @@ -5348,7 +5353,7 @@ connection if a previous connection has died for some reason." ;; Add arguments for asynchronous processes. (when process-name async-args) (tramp-expand-args - hop 'tramp-login-args + hop 'tramp-login-args nil ?h (or l-host "") ?u (or l-user "") ?p (or l-port "") ?c (format-spec options (format-spec-make ?t tmpfile)) ?n (concat @@ -5365,8 +5370,7 @@ connection if a previous connection has died for some reason." p vec (min pos (with-current-buffer (process-buffer p) (point-max))) - tramp-actions-before-shell - (or connection-timeout tramp-connection-timeout)) + tramp-actions-before-shell connection-timeout) (tramp-message vec 3 "Found remote shell prompt on `%s'" l-host) @@ -5559,8 +5563,8 @@ raises an error." string "")) -(defun tramp-make-copy-program-file-name (vec) - "Create a file name suitable for `scp', `pscp', or `nc' and workalikes." +(defun tramp-make-copy-file-name (vec) + "Create a file name suitable for out-of-band methods." (let ((method (tramp-file-name-method vec)) (user (tramp-file-name-user vec)) (host (tramp-file-name-host vec)) @@ -5571,13 +5575,13 @@ raises an error." ;; This does not work for MS Windows scp, if there are characters ;; to be quoted. OpenSSH 8 supports disabling of strict file name ;; checking in scp, we use it when available. - (unless (string-match-p (rx "ftp" eos) method) + (unless (string-match-p (rx (| "dockercp" "podmancp" "ftp") eos) method) (setq localname (tramp-unquote-shell-quote-argument localname))) - (cond - ((tramp-get-method-parameter vec 'tramp-remote-copy-program) - localname) - ((tramp-string-empty-or-nil-p user) (format "%s:%s" host localname)) - (t (format "%s@%s:%s" user host localname))))) + (string-join + (apply #'tramp-expand-args vec + 'tramp-copy-file-name tramp-default-copy-file-name + (list ?h (or host "") ?u (or user "") ?f localname)) + ""))) (defun tramp-method-out-of-band-p (vec size) "Return t if this is an out-of-band method, nil otherwise." diff --git a/lisp/net/tramp-sshfs.el b/lisp/net/tramp-sshfs.el index 8dad599c7e7..d0d56b8967e 100644 --- a/lisp/net/tramp-sshfs.el +++ b/lisp/net/tramp-sshfs.el @@ -322,7 +322,7 @@ arguments to pass to the OPERATION." v (tramp-get-method-parameter v 'tramp-login-program) nil outbuf display (tramp-expand-args - v 'tramp-login-args + v 'tramp-login-args nil ?h (or (tramp-file-name-host v) "") ?u (or (tramp-file-name-user v) "") ?p (or (tramp-file-name-port v) "") @@ -424,7 +424,7 @@ connection if a previous connection has died for some reason." (tramp-fuse-mount-spec vec) (tramp-fuse-mount-point vec) (tramp-expand-args - vec 'tramp-mount-args + vec 'tramp-mount-args nil ?p (or (tramp-file-name-port vec) "")))))) (tramp-error vec 'file-error "Error mounting %s" (tramp-fuse-mount-spec vec))) diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el index 0c717c4a5aa..7bbfec62753 100644 --- a/lisp/net/tramp-sudoedit.el +++ b/lisp/net/tramp-sudoedit.el @@ -771,7 +771,7 @@ in case of error, t otherwise." (tramp-get-connection-name vec) (current-buffer) (append (tramp-expand-args - vec 'tramp-sudo-login + vec 'tramp-sudo-login nil ?h (or (tramp-file-name-host vec) "") ?u (or (tramp-file-name-user vec) "")) (flatten-tree args)))) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 2efee2344d2..e6d6eb0ee66 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -301,6 +301,15 @@ pair of the form (KEY VALUE). The following KEYs are defined: This specifies the list of parameters to pass to the above mentioned program, the hints for `tramp-login-args' also apply here. + * `tramp-copy-file-name' + The remote source or destination file name for out-of-band methods. + You can use \"%u\" and \"%h\" like in `tramp-login-args'. + Additionally, \"%f\" denotes the local file name part. This list + will be expanded to a string without spaces between the elements of + the list. + + The default value is `tramp-default-copy-file-name'. + * `tramp-copy-env' A list of environment variables and their values, which will be set when calling `tramp-copy-program'. @@ -1545,21 +1554,23 @@ LOCALNAME and HOP do not count." (equal (tramp-file-name-unify vec1) (tramp-file-name-unify vec2)))) -(defun tramp-get-method-parameter (vec param) +(defun tramp-get-method-parameter (vec param &optional default) "Return the method parameter PARAM. If VEC is a vector, check first in connection properties. Afterwards, check in `tramp-methods'. If the `tramp-methods' -entry does not exist, return nil." +entry does not exist, return DEFAULT." (let ((hash-entry (replace-regexp-in-string (rx bos "tramp-") "" (symbol-name param)))) (if (tramp-connection-property-p vec hash-entry) ;; We use the cached property. (tramp-get-connection-property vec hash-entry) ;; Use the static value from `tramp-methods'. - (when-let ((methods-entry + (if-let ((methods-entry (assoc param (assoc (tramp-file-name-method vec) tramp-methods)))) - (cadr methods-entry))))) + (cadr methods-entry) + ;; Return the default value. + default)))) ;; The localname can be quoted with "/:". Extract this. (defun tramp-file-name-unquote-localname (vec) @@ -3943,6 +3954,9 @@ Let-bind it when necessary.") (tramp-get-method-parameter v 'tramp-case-insensitive) ;; There isn't. So we must check, in case there's a connection already. + ;; Note: We cannot use it as DEFAULT value of + ;; `tramp-get-method-parameter', because it would be evalled + ;; during the call. (and (let ((non-essential t)) (tramp-connectable-p v)) (with-tramp-connection-property v "case-insensitive" (ignore-errors @@ -4752,15 +4766,15 @@ Do not set it manually, it is used buffer-local in `tramp-get-lock-pid'.") (defvar tramp-extra-expand-args nil "Method specific arguments.") -(defun tramp-expand-args (vec parameter &rest spec-list) +(defun tramp-expand-args (vec parameter default &rest spec-list) "Expand login arguments as given by PARAMETER in `tramp-methods'. PARAMETER is a symbol like `tramp-login-args', denoting a list of list of strings from `tramp-methods', containing %-sequences for -substitution. +substitution. DEFAULT is used when PARAMETER is not specified. SPEC-LIST is a list of char/value pairs used for `format-spec-make'. It is appended by `tramp-extra-expand-args', a connection-local variable." - (let ((args (tramp-get-method-parameter vec parameter)) + (let ((args (tramp-get-method-parameter vec parameter default)) (extra-spec-list (mapcar #'eval @@ -4939,7 +4953,7 @@ a connection-local variable." (mapcar (lambda (x) (split-string x " ")) (tramp-expand-args - v 'tramp-login-args + v 'tramp-login-args nil ?h (or host "") ?u (or user "") ?p (or port "") ?c (format-spec (or options "") (format-spec-make ?t tmpfile)) ?d (or device "") ?a (or pta "") ?l "")))) @@ -6326,9 +6340,8 @@ This handles also chrooted environments, which are not regarded as local." (defun tramp-get-remote-tmpdir (vec) "Return directory for temporary files on the remote host identified by VEC." (with-tramp-connection-property (tramp-get-process vec) "remote-tmpdir" - (let ((dir - (tramp-make-tramp-file-name - vec (or (tramp-get-method-parameter vec 'tramp-tmpdir) "/tmp")))) + (let ((dir (tramp-make-tramp-file-name + vec (tramp-get-method-parameter vec 'tramp-tmpdir "/tmp")))) (or (and (file-directory-p dir) (file-writable-p dir) (tramp-file-local-name dir)) (tramp-error vec 'file-error "Directory %s not accessible" dir)) diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 623e0860a01..cdd2a1efdb2 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -3493,6 +3493,8 @@ This tests also `file-directory-p' and `file-accessible-directory-p'." (skip-unless (not (tramp--test-rsync-p))) ;; Wildcards are not supported in tramp-crypt.el. (skip-unless (not (tramp--test-crypt-p))) + ;; Wildcards are not supported with "docker cp ..." or "podman cp ...". + (skip-unless (not (tramp--test-container-oob-p))) (dolist (quoted (if (tramp--test-expensive-test-p) '(nil t) '(nil))) (let* ((tmp-name1 @@ -3819,7 +3821,7 @@ This tests also `access-file', `file-readable-p', "Set the documentation string for a derived test. The test is derived from TEST and COMMAND." (let ((test-doc - (string-split (ert-test-documentation (get test 'ert--test)) "\n"))) + (split-string (ert-test-documentation (get test 'ert--test)) "\n"))) ;; The first line must be extended. (setcar test-doc (format "%s Use the \"%s\" command." (car test-doc) command)) @@ -6379,33 +6381,35 @@ INPUT, if non-nil, is a string sent to the process." (setq tramp-remote-path orig-tramp-remote-path) ;; We make a super long `tramp-remote-path'. - (make-directory tmp-name) - (should (file-directory-p tmp-name)) - (while (tramp-compat-length< (string-join orig-exec-path ":") 5000) - (let ((dir (make-temp-file (file-name-as-directory tmp-name) 'dir))) - (should (file-directory-p dir)) - (setq tramp-remote-path - (append - tramp-remote-path `(,(file-remote-p dir 'localname))) - orig-exec-path - (append - (butlast orig-exec-path) - `(,(file-remote-p dir 'localname)) - (last orig-exec-path))))) - (tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password) - (should (equal (exec-path) orig-exec-path)) - ;; Ignore trailing newline. - (setq path (substring (shell-command-to-string "echo $PATH") nil -1)) - ;; The shell doesn't handle such long strings. - (unless (tramp-compat-length> - path - (tramp-get-connection-property - tramp-test-vec "pipe-buf" 4096)) - ;; The last element of `exec-path' is `exec-directory'. - (should - (string-equal path (string-join (butlast orig-exec-path) ":")))) - ;; The shell "sh" shall always exist. - (should (executable-find "sh" 'remote))) + (unless (tramp--test-container-oob-p) + (make-directory tmp-name) + (should (file-directory-p tmp-name)) + (while (tramp-compat-length< (string-join orig-exec-path ":") 5000) + (let ((dir (make-temp-file + (file-name-as-directory tmp-name) 'dir))) + (should (file-directory-p dir)) + (setq tramp-remote-path + (append + tramp-remote-path `(,(file-remote-p dir 'localname))) + orig-exec-path + (append + (butlast orig-exec-path) + `(,(file-remote-p dir 'localname)) + (last orig-exec-path))))) + (tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password) + (should (equal (exec-path) orig-exec-path)) + ;; Ignore trailing newline. + (setq path (substring (shell-command-to-string "echo $PATH") nil -1)) + ;; The shell doesn't handle such long strings. + (unless (tramp-compat-length> + path + (tramp-get-connection-property + tramp-test-vec "pipe-buf" 4096)) + ;; The last element of `exec-path' is `exec-directory'. + (should + (string-equal path (string-join (butlast orig-exec-path) ":")))) + ;; The shell "sh" shall always exist. + (should (executable-find "sh" 'remote)))) ;; Cleanup. (tramp-cleanup-connection tramp-test-vec 'keep-debug 'keep-password) @@ -7056,17 +7060,24 @@ This is used in tests which we don't want to tag (not (and (tramp--test-adb-p) (string-match-p (rx multibyte) default-directory))))) -(defun tramp--test-crypt-p () - "Check, whether the remote directory is encrypted." - (tramp-crypt-file-name-p ert-remote-temporary-file-directory)) - (defun tramp--test-container-p () "Check, whether a container method is used. This does not support some special file names." (string-match-p - (rx bol (| "docker" "podman") eol) + (rx bol (| "docker" "podman")) (file-remote-p ert-remote-temporary-file-directory 'method))) +(defun tramp--test-container-oob-p () + "Check, whether the dockercp or podmancp method is used. +They does not support wildcard copy." + (string-match-p + (rx bol (| "dockercp" "podmancp") eol) + (file-remote-p ert-remote-temporary-file-directory 'method))) + +(defun tramp--test-crypt-p () + "Check, whether the remote directory is encrypted." + (tramp-crypt-file-name-p ert-remote-temporary-file-directory)) + (defun tramp--test-expensive-test-p () "Whether expensive tests are run. This is used in tests which we don't want to tag `:expensive' @@ -7483,7 +7494,8 @@ This requires restrictions of file name syntax." (tramp--test-gvfs-p) (tramp--test-windows-nt-or-smb-p)) "?foo?bar?baz?") - (unless (or (tramp--test-ftp-p) + (unless (or (tramp--test-container-oob-p) + (tramp--test-ftp-p) (tramp--test-gvfs-p) (tramp--test-windows-nt-or-smb-p)) "*foo+bar*baz+") @@ -7503,7 +7515,10 @@ This requires restrictions of file name syntax." (unless (or (tramp--test-gvfs-p) (tramp--test-windows-nt-or-smb-p)) "bar") "(foo)bar(baz)" - (unless (or (tramp--test-ftp-p) (tramp--test-gvfs-p)) "[foo]bar[baz]") + (unless (or (tramp--test-container-oob-p) + (tramp--test-ftp-p) + (tramp--test-gvfs-p)) + "[foo]bar[baz]") "{foo}bar{baz}"))) ;; Simplify test in order to speed up. (apply #'tramp--test-check-files From d5775ae4d3ac8a1a4d2625e05307c9296df28d6f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 20 Feb 2024 12:53:15 +0100 Subject: [PATCH 241/446] ; Copyedits --- lisp/net/tramp-compat.el | 2 ++ lisp/net/tramp-integration.el | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el index 061766090a0..98de0dba7ff 100644 --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@ -337,6 +337,8 @@ Also see `ignore'." ;; ;; * Starting with Emacs 29.1, use `buffer-match-p'. ;; +;; * Starting with Emacs 29.1, use `string-split'. +;; ;; * Starting with Emacs 30.1, there is `handler-bind'. Use it ;; instead of `condition-case' when the origin of an error shall be ;; kept, for example when the HANDLER propagates the error with diff --git a/lisp/net/tramp-integration.el b/lisp/net/tramp-integration.el index c0b60f57e40..e1f0b2a3495 100644 --- a/lisp/net/tramp-integration.el +++ b/lisp/net/tramp-integration.el @@ -69,7 +69,7 @@ special handling of `substitute-in-file-name'." (when minibuffer-completing-file-name (setq tramp-rfn-eshadow-overlay (make-overlay (minibuffer-prompt-end) (minibuffer-prompt-end))) - ;; Copy rfn-eshadow-overlay properties. + ;; Copy `rfn-eshadow-overlay' properties. (let ((props (overlay-properties rfn-eshadow-overlay))) (while props ;; The `field' property prevents correct minibuffer From d9afa1f30fdf9d00b447fea0a8343397333e172f Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Mon, 19 Feb 2024 23:36:17 +0100 Subject: [PATCH 242/446] Make find-function-regexp also find transient-define-* * lisp/emacs-lisp/find-func.el (find-function-regexp): Also find transient-define-prefix, transient-define-suffix, transient-define-infix and transient-define-argument. --- lisp/emacs-lisp/find-func.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el index 63f547ebeb8..411602ef166 100644 --- a/lisp/emacs-lisp/find-func.el +++ b/lisp/emacs-lisp/find-func.el @@ -60,6 +60,7 @@ ine\\(?:-global\\)?-minor-mode\\|ine-compilation-mode\\|un-cvs-mode\\|\ foo\\|\\(?:[^icfgv]\\|g[^r]\\)\\(\\w\\|\\s_\\)+\\*?\\)\\|easy-mmode-define-[a-z-]+\\|easy-menu-define\\|\ cl-\\(?:defun\\|defmethod\\|defgeneric\\)\\|\ +transient-define-\\(?:prefix\\|suffix\\|infix\\|argument\\)\\|\ menu-bar-make-toggle\\|menu-bar-make-toggle-command\\)" find-function-space-re "\\('\\|(quote \\)?%s\\(\\s-\\|$\\|[()]\\)") From 4c6653f23aef097e3a6ed687e21decea6c790b5e Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 20 Feb 2024 15:44:13 +0200 Subject: [PATCH 243/446] ; * lisp/emacs-lisp/pcase.el (pcase-let*, pcase-let): Doc fix. --- lisp/emacs-lisp/pcase.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el index 47db2b89b9e..692c8f9b3fe 100644 --- a/lisp/emacs-lisp/pcase.el +++ b/lisp/emacs-lisp/pcase.el @@ -261,7 +261,7 @@ As with `pcase-let', BINDINGS are of the form (PATTERN EXP), but the EXP in each binding in BINDINGS can use the results of the destructuring bindings that precede it in BINDINGS' order. -Each EXP should match (i.e. be of compatible structure) to its +Each EXP should match (i.e. be of compatible structure) its respective PATTERN; a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil." (declare (indent 1) @@ -283,7 +283,7 @@ All EXPs are evaluated first, and then used to perform destructuring bindings by matching each EXP against its respective PATTERN. Then BODY is evaluated with those bindings in effect. -Each EXP should match (i.e. be of compatible structure) to its +Each EXP should match (i.e. be of compatible structure) its respective PATTERN; a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil." (declare (indent 1) (debug pcase-let*)) From 2eb85a9de1a5068d09b21464601dbd3263e55c85 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 20 Feb 2024 19:15:38 +0200 Subject: [PATCH 244/446] ; * lisp/emacs-lisp/pcase.el (pcase-let*, pcase-let): Another doc fix. --- lisp/emacs-lisp/pcase.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el index 692c8f9b3fe..ff68203eaea 100644 --- a/lisp/emacs-lisp/pcase.el +++ b/lisp/emacs-lisp/pcase.el @@ -261,8 +261,8 @@ As with `pcase-let', BINDINGS are of the form (PATTERN EXP), but the EXP in each binding in BINDINGS can use the results of the destructuring bindings that precede it in BINDINGS' order. -Each EXP should match (i.e. be of compatible structure) its -respective PATTERN; a mismatch may signal an error or may go +Each EXP should match its respective PATTERN (i.e. be of structure +compatible to PATTERN); a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil." (declare (indent 1) (debug ((&rest (pcase-PAT &optional form)) body))) @@ -283,8 +283,8 @@ All EXPs are evaluated first, and then used to perform destructuring bindings by matching each EXP against its respective PATTERN. Then BODY is evaluated with those bindings in effect. -Each EXP should match (i.e. be of compatible structure) its -respective PATTERN; a mismatch may signal an error or may go +Each EXP should match its respective PATTERN (i.e. be of structure +compatible to PATTERN); a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil." (declare (indent 1) (debug pcase-let*)) (if (null (cdr bindings)) From bbf0b7d0407883ea0a59c09b501c6e550bb8e10c Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 20 Feb 2024 19:47:29 +0100 Subject: [PATCH 245/446] * Fix missing entry in 'cl--typeof-types' * lisp/emacs-lisp/cl-preloaded.el (cl--typeof-types): Add 'native-comp-unit'. --- lisp/emacs-lisp/cl-preloaded.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 20e68555578..d533eea9e73 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -81,6 +81,7 @@ (tree-sitter-parser atom) (tree-sitter-node atom) (tree-sitter-compiled-query atom) + (native-comp-unit atom) ;; Plus, really hand made: (null symbol list sequence atom)) "Alist of supertypes. From 167d9b9040333a5bff64325423750243c60edfa1 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Tue, 20 Feb 2024 18:49:20 +0100 Subject: [PATCH 246/446] Allow trivially autoloading uses of transient's define macros Since 49e41991b2f transient-define-prefix itself was autoloaded, but that meant that when ever an autoload file was loaded, which contained an autoload for a command defined using that macro, transient itself had to be loaded. That shouldn't be necessary. For commands using these macros, an autoload that is identical to what would have been generated if it had been defined using defun, works just fine. * lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--make-autoload): Allow uses of transient-define-prefix, transient-define-suffix, transient-define-infix and transient-define-argument to be autoloaded using just ";;;autoload". * lisp/transient.el (transient-define-prefix): No longer autoload. --- lisp/emacs-lisp/loaddefs-gen.el | 17 ++++++++++++----- lisp/transient.el | 1 - 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index 238ec9d179b..581053f6304 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -201,8 +201,7 @@ expression, in which case we want to handle forms differently." define-globalized-minor-mode defun defmacro easy-mmode-define-minor-mode define-minor-mode define-inline cl-defun cl-defmacro cl-defgeneric - cl-defstruct pcase-defmacro iter-defun cl-iter-defun - transient-define-prefix)) + cl-defstruct pcase-defmacro iter-defun cl-iter-defun)) (macrop car) (setq expand (let ((load-true-file-name file) (load-file-name file)) @@ -218,13 +217,17 @@ expression, in which case we want to handle forms differently." define-globalized-minor-mode easy-mmode-define-minor-mode define-minor-mode cl-defun defun* cl-defmacro defmacro* - define-overloadable-function)) + define-overloadable-function + transient-define-prefix transient-define-suffix + transient-define-infix transient-define-argument)) (let* ((macrop (memq car '(defmacro cl-defmacro defmacro*))) (name (nth 1 form)) (args (pcase car ((or 'defun 'defmacro 'defun* 'defmacro* 'cl-defun 'cl-defmacro - 'define-overloadable-function) + 'define-overloadable-function + 'transient-define-prefix 'transient-define-suffix + 'transient-define-infix 'transient-define-argument) (nth 2 form)) ('define-skeleton '(&optional str arg)) ((or 'define-generic-mode 'define-derived-mode @@ -246,7 +249,11 @@ expression, in which case we want to handle forms differently." define-global-minor-mode define-globalized-minor-mode easy-mmode-define-minor-mode - define-minor-mode)) + define-minor-mode + transient-define-prefix + transient-define-suffix + transient-define-infix + transient-define-argument)) t) (and (eq (car-safe (car body)) 'interactive) ;; List of modes or just t. diff --git a/lisp/transient.el b/lisp/transient.el index f9060f5ba85..bb35746e186 100644 --- a/lisp/transient.el +++ b/lisp/transient.el @@ -855,7 +855,6 @@ elements themselves.") ;;; Define -;;;###autoload (defmacro transient-define-prefix (name arglist &rest args) "Define NAME as a transient prefix command. From 1acc7cb851417b83ae90fe4d0ee9f01af2e03722 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Tue, 20 Feb 2024 22:49:07 +0100 Subject: [PATCH 247/446] Do not attempt to check declarations in lock files * lisp/emacs-lisp/check-declare.el (check-declare-directory): Do not attempt to check declarations in lock files. (Bug#69084) --- lisp/emacs-lisp/check-declare.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el index a6d1a330d90..faa7824c8bd 100644 --- a/lisp/emacs-lisp/check-declare.el +++ b/lisp/emacs-lisp/check-declare.el @@ -328,9 +328,14 @@ Returns non-nil if any false statements are found." (setq root (directory-file-name (file-relative-name root))) (or (file-directory-p root) (error "Directory `%s' not found" root)) - (let ((files (directory-files-recursively root "\\.el\\'"))) - (when files - (apply #'check-declare-files files)))) + (when-let* ((files (directory-files-recursively root "\\.el\\'")) + (files (mapcan (lambda (file) + ;; Filter out lock files. + (and (not (string-prefix-p + ".#" (file-name-nondirectory file))) + (list file))) + files))) + (apply #'check-declare-files files))) (provide 'check-declare) From 7b0d75018885d8d34ff7c4427a83a21a4808282c Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 21 Feb 2024 11:49:47 +0800 Subject: [PATCH 248/446] Work around premature dismissals of submenus under Android * java/org/gnu/emacs/EmacsContextMenu.java (display): If between HONEYCOMB and N, set wasSubmenuSelected. --- java/org/gnu/emacs/EmacsContextMenu.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/java/org/gnu/emacs/EmacsContextMenu.java b/java/org/gnu/emacs/EmacsContextMenu.java index 17e6033377d..f1d70f05a25 100644 --- a/java/org/gnu/emacs/EmacsContextMenu.java +++ b/java/org/gnu/emacs/EmacsContextMenu.java @@ -361,8 +361,24 @@ private static final class Item implements MenuItem.OnMenuItemClickListener public Boolean call () { + boolean rc; + lastMenuEventSerial = serial; - return display1 (window, xPosition, yPosition); + rc = display1 (window, xPosition, yPosition); + + /* Android 3.0 to Android 7.0 perform duplicate calls to + onContextMenuClosed after a context menu is dismissed for + the second or third time. Since the second call after such + a dismissal is otherwise liable to prematurely cancel any + context menu displayed immediately afterwards, ignore calls + received within 300 milliseconds of this menu's being + displayed. */ + + if (rc && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB + && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) + wasSubmenuSelected = System.currentTimeMillis (); + + return rc; } }); From d6131b5902a70339305285f9861bdfd24c567eab Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 21 Feb 2024 09:02:33 +0100 Subject: [PATCH 249/446] * lisp/net/tramp.el (tramp-methods): Fix typo in docstring. (Bug#69294) --- lisp/net/tramp.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 9d883c96252..2d6db31fee8 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -332,8 +332,8 @@ pair of the form (KEY VALUE). The following KEYs are defined: chosen port for the remote listener. * `tramp-copy-keep-date' - This specifies whether the copying program when the preserves the - timestamp of the original file. + This specifies whether the copying program preserves the timestamp + of the original file. * `tramp-copy-keep-tmpfile' This specifies whether a temporary local file shall be kept From 3b34c5e4a583dd88f476570cbd58655a18e9a6b4 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 21 Feb 2024 08:49:15 -0500 Subject: [PATCH 250/446] * lisp/emacs-lisp/map.el (map--make-pcase-bindings): Fix use in Emacs<30 --- lisp/emacs-lisp/map.el | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el index 95a25978d1c..d3d71a36ee4 100644 --- a/lisp/emacs-lisp/map.el +++ b/lisp/emacs-lisp/map.el @@ -608,19 +608,30 @@ This allows using default values for `map-elt', which can't be done using `pcase--flip'. KEY is the key sought in the map. DEFAULT is the default value." + ;; It's obsolete in Emacs>29, but `map.el' is distributed via GNU ELPA + ;; for earlier Emacsen. (declare (obsolete _ "30.1")) `(map-elt ,map ,key ,default)) (defun map--make-pcase-bindings (args) "Return a list of pcase bindings from ARGS to the elements of a map." - (mapcar (lambda (elt) - (cond ((consp elt) - `(app (map-elt _ ,(car elt) ,(caddr elt)) - ,(cadr elt))) - ((keywordp elt) - (let ((var (intern (substring (symbol-name elt) 1)))) - `(app (map-elt _ ,elt) ,var))) - (t `(app (map-elt _ ',elt) ,elt)))) + (mapcar (if (< emacs-major-version 30) + (lambda (elt) + (cond ((consp elt) + `(app (map--pcase-map-elt ,(car elt) ,(caddr elt)) + ,(cadr elt))) + ((keywordp elt) + (let ((var (intern (substring (symbol-name elt) 1)))) + `(app (pcase--flip map-elt ,elt) ,var))) + (t `(app (pcase--flip map-elt ',elt) ,elt)))) + (lambda (elt) + (cond ((consp elt) + `(app (map-elt _ ,(car elt) ,(caddr elt)) + ,(cadr elt))) + ((keywordp elt) + (let ((var (intern (substring (symbol-name elt) 1)))) + `(app (map-elt _ ,elt) ,var))) + (t `(app (map-elt _ ',elt) ,elt))))) args)) (defun map--make-pcase-patterns (args) From 0a4d4781ddc079509cb256edf803d663439dcf92 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 21 Feb 2024 21:49:35 +0800 Subject: [PATCH 251/446] * java/org/gnu/emacs/EmacsContextMenu.java (display): Reduce timeout. --- java/org/gnu/emacs/EmacsContextMenu.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/java/org/gnu/emacs/EmacsContextMenu.java b/java/org/gnu/emacs/EmacsContextMenu.java index f1d70f05a25..2bbf2a313d6 100644 --- a/java/org/gnu/emacs/EmacsContextMenu.java +++ b/java/org/gnu/emacs/EmacsContextMenu.java @@ -367,16 +367,15 @@ private static final class Item implements MenuItem.OnMenuItemClickListener rc = display1 (window, xPosition, yPosition); /* Android 3.0 to Android 7.0 perform duplicate calls to - onContextMenuClosed after a context menu is dismissed for - the second or third time. Since the second call after such - a dismissal is otherwise liable to prematurely cancel any - context menu displayed immediately afterwards, ignore calls - received within 300 milliseconds of this menu's being - displayed. */ + onContextMenuClosed the second time a context menu is + dismissed. Since the second call after such a dismissal is + otherwise liable to prematurely cancel any context menu + displayed immediately afterwards, ignore calls received + within 150 milliseconds of this menu's being displayed. */ if (rc && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) - wasSubmenuSelected = System.currentTimeMillis (); + wasSubmenuSelected = System.currentTimeMillis () - 150; return rc; } From d5757178464ca51f79c7fc1ab199a1582e92ab32 Mon Sep 17 00:00:00 2001 From: kobarity Date: Fri, 16 Feb 2024 22:52:06 +0900 Subject: [PATCH 252/446] Set tty mode to raw when setting up Inferior Python * lisp/progmodes/python.el (python-shell-setup-code): New constant. (python-shell-comint-watch-for-first-prompt-output-filter): Send `python-shell-setup-code' to the Inferior Python process. * test/lisp/progmodes/python-tests.el (python-ffap-module-path-1): Eliminate skipping on Mac. (Bug#68559) --- lisp/progmodes/python.el | 11 +++++++++++ test/lisp/progmodes/python-tests.el | 5 ----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index b7e43f3fc68..5501926e69d 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -3521,6 +3521,16 @@ eventually provide a shell." :version "25.1" :type 'hook) +(defconst python-shell-setup-code + "\ +try: + import tty +except ImportError: + pass +else: + tty.setraw(0)" + "Code used to setup the inferior Python processes.") + (defconst python-shell-eval-setup-code "\ def __PYTHON_EL_eval(source, filename): @@ -3586,6 +3596,7 @@ The coding cookie regexp is specified in PEP 263.") (format "exec(%s)\n" (python-shell--encode-string string)))))) ;; Bootstrap: the normal definition of `python-shell-send-string' ;; depends on the Python code sent here. + (python-shell-send-string-no-output python-shell-setup-code) (python-shell-send-string-no-output python-shell-eval-setup-code) (python-shell-send-string-no-output python-shell-eval-file-setup-code)) (with-current-buffer (current-buffer) diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index af6c199b5bd..6c6cd9eee2b 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -5037,11 +5037,6 @@ import abc (ert-deftest python-ffap-module-path-1 () (skip-unless (executable-find python-tests-shell-interpreter)) - ;; Skip the test on macOS, since the standard Python installation uses - ;; libedit rather than readline which confuses the running of an inferior - ;; interpreter in this case (see bug#59477 and bug#25753). - (skip-when (eq system-type 'darwin)) - (trace-function 'python-shell-output-filter) (python-tests-with-temp-buffer-with-shell " import abc From a2eb123fb606af2a62ad6d0d0162255d7f0601e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Wed, 21 Feb 2024 15:22:21 +0100 Subject: [PATCH 253/446] ; * src/lisp.h: Add Lisp_Object tagging scheme overview --- src/lisp.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lisp.h b/src/lisp.h index db053ba9f70..b02466390f1 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -478,6 +478,16 @@ typedef EMACS_INT Lisp_Word; #endif +/* Lisp_Object tagging scheme: + Tag location + Upper bits Lower bits Type Payload + 000....... .......000 symbol offset from lispsym to struct Lisp_Symbol + 001....... .......001 unused + 01........ ........10 fixnum signed integer of FIXNUM_BITS + 110....... .......011 cons pointer to struct Lisp_Cons + 100....... .......100 string pointer to struct Lisp_String + 101....... .......101 vectorlike pointer to union vectorlike_header + 111....... .......111 float pointer to struct Lisp_Float */ enum Lisp_Type { /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */ From 8987e1b093b07756d18c861d1c7febb85fe88bef Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 21 Feb 2024 17:16:45 +0200 Subject: [PATCH 254/446] Remove redundant call to 'eln_load_path_final_clean_up' * src/emacs.c (shut_down_emacs): Remove redundant call to 'eln_load_path_final_clean_up'. We call it from 'kill-emacs' right before the call to 'exit'. --- src/emacs.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/emacs.c b/src/emacs.c index 97c65fbfd33..f4bfb9a6bbd 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -3116,10 +3116,6 @@ shut_down_emacs (int sig, Lisp_Object stuff) check_message_stack (); } -#ifdef HAVE_NATIVE_COMP - eln_load_path_final_clean_up (); -#endif - #ifdef MSDOS dos_cleanup (); #endif From 7215c63fc0f9d7f48ac20578d310a8b3d86b0eae Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 11:18:06 +0100 Subject: [PATCH 255/446] * Make 'comp--compute-function-types' a pass * lisp/emacs-lisp/comp.el (comp-passes): Add comp--compute-function-types. (comp--compute-function-types): New function. (comp--compute-function-type): Move it. (comp--final): Update it. --- lisp/emacs-lisp/comp.el | 61 +++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 593291a379e..b27cf2b6620 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -165,6 +165,7 @@ Can be one of: `d-default', `d-impure' or `d-ephemeral'. See `comp-ctxt'.") comp--tco comp--fwprop comp--remove-type-hints + comp--compute-function-types comp--final) "Passes to be executed in order.") @@ -2994,32 +2995,7 @@ These are substituted with a normal `set' op." (comp-ctxt-funcs-h comp-ctxt))) -;;; Final pass specific code. - -(defun comp--args-to-lambda-list (args) - "Return a lambda list for ARGS." - (cl-loop - with res - repeat (comp-args-base-min args) - do (push t res) - finally - (if (comp-args-p args) - (cl-loop - with n = (- (comp-args-max args) (comp-args-min args)) - initially (unless (zerop n) - (push '&optional res)) - repeat n - do (push t res)) - (cl-loop - with n = (- (comp-nargs-nonrest args) (comp-nargs-min args)) - initially (unless (zerop n) - (push '&optional res)) - repeat n - do (push t res) - finally (when (comp-nargs-rest args) - (push '&rest res) - (push 't res)))) - (cl-return (reverse res)))) +;;; Function types pass specific code. (defun comp--compute-function-type (_ func) "Compute type specifier for `comp-func' FUNC. @@ -3047,6 +3023,38 @@ Set it into the `type' slot." ;; Fix it up. (setf (comp-cstr-imm (comp-func-type func)) type)))) +(defun comp--compute-function-types (_) + "" + (maphash #'comp--compute-function-type (comp-ctxt-funcs-h comp-ctxt))) + + +;;; Final pass specific code. + +(defun comp--args-to-lambda-list (args) + "Return a lambda list for ARGS." + (cl-loop + with res + repeat (comp-args-base-min args) + do (push t res) + finally + (if (comp-args-p args) + (cl-loop + with n = (- (comp-args-max args) (comp-args-min args)) + initially (unless (zerop n) + (push '&optional res)) + repeat n + do (push t res)) + (cl-loop + with n = (- (comp-nargs-nonrest args) (comp-nargs-min args)) + initially (unless (zerop n) + (push '&optional res)) + repeat n + do (push t res) + finally (when (comp-nargs-rest args) + (push '&rest res) + (push 't res)))) + (cl-return (reverse res)))) + (defun comp--finalize-container (cont) "Finalize data container CONT." (setf (comp-data-container-l cont) @@ -3149,7 +3157,6 @@ Prepare every function for final compilation and drive the C back-end." (defun comp--final (_) "Final pass driving the C back-end for code emission." - (maphash #'comp--compute-function-type (comp-ctxt-funcs-h comp-ctxt)) (unless comp-dry-run ;; Always run the C side of the compilation as a sub-process ;; unless during bootstrap or async compilation (bug#45056). GCC From 1e1d3f3acd8567addc0dab4bc34dc5c7f2405556 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 11:18:28 +0100 Subject: [PATCH 256/446] ; * lisp/emacs-lisp/comp.el (native-comp-debug): Fix spacing. --- lisp/emacs-lisp/comp.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index b27cf2b6620..6532fb8d1ce 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -68,7 +68,7 @@ :safe #'integerp :version "28.1") -(defcustom native-comp-debug 0 +(defcustom native-comp-debug 0 "Debug level for native compilation, a number between 0 and 3. This is intended for debugging the compiler itself. 0 no debug output. From 5aeea8dc2c0bdd01de3ad271723e9d1737d8a056 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 15:06:18 +0100 Subject: [PATCH 257/446] * lisp/emacs-lisp/comp-cstr.el (comp-cstr): Rename constructors. --- lisp/emacs-lisp/comp-cstr.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 0bc97e51592..48e3645629b 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -44,7 +44,7 @@ ;; TODO can we just add t in `cl--typeof-types'? "Like `cl--typeof-types' but with t as common supertype.") -(cl-defstruct (comp-cstr (:constructor comp-type-to-cstr +(cl-defstruct (comp-cstr (:constructor comp--type-to-cstr (type &aux (null (eq type 'null)) (integer (eq type 'integer)) @@ -55,7 +55,7 @@ '(nil))) (range (when integer '((- . +)))))) - (:constructor comp-value-to-cstr + (:constructor comp--value-to-cstr (value &aux (integer (integerp value)) (valset (unless integer @@ -63,7 +63,7 @@ (range (when integer `((,value . ,value)))) (typeset ()))) - (:constructor comp-irange-to-cstr + (:constructor comp--irange-to-cstr (irange &aux (range (list irange)) (typeset ()))) @@ -229,10 +229,10 @@ Return them as multiple value." ;; builds. (defvar comp-ctxt nil) -(defvar comp-cstr-one (comp-value-to-cstr 1) +(defvar comp-cstr-one (comp--value-to-cstr 1) "Represent the integer immediate one.") -(defvar comp-cstr-t (comp-type-to-cstr t) +(defvar comp-cstr-t (comp--type-to-cstr t) "Represent the superclass t.") @@ -1212,14 +1212,14 @@ FN non-nil indicates we are parsing a function lambda list." ('nil (make-comp-cstr :typeset ())) ('fixnum - (comp-irange-to-cstr `(,most-negative-fixnum . ,most-positive-fixnum))) + (comp--irange-to-cstr `(,most-negative-fixnum . ,most-positive-fixnum))) ('boolean (comp-type-spec-to-cstr '(member t nil))) ('integer - (comp-irange-to-cstr '(- . +))) - ('null (comp-value-to-cstr nil)) + (comp--irange-to-cstr '(- . +))) + ('null (comp--value-to-cstr nil)) ((pred atom) - (comp-type-to-cstr type-spec)) + (comp--type-to-cstr type-spec)) (`(or . ,rest) (apply #'comp-cstr-union-make (mapcar #'comp-type-spec-to-cstr rest))) @@ -1229,16 +1229,16 @@ FN non-nil indicates we are parsing a function lambda list." (`(not ,cstr) (comp-cstr-negation-make (comp-type-spec-to-cstr cstr))) (`(integer ,(and (pred integerp) l) ,(and (pred integerp) h)) - (comp-irange-to-cstr `(,l . ,h))) + (comp--irange-to-cstr `(,l . ,h))) (`(integer * ,(and (pred integerp) h)) - (comp-irange-to-cstr `(- . ,h))) + (comp--irange-to-cstr `(- . ,h))) (`(integer ,(and (pred integerp) l) *) - (comp-irange-to-cstr `(,l . +))) + (comp--irange-to-cstr `(,l . +))) (`(float ,(pred comp-star-or-num-p) ,(pred comp-star-or-num-p)) ;; No float range support :/ - (comp-type-to-cstr 'float)) + (comp--type-to-cstr 'float)) (`(member . ,rest) - (apply #'comp-cstr-union-make (mapcar #'comp-value-to-cstr rest))) + (apply #'comp-cstr-union-make (mapcar #'comp--value-to-cstr rest))) (`(function ,args ,ret) (make-comp-cstr-f :args (mapcar (lambda (x) From c65a59a9e90524efa23d9151c31dad66a08ccb90 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 15:45:10 +0100 Subject: [PATCH 258/446] * Add few missing entries in 'comp-known-predicates' * lisp/emacs-lisp/comp.el (comp-known-predicates): Add framep, markerp, number-or-marker-p, overlayp, processp, subrp and windowp and sort it alphabetically. --- lisp/emacs-lisp/comp.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 6532fb8d1ce..a833bf5bfc4 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -191,28 +191,34 @@ Useful to hook into pass checkers.") (defconst comp-known-predicates '((arrayp . array) (atom . atom) - (characterp . fixnum) - (booleanp . boolean) (bool-vector-p . bool-vector) + (booleanp . boolean) (bufferp . buffer) - (natnump . (integer 0 *)) (char-table-p . char-table) - (hash-table-p . hash-table) + (characterp . fixnum) (consp . cons) - (integerp . integer) (floatp . float) + (framep . frame) (functionp . (or function symbol)) + (hash-table-p . hash-table) + (integer-or-marker-p . integer-or-marker) (integerp . integer) (keywordp . keyword) (listp . list) - (numberp . number) + (markerp . marker) + (natnump . (integer 0 *)) (null . null) + (number-or-marker-p . number-or-marker) (numberp . number) + (numberp . number) + (overlayp . overlay) + (processp . process) (sequencep . sequence) (stringp . string) + (subrp . subr) (symbolp . symbol) (vectorp . vector) - (integer-or-marker-p . integer-or-marker)) + (windowp . window)) "Alist predicate -> matched type specifier.") (defconst comp-known-predicates-h From 88abbf00af69cf7e5f36e318e6935f7d1500af7f Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 15:45:40 +0100 Subject: [PATCH 259/446] ; Add two comments on comp-known-predicates cl-deftype-satisfies * lisp/emacs-lisp/comp.el (comp-known-predicates): Add comment. * lisp/emacs-lisp/cl-macs.el: Likewise. --- lisp/emacs-lisp/cl-macs.el | 1 + lisp/emacs-lisp/comp.el | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 06a09885c88..44ebadeebff 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -3460,6 +3460,7 @@ Of course, we really can't know that for sure, so it's just a heuristic." (or (cdr (assq sym byte-compile-function-environment)) (cdr (assq sym macroexpand-all-environment)))))) +;; Please keep it in sync with `comp-known-predicates'. (pcase-dolist (`(,type . ,pred) ;; Mostly kept in alphabetical order. '((array . arrayp) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index a833bf5bfc4..46d2896f2be 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -188,6 +188,9 @@ Useful to hook into pass checkers.") finally return h) "Hash table function -> `comp-constraint'.") +;; Keep it in sync with the `cl-deftype-satisfies' property set in +;; cl-macs.el. We can't use `cl-deftype-satisfies' directly as the +;; relation type <-> predicate is not bijective (bug#45576). (defconst comp-known-predicates '((arrayp . array) (atom . atom) From 35d99b1ec7c56d4a5c09af36e6bbd7f0f959cccc Mon Sep 17 00:00:00 2001 From: john muhl Date: Wed, 21 Feb 2024 10:14:05 -0600 Subject: [PATCH 260/446] ; Update URL of the tree-sitter-lua grammar * admin/notes/tree-sitter/build-module/build.sh: * lisp/progmodes/lua-ts-mode.el: * test/infra/Dockerfile.emba: Use the new URL. (bug#69304) --- admin/notes/tree-sitter/build-module/build.sh | 2 +- lisp/progmodes/lua-ts-mode.el | 4 ++-- test/infra/Dockerfile.emba | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/admin/notes/tree-sitter/build-module/build.sh b/admin/notes/tree-sitter/build-module/build.sh index 969187b7f92..9a567bb094d 100755 --- a/admin/notes/tree-sitter/build-module/build.sh +++ b/admin/notes/tree-sitter/build-module/build.sh @@ -43,7 +43,7 @@ case "${lang}" in org="phoenixframework" ;; "lua") - org="MunifTanjim" + org="tree-sitter-grammars" ;; "typescript") sourcedir="tree-sitter-typescript/typescript/src" diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index c7f5ac50b04..8bd3db2b75f 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -26,8 +26,8 @@ ;; This package provides `lua-ts-mode' which is a major mode for Lua ;; files that uses Tree Sitter to parse the language. ;; -;; This package is compatible with and tested against the grammar -;; for Lua found at https://github.com/MunifTanjim/tree-sitter-lua +;; This package is compatible with and tested against the grammar for +;; Lua found at https://github.com/tree-sitter-grammars/tree-sitter-lua ;;; Code: diff --git a/test/infra/Dockerfile.emba b/test/infra/Dockerfile.emba index 8e583fade9f..d79072b06b5 100644 --- a/test/infra/Dockerfile.emba +++ b/test/infra/Dockerfile.emba @@ -126,7 +126,7 @@ RUN src/emacs -Q --batch \ (java "https://github.com/tree-sitter/tree-sitter-java") \ (javascript "https://github.com/tree-sitter/tree-sitter-javascript") \ (json "https://github.com/tree-sitter/tree-sitter-json") \ - (lua "https://github.com/MunifTanjim/tree-sitter-lua") \ + (lua "https://github.com/tree-sitter-grammars/tree-sitter-lua") \ (python "https://github.com/tree-sitter/tree-sitter-python") \ (ruby "https://github.com/tree-sitter/tree-sitter-ruby") \ (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src") \ From e6882a5cc89d9375dfa73156db6836af19ef7b8a Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Thu, 1 Feb 2024 12:30:24 +0100 Subject: [PATCH 261/446] ; Fix mid-symbol updating/cycling completion preview This fixes an issue where 'completion-preview-next-candidate' would fail to take into account the part of the symbol that follows point (the suffix) when point is at the middle of a symbol, as well as a similar issue in 'completion-preview--show' that would manifest with slow 'completion-at-point-functions'. * lisp/completion-preview.el (completion-preview-next-candidate) (completion-preview--show): Ensure that the completion preview remains at the end of a symbol, when updating it while point is in the middle of that symbol. * test/lisp/completion-preview-tests.el (completion-preview-mid-symbol-cycle): New test. (Bug#68875) --- lisp/completion-preview.el | 24 ++++++++++++------------ test/lisp/completion-preview-tests.el | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lisp/completion-preview.el b/lisp/completion-preview.el index 6fd60f3c416..e827da43a08 100644 --- a/lisp/completion-preview.el +++ b/lisp/completion-preview.el @@ -302,21 +302,21 @@ point, otherwise hide it." ;; never display a stale preview and that the preview doesn't ;; flicker, even with slow completion backends. (let* ((beg (completion-preview--get 'completion-preview-beg)) + (end (max (point) (overlay-start completion-preview--overlay))) (cands (completion-preview--get 'completion-preview-cands)) (index (completion-preview--get 'completion-preview-index)) (cand (nth index cands)) - (len (length cand)) - (end (+ beg len)) - (cur (point)) - (face (get-text-property 0 'face (completion-preview--get 'after-string)))) - (if (and (< beg cur end) (string-prefix-p (buffer-substring beg cur) cand)) + (after (completion-preview--get 'after-string)) + (face (get-text-property 0 'face after))) + (if (and (<= beg (point) end (1- (+ beg (length cand)))) + (string-prefix-p (buffer-substring beg end) cand)) ;; The previous preview is still applicable, update it. (overlay-put (completion-preview--make-overlay - cur (propertize (substring cand (- cur beg)) + end (propertize (substring cand (- end beg)) 'face face 'mouse-face 'completion-preview-highlight 'keymap completion-preview--mouse-map)) - 'completion-preview-end cur) + 'completion-preview-end end) ;; The previous preview is no longer applicable, hide it. (completion-preview-active-mode -1)))) ;; Run `completion-at-point-functions' to get a new candidate. @@ -366,16 +366,16 @@ prefix argument and defaults to 1." (interactive "p") (when completion-preview-active-mode (let* ((beg (completion-preview--get 'completion-preview-beg)) + (end (completion-preview--get 'completion-preview-end)) (all (completion-preview--get 'completion-preview-cands)) (cur (completion-preview--get 'completion-preview-index)) (len (length all)) (new (mod (+ cur direction) len)) - (str (nth new all)) - (pos (point))) - (while (or (<= (+ beg (length str)) pos) - (not (string-prefix-p (buffer-substring beg pos) str))) + (str (nth new all))) + (while (or (<= (+ beg (length str)) end) + (not (string-prefix-p (buffer-substring beg end) str))) (setq new (mod (+ new direction) len) str (nth new all))) - (let ((aft (propertize (substring str (- pos beg)) + (let ((aft (propertize (substring str (- end beg)) 'face (if (< 1 len) 'completion-preview 'completion-preview-exact) diff --git a/test/lisp/completion-preview-tests.el b/test/lisp/completion-preview-tests.el index 190764e9125..5b2c28bd3dd 100644 --- a/test/lisp/completion-preview-tests.el +++ b/test/lisp/completion-preview-tests.el @@ -181,4 +181,19 @@ instead." (completion-preview--post-command)) (completion-preview-tests--check-preview "barbaz" 'exact))) +(ert-deftest completion-preview-mid-symbol-cycle () + "Test cycling the completion preview with point at the middle of a symbol." + (with-temp-buffer + (setq-local completion-at-point-functions + (list + (completion-preview-tests--capf + '("foobar" "foobaz")))) + (insert "fooba") + (forward-char -2) + (let ((this-command 'self-insert-command)) + (completion-preview--post-command)) + (completion-preview-tests--check-preview "r") + (completion-preview-next-candidate 1) + (completion-preview-tests--check-preview "z"))) + ;;; completion-preview-tests.el ends here From 44d5c667d7775f881473c7c6f7d9bdef7594bd79 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 17:45:41 +0100 Subject: [PATCH 262/446] * lisp/emacs-lisp/comp.el (comp--compute-function-types): Fix missing doc. --- lisp/emacs-lisp/comp.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 46d2896f2be..e0da01bcc5d 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -3033,7 +3033,7 @@ Set it into the `type' slot." (setf (comp-cstr-imm (comp-func-type func)) type)))) (defun comp--compute-function-types (_) - "" + "Compute and store the type specifier for all functions." (maphash #'comp--compute-function-type (comp-ctxt-funcs-h comp-ctxt))) From f28a557c7d4b39f302630ed2b19a73fc375e7ff4 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 21 Feb 2024 19:43:28 +0200 Subject: [PATCH 263/446] * doc/lispref/modes.texi (Tabulated List Mode): Update. In the description of 'tabulated-list-format' document the missing value 'props' that was added long ago. --- doc/lispref/modes.texi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index bd4c055c2c2..9fe4d332a21 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1124,7 +1124,7 @@ column is sorted in the descending order. This buffer-local variable specifies the format of the Tabulated List data. Its value should be a vector. Each element of the vector represents a data column, and should be a list @code{(@var{name} -@var{width} @var{sort})}, where +@var{width} @var{sort} . @var{props})}, where @itemize @item @@ -1141,6 +1141,13 @@ sorted by comparing string values. Otherwise, this should be a predicate function for @code{sort} (@pxref{Rearrangement}), which accepts two arguments with the same form as the elements of @code{tabulated-list-entries} (see below). + +@item +@var{props} is a plist (@pxref{Property Lists}) of additional column +properties. If the value of the property @code{:right-align} is +non-@code{nil} then the column should be right-aligned. And the +property @code{:pad-right} specifies the number of additional padding +spaces to the right of the column (by default 1 if omitted). @end itemize @end defvar From b214cb2843851c410d603e7fb487a462d5f7bee1 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 21 Feb 2024 21:38:11 +0100 Subject: [PATCH 264/446] ; * lisp/emacs-lisp/comp-run.el: Fix typo. --- lisp/emacs-lisp/comp-run.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp-run.el b/lisp/emacs-lisp/comp-run.el index 5d1a193269d..8fcbe31cf0b 100644 --- a/lisp/emacs-lisp/comp-run.el +++ b/lisp/emacs-lisp/comp-run.el @@ -25,7 +25,7 @@ ;; While the main native compiler is implemented in comp.el, when ;; commonly used as a jit compiler it is only loaded by Emacs sub -;; processes performing async compilation. This files contains all +;; processes performing async compilation. This file contains all ;; the code needed to drive async compilations and any Lisp code ;; needed at runtime to run native code. From 39a84232700c40fa74305970dd16cd5cb8b8bea0 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 22 Feb 2024 09:53:48 +0800 Subject: [PATCH 265/446] Enable inotify on systems with inotify_init yet no init1 variant * configure.ac (HAVE_INOTIFY): Check for the presence of inotify_init in addition to inotify_init1. * src/inotify.c (Finotify_add_watch): Implement with inotify_init if inotify_init1 is absent. --- configure.ac | 8 ++++---- src/inotify.c | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 847fdbd54d2..71a899f5f40 100644 --- a/configure.ac +++ b/configure.ac @@ -4088,16 +4088,16 @@ case $with_file_notification,$opsys in fi ;; esac -dnl inotify is available only on GNU/Linux. +dnl inotify is available only on Linux-kernel based systems. case $with_file_notification,$NOTIFY_OBJ in inotify, | yes,) AC_CHECK_HEADER([sys/inotify.h]) if test "$ac_cv_header_sys_inotify_h" = yes ; then - AC_CHECK_FUNC([inotify_init1]) - if test "$ac_cv_func_inotify_init1" = yes; then + AC_CHECK_FUNCS([inotify_init inotify_init1]) + if test "$ac_cv_func_inotify_init" = yes; then AC_DEFINE([HAVE_INOTIFY], [1], [Define to 1 to use inotify.]) NOTIFY_OBJ=inotify.o - NOTIFY_SUMMARY="yes -lglibc (inotify)" + NOTIFY_SUMMARY="yes (inotify)" fi fi ;; esac diff --git a/src/inotify.c b/src/inotify.c index 2ee874530cc..7140568f1b6 100644 --- a/src/inotify.c +++ b/src/inotify.c @@ -26,6 +26,8 @@ along with GNU Emacs. If not, see . */ #include "termhooks.h" #include +#include + #include #include @@ -434,7 +436,15 @@ IN_ONESHOT */) if (inotifyfd < 0) { +#ifdef HAVE_INOTIFY_INIT1 inotifyfd = inotify_init1 (IN_NONBLOCK | IN_CLOEXEC); +#else /* !HAVE_INOTIFY_INIT1 */ + /* This is prey to race conditions with other threads calling + exec. */ + inotifyfd = inotify_init (); + fcntl (inotifyfd, F_SETFL, O_NONBLOCK); + fcntl (inotifyfd, F_SETFD, O_CLOEXEC); +#endif /* HAVE_INOTIFY_INIT1 */ if (inotifyfd < 0) report_file_notify_error ("File watching is not available", Qnil); watch_list = Qnil; From f024b63ecf8d4ebfd518beb4c2dfc853d725ec19 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 22 Feb 2024 10:08:12 +0800 Subject: [PATCH 266/446] ; * admin/CPP-DEFINES: Update with Android defines. --- admin/CPP-DEFINES | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES index 06986ec8f48..8143a394578 100644 --- a/admin/CPP-DEFINES +++ b/admin/CPP-DEFINES @@ -25,6 +25,9 @@ SOLARIS2 USG USG5_4 HAIKU Compiling on Haiku. +__ANDROID__ Compiling for the Android operating system. +__ANDROID_API__ A numerical "API level" indicating the version of + Android being compiled for; see http://apilevels.com. ** Distinguishing GUIs ** @@ -35,10 +38,14 @@ NS_IMPL_COCOA Compile support for Cocoa (Apple) implementation of NS GUI API. HAVE_X11 Compile support for the X11 GUI. HAVE_PGTK Compile support for using GTK itself without directly using X Windows APIs. HAVE_HAIKU Compile support for the Haiku window system. -HAVE_X_WINDOWS Compile support for X Window system - (It looks like, nowadays, if HAVE_X11 is set, HAVE_X_WINDOWS must - be, and vice versa. At least, this is true for configure, and - msdos; not sure about nt.) +HAVE_X_WINDOWS Compile support for X Window system. Equivalent to HAVE_X11. +HAVE_ANDROID Compiling the Android GUI interface. Enough of this + code is compiled for the build machine cross-compiling + the Android port to produce an Emacs binary that can + Lisp code in batch mode, for the purpose of compiling + Lisp code for packaging. +ANDROID_STUBIFY The Android GUI interface is being compiled for the build + machine, as above. ** X Windows features ** HAVE_X11R6 Whether or not the system has X11R6. (Always defined.) From ee6343556a53770cd2c7730b48ce1731423d8825 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 22 Feb 2024 10:21:12 +0800 Subject: [PATCH 267/446] ; * admin/CPP-DEFINES: Fix typos. --- admin/CPP-DEFINES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES index 8143a394578..c07fdc487ee 100644 --- a/admin/CPP-DEFINES +++ b/admin/CPP-DEFINES @@ -42,8 +42,8 @@ HAVE_X_WINDOWS Compile support for X Window system. Equivalent to HAVE_X11. HAVE_ANDROID Compiling the Android GUI interface. Enough of this code is compiled for the build machine cross-compiling the Android port to produce an Emacs binary that can - Lisp code in batch mode, for the purpose of compiling - Lisp code for packaging. + run Lisp code in batch mode, for the purpose of running + the byte-compiler. ANDROID_STUBIFY The Android GUI interface is being compiled for the build machine, as above. From 8e0f134653b2951e80cd5659fba5c36e416931fa Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 22 Feb 2024 13:30:18 +0800 Subject: [PATCH 268/446] ; Insert missing JNI prologues * src/android.c (shouldForwardMultimediaButtons) (shouldForwardCtrlSpace, notifyPixelsChanged, setupSystemThread): * src/androidvfs.c (safSyncAndReadInput, safSync, safPostRequest) (ftruncate): Insert absent JNI prologues. --- src/android.c | 8 ++++++++ src/androidvfs.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/android.c b/src/android.c index 4d56df1da3f..41481afa475 100644 --- a/src/android.c +++ b/src/android.c @@ -2519,6 +2519,8 @@ JNIEXPORT jboolean JNICALL NATIVE_NAME (shouldForwardMultimediaButtons) (JNIEnv *env, jobject object) { + JNI_STACK_ALIGNMENT_PROLOGUE; + /* Yes, android_pass_multimedia_buttons_to_system is being read from the UI thread. */ return !android_pass_multimedia_buttons_to_system; @@ -2527,6 +2529,8 @@ NATIVE_NAME (shouldForwardMultimediaButtons) (JNIEnv *env, JNIEXPORT jboolean JNICALL NATIVE_NAME (shouldForwardCtrlSpace) (JNIEnv *env, jobject object) { + JNI_STACK_ALIGNMENT_PROLOGUE; + return !android_intercept_control_space; } @@ -2630,6 +2634,8 @@ JNIEXPORT void JNICALL NATIVE_NAME (notifyPixelsChanged) (JNIEnv *env, jobject object, jobject bitmap) { + JNI_STACK_ALIGNMENT_PROLOGUE; + void *data; /* Lock and unlock the bitmap. This calls @@ -2683,6 +2689,8 @@ NATIVE_NAME (answerQuerySpin) (JNIEnv *env, jobject object) JNIEXPORT void JNICALL NATIVE_NAME (setupSystemThread) (void) { + JNI_STACK_ALIGNMENT_PROLOGUE; + sigset_t sigset; /* Block everything except for SIGSEGV and SIGBUS; those two are diff --git a/src/androidvfs.c b/src/androidvfs.c index 3030bd56cdc..d618e351204 100644 --- a/src/androidvfs.c +++ b/src/androidvfs.c @@ -6317,6 +6317,8 @@ static sem_t saf_completion_sem; JNIEXPORT jint JNICALL NATIVE_NAME (safSyncAndReadInput) (JNIEnv *env, jobject object) { + JNI_STACK_ALIGNMENT_PROLOGUE; + while (sem_wait (&saf_completion_sem) < 0) { if (input_blocked_p ()) @@ -6338,6 +6340,8 @@ NATIVE_NAME (safSyncAndReadInput) (JNIEnv *env, jobject object) JNIEXPORT void JNICALL NATIVE_NAME (safSync) (JNIEnv *env, jobject object) { + JNI_STACK_ALIGNMENT_PROLOGUE; + while (sem_wait (&saf_completion_sem) < 0) process_pending_signals (); } @@ -6345,12 +6349,16 @@ NATIVE_NAME (safSync) (JNIEnv *env, jobject object) JNIEXPORT void JNICALL NATIVE_NAME (safPostRequest) (JNIEnv *env, jobject object) { + JNI_STACK_ALIGNMENT_PROLOGUE; + sem_post (&saf_completion_sem); } JNIEXPORT jboolean JNICALL NATIVE_NAME (ftruncate) (JNIEnv *env, jobject object, jint fd) { + JNI_STACK_ALIGNMENT_PROLOGUE; + if (ftruncate (fd, 0) < 0) return false; From 6b6761d534259ab4d5409e72754e46af13623dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Bornemann?= Date: Sat, 17 Feb 2024 21:18:02 +0100 Subject: [PATCH 269/446] Recognize functions and macros as defuns in 'cmake-ts-mode' * lisp/progmodes/cmake-ts-mode.el (cmake-ts-mode--function-name): Renamed to 'cmake-ts-mode--defun-name' since the function handles now functions and macros. (cmake-ts-mode--defun-name): Return text of the first 'argument' node below 'function_def' and 'macro_def' nodes. (cmake-ts-mode): Set up treesit-defun-type-regexp and 'treesit-defun-name-function'. Change the imenu setup to recognize macros too. Since we have set up 'treesit-defun-name-function', we don't have to pass 'cmake-ts-mode--function-name' anymore. (Bug#69186) To make `treesit-defun-at-point' work properly, we have to recognize function_def/macro_def nodes, not the lower-level *_command nodes. --- lisp/progmodes/cmake-ts-mode.el | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el index 29c9e957d3c..45c4882d873 100644 --- a/lisp/progmodes/cmake-ts-mode.el +++ b/lisp/progmodes/cmake-ts-mode.el @@ -193,13 +193,13 @@ Check if a node type is available, then return the right font lock rules." '((ERROR) @font-lock-warning-face)) "Tree-sitter font-lock settings for `cmake-ts-mode'.") -(defun cmake-ts-mode--function-name (node) - "Return the function name of NODE. -Return nil if there is no name or if NODE is not a function node." +(defun cmake-ts-mode--defun-name (node) + "Return the defun name of NODE. +Return nil if there is no name or if NODE is not a defun node." (pcase (treesit-node-type node) - ("function_command" + ((or "function_def" "macro_def") (treesit-node-text - (treesit-search-subtree node "^argument$" nil nil 2) + (treesit-search-subtree node "^argument$" nil nil 3) t)))) ;;;###autoload @@ -216,9 +216,15 @@ Return nil if there is no name or if NODE is not a function node." (setq-local comment-end "") (setq-local comment-start-skip (rx "#" (* (syntax whitespace)))) + ;; Defuns. + (setq-local treesit-defun-type-regexp (rx (or "function" "macro") + "_def")) + (setq-local treesit-defun-name-function #'cmake-ts-mode--defun-name) + ;; Imenu. (setq-local treesit-simple-imenu-settings - `(("Function" "\\`function_command\\'" nil cmake-ts-mode--function-name))) + `(("Function" "^function_def$") + ("Macro" "^macro_def$"))) (setq-local which-func-functions nil) ;; Indent. From 70cf4b694b317b367a046b0b03746c56e23fcb91 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 22 Feb 2024 15:15:53 +0200 Subject: [PATCH 270/446] ; * etc/PROBLEMS: Describe input lags due to GTK IM (bug#69246). --- etc/PROBLEMS | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/etc/PROBLEMS b/etc/PROBLEMS index 60904408af8..b4df40f5d8e 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -432,7 +432,7 @@ than the corresponding .el file. Alternatively, if you set the option 'load-prefer-newer' non-nil, Emacs will load whichever version of a file is the newest. -*** Watch out for the EMACSLOADPATH environment variable +*** Watch out for the EMACSLOADPATH environment variable. EMACSLOADPATH overrides which directories the function "load" will search. @@ -441,7 +441,7 @@ environment. ** Keyboard problems -*** PGTK build of Emacs running on Wayland doesn't recognize Hyper modifier +*** PGTK build of Emacs running on Wayland doesn't recognize Hyper modifier. If you arrange for the Wayland compositor to send the Hyper key modifier (e.g., via XKB customizations), the Hyper modifier will still @@ -452,6 +452,17 @@ Since GDK 3.x is no longer developed, this bug in GDK will probably never be solved. And the Emacs PGTK build cannot yet support GTK4, where this problem is reportedly solved. +*** Emacs built with GTK lags in its response to keyboard input. +This can happen when input methods are used. It happens because Emacs +behaves in an unconventional way with respect to GTK input methods: it +registers to receive keyboard input as unprocessed key events with +metadata (as opposed to receiving them as text strings). Most GTK +programs use the latter approach, so some modern input methods have +bugs and misbehave when faced with the way Emacs does it. + +A workaround is to set GTK_IM_MODULE=none in the environment, or maybe +find a different input method without these problems. + *** Unable to enter the M-| key on some German keyboards. Some users have reported that M-| suffers from "keyboard ghosting". This can't be fixed by Emacs, as the keypress never gets passed to it From cc58626f643c1b19e66bab9c6a39026c7e419ab9 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Thu, 22 Feb 2024 19:38:17 +0200 Subject: [PATCH 271/446] * lisp/help-fns.el (describe-mode-outline): New user option (bug#64684). (describe-mode, describe-mode--minor-modes): Use 'describe-mode-outline'. * lisp/help-mode.el (help-setup-xref): After disabling outline-minor-mode also kill all outline-related local variables. So that they won't affect the output of other help commands in the same help buffer. --- etc/NEWS | 4 ++ lisp/help-fns.el | 97 +++++++++++++++++++++++++++++++++-------------- lisp/help-mode.el | 12 +++++- 3 files changed, 83 insertions(+), 30 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 7b248c3fe78..13b41feccbc 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -130,6 +130,10 @@ the signature) the automatically inferred function type as well. This user option controls outline visibility in the output buffer of 'describe-bindings' when 'describe-bindings-outline' is non-nil. +--- +*** 'C-h m' ('describe-mode') uses outlining by default. +Set 'describe-mode-outline' to nil to get back the old behavior. + ** Outline Mode +++ diff --git a/lisp/help-fns.el b/lisp/help-fns.el index 1ba848c107d..15d87f9925c 100644 --- a/lisp/help-fns.el +++ b/lisp/help-fns.el @@ -2133,6 +2133,12 @@ keymap value." (when used-gentemp (makunbound keymap)))) +(defcustom describe-mode-outline t + "Non-nil enables outlines in the output buffer of `describe-mode'." + :type 'boolean + :group 'help + :version "30.1") + ;;;###autoload (defun describe-mode (&optional buffer) "Display documentation of current major mode and minor modes. @@ -2145,7 +2151,10 @@ variable \(listed in `minor-mode-alist') must also be a function whose documentation describes the minor mode. If called from Lisp with a non-nil BUFFER argument, display -documentation for the major and minor modes of that buffer." +documentation for the major and minor modes of that buffer. + +When `describe-mode-outline' is non-nil, Outline minor mode +is enabled in the Help buffer." (interactive "@") (unless buffer (setq buffer (current-buffer))) @@ -2159,13 +2168,20 @@ documentation for the major and minor modes of that buffer." (with-current-buffer (help-buffer) ;; Add the local minor modes at the start. (when local-minors - (insert (format "Minor mode%s enabled in this buffer:" - (if (length> local-minors 1) - "s" ""))) + (unless describe-mode-outline + (insert (format "Minor mode%s enabled in this buffer:" + (if (length> local-minors 1) + "s" "")))) (describe-mode--minor-modes local-minors)) ;; Document the major mode. (let ((major (buffer-local-value 'major-mode buffer))) + (when describe-mode-outline + (goto-char (point-min)) + (put-text-property + (point) (progn (insert (format "Major mode %S" major)) (point)) + 'outline-level 1) + (insert "\n\n")) (insert "The major mode is " (buttonize (propertize (format-mode-line @@ -2189,36 +2205,56 @@ documentation for the major and minor modes of that buffer." ;; Insert the global minor modes after the major mode. (when global-minor-modes - (insert (format "Global minor mode%s enabled:" - (if (length> global-minor-modes 1) - "s" ""))) - (describe-mode--minor-modes global-minor-modes) - (when (re-search-forward "^\f") - (beginning-of-line) - (ensure-empty-lines 1))) + (unless describe-mode-outline + (insert (format "Global minor mode%s enabled:" + (if (length> global-minor-modes 1) + "s" "")))) + (describe-mode--minor-modes global-minor-modes t) + (unless describe-mode-outline + (when (re-search-forward "^\f") + (beginning-of-line) + (ensure-empty-lines 1)))) + + (when describe-mode-outline + (setq-local outline-search-function #'outline-search-level) + (setq-local outline-level (lambda () 1)) + (setq-local outline-minor-mode-cycle t + outline-minor-mode-highlight t + outline-minor-mode-use-buttons 'insert) + (outline-minor-mode 1)) + ;; For the sake of IELM and maybe others nil))))) -(defun describe-mode--minor-modes (modes) +(defun describe-mode--minor-modes (modes &optional global) (dolist (mode (seq-sort #'string< modes)) (let ((pretty-minor-mode (capitalize (replace-regexp-in-string "\\(\\(-minor\\)?-mode\\)?\\'" "" (symbol-name mode))))) - (insert - " " - (buttonize - pretty-minor-mode - (lambda (mode) - (goto-char (point-min)) - (text-property-search-forward - 'help-minor-mode mode t) - (beginning-of-line)) - mode)) + (if (not describe-mode-outline) + (insert + " " + (buttonize + pretty-minor-mode + (lambda (mode) + (goto-char (point-min)) + (text-property-search-forward + 'help-minor-mode mode t) + (beginning-of-line)) + mode)) + (goto-char (point-max)) + (put-text-property + (point) (progn (insert (if global "Global" "Local") + (format " minor mode %S" mode)) + (point)) + 'outline-level 1) + (insert "\n\n")) (save-excursion - (goto-char (point-max)) - (insert "\n\n\f\n") + (unless describe-mode-outline + (goto-char (point-max)) + (insert "\n\n\f\n")) ;; Document the minor modes fully. (insert (buttonize (propertize pretty-minor-mode 'help-minor-mode mode) @@ -2232,11 +2268,14 @@ documentation for the major and minor modes of that buffer." (format "indicator%s" indicator))))) (insert (or (help-split-fundoc (documentation mode) nil 'doc) - "No docstring"))))) - (forward-line -1) - (fill-paragraph nil) - (forward-paragraph 1) - (ensure-empty-lines 1)) + "No docstring")) + (when describe-mode-outline + (insert "\n\n"))))) + (unless describe-mode-outline + (forward-line -1) + (fill-paragraph nil) + (forward-paragraph 1) + (ensure-empty-lines 1))) (defun help-fns--list-local-commands () (let ((functions nil)) diff --git a/lisp/help-mode.el b/lisp/help-mode.el index 9c405efeee5..f9ec8a5cc2b 100644 --- a/lisp/help-mode.el +++ b/lisp/help-mode.el @@ -501,7 +501,17 @@ restore it properly when going back." ;; Disable `outline-minor-mode' in a reused Help buffer ;; created by `describe-bindings' that enables this mode. (when (bound-and-true-p outline-minor-mode) - (outline-minor-mode -1)) + (outline-minor-mode -1) + (mapc #'kill-local-variable + '(outline-search-function + outline-regexp + outline-heading-end-regexp + outline-level + outline-minor-mode-cycle + outline-minor-mode-highlight + outline-minor-mode-use-buttons + outline-default-state + outline-default-rules))) (when help-xref-stack-item (push (cons (point) help-xref-stack-item) help-xref-stack) (setq help-xref-forward-stack nil)) From 58ca91fe0723c861d53375f52e5b6dd54a49a2e3 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 22 Feb 2024 20:40:57 +0100 Subject: [PATCH 272/446] * Fix 'parse-colon-path' entry in 'comp-known-type-specifiers' * lisp/emacs-lisp/comp-common.el (comp-known-type-specifiers): Fix 'parse-colon-path'. --- lisp/emacs-lisp/comp-common.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp-common.el b/lisp/emacs-lisp/comp-common.el index 6ba9664ea5c..ca21ed05bb4 100644 --- a/lisp/emacs-lisp/comp-common.el +++ b/lisp/emacs-lisp/comp-common.el @@ -309,7 +309,7 @@ Used to modify the compiler environment." (numberp (function (t) boolean)) (one-window-p (function (&optional t t) boolean)) (overlayp (function (t) boolean)) - (parse-colon-path (function (string) cons)) + (parse-colon-path (function (string) list)) (plist-get (function (list t &optional t) t)) (plist-member (function (list t &optional t) list)) (point (function () integer)) From b868690feff44c7242c942490d1d8bc6d2811fa2 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 23 Feb 2024 10:18:17 +0800 Subject: [PATCH 273/446] Fix bug#69140 * src/window.c (grow_mini_window): Don't adjust frame matrices or force redisplay if the provided window cannot be resized. (bug#69140) --- src/window.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index 565ad00804f..0c84b4f4bf3 100644 --- a/src/window.c +++ b/src/window.c @@ -5380,7 +5380,14 @@ grow_mini_window (struct window *w, int delta) grow = call3 (Qwindow__resize_root_window_vertically, root, make_fixnum (- delta), Qt); - if (FIXNUMP (grow) && window_resize_check (r, false)) + if (FIXNUMP (grow) + /* It might be impossible to resize the window, in which case + calling resize_mini_window_apply will set off an infinite + loop where the redisplay cycle so forced returns to + resize_mini_window, making endless attempts to expand the + minibuffer window to this impossible size. (bug#69140) */ + && XFIXNUM (grow) != 0 + && window_resize_check (r, false)) resize_mini_window_apply (w, -XFIXNUM (grow)); } } From f85280503a3a67e1618069b1c7d6810efa924fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 22 Feb 2024 17:20:58 +0100 Subject: [PATCH 274/446] Tone down python-mode warning to a simple message (bug#68559) * lisp/progmodes/python.el (python-shell-completion-native-turn-on-maybe): There is no need for an alarming warning when using an inferior Python without GNU readline; a calm message will do. --- lisp/progmodes/python.el | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 5501926e69d..bedc61408ef 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -4536,18 +4536,11 @@ With argument MSG show activation/deactivation message." ((python-shell-completion-native-setup) (when msg (message "Shell native completion is enabled."))) - (t (lwarn - '(python python-shell-completion-native-turn-on-maybe) - :warning - (concat - "Your `python-shell-interpreter' doesn't seem to " - "support readline, yet `python-shell-completion-native-enable' " - (format "was t and %S is not part of the " - (file-name-nondirectory python-shell-interpreter)) - "`python-shell-completion-native-disabled-interpreters' " - "list. Native completions have been disabled locally. " - "Consider installing the python package \"readline\". ")) - (python-shell-completion-native-turn-off msg)))))) + (t + (when msg + (message (concat "Python does not use GNU readline;" + " no completion in multi-line commands."))) + (python-shell-completion-native-turn-off nil)))))) (defun python-shell-completion-native-turn-on-maybe-with-msg () "Like `python-shell-completion-native-turn-on-maybe' but force messages." From 53e60fb004c0e8b40b01fcfcf7f406557e35aa3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 22 Feb 2024 20:15:33 +0100 Subject: [PATCH 275/446] * src/fns.c (hash_string): Suppress warning on 32-bit platforms Remove a shift-too-wide complaint by GCC in code that is never reached on platforms where that shift is too wide. --- src/fns.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/fns.c b/src/fns.c index 0a9692f36e8..737757d06cc 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5086,6 +5086,8 @@ hash_string (char const *ptr, ptrdiff_t len) /* String is shorter than an EMACS_UINT. Use smaller loads. */ eassume (p <= end && end - p < sizeof (EMACS_UINT)); EMACS_UINT tail = 0; + verify (sizeof tail <= 8); +#if EMACS_INT_MAX > INT32_MAX if (end - p >= 4) { uint32_t c; @@ -5093,6 +5095,7 @@ hash_string (char const *ptr, ptrdiff_t len) tail = (tail << (8 * sizeof c)) + c; p += sizeof c; } +#endif if (end - p >= 2) { uint16_t c; From 6a53836a245a8154f1f176ce2a787c24aa7409cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Fri, 23 Feb 2024 11:26:45 +0100 Subject: [PATCH 276/446] * src/fns.c (sxhash_bignum): Include sign bit in hash. --- src/fns.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fns.c b/src/fns.c index 737757d06cc..550545d1486 100644 --- a/src/fns.c +++ b/src/fns.c @@ -5193,7 +5193,7 @@ sxhash_bignum (Lisp_Object bignum) { mpz_t const *n = xbignum_val (bignum); size_t i, nlimbs = mpz_size (*n); - EMACS_UINT hash = 0; + EMACS_UINT hash = mpz_sgn(*n) < 0; for (i = 0; i < nlimbs; ++i) hash = sxhash_combine (hash, mpz_getlimbn (*n, i)); From 32843c7b36b8bf3dc9ac82059a1c3cab03cd8c98 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 23 Feb 2024 01:07:46 +0100 Subject: [PATCH 277/446] * src/pdumper.c (dump_subr): Rename 'native_comp' -> 'non_primitive'. --- src/pdumper.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index 509fb079db7..778d8facabd 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2912,17 +2912,17 @@ dump_subr (struct dump_context *ctx, const struct Lisp_Subr *subr) dump_object_start (ctx, &out, sizeof (out)); DUMP_FIELD_COPY (&out, subr, header.size); #ifdef HAVE_NATIVE_COMP - bool native_comp = !NILP (subr->native_comp_u); + bool non_primitive = !NILP (subr->native_comp_u); #else - bool native_comp = false; + bool non_primitive = false; #endif - if (native_comp) + if (non_primitive) out.function.a0 = NULL; else dump_field_emacs_ptr (ctx, &out, subr, &subr->function.a0); DUMP_FIELD_COPY (&out, subr, min_args); DUMP_FIELD_COPY (&out, subr, max_args); - if (native_comp) + if (non_primitive) { dump_field_fixup_later (ctx, &out, subr, &subr->symbol_name); dump_remember_cold_op (ctx, @@ -2947,7 +2947,7 @@ dump_subr (struct dump_context *ctx, const struct Lisp_Subr *subr) dump_field_lv (ctx, &out, subr, &subr->type, WEIGHT_NORMAL); #endif dump_off subr_off = dump_object_finish (ctx, &out, sizeof (out)); - if (native_comp && ctx->flags.dump_object_contents) + if (non_primitive && ctx->flags.dump_object_contents) /* We'll do the final addr relocation during VERY_LATE_RELOCS time after the compilation units has been loaded. */ dump_push (&ctx->dump_relocs[VERY_LATE_RELOCS], From aa82fe9931851e66aa335e96ae35fd967951b281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 8 Feb 2024 18:23:00 +0100 Subject: [PATCH 278/446] Use obarray-make instead of make-vector to create obarrays This prepares for the introduction of an actual obarray type. * lisp/cedet/semantic/lex-spp.el (semantic-lex-spp-dynamic-map) (semantic-lex-spp-dynamic-map-stack, semantic-lex-make-spp-table): * lisp/cedet/semantic/lex.el (semantic-lex-make-keyword-table) (semantic-lex-make-type-table): * lisp/completion.el (cmpl-prefix-obarray, cmpl-obarray) (clear-all-completions): * lisp/emacs-lisp/checkdoc.el (checkdoc-defun-info): * lisp/emacs-lisp/eldoc.el (eldoc-message-commands) (eldoc-edit-message-commands): * lisp/mail/mail-extr.el (mail-extr-all-top-level-domains): * lisp/mail/rmailkwd.el (rmail-label-obarray): * lisp/net/dns.el (dns-cache): * lisp/net/eww.el (eww-suggested-uris): * lisp/net/imap.el (imap-open, imap-mailbox-select-1) (imap-message-copyuid-1, imap-message-appenduid-1): * lisp/obsolete/pgg.el (pgg-passphrase-cache, pgg-pending-timers): * lisp/play/cookie1.el (cookie-cache): * lisp/progmodes/cc-defs.el (c-lang-constants, c-define-lang-constant): * lisp/progmodes/cc-langs.el (c-keywords-obarray): * lisp/vc/vc-hooks.el (vc-file-prop-obarray): * test/lisp/obarray-tests.el (obarrayp-test): * test/src/minibuf-tests.el (minibuf-tests--strings-to-obarray): Use obarray-make instead of obarray-make. --- lisp/cedet/semantic/lex-spp.el | 6 +++--- lisp/cedet/semantic/lex.el | 4 ++-- lisp/completion.el | 8 ++++---- lisp/emacs-lisp/checkdoc.el | 2 +- lisp/emacs-lisp/eldoc.el | 4 ++-- lisp/mail/mail-extr.el | 2 +- lisp/mail/rmailkwd.el | 2 +- lisp/net/dns.el | 2 +- lisp/net/eww.el | 2 +- lisp/net/imap.el | 8 ++++---- lisp/obsolete/pgg.el | 4 ++-- lisp/play/cookie1.el | 2 +- lisp/progmodes/cc-defs.el | 4 ++-- lisp/progmodes/cc-langs.el | 2 +- lisp/vc/vc-hooks.el | 2 +- test/lisp/obarray-tests.el | 3 ++- test/src/minibuf-tests.el | 2 +- 17 files changed, 30 insertions(+), 29 deletions(-) diff --git a/lisp/cedet/semantic/lex-spp.el b/lisp/cedet/semantic/lex-spp.el index a4be5bf67e2..f63d316c1ac 100644 --- a/lisp/cedet/semantic/lex-spp.el +++ b/lisp/cedet/semantic/lex-spp.el @@ -153,13 +153,13 @@ The search priority is: "Return the dynamic macro map for the current buffer." (or semantic-lex-spp-dynamic-macro-symbol-obarray (setq semantic-lex-spp-dynamic-macro-symbol-obarray - (make-vector 13 0)))) + (obarray-make 13)))) (defsubst semantic-lex-spp-dynamic-map-stack () "Return the dynamic macro map for the current buffer." (or semantic-lex-spp-dynamic-macro-symbol-obarray-stack (setq semantic-lex-spp-dynamic-macro-symbol-obarray-stack - (make-vector 13 0)))) + (obarray-make 13)))) (defun semantic-lex-spp-value-valid-p (value) "Return non-nil if VALUE is valid." @@ -260,7 +260,7 @@ NAME is the name of the spp macro symbol to define. REPLACEMENT a string that would be substituted in for NAME." ;; Create the symbol hash table - (let ((semantic-lex-spp-macro-symbol-obarray (make-vector 13 0)) + (let ((semantic-lex-spp-macro-symbol-obarray (obarray-make 13)) spec) ;; fill it with stuff (while specs diff --git a/lisp/cedet/semantic/lex.el b/lisp/cedet/semantic/lex.el index b32cb96bed9..f3d671ac312 100644 --- a/lisp/cedet/semantic/lex.el +++ b/lisp/cedet/semantic/lex.el @@ -259,7 +259,7 @@ If optional argument PROPSPECS is non-nil, then interpret it, and apply those properties. PROPSPECS must be a list of (NAME PROPERTY VALUE) elements." ;; Create the symbol hash table - (let ((semantic-flex-keywords-obarray (make-vector 13 0)) + (let ((semantic-flex-keywords-obarray (obarray-make 13)) spec) ;; fill it with stuff (while specs @@ -416,7 +416,7 @@ If optional argument PROPSPECS is non-nil, then interpret it, and apply those properties. PROPSPECS must be a list of (TYPE PROPERTY VALUE)." ;; Create the symbol hash table - (let* ((semantic-lex-types-obarray (make-vector 13 0)) + (let* ((semantic-lex-types-obarray (obarray-make 13)) spec type tokens token alist default) ;; fill it with stuff (while specs diff --git a/lisp/completion.el b/lisp/completion.el index ab7f2a7bc52..6c758e56eab 100644 --- a/lisp/completion.el +++ b/lisp/completion.el @@ -875,11 +875,11 @@ This is sensitive to `case-fold-search'." ;; GNU implements obarrays (defconst cmpl-obarray-length 511) -(defvar cmpl-prefix-obarray (make-vector cmpl-obarray-length 0) +(defvar cmpl-prefix-obarray (obarray-make cmpl-obarray-length) "An obarray used to store the downcased completion prefixes. Each symbol is bound to a list of completion entries.") -(defvar cmpl-obarray (make-vector cmpl-obarray-length 0) +(defvar cmpl-obarray (obarray-make cmpl-obarray-length) "An obarray used to store the downcased completions. Each symbol is bound to a single completion entry.") @@ -962,8 +962,8 @@ Each symbol is bound to a single completion entry.") (defun clear-all-completions () "Initialize the completion storage. All existing completions are lost." (interactive) - (setq cmpl-prefix-obarray (make-vector cmpl-obarray-length 0)) - (setq cmpl-obarray (make-vector cmpl-obarray-length 0))) + (setq cmpl-prefix-obarray (obarray-make cmpl-obarray-length)) + (setq cmpl-obarray (obarray-make cmpl-obarray-length))) (defun list-all-completions () "Return a list of all the known completion entries." diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el index 82c6c03a592..02c11cae573 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -1994,7 +1994,7 @@ from the comment." (defun-depth (ppss-depth (syntax-ppss))) (lst nil) (ret nil) - (oo (make-vector 3 0))) ;substitute obarray for `read' + (oo (obarray-make 3))) ;substitute obarray for `read' (forward-char 1) (forward-sexp 1) (skip-chars-forward " \n\t") diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index 912a7357ca7..24afd03fbe6 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -155,7 +155,7 @@ Remember to keep it a prime number to improve hash performance.") (defvar eldoc-message-commands ;; Don't define as `defconst' since it would then go to (read-only) purespace. - (make-vector eldoc-message-commands-table-size 0) + (obarray-make eldoc-message-commands-table-size) "Commands after which it is appropriate to print in the echo area. ElDoc does not try to print function arglists, etc., after just any command, because some commands print their own messages in the echo area and these @@ -191,7 +191,7 @@ It should receive the same arguments as `message'.") When `eldoc-print-after-edit' is non-nil, ElDoc messages are only printed after commands contained in this obarray." - (let ((cmds (make-vector 31 0)) + (let ((cmds (obarray-make 31)) (re (regexp-opt '("delete" "insert" "edit" "electric" "newline")))) (mapatoms (lambda (s) (and (commandp s) diff --git a/lisp/mail/mail-extr.el b/lisp/mail/mail-extr.el index 668cae05521..cfdbc1b2509 100644 --- a/lisp/mail/mail-extr.el +++ b/lisp/mail/mail-extr.el @@ -1845,7 +1845,7 @@ place. It affects how `mail-extract-address-components' works." ;; https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains (defconst mail-extr-all-top-level-domains - (let ((ob (make-vector 739 0))) + (let ((ob (obarray-make 739))) (mapc (lambda (x) (put (intern (downcase (car x)) ob) diff --git a/lisp/mail/rmailkwd.el b/lisp/mail/rmailkwd.el index d9c4cb8cfee..a13c42edb5c 100644 --- a/lisp/mail/rmailkwd.el +++ b/lisp/mail/rmailkwd.el @@ -31,7 +31,7 @@ ;; Global to all RMAIL buffers. It exists for the sake of completion. ;; It is better to use strings with the label functions and let them ;; worry about making the label. -(defvar rmail-label-obarray (make-vector 47 0) +(defvar rmail-label-obarray (obarray-make 47) "Obarray of labels used by Rmail. `rmail-read-label' uses this to offer completion.") diff --git a/lisp/net/dns.el b/lisp/net/dns.el index 23ea88ef4ad..54f4d227a49 100644 --- a/lisp/net/dns.el +++ b/lisp/net/dns.el @@ -359,7 +359,7 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"." result)) ;;; Interface functions. -(defvar dns-cache (make-vector 4096 0)) +(defvar dns-cache (obarray-make 4096)) (defun dns-query-cached (name &optional type fullp reversep) (let* ((key (format "%s:%s:%s:%s" name type fullp reversep)) diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 6ae1e6d3d0a..5a25eef9e3c 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -340,7 +340,7 @@ parameter, and should return the (possibly) transformed URL." (defun eww-suggested-uris nil "Return the list of URIs to suggest at the `eww' prompt. This list can be customized via `eww-suggest-uris'." - (let ((obseen (make-vector 42 0)) + (let ((obseen (obarray-make 42)) (uris nil)) (dolist (fun eww-suggest-uris) (let ((ret (funcall fun))) diff --git a/lisp/net/imap.el b/lisp/net/imap.el index f10b5b8fc12..a06740528e9 100644 --- a/lisp/net/imap.el +++ b/lisp/net/imap.el @@ -1057,7 +1057,7 @@ necessary. If nil, the buffer name is generated." (setq imap-capability nil) (setq streams nil)))))) (when (imap-opened buffer) - (setq imap-mailbox-data (make-vector imap-mailbox-prime 0))) + (setq imap-mailbox-data (obarray-make imap-mailbox-prime))) ;; (debug "opened+state+auth+buffer" (imap-opened buffer) imap-state imap-auth buffer) (when imap-stream buffer)))) @@ -1280,7 +1280,7 @@ If EXAMINE is non-nil, do a read-only select." (concat (if examine "EXAMINE" "SELECT") " \"" mailbox "\""))) (progn - (setq imap-message-data (make-vector imap-message-prime 0) + (setq imap-message-data (obarray-make imap-message-prime) imap-state (if examine 'examine 'selected)) imap-current-mailbox) ;; Failed SELECT/EXAMINE unselects current mailbox @@ -1722,7 +1722,7 @@ See `imap-enable-exchange-bug-workaround'." (string-to-number (nth 2 (imap-mailbox-get-1 'copyuid mailbox)))) (let ((old-mailbox imap-current-mailbox) (state imap-state) - (imap-message-data (make-vector 2 0))) + (imap-message-data (obarray-make 2))) (when (imap-mailbox-examine-1 mailbox) (prog1 (and (imap-fetch-safe '("*" . "*:*") "UID") @@ -1768,7 +1768,7 @@ first element. The rest of list contains the saved articles' UIDs." (imap-mailbox-get-1 'appenduid mailbox) (let ((old-mailbox imap-current-mailbox) (state imap-state) - (imap-message-data (make-vector 2 0))) + (imap-message-data (obarray-make 2))) (when (imap-mailbox-examine-1 mailbox) (prog1 (and (imap-fetch-safe '("*" . "*:*") "UID") diff --git a/lisp/obsolete/pgg.el b/lisp/obsolete/pgg.el index 6c00ad201f1..4c7b653155e 100644 --- a/lisp/obsolete/pgg.el +++ b/lisp/obsolete/pgg.el @@ -85,9 +85,9 @@ is true, or else the output buffer is displayed." (set-buffer standard-output) (insert-buffer-substring pgg-errors-buffer)))) -(defvar pgg-passphrase-cache (make-vector 7 0)) +(defvar pgg-passphrase-cache (obarray-make 7)) -(defvar pgg-pending-timers (make-vector 7 0) +(defvar pgg-pending-timers (obarray-make 7) "Hash table for managing scheduled pgg cache management timers. We associate key and timer, so the timer can be canceled if a new diff --git a/lisp/play/cookie1.el b/lisp/play/cookie1.el index c8e9d097a5f..c4697a0d3b9 100644 --- a/lisp/play/cookie1.el +++ b/lisp/play/cookie1.el @@ -65,7 +65,7 @@ (defconst cookie-delimiter "\n%%\n\\|\n%\n\\|\0" "Delimiter used to separate cookie file entries.") -(defvar cookie-cache (make-vector 511 0) +(defvar cookie-cache (obarray-make 511) "Cache of cookie files that have already been snarfed.") (defun cookie-check-file (file) diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index f84d95dbc94..e45ab76ec07 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -2425,7 +2425,7 @@ system." (error "Unknown base mode `%s'" base-mode)) (put mode 'c-fallback-mode base-mode)) -(defvar c-lang-constants (make-vector 151 0)) +(defvar c-lang-constants (obarray-make 151)) ;; Obarray used as a cache to keep track of the language constants. ;; The constants stored are those defined by `c-lang-defconst' and the values ;; computed by `c-lang-const'. It's mostly used at compile time but it's not @@ -2630,7 +2630,7 @@ constant. A file is identified by its base name." ;; Clear the evaluated values that depend on this source. (let ((agenda (get sym 'dependents)) - (visited (make-vector 101 0)) + (visited (obarray-make 101)) ptr) (while agenda (setq sym (car agenda) diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index ba0d1d0fc49..ae2389c75c2 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -3511,7 +3511,7 @@ Note that Java specific rules are currently applied to tell this from (let* ((alist (c-lang-const c-keyword-member-alist)) kwd lang-const-list - (obarray (make-vector (* (length alist) 2) 0))) + (obarray (obarray-make (* (length alist) 2)))) (while alist (setq kwd (caar alist) lang-const-list (cdar alist) diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index 1493845e2d9..a95cc732dab 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -197,7 +197,7 @@ VC commands are globally reachable under the prefix \\[vc-prefix-map]: ;; during any subsequent VC operations, and forget them when ;; the buffer is killed. -(defvar vc-file-prop-obarray (make-vector 17 0) +(defvar vc-file-prop-obarray (obarray-make 17) "Obarray for per-file properties.") (defvar vc-touched-properties nil) diff --git a/test/lisp/obarray-tests.el b/test/lisp/obarray-tests.el index d7e547fcf29..dd8f1c8abd4 100644 --- a/test/lisp/obarray-tests.el +++ b/test/lisp/obarray-tests.el @@ -32,7 +32,8 @@ (should-not (obarrayp "aoeu")) (should-not (obarrayp '())) (should-not (obarrayp [])) - (should (obarrayp (make-vector 7 0)))) + (should (obarrayp (obarray-make 7))) + (should (obarrayp (make-vector 7 0)))) ; for compatibility? (ert-deftest obarrayp-unchecked-content-test () "Should fail to check content of passed obarray." diff --git a/test/src/minibuf-tests.el b/test/src/minibuf-tests.el index cb305ca0e55..99d522d1856 100644 --- a/test/src/minibuf-tests.el +++ b/test/src/minibuf-tests.el @@ -34,7 +34,7 @@ (let ((num 0)) (mapcar (lambda (str) (cons str (cl-incf num))) list))) (defun minibuf-tests--strings-to-obarray (list) - (let ((ob (make-vector 7 0))) + (let ((ob (obarray-make 7))) (mapc (lambda (str) (intern str ob)) list) ob)) (defun minibuf-tests--strings-to-string-hashtable (list) From 3beaa3131e78bea618cb93d03c5d8b0f8977fb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 10 Feb 2024 20:59:42 +0100 Subject: [PATCH 279/446] Use obarrayp, not vectorp, to detect obarrays * lisp/abbrev.el (abbrev--active-tables): * lisp/mail/mailabbrev.el (mail-abbrevs-setup, build-mail-abbrevs) (define-mail-abbrev, mail-resolve-all-aliases) (mail-abbrev-insert-alias): * lisp/mail/rmail.el (rmail-resend): * lisp/minibuffer.el (completion-table-with-context): * lisp/progmodes/etags.el (etags-tags-apropos-additional): (etags--xref-apropos-additional): Use obarrayp as predicate for obarrays. --- lisp/abbrev.el | 2 +- lisp/mail/mailabbrev.el | 12 ++++++------ lisp/mail/rmail.el | 2 +- lisp/minibuffer.el | 2 +- lisp/progmodes/etags.el | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lisp/abbrev.el b/lisp/abbrev.el index 2bd9faad69d..b523977fed5 100644 --- a/lisp/abbrev.el +++ b/lisp/abbrev.el @@ -721,7 +721,7 @@ either a single abbrev table or a list of abbrev tables." ;; to treat the distinction between a single table and a list of tables. (cond ((consp tables) tables) - ((vectorp tables) (list tables)) + ((obarrayp tables) (list tables)) (t (let ((tables (if (listp local-abbrev-table) (append local-abbrev-table diff --git a/lisp/mail/mailabbrev.el b/lisp/mail/mailabbrev.el index 68d325ea261..c8006294a7d 100644 --- a/lisp/mail/mailabbrev.el +++ b/lisp/mail/mailabbrev.el @@ -171,7 +171,7 @@ no aliases, which is represented by this being a table with no entries.)") ;;;###autoload (defun mail-abbrevs-setup () "Initialize use of the `mailabbrev' package." - (if (and (not (vectorp mail-abbrevs)) + (if (and (not (obarrayp mail-abbrevs)) (file-exists-p mail-personal-alias-file)) (progn (setq mail-abbrev-modtime @@ -196,7 +196,7 @@ no aliases, which is represented by this being a table with no entries.)") "Read mail aliases from personal mail alias file and set `mail-abbrevs'. By default this is the file specified by `mail-personal-alias-file'." (setq file (expand-file-name (or file mail-personal-alias-file))) - (if (vectorp mail-abbrevs) + (if (obarrayp mail-abbrevs) nil (setq mail-abbrevs nil) (define-abbrev-table 'mail-abbrevs '())) @@ -278,7 +278,7 @@ double-quotes." ;; true, and we do some evil space->comma hacking like /bin/mail does. (interactive "sDefine mail alias: \nsDefine %s as mail alias for: ") ;; Read the defaults first, if we have not done so. - (unless (vectorp mail-abbrevs) (build-mail-abbrevs)) + (unless (obarrayp mail-abbrevs) (build-mail-abbrevs)) ;; strip garbage from front and end (if (string-match "\\`[ \t\n,]+" definition) (setq definition (substring definition (match-end 0)))) @@ -355,7 +355,7 @@ double-quotes." (if mail-abbrev-aliases-need-to-be-resolved (progn ;; (message "Resolving mail aliases...") - (if (vectorp mail-abbrevs) + (if (obarrayp mail-abbrevs) (mapatoms (function mail-resolve-all-aliases-1) mail-abbrevs)) (setq mail-abbrev-aliases-need-to-be-resolved nil) ;; (message "Resolving mail aliases... done.") @@ -555,9 +555,9 @@ of a mail alias. The value is set up, buffer-local, when first needed.") (defun mail-abbrev-insert-alias (&optional alias) "Prompt for and insert a mail alias." (interactive (progn - (if (not (vectorp mail-abbrevs)) (mail-abbrevs-setup)) + (if (not (obarrayp mail-abbrevs)) (mail-abbrevs-setup)) (list (completing-read "Expand alias: " mail-abbrevs nil t)))) - (if (not (vectorp mail-abbrevs)) (mail-abbrevs-setup)) + (if (not (obarrayp mail-abbrevs)) (mail-abbrevs-setup)) (insert (or (and alias (symbol-value (intern-soft alias mail-abbrevs))) "")) (mail-abbrev-expand-hook)) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 85eaec33660..6f343c23bbe 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -4097,7 +4097,7 @@ typically for purposes of moderating a list." (let ((end (point-marker)) (local-abbrev-table mail-abbrevs) (old-syntax-table (syntax-table))) - (if (and (not (vectorp mail-abbrevs)) + (if (and (not (obarrayp mail-abbrevs)) (file-exists-p mail-personal-alias-file)) (build-mail-abbrevs)) (unless mail-abbrev-syntax-table diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 708f3684d11..099fa1599d5 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -321,7 +321,7 @@ the form (concat S2 S)." ;; Predicates are called differently depending on the nature of ;; the completion table :-( (cond - ((vectorp table) ;Obarray. + ((obarrayp table) (lambda (sym) (funcall pred (concat prefix (symbol-name sym))))) ((hash-table-p table) (lambda (s _v) (funcall pred (concat prefix s)))) diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el index b9bd772ddfc..476037eb8bd 100644 --- a/lisp/progmodes/etags.el +++ b/lisp/progmodes/etags.el @@ -1488,7 +1488,7 @@ hits the start of file." (setq symbs (symbol-value symbs)) (insert (format-message "symbol `%s' has no value\n" symbs)) (setq symbs nil))) - (if (vectorp symbs) + (if (obarrayp symbs) (mapatoms ins-symb symbs) (dolist (sy symbs) (funcall ins-symb (car sy)))) @@ -2183,7 +2183,7 @@ file name, add `tag-partial-file-name-match-p' to the list value.") (setq symbs (symbol-value symbs)) (warn "symbol `%s' has no value" symbs) (setq symbs nil)) - (if (vectorp symbs) + (if (obarrayp symbs) (mapatoms add-xref symbs) (dolist (sy symbs) (funcall add-xref (car sy)))) From 6a182658a533acab94d8fa0aec3e2b7a4f7d6a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sun, 11 Feb 2024 18:30:22 +0100 Subject: [PATCH 280/446] Add obarray-clear and use it * lisp/obarray.el (obarray-clear): New. * lisp/abbrev.el (clear-abbrev-table): * lisp/vc/vc.el (vc-clear-context): Use it instead of assuming the obarray is a vector that can be 0-filled. * test/lisp/obarray-tests.el (obarray-clear): New test. --- lisp/abbrev.el | 3 +-- lisp/obarray.el | 5 +++++ lisp/vc/vc.el | 2 +- test/lisp/obarray-tests.el | 10 ++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lisp/abbrev.el b/lisp/abbrev.el index b523977fed5..188eeb720c0 100644 --- a/lisp/abbrev.el +++ b/lisp/abbrev.el @@ -602,8 +602,7 @@ It is nil if the abbrev has already been unexpanded.") "Undefine all abbrevs in abbrev table TABLE, leaving TABLE empty." (setq abbrevs-changed t) (let* ((sym (obarray-get table ""))) - (dotimes (i (length table)) - (aset table i 0)) + (obarray-clear table) ;; Preserve the table's properties. (cl-assert sym) (let ((newsym (obarray-put table ""))) diff --git a/lisp/obarray.el b/lisp/obarray.el index a26992df8e2..e1ebb2ade51 100644 --- a/lisp/obarray.el +++ b/lisp/obarray.el @@ -66,5 +66,10 @@ Return t on success, nil otherwise." "Call function FN on every symbol in obarray OB and return nil." (mapatoms fn ob)) +(defun obarray-clear (ob) + "Remove all symbols from obarray OB." + ;; FIXME: This doesn't change the symbols to uninterned status. + (fillarray ob 0)) + (provide 'obarray) ;;; obarray.el ends here diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 619b469bebb..3cd17276fa4 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -935,7 +935,7 @@ is sensitive to blank lines." (defun vc-clear-context () "Clear all cached file properties." (interactive) - (fillarray vc-file-prop-obarray 0)) + (obarray-clear vc-file-prop-obarray)) (defmacro with-vc-properties (files form settings) "Execute FORM, then maybe set per-file properties for FILES. diff --git a/test/lisp/obarray-tests.el b/test/lisp/obarray-tests.el index dd8f1c8abd4..dd40d0f4d76 100644 --- a/test/lisp/obarray-tests.el +++ b/test/lisp/obarray-tests.el @@ -89,5 +89,15 @@ (obarray-map collect-names table) (should (equal (sort syms #'string<) '("a" "b" "c"))))) +(ert-deftest obarray-clear () + (let ((o (obarray-make))) + (intern "a" o) + (intern "b" o) + (intern "c" o) + (obarray-clear o) + (let ((n 0)) + (mapatoms (lambda (_) (setq n (1+ n))) o) + (should (equal n 0))))) + (provide 'obarray-tests) ;;; obarray-tests.el ends here From 462d8ba813e07a25b71f5c1b38810a29e21f784c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 10 Feb 2024 21:14:09 +0100 Subject: [PATCH 281/446] Add a proper type for obarrays The new opaque type replaces the previous use of vectors for obarrays. `obarray-make` now returns objects of this type. Functions that take obarrays continue to accept vectors for compatibility, now just using their first slot to store an actual obarray object. obarray-size and obarray-default-size now obsolete. * lisp/obarray.el (obarray-default-size, obarray-size): Declare obsolete. (obarray-make, obarrayp, obarray-clear): Remove from here. * src/fns.c (reduce_emacs_uint_to_hash_hash): Remove from here. * src/lisp.h (struct Lisp_Obarray, OBARRAYP, XOBARRAY, CHECK_OBARRAY) (make_lisp_obarray, obarray_size, check_obarray) (obarray_iter_t, make_obarray_iter, obarray_iter_at_end) (obarray_iter_step, obarray_iter_symbol, DOOBARRAY, knuth_hash): New. (reduce_emacs_uint_to_hash_hash): Moved here. * src/lread.c (check_obarray): Renamed and reworked as... (checked_obarray_slow): ...this. (intern_sym, Funintern, oblookup, map_obarray) (Finternal__obarray_buckets): Adapt to new type. (obarray_index, allocate_obarray, make_obarray, grow_obarray) (obarray_default_bits, Fobarray_make, Fobarrayp, Fobarray_clear): New. * etc/emacs_lldb.py (Lisp_Object): * lisp/emacs-lisp/cl-macs.el (`(,type . ,pred)): * lisp/emacs-lisp/cl-preloaded.el (cl--typeof-types): * lisp/emacs-lisp/comp-common.el (comp-known-type-specifiers): * lisp/emacs-lisp/comp.el (comp-known-predicates): * src/alloc.c (cleanup_vector, process_mark_stack): * src/data.c (Ftype_of, syms_of_data): * src/minibuf.c (Ftry_completion, Fall_completions, Ftest_completion): * src/pdumper.c (dump_obarray_buckets, dump_obarray, dump_vectorlike): * src/print.c (print_vectorlike_unreadable): * test/lisp/abbrev-tests.el (abbrev-make-abbrev-table-test): * test/lisp/obarray-tests.el (obarrayp-test) (obarrayp-unchecked-content-test, obarray-make-default-test) (obarray-make-with-size-test): Adapt to new type. --- etc/emacs_lldb.py | 1 + lisp/emacs-lisp/cl-macs.el | 1 + lisp/emacs-lisp/cl-preloaded.el | 2 +- lisp/emacs-lisp/comp-common.el | 3 +- lisp/emacs-lisp/comp.el | 1 + lisp/emacs-lisp/shortdoc.el | 19 +- lisp/obarray.el | 27 +-- src/alloc.c | 26 ++- src/data.c | 2 + src/fns.c | 17 +- src/lisp.h | 136 ++++++++++++++- src/lread.c | 297 ++++++++++++++++++++++---------- src/minibuf.c | 110 ++++-------- src/pdumper.c | 47 +++++ src/print.c | 10 ++ test/lisp/abbrev-tests.el | 4 +- test/lisp/obarray-tests.el | 22 +-- 17 files changed, 499 insertions(+), 226 deletions(-) diff --git a/etc/emacs_lldb.py b/etc/emacs_lldb.py index fdf4314e2d0..9865fe391a2 100644 --- a/etc/emacs_lldb.py +++ b/etc/emacs_lldb.py @@ -56,6 +56,7 @@ class Lisp_Object: "PVEC_BOOL_VECTOR": "struct Lisp_Bool_Vector", "PVEC_BUFFER": "struct buffer", "PVEC_HASH_TABLE": "struct Lisp_Hash_Table", + "PVEC_OBARRAY": "struct Lisp_Obarray", "PVEC_TERMINAL": "struct terminal", "PVEC_WINDOW_CONFIGURATION": "struct save_window_data", "PVEC_SUBR": "struct Lisp_Subr", diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 44ebadeebff..ddc9775bcce 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -3488,6 +3488,7 @@ Of course, we really can't know that for sure, so it's just a heuristic." (natnum . natnump) (number . numberp) (null . null) + (obarray . obarrayp) (overlay . overlayp) (process . processp) (real . numberp) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index d533eea9e73..840219c2260 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -73,7 +73,7 @@ (module-function function atom) (buffer atom) (char-table array sequence atom) (bool-vector array sequence atom) - (frame atom) (hash-table atom) (terminal atom) + (frame atom) (hash-table atom) (terminal atom) (obarray atom) (thread atom) (mutex atom) (condvar atom) (font-spec atom) (font-entity atom) (font-object atom) (vector array sequence atom) diff --git a/lisp/emacs-lisp/comp-common.el b/lisp/emacs-lisp/comp-common.el index ca21ed05bb4..221f819e474 100644 --- a/lisp/emacs-lisp/comp-common.el +++ b/lisp/emacs-lisp/comp-common.el @@ -240,7 +240,8 @@ Used to modify the compiler environment." (integer-or-marker-p (function (t) boolean)) (integerp (function (t) boolean)) (interactive-p (function () boolean)) - (intern-soft (function ((or string symbol) &optional vector) symbol)) + (intern-soft (function ((or string symbol) &optional (or obarray vector)) + symbol)) (invocation-directory (function () string)) (invocation-name (function () string)) (isnan (function (float) boolean)) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index e0da01bcc5d..ae964b041d0 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -214,6 +214,7 @@ Useful to hook into pass checkers.") (number-or-marker-p . number-or-marker) (numberp . number) (numberp . number) + (obarrayp . obarray) (overlayp . overlay) (processp . process) (sequencep . sequence) diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el index cde28985cd0..cbb5618ffce 100644 --- a/lisp/emacs-lisp/shortdoc.el +++ b/lisp/emacs-lisp/shortdoc.el @@ -747,9 +747,13 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'), (intern :eval (intern "abc")) (intern-soft + :eval (intern-soft "list") :eval (intern-soft "Phooey!")) (make-symbol :eval (make-symbol "abc")) + (gensym + :no-eval (gensym) + :eg-result g37) "Comparing symbols" (eq :eval (eq 'abc 'abc) @@ -760,7 +764,20 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'), :eval (equal 'abc 'abc)) "Name" (symbol-name - :eval (symbol-name 'abc))) + :eval (symbol-name 'abc)) + "Obarrays" + (obarray-make + :eval (obarray-make)) + (obarrayp + :eval (obarrayp (obarray-make)) + :eval (obarrayp nil)) + (unintern + :no-eval (unintern "abc" my-obarray) + :eg-result t) + (mapatoms + :no-eval (mapatoms (lambda (symbol) (print symbol)) my-obarray)) + (obarray-clear + :no-eval (obarray-clear my-obarray))) (define-short-documentation-group comparison "General-purpose" diff --git a/lisp/obarray.el b/lisp/obarray.el index e1ebb2ade51..e6e51c1382a 100644 --- a/lisp/obarray.el +++ b/lisp/obarray.el @@ -27,24 +27,12 @@ ;;; Code: -(defconst obarray-default-size 59 - "The value 59 is an arbitrary prime number that gives a good hash.") +(defconst obarray-default-size 4) +(make-obsolete-variable 'obarray-default-size + "obarrays now grow automatically" "30.1") -(defun obarray-make (&optional size) - "Return a new obarray of size SIZE or `obarray-default-size'." - (let ((size (or size obarray-default-size))) - (if (< 0 size) - (make-vector size 0) - (signal 'wrong-type-argument '(size 0))))) - -(defun obarray-size (ob) - "Return the number of slots of obarray OB." - (length ob)) - -(defun obarrayp (object) - "Return t if OBJECT is an obarray." - (and (vectorp object) - (< 0 (length object)))) +(defun obarray-size (_ob) obarray-default-size) +(make-obsolete 'obarray-size "obarrays now grow automatically" "30.1") ;; Don’t use obarray as a variable name to avoid shadowing. (defun obarray-get (ob name) @@ -66,10 +54,5 @@ Return t on success, nil otherwise." "Call function FN on every symbol in obarray OB and return nil." (mapatoms fn ob)) -(defun obarray-clear (ob) - "Remove all symbols from obarray OB." - ;; FIXME: This doesn't change the symbols to uninterned status. - (fillarray ob 0)) - (provide 'obarray) ;;; obarray.el ends here diff --git a/src/alloc.c b/src/alloc.c index 8c94c7eb33c..2ffd2415447 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -360,13 +360,13 @@ static struct gcstat object_ct total_intervals, total_free_intervals; object_ct total_buffers; - /* Size of the ancillary arrays of live hash-table objects. + /* Size of the ancillary arrays of live hash-table and obarray objects. The objects themselves are not included (counted as vectors above). */ byte_ct total_hash_table_bytes; } gcstat; -/* Total size of ancillary arrays of all allocated hash-table objects, - both dead and alive. This number is always kept up-to-date. */ +/* Total size of ancillary arrays of all allocated hash-table and obarray + objects, both dead and alive. This number is always kept up-to-date. */ static ptrdiff_t hash_table_allocated_bytes = 0; /* Points to memory space allocated as "spare", to be freed if we run @@ -3455,6 +3455,15 @@ cleanup_vector (struct Lisp_Vector *vector) hash_table_allocated_bytes -= bytes; } } + break; + case PVEC_OBARRAY: + { + struct Lisp_Obarray *o = PSEUDOVEC_STRUCT (vector, Lisp_Obarray); + xfree (o->buckets); + ptrdiff_t bytes = obarray_size (o) * sizeof *o->buckets; + hash_table_allocated_bytes -= bytes; + } + break; /* Keep the switch exhaustive. */ case PVEC_NORMAL_VECTOR: case PVEC_FREE: @@ -5632,7 +5641,8 @@ valid_lisp_object_p (Lisp_Object obj) return 0; } -/* Like xmalloc, but makes allocation count toward the total consing. +/* Like xmalloc, but makes allocation count toward the total consing + and hash table or obarray usage. Return NULL for a zero-sized allocation. */ void * hash_table_alloc_bytes (ptrdiff_t nbytes) @@ -7310,6 +7320,14 @@ process_mark_stack (ptrdiff_t base_sp) break; } + case PVEC_OBARRAY: + { + struct Lisp_Obarray *o = (struct Lisp_Obarray *)ptr; + set_vector_marked (ptr); + mark_stack_push_values (o->buckets, obarray_size (o)); + break; + } + case PVEC_CHAR_TABLE: case PVEC_SUB_CHAR_TABLE: mark_char_table (ptr, (enum pvec_type) pvectype); diff --git a/src/data.c b/src/data.c index f2f35fb355a..bb4cdd62d66 100644 --- a/src/data.c +++ b/src/data.c @@ -231,6 +231,7 @@ for example, (type-of 1) returns `integer'. */) case PVEC_BOOL_VECTOR: return Qbool_vector; case PVEC_FRAME: return Qframe; case PVEC_HASH_TABLE: return Qhash_table; + case PVEC_OBARRAY: return Qobarray; case PVEC_FONT: if (FONT_SPEC_P (object)) return Qfont_spec; @@ -4229,6 +4230,7 @@ syms_of_data (void) DEFSYM (Qtreesit_parser, "treesit-parser"); DEFSYM (Qtreesit_node, "treesit-node"); DEFSYM (Qtreesit_compiled_query, "treesit-compiled-query"); + DEFSYM (Qobarray, "obarray"); DEFSYM (Qdefun, "defun"); diff --git a/src/fns.c b/src/fns.c index 550545d1486..0a64e515402 100644 --- a/src/fns.c +++ b/src/fns.c @@ -4450,16 +4450,6 @@ cmpfn_user_defined (Lisp_Object key1, Lisp_Object key2, return hash_table_user_defined_call (ARRAYELTS (args), args, h); } -/* Reduce an EMACS_UINT hash value to hash_hash_t. */ -static inline hash_hash_t -reduce_emacs_uint_to_hash_hash (EMACS_UINT x) -{ - verify (sizeof x <= 2 * sizeof (hash_hash_t)); - return (sizeof x == sizeof (hash_hash_t) - ? x - : x ^ (x >> (8 * (sizeof x - sizeof (hash_hash_t))))); -} - static EMACS_INT sxhash_eq (Lisp_Object key) { @@ -4645,16 +4635,11 @@ copy_hash_table (struct Lisp_Hash_Table *h1) return make_lisp_hash_table (h2); } - /* Compute index into the index vector from a hash value. */ static inline ptrdiff_t hash_index_index (struct Lisp_Hash_Table *h, hash_hash_t hash) { - /* Knuth multiplicative hashing, tailored for 32-bit indices - (avoiding a 64-bit multiply). */ - uint32_t alpha = 2654435769; /* 2**32/phi */ - /* Note the cast to uint64_t, to make it work for index_bits=0. */ - return (uint64_t)((uint32_t)hash * alpha) >> (32 - h->index_bits); + return knuth_hash (hash, h->index_bits); } /* Resize hash table H if it's too full. If H cannot be resized diff --git a/src/lisp.h b/src/lisp.h index b02466390f1..5fbbef80e8e 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1032,6 +1032,7 @@ enum pvec_type PVEC_BOOL_VECTOR, PVEC_BUFFER, PVEC_HASH_TABLE, + PVEC_OBARRAY, PVEC_TERMINAL, PVEC_WINDOW_CONFIGURATION, PVEC_SUBR, @@ -2386,6 +2387,118 @@ INLINE int definition is done by lread.c's define_symbol. */ #define DEFSYM(sym, name) /* empty */ + +struct Lisp_Obarray +{ + union vectorlike_header header; + + /* Array of 2**size_bits values, each being either a (bare) symbol or + the fixnum 0. The symbols for each bucket are chained via + their s.next field. */ + Lisp_Object *buckets; + + unsigned size_bits; /* log2(size of buckets vector) */ + unsigned count; /* number of symbols in obarray */ +}; + +INLINE bool +OBARRAYP (Lisp_Object a) +{ + return PSEUDOVECTORP (a, PVEC_OBARRAY); +} + +INLINE struct Lisp_Obarray * +XOBARRAY (Lisp_Object a) +{ + eassert (OBARRAYP (a)); + return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Obarray); +} + +INLINE void +CHECK_OBARRAY (Lisp_Object x) +{ + CHECK_TYPE (OBARRAYP (x), Qobarrayp, x); +} + +INLINE Lisp_Object +make_lisp_obarray (struct Lisp_Obarray *o) +{ + eassert (PSEUDOVECTOR_TYPEP (&o->header, PVEC_OBARRAY)); + return make_lisp_ptr (o, Lisp_Vectorlike); +} + +INLINE ptrdiff_t +obarray_size (const struct Lisp_Obarray *o) +{ + return (ptrdiff_t)1 << o->size_bits; +} + +Lisp_Object check_obarray_slow (Lisp_Object); + +/* Return an obarray object from OBARRAY or signal an error. */ +INLINE Lisp_Object +check_obarray (Lisp_Object obarray) +{ + return OBARRAYP (obarray) ? obarray : check_obarray_slow (obarray); +} + +/* Obarray iterator state. Don't access these members directly. + The iterator functions must be called in the order followed by DOOBARRAY. */ +typedef struct { + struct Lisp_Obarray *o; + ptrdiff_t idx; /* Current bucket index. */ + struct Lisp_Symbol *symbol; /* Current symbol, or NULL if at end + of current bucket. */ +} obarray_iter_t; + +INLINE obarray_iter_t +make_obarray_iter (struct Lisp_Obarray *oa) +{ + return (obarray_iter_t){.o = oa, .idx = -1, .symbol = NULL}; +} + +/* Whether IT has reached the end and there are no more symbols. + If true, IT is dead and cannot be used any more. */ +INLINE bool +obarray_iter_at_end (obarray_iter_t *it) +{ + if (it->symbol) + return false; + ptrdiff_t size = obarray_size (it->o); + while (++it->idx < size) + { + Lisp_Object obj = it->o->buckets[it->idx]; + if (!BASE_EQ (obj, make_fixnum (0))) + { + it->symbol = XBARE_SYMBOL (obj); + return false; + } + } + return true; +} + +/* Advance IT to the next symbol if any. */ +INLINE void +obarray_iter_step (obarray_iter_t *it) +{ + it->symbol = it->symbol->u.s.next; +} + +/* The Lisp symbol at IT, if obarray_iter_at_end returned false. */ +INLINE Lisp_Object +obarray_iter_symbol (obarray_iter_t *it) +{ + return make_lisp_symbol (it->symbol); +} + +/* Iterate IT over the symbols of the obarray OA. + The body shouldn't add or remove symbols in OA, but disobeying that rule + only risks symbols to be iterated more than once or not at all, + not crashes or data corruption. */ +#define DOOBARRAY(oa, it) \ + for (obarray_iter_t it = make_obarray_iter (oa); \ + !obarray_iter_at_end (&it); obarray_iter_step (&it)) + /*********************************************************************** Hash Tables @@ -2666,6 +2779,28 @@ SXHASH_REDUCE (EMACS_UINT x) return (x ^ x >> (EMACS_INT_WIDTH - FIXNUM_BITS)) & INTMASK; } +/* Reduce an EMACS_UINT hash value to hash_hash_t. */ +INLINE hash_hash_t +reduce_emacs_uint_to_hash_hash (EMACS_UINT x) +{ + verify (sizeof x <= 2 * sizeof (hash_hash_t)); + return (sizeof x == sizeof (hash_hash_t) + ? x + : x ^ (x >> (8 * (sizeof x - sizeof (hash_hash_t))))); +} + +/* Reduce HASH to a value BITS wide. */ +INLINE ptrdiff_t +knuth_hash (hash_hash_t hash, unsigned bits) +{ + /* Knuth multiplicative hashing, tailored for 32-bit indices + (avoiding a 64-bit multiply). */ + uint32_t alpha = 2654435769; /* 2**32/phi */ + /* Note the cast to uint64_t, to make it work for bits=0. */ + return (uint64_t)((uint32_t)hash * alpha) >> (32 - bits); +} + + struct Lisp_Marker { union vectorlike_header header; @@ -4585,7 +4720,6 @@ extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char *, ptrdiff_t, ATTRIBUTE_FORMAT_PRINTF (5, 0); /* Defined in lread.c. */ -extern Lisp_Object check_obarray (Lisp_Object); extern Lisp_Object intern_1 (const char *, ptrdiff_t); extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t); extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, Lisp_Object); diff --git a/src/lread.c b/src/lread.c index c11c641440d..c4a34c5d73f 100644 --- a/src/lread.c +++ b/src/lread.c @@ -4886,30 +4886,43 @@ static Lisp_Object initial_obarray; static size_t oblookup_last_bucket_number; -/* Get an error if OBARRAY is not an obarray. - If it is one, return it. */ +static Lisp_Object make_obarray (unsigned bits); +/* Slow path obarray check: return the obarray to use or signal an error. */ Lisp_Object -check_obarray (Lisp_Object obarray) +check_obarray_slow (Lisp_Object obarray) { - /* We don't want to signal a wrong-type-argument error when we are - shutting down due to a fatal error, and we don't want to hit - assertions in VECTORP and ASIZE if the fatal error was during GC. */ - if (!fatal_error_in_progress - && (!VECTORP (obarray) || ASIZE (obarray) == 0)) + /* For compatibility, we accept vectors whose first element is 0, + and store an obarray object there. */ + if (VECTORP (obarray) && ASIZE (obarray) > 0) { - /* If Vobarray is now invalid, force it to be valid. */ - if (EQ (Vobarray, obarray)) Vobarray = initial_obarray; - wrong_type_argument (Qvectorp, obarray); + Lisp_Object obj = AREF (obarray, 0); + if (OBARRAYP (obj)) + return obj; + if (BASE_EQ (obj, make_fixnum (0))) + { + /* Put an actual obarray object in the first slot. + The rest of the vector remains unused. */ + obj = make_obarray (0); + ASET (obarray, 0, obj); + return obj; + } } - return obarray; + /* Reset Vobarray to the standard obarray for nicer error handling. */ + if (BASE_EQ (Vobarray, obarray)) Vobarray = initial_obarray; + + wrong_type_argument (Qobarrayp, obarray); } +static void grow_obarray (struct Lisp_Obarray *o); + /* Intern symbol SYM in OBARRAY using bucket INDEX. */ +/* FIXME: retype arguments as pure C types */ static Lisp_Object intern_sym (Lisp_Object sym, Lisp_Object obarray, Lisp_Object index) { + eassert (BARE_SYMBOL_P (sym) && OBARRAYP (obarray) && FIXNUMP (index)); struct Lisp_Symbol *s = XBARE_SYMBOL (sym); s->u.s.interned = (BASE_EQ (obarray, initial_obarray) ? SYMBOL_INTERNED_IN_INITIAL_OBARRAY @@ -4925,9 +4938,13 @@ intern_sym (Lisp_Object sym, Lisp_Object obarray, Lisp_Object index) SET_SYMBOL_VAL (s, sym); } - Lisp_Object *ptr = aref_addr (obarray, XFIXNUM (index)); + struct Lisp_Obarray *o = XOBARRAY (obarray); + Lisp_Object *ptr = o->buckets + XFIXNUM (index); s->u.s.next = BARE_SYMBOL_P (*ptr) ? XBARE_SYMBOL (*ptr) : NULL; *ptr = sym; + o->count++; + if (o->count > obarray_size (o)) + grow_obarray (o); return sym; } @@ -5082,7 +5099,6 @@ usage: (unintern NAME OBARRAY) */) { register Lisp_Object tem; Lisp_Object string; - size_t hash; if (NILP (obarray)) obarray = Vobarray; obarray = check_obarray (obarray); @@ -5122,41 +5138,42 @@ usage: (unintern NAME OBARRAY) */) /* if (NILP (tem) || EQ (tem, Qt)) error ("Attempt to unintern t or nil"); */ - XBARE_SYMBOL (tem)->u.s.interned = SYMBOL_UNINTERNED; + struct Lisp_Symbol *sym = XBARE_SYMBOL (tem); + sym->u.s.interned = SYMBOL_UNINTERNED; - hash = oblookup_last_bucket_number; + ptrdiff_t idx = oblookup_last_bucket_number; + Lisp_Object *loc = &XOBARRAY (obarray)->buckets[idx]; - if (BASE_EQ (AREF (obarray, hash), tem)) - { - if (XBARE_SYMBOL (tem)->u.s.next) - { - Lisp_Object sym; - XSETSYMBOL (sym, XBARE_SYMBOL (tem)->u.s.next); - ASET (obarray, hash, sym); - } - else - ASET (obarray, hash, make_fixnum (0)); - } + eassert (BARE_SYMBOL_P (*loc)); + struct Lisp_Symbol *prev = XBARE_SYMBOL (*loc); + if (sym == prev) + *loc = sym->u.s.next ? make_lisp_symbol (sym->u.s.next) : make_fixnum (0); else - { - Lisp_Object tail, following; + while (1) + { + struct Lisp_Symbol *next = prev->u.s.next; + if (next == sym) + { + prev->u.s.next = next->u.s.next; + break; + } + prev = next; + } - for (tail = AREF (obarray, hash); - XBARE_SYMBOL (tail)->u.s.next; - tail = following) - { - XSETSYMBOL (following, XBARE_SYMBOL (tail)->u.s.next); - if (BASE_EQ (following, tem)) - { - set_symbol_next (tail, XBARE_SYMBOL (following)->u.s.next); - break; - } - } - } + XOBARRAY (obarray)->count--; return Qt; } + +/* Bucket index of the string STR of length SIZE_BYTE bytes in obarray OA. */ +static ptrdiff_t +obarray_index (struct Lisp_Obarray *oa, const char *str, ptrdiff_t size_byte) +{ + EMACS_UINT hash = hash_string (str, size_byte); + return knuth_hash (reduce_emacs_uint_to_hash_hash (hash), oa->size_bits); +} + /* Return the symbol in OBARRAY whose names matches the string of SIZE characters (SIZE_BYTE bytes) at PTR. If there is no such symbol, return the integer bucket number of @@ -5167,36 +5184,27 @@ usage: (unintern NAME OBARRAY) */) Lisp_Object oblookup (Lisp_Object obarray, register const char *ptr, ptrdiff_t size, ptrdiff_t size_byte) { - size_t hash; - size_t obsize; - register Lisp_Object tail; - Lisp_Object bucket, tem; + struct Lisp_Obarray *o = XOBARRAY (obarray); + ptrdiff_t idx = obarray_index (o, ptr, size_byte); + Lisp_Object bucket = o->buckets[idx]; - obarray = check_obarray (obarray); - /* This is sometimes needed in the middle of GC. */ - obsize = gc_asize (obarray); - hash = hash_string (ptr, size_byte) % obsize; - bucket = AREF (obarray, hash); - oblookup_last_bucket_number = hash; - if (BASE_EQ (bucket, make_fixnum (0))) - ; - else if (!BARE_SYMBOL_P (bucket)) - /* Like CADR error message. */ - xsignal2 (Qwrong_type_argument, Qobarrayp, - build_string ("Bad data in guts of obarray")); - else - for (tail = bucket; ; XSETSYMBOL (tail, XBARE_SYMBOL (tail)->u.s.next)) - { - Lisp_Object name = XBARE_SYMBOL (tail)->u.s.name; - if (SBYTES (name) == size_byte - && SCHARS (name) == size - && !memcmp (SDATA (name), ptr, size_byte)) - return tail; - else if (XBARE_SYMBOL (tail)->u.s.next == 0) - break; - } - XSETINT (tem, hash); - return tem; + oblookup_last_bucket_number = idx; + if (!BASE_EQ (bucket, make_fixnum (0))) + { + Lisp_Object sym = bucket; + while (1) + { + struct Lisp_Symbol *s = XBARE_SYMBOL (sym); + Lisp_Object name = s->u.s.name; + if (SBYTES (name) == size_byte && SCHARS (name) == size + && memcmp (SDATA (name), ptr, size_byte) == 0) + return sym; + if (s->u.s.next == NULL) + break; + sym = make_lisp_symbol(s->u.s.next); + } + } + return make_fixnum (idx); } /* Like 'oblookup', but considers 'Vread_symbol_shorthands', @@ -5263,24 +5271,134 @@ oblookup_considering_shorthand (Lisp_Object obarray, const char *in, } -void -map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg) +static struct Lisp_Obarray * +allocate_obarray (void) { - ptrdiff_t i; - register Lisp_Object tail; - CHECK_VECTOR (obarray); - for (i = ASIZE (obarray) - 1; i >= 0; i--) + return ALLOCATE_PLAIN_PSEUDOVECTOR (struct Lisp_Obarray, PVEC_OBARRAY); +} + +static Lisp_Object +make_obarray (unsigned bits) +{ + struct Lisp_Obarray *o = allocate_obarray (); + o->count = 0; + o->size_bits = bits; + ptrdiff_t size = (ptrdiff_t)1 << bits; + o->buckets = hash_table_alloc_bytes (size * sizeof *o->buckets); + for (ptrdiff_t i = 0; i < size; i++) + o->buckets[i] = make_fixnum (0); + return make_lisp_obarray (o); +} + +enum { + obarray_default_bits = 3, + word_size_log2 = word_size < 8 ? 5 : 6, /* good enough */ + obarray_max_bits = min (8 * sizeof (int), + 8 * sizeof (ptrdiff_t) - word_size_log2) - 1, +}; + +static void +grow_obarray (struct Lisp_Obarray *o) +{ + ptrdiff_t old_size = obarray_size (o); + eassert (o->count > old_size); + Lisp_Object *old_buckets = o->buckets; + + int new_bits = o->size_bits + 1; + if (new_bits > obarray_max_bits) + error ("Obarray too big"); + ptrdiff_t new_size = (ptrdiff_t)1 << new_bits; + o->buckets = hash_table_alloc_bytes (new_size * sizeof *o->buckets); + for (ptrdiff_t i = 0; i < new_size; i++) + o->buckets[i] = make_fixnum (0); + o->size_bits = new_bits; + + /* Rehash symbols. + FIXME: this is expensive since we need to recompute the hash for every + symbol name. Would it be reasonable to store it in the symbol? */ + for (ptrdiff_t i = 0; i < old_size; i++) { - tail = AREF (obarray, i); - if (BARE_SYMBOL_P (tail)) - while (1) - { - (*fn) (tail, arg); - if (XBARE_SYMBOL (tail)->u.s.next == 0) - break; - XSETSYMBOL (tail, XBARE_SYMBOL (tail)->u.s.next); - } + Lisp_Object obj = old_buckets[i]; + if (BARE_SYMBOL_P (obj)) + { + struct Lisp_Symbol *s = XBARE_SYMBOL (obj); + while (1) + { + Lisp_Object name = s->u.s.name; + ptrdiff_t idx = obarray_index (o, SSDATA (name), SBYTES (name)); + Lisp_Object *loc = o->buckets + idx; + struct Lisp_Symbol *next = s->u.s.next; + s->u.s.next = BARE_SYMBOL_P (*loc) ? XBARE_SYMBOL (*loc) : NULL; + *loc = make_lisp_symbol (s); + if (next == NULL) + break; + s = next; + } + } } + + hash_table_free_bytes (old_buckets, old_size * sizeof *old_buckets); +} + +DEFUN ("obarray-make", Fobarray_make, Sobarray_make, 0, 1, 0, + doc: /* Return a new obarray of size SIZE. +The obarray will grow to accommodate any number of symbols; the size, if +given, is only a hint for the expected number. */) + (Lisp_Object size) +{ + int bits; + if (NILP (size)) + bits = obarray_default_bits; + else + { + CHECK_FIXNAT (size); + EMACS_UINT n = XFIXNUM (size); + bits = elogb (n) + 1; + if (bits > obarray_max_bits) + xsignal (Qargs_out_of_range, size); + } + return make_obarray (bits); +} + +DEFUN ("obarrayp", Fobarrayp, Sobarrayp, 1, 1, 0, + doc: /* Return t iff OBJECT is an obarray. */) + (Lisp_Object object) +{ + return OBARRAYP (object) ? Qt : Qnil; +} + +DEFUN ("obarray-clear", Fobarray_clear, Sobarray_clear, 1, 1, 0, + doc: /* Remove all symbols from OBARRAY. */) + (Lisp_Object obarray) +{ + CHECK_OBARRAY (obarray); + struct Lisp_Obarray *o = XOBARRAY (obarray); + + /* This function does not bother setting the status of its contained symbols + to uninterned. It doesn't matter very much. */ + int new_bits = obarray_default_bits; + int new_size = (ptrdiff_t)1 << new_bits; + Lisp_Object *new_buckets + = hash_table_alloc_bytes (new_size * sizeof *new_buckets); + for (ptrdiff_t i = 0; i < new_size; i++) + new_buckets[i] = make_fixnum (0); + + int old_size = obarray_size (o); + hash_table_free_bytes (o->buckets, old_size * sizeof *o->buckets); + o->buckets = new_buckets; + o->size_bits = new_bits; + o->count = 0; + + return Qnil; +} + +void +map_obarray (Lisp_Object obarray, + void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg) +{ + CHECK_OBARRAY (obarray); + DOOBARRAY (XOBARRAY (obarray), it) + (*fn) (obarray_iter_symbol (&it), arg); } static void @@ -5307,12 +5425,13 @@ DEFUN ("internal--obarray-buckets", (Lisp_Object obarray) { obarray = check_obarray (obarray); - ptrdiff_t size = ASIZE (obarray); + ptrdiff_t size = obarray_size (XOBARRAY (obarray)); + Lisp_Object ret = Qnil; for (ptrdiff_t i = 0; i < size; i++) { Lisp_Object bucket = Qnil; - Lisp_Object sym = AREF (obarray, i); + Lisp_Object sym = XOBARRAY (obarray)->buckets[i]; if (BARE_SYMBOL_P (sym)) while (1) { @@ -5332,6 +5451,7 @@ DEFUN ("internal--obarray-buckets", void init_obarray_once (void) { + /* FIXME: use PVEC_OBARRAY */ Vobarray = make_vector (OBARRAY_SIZE, make_fixnum (0)); initial_obarray = Vobarray; staticpro (&initial_obarray); @@ -5715,6 +5835,9 @@ syms_of_lread (void) defsubr (&Smapatoms); defsubr (&Slocate_file_internal); defsubr (&Sinternal__obarray_buckets); + defsubr (&Sobarray_make); + defsubr (&Sobarrayp); + defsubr (&Sobarray_clear); DEFVAR_LISP ("obarray", Vobarray, doc: /* Symbol table for use by `intern' and `read'. diff --git a/src/minibuf.c b/src/minibuf.c index 7c0c9799a60..df6ca7ce1d8 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -1615,13 +1615,15 @@ or from one of the possible completions. */) ptrdiff_t bestmatchsize = 0; /* These are in bytes, too. */ ptrdiff_t compare, matchsize; + if (VECTORP (collection)) + collection = check_obarray (collection); enum { function_table, list_table, obarray_table, hash_table} type = (HASH_TABLE_P (collection) ? hash_table - : VECTORP (collection) ? obarray_table + : OBARRAYP (collection) ? obarray_table : ((NILP (collection) || (CONSP (collection) && !FUNCTIONP (collection))) ? list_table : function_table)); - ptrdiff_t idx = 0, obsize = 0; + ptrdiff_t idx = 0; int matchcount = 0; Lisp_Object bucket, zero, end, tem; @@ -1634,12 +1636,9 @@ or from one of the possible completions. */) /* If COLLECTION is not a list, set TAIL just for gc pro. */ tail = collection; + obarray_iter_t obit; if (type == obarray_table) - { - collection = check_obarray (collection); - obsize = ASIZE (collection); - bucket = AREF (collection, idx); - } + obit = make_obarray_iter (XOBARRAY (collection)); while (1) { @@ -1658,24 +1657,10 @@ or from one of the possible completions. */) } else if (type == obarray_table) { - if (!EQ (bucket, zero)) - { - if (!SYMBOLP (bucket)) - error ("Bad data in guts of obarray"); - elt = bucket; - eltstring = elt; - if (XSYMBOL (bucket)->u.s.next) - XSETSYMBOL (bucket, XSYMBOL (bucket)->u.s.next); - else - XSETFASTINT (bucket, 0); - } - else if (++idx >= obsize) + if (obarray_iter_at_end (&obit)) break; - else - { - bucket = AREF (collection, idx); - continue; - } + elt = eltstring = obarray_iter_symbol (&obit); + obarray_iter_step (&obit); } else /* if (type == hash_table) */ { @@ -1858,10 +1843,12 @@ with a space are ignored unless STRING itself starts with a space. */) { Lisp_Object tail, elt, eltstring; Lisp_Object allmatches; + if (VECTORP (collection)) + collection = check_obarray (collection); int type = HASH_TABLE_P (collection) ? 3 - : VECTORP (collection) ? 2 + : OBARRAYP (collection) ? 2 : NILP (collection) || (CONSP (collection) && !FUNCTIONP (collection)); - ptrdiff_t idx = 0, obsize = 0; + ptrdiff_t idx = 0; Lisp_Object bucket, tem, zero; CHECK_STRING (string); @@ -1872,12 +1859,9 @@ with a space are ignored unless STRING itself starts with a space. */) /* If COLLECTION is not a list, set TAIL just for gc pro. */ tail = collection; + obarray_iter_t obit; if (type == 2) - { - collection = check_obarray (collection); - obsize = ASIZE (collection); - bucket = AREF (collection, idx); - } + obit = make_obarray_iter (XOBARRAY (collection)); while (1) { @@ -1896,24 +1880,10 @@ with a space are ignored unless STRING itself starts with a space. */) } else if (type == 2) { - if (!EQ (bucket, zero)) - { - if (!SYMBOLP (bucket)) - error ("Bad data in guts of obarray"); - elt = bucket; - eltstring = elt; - if (XSYMBOL (bucket)->u.s.next) - XSETSYMBOL (bucket, XSYMBOL (bucket)->u.s.next); - else - XSETFASTINT (bucket, 0); - } - else if (++idx >= obsize) + if (obarray_iter_at_end (&obit)) break; - else - { - bucket = AREF (collection, idx); - continue; - } + elt = eltstring = obarray_iter_symbol (&obit); + obarray_iter_step (&obit); } else /* if (type == 3) */ { @@ -2059,7 +2029,7 @@ If COLLECTION is a function, it is called with three arguments: the values STRING, PREDICATE and `lambda'. */) (Lisp_Object string, Lisp_Object collection, Lisp_Object predicate) { - Lisp_Object tail, tem = Qnil, arg = Qnil; + Lisp_Object tem = Qnil, arg = Qnil; CHECK_STRING (string); @@ -2069,38 +2039,30 @@ the values STRING, PREDICATE and `lambda'. */) if (NILP (tem)) return Qnil; } - else if (VECTORP (collection)) + else if (OBARRAYP (collection) || VECTORP (collection)) { + collection = check_obarray (collection); /* Bypass intern-soft as that loses for nil. */ tem = oblookup (collection, SSDATA (string), SCHARS (string), SBYTES (string)); - if (completion_ignore_case && !SYMBOLP (tem)) - { - for (ptrdiff_t i = ASIZE (collection) - 1; i >= 0; i--) - { - tail = AREF (collection, i); - if (SYMBOLP (tail)) - while (1) - { - if (BASE_EQ (Fcompare_strings (string, make_fixnum (0), - Qnil, - Fsymbol_name (tail), - make_fixnum (0) , Qnil, Qt), - Qt)) - { - tem = tail; - break; - } - if (XSYMBOL (tail)->u.s.next == 0) - break; - XSETSYMBOL (tail, XSYMBOL (tail)->u.s.next); - } - } - } + if (completion_ignore_case && !BARE_SYMBOL_P (tem)) + DOOBARRAY (XOBARRAY (collection), it) + { + Lisp_Object obj = obarray_iter_symbol (&it); + if (BASE_EQ (Fcompare_strings (string, make_fixnum (0), + Qnil, + Fsymbol_name (obj), + make_fixnum (0) , Qnil, Qt), + Qt)) + { + tem = obj; + break; + } + } - if (!SYMBOLP (tem)) + if (!BARE_SYMBOL_P (tem)) return Qnil; } else if (HASH_TABLE_P (collection)) diff --git a/src/pdumper.c b/src/pdumper.c index 778d8facabd..ca457858219 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2748,6 +2748,51 @@ dump_hash_table (struct dump_context *ctx, Lisp_Object object) return offset; } +static dump_off +dump_obarray_buckets (struct dump_context *ctx, const struct Lisp_Obarray *o) +{ + dump_align_output (ctx, DUMP_ALIGNMENT); + dump_off start_offset = ctx->offset; + ptrdiff_t n = obarray_size (o); + + struct dump_flags old_flags = ctx->flags; + ctx->flags.pack_objects = true; + + for (ptrdiff_t i = 0; i < n; i++) + { + Lisp_Object out; + const Lisp_Object *slot = &o->buckets[i]; + dump_object_start (ctx, &out, sizeof out); + dump_field_lv (ctx, &out, slot, slot, WEIGHT_STRONG); + dump_object_finish (ctx, &out, sizeof out); + } + + ctx->flags = old_flags; + return start_offset; +} + +static dump_off +dump_obarray (struct dump_context *ctx, Lisp_Object object) +{ +#if CHECK_STRUCTS && !defined HASH_Lisp_Obarray_XXXXXXXXXX +# error "Lisp_Hash_Table changed. See CHECK_STRUCTS comment in config.h." +#endif + const struct Lisp_Obarray *in_oa = XOBARRAY (object); + struct Lisp_Obarray munged_oa = *in_oa; + struct Lisp_Obarray *oa = &munged_oa; + START_DUMP_PVEC (ctx, &oa->header, struct Lisp_Obarray, out); + dump_pseudovector_lisp_fields (ctx, &out->header, &oa->header); + DUMP_FIELD_COPY (out, oa, count); + DUMP_FIELD_COPY (out, oa, size_bits); + dump_field_fixup_later (ctx, out, oa, &oa->buckets); + dump_off offset = finish_dump_pvec (ctx, &out->header); + dump_remember_fixup_ptr_raw + (ctx, + offset + dump_offsetof (struct Lisp_Obarray, buckets), + dump_obarray_buckets (ctx, oa)); + return offset; +} + static dump_off dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer) { @@ -3031,6 +3076,8 @@ dump_vectorlike (struct dump_context *ctx, return dump_bool_vector(ctx, v); case PVEC_HASH_TABLE: return dump_hash_table (ctx, lv); + case PVEC_OBARRAY: + return dump_obarray (ctx, lv); case PVEC_BUFFER: return dump_buffer (ctx, XBUFFER (lv)); case PVEC_SUBR: diff --git a/src/print.c b/src/print.c index e2252562915..76c577ec800 100644 --- a/src/print.c +++ b/src/print.c @@ -2078,6 +2078,16 @@ print_vectorlike_unreadable (Lisp_Object obj, Lisp_Object printcharfun, } return; + case PVEC_OBARRAY: + { + struct Lisp_Obarray *o = XOBARRAY (obj); + /* FIXME: Would it make sense to print the actual symbols (up to + a limit)? */ + int i = sprintf (buf, "#", o->count); + strout (buf, i, i, printcharfun); + return; + } + /* Types handled earlier. */ case PVEC_NORMAL_VECTOR: case PVEC_RECORD: diff --git a/test/lisp/abbrev-tests.el b/test/lisp/abbrev-tests.el index bfdfac8be1b..cdd1a7832d3 100644 --- a/test/lisp/abbrev-tests.el +++ b/test/lisp/abbrev-tests.el @@ -57,12 +57,10 @@ (ert-deftest abbrev-make-abbrev-table-test () ;; Table without properties: (let ((table (make-abbrev-table))) - (should (abbrev-table-p table)) - (should (= (length table) obarray-default-size))) + (should (abbrev-table-p table))) ;; Table with one property 'foo with value 'bar: (let ((table (make-abbrev-table '(foo bar)))) (should (abbrev-table-p table)) - (should (= (length table) obarray-default-size)) (should (eq (abbrev-table-get table 'foo) 'bar)))) (ert-deftest abbrev--table-symbols-test () diff --git a/test/lisp/obarray-tests.el b/test/lisp/obarray-tests.el index dd40d0f4d76..f9f97dba535 100644 --- a/test/lisp/obarray-tests.el +++ b/test/lisp/obarray-tests.el @@ -32,28 +32,18 @@ (should-not (obarrayp "aoeu")) (should-not (obarrayp '())) (should-not (obarrayp [])) - (should (obarrayp (obarray-make 7))) - (should (obarrayp (make-vector 7 0)))) ; for compatibility? - -(ert-deftest obarrayp-unchecked-content-test () - "Should fail to check content of passed obarray." - :expected-result :failed (should-not (obarrayp ["a" "b" "c"])) - (should-not (obarrayp [1 2 3]))) - -(ert-deftest obarray-make-default-test () - (let ((table (obarray-make))) - (should (obarrayp table)) - (should (eq (obarray-size table) obarray-default-size)))) + (should-not (obarrayp [1 2 3])) + (should-not (obarrayp (make-vector 7 0))) + (should-not (obarrayp (vector (obarray-make)))) + (should (obarrayp (obarray-make))) + (should (obarrayp (obarray-make 7)))) (ert-deftest obarray-make-with-size-test () ;; FIXME: Actually, `wrong-type-argument' is not the right error to signal, ;; so we shouldn't enforce this misbehavior in tests! (should-error (obarray-make -1) :type 'wrong-type-argument) - (should-error (obarray-make 0) :type 'wrong-type-argument) - (let ((table (obarray-make 1))) - (should (obarrayp table)) - (should (eq (obarray-size table) 1)))) + (should-error (obarray-make 'a) :type 'wrong-type-argument)) (ert-deftest obarray-get-test () (let ((table (obarray-make 3))) From 3ea77c735de975ebda707e0e1e8bb5e0adad2bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sun, 11 Feb 2024 15:11:21 +0100 Subject: [PATCH 282/446] Use the new obarray type for the initial obarray This can improve performance a lot, especially after the obarray has been fed many symbols. * src/lread.c (OBARRAY_SIZE): Remove. (load_path_check): Create an obarray object instead of a vector. --- src/lread.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lread.c b/src/lread.c index c4a34c5d73f..49683d02401 100644 --- a/src/lread.c +++ b/src/lread.c @@ -5446,13 +5446,10 @@ DEFUN ("internal--obarray-buckets", return Fnreverse (ret); } -#define OBARRAY_SIZE 15121 - void init_obarray_once (void) { - /* FIXME: use PVEC_OBARRAY */ - Vobarray = make_vector (OBARRAY_SIZE, make_fixnum (0)); + Vobarray = make_obarray (15); initial_obarray = Vobarray; staticpro (&initial_obarray); From 6803b70c1972bc82f7dc1f1d6bbb2a60b6f40367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 17 Feb 2024 13:27:25 +0100 Subject: [PATCH 283/446] Update NEWS and manual after obarray changes * doc/lispref/abbrevs.texi (Abbrev Tables): * doc/lispref/symbols.texi (Creating Symbols): * doc/lispref/objects.texi (Type Predicates): Update text for obarray now being an opaque type. * etc/NEWS: Announce. --- doc/lispref/abbrevs.texi | 2 +- doc/lispref/objects.texi | 5 +++- doc/lispref/symbols.texi | 63 ++++++++++++++-------------------------- etc/NEWS | 20 +++++++++++++ 4 files changed, 47 insertions(+), 43 deletions(-) diff --git a/doc/lispref/abbrevs.texi b/doc/lispref/abbrevs.texi index 9b719145584..d89cec4bc2b 100644 --- a/doc/lispref/abbrevs.texi +++ b/doc/lispref/abbrevs.texi @@ -65,7 +65,7 @@ expanded in the buffer. For the user-level commands for abbrevs, see @defun make-abbrev-table &optional props This function creates and returns a new, empty abbrev table---an -obarray containing no symbols. It is a vector filled with zeros. +obarray containing no symbols. @var{props} is a property list that is applied to the new table (@pxref{Abbrev Table Properties}). @end defun diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index b8fd5ed4345..e6def69454e 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -2121,6 +2121,9 @@ with references to further information. @item numberp @xref{Predicates on Numbers, numberp}. +@item obarrayp +@xref{Creating Symbols, obarrayp}. + @item overlayp @xref{Overlays, overlayp}. @@ -2181,7 +2184,7 @@ This function returns a symbol naming the primitive type of @code{condition-variable}, @code{cons}, @code{finalizer}, @code{float}, @code{font-entity}, @code{font-object}, @code{font-spec}, @code{frame}, @code{hash-table}, @code{integer}, -@code{marker}, @code{mutex}, @code{overlay}, @code{process}, +@code{marker}, @code{mutex}, @code{obarray}, @code{overlay}, @code{process}, @code{string}, @code{subr}, @code{symbol}, @code{thread}, @code{vector}, @code{window}, or @code{window-configuration}. However, if @var{object} is a record, the type specified by its first diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi index e95e53d972d..5207ea4ea7b 100644 --- a/doc/lispref/symbols.texi +++ b/doc/lispref/symbols.texi @@ -177,34 +177,16 @@ know how Lisp reads them. Lisp must ensure that it finds the same symbol every time it reads the same sequence of characters in the same context. Failure to do so would cause complete confusion. -@cindex symbol name hashing -@cindex hashing @cindex obarray -@cindex bucket (in obarray) When the Lisp reader encounters a name that references a symbol in -the source code, it reads all the characters of that name. Then it -looks up that name in a table called an @dfn{obarray} to find the -symbol that the programmer meant. The technique used in this lookup -is called ``hashing'', an efficient method of looking something up by -converting a sequence of characters to a number, known as a ``hash -code''. For example, instead of searching a telephone book cover to -cover when looking up Jan Jones, you start with the J's and go from -there. That is a simple version of hashing. Each element of the -obarray is a @dfn{bucket} which holds all the symbols with a given -hash code; to look for a given name, it is sufficient to look through -all the symbols in the bucket for that name's hash code. (The same -idea is used for general Emacs hash tables, but they are a different -data type; see @ref{Hash Tables}.) +the source code, it looks up that name in a table called an @dfn{obarray} +to find the symbol that the programmer meant. An obarray is an unordered +container of symbols, indexed by name. -When looking up names, the Lisp reader also considers ``shorthands''. +The Lisp reader also considers ``shorthands''. If the programmer supplied them, this allows the reader to find a symbol even if its name isn't present in its full form in the source -code. Of course, the reader needs to be aware of some pre-established -context about such shorthands, much as one needs context to be to able -to refer uniquely to Jan Jones by just the name ``Jan'': it's probably -fine when amongst the Joneses, or when Jan has been mentioned -recently, but very ambiguous in any other situation. -@xref{Shorthands}. +code. @xref{Shorthands}. @cindex interning If a symbol with the desired name is found, the reader uses that @@ -236,23 +218,6 @@ to gain access to it is by finding it in some other object or as the value of a variable. Uninterned symbols are sometimes useful in generating Lisp code, see below. - In Emacs Lisp, an obarray is actually a vector. Each element of the -vector is a bucket; its value is either an interned symbol whose name -hashes to that bucket, or 0 if the bucket is empty. Each interned -symbol has an internal link (invisible to the user) to the next symbol -in the bucket. Because these links are invisible, there is no way to -find all the symbols in an obarray except using @code{mapatoms} (below). -The order of symbols in a bucket is not significant. - - In an empty obarray, every element is 0, so you can create an obarray -with @code{(make-vector @var{length} 0)}. @strong{This is the only -valid way to create an obarray.} Prime numbers as lengths tend -to result in good hashing; lengths one less than a power of two are also -good. - - @strong{Do not try to put symbols in an obarray yourself.} This does -not work---only @code{intern} can enter a symbol in an obarray properly. - @cindex CL note---symbol in obarrays @quotation @b{Common Lisp note:} Unlike Common Lisp, Emacs Lisp does not provide @@ -262,9 +227,21 @@ Emacs Lisp provides a different namespacing system called ``shorthands'' (@pxref{Shorthands}). @end quotation +@defun obarray-make &optional size +This function creates and returns a new obarray. +The optional @var{size} may be used to specify the number of symbols +that it is expected to hold, but since obarrays grow automatically +as needed, this rarely provide any benefit. +@end defun + +@defun obarrayp object +This function returns @code{t} if @var{object} is an obarray, +@code{nil} otherwise. +@end defun + Most of the functions below take a name and sometimes an obarray as arguments. A @code{wrong-type-argument} error is signaled if the name -is not a string, or if the obarray is not a vector. +is not a string, or if the obarray is not an obarray object. @defun symbol-name symbol This function returns the string that is @var{symbol}'s name. For example: @@ -416,6 +393,10 @@ If @code{unintern} does delete a symbol, it returns @code{t}. Otherwise it returns @code{nil}. @end defun +@defun obarray-clear obarray +This function removes all symbols from @var{obarray}. +@end defun + @node Symbol Properties @section Symbol Properties @cindex symbol property diff --git a/etc/NEWS b/etc/NEWS index 13b41feccbc..1a5ddf0f7e3 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1993,6 +1993,26 @@ The 'test' parameter is omitted if it is 'eql' (the default), as is 'data' if empty. 'rehash-size', 'rehash-threshold' and 'size' are always omitted, and ignored if present when the object is read back in. +** Obarrays + ++++ +*** New obarray type. +Obarrays are now represented by an opaque type instead of using vectors. +They are created by 'obarray-make' and manage their internal storage +automatically, which means that the size parameter to 'obarray-make' can +safely be omitted. That is, they do not become slower as they fill up. + +The old vector representation is still accepted by functions operating +on obarrays, but 'obarrayp' only returns 't' for obarray objects. +'type-of' now returns 'obarray' for obarray objects. + ++++ +*** New function 'obarray-clear' removes all symbols from an obarray. + +--- +*** 'obarray-size' and 'obarray-default-size' are now obsolete. +They pertained to the internal storage size which is now irrelevant. + +++ ** 'treesit-install-language-grammar' can handle local directory instead of URL. It is now possible to pass a directory of a local repository as URL From a8f167547bc15eacaf5fbc07c1e75f603e70862d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Fri, 23 Feb 2024 13:14:18 +0100 Subject: [PATCH 284/446] Replace use of obsolete eshell-kill-output in test * test/lisp/eshell/eshell-tests.el (eshell-test/flush-output): Use eshell-delete-output instead of eshell-kill-output. --- test/lisp/eshell/eshell-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el index e01e033e25e..e58b5a14ed9 100644 --- a/test/lisp/eshell/eshell-tests.el +++ b/test/lisp/eshell/eshell-tests.el @@ -153,7 +153,7 @@ insert the queued one at the next prompt, and finally run it." "Test flushing of previous output" (with-temp-eshell (eshell-insert-command "echo alpha") - (eshell-kill-output) + (eshell-delete-output) (should (eshell-match-output (concat "^" (regexp-quote "*** output flushed ***\n") "$"))))) From 90d3b3408e404aba383302c3147d3ca614619986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Fri, 23 Feb 2024 13:57:04 +0100 Subject: [PATCH 285/446] Warn about docstrings with control characters It is easy to include control chars in doc strings by mistake, and the result is often an unreadable mess. * lisp/emacs-lisp/bytecomp.el (byte-compile-warning-types) (byte-compile-warnings, byte-compile--docstring-style-warn): Add `docstrings-control-chars` warning. * etc/NEWS: Announce. --- etc/NEWS | 14 ++++++++++++++ lisp/emacs-lisp/bytecomp.el | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 1a5ddf0f7e3..6725b596ea9 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1921,6 +1921,20 @@ name 'ignored-return-value'. The warning will only be issued for calls to functions declared 'important-return-value' or 'side-effect-free' (but not 'error-free'). +--- +*** Warn about docstrings that contain control characters. +The compiler now warns about docstrings with control characters other +than newline and tab. This is often a result of improper escaping. +Example: + + (defun my-fun () + "Uses c:\remote\dir\files and the key \C-x." + ...) + +where the doc string contains four control characters CR, DEL, FF and ^X. + +The warning name is 'docstrings-control-chars'. + --- *** The warning about wide docstrings can now be disabled separately. Its warning name is 'docstrings-wide'. diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 5d2aa3355be..c3355eedd75 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -285,6 +285,7 @@ The information is logged to `byte-compile-log-buffer'." (defconst byte-compile-warning-types '( callargs constants docstrings docstrings-non-ascii-quotes docstrings-wide + docstrings-control-chars empty-body free-vars ignored-return-value interactive-only lexical lexical-dynamic make-local mapcar ; obsolete @@ -307,6 +308,8 @@ Elements of the list may be: docstrings that are too wide, containing lines longer than both `byte-compile-docstring-max-column' and `fill-column' characters. Only enabled when `docstrings' also is. + docstrings-control-chars + docstrings that contain control characters other than NL and TAB empty-body body argument to a special form or macro is empty. free-vars references to variables not in the current lexical scope. ignored-return-value @@ -1769,6 +1772,24 @@ It is too wide if it has any lines longer than the largest of (byte-compile-warn-x name "%sdocstring wider than %s characters" (funcall prefix) col))) + + (when (byte-compile-warning-enabled-p 'docstrings-control-chars) + (let ((start 0) + (len (length docs))) + (while (and (< start len) + (string-match (rx (intersection (in (0 . 31) 127) + (not (in "\n\t")))) + docs start)) + (let* ((ofs (match-beginning 0)) + (c (aref docs ofs))) + ;; FIXME: it should be possible to use the exact source position + ;; of the control char in most cases, and it would be helpful + (byte-compile-warn-x + name + "%sdocstring contains control char #x%02x (position %d)" + (funcall prefix) c ofs) + (setq start (1+ ofs)))))) + ;; There's a "naked" ' character before a symbol/list, so it ;; should probably be quoted with \=. (when (string-match-p (rx (| (in " \t") bol) From 2b7dc7fef814753f1c6d4c352fe69bb6e167cd07 Mon Sep 17 00:00:00 2001 From: "Robert A. Burks" Date: Fri, 16 Feb 2024 18:17:52 -0500 Subject: [PATCH 286/446] Fix Flymake lighter tool-tip from generating errors Flymake tool-tip was generating errors on mouse over of mode-line lighter on inactive windows and on the minor mode indicator in the describe-mode Help page. * lisp/progmodes/flymake.el (flymake--mode-line-title): 'help-echo' now uses buffer local state and makes null check. (Bug#69248) Copyright-paperwork-exempt: yes --- lisp/progmodes/flymake.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el index 5974f076556..db00cc59c0e 100644 --- a/lisp/progmodes/flymake.el +++ b/lisp/progmodes/flymake.el @@ -1569,13 +1569,19 @@ correctly.") ,flymake-mode-line-lighter mouse-face mode-line-highlight help-echo - ,(lambda (&rest _) - (concat - (format "%s known backends\n" (hash-table-count flymake--state)) - (format "%s running\n" (length (flymake-running-backends))) - (format "%s disabled\n" (length (flymake-disabled-backends))) - "mouse-1: Display minor mode menu\n" - "mouse-2: Show help for minor mode")) + ,(lambda (w &rest _) + (with-current-buffer (window-buffer w) + ;; Mouse can activate tool-tip without window being active. + ;; `flymake--state' is buffer local and is null when line + ;; lighter appears in *Help* `describe-mode'. + (concat + (unless (null flymake--state) + (concat + (format "%s known backends\n" (hash-table-count flymake--state)) + (format "%s running\n" (length (flymake-running-backends))) + (format "%s disabled\n" (length (flymake-disabled-backends))))) + "mouse-1: Display minor mode menu\n" + "mouse-2: Show help for minor mode"))) keymap ,(let ((map (make-sparse-keymap))) (define-key map [mode-line down-mouse-1] From 0b855e1465b26f69156a35befebb4167145cdccf Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 23 Feb 2024 11:31:43 -0500 Subject: [PATCH 287/446] (rmail-font-lock-keywords): Avoid old-style `font-lock*-face` variables * lisp/mail/rmail.el (rmail-font-lock-keywords): Refer directly to the font-lock faces. --- lisp/mail/rmail.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 6f343c23bbe..7ebfff3d7af 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -805,8 +805,8 @@ that knows the exact ordering of the \\( \\) subexpressions.") "\\(" cite-chars "[ \t]*\\)\\)+\\)" "\\(.*\\)") (beginning-of-line) (end-of-line) - (1 font-lock-comment-delimiter-face nil t) - (5 font-lock-comment-face nil t))) + (1 'font-lock-comment-delimiter-face nil t) + (5 'font-lock-comment-face nil t))) '("^\\(X-[a-z0-9-]+\\|In-Reply-To\\|Date\\):.*\\(\n[ \t]+.*\\)*$" . 'rmail-header-name)))) "Additional expressions to highlight in Rmail mode.") From 048eaadd8cc97faf0f3e70a8d81d06f915c52081 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 23 Feb 2024 11:37:24 -0500 Subject: [PATCH 288/446] rmail.el: Prefer #' to quote function names * lisp/mail/rmail.el (rmail-pop-to-buffer, rmail-mode-map) (rmail-mode-1, rmail-generate-viewer-buffer, rmail-variables) (rmail-find-all-files, rmail-insert-inbox-text) (rmail-set-message-counters, rmail-only-expunge, rmail-reply) (rmail-resend, rmail-fontify-buffer-function) (rmail-unfontify-buffer-function, rmail-install-speedbar-variables) (after-save-hook): Use #' where applicable. --- lisp/mail/rmail.el | 160 +++++++++++++++++++++++---------------------- 1 file changed, 81 insertions(+), 79 deletions(-) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 7ebfff3d7af..7006d59be66 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -815,7 +815,7 @@ that knows the exact ordering of the \\( \\) subexpressions.") (defun rmail-pop-to-buffer (&rest args) "Like `pop-to-buffer', but with `split-width-threshold' set to nil." (let (split-width-threshold) - (apply 'pop-to-buffer args))) + (apply #'pop-to-buffer args))) ;; Perform BODY in the summary buffer ;; in such a way that its cursor is properly updated in its own window. @@ -1008,66 +1008,66 @@ The buffer is expected to be narrowed to just the header of the message." (defvar rmail-mode-map (let ((map (make-keymap))) (suppress-keymap map) - (define-key map "a" 'rmail-add-label) - (define-key map "b" 'rmail-bury) - (define-key map "c" 'rmail-continue) - (define-key map "d" 'rmail-delete-forward) - (define-key map "\C-d" 'rmail-delete-backward) - (define-key map "e" 'rmail-edit-current-message) + (define-key map "a" #'rmail-add-label) + (define-key map "b" #'rmail-bury) + (define-key map "c" #'rmail-continue) + (define-key map "d" #'rmail-delete-forward) + (define-key map "\C-d" #'rmail-delete-backward) + (define-key map "e" #'rmail-edit-current-message) ;; If you change this, change the rmail-resend menu-item's :keys. - (define-key map "f" 'rmail-forward) - (define-key map "g" 'rmail-get-new-mail) - (define-key map "h" 'rmail-summary) - (define-key map "i" 'rmail-input) - (define-key map "j" 'rmail-show-message) - (define-key map "k" 'rmail-kill-label) - (define-key map "l" 'rmail-summary-by-labels) - (define-key map "\e\C-h" 'rmail-summary) - (define-key map "\e\C-l" 'rmail-summary-by-labels) - (define-key map "\e\C-r" 'rmail-summary-by-recipients) - (define-key map "\e\C-s" 'rmail-summary-by-regexp) - (define-key map "\e\C-f" 'rmail-summary-by-senders) - (define-key map "\e\C-t" 'rmail-summary-by-topic) - (define-key map "m" 'rmail-mail) - (define-key map "\em" 'rmail-retry-failure) - (define-key map "n" 'rmail-next-undeleted-message) - (define-key map "\en" 'rmail-next-message) - (define-key map "\e\C-n" 'rmail-next-labeled-message) - (define-key map "o" 'rmail-output) - (define-key map "\C-o" 'rmail-output-as-seen) - (define-key map "p" 'rmail-previous-undeleted-message) - (define-key map "\ep" 'rmail-previous-message) - (define-key map "\e\C-p" 'rmail-previous-labeled-message) - (define-key map "q" 'rmail-quit) - (define-key map "r" 'rmail-reply) + (define-key map "f" #'rmail-forward) + (define-key map "g" #'rmail-get-new-mail) + (define-key map "h" #'rmail-summary) + (define-key map "i" #'rmail-input) + (define-key map "j" #'rmail-show-message) + (define-key map "k" #'rmail-kill-label) + (define-key map "l" #'rmail-summary-by-labels) + (define-key map "\e\C-h" #'rmail-summary) + (define-key map "\e\C-l" #'rmail-summary-by-labels) + (define-key map "\e\C-r" #'rmail-summary-by-recipients) + (define-key map "\e\C-s" #'rmail-summary-by-regexp) + (define-key map "\e\C-f" #'rmail-summary-by-senders) + (define-key map "\e\C-t" #'rmail-summary-by-topic) + (define-key map "m" #'rmail-mail) + (define-key map "\em" #'rmail-retry-failure) + (define-key map "n" #'rmail-next-undeleted-message) + (define-key map "\en" #'rmail-next-message) + (define-key map "\e\C-n" #'rmail-next-labeled-message) + (define-key map "o" #'rmail-output) + (define-key map "\C-o" #'rmail-output-as-seen) + (define-key map "p" #'rmail-previous-undeleted-message) + (define-key map "\ep" #'rmail-previous-message) + (define-key map "\e\C-p" #'rmail-previous-labeled-message) + (define-key map "q" #'rmail-quit) + (define-key map "r" #'rmail-reply) ;; I find I can't live without the default M-r command -- rms. - ;; (define-key rmail-mode-map "\er" 'rmail-search-backwards) - (define-key map "s" 'rmail-expunge-and-save) - (define-key map "\es" 'rmail-search) - (define-key map "t" 'rmail-toggle-header) - (define-key map "u" 'rmail-undelete-previous-message) - (define-key map "v" 'rmail-mime) - (define-key map "w" 'rmail-output-body-to-file) - (define-key map "\C-c\C-w" 'rmail-widen) - (define-key map "x" 'rmail-expunge) - (define-key map "." 'rmail-beginning-of-message) - (define-key map "/" 'rmail-end-of-message) - (define-key map "<" 'rmail-first-message) - (define-key map ">" 'rmail-last-message) - (define-key map " " 'scroll-up-command) - (define-key map [?\S-\ ] 'scroll-down-command) - (define-key map "\177" 'scroll-down-command) - (define-key map "?" 'describe-mode) - (define-key map "\C-c\C-d" 'rmail-epa-decrypt) - (define-key map "\C-c\C-s\C-d" 'rmail-sort-by-date) - (define-key map "\C-c\C-s\C-s" 'rmail-sort-by-subject) - (define-key map "\C-c\C-s\C-a" 'rmail-sort-by-author) - (define-key map "\C-c\C-s\C-r" 'rmail-sort-by-recipient) - (define-key map "\C-c\C-s\C-c" 'rmail-sort-by-correspondent) - (define-key map "\C-c\C-s\C-l" 'rmail-sort-by-lines) - (define-key map "\C-c\C-s\C-k" 'rmail-sort-by-labels) - (define-key map "\C-c\C-n" 'rmail-next-same-subject) - (define-key map "\C-c\C-p" 'rmail-previous-same-subject) + ;; (define-key rmail-mode-map "\er" #'rmail-search-backwards) + (define-key map "s" #'rmail-expunge-and-save) + (define-key map "\es" #'rmail-search) + (define-key map "t" #'rmail-toggle-header) + (define-key map "u" #'rmail-undelete-previous-message) + (define-key map "v" #'rmail-mime) + (define-key map "w" #'rmail-output-body-to-file) + (define-key map "\C-c\C-w" #'rmail-widen) + (define-key map "x" #'rmail-expunge) + (define-key map "." #'rmail-beginning-of-message) + (define-key map "/" #'rmail-end-of-message) + (define-key map "<" #'rmail-first-message) + (define-key map ">" #'rmail-last-message) + (define-key map " " #'scroll-up-command) + (define-key map [?\S-\ ] #'scroll-down-command) + (define-key map "\177" #'scroll-down-command) + (define-key map "?" #'describe-mode) + (define-key map "\C-c\C-d" #'rmail-epa-decrypt) + (define-key map "\C-c\C-s\C-d" #'rmail-sort-by-date) + (define-key map "\C-c\C-s\C-s" #'rmail-sort-by-subject) + (define-key map "\C-c\C-s\C-a" #'rmail-sort-by-author) + (define-key map "\C-c\C-s\C-r" #'rmail-sort-by-recipient) + (define-key map "\C-c\C-s\C-c" #'rmail-sort-by-correspondent) + (define-key map "\C-c\C-s\C-l" #'rmail-sort-by-lines) + (define-key map "\C-c\C-s\C-k" #'rmail-sort-by-labels) + (define-key map "\C-c\C-n" #'rmail-next-same-subject) + (define-key map "\C-c\C-p" #'rmail-previous-same-subject) (define-key map [menu-bar] (make-sparse-keymap)) @@ -1344,9 +1344,9 @@ Instead, these commands are available: (setq local-abbrev-table text-mode-abbrev-table) ;; Functions to support buffer swapping: (add-hook 'write-region-annotate-functions - 'rmail-write-region-annotate nil t) - (add-hook 'kill-buffer-hook 'rmail-mode-kill-buffer-hook nil t) - (add-hook 'change-major-mode-hook 'rmail-change-major-mode-hook nil t)) + #'rmail-write-region-annotate nil t) + (add-hook 'kill-buffer-hook #'rmail-mode-kill-buffer-hook nil t) + (add-hook 'change-major-mode-hook #'rmail-change-major-mode-hook nil t)) (defun rmail-generate-viewer-buffer () "Return a reusable buffer suitable for viewing messages. @@ -1363,7 +1363,7 @@ Create the buffer if necessary." (file-name-nondirectory (or buffer-file-name (buffer-name))))))) (with-current-buffer newbuf - (add-hook 'kill-buffer-hook 'rmail-view-buffer-kill-buffer-hook nil t)) + (add-hook 'kill-buffer-hook #'rmail-view-buffer-kill-buffer-hook nil t)) newbuf))) (defun rmail-swap-buffers () @@ -1479,7 +1479,7 @@ If so restore the actual mbox message collection." ;; Don't turn off auto-saving based on the size of the buffer ;; because that code does not understand buffer-swapping. (setq-local auto-save-include-big-deletions t) - (setq-local revert-buffer-function 'rmail-revert) + (setq-local revert-buffer-function #'rmail-revert) (setq-local font-lock-defaults '(rmail-font-lock-keywords t t nil nil @@ -1490,7 +1490,7 @@ If so restore the actual mbox message collection." (setq-local file-precious-flag t) (setq-local desktop-save-buffer t) (setq-local save-buffer-coding-system 'no-conversion) - (setq next-error-move-function 'rmail-next-error-move)) + (setq next-error-move-function #'rmail-next-error-move)) ;; Handle M-x revert-buffer done in an rmail-mode buffer. (defun rmail-revert (arg noconfirm) @@ -1606,7 +1606,7 @@ The duplicate copy goes into the Rmail file just after the original." (files (directory-files start t rmail-secondary-file-regexp))) ;; Sort here instead of in directory-files ;; because this list is usually much shorter. - (sort files 'string<)))) + (sort files #'string<)))) (defun rmail-list-to-menu (menu-name l action &optional full-name) (let ((menu (make-sparse-keymap menu-name)) @@ -2026,7 +2026,7 @@ Value is the size of the newly read mail after conversion." rmail-movemail-flags) (list file tofile) (if password (list password) nil)))) - (apply 'call-process args)) + (apply #'call-process args)) (if (not (buffer-modified-p errors)) ;; No output => movemail won nil @@ -2518,7 +2518,7 @@ Output a helpful message unless NOMSG is non-nil." ;; which will never be used. (push nil messages-head) (push ?0 deleted-head) - (setq rmail-message-vector (apply 'vector messages-head) + (setq rmail-message-vector (apply #'vector messages-head) rmail-deleted-vector (concat deleted-head)) (setq rmail-summary-vector (make-vector rmail-total-messages nil) @@ -3605,10 +3605,10 @@ If `rmail-confirm-expunge' is non-nil, ask user to confirm." (cons (aref messages number) nil))) (setq rmail-current-message new-message-number rmail-total-messages counter - rmail-message-vector (apply 'vector messages-head) + rmail-message-vector (apply #'vector messages-head) rmail-deleted-vector (make-string (1+ counter) ?\s) rmail-summary-vector (vconcat (nreverse new-summary)) - rmail-msgref-vector (apply 'vector (nreverse new-msgref)) + rmail-msgref-vector (apply #'vector (nreverse new-msgref)) win t))) (message "Expunging deleted messages...done") (if (not win) @@ -3891,7 +3891,7 @@ use \\[mail-yank-original] to yank the original message into it." (if (or references message-id) (list (cons "References" (if references (concat - (mapconcat 'identity references " ") + (mapconcat #'identity references " ") " " message-id) message-id))))))) @@ -4089,7 +4089,7 @@ typically for purposes of moderating a list." (insert "Resent-Bcc: " (user-login-name) "\n")) (insert "Resent-To: " (if (stringp address) address - (mapconcat 'identity address ",\n\t")) + (mapconcat #'identity address ",\n\t")) "\n") ;; Expand abbrevs in the recipients. (save-excursion @@ -4335,7 +4335,7 @@ This has an effect only if a summary buffer exists." (defun rmail-fontify-buffer-function () ;; This function's symbol is bound to font-lock-fontify-buffer-function. - (add-hook 'rmail-show-message-hook 'rmail-fontify-message nil t) + (add-hook 'rmail-show-message-hook #'rmail-fontify-message nil t) ;; If we're already showing a message, fontify it now. (if rmail-current-message (rmail-fontify-message)) ;; Prevent Font Lock mode from kicking in. @@ -4346,7 +4346,7 @@ This has an effect only if a summary buffer exists." (with-silent-modifications (save-restriction (widen) - (remove-hook 'rmail-show-message-hook 'rmail-fontify-message t) + (remove-hook 'rmail-show-message-hook #'rmail-fontify-message t) (remove-text-properties (point-min) (point-max) '(rmail-fontified nil)) (font-lock-default-unfontify-buffer)))) @@ -4381,11 +4381,12 @@ browsing, and moving of messages." "Install those variables used by speedbar to enhance rmail." (unless rmail-speedbar-key-map (setq rmail-speedbar-key-map (speedbar-make-specialized-keymap)) - (define-key rmail-speedbar-key-map "e" 'speedbar-edit-line) - (define-key rmail-speedbar-key-map "r" 'speedbar-edit-line) - (define-key rmail-speedbar-key-map "\C-m" 'speedbar-edit-line) + (declare-function speedbar-edit-line "speedbar") + (define-key rmail-speedbar-key-map "e" #'speedbar-edit-line) + (define-key rmail-speedbar-key-map "r" #'speedbar-edit-line) + (define-key rmail-speedbar-key-map "\C-m" #'speedbar-edit-line) (define-key rmail-speedbar-key-map "M" - 'rmail-speedbar-move-message-to-folder-on-line))) + #'rmail-speedbar-move-message-to-folder-on-line))) ;; Mouse-3. (defvar rmail-speedbar-menu-items @@ -4829,7 +4830,8 @@ Content-Transfer-Encoding: base64\n") (with-current-buffer (if (rmail-buffers-swapped-p) rmail-buffer rmail-view-buffer) (setq buffer-file-coding-system rmail-message-encoding)))) -(add-hook 'after-save-hook 'rmail-after-save-hook) +;; FIXME: Don't do it globally!! +(add-hook 'after-save-hook #'rmail-after-save-hook) ;;; Mailing list support From 3599a9a1cf1f8bed7c7f00fd8f00b2bfc0c4271f Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 23 Feb 2024 11:38:48 -0500 Subject: [PATCH 289/446] * lisp/mail/rmail.el (rmail-resend): Use `with-syntax-table` --- lisp/mail/rmail.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 7006d59be66..d422383acdf 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -4095,20 +4095,18 @@ typically for purposes of moderating a list." (save-excursion (if (featurep 'mailabbrev) (let ((end (point-marker)) - (local-abbrev-table mail-abbrevs) - (old-syntax-table (syntax-table))) + (local-abbrev-table mail-abbrevs)) (if (and (not (obarrayp mail-abbrevs)) (file-exists-p mail-personal-alias-file)) (build-mail-abbrevs)) (unless mail-abbrev-syntax-table (mail-abbrev-make-syntax-table)) - (set-syntax-table mail-abbrev-syntax-table) - (goto-char before) - (while (and (< (point) end) - (progn (forward-word-strictly 1) - (<= (point) end))) - (expand-abbrev)) - (set-syntax-table old-syntax-table)) + (with-syntax-table mail-abbrev-syntax-table + (goto-char before) + (while (and (< (point) end) + (progn (forward-word-strictly 1) + (<= (point) end))) + (expand-abbrev)))) (expand-mail-aliases before (point))))) ;;>> Set up comment, if any. (if (and (sequencep comment) (not (zerop (length comment)))) From 84f72f19e514db8f8f6e469340fb5fa0719d40b6 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 23 Feb 2024 16:46:01 -0500 Subject: [PATCH 290/446] elisp-mode.el: Use `handler-bind` instead of `debug-on-error` * lisp/progmodes/elisp-mode.el (elisp-enable-lexical-binding): Don't get fooled by a global binding of `lexical-binding` to t. (elisp--eval-last-sexp-fake-value): Delete var. (elisp--eval-defun): Don't let-bind `debug-on-error` since it's already arranged by the only caller. (eval-last-sexp, eval-defun): Use `handler-bind` instead of `debug-on-error`. --- lisp/progmodes/elisp-mode.el | 38 ++++++++++++------------------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index e0c18214ef7..4b1f8022f81 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -309,7 +309,7 @@ Comments in the form will be lost." INTERACTIVE non-nil means ask the user for confirmation; this happens in interactive invocations." (interactive "p") - (if lexical-binding + (if (and (local-variable-p 'lexical-binding) lexical-binding) (when interactive (message "lexical-binding already enabled!") (ding)) @@ -371,6 +371,12 @@ be used instead. ;; Font-locking support. +(defun elisp--font-lock-shorthand (_limit) + ;; Add faces on shorthands between point and LIMIT. + ;; ... + ;; Return nil to tell font-lock, that there's nothing left to do. + nil) + (defun elisp--font-lock-flush-elisp-buffers (&optional file) ;; We're only ever called from after-load-functions, load-in-progress can ;; still be t in case of nested loads. @@ -1582,9 +1588,6 @@ character)." (buffer-substring-no-properties beg end)) )))) - -(defvar elisp--eval-last-sexp-fake-value (make-symbol "t")) - (defun eval-sexp-add-defvars (exp &optional pos) "Prepend EXP with all the `defvar's that precede it in the buffer. POS specifies the starting position where EXP was found and defaults to point." @@ -1626,16 +1629,9 @@ integer value is also printed as a character of that codepoint. If `eval-expression-debug-on-error' is non-nil, which is the default, this command arranges for all errors to enter the debugger." (interactive "P") - (if (null eval-expression-debug-on-error) - (values--store-value - (elisp--eval-last-sexp eval-last-sexp-arg-internal)) - (let ((value - (let ((debug-on-error elisp--eval-last-sexp-fake-value)) - (cons (elisp--eval-last-sexp eval-last-sexp-arg-internal) - debug-on-error)))) - (unless (eq (cdr value) elisp--eval-last-sexp-fake-value) - (setq debug-on-error (cdr value))) - (car value)))) + (values--store-value + (handler-bind ((error (if #'eval-expression--debug #'ignore))) + (elisp--eval-last-sexp eval-last-sexp-arg-internal)))) (defun elisp--eval-defun-1 (form) "Treat some expressions in FORM specially. @@ -1694,8 +1690,7 @@ Return the result of evaluation." ;; FIXME: the print-length/level bindings should only be applied while ;; printing, not while evaluating. (defvar elisp--eval-defun-result) - (let ((debug-on-error eval-expression-debug-on-error) - (edebugging edebug-all-defs) + (let ((edebugging edebug-all-defs) elisp--eval-defun-result) (save-excursion ;; Arrange for eval-region to "read" the (possibly) altered form. @@ -1774,15 +1769,8 @@ which see." (defvar edebug-all-defs) (eval-defun (not edebug-all-defs))) (t - (if (null eval-expression-debug-on-error) - (elisp--eval-defun) - (let (new-value value) - (let ((debug-on-error elisp--eval-last-sexp-fake-value)) - (setq value (elisp--eval-defun)) - (setq new-value debug-on-error)) - (unless (eq elisp--eval-last-sexp-fake-value new-value) - (setq debug-on-error new-value)) - value))))) + (handler-bind ((error (if #'eval-expression--debug #'ignore))) + (elisp--eval-defun))))) ;;; ElDoc Support From 26290870b3505b8971c73fe3a82b69e3c4e86b88 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 23 Feb 2024 17:03:10 -0500 Subject: [PATCH 291/446] diff-mode.el (diff-refine-nonmodified): New option * lisp/vc/diff-mode.el (diff-font-lock-keywords): Refer directly to font-lock faces. (diff-apply-hunk): Use `user-error` for errors usually not due to bugs. (diff--refine-propertize): New function. (diff-refine-nonmodified): New custom var (bug#61396). (diff--refine-hunk): Use them. --- etc/NEWS | 5 +++++ lisp/vc/diff-mode.el | 51 ++++++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 6725b596ea9..5653b51784f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -596,6 +596,11 @@ It allows tweaking the thresholds for rename and copy detection. ** Diff mode +--- +*** New user option 'diff-refine-nonmodified'. +Makes 'diff-refine' highlight added and removed whole lines with the +same faces as the words added and removed within modified lines. + +++ *** 'diff-ignore-whitespace-hunk' can now be applied to all hunks. When called with a non-nil prefix argument, diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 34a4b70691d..f914cc76790 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -517,8 +517,8 @@ use the face `diff-removed' for removed lines, and the face ("^Only in .*\n" . 'diff-nonexistent) ("^Binary files .* differ\n" . 'diff-file-header) ("^\\(#\\)\\(.*\\)" - (1 font-lock-comment-delimiter-face) - (2 font-lock-comment-face)) + (1 'font-lock-comment-delimiter-face) + (2 'font-lock-comment-face)) ("^diff: .*" (0 'diff-error)) ("^[^-=+*!<>#].*\n" (0 'diff-context)) (,#'diff--font-lock-syntax) @@ -944,7 +944,8 @@ like \(diff-merge-strings \"b/foo\" \"b/bar\" \"/a/c/foo\")." (when (and (string-match (concat "\\`\\(.*?\\)\\(.*\\)\\(.*\\)\n" "\\1\\(.*\\)\\3\n" - "\\(.*\\(\\2\\).*\\)\\'") str) + "\\(.*\\(\\2\\).*\\)\\'") + str) (equal to (match-string 5 str))) (concat (substring str (match-beginning 5) (match-beginning 6)) (match-string 4 str) @@ -1999,7 +2000,7 @@ With a prefix argument, REVERSE the hunk." (diff-find-source-location nil reverse))) (cond ((null line-offset) - (error "Can't find the text to patch")) + (user-error "Can't find the text to patch")) ((with-current-buffer buf (and buffer-file-name (backup-file-name-p buffer-file-name) @@ -2008,7 +2009,7 @@ With a prefix argument, REVERSE the hunk." (yes-or-no-p (format "Really apply this hunk to %s? " (file-name-nondirectory buffer-file-name))))))) - (error "%s" + (user-error "%s" (substitute-command-keys (format "Use %s\\[diff-apply-hunk] to apply it to the other file" (if (not reverse) "\\[universal-argument] "))))) @@ -2275,6 +2276,18 @@ Return new point, if it was moved." (end (progn (diff-end-of-hunk) (point)))) (diff--refine-hunk beg end))))) +(defun diff--refine-propertize (beg end face) + (let ((ol (make-overlay beg end))) + (overlay-put ol 'diff-mode 'fine) + (overlay-put ol 'evaporate t) + (overlay-put ol 'face face))) + +(defcustom diff-refine-nonmodified nil + "If non-nil also highlight as \"refined\" the added/removed lines. +This is currently only implemented for `unified' diffs." + :version "30.1" + :type 'boolean) + (defun diff--refine-hunk (start end) (require 'smerge-mode) (goto-char start) @@ -2289,18 +2302,28 @@ Return new point, if it was moved." (goto-char beg) (pcase style ('unified - (while (re-search-forward "^-" end t) + (while (re-search-forward "^[-+]" end t) (let ((beg-del (progn (beginning-of-line) (point))) beg-add end-add) - (when (and (diff--forward-while-leading-char ?- end) - ;; Allow for "\ No newline at end of file". - (progn (diff--forward-while-leading-char ?\\ end) - (setq beg-add (point))) - (diff--forward-while-leading-char ?+ end) - (progn (diff--forward-while-leading-char ?\\ end) - (setq end-add (point)))) + (cond + ((eq (char-after) ?+) + (diff--forward-while-leading-char ?+ end) + (when diff-refine-nonmodified + (diff--refine-propertize beg-del (point) 'diff-refine-added))) + ((and (diff--forward-while-leading-char ?- end) + ;; Allow for "\ No newline at end of file". + (progn (diff--forward-while-leading-char ?\\ end) + (setq beg-add (point))) + (diff--forward-while-leading-char ?+ end) + (progn (diff--forward-while-leading-char ?\\ end) + (setq end-add (point)))) (smerge-refine-regions beg-del beg-add beg-add end-add - nil #'diff-refine-preproc props-r props-a))))) + nil #'diff-refine-preproc props-r props-a)) + (t ;; If we're here, it's because + ;; (diff--forward-while-leading-char ?+ end) failed. + (when diff-refine-nonmodified + (diff--refine-propertize beg-del (point) + 'diff-refine-removed))))))) ('context (let* ((middle (save-excursion (re-search-forward "^---" end t))) (other middle)) From 65d4bf711055dc8d23cea9b2ec8a57cdbfa6cf05 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 24 Feb 2024 10:01:03 +0800 Subject: [PATCH 292/446] ; * .dir-locals.el (java-mode): Transfer suitable c-mode options. --- .dir-locals.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.dir-locals.el b/.dir-locals.el index 89fb76a55f3..1a6acecc206 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -23,6 +23,11 @@ (electric-quote-string . nil) (indent-tabs-mode . t) (mode . bug-reference-prog))) + (java-mode . ((c-file-style . "GNU") + (electric-quote-comment . nil) + (electric-quote-string . nil) + (indent-tabs-mode . t) + (mode . bug-reference-prog))) (objc-mode . ((c-file-style . "GNU") (electric-quote-comment . nil) (electric-quote-string . nil) From 8d5983aa78e36afa815325e7bce85a81d314e67b Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 24 Feb 2024 10:01:57 +0800 Subject: [PATCH 293/446] Fix bug#69321 * java/org/gnu/emacs/EmacsWindow.java (onKeyDown, onKeyUp): Provide Right Alt (Alt Gr) masks to system keymap routines. (bug#69321) --- java/org/gnu/emacs/EmacsWindow.java | 68 ++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 427a1a92332..6e8bdaf7401 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -661,7 +661,7 @@ private static class Coordinate public void onKeyDown (int keyCode, KeyEvent event) { - int state, state_1, num_lock_flag; + int state, state_1, extra_ignored; long serial; String characters; @@ -682,23 +682,37 @@ private static class Coordinate state = eventModifiers (event); - /* Num Lock and Scroll Lock aren't supported by systems older than - Android 3.0. */ + /* Num Lock, Scroll Lock and Meta aren't supported by systems older + than Android 3.0. */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - num_lock_flag = (KeyEvent.META_NUM_LOCK_ON - | KeyEvent.META_SCROLL_LOCK_ON); + extra_ignored = (KeyEvent.META_NUM_LOCK_ON + | KeyEvent.META_SCROLL_LOCK_ON + | KeyEvent.META_META_MASK); else - num_lock_flag = 0; + extra_ignored = 0; /* Ignore meta-state understood by Emacs for now, or key presses - such as Ctrl+C and Meta+C will not be recognized as an ASCII - key press event. */ + such as Ctrl+C and Meta+C will not be recognized as ASCII key + press events. */ state_1 = state & ~(KeyEvent.META_ALT_MASK | KeyEvent.META_CTRL_MASK - | KeyEvent.META_SYM_ON | KeyEvent.META_META_MASK - | num_lock_flag); + | KeyEvent.META_SYM_ON | extra_ignored); + + /* There's no distinction between Right Alt and Alt Gr on Android, + so restore META_ALT_RIGHT_ON if set in state to enable composing + characters. (bug#69321) */ + + if ((state & KeyEvent.META_ALT_RIGHT_ON) != 0) + { + state_1 |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_RIGHT_ON; + + /* If Alt is also not depressed, remove its bit from the mask + reported to Emacs. */ + if ((state & KeyEvent.META_ALT_LEFT_ON) == 0) + state &= ~KeyEvent.META_ALT_MASK; + } synchronized (eventStrings) { @@ -719,29 +733,43 @@ private static class Coordinate public void onKeyUp (int keyCode, KeyEvent event) { - int state, state_1, unicode_char, num_lock_flag; + int state, state_1, unicode_char, extra_ignored; long time; /* Compute the event's modifier mask. */ state = eventModifiers (event); - /* Num Lock and Scroll Lock aren't supported by systems older than - Android 3.0. */ + /* Num Lock, Scroll Lock and Meta aren't supported by systems older + than Android 3.0. */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - num_lock_flag = (KeyEvent.META_NUM_LOCK_ON - | KeyEvent.META_SCROLL_LOCK_ON); + extra_ignored = (KeyEvent.META_NUM_LOCK_ON + | KeyEvent.META_SCROLL_LOCK_ON + | KeyEvent.META_META_MASK); else - num_lock_flag = 0; + extra_ignored = 0; /* Ignore meta-state understood by Emacs for now, or key presses - such as Ctrl+C and Meta+C will not be recognized as an ASCII - key press event. */ + such as Ctrl+C and Meta+C will not be recognized as ASCII key + press events. */ state_1 = state & ~(KeyEvent.META_ALT_MASK | KeyEvent.META_CTRL_MASK - | KeyEvent.META_SYM_ON | KeyEvent.META_META_MASK - | num_lock_flag); + | KeyEvent.META_SYM_ON | extra_ignored); + + /* There's no distinction between Right Alt and Alt Gr on Android, + so restore META_ALT_RIGHT_ON if set in state to enable composing + characters. */ + + if ((state & KeyEvent.META_ALT_RIGHT_ON) != 0) + { + state_1 |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_RIGHT_ON; + + /* If Alt is also not depressed, remove its bit from the mask + reported to Emacs. */ + if ((state & KeyEvent.META_ALT_LEFT_ON) == 0) + state &= ~KeyEvent.META_ALT_MASK; + } unicode_char = getEventUnicodeChar (event, state_1); From 56706254a8ee09e651097fb5075cae75b3bd4e22 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 21 Feb 2024 20:08:37 -0800 Subject: [PATCH 294/446] ; Don't mention erc-branded Compat macros in ERC-NEWS * doc/misc/erc.texi: Change fancy SASL example to also demonstrate `let'-binding a local module. * etc/ERC-NEWS: Don't mention `erc-compat-call' and `erc-compat-function' because Emacs now ships with a compat.el stub library. * lisp/erc/erc-backend.el (erc-decode-parsed-server-response): Add comments. * lisp/erc/erc.el (erc): Mention return value. --- doc/misc/erc.texi | 33 +++++++++++++++++++-------------- etc/ERC-NEWS | 2 -- lisp/erc/erc-backend.el | 2 ++ lisp/erc/erc.el | 5 +++-- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi index f877fb681fe..c7ab7e7bf21 100644 --- a/doc/misc/erc.texi +++ b/doc/misc/erc.texi @@ -1230,25 +1230,30 @@ machine Example.Net login aph-bot password sesame (defun my-erc-up (network) (interactive "Snetwork: ") - - (pcase network - ('libera - (let ((erc-sasl-mechanism 'external)) - (erc-tls :server "irc.libera.chat" :port 6697 - :client-certificate t))) - ('example - (let ((erc-sasl-auth-source-function - #'erc-sasl-auth-source-password-as-host)) - (erc-tls :server "irc.example.net" :port 6697 - :user "alyssa" - :password "Example.Net"))))) + (require 'erc-sasl) + (or (let ((erc-modules (cons 'sasl erc-modules))) + (pcase network + ('libera + (let ((erc-sasl-mechanism 'external)) + (erc-tls :server "irc.libera.chat" + :client-certificate t))) + ('example + (let ((erc-sasl-auth-source-function + #'erc-sasl-auth-source-password-as-host)) + (erc-tls :server "irc.example.net" + :user "alyssa" + :password "Example.Net"))))) + ;; Non-SASL + (call-interactively #'erc-tls))) @end lisp You've started storing your credentials with auth-source and have decided to try SASL on another network as well. But there's a catch: this network doesn't support @samp{EXTERNAL}. You use -@code{let}-binding to get around this and successfully authenticate to -both networks. +@code{let}-binding to work around this and successfully authenticate +to both networks. (Note that this example assumes you've removed +@code{sasl} from @code{erc-modules} globally and have instead opted to +add it locally when connecting to preconfigured networks.) @end itemize diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index b2aceaa9f39..e8082582de3 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -694,8 +694,6 @@ by toggling a provided compatibility switch. See source code around the function 'erc-send-action' for details. *** Miscellaneous changes -Two helper macros from GNU ELPA's Compat library are now available to -third-party modules as 'erc-compat-call' and 'erc-compat-function'. In 'erc-button-alist', 'Info-goto-node' has been supplanted by plain old 'info', and the "" entry has been removed because it was more or less redundant. In all ERC buffers, the "" key is now diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 7b782d0ef44..9fc8a4d29f4 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -1479,10 +1479,12 @@ for decoding." (let ((args (erc-response.command-args parsed-response)) (decode-target nil) (decoded-args ())) + ;; FIXME this should stop after the first match. (dolist (arg args nil) (when (string-match "^[#&].*" arg) (setq decode-target arg))) (when (stringp decode-target) + ;; FIXME `decode-target' should be passed as TARGET. (setq decode-target (erc-decode-string-from-target decode-target nil))) (setf (erc-response.unparsed parsed-response) (erc-decode-string-from-target diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index f250584e47a..5c8b3785bc6 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2772,8 +2772,9 @@ PORT, NICK, and PASSWORD, along with USER and FULL-NAME when given a prefix argument. Non-interactively, expect the rarely needed ID parameter, when non-nil, to be a symbol or a string for naming the server buffer and identifying the connection -unequivocally. (See Info node `(erc) Connecting' for details -about all mentioned parameters.) +unequivocally. Once connected, return the server buffer. (See +Info node `(erc) Connecting' for details about all mentioned +parameters.) Together with `erc-tls', this command serves as the main entry point for ERC, the powerful, modular, and extensible IRC client. From 15a140a24664e96620838136640d660f842dfa49 Mon Sep 17 00:00:00 2001 From: Emanuel Berg Date: Tue, 23 Jan 2024 14:21:49 +0100 Subject: [PATCH 295/446] Make erc-cmd-AMSG session local; add /GMSG, /AME and /GME * etc/ERC-NEWS: Mention new slash commands. * lisp/erc/erc.el (erc-cmd-AMSG): Make it consistent with the doc string by only affecting the current connection. (erc-cmd-GMSG, erc-cmd-AME, erc-cmd-GME): New IRC slash commands. * test/lisp/erc/erc-scenarios-misc-commands.el (erc-scenarios-misc-commands--AMSG-GMSG-AME-GME): New test. * test/lisp/erc/resources/commands/amsg-barnet.eld: New file. * test/lisp/erc/resources/commands/amsg-foonet.eld: New file. (Bug#68401) --- etc/ERC-NEWS | 9 +- lisp/erc/erc.el | 38 ++++++-- test/lisp/erc/erc-scenarios-misc-commands.el | 90 +++++++++++++++++++ .../erc/resources/commands/amsg-barnet.eld | 54 +++++++++++ .../erc/resources/commands/amsg-foonet.eld | 56 ++++++++++++ 5 files changed, 239 insertions(+), 8 deletions(-) create mode 100644 test/lisp/erc/resources/commands/amsg-barnet.eld create mode 100644 test/lisp/erc/resources/commands/amsg-foonet.eld diff --git a/etc/ERC-NEWS b/etc/ERC-NEWS index e8082582de3..d7f513addfb 100644 --- a/etc/ERC-NEWS +++ b/etc/ERC-NEWS @@ -334,6 +334,11 @@ has changed in some way. At present, ERC does not perform this step automatically on your behalf, even if a change was made in a 'Custom-mode' buffer or via 'setopt'. +** New broadcast-oriented slash commands /AME, /GME, and /GMSG. +Also available as the library functions 'erc-cmd-AME', 'erc-cmd-GME', +and 'erc-cmd-GMSG', these new slash commands can prove handy in test +environments. + ** Miscellaneous UX changes. Some minor quality-of-life niceties have finally made their way to ERC. For example, fool visibility has become togglable with the new @@ -1375,7 +1380,7 @@ reconnection attempts that ERC will make per server. in seconds, that ERC will wait between successive reconnect attempts. *** erc-server-send-ping-timeout: Determines when to consider a connection -stalled and restart it. The default is after 120 seconds. +stalled and restart it. The default is after 120 seconds. *** erc-system-name: Determines the system name to use when logging in. The default is to figure this out by calling `system-name'. @@ -2336,7 +2341,7 @@ in XEmacs. Please use M-x customize-variable RET erc-modules RET to change the default if it does not suite your needs. -** THe symbol used in `erc-nickserv-passwords' for debian.org IRC servers +** The symbol used in `erc-nickserv-passwords' for debian.org IRC servers (formerly called OpenProjects, now FreeNode) has changed from openprojects to freenode. You may need to update your configuration for a successful automatic nickserv identification. diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 5c8b3785bc6..cce3b2508fb 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -4046,16 +4046,42 @@ this function from interpreting the line as a command." ;; Input commands handlers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun erc-cmd-AMSG (line) - "Send LINE to all channels of the current server that you are on." - (interactive "sSend to all channels you're on: ") - (setq line (erc-trim-string line)) +(defun erc--connected-and-joined-p () + (and (erc--current-buffer-joined-p) + erc-server-connected)) + +(defun erc-cmd-GMSG (line) + "Send LINE to all channels on all networks you are on." + (setq line (string-remove-prefix " " line)) (erc-with-all-buffers-of-server nil - (lambda () - (erc-channel-p (erc-default-target))) + #'erc--connected-and-joined-p + (erc-send-message line))) +(put 'erc-cmd-GMSG 'do-not-parse-args t) + +(defun erc-cmd-AMSG (line) + "Send LINE to all channels of the current network. +Interactively, prompt for the line of text to send." + (interactive "sSend to all channels on this network: ") + (setq line (string-remove-prefix " " line)) + (erc-with-all-buffers-of-server erc-server-process + #'erc--connected-and-joined-p (erc-send-message line))) (put 'erc-cmd-AMSG 'do-not-parse-args t) +(defun erc-cmd-GME (line) + "Send LINE as an action to all channels on all networks you are on." + (erc-with-all-buffers-of-server nil + #'erc--connected-and-joined-p + (erc-cmd-ME line))) +(put 'erc-cmd-GME 'do-not-parse-args t) + +(defun erc-cmd-AME (line) + "Send LINE as an action to all channels on the current network." + (erc-with-all-buffers-of-server erc-server-process + #'erc--connected-and-joined-p + (erc-cmd-ME line))) +(put 'erc-cmd-AME 'do-not-parse-args t) + (defun erc-cmd-SAY (line) "Send LINE to the current query or channel as a message, not a command. diff --git a/test/lisp/erc/erc-scenarios-misc-commands.el b/test/lisp/erc/erc-scenarios-misc-commands.el index d6ed53b5358..da6855caf57 100644 --- a/test/lisp/erc/erc-scenarios-misc-commands.el +++ b/test/lisp/erc/erc-scenarios-misc-commands.el @@ -123,4 +123,94 @@ (should (string= (erc-server-user-host (erc-get-server-user "tester")) "some.host.test.cc")))))) +;; This tests four related slash commands, /AMSG, /GMSG, /AME, /GME, +;; the latter three introduced by bug#68401. It mainly asserts +;; correct routing behavior, especially not sending or inserting +;; messages in buffers belonging to disconnected sessions. Left +;; unaddressed are interactions with the `command-indicator' module +;; (`erc-noncommands-list') and whatever future `echo-message' +;; implementation manifests out of bug#49860. +(ert-deftest erc-scenarios-misc-commands--AMSG-GMSG-AME-GME () + (erc-scenarios-common-with-cleanup + ((erc-scenarios-common-dialog "commands") + (erc-server-flood-penalty 0.1) + (dumb-server-foonet (erc-d-run "localhost" t "srv-foonet" 'amsg-foonet)) + (dumb-server-barnet (erc-d-run "localhost" t "srv-barnet" 'amsg-barnet)) + (expect (erc-d-t-make-expecter))) + + (ert-info ("Connect to foonet and join #foo") + (with-current-buffer + (erc :server "127.0.0.1" + :port (process-contact dumb-server-foonet :service) + :nick "tester") + (funcall expect 10 "debug mode") + (erc-cmd-JOIN "#foo"))) + + (ert-info ("Connect to barnet and join #bar") + (with-current-buffer + (erc :server "127.0.0.1" + :port (process-contact dumb-server-barnet :service) + :nick "tester") + (funcall expect 10 "debug mode") + (erc-cmd-JOIN "#bar"))) + + (with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#foo")) + (funcall expect 10 "welcome")) + (with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#bar")) + (funcall expect 10 "welcome")) + + (ert-info ("/AMSG only sent to issuing context's server") + (with-current-buffer "foonet" + (erc-scenarios-common-say "/amsg 1 foonet only")) + (with-current-buffer "barnet" + (erc-scenarios-common-say "/amsg 2 barnet only")) + (with-current-buffer "#foo" + (funcall expect 10 " 1 foonet only") + (funcall expect 10 " bob: Our queen and all")) + (with-current-buffer "#bar" + (funcall expect 10 " 2 barnet only") + (funcall expect 10 " mike: And secretly to greet"))) + + (ert-info ("/AME only sent to issuing context's server") + (with-current-buffer "foonet" + (erc-scenarios-common-say "/ame 3 foonet only")) + (with-current-buffer "barnet" + (erc-scenarios-common-say "/ame 4 barnet only")) + (with-current-buffer "#foo" + (funcall expect 10 "* tester 3 foonet only") + (funcall expect 10 " bob: You have discharged this")) + (with-current-buffer "#bar" + (funcall expect 10 "* tester 4 barnet only") + (funcall expect 10 " mike: That same Berowne"))) + + (ert-info ("/GMSG and /GME sent to all servers") + (with-current-buffer "foonet" + (erc-scenarios-common-say "/gmsg 5 all nets") + (erc-scenarios-common-say "/gme 6 all nets")) + (with-current-buffer "#bar" + (funcall expect 10 " 5 all nets") + (funcall expect 10 "* tester 6 all nets") + (funcall expect 10 " mike: Mehercle! if their sons"))) + + (ert-info ("/GMSG and /GME only sent to connected servers") + (with-current-buffer "barnet" + (erc-cmd-QUIT "") + (funcall expect 10 "ERC finished")) + (with-current-buffer "#foo" + (funcall expect 10 " 5 all nets") + (funcall expect 10 "* tester 6 all nets") + (funcall expect 10 " bob: Stand you!")) + (with-current-buffer "foonet" + (erc-scenarios-common-say "/gmsg 7 all live nets") + (erc-scenarios-common-say "/gme 8 all live nets")) + ;; Message *not* inserted in disconnected buffer. + (with-current-buffer "#bar" + (funcall expect -0.1 " 7 all live nets") + (funcall expect -0.1 "* tester 8 all live nets"))) + + (with-current-buffer "#foo" + (funcall expect 10 " 7 all live nets") + (funcall expect 10 "* tester 8 all live nets") + (funcall expect 10 " alice: Live, and be prosperous;")))) + ;;; erc-scenarios-misc-commands.el ends here diff --git a/test/lisp/erc/resources/commands/amsg-barnet.eld b/test/lisp/erc/resources/commands/amsg-barnet.eld new file mode 100644 index 00000000000..53b3e18651a --- /dev/null +++ b/test/lisp/erc/resources/commands/amsg-barnet.eld @@ -0,0 +1,54 @@ +;; -*- mode: lisp-data; -*- +((nick 10 "NICK tester")) +((user 10 "USER user 0 * :unknown") + (0 ":irc.barnet.org 001 tester :Welcome to the barnet IRC Network tester") + (0 ":irc.barnet.org 002 tester :Your host is irc.barnet.org, running version oragono-2.6.0-7481bf0385b95b16") + (0 ":irc.barnet.org 003 tester :This server was created Tue, 04 May 2021 05:06:19 UTC") + (0 ":irc.barnet.org 004 tester irc.barnet.org oragono-2.6.0-7481bf0385b95b16 BERTZios CEIMRUabefhiklmnoqstuv Iabefhkloqv") + (0 ":irc.barnet.org 005 tester AWAYLEN=390 BOT=B CASEMAPPING=ascii CHANLIMIT=#:100 CHANMODES=Ibe,k,fl,CEMRUimnstu CHANNELLEN=64 CHANTYPES=# ELIST=U EXCEPTS EXTBAN=,m FORWARD=f INVEX KICKLEN=390 :are supported by this server") + (0 ":irc.barnet.org 005 tester MAXLIST=beI:60 MAXTARGETS=4 MODES MONITOR=100 NETWORK=barnet NICKLEN=32 PREFIX=(qaohv)~&@%+ STATUSMSG=~&@%+ TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,USERHOST:10,PRIVMSG:4,TAGMSG:4,NOTICE:4,MONITOR:100 TOPICLEN=390 UTF8MAPPING=rfc8265 UTF8ONLY WHOX :are supported by this server") + (0 ":irc.barnet.org 005 tester draft/CHATHISTORY=100 :are supported by this server") + (0 ":irc.barnet.org 251 tester :There are 0 users and 3 invisible on 1 server(s)") + (0 ":irc.barnet.org 252 tester 0 :IRC Operators online") + (0 ":irc.barnet.org 253 tester 0 :unregistered connections") + (0 ":irc.barnet.org 254 tester 1 :channels formed") + (0 ":irc.barnet.org 255 tester :I have 3 clients and 0 servers") + (0 ":irc.barnet.org 265 tester 3 3 :Current local users 3, max 3") + (0 ":irc.barnet.org 266 tester 3 3 :Current global users 3, max 3") + (0 ":irc.barnet.org 422 tester :MOTD File is missing")) + +((mode-user 10 "MODE tester +i") + (0 ":irc.barnet.org 221 tester +i") + (0 ":irc.barnet.org NOTICE tester :This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.")) + +((join 10 "JOIN #bar") + (0 ":tester!~u@jnu48g2wrycbw.irc JOIN #bar") + (0 ":irc.barnet.org 353 tester = #bar :@mike joe tester") + (0 ":irc.barnet.org 366 tester #bar :End of NAMES list")) + +((mode-bar 10 "MODE #bar") + (0 ":irc.barnet.org 324 tester #bar +nt") + (0 ":irc.barnet.org 329 tester #bar 1620104779") + (0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :tester, welcome!") + (0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :tester, welcome!") + (0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: Whipp'd first, sir, and hang'd after.") + (0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: We have yet many among us can gripe as hard as Cassibelan; I do not say I am one, but I have a hand. Why tribute ? why should we pay tribute ? If C sar can hide the sun from us with a blanket, or put the moon in his pocket, we will pay him tribute for light; else, sir, no more tribute, pray you now.")) + +((privmsg-2 10 "PRIVMSG #bar :2 barnet only") + (0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: Double and treble admonition, and still forfeit in the same kind ? This would make mercy swear, and play the tyrant.") + (0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: And secretly to greet the empress' friends.")) + +((privmsg-4 10 "PRIVMSG #bar :\1ACTION 4 barnet only\1") + (0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: You have not been inquired after: I have sat here all day.") + (0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: That same Berowne I'll torture ere I go.")) + +((privmsg-5 10 "PRIVMSG #bar :5 all nets")) + +((privmsg-6 10 "PRIVMSG #bar :\1ACTION 6 all nets\1") + (0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: For mine own part,no offence to the general, nor any man of quality,I hope to be saved.") + (0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: Mehercle! if their sons be ingenuous, they shall want no instruction; if their daughters be capable, I will put it to them. But, vir sapit qui pauca loquitur. A soul feminine saluteth us.")) + +((quit 5 "QUIT :\2ERC\2") + (0 ":tester!~u@jnu48g2wrycbw.irc QUIT :Quit")) + +((drop 0 DROP)) diff --git a/test/lisp/erc/resources/commands/amsg-foonet.eld b/test/lisp/erc/resources/commands/amsg-foonet.eld new file mode 100644 index 00000000000..eb3d84d646a --- /dev/null +++ b/test/lisp/erc/resources/commands/amsg-foonet.eld @@ -0,0 +1,56 @@ +;; -*- mode: lisp-data; -*- +((nick 10 "NICK tester")) +((user 10 "USER user 0 * :unknown") + (0 ":irc.foonet.org 001 tester :Welcome to the foonet IRC Network tester") + (0 ":irc.foonet.org 002 tester :Your host is irc.foonet.org, running version oragono-2.6.0-7481bf0385b95b16") + (0 ":irc.foonet.org 003 tester :This server was created Tue, 04 May 2021 05:06:18 UTC") + (0 ":irc.foonet.org 004 tester irc.foonet.org oragono-2.6.0-7481bf0385b95b16 BERTZios CEIMRUabefhiklmnoqstuv Iabefhkloqv") + (0 ":irc.foonet.org 005 tester AWAYLEN=390 BOT=B CASEMAPPING=ascii CHANLIMIT=#:100 CHANMODES=Ibe,k,fl,CEMRUimnstu CHANNELLEN=64 CHANTYPES=# ELIST=U EXCEPTS EXTBAN=,m FORWARD=f INVEX KICKLEN=390 :are supported by this server") + (0 ":irc.foonet.org 005 tester MAXLIST=beI:60 MAXTARGETS=4 MODES MONITOR=100 NETWORK=foonet NICKLEN=32 PREFIX=(qaohv)~&@%+ STATUSMSG=~&@%+ TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,USERHOST:10,PRIVMSG:4,TAGMSG:4,NOTICE:4,MONITOR:100 TOPICLEN=390 UTF8MAPPING=rfc8265 UTF8ONLY WHOX :are supported by this server") + (0 ":irc.foonet.org 005 tester draft/CHATHISTORY=100 :are supported by this server") + (0 ":irc.foonet.org 251 tester :There are 0 users and 3 invisible on 1 server(s)") + (0 ":irc.foonet.org 252 tester 0 :IRC Operators online") + (0 ":irc.foonet.org 253 tester 0 :unregistered connections") + (0 ":irc.foonet.org 254 tester 1 :channels formed") + (0 ":irc.foonet.org 255 tester :I have 3 clients and 0 servers") + (0 ":irc.foonet.org 265 tester 3 3 :Current local users 3, max 3") + (0 ":irc.foonet.org 266 tester 3 3 :Current global users 3, max 3") + (0 ":irc.foonet.org 422 tester :MOTD File is missing")) + +((mode-user 10 "MODE tester +i") + (0 ":irc.foonet.org 221 tester +i") + (0 ":irc.foonet.org NOTICE tester :This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.")) + +((join 10 "JOIN #foo") + (0 ":tester!~u@9g6b728983yd2.irc JOIN #foo") + (0 ":irc.foonet.org 353 tester = #foo :alice tester @bob") + (0 ":irc.foonet.org 366 tester #foo :End of NAMES list")) + +((mode-foo 10 "MODE #foo") + (0 ":irc.foonet.org 324 tester #foo +nt") + (0 ":irc.foonet.org 329 tester #foo 1620104779") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :tester, welcome!") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :tester, welcome!") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: But, as it seems, did violence on herself.") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Well, this is the forest of Arden.")) + +((privmsg-1 10 "PRIVMSG #foo :1 foonet only") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Signior Iachimo will not from it. Pray, let us follow 'em.") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Our queen and all her elves come here anon.")) + +((privmsg-3 10 "PRIVMSG #foo :\1ACTION 3 foonet only\1") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: The ground is bloody; search about the churchyard.") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: You have discharged this honestly: keep it to yourself. Many likelihoods informed me of this before, which hung so tottering in the balance that I could neither believe nor misdoubt. Pray you, leave me: stall this in your bosom; and I thank you for your honest care. I will speak with you further anon.")) + +((privmsg-5 10 "PRIVMSG #foo :5 all nets")) + +((privmsg-6 10 "PRIVMSG #foo :\1ACTION 6 all nets\1") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Give me that mattock, and the wrenching iron.") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Stand you! You have land enough of your own; but he added to your having, gave you some ground.")) + +((privmsg-6 10 "PRIVMSG #foo :7 all live nets") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Excellent workman! Thou canst not paint a man so bad as is thyself.")) + +((privmsg-6 10 "PRIVMSG #foo :\1ACTION 8 all live nets\1") + (0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: And will you, being a man of your breeding, be married under a bush, like a beggar ? Get you to church, and have a good priest that can tell you what marriage is: this fellow will but join you together as they join wainscot; then one of you will prove a shrunk panel, and like green timber, warp, warp.") + (0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Live, and be prosperous; and farewell, good fellow.")) From c7a2b7d023dfef78f6cb6f00fc8194ce8eaaf8a4 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 24 Feb 2024 11:09:05 +0800 Subject: [PATCH 296/446] * configure.ac: Detect renameat2 with gl_CHECK_FUNCS_ANDROID. --- configure.ac | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 71a899f5f40..452aa0838f1 100644 --- a/configure.ac +++ b/configure.ac @@ -5907,13 +5907,15 @@ pthread_sigmask strsignal setitimer \ sendto recvfrom getsockname getifaddrs freeifaddrs \ gai_strerror sync \ endpwent getgrent endgrent \ -renameat2 \ cfmakeraw cfsetspeed __executable_start log2 pthread_setname_np \ pthread_set_name_np]) # getpwent is not present in older versions of Android. (bug#65319) gl_CHECK_FUNCS_ANDROID([getpwent], [[#include ]]) +# renameat2 is not present in older versions of Android. +gl_CHECK_FUNCS_ANDROID([renameat2], [[#include ]]) + if test "$ac_cv_func_cfmakeraw" != "yes"; then # On some systems (Android), cfmakeraw is inline, so AC_CHECK_FUNCS # cannot find it. Check if some code including termios.h and using From 15b6d72599b961ebe23e820e44ba2ffc12e49c31 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 09:21:35 +0200 Subject: [PATCH 297/446] ; * etc/NEWS: How to fix old code that uses vectors as obarrays. --- etc/NEWS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 5653b51784f..6acafe6ea4a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2025,6 +2025,14 @@ The old vector representation is still accepted by functions operating on obarrays, but 'obarrayp' only returns 't' for obarray objects. 'type-of' now returns 'obarray' for obarray objects. +If you have code which creates obarrays as a simple Lisp vector: + + (make-vector N nil) + +and then calls 'intern' using such an obarray as second argument, this +will now signal a wrong-type-argument error; replace nil with zero to +make it work again. + +++ *** New function 'obarray-clear' removes all symbols from an obarray. From 8b1f10f8cf473cdc57e780845393d8681ee2ed4c Mon Sep 17 00:00:00 2001 From: Morgan Smith Date: Fri, 23 Feb 2024 19:03:13 -0500 Subject: [PATCH 298/446] ; Normalize Morgan Smith's attributions. --- .mailmap | 2 +- admin/authors.el | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.mailmap b/.mailmap index 5e733728b5a..32f56c07e1e 100644 --- a/.mailmap +++ b/.mailmap @@ -126,7 +126,7 @@ Maxim Nikulin Michael Albinus Michalis V Miha RihtarÅ”ič -Morgan J. Smith +Morgan Smith Nick Drozd Nicolas Petton Nitish Chandra diff --git a/admin/authors.el b/admin/authors.el index 083023a3dad..78a047f14a4 100644 --- a/admin/authors.el +++ b/admin/authors.el @@ -199,6 +199,7 @@ files.") ("Mikio Nakajima" "Nakajima Mikio") (nil "montag451@laposte\\.net") (nil "na@aisrntairetnraoitn") + ("Morgan Smith" "Morgan J. Smith") ("Nelson Jose dos Santos Ferreira" "Nelson Ferreira") ("Noah Peart" "noah\\.v\\.peart@gmail\\.com") ("Noorul Islam" "Noorul Islam K M") From afe49c7e2a2340432418df264f93d8ac88bca95f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 09:32:06 +0200 Subject: [PATCH 299/446] ; * admin/authors.el (authors-aliases): Fix last change. --- admin/authors.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/authors.el b/admin/authors.el index 78a047f14a4..3764c16adf0 100644 --- a/admin/authors.el +++ b/admin/authors.el @@ -199,7 +199,7 @@ files.") ("Mikio Nakajima" "Nakajima Mikio") (nil "montag451@laposte\\.net") (nil "na@aisrntairetnraoitn") - ("Morgan Smith" "Morgan J. Smith") + ("Morgan Smith" "Morgan J\\. Smith") ("Nelson Jose dos Santos Ferreira" "Nelson Ferreira") ("Noah Peart" "noah\\.v\\.peart@gmail\\.com") ("Noorul Islam" "Noorul Islam K M") From d1fe392f93ce7e71cd378326814ec4e3a4143f0c Mon Sep 17 00:00:00 2001 From: Arash Esbati Date: Sat, 24 Feb 2024 09:30:16 +0100 Subject: [PATCH 300/446] ; Fix compiler warning * lisp/textmodes/reftex-vars.el (reftex-cite-format-builtin): Fix character escaping in the docstring. (bug#69341) --- lisp/textmodes/reftex-vars.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el index a0bc5c11ece..791b10412c9 100644 --- a/lisp/textmodes/reftex-vars.el +++ b/lisp/textmodes/reftex-vars.el @@ -235,11 +235,10 @@ distribution. Mixed-case symbols are convenience aliases.") "ConTeXt bib module" ((?\C-m . "\\cite[%l]") (?s . "\\cite[][%l]") - (?n . "\\nocite[%l]"))) - ) + (?n . "\\nocite[%l]")))) "Builtin versions of the citation format. The following conventions are valid for all alist entries: -`?\C-m' should always point to a straight \\cite{%l} macro. +`?\\C-m' should always point to a straight \\cite{%l} macro. `?t' should point to a textual citation (citation as a noun). `?p' should point to a parenthetical citation.") From 0bdd2eb9af171fa9d825bc6d09e0ad5d114684c4 Mon Sep 17 00:00:00 2001 From: Spencer Baugh Date: Wed, 14 Feb 2024 11:09:33 -0500 Subject: [PATCH 301/446] Add context to errors thrown by server-start during startup When server-start errors during startup, the error is printed to the terminal without context. To help the user understand better what went wrong, that printed error now mentions that the error came from starting up the daemon. * lisp/startup.el (command-line): Catch and annotate errors thrown by server-start. (bug#68799) --- lisp/startup.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/startup.el b/lisp/startup.el index 1c21b5de857..33e1124b998 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1639,7 +1639,9 @@ Consider using a subdirectory instead, e.g.: %s" (let ((dn (daemonp))) (when dn (when (stringp dn) (setq server-name dn)) - (server-start) + (condition-case err + (server-start) + (error (error "Unable to start daemon: %s; exiting" (error-message-string err)))) (if server-process (daemon-initialized) (if (stringp dn) From 526c262149839702b94253d5eff195054ac5cd9e Mon Sep 17 00:00:00 2001 From: Spencer Baugh Date: Tue, 13 Feb 2024 12:20:39 -0500 Subject: [PATCH 302/446] Check daemon is initialized before suppressing its init errors Previously, the default error handler would correctly suppress unhandled errors raised when IS_DAEMON and the initial frame was current, since this is the normal state of operation for a daemon-mode Emacs. However, this also incorrectly suppressed errors raised while a daemon-mode Emacs was starting up. Now, errors raised while a daemon-mode Emacs is starting up will be handled just like errors when a non-daemon Emacs is starting up. This was previously the case before changes for bug#1310 and bug#1836, which added the suppression of errors when IS_DAEMON. DAEMON_RUNNING didn't exist at the time of those changes, but now it does, so we can do better. * src/keyboard.c (Fcommand_error_default_function): Check !DAEMON_RUNNING in addition to IS_DAEMON. (Bug#68799) * src/lisp.h (DAEMON_RUNNING): Add a clarifying comment about what this #define means. --- src/keyboard.c | 5 +++-- src/lisp.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 4b5e20fb24c..eb0de98bad1 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1076,8 +1076,9 @@ Default value of `command-error-function'. */) write to stderr and quit. In daemon mode, there are many other potential errors that do not prevent frames from being created, so continuing as normal is better in - that case. */ - || (!IS_DAEMON && FRAME_INITIAL_P (sf)) + that case, as long as the daemon has actually finished + initialization. */ + || (!(IS_DAEMON && !DAEMON_RUNNING) && FRAME_INITIAL_P (sf)) || noninteractive)) { print_error_message (data, Qexternal_debugging_output, diff --git a/src/lisp.h b/src/lisp.h index 5fbbef80e8e..309bea02238 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -5153,6 +5153,7 @@ extern bool build_details; /* 0 not a daemon, 1 foreground daemon, 2 background daemon. */ extern int daemon_type; #define IS_DAEMON (daemon_type != 0) +/* True means daemon-initialized has not yet been called. */ #define DAEMON_RUNNING (daemon_type >= 0) #else /* WINDOWSNT */ extern void *w32_daemon_event; From 03fce8401639a1d60bb66bf374d3d44b3331ac8a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 11:27:12 +0200 Subject: [PATCH 303/446] ; Fix last change in lisp.h. --- src/lisp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lisp.h b/src/lisp.h index 309bea02238..f353e4956eb 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -5153,7 +5153,7 @@ extern bool build_details; /* 0 not a daemon, 1 foreground daemon, 2 background daemon. */ extern int daemon_type; #define IS_DAEMON (daemon_type != 0) -/* True means daemon-initialized has not yet been called. */ +/* Non-zero means daemon-initialized has not yet been called. */ #define DAEMON_RUNNING (daemon_type >= 0) #else /* WINDOWSNT */ extern void *w32_daemon_event; From 01ebc95114fe89ef623bc7ebdd3c3e1b9ef06b4e Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 11:59:30 +0200 Subject: [PATCH 304/446] Fix 'help-quick-toggle' * lisp/help.el (help-quick-sections): Fix "kill-region" command. Add a doc string. (Bug#69345) --- lisp/help.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lisp/help.el b/lisp/help.el index accd01e56f5..24e4b9890a7 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -151,7 +151,7 @@ buffer.") ("Mark & Kill" (set-mark-command . "mark") (kill-line . "kill line") - (kill-ring-save . "kill region") + (kill-region . "kill region") (yank . "yank") (exchange-point-and-mark . "swap")) ("Projects" @@ -165,7 +165,15 @@ buffer.") (isearch-forward . "search") (isearch-backward . "reverse search") (query-replace . "search & replace") - (fill-paragraph . "reformat")))) + (fill-paragraph . "reformat"))) + "Data structure for `help-quick'. +Value should be a list of elements, each element should of the form + + (GROUP-NAME (COMMAND . DESCRIPTION) (COMMAND . DESCRIPTION)...) + +where GROUP-NAME is the name of the group of the commands, +COMMAND is the symbol of a command and DESCRIPTION is its short +description, 10 to 15 char5acters at most.") (declare-function prop-match-value "text-property-search" (match)) From 477eb882b57b3defd43ea8dd9510cfdf5fd9ee79 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 13 Feb 2024 10:38:48 +0100 Subject: [PATCH 305/446] Add sml-mode entry to 'eglot-server-programs' * lisp/progmodes/eglot.el (eglot-server-programs): Use the "millet" LSP server (https://github.com/azdavis/millet). --- lisp/progmodes/eglot.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 2f32a8e6eda..f341428cac3 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -310,7 +310,10 @@ automatically)." ("vscode-markdown-language-server" "--stdio")))) (graphviz-dot-mode . ("dot-language-server" "--stdio")) (terraform-mode . ("terraform-ls" "serve")) - ((uiua-ts-mode uiua-mode) . ("uiua" "lsp"))) + ((uiua-ts-mode uiua-mode) . ("uiua" "lsp")) + (sml-mode + . ,(lambda (_interactive project) + (list "millet-ls" (project-root project))))) "How the command `eglot' guesses the server to start. An association list of (MAJOR-MODE . CONTACT) pairs. MAJOR-MODE identifies the buffers that are to be managed by a specific From 1972beda6de3d6895cc197dc292721ca963b234c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 24 Feb 2024 11:43:28 +0100 Subject: [PATCH 306/446] ; * etc/NEWS: Recommend obarray-make as correct replacement. --- etc/NEWS | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 6acafe6ea4a..a47376f7f02 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2025,13 +2025,9 @@ The old vector representation is still accepted by functions operating on obarrays, but 'obarrayp' only returns 't' for obarray objects. 'type-of' now returns 'obarray' for obarray objects. -If you have code which creates obarrays as a simple Lisp vector: - - (make-vector N nil) - -and then calls 'intern' using such an obarray as second argument, this -will now signal a wrong-type-argument error; replace nil with zero to -make it work again. +Old code which incorrectly created "obarrays" as Lisp vectors filled +with something other than 0, as in '(make-vector N nil)', will no longer +work at all and should be rewritten to use 'obarray-make'. +++ *** New function 'obarray-clear' removes all symbols from an obarray. From 4eed2768b10d074612853b68248a4b255a5c7d58 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 13:03:11 +0200 Subject: [PATCH 307/446] ; Fix last change. --- etc/NEWS | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index a47376f7f02..0578da899bb 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2025,9 +2025,10 @@ The old vector representation is still accepted by functions operating on obarrays, but 'obarrayp' only returns 't' for obarray objects. 'type-of' now returns 'obarray' for obarray objects. -Old code which incorrectly created "obarrays" as Lisp vectors filled +Old code which (incorrectly) created "obarrays" as Lisp vectors filled with something other than 0, as in '(make-vector N nil)', will no longer -work at all and should be rewritten to use 'obarray-make'. +work, and should be rewritten to use 'obarray-make'. Alternatively, you +can fill the vector with 0. +++ *** New function 'obarray-clear' removes all symbols from an obarray. From eeb89a5cb292bffe40ba7d0b0cf81f82f8452bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 24 Feb 2024 12:08:09 +0100 Subject: [PATCH 308/446] Suppress docstring control char warning in macro-generated function * lisp/progmodes/cc-defs.el (c-lang-defconst): Make sure that `val` won't be treated as a docstring. --- lisp/progmodes/cc-defs.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index e45ab76ec07..2c793c8a99d 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -2579,7 +2579,8 @@ constant. A file is identified by its base name." ;; dependencies on the `c-lang-const's in VAL.) (setq val (c--macroexpand-all val)) - (setq bindings `(cons (cons ',assigned-mode (lambda () ,val)) ,bindings) + (setq bindings `(cons (cons ',assigned-mode (lambda () nil ,val)) + ,bindings) args (cdr args)))) ;; Compile in the other files that have provided source From 0530800175913769cb55ae7997ee4487a755a0a4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 15:12:57 +0200 Subject: [PATCH 309/446] Fix infinite recursion in gdb-mi.el * lisp/progmodes/gdb-mi.el: (gdb-clear-partial-output) (gdb-clear-inferior-io): Set inhibit-read-only, to avoid signaling errors in process filter. (Bug#69327) --- lisp/progmodes/gdb-mi.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index d119eeb74ac..312b71ba640 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -1849,7 +1849,8 @@ this trigger is subscribed to `gdb-buf-publisher' and called with (defun gdb-clear-inferior-io () (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io) - (erase-buffer))) + (let ((inhibit-read-only t)) + (erase-buffer)))) (defconst breakpoint-xpm-data @@ -2819,7 +2820,8 @@ current thread and update GDB buffers." (defun gdb-clear-partial-output () (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer) - (erase-buffer))) + (let ((inhibit-read-only t)) + (erase-buffer)))) ;; Parse GDB/MI result records: this process converts ;; list [...] -> list From 3076e79a6a11f9df33c5bcaa7aa58955550aeef0 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 24 Feb 2024 17:13:47 +0200 Subject: [PATCH 310/446] ; Fix a recent change in diff-mode.el * lisp/vc/diff-mode.el (diff-refine-nonmodified): Doc fix. * etc/NEWS: Improve wording. --- etc/NEWS | 7 +++++-- lisp/vc/diff-mode.el | 10 ++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 0578da899bb..882d97ec423 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -598,8 +598,11 @@ It allows tweaking the thresholds for rename and copy detection. --- *** New user option 'diff-refine-nonmodified'. -Makes 'diff-refine' highlight added and removed whole lines with the -same faces as the words added and removed within modified lines. +When this is non-nil, 'diff-refine' will highlight lines that were added +or removed in their entirety (as opposed to modified lines, where some +parts of the line were modified), using the same faces as for +highlighting the words added and removed within modified lines. The +default value is nil. +++ *** 'diff-ignore-whitespace-hunk' can now be applied to all hunks. diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index f914cc76790..14a401667e9 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2283,8 +2283,14 @@ Return new point, if it was moved." (overlay-put ol 'face face))) (defcustom diff-refine-nonmodified nil - "If non-nil also highlight as \"refined\" the added/removed lines. -This is currently only implemented for `unified' diffs." + "If non-nil, also highlight the added/removed lines as \"refined\". +The lines highlighted when this is non-nil are those that were +added or removed in their entirety, as opposed to lines some +parts of which were modified. The added lines are highlighted +using the `diff-refine-added' face, while the removed lines are +highlighted using the `diff-refine-removed' face. +This is currently implemented only for diff formats supported +by `diff-refine-hunk'." :version "30.1" :type 'boolean) From 68096a716bfe3c212a68b3d285a0386ea0867130 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 24 Feb 2024 11:02:37 -0500 Subject: [PATCH 311/446] (diff-refine-nonmodified): Complete the implementation * lisp/vc/diff-mode.el (diff--refine-hunk): Implement `diff-refine-nonmodified` for old-style-context and "normal" diffs. --- lisp/vc/diff-mode.el | 47 ++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 14a401667e9..99ac50c155a 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2333,26 +2333,43 @@ by `diff-refine-hunk'." ('context (let* ((middle (save-excursion (re-search-forward "^---" end t))) (other middle)) - (while (and middle - (re-search-forward "^\\(?:!.*\n\\)+" middle t)) - (smerge-refine-regions (match-beginning 0) (match-end 0) - (save-excursion - (goto-char other) - (re-search-forward "^\\(?:!.*\n\\)+" end) - (setq other (match-end 0)) - (match-beginning 0)) - other - (if diff-use-changed-face props-c) - #'diff-refine-preproc - (unless diff-use-changed-face props-r) - (unless diff-use-changed-face props-a))))) + (when middle + (while (re-search-forward "^\\(?:!.*\n\\)+" middle t) + (smerge-refine-regions (match-beginning 0) (match-end 0) + (save-excursion + (goto-char other) + (re-search-forward "^\\(?:!.*\n\\)+" end) + (setq other (match-end 0)) + (match-beginning 0)) + other + (if diff-use-changed-face props-c) + #'diff-refine-preproc + (unless diff-use-changed-face props-r) + (unless diff-use-changed-face props-a))) + (when diff-refine-nonmodified + (goto-char beg) + (while (re-search-forward "^\\(?:-.*\n\\)+" middle t) + (diff--refine-propertize (match-beginning 0) + (match-end 0) + 'diff-refine-removed)) + (goto-char middle) + (while (re-search-forward "^\\(?:+.*\n\\)+" end t) + (diff--refine-propertize (match-beginning 0) + (match-end 0) + 'diff-refine-added)))))) (_ ;; Normal diffs. (let ((beg1 (1+ (point)))) - (when (re-search-forward "^---.*\n" end t) + (cond + ((re-search-forward "^---.*\n" end t) ;; It's a combined add&remove, so there's something to do. (smerge-refine-regions beg1 (match-beginning 0) (match-end 0) end - nil #'diff-refine-preproc props-r props-a))))))) + nil #'diff-refine-preproc props-r props-a)) + (diff-refine-nonmodified + (diff--refine-propertize + beg1 end + (if (eq (char-after beg1) ?<) + 'diff-refine-removed 'diff-refine-added))))))))) (defun diff--iterate-hunks (max fun) "Iterate over all hunks between point and MAX. From 56beeff14365d8e802ab7b4888aa7e95b2cf9509 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 24 Feb 2024 12:23:41 -0500 Subject: [PATCH 312/446] * src/editfns.c (Fget_pos_property): Fix thinko (bug#69358) --- src/editfns.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/editfns.c b/src/editfns.c index cce52cddbf8..4ccf765bd4b 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -301,8 +301,8 @@ at POSITION. */) struct buffer *obuf = current_buffer; struct itree_node *node; struct sortvec items[2]; - struct sortvec *result = NULL; struct buffer *b = XBUFFER (object); + struct sortvec *result = NULL; Lisp_Object res = Qnil; set_buffer_temp (b); @@ -326,7 +326,10 @@ at POSITION. */) if (NILP (res) || (make_sortvec_item (this, node->data), compare_overlays (result, this) < 0)) - res = tem; + { + result = this; + res = tem; + } } set_buffer_temp (obuf); From de6b1e1efb1a36c69e7a6e09297e1de5b1477121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sat, 24 Feb 2024 17:47:37 +0100 Subject: [PATCH 313/446] Replace XSETSYMBOL with make_lisp_symbol * src/lisp.h (XSETSYMBOL): Remove. All callers changed to use make_lisp_symbol. --- src/alloc.c | 12 ++++-------- src/buffer.c | 4 ++-- src/data.c | 33 ++++++++++++++------------------- src/eval.c | 2 +- src/lisp.h | 1 - 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 2ffd2415447..16257469aa6 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3960,7 +3960,7 @@ Its value is void, and its function definition and property list are nil. */) if (symbol_free_list) { ASAN_UNPOISON_SYMBOL (symbol_free_list); - XSETSYMBOL (val, symbol_free_list); + val = make_lisp_symbol (symbol_free_list); symbol_free_list = symbol_free_list->u.s.next; } else @@ -3976,7 +3976,7 @@ Its value is void, and its function definition and property list are nil. */) } ASAN_UNPOISON_SYMBOL (&symbol_block->symbols[symbol_block_index]); - XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index]); + val = make_lisp_symbol (&symbol_block->symbols[symbol_block_index]); symbol_block_index++; } @@ -7398,12 +7398,8 @@ process_mark_stack (ptrdiff_t base_sp) mark_stack_push_value (SYMBOL_VAL (ptr)); break; case SYMBOL_VARALIAS: - { - Lisp_Object tem; - XSETSYMBOL (tem, SYMBOL_ALIAS (ptr)); - mark_stack_push_value (tem); - break; - } + mark_stack_push_value (make_lisp_symbol (SYMBOL_ALIAS (ptr))); + break; case SYMBOL_LOCALIZED: { struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr); diff --git a/src/buffer.c b/src/buffer.c index d67e1d67cd6..e235ff8f9f8 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1334,7 +1334,7 @@ buffer_local_value (Lisp_Object variable, Lisp_Object buffer) case SYMBOL_LOCALIZED: { /* Look in local_var_alist. */ struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); - XSETSYMBOL (variable, sym); /* Update In case of aliasing. */ + variable = make_lisp_symbol (sym); /* Update In case of aliasing. */ result = assq_no_quit (variable, BVAR (buf, local_var_alist)); if (!NILP (result)) { @@ -4971,7 +4971,7 @@ defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd, const char *namestring, sym->u.s.declared_special = true; sym->u.s.redirect = SYMBOL_FORWARDED; SET_SYMBOL_FWD (sym, bo_fwd); - XSETSYMBOL (PER_BUFFER_SYMBOL (offset), sym); + PER_BUFFER_SYMBOL (offset) = make_lisp_symbol (sym); if (PER_BUFFER_IDX (offset) == 0) /* Did a DEFVAR_PER_BUFFER without initializing the corresponding diff --git a/src/data.c b/src/data.c index bb4cdd62d66..da507901b76 100644 --- a/src/data.c +++ b/src/data.c @@ -1256,7 +1256,7 @@ If OBJECT is not a symbol, just return it. */) struct Lisp_Symbol *sym = XSYMBOL (object); while (sym->u.s.redirect == SYMBOL_VARALIAS) sym = SYMBOL_ALIAS (sym); - XSETSYMBOL (object, sym); + object = make_lisp_symbol (sym); } return object; } @@ -1506,12 +1506,9 @@ swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_ if (blv->fwd.fwdptr) set_blv_value (blv, do_symval_forwarding (blv->fwd)); /* Choose the new binding. */ - { - Lisp_Object var; - XSETSYMBOL (var, symbol); - tem1 = assq_no_quit (var, BVAR (current_buffer, local_var_alist)); - set_blv_where (blv, Fcurrent_buffer ()); - } + tem1 = assq_no_quit (make_lisp_symbol (symbol), + BVAR (current_buffer, local_var_alist)); + set_blv_where (blv, Fcurrent_buffer ()); if (!(blv->found = !NILP (tem1))) tem1 = blv->defcell; @@ -1655,7 +1652,8 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, set_blv_value (blv, do_symval_forwarding (blv->fwd)); /* Find the new binding. */ - XSETSYMBOL (symbol, sym); /* May have changed via aliasing. */ + /* May have changed via aliasing. */ + symbol = make_lisp_symbol (sym); Lisp_Object tem1 = assq_no_quit (symbol, BVAR (XBUFFER (where), local_var_alist)); @@ -2059,13 +2057,10 @@ make_blv (struct Lisp_Symbol *sym, bool forwarded, union Lisp_Val_Fwd valcontents) { struct Lisp_Buffer_Local_Value *blv = xmalloc (sizeof *blv); - Lisp_Object symbol; - Lisp_Object tem; - - XSETSYMBOL (symbol, sym); - tem = Fcons (symbol, (forwarded - ? do_symval_forwarding (valcontents.fwd) - : valcontents.value)); + Lisp_Object tem = Fcons (make_lisp_symbol (sym), + forwarded + ? do_symval_forwarding (valcontents.fwd) + : valcontents.value); /* Buffer_Local_Values cannot have as realval a buffer-local or keyboard-local forwarding. */ @@ -2221,7 +2216,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */) } /* Make sure this buffer has its own value of symbol. */ - XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ + variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist)); if (NILP (tem)) { @@ -2301,7 +2296,7 @@ From now on the default value will apply in this buffer. Return VARIABLE. */) notify_variable_watchers (variable, Qnil, Qmakunbound, Fcurrent_buffer ()); /* Get rid of this buffer's alist element, if any. */ - XSETSYMBOL (variable, sym); /* Propagate variable indirection. */ + variable = make_lisp_symbol (sym); /* Propagate variable indirection. */ tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist)); if (!NILP (tem)) bset_local_var_alist @@ -2346,7 +2341,7 @@ Also see `buffer-local-boundp'.*/) Lisp_Object tmp; struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); XSETBUFFER (tmp, buf); - XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ + variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ if (EQ (blv->where, tmp)) /* The binding is already loaded. */ return blv_found (blv) ? Qt : Qnil; @@ -2396,7 +2391,7 @@ value in BUFFER, or if VARIABLE is automatically buffer-local (see struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); if (blv->local_if_set) return Qt; - XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ + variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ return Flocal_variable_p (variable, buffer); } case SYMBOL_FORWARDED: diff --git a/src/eval.c b/src/eval.c index 95eb21909d2..9d3b98eb359 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3475,7 +3475,7 @@ specbind (Lisp_Object symbol, Lisp_Object value) switch (sym->u.s.redirect) { case SYMBOL_VARALIAS: - sym = SYMBOL_ALIAS (sym); XSETSYMBOL (symbol, sym); goto start; + sym = SYMBOL_ALIAS (sym); symbol = make_lisp_symbol (sym); goto start; case SYMBOL_PLAINVAL: /* The most common case is that of a non-constant symbol with a trivial value. Make that as fast as we can. */ diff --git a/src/lisp.h b/src/lisp.h index f353e4956eb..4fc44745211 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1380,7 +1380,6 @@ make_lisp_ptr (void *ptr, enum Lisp_Type type) #define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons)) #define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike)) #define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String)) -#define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (b)) #define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float)) /* Return a Lisp_Object value that does not correspond to any object. From 5fa6042c739b2b0abb320964d5391704c8fbb5a6 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 24 Feb 2024 12:49:20 -0500 Subject: [PATCH 314/446] * etc/NEWS.25: Add missing announcement of 'obarray' package --- etc/NEWS.25 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etc/NEWS.25 b/etc/NEWS.25 index 3c5e9569b49..1f26e7705d9 100644 --- a/etc/NEWS.25 +++ b/etc/NEWS.25 @@ -1158,6 +1158,11 @@ few or no entries have changed. * New Modes and Packages in Emacs 25.1 +** New preloaded package 'obarray' + +Provides obarray operations under the 'obarray-' prefix, such as +'obarray-make' and 'obarray-map'. + ** pinentry.el allows GnuPG passphrase to be prompted through the minibuffer instead of a graphical dialog, depending on whether the gpg command is called from Emacs (i.e., INSIDE_EMACS environment variable From 0503657a9cffbe3a5fc4f0023ee9985073e62d2c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 24 Feb 2024 13:12:20 -0500 Subject: [PATCH 315/446] * etc/NEWS.25: Add 'obarrayp' as well --- etc/NEWS.25 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/NEWS.25 b/etc/NEWS.25 index 1f26e7705d9..f647809074b 100644 --- a/etc/NEWS.25 +++ b/etc/NEWS.25 @@ -1161,7 +1161,7 @@ few or no entries have changed. ** New preloaded package 'obarray' Provides obarray operations under the 'obarray-' prefix, such as -'obarray-make' and 'obarray-map'. +'obarray-make', 'obarrayp', and 'obarray-map'. ** pinentry.el allows GnuPG passphrase to be prompted through the minibuffer instead of a graphical dialog, depending on whether the gpg From 9a801f0b4621a46149ccf650ed1dc27942157562 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 24 Feb 2024 17:52:14 -0500 Subject: [PATCH 316/446] * lisp/progmodes/elisp-mode.el (eval-last-sexp, eval-defun): Fix thinko --- lisp/progmodes/elisp-mode.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index 4b1f8022f81..8a713bd19a2 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -1630,7 +1630,8 @@ If `eval-expression-debug-on-error' is non-nil, which is the default, this command arranges for all errors to enter the debugger." (interactive "P") (values--store-value - (handler-bind ((error (if #'eval-expression--debug #'ignore))) + (handler-bind ((error (if eval-expression-debug-on-error + #'eval-expression--debug #'ignore))) (elisp--eval-last-sexp eval-last-sexp-arg-internal)))) (defun elisp--eval-defun-1 (form) @@ -1769,7 +1770,8 @@ which see." (defvar edebug-all-defs) (eval-defun (not edebug-all-defs))) (t - (handler-bind ((error (if #'eval-expression--debug #'ignore))) + (handler-bind ((error (if eval-expression-debug-on-error + #'eval-expression--debug #'ignore))) (elisp--eval-defun))))) ;;; ElDoc Support From 05116eac0c199b0c8409a32b349a42a21b5a0fb0 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 25 Feb 2024 11:41:02 +0800 Subject: [PATCH 317/446] Arrange for dialog boxes during emacsclient requests on Android * lisp/server.el (server-execute): Bind use-dialog-box-override if (featurep 'android). * lisp/subr.el (use-dialog-box-override): New option. (use-dialog-box-p): Always display dialog boxes if variable is set. --- lisp/server.el | 6 +++++- lisp/subr.el | 22 ++++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lisp/server.el b/lisp/server.el index 66e6d729f8a..b65053267a6 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -1439,7 +1439,11 @@ invocations of \"emacs\".") ;; including code that needs to wait. (with-local-quit (condition-case err - (let ((buffers (server-visit-files files proc nowait))) + (let ((buffers (server-visit-files files proc nowait)) + ;; On Android, the Emacs server generally can't provide + ;; feedback to the user except by means of dialog boxes, + ;; which are displayed in the GUI emacsclient wrapper. + (use-dialog-box-override (featurep 'android))) (mapc 'funcall (nreverse commands)) (let ((server-eval-args-left (nreverse evalexprs))) (while server-eval-args-left diff --git a/lisp/subr.el b/lisp/subr.el index c317d558e24..30314343650 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3832,16 +3832,22 @@ confusing to some users.") (declare-function android-detect-keyboard "androidfns.c") +(defvar use-dialog-box-override nil + "Whether `use-dialog-box-p' should always return t.") + (defun use-dialog-box-p () "Return non-nil if the current command should prompt the user via a dialog box." - (and last-input-event ; not during startup - (or (consp last-nonmenu-event) ; invoked by a mouse event - (and (null last-nonmenu-event) - (consp last-input-event)) - (and (featurep 'android) ; Prefer dialog boxes on Android. - (not (android-detect-keyboard))) ; If no keyboard is connected. - from--tty-menu-p) ; invoked via TTY menu - use-dialog-box)) + (or use-dialog-box-override + (and last-input-event ; not during startup + (or (consp last-nonmenu-event) ; invoked by a mouse event + (and (null last-nonmenu-event) + (consp last-input-event)) + (and (featurep 'android) ; Prefer dialog boxes on + ; Android. + (not (android-detect-keyboard))) ; If no keyboard is + ; connected. + from--tty-menu-p) ; invoked via TTY menu + use-dialog-box))) ;; Actually in textconv.c. (defvar overriding-text-conversion-style) From 782ff2f826e2fde75f6491f3a6cf0d7fcd5510b2 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 25 Feb 2024 08:20:44 +0200 Subject: [PATCH 318/446] * nt/cmdproxy.c (_snprintf) [_UCRT]: Redirect to 'snprintf'. --- nt/cmdproxy.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c index 0500b653bb2..c012151cf96 100644 --- a/nt/cmdproxy.c +++ b/nt/cmdproxy.c @@ -38,6 +38,14 @@ along with GNU Emacs. If not, see . */ #include /* strlen */ #include /* isspace, isalpha */ +/* UCRT has a C99-compatible snprintf, and _snprintf is defined inline + in stdio.h, which we don't want to include here. Since the + differences in behavior between snprintf and _snprintf don't matter + in this file, we take the easy way out. */ +#ifdef _UCRT +# define _snprintf snprintf +#endif + /* We don't want to include stdio.h because we are already duplicating lots of it here */ extern int _snprintf (char *buffer, size_t count, const char *format, ...); From 6b800f9adf3506bf113539cf22cd07c7cda9f7b8 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 25 Feb 2024 09:32:45 +0200 Subject: [PATCH 319/446] * lisp/progmodes/project.el (project-any-command): Allow local keymaps. Use overriding-terminal-local-map instead of overriding-local-map. This allows using keys from local maps (bug#69242). --- lisp/progmodes/project.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index aa92a73336e..9622b1b6768 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -1866,12 +1866,12 @@ Otherwise, `default-directory' is temporarily set to the current project's root. If OVERRIDING-MAP is non-nil, it will be used as -`overriding-local-map' to provide shorter bindings from that map -which will take priority over the global ones." +`overriding-terminal-local-map' to provide shorter bindings +from that map which will take priority over the global ones." (interactive) (let* ((pr (project-current t)) (prompt-format (or prompt-format "[execute in %s]:")) - (command (let ((overriding-local-map overriding-map)) + (command (let ((overriding-terminal-local-map overriding-map)) (key-binding (read-key-sequence (format prompt-format (project-root pr))) t))) From e680827e814e155cf79175d87ff7c6ee3a08b69a Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Fri, 16 Feb 2024 22:07:18 +0100 Subject: [PATCH 320/446] Don't warn about _ not left unused in if-let and alike The macro expansions did not leave a variable _ unused; this triggered an irritating compiler warning (bug#69108). * lisp/subr.el (internal--build-binding): Handle bindings of the form (_ EXPR) separately. --- lisp/subr.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/subr.el b/lisp/subr.el index 30314343650..301e2e42566 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2580,6 +2580,8 @@ Affects only hooks run in the current buffer." (list binding binding)) ((null (cdr binding)) (list (make-symbol "s") (car binding))) + ((eq '_ (car binding)) + (list (make-symbol "s") (cadr binding))) (t binding))) (when (> (length binding) 2) (signal 'error From 67ba629a91aee3db39f3c81744e88c02ee710bdc Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Sun, 18 Feb 2024 02:27:56 +0100 Subject: [PATCH 321/446] ; * lisp/subr.el (if-let, and-let*): Tweak doc strings. (Bug#69108) --- lisp/subr.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index 301e2e42566..e2279170297 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2622,7 +2622,7 @@ This is like `when-let' but doesn't handle a VARLIST of the form (defmacro and-let* (varlist &rest body) "Bind variables according to VARLIST and conditionally evaluate BODY. Like `when-let*', except if BODY is empty and all the bindings -are non-nil, then the result is non-nil." +are non-nil, then the result is the value of the last binding." (declare (indent 1) (debug if-let*)) (let (res) (if varlist @@ -2635,7 +2635,8 @@ are non-nil, then the result is non-nil." "Bind variables according to SPEC and evaluate THEN or ELSE. Evaluate each binding in turn, as in `let*', stopping if a binding value is nil. If all are non-nil return the value of -THEN, otherwise the last form in ELSE. +THEN, otherwise the value of the last form in ELSE, or nil if +there are none. Each element of SPEC is a list (SYMBOL VALUEFORM) that binds SYMBOL to the value of VALUEFORM. An element can additionally be From 39e3fce0d5e0f5db00e44905bcd2590170098d63 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sun, 25 Feb 2024 10:06:09 +0100 Subject: [PATCH 322/446] 'read-passwd' can toggle the visibility of passwords * doc/lispref/minibuf.texi (Reading a Password): * etc/NEWS: 'read-passwd' can toggle the visibility of passwords. * etc/images/README: Mention the new images below. * etc/images/conceal.pbm: * etc/images/conceal.svg: * etc/images/reveal.pbm: * etc/images/reveal.svg: New images. * lisp/simple.el (read-passwd--mode-line-buffer) (read-passwd--mode-line-icon): New defvars. (read-passwd--toggle-visibility, read-passwd-mode): New defuns. * lisp/subr.el (read-passwd-map): Add 'TAB' binding. (read-passwd--hide-password): New defvar. (read-passwd--hide-password): Rename function from `read-password--hide-password'. Adapt callees. Implement both hiding and showing the password. (Bug#69237) (read-passwd): Call `read-passwd-mode'. --- doc/lispref/minibuf.texi | 8 ++++ etc/NEWS | 11 +++++- etc/images/README | 7 +++- etc/images/conceal.pbm | Bin 0 -> 41 bytes etc/images/conceal.svg | 4 ++ etc/images/reveal.pbm | Bin 0 -> 41 bytes etc/images/reveal.svg | 4 ++ lisp/simple.el | 81 +++++++++++++++++++++++++++++++++++++++ lisp/subr.el | 21 +++++++--- 9 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 etc/images/conceal.pbm create mode 100644 etc/images/conceal.svg create mode 100644 etc/images/reveal.pbm create mode 100644 etc/images/reveal.svg diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi index aa27de72ba0..0247c93f7b8 100644 --- a/doc/lispref/minibuf.texi +++ b/doc/lispref/minibuf.texi @@ -2562,6 +2562,14 @@ times match. The optional argument @var{default} specifies the default password to return if the user enters empty input. If @var{default} is @code{nil}, then @code{read-passwd} returns the null string in that case. + +This function uses @code{read-passwd-mode}, a minor mode. It binds two +keys in the minbuffer: @kbd{C-u} (@code{delete-minibuffer-contents}) +deletes the password, and @kbd{TAB} +(@code{read-passwd--toggle-visibility}) toggles the visibility of the +password. There is also an additional icon in the mode-line. Clicking +on this icon with @key{mouse-1} toggles the visibility of the password +as well. @end defun @node Minibuffer Commands diff --git a/etc/NEWS b/etc/NEWS index 882d97ec423..6d444daf152 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -322,6 +322,12 @@ Previously, it was set to t but this broke remote file name detection. ** Multi-character key echo now ends with a suggestion to use Help. Customize 'echo-keystrokes-help' to nil to prevent that. ++++ +** 'read-passwd' can toggle the visibility of passwords. +Use 'TAB' in the minibuffer to show or hide the password. Likewise, +there is an icon on the mode-line, which toggles the visibility of the +password when clicking with 'mouse-1'. + * Editing Changes in Emacs 30.1 @@ -1939,7 +1945,8 @@ Example: "Uses c:\remote\dir\files and the key \C-x." ...) -where the doc string contains four control characters CR, DEL, FF and ^X. +where the docstring contains four control characters 'CR', 'DEL', 'FF' +and 'C-x'. The warning name is 'docstrings-control-chars'. @@ -2025,7 +2032,7 @@ automatically, which means that the size parameter to 'obarray-make' can safely be omitted. That is, they do not become slower as they fill up. The old vector representation is still accepted by functions operating -on obarrays, but 'obarrayp' only returns 't' for obarray objects. +on obarrays, but 'obarrayp' only returns t for obarray objects. 'type-of' now returns 'obarray' for obarray objects. Old code which (incorrectly) created "obarrays" as Lisp vectors filled diff --git a/etc/images/README b/etc/images/README index a778d9ce6c3..8e112448373 100644 --- a/etc/images/README +++ b/etc/images/README @@ -125,7 +125,7 @@ For more information see the adwaita-icon-theme repository at: https://gitlab.gnome.org/GNOME/adwaita-icon-theme -Emacs images and their source in the Adwaita/scalable directory: +Emacs images and their source in the Adwaita/symbolic directory: checked.svg ui/checkbox-checked-symbolic.svg unchecked.svg ui/checkbox-symbolic.svg @@ -137,3 +137,8 @@ Emacs images and their source in the Adwaita/scalable directory: left.svg ui/pan-start-symbolic.svg right.svg ui/pan-end-symbolic.svg up.svg ui/pan-up-symbolic.svg + conceal.svg actions/view-conceal-symbolic.svg + reveal.svg actions/view-reveal-symbolic.svg + +conceal.pbm and reveal.pbm are generated from the respective *.svg +files, using the ImageMagick converter tool. diff --git a/etc/images/conceal.pbm b/etc/images/conceal.pbm new file mode 100644 index 0000000000000000000000000000000000000000..3df787d6fd60b8efaf82cd6b2d9fca47473e81d8 GIT binary patch literal 41 xcmWGA;W9K+Ff`+0U`Svne_;PZ#>P)Bz3=n+kLL^CRn*zo$j@Ov$H2zG000o_4iW$W literal 0 HcmV?d00001 diff --git a/etc/images/conceal.svg b/etc/images/conceal.svg new file mode 100644 index 00000000000..172b73ed3d3 --- /dev/null +++ b/etc/images/conceal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/etc/images/reveal.pbm b/etc/images/reveal.pbm new file mode 100644 index 0000000000000000000000000000000000000000..79d2f1f330769ba7344ac6b8218fd17c1f99bac3 GIT binary patch literal 41 ucmWGA;W9K+Ff`+000Q<0@;_{BD&z|LKA-=5zOb)C&c;Um2m1q{6axVFcnu){ literal 0 HcmV?d00001 diff --git a/etc/images/reveal.svg b/etc/images/reveal.svg new file mode 100644 index 00000000000..41ae3733a53 --- /dev/null +++ b/etc/images/reveal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lisp/simple.el b/lisp/simple.el index 9a33049f4ca..5992afec255 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -10858,6 +10858,87 @@ and setting it to nil." (setq-local vis-mode-saved-buffer-invisibility-spec buffer-invisibility-spec) (setq buffer-invisibility-spec nil))) + + +(defvar read-passwd--mode-line-buffer nil + "Buffer to modify `mode-line-format' for showing/hiding passwords.") + +(defvar read-passwd--mode-line-icon nil + "Propertized mode line icon for showing/hiding passwords.") + +(defun read-passwd--toggle-visibility () + "Toggle minibuffer contents visibility. +Adapt also mode line." + (interactive) + (setq read-passwd--hide-password (not read-passwd--hide-password)) + (with-current-buffer read-passwd--mode-line-buffer + (setq read-passwd--mode-line-icon + `(:propertize + ,(if icon-preference + (icon-string + (if read-passwd--hide-password + 'read-passwd--show-password-icon + 'read-passwd--hide-password-icon)) + "") + mouse-face mode-line-highlight + local-map + (keymap + (mode-line keymap (mouse-1 . read-passwd--toggle-visibility))))) + (force-mode-line-update)) + (read-passwd--hide-password)) + +(define-minor-mode read-passwd-mode + "Toggle visibility of password in minibuffer." + :group 'mode-line + :group 'minibuffer + :keymap read-passwd-map + :version "30.1" + + (require 'icons) + ;; It would be preferable to use "šŸ‘" ("\N{EYE}"). However, there is + ;; no corresponding Unicode char with a slash. So we use symbols as + ;; fallback only, with "⦵" ("\N{CIRCLE WITH HORIZONTAL BAR}") for + ;; hiding the password. + (define-icon read-passwd--show-password-icon nil + '((image "reveal.svg" "reveal.pbm" :height (0.8 . em)) + (symbol "šŸ‘") + (text "o")) + "Mode line icon to show a hidden password." + :group mode-line-faces + :version "30.1" + :help-echo "mouse-1: Toggle password visibility") + (define-icon read-passwd--hide-password-icon nil + '((image "conceal.svg" "conceal.pbm" :height (0.8 . em)) + (symbol "⦵") + (text "x")) + "Mode line icon to hide a visible password." + :group mode-line-faces + :version "30.1" + :help-echo "mouse-1: Toggle password visibility") + + (setq read-passwd--hide-password nil + ;; Stolen from `eldoc-minibuffer-message'. + read-passwd--mode-line-buffer + (window-buffer + (or (window-in-direction 'above (minibuffer-window)) + (minibuffer-selected-window) + (get-largest-window)))) + + (if read-passwd-mode + (with-current-buffer read-passwd--mode-line-buffer + ;; Add `read-passwd--mode-line-icon'. + (when (listp mode-line-format) + (setq mode-line-format + (cons '(:eval read-passwd--mode-line-icon) + mode-line-format)))) + (with-current-buffer read-passwd--mode-line-buffer + ;; Remove `read-passwd--mode-line-icon'. + (when (listp mode-line-format) + (setq mode-line-format (cdr mode-line-format))))) + + (when read-passwd-mode + (read-passwd--toggle-visibility))) + (defvar messages-buffer-mode-map (let ((map (make-sparse-keymap))) diff --git a/lisp/subr.el b/lisp/subr.el index e2279170297..d89c69976e4 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3378,14 +3378,23 @@ with Emacs. Do not call it directly in your own packages." (let ((map (make-sparse-keymap))) (set-keymap-parent map minibuffer-local-map) (define-key map "\C-u" #'delete-minibuffer-contents) ;bug#12570 + (define-key map "\t" #'read-passwd--toggle-visibility) map) "Keymap used while reading passwords.") -(defun read-password--hide-password () +(defvar read-passwd--hide-password t) + +(defun read-passwd--hide-password () + "Make password in minibuffer hidden or visible." (let ((beg (minibuffer-prompt-end))) (dotimes (i (1+ (- (buffer-size) beg))) - (put-text-property (+ i beg) (+ 1 i beg) - 'display (string (or read-hide-char ?*)))))) + (if read-passwd--hide-password + (put-text-property + (+ i beg) (+ 1 i beg) 'display (string (or read-hide-char ?*))) + (remove-list-of-text-properties (+ i beg) (+ 1 i beg) '(display))) + (put-text-property + (+ i beg) (+ 1 i beg) + 'help-echo "C-u: Clear password\nTAB: Toggle password visibility")))) (defun read-passwd (prompt &optional confirm default) "Read a password, prompting with PROMPT, and return it. @@ -3423,18 +3432,20 @@ by doing (clear-string STRING)." (setq-local inhibit-modification-hooks nil) ;bug#15501. (setq-local show-paren-mode nil) ;bug#16091. (setq-local inhibit--record-char t) - (add-hook 'post-command-hook #'read-password--hide-password nil t)) + (read-passwd-mode 1) + (add-hook 'post-command-hook #'read-passwd--hide-password nil t)) (unwind-protect (let ((enable-recursive-minibuffers t) (read-hide-char (or read-hide-char ?*))) (read-string prompt nil t default)) ; t = "no history" (when (buffer-live-p minibuf) (with-current-buffer minibuf + (read-passwd-mode -1) ;; Not sure why but it seems that there might be cases where the ;; minibuffer is not always properly reset later on, so undo ;; whatever we've done here (bug#11392). (remove-hook 'after-change-functions - #'read-password--hide-password 'local) + #'read-passwd--hide-password 'local) (kill-local-variable 'post-self-insert-hook) ;; And of course, don't keep the sensitive data around. (erase-buffer)))))))) From e02c4a864f02787f0e194c9e8a6d4ab0b18ca39f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sun, 25 Feb 2024 15:37:06 +0100 Subject: [PATCH 323/446] Modify last change acc to comments * lisp/simple.el (read-passwd-mode): Change `text' entry of icons. (read-passwd-toggle-visibility): Rename. (read-passwd-mode): * lisp/subr.el (read-passwd-map): Adapt callees. --- lisp/simple.el | 10 +++++----- lisp/subr.el | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lisp/simple.el b/lisp/simple.el index 5992afec255..f127290231b 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -10866,7 +10866,7 @@ and setting it to nil." (defvar read-passwd--mode-line-icon nil "Propertized mode line icon for showing/hiding passwords.") -(defun read-passwd--toggle-visibility () +(defun read-passwd-toggle-visibility () "Toggle minibuffer contents visibility. Adapt also mode line." (interactive) @@ -10883,7 +10883,7 @@ Adapt also mode line." mouse-face mode-line-highlight local-map (keymap - (mode-line keymap (mouse-1 . read-passwd--toggle-visibility))))) + (mode-line keymap (mouse-1 . read-passwd-toggle-visibility))))) (force-mode-line-update)) (read-passwd--hide-password)) @@ -10902,7 +10902,7 @@ Adapt also mode line." (define-icon read-passwd--show-password-icon nil '((image "reveal.svg" "reveal.pbm" :height (0.8 . em)) (symbol "šŸ‘") - (text "o")) + (text "")) "Mode line icon to show a hidden password." :group mode-line-faces :version "30.1" @@ -10910,7 +10910,7 @@ Adapt also mode line." (define-icon read-passwd--hide-password-icon nil '((image "conceal.svg" "conceal.pbm" :height (0.8 . em)) (symbol "⦵") - (text "x")) + (text "<\\>")) "Mode line icon to hide a visible password." :group mode-line-faces :version "30.1" @@ -10937,7 +10937,7 @@ Adapt also mode line." (setq mode-line-format (cdr mode-line-format))))) (when read-passwd-mode - (read-passwd--toggle-visibility))) + (read-passwd-toggle-visibility))) (defvar messages-buffer-mode-map diff --git a/lisp/subr.el b/lisp/subr.el index d89c69976e4..d58f8ba3b27 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3378,7 +3378,7 @@ with Emacs. Do not call it directly in your own packages." (let ((map (make-sparse-keymap))) (set-keymap-parent map minibuffer-local-map) (define-key map "\C-u" #'delete-minibuffer-contents) ;bug#12570 - (define-key map "\t" #'read-passwd--toggle-visibility) + (define-key map "\t" #'read-passwd-toggle-visibility) map) "Keymap used while reading passwords.") From b7cef701cb587ecb66f192e4d41aa202645560e0 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 25 Feb 2024 11:35:44 -0500 Subject: [PATCH 324/446] * lisp/files.el (hack-one-local-variable): Use `set-auto-mode-0` This fixes bug#69373. --- lisp/files.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lisp/files.el b/lisp/files.el index 1e7f00e4254..c0d26b2343c 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4238,10 +4238,8 @@ already the major mode." (pcase var ('mode (let ((mode (intern (concat (downcase (symbol-name val)) - "-mode")))) - (unless (eq (indirect-function mode) - (indirect-function major-mode)) - (funcall mode)))) + "-mode")))) + (set-auto-mode-0 mode t))) ('eval (pcase val (`(add-hook ',hook . ,_) (hack-one-local-variable--obsolete hook))) From c6f2add964ce1ac69ba6705bc869ee2f447da3cb Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 25 Feb 2024 13:18:08 -0500 Subject: [PATCH 325/446] * lisp/vc/vc-hooks.el (vc-mode): Give a body to the function (bug#69387) --- lisp/vc/vc-hooks.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index a95cc732dab..75f68dd80d1 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -186,7 +186,8 @@ revision number and lock status." This minor mode is automatically activated whenever you visit a file under control of one of the revision control systems in `vc-handled-backends'. VC commands are globally reachable under the prefix \\[vc-prefix-map]: -\\{vc-prefix-map}") +\\{vc-prefix-map}" + nil) (defmacro vc-error-occurred (&rest body) `(condition-case nil (progn ,@body nil) (error t))) From babe6a5e948985f961ffd36f64323950abd98b7f Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 26 Feb 2024 14:13:14 +0800 Subject: [PATCH 326/446] Introduce a new TRAMP method `androidsu' * doc/misc/tramp.texi (Quick Start Guide): Document the new method. * etc/NEWS (Tramp): Announce new method. * lisp/net/tramp-adb.el (tramp-adb-handle-file-attributes) (tramp-adb-handle-directory-files-and-attributes) (tramp-adb-handle-file-name-all-completions): Properly print ls's exit status in the presence of a pipe. (tramp-adb-handle-copy-file): If the androidsu backend is in use, call cp rather than adb push. (tramp-adb-send-command): Disable ADB-specific code under androidsu. (tramp-adb-send-command-and-check): New argument COMMAND-AUGMENTED-P. * lisp/net/tramp-androidsu.el (tramp, tramp-adb, tramp-sh) (tramp-androidsu-method, add-to-list) (tramp-androidsu-maybe-open-connection) (tramp-androidsu-generate-wrapper) (tramp-androidsu-handle-access-file) (tramp-androidsu-handle-add-name-to-file) (tramp-androidsu-handle-copy-directory) (tramp-androidsu-adb-handle-copy-file) (tramp-androidsu-adb-handle-delete-directory) (tramp-androidsu-adb-handle-delete-file) (tramp-androidsu-handle-directory-file-name) (tramp-androidsu-handle-directory-files) (tramp-androidsu-adb-handle-directory-files-and-attributes) (tramp-androidsu-handle-dired-uncache) (tramp-androidsu-adb-handle-exec-path) (tramp-androidsu-handle-expand-file-name) (tramp-androidsu-handle-file-accessible-directory-p) (tramp-androidsu-adb-handle-file-attributes) (tramp-androidsu-handle-file-directory-p) (tramp-androidsu-handle-file-equal-p) (tramp-androidsu-adb-handle-file-executable-p) (tramp-androidsu-adb-handle-file-exists-p) (tramp-androidsu-handle-file-group-gid) (tramp-androidsu-handle-file-in-directory-p) (tramp-androidsu-sh-handle-file-local-copy) (tramp-androidsu-handle-file-locked-p) (tramp-androidsu-handle-file-modes) (tramp-androidsu-adb-handle-file-name-all-completions) (tramp-androidsu-handle-file-name-as-directory) (tramp-androidsu-handle-file-name-case-insensitive-p) (tramp-androidsu-handle-file-name-completion) (tramp-androidsu-handle-file-name-directory) (tramp-androidsu-handle-file-name-nondirectory) (tramp-androidsu-handle-file-newer-than-file-p) (tramp-androidsu-handle-file-notify-add-watch) (tramp-androidsu-handle-file-notify-rm-watch) (tramp-androidsu-handle-file-notify-valid-p) (tramp-androidsu-adb-handle-file-readable-p) (tramp-androidsu-handle-file-regular-p) (tramp-androidsu-handle-file-remote-p) (tramp-androidsu-handle-file-selinux-context) (tramp-androidsu-handle-file-symlink-p) (tramp-androidsu-adb-handle-file-system-info) (tramp-androidsu-handle-file-truename) (tramp-androidsu-handle-file-user-uid) (tramp-androidsu-adb-handle-file-writable-p) (tramp-androidsu-handle-find-backup-file-name) (tramp-androidsu-handle-insert-directory) (tramp-androidsu-handle-insert-file-contents) (tramp-androidsu-handle-list-system-processes) (tramp-androidsu-handle-load, tramp-androidsu-handle-lock-file) (tramp-androidsu-handle-make-auto-save-file-name) (tramp-androidsu-adb-handle-make-directory) (tramp-androidsu-handle-make-lock-file-name) (tramp-androidsu-handle-make-nearby-temp-file) (tramp-androidsu-adb-handle-make-process) (tramp-androidsu-sh-handle-make-symbolic-link) (tramp-androidsu-handle-memory-info) (tramp-androidsu-handle-process-attributes) (tramp-androidsu-adb-handle-process-file) (tramp-androidsu-adb-handle-rename-file) (tramp-androidsu-adb-handle-set-file-modes) (tramp-androidsu-adb-handle-set-file-times) (tramp-androidsu-handle-set-visited-file-modtime) (tramp-androidsu-handle-shell-command) (tramp-androidsu-handle-start-file-process) (tramp-androidsu-handle-substitute-in-file-name) (tramp-androidsu-handle-temporary-file-directory) (tramp-androidsu-adb-handle-get-remote-gid) (tramp-androidsu-adb-handle-get-remote-groups) (tramp-androidsu-adb-handle-get-remote-uid) (tramp-androidsu-handle-unlock-file) (tramp-androidsu-handle-verify-visited-file-modtime) (tramp-androidsu-handle-write-region) (tramp-androidsu-file-name-handler-alist) (tramp-androidsu-file-name-p, tramp-androidsu-file-name-handler) (tramp-register-foreign-file-name-handler) (tramp-adb-connection-local-default-ps-profile, shell) (tramp-unload-hook, tramp-androidsu): New file. --- doc/misc/tramp.texi | 7 + etc/NEWS | 6 + lisp/net/tramp-adb.el | 54 +++- lisp/net/tramp-androidsu.el | 537 ++++++++++++++++++++++++++++++++++++ 4 files changed, 589 insertions(+), 15 deletions(-) create mode 100644 lisp/net/tramp-androidsu.el diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 6d4654f1a8a..09b875ad3fa 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -523,6 +523,8 @@ is used as the group to change to. The default host name is the same. @cindex @option{sudo} method @cindex method @option{doas} @cindex @option{doas} method +@cindex method @option{androidsu} +@cindex @option{androidsu} method If the @option{su}, @option{sudo} or @option{doas} option should be performed on another host, it can be combined with a leading @@ -533,6 +535,11 @@ a simple case, the syntax looks like @file{@trampfn{ssh@value{postfixhop}user@@host|sudo,,/path/to/file}}. @xref{Ad-hoc multi-hops}. +The @option{su} method and other shell-based methods conflict with +non-standard @command{su} implementations popular among Android users +and the restricted command-line utilities distributed with that system. +The @option{androidsu} method enables accessing files through +@command{su} on such systems, but multi-hops are not supported. @anchor{Quick Start Guide sudoedit method} @section Using @command{sudoedit} diff --git a/etc/NEWS b/etc/NEWS index 6d444daf152..b4a1c887f2e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -902,6 +902,12 @@ mode line. 'header' will display in the header line; ** Tramp ++++ +*** New connection method "androidsu". +This provides access to system files with elevated privileges granted by +the idiosyncratic 'su' implementations and system utilities customary on +Android. + +++ *** New connection methods "dockercp" and "podmancp". These are the external methods counterparts of "docker" and "podman". diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 96625fc5680..4f04912c032 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -263,9 +263,10 @@ arguments to pass to the OPERATION." (tramp-convert-file-attributes v localname id-format (and (tramp-adb-send-command-and-check - v (format "%s -d -l %s | cat" + v (format "(%s -d -l %s; echo tramp_exit_status $?) | cat" (tramp-adb-get-ls-command v) - (tramp-shell-quote-argument localname))) + (tramp-shell-quote-argument localname)) + nil t) (with-current-buffer (tramp-get-buffer v) (tramp-adb-sh-fix-ls-output) (cdar (tramp-do-parse-file-attributes-with-ls v))))))) @@ -316,9 +317,10 @@ arguments to pass to the OPERATION." directory full match nosort id-format count (with-current-buffer (tramp-get-buffer v) (when (tramp-adb-send-command-and-check - v (format "%s -a -l %s | cat" + v (format "(%s -a -l %s; echo tramp_exit_status $?) | cat" (tramp-adb-get-ls-command v) - (tramp-shell-quote-argument localname))) + (tramp-shell-quote-argument localname)) + nil t) ;; We insert also filename/. and filename/.., because "ls" ;; doesn't on some file systems, like "sdcard". (unless (search-backward-regexp (rx "." eol) nil t) @@ -440,10 +442,12 @@ Emacs dired can't find files." filename (with-parsed-tramp-file-name (expand-file-name directory) nil (with-tramp-file-property v localname "file-name-all-completions" - (tramp-adb-send-command - v (format "%s -a %s | cat" - (tramp-adb-get-ls-command v) - (tramp-shell-quote-argument localname))) + (unless (tramp-adb-send-command-and-check + v (format "(%s -a %s; echo tramp_exit_status $?) | cat" + (tramp-adb-get-ls-command v) + (tramp-shell-quote-argument localname)) + nil t) + (erase-buffer)) (mapcar (lambda (f) (if (file-directory-p (expand-file-name f directory)) @@ -637,10 +641,23 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." ;; because `file-attributes' reads the values from ;; there. (tramp-flush-file-properties v localname) - (unless (tramp-adb-execute-adb-command - v "push" - (file-name-unquote filename) - (file-name-unquote localname)) + (unless (if (tramp-adb-file-name-p v) + (tramp-adb-execute-adb-command + v "push" + (file-name-unquote filename) + (file-name-unquote localname)) + ;; Otherwise, this operation was initiated + ;; by the androidsu backend, so both files + ;; must be present on the local machine and + ;; transferable with a simple local copy. + (tramp-adb-send-command-and-check + v + (format + "cp -f %s %s" + (tramp-shell-quote-argument + (file-name-unquote filename)) + (tramp-shell-quote-argument + (file-name-unquote localname))))) (tramp-error v 'file-error "Cannot copy `%s' `%s'" filename newname))))))))) @@ -1110,7 +1127,9 @@ error and non-nil on success." (defun tramp-adb-send-command (vec command &optional neveropen nooutput) "Send the COMMAND to connection VEC." - (if (string-match-p (rx multibyte) command) + (if (and (equal (tramp-file-name-method vec) + tramp-androidsu-method) + (string-match-p (rx multibyte) command)) ;; Multibyte codepoints with four bytes are not supported at ;; least by toybox. @@ -1142,17 +1161,22 @@ error and non-nil on success." (while (search-forward-regexp (rx (+ "\r") eol) nil t) (replace-match "" nil nil))))))) -(defun tramp-adb-send-command-and-check (vec command &optional exit-status) +(defun tramp-adb-send-command-and-check (vec command &optional exit-status + command-augmented-p) "Run COMMAND and check its exit status. Sends `echo $?' along with the COMMAND for checking the exit status. If COMMAND is nil, just sends `echo $?'. Returns nil if the exit status is not equal 0, and t otherwise. +If COMMAND-AUGMENTED-P, COMMAND is already configured to print exit +status upon completion and need not be modified. + Optional argument EXIT-STATUS, if non-nil, triggers the return of the exit status." (tramp-adb-send-command vec (if command - (format "%s; echo tramp_exit_status $?" command) + (if command-augmented-p command + (format "%s; echo tramp_exit_status $?" command)) "echo tramp_exit_status $?")) (with-current-buffer (tramp-get-connection-buffer vec) (unless (tramp-search-regexp (rx "tramp_exit_status " (+ digit))) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el new file mode 100644 index 00000000000..417ef25ed8a --- /dev/null +++ b/lisp/net/tramp-androidsu.el @@ -0,0 +1,537 @@ +;;; tramp-androidsu.el --- TRAMP method for Android superuser shells -*- lexical-binding:t -*- + +;; Copyright (C) 2024 Free Software Foundation, Inc. + +;; Keywords: comm, processes +;; Package: tramp + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; The `su' method struggles (as do other shell-based methods) with the +;; crippled versions of many Unix utilities installed on Android, +;; workarounds for which are implemented in the `adb' method. This +;; method defines a shell-based method that is identical in function to +;; `su', but reuses such code from the `adb' method where applicable and +;; also provides for certain mannerisms of popular Android `su' +;; implementations. + +;;; Code: + +(require 'tramp) +(require 'tramp-adb) +(require 'tramp-sh) + +;;;###tramp-autoload +(defconst tramp-androidsu-method "androidsu" + "When this method name is used, forward all calls to su.") + +;;;###tramp-autoload +(tramp--with-startup + (add-to-list 'tramp-methods + `(,tramp-androidsu-method + (tramp-login-program "su") + (tramp-login-args (("-") ("%u"))) + (tramp-remote-shell "/system/bin/sh") + (tramp-remote-shell-login ("-l")) + (tramp-remote-shell-args ("-c")) + (tramp-tmpdir "/data/local/tmp") + (tramp-connection-timeout 10))) + + (add-to-list 'tramp-default-host-alist + `(,tramp-androidsu-method nil "localhost"))) + +(defun tramp-androidsu-maybe-open-connection (vec) + "Open a connection VEC if not already open. +Mostly identical to `tramp-adb-maybe-open-connection', but also disables +multibyte mode and waits for the shell prompt to appear." + ;; During completion, don't reopen a new connection. + (unless (tramp-connectable-p vec) + (throw 'non-essential 'non-essential)) + + (with-tramp-debug-message vec "Opening connection" + (let ((p (tramp-get-connection-process vec)) + (process-name (tramp-get-connection-property vec "process-name")) + (process-environment (copy-sequence process-environment))) + ;; Open a new connection. + (condition-case err + (unless (process-live-p p) + (with-tramp-progress-reporter + vec 3 + (if (tramp-string-empty-or-nil-p (tramp-file-name-user vec)) + (format "Opening connection %s for %s using %s" + process-name + (tramp-file-name-host vec) + (tramp-file-name-method vec)) + (format "Opening connection %s for %s@%s using %s" + process-name + (tramp-file-name-user vec) + (tramp-file-name-host vec) + (tramp-file-name-method vec))) + (let* ((coding-system-for-read 'utf-8-unix) + (process-connection-type tramp-process-connection-type) + (p (apply + #'start-process + (tramp-get-connection-name vec) + (tramp-get-connection-buffer vec) + (append + `(,tramp-encoding-shell) + (and tramp-encoding-command-interactive + `(,tramp-encoding-command-interactive))))) + (user (tramp-file-name-user vec)) + command) + ;; Set sentinel. Initialize variables. + (set-process-sentinel p #'tramp-process-sentinel) + (tramp-post-process-creation p vec) + + ;; Replace `login-args' place holders. + (setq command (format "exec su - %s || exit" + (or user "root"))) + ;; Send the command. + (tramp-message vec 3 "Sending command `%s'" command) + (tramp-adb-send-command vec command t t) + + ;; Android su binaries contact a background service to + ;; obtain authentication; during this process, input + ;; received is discarded, so input cannot be + ;; guaranteed to reach the root shell until its prompt + ;; is displayed. + (with-current-buffer (process-buffer p) + (tramp-wait-for-regexp p tramp-connection-timeout + "#[[:space:]]*$")) + + ;; Set connection-local variables. + (tramp-set-connection-local-variables vec) + + ;; Change prompt. + (tramp-adb-send-command + vec (format "PS1=%s" + (tramp-shell-quote-argument tramp-end-of-output))) + + ;; Disable line editing. + (tramp-adb-send-command + vec "set +o vi +o vi-esccomplete +o vi-tabcomplete +o emacs") + + ;; Dump option settings in the traces. + (when (>= tramp-verbose 9) + (tramp-adb-send-command vec "set -o")) + + ;; Disable Unicode. + (tramp-adb-send-command vec "set +U") + + ;; Disable echo expansion. + (tramp-adb-send-command + vec "stty -inlcr -onlcr -echo kill '^U' erase '^H'" t) + + ;; Check whether the echo has really been disabled. + ;; Some implementations, like busybox, don't support + ;; disabling. + (tramp-adb-send-command vec "echo foo" t) + (with-current-buffer (process-buffer p) + (goto-char (point-min)) + (when (looking-at-p "echo foo") + (tramp-set-connection-property p "remote-echo" t) + (tramp-message vec 5 "Remote echo still on. Ok.") + ;; Make sure backspaces and their echo are enabled + ;; and no line width magic interferes with them. + (tramp-adb-send-command vec + "stty icanon erase ^H cols 32767" + t))) + + ;; Set the remote PATH to a suitable value. + (tramp-set-connection-property vec "remote-path" + "/system/bin:/system/xbin") + + ;; Mark it as connected. + (tramp-set-connection-property p "connected" t)))) + + ;; Cleanup, and propagate the signal. + ((error quit) + (tramp-cleanup-connection vec t) + (signal (car err) (cdr err))))))) + +(defun tramp-androidsu-generate-wrapper (function) + "Return connection wrapper function for FUNCTION. +Return a function which temporarily substitutes local replacements for +the `adb' method's connection management functions around a call to +FUNCTION." + (lambda (&rest args) + (let ((tramp-adb-wait-for-output + (symbol-function #'tramp-adb-wait-for-output)) + (tramp-adb-maybe-open-connection + (symbol-function #'tramp-adb-maybe-open-connection))) + (unwind-protect + (progn + ;; tramp-adb-wait-for-output addresses problems introduced + ;; by the adb utility itself, not Android utilities, so + ;; replace it with the regular TRAMP function. + (fset 'tramp-adb-wait-for-output #'tramp-wait-for-output) + ;; Likewise, except some special treatment is necessary on + ;; account of flaws in Android's su implementation. + (fset 'tramp-adb-maybe-open-connection + #'tramp-androidsu-maybe-open-connection) + (apply function args)) + ;; Restore the original definitions of the functions overridden + ;; above. + (fset 'tramp-adb-wait-for-output tramp-adb-wait-for-output) + (fset 'tramp-adb-maybe-open-connection tramp-adb-maybe-open-connection))))) + +(defalias 'tramp-androidsu-handle-access-file + (tramp-androidsu-generate-wrapper #'tramp-handle-access-file)) + +(defalias 'tramp-androidsu-handle-add-name-to-file + (tramp-androidsu-generate-wrapper #'tramp-handle-add-name-to-file)) + +(defalias 'tramp-androidsu-handle-copy-directory + (tramp-androidsu-generate-wrapper #'tramp-handle-copy-directory)) + +(defalias 'tramp-androidsu-adb-handle-copy-file + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-copy-file)) + +(defalias 'tramp-androidsu-adb-handle-delete-directory + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-directory)) + +(defalias 'tramp-androidsu-adb-handle-delete-file + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-file)) + +(defalias 'tramp-androidsu-handle-directory-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-directory-file-name)) + +(defalias 'tramp-androidsu-handle-directory-files + (tramp-androidsu-generate-wrapper #'tramp-handle-directory-files)) + +(defalias 'tramp-androidsu-adb-handle-directory-files-and-attributes + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-directory-files-and-attributes)) + +(defalias 'tramp-androidsu-handle-dired-uncache + (tramp-androidsu-generate-wrapper #'tramp-handle-dired-uncache)) + +(defalias 'tramp-androidsu-adb-handle-exec-path + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-exec-path)) + +(defalias 'tramp-androidsu-handle-expand-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-expand-file-name)) + +(defalias 'tramp-androidsu-handle-file-accessible-directory-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-accessible-directory-p)) + +(defalias 'tramp-androidsu-adb-handle-file-attributes + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-attributes)) + +(defalias 'tramp-androidsu-handle-file-directory-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-directory-p)) + +(defalias 'tramp-androidsu-handle-file-equal-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-equal-p)) + +(defalias 'tramp-androidsu-adb-handle-file-executable-p + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-executable-p)) + +(defalias 'tramp-androidsu-adb-handle-file-exists-p + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-exists-p)) + +(defalias 'tramp-androidsu-handle-file-group-gid + (tramp-androidsu-generate-wrapper #'tramp-handle-file-group-gid)) + +(defalias 'tramp-androidsu-handle-file-in-directory-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-in-directory-p)) + +(defalias 'tramp-androidsu-sh-handle-file-local-copy + (tramp-androidsu-generate-wrapper #'tramp-sh-handle-file-local-copy)) + +(defalias 'tramp-androidsu-handle-file-locked-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-locked-p)) + +(defalias 'tramp-androidsu-handle-file-modes + (tramp-androidsu-generate-wrapper #'tramp-handle-file-modes)) + +(defalias 'tramp-androidsu-adb-handle-file-name-all-completions + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-name-all-completions)) + +(defalias 'tramp-androidsu-handle-file-name-as-directory + (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-as-directory)) + +(defalias 'tramp-androidsu-handle-file-name-case-insensitive-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-case-insensitive-p)) + +(defalias 'tramp-androidsu-handle-file-name-completion + (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-completion)) + +(defalias 'tramp-androidsu-handle-file-name-directory + (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-directory)) + +(defalias 'tramp-androidsu-handle-file-name-nondirectory + (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-nondirectory)) + +(defalias 'tramp-androidsu-handle-file-newer-than-file-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-newer-than-file-p)) + +(defalias 'tramp-androidsu-handle-file-notify-add-watch + (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-add-watch)) + +(defalias 'tramp-androidsu-handle-file-notify-rm-watch + (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-rm-watch)) + +(defalias 'tramp-androidsu-handle-file-notify-valid-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-valid-p)) + +(defalias 'tramp-androidsu-adb-handle-file-readable-p + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-readable-p)) + +(defalias 'tramp-androidsu-handle-file-regular-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-regular-p)) + +(defalias 'tramp-androidsu-handle-file-remote-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-remote-p)) + +(defalias 'tramp-androidsu-handle-file-selinux-context + (tramp-androidsu-generate-wrapper #'tramp-handle-file-selinux-context)) + +(defalias 'tramp-androidsu-handle-file-symlink-p + (tramp-androidsu-generate-wrapper #'tramp-handle-file-symlink-p)) + +(defalias 'tramp-androidsu-adb-handle-file-system-info + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-system-info)) + +(defalias 'tramp-androidsu-handle-file-truename + (tramp-androidsu-generate-wrapper #'tramp-handle-file-truename)) + +(defalias 'tramp-androidsu-handle-file-user-uid + (tramp-androidsu-generate-wrapper #'tramp-handle-file-user-uid)) + +(defalias 'tramp-androidsu-adb-handle-file-writable-p + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-writable-p)) + +(defalias 'tramp-androidsu-handle-find-backup-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-find-backup-file-name)) + +(defalias 'tramp-androidsu-handle-insert-directory + (tramp-androidsu-generate-wrapper #'tramp-handle-insert-directory)) + +(defalias 'tramp-androidsu-handle-insert-file-contents + (tramp-androidsu-generate-wrapper #'tramp-handle-insert-file-contents)) + +(defalias 'tramp-androidsu-handle-list-system-processes + (tramp-androidsu-generate-wrapper #'tramp-handle-list-system-processes)) + +(defalias 'tramp-androidsu-handle-load + (tramp-androidsu-generate-wrapper #'tramp-handle-load)) + +(defalias 'tramp-androidsu-handle-lock-file + (tramp-androidsu-generate-wrapper #'tramp-handle-lock-file)) + +(defalias 'tramp-androidsu-handle-make-auto-save-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-make-auto-save-file-name)) + +(defalias 'tramp-androidsu-adb-handle-make-directory + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-make-directory)) + +(defalias 'tramp-androidsu-handle-make-lock-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-make-lock-file-name)) + +(defalias 'tramp-androidsu-handle-make-nearby-temp-file + (tramp-androidsu-generate-wrapper #'tramp-handle-make-nearby-temp-file)) + +(defalias 'tramp-androidsu-adb-handle-make-process + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-make-process)) + +(defalias 'tramp-androidsu-sh-handle-make-symbolic-link + (tramp-androidsu-generate-wrapper + #'tramp-sh-handle-make-symbolic-link)) + +(defalias 'tramp-androidsu-handle-memory-info + (tramp-androidsu-generate-wrapper #'tramp-handle-memory-info)) + +(defalias 'tramp-androidsu-handle-process-attributes + (tramp-androidsu-generate-wrapper #'tramp-handle-process-attributes)) + +(defalias 'tramp-androidsu-adb-handle-process-file + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-process-file)) + +(defalias 'tramp-androidsu-adb-handle-rename-file + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-rename-file)) + +(defalias 'tramp-androidsu-adb-handle-set-file-modes + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-modes)) + +(defalias 'tramp-androidsu-adb-handle-set-file-times + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-times)) + +(defalias 'tramp-androidsu-handle-set-visited-file-modtime + (tramp-androidsu-generate-wrapper #'tramp-handle-set-visited-file-modtime)) + +(defalias 'tramp-androidsu-handle-shell-command + (tramp-androidsu-generate-wrapper #'tramp-handle-shell-command)) + +(defalias 'tramp-androidsu-handle-start-file-process + (tramp-androidsu-generate-wrapper #'tramp-handle-start-file-process)) + +(defalias 'tramp-androidsu-handle-substitute-in-file-name + (tramp-androidsu-generate-wrapper #'tramp-handle-substitute-in-file-name)) + +(defalias 'tramp-androidsu-handle-temporary-file-directory + (tramp-androidsu-generate-wrapper #'tramp-handle-temporary-file-directory)) + +(defalias 'tramp-androidsu-adb-handle-get-remote-gid + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-gid)) + +(defalias 'tramp-androidsu-adb-handle-get-remote-groups + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-groups)) + +(defalias 'tramp-androidsu-adb-handle-get-remote-uid + (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-uid)) + +(defalias 'tramp-androidsu-handle-unlock-file + (tramp-androidsu-generate-wrapper #'tramp-handle-unlock-file)) + +(defalias 'tramp-androidsu-handle-verify-visited-file-modtime + (tramp-androidsu-generate-wrapper #'tramp-handle-verify-visited-file-modtime)) + +(defalias 'tramp-androidsu-handle-write-region + (tramp-androidsu-generate-wrapper #'tramp-handle-write-region)) + +;;;###tramp-autoload +(defconst tramp-androidsu-file-name-handler-alist + '(;; `abbreviate-file-name' performed by default handler. + (access-file . tramp-androidsu-handle-access-file) + (add-name-to-file . tramp-androidsu-handle-add-name-to-file) + ;; `byte-compiler-base-file-name' performed by default handler. + (copy-directory . tramp-androidsu-handle-copy-directory) + (copy-file . tramp-androidsu-adb-handle-copy-file) + (delete-directory . tramp-androidsu-adb-handle-delete-directory) + (delete-file . tramp-androidsu-adb-handle-delete-file) + ;; `diff-latest-backup-file' performed by default handler. + (directory-file-name . tramp-androidsu-handle-directory-file-name) + (directory-files . tramp-androidsu-handle-directory-files) + (directory-files-and-attributes + . tramp-androidsu-adb-handle-directory-files-and-attributes) + (dired-compress-file . ignore) + (dired-uncache . tramp-androidsu-handle-dired-uncache) + (exec-path . tramp-androidsu-adb-handle-exec-path) + (expand-file-name . tramp-androidsu-handle-expand-file-name) + (file-accessible-directory-p . tramp-androidsu-handle-file-accessible-directory-p) + (file-acl . ignore) + (file-attributes . tramp-androidsu-adb-handle-file-attributes) + (file-directory-p . tramp-androidsu-handle-file-directory-p) + (file-equal-p . tramp-androidsu-handle-file-equal-p) + (file-executable-p . tramp-androidsu-adb-handle-file-executable-p) + (file-exists-p . tramp-androidsu-adb-handle-file-exists-p) + (file-group-gid . tramp-androidsu-handle-file-group-gid) + (file-in-directory-p . tramp-androidsu-handle-file-in-directory-p) + (file-local-copy . tramp-androidsu-sh-handle-file-local-copy) + (file-locked-p . tramp-androidsu-handle-file-locked-p) + (file-modes . tramp-androidsu-handle-file-modes) + (file-name-all-completions . tramp-androidsu-adb-handle-file-name-all-completions) + (file-name-as-directory . tramp-androidsu-handle-file-name-as-directory) + (file-name-case-insensitive-p . tramp-androidsu-handle-file-name-case-insensitive-p) + (file-name-completion . tramp-androidsu-handle-file-name-completion) + (file-name-directory . tramp-androidsu-handle-file-name-directory) + (file-name-nondirectory . tramp-androidsu-handle-file-name-nondirectory) + ;; `file-name-sans-versions' performed by default handler. + (file-newer-than-file-p . tramp-androidsu-handle-file-newer-than-file-p) + (file-notify-add-watch . tramp-androidsu-handle-file-notify-add-watch) + (file-notify-rm-watch . tramp-androidsu-handle-file-notify-rm-watch) + (file-notify-valid-p . tramp-androidsu-handle-file-notify-valid-p) + (file-ownership-preserved-p . ignore) + (file-readable-p . tramp-androidsu-adb-handle-file-readable-p) + (file-regular-p . tramp-androidsu-handle-file-regular-p) + (file-remote-p . tramp-androidsu-handle-file-remote-p) + (file-selinux-context . tramp-androidsu-handle-file-selinux-context) + (file-symlink-p . tramp-androidsu-handle-file-symlink-p) + (file-system-info . tramp-androidsu-adb-handle-file-system-info) + (file-truename . tramp-androidsu-handle-file-truename) + (file-user-uid . tramp-androidsu-handle-file-user-uid) + (file-writable-p . tramp-androidsu-adb-handle-file-writable-p) + (find-backup-file-name . tramp-androidsu-handle-find-backup-file-name) + ;; `get-file-buffer' performed by default handler. + (insert-directory . tramp-androidsu-handle-insert-directory) + (insert-file-contents . tramp-androidsu-handle-insert-file-contents) + (list-system-processes . tramp-androidsu-handle-list-system-processes) + (load . tramp-androidsu-handle-load) + (lock-file . tramp-androidsu-handle-lock-file) + (make-auto-save-file-name . tramp-androidsu-handle-make-auto-save-file-name) + (make-directory . tramp-androidsu-adb-handle-make-directory) + (make-directory-internal . ignore) + (make-lock-file-name . tramp-androidsu-handle-make-lock-file-name) + (make-nearby-temp-file . tramp-androidsu-handle-make-nearby-temp-file) + (make-process . tramp-androidsu-adb-handle-make-process) + (make-symbolic-link . tramp-androidsu-sh-handle-make-symbolic-link) + (memory-info . tramp-androidsu-handle-memory-info) + (process-attributes . tramp-androidsu-handle-process-attributes) + (process-file . tramp-androidsu-adb-handle-process-file) + (rename-file . tramp-androidsu-adb-handle-rename-file) + (set-file-acl . ignore) + (set-file-modes . tramp-androidsu-adb-handle-set-file-modes) + (set-file-selinux-context . ignore) + (set-file-times . tramp-androidsu-adb-handle-set-file-times) + (set-visited-file-modtime . tramp-androidsu-handle-set-visited-file-modtime) + (shell-command . tramp-androidsu-handle-shell-command) + (start-file-process . tramp-androidsu-handle-start-file-process) + (substitute-in-file-name . tramp-androidsu-handle-substitute-in-file-name) + (temporary-file-directory . tramp-androidsu-handle-temporary-file-directory) + (tramp-get-home-directory . ignore) + (tramp-get-remote-gid . tramp-androidsu-adb-handle-get-remote-gid) + (tramp-get-remote-groups . tramp-androidsu-adb-handle-get-remote-groups) + (tramp-get-remote-uid . tramp-androidsu-adb-handle-get-remote-uid) + (tramp-set-file-uid-gid . ignore) + (unhandled-file-name-directory . ignore) + (unlock-file . tramp-androidsu-handle-unlock-file) + (vc-registered . ignore) + (verify-visited-file-modtime . tramp-androidsu-handle-verify-visited-file-modtime) + (write-region . tramp-androidsu-handle-write-region)) + "Alist of TRAMP handler functions for superuser sessions on Android.") + +;; It must be a `defsubst' in order to push the whole code into +;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading. +;;;###tramp-autoload +(defsubst tramp-androidsu-file-name-p (vec-or-filename) + "Check whether VEC-OR-FILENAME is for the `androidsu' method." + (when-let* ((vec (tramp-ensure-dissected-file-name vec-or-filename))) + (equal (tramp-file-name-method vec) tramp-androidsu-method))) + +;;;###tramp-autoload +(defun tramp-androidsu-file-name-handler (operation &rest args) + "Invoke the `androidsu' handler for OPERATION. +First arg specifies the OPERATION, second arg is a list of +arguments to pass to the OPERATION." + (if-let ((fn (assoc operation tramp-androidsu-file-name-handler-alist))) + (prog1 (save-match-data (apply (cdr fn) args)) + (setq tramp-debug-message-fnh-function (cdr fn))) + (prog1 (tramp-run-real-handler operation args) + (setq tramp-debug-message-fnh-function operation)))) + +;;;###tramp-autoload +(tramp--with-startup + (tramp-register-foreign-file-name-handler + #'tramp-androidsu-file-name-p #'tramp-androidsu-file-name-handler)) + +(connection-local-set-profile-variables + 'tramp-adb-connection-local-default-ps-profile + tramp-adb-connection-local-default-ps-variables) + +(with-eval-after-load 'shell + (connection-local-set-profiles + `(:application tramp :protocol ,tramp-adb-method) + 'tramp-adb-connection-local-default-shell-profile + 'tramp-adb-connection-local-default-ps-profile)) + +(add-hook 'tramp-unload-hook + (lambda () + (unload-feature 'tramp-androidsu 'force))) + +(provide 'tramp-androidsu) +;;; tramp-androidsu.el ends here From 1687adcb5c93b490e2e7edcd14615af295e791ed Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 26 Feb 2024 14:13:49 +0800 Subject: [PATCH 327/446] ; Delete trailing whitespace * lisp/net/tramp-androidsu.el (tramp-androidsu-maybe-open-connection): Delete trailing whitespace. --- lisp/net/tramp-androidsu.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index 417ef25ed8a..06800205f2e 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -158,7 +158,7 @@ multibyte mode and waits for the shell prompt to appear." ;; Mark it as connected. (tramp-set-connection-property p "connected" t)))) - + ;; Cleanup, and propagate the signal. ((error quit) (tramp-cleanup-connection vec t) From 76fa7f1f2fb7fbc3dcbd0be7928d0ec112e532e7 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 26 Feb 2024 19:26:04 +0200 Subject: [PATCH 328/446] Fix display of reordered Arabic text * src/xdisp.c (compute_stop_pos): Fix a year-old thinko in handling auto-composed characters. It was introduced as part of solving bug#62780, which optimized the search for composable characters. (Bug#69384) --- src/xdisp.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 4d60915f31c..d03769e2a31 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -4345,10 +4345,7 @@ compute_stop_pos (struct it *it) } } - if (it->cmp_it.id < 0 - && (STRINGP (it->string) - || ((!it->bidi_p || it->bidi_it.scan_dir >= 0) - && it->cmp_it.stop_pos <= IT_CHARPOS (*it)))) + if (it->cmp_it.id < 0) { ptrdiff_t stoppos = it->end_charpos; @@ -4357,7 +4354,9 @@ compute_stop_pos (struct it *it) characters to that position. */ if (it->bidi_p && it->bidi_it.scan_dir < 0) stoppos = -1; - else if (cmp_limit_pos > 0) + else if (!STRINGP (it->string) + && it->cmp_it.stop_pos <= IT_CHARPOS (*it) + && cmp_limit_pos > 0) stoppos = cmp_limit_pos; /* Force composition_compute_stop_pos avoid the costly search for static compositions, since those were already found by From 25cfccfb8b5bced05d5547f3eabb4d0508a575c8 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 26 Feb 2024 12:33:35 -0500 Subject: [PATCH 329/446] (edebug-tests-trivial-comma): Avoid interaction (bug#69406) * test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-trivial-backquote): Don't use obsolete `edebug-eval-defun`. (edebug-tests-trivial-comma): Use `inhibit-read-only`; don't use obsolete `edebug-eval-defun`; and fix bug#69406 by binding `eval-expression-debug-on-error`. --- test/lisp/emacs-lisp/edebug-tests.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el index 8c0f729dc39..29adbcff947 100644 --- a/test/lisp/emacs-lisp/edebug-tests.el +++ b/test/lisp/emacs-lisp/edebug-tests.el @@ -860,8 +860,7 @@ test and possibly others should be updated." (let ((inhibit-read-only t)) (delete-region (point-min) (point-max)) (insert "`1")) - (with-suppressed-warnings ((obsolete edebug-eval-defun)) - (edebug-eval-defun nil)) + (eval-defun nil) ;; `eval-defun' outputs its message to the echo area in a rather ;; funny way, so the "1" and the " (#o1, #x1, ?\C-a)" end up placed ;; there in separate pieces (via `print' rather than via `message'). @@ -871,18 +870,21 @@ test and possibly others should be updated." (setq edebug-initial-mode 'go) ;; In Bug#23651 Edebug would hang reading `1. - (with-suppressed-warnings ((obsolete edebug-eval-defun)) - (edebug-eval-defun t)))) + (eval-defun t) + (should (string-match-p (regexp-quote " (#o1, #x1, ?\\C-a)") + edebug-tests-messages)))) (ert-deftest edebug-tests-trivial-comma () "Edebug can read a trivial comma expression (Bug#23651)." (edebug-tests-with-normal-env - (read-only-mode -1) - (delete-region (point-min) (point-max)) - (insert ",1") - (read-only-mode) - (with-suppressed-warnings ((obsolete edebug-eval-defun)) - (should-error (edebug-eval-defun t))))) + (let ((inhibit-read-only t)) + (delete-region (point-min) (point-max)) + (insert ",1")) + ;; FIXME: This currently signals a "Source has changed" error, which is + ;; itself a bug (the source hasn't changed). All we're testing here + ;; is that the Edebug gets past the step of reading the sexp. + (should-error (let ((eval-expression-debug-on-error nil)) + (eval-defun t))))) (ert-deftest edebug-tests-circular-read-syntax () "Edebug can instrument code using circular read object syntax (Bug#23660)." From a67b8d7f448804d34bce85d2b6ab8d022f14161f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 26 Feb 2024 18:42:44 +0100 Subject: [PATCH 330/446] Make tree-sitter tests work installed in .emacs.d/tree-sitter * test/Makefile.in (ert_opts): Set treesit-extra-load-path, because HOME is not valid when running tests from the Makefile (bug#69405). --- test/Makefile.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/Makefile.in b/test/Makefile.in index 720f5c7ff8c..3cbdbec4414 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -92,6 +92,10 @@ export TEST_LOAD_EL ?= \ # Additional settings for ert. ert_opts = +# Supply a path to local tree-sitter installations, as we run tests +# without a valid HOME. +ert_opts += --eval "(setq treesit-extra-load-path '(\"$(HOME)/.emacs.d/tree-sitter\"))" + # Maximum length of lines in ert backtraces; nil for no limit. # (if empty, use the default ert-batch-backtrace-right-margin). TEST_BACKTRACE_LINE_LENGTH = From b3eb49a4661e31306555e82bdf24db6c36d67ad2 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 26 Feb 2024 14:32:08 -0500 Subject: [PATCH 331/446] tex-mode.el: Increase depth of braces highlighted in $...$ blocks * lisp/textmodes/tex-mode.el (tex-font-lock-keywords-1): Increase depth of braces supported in $...$ blocks. (tex-font-lock-keywords-2, tex-font-lock-syntactic-face-function): Refer directly to font-lock faces. --- lisp/textmodes/tex-mode.el | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 5c5ca573f38..616b8871090 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -511,9 +511,14 @@ An alternative value is \" . \", if you use a font with a narrow period." ;; This would allow highlighting \newcommand\CMD but requires ;; adapting subgroup numbers below. ;; (arg "\\(?:{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)\\|\\\\[a-z*]+\\)")) - (inbraces-re (lambda (re) - (concat "\\(?:[^{}\\]\\|\\\\.\\|" re "\\)"))) - (arg (concat "{\\(" (funcall inbraces-re "{[^}]*}") "+\\)"))) + (inbraces-re + (lambda (n) ;; Level of nesting of braces we should support. + (let ((re "[^}]")) + (dotimes (_ n) + (setq re + (concat "\\(?:[^{}\\]\\|\\\\.\\|{" re "*}\\)"))) + re))) + (arg (concat "{\\(" (funcall inbraces-re 2) "+\\)"))) `(;; Verbatim-like args. ;; Do it first, because we don't want to highlight them ;; in comments (bug#68827), but we do want to highlight them @@ -523,8 +528,7 @@ An alternative value is \" . \", if you use a font with a narrow period." ;; This is done at the very beginning so as to interact with the other ;; keywords in the same way as comments and strings. (,(concat "\\$\\$?\\(?:[^$\\{}]\\|\\\\.\\|{" - (funcall inbraces-re - (concat "{" (funcall inbraces-re "{[^}]*}") "*}")) + (funcall inbraces-re 6) "*}\\)+\\$?\\$") (0 'tex-math keep)) ;; Heading args. @@ -605,14 +609,14 @@ An alternative value is \" . \", if you use a font with a narrow period." (list (concat (regexp-opt '("``" "\"<" "\"`" "<<" "Ā«") t) "\\(\\(.\\|\n\\)+?\\)" (regexp-opt `("''" "\">" "\"'" ">>" "Ā»") t)) - '(1 font-lock-keyword-face) - '(2 font-lock-string-face) - '(4 font-lock-keyword-face)) + '(1 'font-lock-keyword-face) + '(2 'font-lock-string-face) + '(4 'font-lock-keyword-face)) ;; ;; Command names, special and general. (cons (concat slash specials-1) 'font-lock-warning-face) (list (concat "\\(" slash specials-2 "\\)\\([^a-zA-Z@]\\|\\'\\)") - 1 'font-lock-warning-face) + '(1 'font-lock-warning-face)) (concat slash general) ;; ;; Font environments. It seems a bit dubious to use `bold' etc. faces @@ -680,7 +684,7 @@ An alternative value is \" . \", if you use a font with a narrow period." (eval-when-compile (defconst tex-syntax-propertize-rules (syntax-propertize-precompile-rules - ("\\\\verb\\**\\([^a-z@*]\\)" + ("\\\\verb\\**\\([^a-z@*]\\)" (1 (prog1 "\"" (tex-font-lock-verb (match-beginning 0) (char-after (match-beginning 1)))))))) @@ -764,7 +768,7 @@ automatically inserts its partner." (regexp-quote (buffer-substring arg-start arg-end))) (text-clone-create arg-start arg-end)))))))) (scan-error nil) - (error (message "Error in latex-env-before-change: %s" err))))) + (error (message "Error in latex-env-before-change: %S" err))))) (defun tex-font-lock-unfontify-region (beg end) (font-lock-default-unfontify-region beg end) @@ -852,7 +856,7 @@ START is the position of the \\ and DELIM is the delimiter char." (let ((char (nth 3 state))) (cond ((not char) - (if (eq 2 (nth 7 state)) 'tex-verbatim font-lock-comment-face)) + (if (eq 2 (nth 7 state)) 'tex-verbatim 'font-lock-comment-face)) ((eq char ?$) 'tex-math) ;; A \verb element. (t 'tex-verbatim)))) @@ -1265,8 +1269,8 @@ Entering SliTeX mode runs the hook `text-mode-hook', then the hook (setq-local facemenu-end-add-face "}") (setq-local facemenu-remove-face-function t) (setq-local font-lock-defaults - '((tex-font-lock-keywords tex-font-lock-keywords-1 - tex-font-lock-keywords-2 tex-font-lock-keywords-3) + '(( tex-font-lock-keywords tex-font-lock-keywords-1 + tex-font-lock-keywords-2 tex-font-lock-keywords-3) nil nil nil nil ;; Who ever uses that anyway ??? (font-lock-mark-block-function . mark-paragraph) From 32b4f9d21b14190f1ed1611515751abe4b90fa68 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 27 Feb 2024 10:05:56 +0800 Subject: [PATCH 332/446] Disable process tracing before launching /system/bin/su * lisp/net/tramp-androidsu.el (tramp-androidsu-maybe-open-connection): Disable process tracing around start-process, that the setuid su binary may be started regardless of its status. --- lisp/net/tramp-androidsu.el | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index 06800205f2e..cf6b0d7202c 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -55,6 +55,8 @@ (add-to-list 'tramp-default-host-alist `(,tramp-androidsu-method nil "localhost"))) +(defvar android-use-exec-loader) ; androidfns.c. + (defun tramp-androidsu-maybe-open-connection (vec) "Open a connection VEC if not already open. Mostly identical to `tramp-adb-maybe-open-connection', but also disables @@ -84,14 +86,17 @@ multibyte mode and waits for the shell prompt to appear." (tramp-file-name-method vec))) (let* ((coding-system-for-read 'utf-8-unix) (process-connection-type tramp-process-connection-type) - (p (apply - #'start-process - (tramp-get-connection-name vec) - (tramp-get-connection-buffer vec) - (append - `(,tramp-encoding-shell) - (and tramp-encoding-command-interactive - `(,tramp-encoding-command-interactive))))) + ;; The executable loader cannot execute setuid + ;; binaries, such as su. + (android-use-exec-loader nil) + (p (start-process (tramp-get-connection-name vec) + (tramp-get-connection-buffer vec) + ;; Disregard + ;; tramp-encoding-shell, as + ;; there's no guarantee that it's + ;; possible to execute with + ;; `android-use-exec-loader' off. + "/system/bin/sh" "-i")) (user (tramp-file-name-user vec)) command) ;; Set sentinel. Initialize variables. From b59d7094b6cb1a09f46f933807e9cd00a8bd1547 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 27 Feb 2024 10:32:08 +0100 Subject: [PATCH 333/446] Allow vc-git-clone to check-out arbitrary revisions * lisp/vc/vc-git.el (vc-git-clone): If "git clone --branch" fails, then clone the repository regularly and checkout the requested revision. --- lisp/vc/vc-git.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 456417e566e..18b4a8691e9 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1411,9 +1411,16 @@ This prompts for a branch to merge from." (vc-message-unresolved-conflicts buffer-file-name))) (defun vc-git-clone (remote directory rev) - (if rev - (vc-git--out-ok "clone" "--branch" rev remote directory) + "Attempt to clone REMOTE repository into DIRECTORY at revision REV." + (cond + ((null rev) (vc-git--out-ok "clone" remote directory)) + ((ignore-errors + (vc-git--out-ok "clone" "--branch" rev remote directory))) + ((vc-git--out-ok "clone" remote directory) + (let ((default-directory directory)) + (vc-git--out-ok "checkout" rev))) + ((error "Failed to check out %s at %s" remote rev))) directory) ;;; HISTORY FUNCTIONS From 383ccf6d51fd7af65dbcc1ce159a03369a48d27f Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 27 Feb 2024 13:12:15 +0200 Subject: [PATCH 334/446] Avoid assertion violations in bidi.c * src/bidi.c (bidi_resolve_brackets): Move assertion about 'resolved_level' to where it belongs. This avoids unnecessary aborts when the character is not a bracket type and doesn't need BPA resolution. (Bug#69421) --- src/bidi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bidi.c b/src/bidi.c index 93bb061ac32..90c0061549a 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -2908,7 +2908,6 @@ bidi_resolve_brackets (struct bidi_it *bidi_it) } else if (bidi_it->bracket_pairing_pos != eob) { - eassert (bidi_it->resolved_level == -1); /* If the cached state shows an increase of embedding level due to an isolate initiator, we need to update the 1st cached state of the next run of the current isolating sequence with @@ -2917,6 +2916,7 @@ bidi_resolve_brackets (struct bidi_it *bidi_it) if (bidi_it->level_stack[bidi_it->stack_idx].level > prev_level && ISOLATE_STATUS (bidi_it, bidi_it->stack_idx)) { + eassert (bidi_it->resolved_level == -1); bidi_record_type_for_neutral (&prev_for_neutral, prev_level, 0); bidi_record_type_for_neutral (&next_for_neutral, prev_level, 1); } @@ -2931,6 +2931,7 @@ bidi_resolve_brackets (struct bidi_it *bidi_it) } else if (bidi_it->bracket_pairing_pos == -1) { + eassert (bidi_it->resolved_level == -1); /* Higher levels were not BPA-resolved yet, even if cached by bidi_find_bracket_pairs. Force application of BPA to the new level now. */ From 6de60f33ed5cc438e20400aee83e1e2032773811 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 27 Feb 2024 12:20:31 +0100 Subject: [PATCH 335/446] ; * src/data.c (Ftype_of): Update comment. --- src/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data.c b/src/data.c index 0c47750cb75..fd4b1fe4e44 100644 --- a/src/data.c +++ b/src/data.c @@ -211,7 +211,7 @@ for example, (type-of 1) returns `integer'. */) return Qcons; case Lisp_Vectorlike: - /* WARNING!! Keep 'cl--typeof-types' in sync with this code!! */ + /* WARNING!! Keep 'cl--type-hierarchy' in sync with this code!! */ switch (PSEUDOVECTOR_TYPE (XVECTOR (object))) { case PVEC_NORMAL_VECTOR: return Qvector; From 647cecc853e53a3be0bb2cf5328cd19e677217c9 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 27 Feb 2024 15:11:58 +0200 Subject: [PATCH 336/446] ; * lisp/vc/vc.el (vc-clone): Fix wording of doc string. --- lisp/vc/vc.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 549eae6e663..25540406b4e 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -3676,11 +3676,16 @@ to provide the `find-revision' operation instead." (vc-call-backend (vc-backend buffer-file-name) 'check-headers)) (defun vc-clone (remote &optional backend directory rev) - "Use BACKEND to clone REMOTE into DIRECTORY. -If successful, returns the string with the directory of the -checkout. If BACKEND is nil, iterate through every known backend -in `vc-handled-backends' until one succeeds. If REV is non-nil, -it indicates a specific revision to check out." + "Clone repository REMOTE using version-control BACKEND, into DIRECTORY. +If successful, return the string with the directory of the checkout; +otherwise return nil. +REMOTE should be a string, the URL of the remote repository or the name +of a directory (if the repository is local). +If DIRECTORY is nil or omitted, it defaults to `default-directory'. +If BACKEND is nil or omitted, the function iterates through every known +backend in `vc-handled-backends' until one succeeds to clone REMOTE. +If REV is non-nil, it indicates a specific revision to check out after +cloning; the syntax of REV depends on what BACKEND accepts." (unless directory (setq directory default-directory)) (if backend From 6a77355527b2f7f1dca9c2296c2684033c9aa875 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 27 Feb 2024 08:24:45 -0500 Subject: [PATCH 337/446] vhdl-mode.el: Reduce use of `eval` * lisp/progmodes/vhdl-mode.el (vhdl--re2-region): New function. (vhdl--signal-regions-functions): New constant, extracted from `vhdl-update-sensitivity-list`. (vhdl-update-sensitivity-list): Use it. --- lisp/progmodes/vhdl-mode.el | 76 ++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el index f52baf049aa..144bfa944d3 100644 --- a/lisp/progmodes/vhdl-mode.el +++ b/lisp/progmodes/vhdl-mode.el @@ -8398,6 +8398,44 @@ buffer." (message "Updating sensitivity lists...done"))) (when noninteractive (save-buffer))) +(defun vhdl--re2-region (beg-re end-re) + "Return a function searching for a region delimited by a pair of regexps. +BEG-RE and END-RE are the regexps delimiting the region to search for." + (lambda (proc-end) + (when (vhdl-re-search-forward beg-re proc-end t) + (save-excursion + (vhdl-re-search-forward end-re proc-end t))))) + +(defconst vhdl--signal-regions-functions + (list + ;; right-hand side of signal/variable assignment + ;; (special case: "<=" is relational operator in a condition) + (vhdl--re2-region "[<:]=" + ";\\|\\<\\(then\\|loop\\|report\\|severity\\|is\\)\\>") + ;; if condition + (vhdl--re2-region "^\\s-*if\\>" "\\") + ;; elsif condition + (vhdl--re2-region "\\" "\\") + ;; while loop condition + (vhdl--re2-region "^\\s-*while\\>" "\\") + ;; exit/next condition + (vhdl--re2-region "\\<\\(exit\\|next\\)\\s-+\\w+\\s-+when\\>" ";") + ;; assert condition + (vhdl--re2-region "\\" "\\(\\\\|\\\\|;\\)") + ;; case expression + (vhdl--re2-region "^\\s-*case\\>" "\\") + ;; parameter list of procedure call, array index + (lambda (proc-end) + (when (re-search-forward "^\\s-*\\(\\w\\|\\.\\)+[ \t\n\r\f]*(" proc-end t) + (forward-char -1) + (save-excursion + (forward-sexp) + (while (looking-at "(") (forward-sexp)) (point))))) + "Define syntactic regions where signals are read. +Each function is called with one arg (a limit for the (forward) search) and +should return either nil or the end position of the region (in which case +point will be set to its beginning).") + (defun vhdl-update-sensitivity-list () "Update sensitivity list." (let ((proc-beg (point)) @@ -8418,35 +8456,6 @@ buffer." (let ;; scan for visible signals ((visible-list (vhdl-get-visible-signals)) - ;; define syntactic regions where signals are read - (scan-regions-list - `(;; right-hand side of signal/variable assignment - ;; (special case: "<=" is relational operator in a condition) - ((vhdl-re-search-forward "[<:]=" ,proc-end t) - (vhdl-re-search-forward ";\\|\\<\\(then\\|loop\\|report\\|severity\\|is\\)\\>" ,proc-end t)) - ;; if condition - ((vhdl-re-search-forward "^\\s-*if\\>" ,proc-end t) - (vhdl-re-search-forward "\\" ,proc-end t)) - ;; elsif condition - ((vhdl-re-search-forward "\\" ,proc-end t) - (vhdl-re-search-forward "\\" ,proc-end t)) - ;; while loop condition - ((vhdl-re-search-forward "^\\s-*while\\>" ,proc-end t) - (vhdl-re-search-forward "\\" ,proc-end t)) - ;; exit/next condition - ((vhdl-re-search-forward "\\<\\(exit\\|next\\)\\s-+\\w+\\s-+when\\>" ,proc-end t) - (vhdl-re-search-forward ";" ,proc-end t)) - ;; assert condition - ((vhdl-re-search-forward "\\" ,proc-end t) - (vhdl-re-search-forward "\\(\\\\|\\\\|;\\)" ,proc-end t)) - ;; case expression - ((vhdl-re-search-forward "^\\s-*case\\>" ,proc-end t) - (vhdl-re-search-forward "\\" ,proc-end t)) - ;; parameter list of procedure call, array index - ((and (re-search-forward "^\\s-*\\(\\w\\|\\.\\)+[ \t\n\r\f]*(" ,proc-end t) - (1- (point))) - (progn (backward-char) (forward-sexp) - (while (looking-at "(") (forward-sexp)) (point))))) name field read-list sens-list signal-list tmp-list sens-beg sens-end beg end margin) ;; scan for signals in old sensitivity list @@ -8475,11 +8484,9 @@ buffer." (push (cons end (point)) seq-region-list) (beginning-of-line))) ;; scan for signals read in process - (while scan-regions-list + (dolist (scan-fun vhdl--signal-regions-functions) (goto-char proc-mid) - (while (and (setq beg (eval (nth 0 (car scan-regions-list)))) - (setq end (eval (nth 1 (car scan-regions-list))))) - (goto-char beg) + (while (setq end (funcall scan-fun proc-end)) (unless (or (vhdl-in-literal) (and seq-region-list (let ((tmp-list seq-region-list)) @@ -8518,8 +8525,7 @@ buffer." (car tmp-list)) (setq read-list (delete (car tmp-list) read-list))) (setq tmp-list (cdr tmp-list))))) - (goto-char (match-end 1))))) - (setq scan-regions-list (cdr scan-regions-list))) + (goto-char (match-end 1)))))) ;; update sensitivity list (goto-char sens-beg) (if sens-end From f1db8cf9a0595f7db29b548b38ce98196f36e09b Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 28 Feb 2024 12:05:59 +0800 Subject: [PATCH 338/446] Lift restrictions on `tramp-androidsu's app data access * lisp/net/tramp-adb.el (tramp-adb-handle-copy-file): Remove code now unnecessary. * lisp/net/tramp-androidsu.el (tramp-androidsu-mount-global-namespace): New user option. (tramp-androidsu-su-mm-supported): New variable. (tramp-androidsu-maybe-open-connection): Detect whether su supports the -mm option, and provide it if so. (tramp-androidsu-adb-handle-copy-file) (tramp-androidsu-adb-handle-rename-file): Delete functions. (tramp-androidsu-sh-handle-copy-file) (tramp-androidsu-sh-handle-rename-file): New functions. (tramp-androidsu-file-name-handler-alist): Switch to tramp-sh's copy and rename handlers. --- lisp/net/tramp-adb.el | 21 +++----------- lisp/net/tramp-androidsu.el | 55 ++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 4f04912c032..3f216ba403a 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -641,23 +641,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." ;; because `file-attributes' reads the values from ;; there. (tramp-flush-file-properties v localname) - (unless (if (tramp-adb-file-name-p v) - (tramp-adb-execute-adb-command - v "push" - (file-name-unquote filename) - (file-name-unquote localname)) - ;; Otherwise, this operation was initiated - ;; by the androidsu backend, so both files - ;; must be present on the local machine and - ;; transferable with a simple local copy. - (tramp-adb-send-command-and-check - v - (format - "cp -f %s %s" - (tramp-shell-quote-argument - (file-name-unquote filename)) - (tramp-shell-quote-argument - (file-name-unquote localname))))) + (unless (tramp-adb-execute-adb-command + v "push" + (file-name-unquote filename) + (file-name-unquote localname)) (tramp-error v 'file-error "Cannot copy `%s' `%s'" filename newname))))))))) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index cf6b0d7202c..6d4ac2c17f1 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -40,6 +40,22 @@ (defconst tramp-androidsu-method "androidsu" "When this method name is used, forward all calls to su.") +;;;###tramp-autoload +(defcustom tramp-androidsu-mount-global-namespace t + "When non-nil, browse files from within the global mount namespace. +On systems that assign each application a unique view of the filesystem +by executing them within individual mount namespaces and thus conceal +each application's data directories from others, invoke `su' with the +option `-mm' in order for the shell launched to run within the global +mount namespace, so that TRAMP may edit files belonging to any and all +applications." + :group 'tramp + :version "30.1" + :type 'boolean) + +(defvar tramp-androidsu-su-mm-supported 'unknown + "Whether `su -mm' is supported on this system.") + ;;;###tramp-autoload (tramp--with-startup (add-to-list 'tramp-methods @@ -94,7 +110,7 @@ multibyte mode and waits for the shell prompt to appear." ;; Disregard ;; tramp-encoding-shell, as ;; there's no guarantee that it's - ;; possible to execute with + ;; possible to execute it with ;; `android-use-exec-loader' off. "/system/bin/sh" "-i")) (user (tramp-file-name-user vec)) @@ -103,13 +119,32 @@ multibyte mode and waits for the shell prompt to appear." (set-process-sentinel p #'tramp-process-sentinel) (tramp-post-process-creation p vec) - ;; Replace `login-args' place holders. + ;; Replace `login-args' place holders. (setq command (format "exec su - %s || exit" (or user "root"))) - ;; Send the command. + + ;; Attempt to execute the shell inside the global mount + ;; namespace if requested. + (when tramp-androidsu-mount-global-namespace + (progn + (when (eq tramp-androidsu-su-mm-supported 'unknown) + ;; Change the prompt in advance so that + ;; tramp-adb-send-command-and-check can call + ;; tramp-search-regexp. + (tramp-adb-send-command + vec (format "PS1=%s" + (tramp-shell-quote-argument + tramp-end-of-output))) + (setq tramp-androidsu-su-mm-supported + ;; Detect support for `su -mm'. + (tramp-adb-send-command-and-check + vec "su -mm -c 'exit 24'" 24))) + (when tramp-androidsu-su-mm-supported + (setq command (format "exec su -mm - %s || exit" + (or user "root")))))) + ;; Send the command. (tramp-message vec 3 "Sending command `%s'" command) (tramp-adb-send-command vec command t t) - ;; Android su binaries contact a background service to ;; obtain authentication; during this process, input ;; received is discarded, so input cannot be @@ -204,8 +239,8 @@ FUNCTION." (defalias 'tramp-androidsu-handle-copy-directory (tramp-androidsu-generate-wrapper #'tramp-handle-copy-directory)) -(defalias 'tramp-androidsu-adb-handle-copy-file - (tramp-androidsu-generate-wrapper #'tramp-adb-handle-copy-file)) +(defalias 'tramp-androidsu-sh-handle-copy-file + (tramp-androidsu-generate-wrapper #'tramp-sh-handle-copy-file)) (defalias 'tramp-androidsu-adb-handle-delete-directory (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-directory)) @@ -367,8 +402,8 @@ FUNCTION." (defalias 'tramp-androidsu-adb-handle-process-file (tramp-androidsu-generate-wrapper #'tramp-adb-handle-process-file)) -(defalias 'tramp-androidsu-adb-handle-rename-file - (tramp-androidsu-generate-wrapper #'tramp-adb-handle-rename-file)) +(defalias 'tramp-androidsu-sh-handle-rename-file + (tramp-androidsu-generate-wrapper #'tramp-sh-handle-rename-file)) (defalias 'tramp-androidsu-adb-handle-set-file-modes (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-modes)) @@ -416,7 +451,7 @@ FUNCTION." (add-name-to-file . tramp-androidsu-handle-add-name-to-file) ;; `byte-compiler-base-file-name' performed by default handler. (copy-directory . tramp-androidsu-handle-copy-directory) - (copy-file . tramp-androidsu-adb-handle-copy-file) + (copy-file . tramp-androidsu-sh-handle-copy-file) (delete-directory . tramp-androidsu-adb-handle-delete-directory) (delete-file . tramp-androidsu-adb-handle-delete-file) ;; `diff-latest-backup-file' performed by default handler. @@ -478,7 +513,7 @@ FUNCTION." (memory-info . tramp-androidsu-handle-memory-info) (process-attributes . tramp-androidsu-handle-process-attributes) (process-file . tramp-androidsu-adb-handle-process-file) - (rename-file . tramp-androidsu-adb-handle-rename-file) + (rename-file . tramp-androidsu-sh-handle-rename-file) (set-file-acl . ignore) (set-file-modes . tramp-androidsu-adb-handle-set-file-modes) (set-file-selinux-context . ignore) From 977a56d5c7d71b958767dbae05b75c5e5cb87571 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 28 Feb 2024 12:23:32 +0800 Subject: [PATCH 339/446] ; Fix last change * lisp/net/tramp-androidsu.el (tramp-androidsu-handle-write-region): Delete function. (tramp-androidsu-sh-handle-write-region): New function. (tramp-androidsu-file-name-handler-alist): Avoid infinite recursion by replacing handle-write-region with the tramp-sh implementation. --- lisp/net/tramp-androidsu.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index 6d4ac2c17f1..fd9edb6a92e 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -441,8 +441,8 @@ FUNCTION." (defalias 'tramp-androidsu-handle-verify-visited-file-modtime (tramp-androidsu-generate-wrapper #'tramp-handle-verify-visited-file-modtime)) -(defalias 'tramp-androidsu-handle-write-region - (tramp-androidsu-generate-wrapper #'tramp-handle-write-region)) +(defalias 'tramp-androidsu-sh-handle-write-region + (tramp-androidsu-generate-wrapper #'tramp-sh-handle-write-region)) ;;;###tramp-autoload (defconst tramp-androidsu-file-name-handler-alist @@ -532,7 +532,7 @@ FUNCTION." (unlock-file . tramp-androidsu-handle-unlock-file) (vc-registered . ignore) (verify-visited-file-modtime . tramp-androidsu-handle-verify-visited-file-modtime) - (write-region . tramp-androidsu-handle-write-region)) + (write-region . tramp-androidsu-sh-handle-write-region)) "Alist of TRAMP handler functions for superuser sessions on Android.") ;; It must be a `defsubst' in order to push the whole code into From 3412b64ac8851a0fa8e55c6319d2e710ae27a74c Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Wed, 28 Feb 2024 11:35:04 +0100 Subject: [PATCH 340/446] ; Update Lisp_Obarray hash for CHECK_STRUCTS This follows commit 462d8ba813 of 2024-02-23 "Add a proper type for obarrays". --- src/pdumper.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index ca457858219..f0bce09cbde 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2774,8 +2774,8 @@ dump_obarray_buckets (struct dump_context *ctx, const struct Lisp_Obarray *o) static dump_off dump_obarray (struct dump_context *ctx, Lisp_Object object) { -#if CHECK_STRUCTS && !defined HASH_Lisp_Obarray_XXXXXXXXXX -# error "Lisp_Hash_Table changed. See CHECK_STRUCTS comment in config.h." +#if CHECK_STRUCTS && !defined HASH_Lisp_Obarray_D2757E61AD +# error "Lisp_Obarray changed. See CHECK_STRUCTS comment in config.h." #endif const struct Lisp_Obarray *in_oa = XOBARRAY (object); struct Lisp_Obarray munged_oa = *in_oa; @@ -3049,7 +3049,7 @@ dump_vectorlike (struct dump_context *ctx, Lisp_Object lv, dump_off offset) { -#if CHECK_STRUCTS && !defined HASH_pvec_type_D8A254BC70 +#if CHECK_STRUCTS && !defined HASH_pvec_type_2D583AC566 # error "pvec_type changed. See CHECK_STRUCTS comment in config.h." #endif const struct Lisp_Vector *v = XVECTOR (lv); From 8a2d013be37d8c3d3a25cfe1da505cd2e27dda5c Mon Sep 17 00:00:00 2001 From: Liu Hui Date: Wed, 21 Feb 2024 12:40:06 +0800 Subject: [PATCH 341/446] Fix Python shell completion test failures * test/lisp/progmodes/python-tests.el (python-tests-with-temp-buffer-with-shell): Set XDG_CACHE_HOME to a temporary directory. (python-tests--pythonstartup-file): New function. (python-shell-completion-at-point-jedi-completer) (python-shell-completion-at-point-ipython): Use Jedi as the native completion backend when possible. (bug#68559) --- test/lisp/progmodes/python-tests.el | 87 ++++++++++++++++++----------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index 6c6cd9eee2b..1ceee690cfb 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -55,21 +55,27 @@ BODY is code to be executed within the temp buffer. Point is always located at the beginning of buffer. Native completion is turned off. Shell buffer will be killed on exit." (declare (indent 1) (debug t)) - `(with-temp-buffer - (let ((python-indent-guess-indent-offset nil) - (python-shell-completion-native-enable nil)) - (python-mode) - (unwind-protect - (progn - (run-python nil t) - (insert ,contents) - (goto-char (point-min)) - (python-tests-shell-wait-for-prompt) - ,@body) - (when (python-shell-get-buffer) - (python-shell-with-shell-buffer - (let (kill-buffer-hook kill-buffer-query-functions) - (kill-buffer)))))))) + (let ((dir (make-symbol "dir"))) + `(with-temp-buffer + (let ((python-indent-guess-indent-offset nil) + (python-shell-completion-native-enable nil)) + (python-mode) + (unwind-protect + ;; Prevent test failures when Jedi is used as a completion + ;; backend, either directly or indirectly (e.g., via + ;; IPython). Jedi needs to store cache, but the + ;; "/nonexistent" HOME directory is not writable. + (ert-with-temp-directory ,dir + (with-environment-variables (("XDG_CACHE_HOME" ,dir)) + (run-python nil t) + (insert ,contents) + (goto-char (point-min)) + (python-tests-shell-wait-for-prompt) + ,@body)) + (when (python-shell-get-buffer) + (python-shell-with-shell-buffer + (let (kill-buffer-hook kill-buffer-query-functions) + (kill-buffer))))))))) (defmacro python-tests-with-temp-file (contents &rest body) "Create a `python-mode' enabled file with CONTENTS. @@ -4860,17 +4866,28 @@ def foo(): (should (string= "IGNORECASE" (buffer-substring (line-beginning-position) (point))))) +(defun python-tests--pythonstartup-file () + "Return Jedi readline setup file if PYTHONSTARTUP is not set." + (or (getenv "PYTHONSTARTUP") + (with-temp-buffer + (if (eql 0 (call-process python-tests-shell-interpreter + nil t nil "-m" "jedi" "repl")) + (string-trim (buffer-string)) + "")))) + (ert-deftest python-shell-completion-at-point-jedi-completer () "Check if Python shell completion works when Jedi completer is used." (skip-unless (executable-find python-tests-shell-interpreter)) - (python-tests-with-temp-buffer-with-shell - "" - (python-shell-with-shell-buffer - (python-shell-completion-native-turn-on) - (skip-unless (string= python-shell-readline-completer-delims "")) - (python-tests--completion-module) - (python-tests--completion-parameters) - (python-tests--completion-extra-context)))) + (with-environment-variables + (("PYTHONSTARTUP" (python-tests--pythonstartup-file))) + (python-tests-with-temp-buffer-with-shell + "" + (python-shell-with-shell-buffer + (python-shell-completion-native-turn-on) + (skip-unless (string= python-shell-readline-completer-delims "")) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-tests--completion-extra-context))))) (ert-deftest python-shell-completion-at-point-ipython () "Check if Python shell completion works for IPython." @@ -4880,17 +4897,19 @@ def foo(): (and (executable-find python-shell-interpreter) (eql (call-process python-shell-interpreter nil nil nil "--version") 0))) - (python-tests-with-temp-buffer-with-shell - "" - (python-shell-with-shell-buffer - (python-shell-completion-native-turn-off) - (python-tests--completion-module) - (python-tests--completion-parameters) - (python-shell-completion-native-turn-on) - (skip-unless (string= python-shell-readline-completer-delims "")) - (python-tests--completion-module) - (python-tests--completion-parameters) - (python-tests--completion-extra-context))))) + (with-environment-variables + (("PYTHONSTARTUP" (python-tests--pythonstartup-file))) + (python-tests-with-temp-buffer-with-shell + "" + (python-shell-with-shell-buffer + (python-shell-completion-native-turn-off) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-shell-completion-native-turn-on) + (skip-unless (string= python-shell-readline-completer-delims "")) + (python-tests--completion-module) + (python-tests--completion-parameters) + (python-tests--completion-extra-context)))))) ;;; PDB Track integration From 1ddd9c8e29f721fcf6fcb17ef7a07fac0421c4f7 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Wed, 28 Feb 2024 15:30:41 +0100 Subject: [PATCH 342/446] ; * .mailmap: Fix GitHub address (bug#68559#170). --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index 7c474fcdaf6..c9bdede6c73 100644 --- a/.mailmap +++ b/.mailmap @@ -116,6 +116,7 @@ Lars Ingebrigtsen Lars Ingebrigtsen Laurence Warne Lin Sun +Liu Hui Ludovic CourtĆØs Luke Lee Martin Rudalics From e490d2f8724c5e47d83c40c388f60e84f541dae5 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 28 Feb 2024 16:31:25 +0100 Subject: [PATCH 343/446] Revert change in tramp-adb-send-command * lisp/net/tramp-adb.el (tramp-adb-send-command): Revert check for `tramp-androidsu-method'. There is no need to restrict the check. --- lisp/net/tramp-adb.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 3f216ba403a..8ad7c271b4f 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -1114,9 +1114,7 @@ error and non-nil on success." (defun tramp-adb-send-command (vec command &optional neveropen nooutput) "Send the COMMAND to connection VEC." - (if (and (equal (tramp-file-name-method vec) - tramp-androidsu-method) - (string-match-p (rx multibyte) command)) + (if (string-match-p (rx multibyte) command) ;; Multibyte codepoints with four bytes are not supported at ;; least by toybox. @@ -1148,8 +1146,8 @@ error and non-nil on success." (while (search-forward-regexp (rx (+ "\r") eol) nil t) (replace-match "" nil nil))))))) -(defun tramp-adb-send-command-and-check (vec command &optional exit-status - command-augmented-p) +(defun tramp-adb-send-command-and-check + (vec command &optional exit-status command-augmented-p) "Run COMMAND and check its exit status. Sends `echo $?' along with the COMMAND for checking the exit status. If COMMAND is nil, just sends `echo $?'. Returns nil if @@ -1162,7 +1160,8 @@ Optional argument EXIT-STATUS, if non-nil, triggers the return of the exit status." (tramp-adb-send-command vec (if command - (if command-augmented-p command + (if command-augmented-p + command (format "%s; echo tramp_exit_status $?" command)) "echo tramp_exit_status $?")) (with-current-buffer (tramp-get-connection-buffer vec) From f7c2fe3337bb5e5721d17f40f79dbc1275e17b0d Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Wed, 28 Feb 2024 16:38:21 +0100 Subject: [PATCH 344/446] Pacify some docstring control char warnings Other instances are discussed in the following thread: https://lists.gnu.org/r/emacs-devel/2024-02/msg00797.html * lisp/allout.el (allout-command-prefix): Declare :type as key-sequence. Mark up key sequences in docstring. * lisp/auth-source.el (auth-source--decode-octal-string): * lisp/ffap.el (ffap-search-backward-file-end): * lisp/gnus/gnus-art.el (gnus-page-delimiter): * lisp/gnus/nnheader.el (nnheader-strip-cr): * lisp/proced.el (proced-log): * lisp/progmodes/idlw-shell.el (idlwave-shell-prompt-pattern): * lisp/url/url-http.el (url-http-clean-headers): * lisp/vcursor.el (vcursor-interpret-input): Quote control characters in docstrings. --- lisp/allout.el | 6 +++--- lisp/auth-source.el | 2 +- lisp/ffap.el | 4 ++-- lisp/gnus/gnus-art.el | 2 +- lisp/gnus/nnheader.el | 2 +- lisp/proced.el | 2 +- lisp/progmodes/idlw-shell.el | 4 ++-- lisp/url/url-http.el | 2 +- lisp/vcursor.el | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lisp/allout.el b/lisp/allout.el index a7121efb14a..e3fe8d08841 100644 --- a/lisp/allout.el +++ b/lisp/allout.el @@ -161,9 +161,9 @@ respective `allout-mode' keybinding variables, `allout-command-prefix', (defcustom allout-command-prefix "\C-c " "Key sequence to be used as prefix for outline mode command key bindings. -Default is `\C-c'; just `\C-c' is more short-and-sweet, if you're -willing to let allout use a bunch of \C-c keybindings." - :type 'string +Default is \\`C-c SPC'; just \\`C-c' is more short-and-sweet, if you're +willing to let allout use a bunch of \\`C-c' keybindings." + :type 'key-sequence :group 'allout-keybindings :set #'allout-compose-and-institute-keymap) ;;;_ = allout-keybindings-binding diff --git a/lisp/auth-source.el b/lisp/auth-source.el index 1f233f9f60f..5f5629d9cfc 100644 --- a/lisp/auth-source.el +++ b/lisp/auth-source.el @@ -1985,7 +1985,7 @@ entries for git.gnus.org: (defun auth-source--decode-octal-string (string) - "Convert octal STRING to utf-8 string. E.g: \"a\134b\" to \"a\b\"." + "Convert octal STRING to utf-8 string. E.g.: \"a\\134b\" to \"a\\b\"." (let ((list (string-to-list string)) (size (length string))) (decode-coding-string diff --git a/lisp/ffap.el b/lisp/ffap.el index 3492dcbf17a..5383f743878 100644 --- a/lisp/ffap.el +++ b/lisp/ffap.el @@ -1098,12 +1098,12 @@ Suppose the cursor is somewhere that might be near end of file, the guessing would position point before punctuation (like comma) after the file extension: - C:\temp\file.log, which contain .... + C:\\temp\\file.log, which contain .... =============================== (before) ---------------- (after) - C:\temp\file.log on Windows or /tmp/file.log on Unix + C:\\temp\\file.log on Windows or /tmp/file.log on Unix =============================== (before) ---------------- (after) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index c3c5eab7d89..9f313108089 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -694,7 +694,7 @@ used as possible file names." (defcustom gnus-page-delimiter "^\^L" "Regexp describing what to use as article page delimiters. -The default value is \"^\^L\", which is a form linefeed at the +The default value is \"^\\^L\", which is a form linefeed at the beginning of a line." :type 'regexp :group 'gnus-article-various) diff --git a/lisp/gnus/nnheader.el b/lisp/gnus/nnheader.el index 97821894b48..ea679759f3e 100644 --- a/lisp/gnus/nnheader.el +++ b/lisp/gnus/nnheader.el @@ -1016,7 +1016,7 @@ See `find-file-noselect' for the arguments." (nnheader-skeleton-replace from to t)) (defun nnheader-strip-cr () - "Strip all \r's from the current buffer." + "Strip all \\r's from the current buffer." (nnheader-skeleton-replace "\r")) (define-obsolete-function-alias 'nnheader-cancel-timer 'cancel-timer "27.1") diff --git a/lisp/proced.el b/lisp/proced.el index 3435f1ab8cd..7d7de1e2ce3 100644 --- a/lisp/proced.el +++ b/lisp/proced.el @@ -2261,7 +2261,7 @@ If LOG is a string and there are more args, it is formatted with those ARGS. Usually the LOG string ends with a \\n. End each bunch of errors with (proced-log t signal): this inserts the current time, buffer and signal at the start of the page, -and \f (formfeed) at the end." +and \\f (formfeed) at the end." (let ((obuf (current-buffer))) (with-current-buffer (get-buffer-create proced-log-buffer) (goto-char (point-max)) diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el index 0f11103cf02..b5d91f46b17 100644 --- a/lisp/progmodes/idlw-shell.el +++ b/lisp/progmodes/idlw-shell.el @@ -96,8 +96,8 @@ (defcustom idlwave-shell-prompt-pattern "^\r? ?IDL> " "Regexp to match IDL prompt at beginning of a line. -For example, \"^\r?IDL> \" or \"^\r?WAVE> \". -The \"^\r?\" is needed, to indicate the beginning of the line, with +For example, \"^\\r?IDL> \" or \"^\\r?WAVE> \". +The \"^\\r?\" is needed, to indicate the beginning of the line, with optional return character (which IDL seems to output randomly). This variable is used to initialize `comint-prompt-regexp' in the process buffer." diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el index d6a1d0eade8..184c1278072 100644 --- a/lisp/url/url-http.el +++ b/lisp/url/url-http.el @@ -427,7 +427,7 @@ Use `url-http-referer' as the Referer-header (subject to `url-privacy-level')." ;; Parsing routines (defun url-http-clean-headers () - "Remove trailing \r from header lines. + "Remove trailing \\r from header lines. This allows us to use `mail-fetch-field', etc. Return the number of characters removed." (let ((end (marker-position url-http-end-of-headers))) diff --git a/lisp/vcursor.el b/lisp/vcursor.el index ec5adbd832c..15791285b13 100644 --- a/lisp/vcursor.el +++ b/lisp/vcursor.el @@ -433,7 +433,7 @@ Default is nil." (defcustom vcursor-interpret-input nil "If non-nil, input from the vcursor is treated as interactive input. This will cause text insertion to be much slower. Note that no special -interpretation of strings is done: \"\C-x\" is a string of four +interpretation of strings is done: \"\\C-x\" is a string of four characters. The default is simply to copy strings." :type 'boolean :version "20.3") From bca3c9b466e24aacd561c818f2d19665af6efc11 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Wed, 28 Feb 2024 17:02:41 +0100 Subject: [PATCH 345/446] ; Fix :type of text-mode-ispell-word-completion. --- lisp/textmodes/text-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el index 87f6668cecb..e8e1f4898ce 100644 --- a/lisp/textmodes/text-mode.el +++ b/lisp/textmodes/text-mode.el @@ -88,7 +88,7 @@ nor does it extend `completion-at-point-functions'. This user option only takes effect when you customize it in Custom or with `setopt', not with `setq'." :group 'text - :type 'boolean + :type '(choice (const completion-at-point) boolean) :version "30.1" :set (lambda (sym val) (if (and (set sym val) From 91b90885aca17b5140b56fa3b5c4960baf8672a1 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 28 Feb 2024 20:38:02 +0100 Subject: [PATCH 346/446] * lisp/emacs-lisp/comp.el (comp-known-predicates): Add 'symbol-with-pos-p'. --- lisp/emacs-lisp/comp.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index ae964b041d0..21e2bb01ed0 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -220,6 +220,7 @@ Useful to hook into pass checkers.") (sequencep . sequence) (stringp . string) (subrp . subr) + (symbol-with-pos-p . symbol-with-pos) (symbolp . symbol) (vectorp . vector) (windowp . window)) From 05195e129fc933db32c9e08a155a94bfa4d75b54 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 28 Feb 2024 20:38:30 +0100 Subject: [PATCH 347/446] * lisp/emacs-lisp/cl-macs.el (cl-deftype-satisfies): Add 'symbol-with-pos'. --- lisp/emacs-lisp/cl-macs.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index ddc9775bcce..be477b7a6df 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -3496,6 +3496,7 @@ Of course, we really can't know that for sure, so it's just a heuristic." (subr . subrp) (string . stringp) (symbol . symbolp) + (symbol-with-pos . symbol-with-pos-p) (vector . vectorp) (window . windowp) ;; FIXME: Do we really want to consider these types? From f8311e8b4491b5658b9d5d1bebad29478c7b95b7 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 28 Feb 2024 20:48:49 +0100 Subject: [PATCH 348/446] Run syncdoc-type-hierarchy.el to follow obarray type introduction * doc/lispref/type_hierarchy.jpg: Update. * doc/lispref/type_hierarchy.txt: Likewise. --- doc/lispref/type_hierarchy.jpg | Bin 217931 -> 223501 bytes doc/lispref/type_hierarchy.txt | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/type_hierarchy.jpg index 729968971652209bb154a2ab8c15172b0f8e7da7..b7eba7d1cf7a8c07a479b13db6e059a3810fad13 100644 GIT binary patch delta 152205 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 z zgPor~``guq#JpRSSh>-Y@z9-R{iOdy2{hov7lw`xPjyp}Wz~tH$)S)Ngc=x<#QzHc zUQ9Qk$nm+|n`FHdY80C>sTK&o!naVc4|TkjXhVFB7YO(n$@Ekto;a~^!b||b^eu!6 z-EuYACqc(&0+L<&h&H2Ey*CiTdL--^-vb&Lqin0G5*V_q+EWj)7fjlS!TdKk6_N@X ziLjKP5UKOtU@sMJg`J@iXit&lB8^lSPyJiYvo`Ik_d608x9Yrg?!iA4g!YU{i>GbL z0p!z~T0Hn{q^YoFUAZ%r>=E}T*-NG6Yl>s#$t;ly2F7L4mbmJkdWeNnwriRd4= z)0QIAbUHJ*__iw}DW8PA+RT_qFMw z%bP%QTeq*C-j9?K*8pdg+3?k3Z<=eBkE z^`216ltW0_foa}Dk@4`iLrPBU^5;orWG%m!pAxen3na<-HBpbL_ng;VnkK7j;ulLy zV=CT8x&fJ(@T}JWEh7uPm+gbR=P+{rH~E{dMetx#I}c(7YS> z!%+}9U7XuJEB^l@h-T%T)HW z3?&wPulB2nk-UKJ?Z&uh|L%8`fnQTQdSZTD8K@q}92binyv|~Xr<2n0-9}QW6@F7b zYh7G2Q!6X0H+{~{j6zxC<65sp7dQRkz!TfbQT`q0dRfo2jp1ts&O)keUoUIu%3dq4 z_VhgWz)=V7=~bPn$1IVN-cooFJi|hGR-8%%#cJs7$C~KnLvSuHZ8YKoj}Lni2B0SL zb!R+st$fdl2_)Ft+mvPBkMH?42xIn-S9nq$$g<-3_7N)Hd*%_ZQ3m^g6W#VGYKbDX zZD5z&Eyy{q*z3_9<9KWKw7R2HLdJ8oMpaeH;F@_wX+_W!_^t|mR6f3r!2Q({WLr;i zrd<`7-q;9@7G~Bcv6Q`zDYJPWwVQqyE3;Kx$Ynj?S9jmV<;@k;T%LF``)s~_QV{*(L#U>r zx;zO|GqZiOs#Hm%btT|tOt;^0+JFn*zPA;@o%ZW9@DH-rgQhh{d2irUKNo6VtEOUq z@ct)*a2a!>0NuLNM?nL{kwShiOJoYHufS$ab!2?pz?^0{L?c`A&Pny09A^`c(jArw zb;pHz>fQb3UB_G%#}|TjY&Ho}8U1gaR^KYKLpRhxpJ}_M!|euWQ(=;0M+UPd$2L_Bja9-%pZ4c0H_!Mgh-5JuiF0U)T2wL+ zaJVobbVm6s8pceEYy6QbS&=L3#7=~FY$(Db{FD|AQc#6h;qxG8^^!RzfyU2vPqN-Z zPrt6^d>N5m%64zJ*(nM*eZH&_#=n(m5}1SuY=~R zMY>j(qS?F5a=Xl|YSggWLru9vw0UZDuCI6h1n>z)F5LfaY_;81lP++2}?e`bL_)V~tlD(y< zB#}O)Up3U~>$R-zR9-aJwfU)$3?pch=o+b#bhEhI! zGH_dJ*7=Bbl%Am0#2;I<(!ZbbV(1q3+%~JOu3}_+rLOK9sH}fh7t{IcxzcxzD&4~! zv-X-gpWBtA_96zV7FK0hVx4QwR{p({`FK)ZWF^OQwLo`KD>Pt=vz+C*j@4aCw? zi!4XL1nzbLKQ4?{6>MS*Eh+%+r4f(Msj40+WbHr>`N=Uor|OeOU;8ydY~z;lNE^4E zphAcJ96DYxA(GVVo$#zAMMgUBy~DEArE^M4Hr81DEH>zeP9mr%w%nPDOD;sL)orHq zj`K89)G^)MW@at^0tR5aJ6|F8K0N2c3!TKZYf7;=8D7!afzy+rU1e-Hz7m!rw(&IT zid(#if?Y-w$jy)bx1$Q9BCT>q07H)@Z};3XKPM>8IJ0e6JCSCxX*`BMK?b-vOOx~LfBz@tm_M?|5sQzFq#uTDWe`9(WKqIjT)nn zk7$-|P0@QVnS!p>P5OuVrAIXQVvl5F_-K8Ie8qAL)o~Ou22a)$(9f}4k_I-9_+Oq{ z6tlollIlB+)Ek!cML`*(x0vjmJ$*ZH*q$=n<5B$aA;Xn~$T}(ax4g^%`4Z2;8M$1U znle1S{E-w#2YMIqD4$>Rc6eMfwtEPD<~Q|L=;i!2Bi`@l%d#{A3Sn%{@ti;(>fny_ ztz0!EJAXFeIr2wL>)Oh6q4rFVu$rbP$Q>6%k)7&D;}i#q<};tgeEuj^!T5#07WXWs|X+acK(&#hodU!CvBz?i8kMr866xEW~8T$Fse zduemAu9Yh$YF>assrnKl8L=-n{m9~zI>0mz zPs@+kITzU6zDhQpt~(_Jef7^`yT|g?Z(TrT7ysZqD}Q3*qrO3!`&zVF1hMuj34#OB z6GZT#n-^kn2caB5Bqik>>?(^Uh{rxrUos|Mg!>x{3`!eV{!kWizntVg^ruvcO;%!o zZx@EpFfRRZr&TqXV}G0hA`h_)TvExX`9d$$(4~~3xQSv2CzY5wvf|?Rgt3|n1$*tEV;-_)gPLe1L z`Gp1xD%4_@DPEE!$`70QQ}I?D7jAe_1rMlLOu{cAfD`0+KcR+Wj;H>X@ZoMCZi-)9 zFc^e3veRsc*H@!9VEKl5b?w9+bNk+>kw~2I5~USP+W^|OEmko#49F+s5tLF*NYTH zPUxAFI$0U7$bO~*7m9?|-Mj)0`nr`>HUu08L;d3ba4w_6w9QX59!}q8QL{WtyL?Q1o^)})wToay3 z-zcc#N{agw@ReL$W}RTgQ#}-9Q}SCFT=RZuTUmAf+jp{!GgjJe>gk$n+;+nyRAnnf zzMcm}-{$Yc&}pEBeoWnzYpq*0G&T3|aMSA=YCr*XJJ(hjHD|t}fmYi8*)bsY$MdGmfcZ!cdlI1Ju!F};Ac51EgvYr#J za)!IgJn07dshMvEK9KoPW5@BiDQXr4pN#>HQKZTUP-VAXsCDMlPJ!kRFooPi&0hlm zR~dL%RFI|c2ab)fYe(dL-v zOS}+$(bS^DS=n(SO(!k>0_LK(`vKegG79t11*+{ARj1p0lDsss7&-(A&;gQk6K}n! zoPmk&_lylq{NE-mmWS|=i@vO6trH*WVf%7d8NM%S_339{487)2cw;slP2U)bt7%Lo zLtI=DE31E|Rt-;sJ{H4+xHD48pG-IFNXE_R2Z!-%X@28?k%iyY?4J!*xPHI}+k<4i zeG5ze7PtSm!2Rwex*guaAU7zqS2a8$T2G*}NCkMmUAwq)Bcc~ONXP}!eS0O6--A_DUV6%}H7)RzA? z3LDJ!*Z!A+`gy1fxQkt~m%XQk8#LUfe;{+MSfo;bo`2h|?<;1;XfY=OS;SItD7~%Gz4RLz6x)J@c+txeF%r6Cb zzY?^N;DcEw80$P^Wqm$dBS3ZymkM9?j&P=a-_^nm78g-dB)K=JTyqb_}xN8$Ac0LKN|)Sg@pJ zczLHfbi$V?RR-v>5I{pQXYFI%O;7klc#Q=C3C0!!$T9h7Ck)Bo+ZA{7+8LN8Z#I(H zjQhGI4rw2=$Uv^DI4f>-CA4-xQA~|-o}J^}v%%nLu7B|Af=Lk+22^qRZnh652FY|D zS5#Y^l}NsP0F)sey*cX-@oa_+1FY^Dvkek|NwwL_o#r+m1S$i z%w92}?N;|C|LB?~^=A75J`elhMhoY53(Fu;ABbn8fvAegws@aR78Gso?55fm574>* z%=RTj@Y~u^#VOrpD$=)@^KHe*UM1~vENN0KT#ox^K1MWxO|!OUB(0&Ws`~xsUEcSh zM&9@D82V7+qm9-=MXkN`5FgSS6J_MrgbKR7B6gYEAm*~!N1an{xnbOx zkI|0w&`qXxVhhH+lqc^G+vSQ3)ZnUNyVe!fQM*kUr#hUAwO6Dye!!__<>9|GT%!~# ze_zUf5hqUg?j6g*v7y=b)T=|%>d3}9Rh~IUz$~@V5}jHcy}GCC6TrL6ZK8GdOt|@qY_86_&0GXBzG_r4qChWMSf51C zl)r{Mj>(v2$?b?yU{`8F350$ISR#2vCTHyxwQtBf(zV9#!)jT@UlC(rM82YT3&Da? z&oq}|>S+1Hj=mvDu&nO4Kw;CRlDpf5S-KwPkz<4Z)os!$h%PH9I7j9-2YGS|p*_sE2US>XJ*?R(r$(?gt&$ZP7#^EO zZv=&|Zq9Yj?(*e?UU_Pf8Q1(H>a80kJ}*^Q3iG6KsnX)~wH?=|jt%|1KMD4PcOH9R zJ=OG%YOfiz+=ORp?J}f=mpD&v0hPR(ySH_YfoR*#DD@!!T#WUlyQi^j zPD&jW3HfHI-K1RGqCpjF>Yg{=tKQ$ilkO0!HR%SEtEe`p&9fF&UDbJ~S^8b;>kIx0eG07QoGiy6S;O9?Htyby z%~HB1*`bu#qJ?yzsm70f$SBC8!P-F|&XwCl@LOv=79FYzEn(GGpk~KK#11KBxmUG+ z;yqAdXL3iTw6bq{Z!dJ4>swxyo~_60DW44c(&PSC+546TT(GGfb~Dd5S6c z2aja0jmDT^jH7yNhnEDOr;~bx>XX2q;GVnq!Ms0@w#IAgiIJ88SjDhoUf|&R?04*$ zaJ?%OTDS)&15jFzAG{0XQ8&7{Bn9YG%=H!M6 ztd5{yvYBm+to?I=D`LDxnNsBS?4uV;4sv)!hK(cJ<*JHhqdYsiJ74_=XC9Q?`qkO} zQAxiaBF4Nl(6uuMdG^Psc&l_<+HOSyhR}#Ax~6_e64*?I;w!{V7z?lX&*6J6p7$$o z{n@=E6@ojkoBn#>%YCgyTVHJrP+=bg9$H%SeN8MlGiYVix)B&cLPguuj!)?MvR-UY zerRvO|5_hc`zpg5LW(~7$YT7asVhsV8yim%fnHL#s)elR4H(kN+P5SIzRGvbck~TN zpQOT+coXiIl%e1)^$KJ3WQv;wZ0YhKZiB8HZlacHNLtG60V1NM)QKhs8C&Xs-v8`r{U zF$lqzX*Tk%St%G^=JV+->7`dyNfzL$ALqc?=MILfBDU6-ux zAv3XTbJ;Er&}GsOuTIhJe73W)2p6JQe}g$!7}QI@iwPP8gw(UjSw( z+e%+H1PEo#H?+l=U8M&~3^EPSUoEZZ+SN_8!neh ze2Qq$8ukC!c^c;vubC@3{2$WZGA^p9?He5gN$Hjt6$F%SL|{OqB`ms>5JW(va}xqe zhk$~Fbc4Xq-6_&Ym!xzJFf+ajpZk8!`{|qy=L^XE#+f~P?^)}*u7Bm>a`;N{!ds_U zPCNLo8_aCDl<60WX`Yx-9DJEI=lLy3_rvF71Cl%n0~MpM?k}(36AE1bNC=^Yw(_EZZD&1 z=~d+xf(Dq|T->7fb$c=|1>T(ItJzr|yp&pZr)dKTt$Y{B9J;&YHlFsqBFzc%VL=56 zK$Z6V6~Aj6*}vrI#h!+2k9}JEwqW|Q0ffMzj2Srm`AOF|t}PIm88G;F<8;r69R>`F zAOh<7d7*mk12=mmx0^gK!wX;DO=>(Ds=}3E>@oycN&zO=cz^YK4qu>k{>-F)GY58} z;lT8R0ME6%Y>qMH{U~N%VZ(;Q@K+~q8>>gPxqJSkJgZ8SU!x(B>A1UMzUX5#L&ZI@ zgT9|`(nB(5HRavb{OyHx(c^woCm?e=f9?uADIoR;<@vTmdG;70^QUH%WN37|?aG1s zsZ0e#WiLaG7rJ?H_4DLlHW1R1K}&MAfW z<4>&x6wOOR{y@;*kLNo8Tn}K7)%kVFjSTxTCX7k}Ei#gsLf*!nwxRxU8=f+i#Ija?2tEw<7RLNC z^Kw_`*4-ETn8qcUon!l^Yo~MY3mh{F7lx;a;1n40hsuB+oMi~aVp1-ga55y8^ z#`9i*O?=|H0t|ZB^#A8=8g=&PPg2o54F>(wn5>iX)bBf;z+v+~pyOYtmM;t)g^TTM zJr3#|o?CrsUR^_(>vGJ4aX|ef@JAV7=@BQi(EOKG=#_Wkqrb2>P+{lDDdKnWAE!aa z4$t5KbP4J~1wZGjI7}-3K(gTPVnLm!y2HOO662EAF3R(;$X+))EIG+$aBITTt`kO< z%%Ng&|02fQ;Wg69L=r3$4C_|7)y0loiE+iT3%2?Pr`xHobX^dWspd_B#9~!@2W=^B z3>>wR<{)@eljeJ2boJft<(qz+guAk=8VS}%SJEVS}|+}yWp>!DDaqI*RQ zQ`{o&lznj-h?RM7GDo0O^>?5}(!Hinw?MORuXNCM<|oreCk}Zsd0dQbRD=sHYlUj1 zYE;CZP=44kzG_Y3DaZ&1qR_d37n!I4qy0}Q{1J0Y2ZK*yxMKFJE6a(mX?(fx_3wJy z!U;7v`aG(gXp6)*e(kqf171I9Zf^YiacIDsS2vZRdLh`F)B@b&L=A(hIA$4PtE5s| zA1_0>!yBV$^3BviB^TxSa9k>NTNpmy zLVCH5>cUBji+LV9;0+hH;7WRrOE`{tK&)d0dq3U9QrJo#C=^9BINIAXvVTa&VYqPw z``%m}jHQIgLyw!Vts^p%)g4{G*bedWhYro8$YkO;zASE2E5xXX6u~u1-SH=E49q{2 z9^IB5fLVi#fvxl7)L^F(SLd49&q`P8&4dhICQm-k&b_(!>?KTh^z@llzVus7kM#sUBb-~8 z;&4)EIdekPgl4ACdeK$QR+3Y2ut+tjO+W%jLxXSZ8KN^PH(~SRq8LuuDm|pp1CnQE z@2SN5*M^?G>zc&X1!l!I`l;6m0*hBZ?C~9oUoe|!Wik>1*oFA#Q2otJt8(PZ+lKK> zFdPsi={hWiWAQ!6Et*e?JPYbC4{Erd8ScRHaFWSdz zJyO0~yWEHd3{ehVFun*eLCF?^QD0QV_mWNA+QGc;5NJV=#$>qmKKGWo>hS$Kl3c!` z%pW~zQIcY0WDIZJ@qB1s`rdOwIV`N$4lHinNxGOIT7wVt6nsaCx9){0EHN%c)|QL4~!Bg0VA%w$LEpshU^pyr`$7jNGSP^QcI zUY?>$c>d-EXvqnmjn8bP+}*#LL0(&CM3RZl)g}xNWI}92obEt;b|8gVeuz zy{q_+2hn(s!Gbs{=}CxIfigF*-`rU1_cyS=z_31pnky&tl>eD1U2e!qw$ApRb_sOl z9a2=+GNUCdUThLBj3RqyQ5+=JD@}U?JwJCRcV1jsopSsOQ@?qUgP1cEZ_xaPinmFY zt1zFI7+Y66|7VdKAru$MpfBYbqIL#C$0LzLU;-rQ0U+X7FM4H{+ z$#5kFsxJ?{uXiKuOOP;w^ctKcehQlm?41S%gQ=9nh|=q~Uu;H2CI{EOp#dI457tH% zy%d&sHJ=R5RrzavZ#kN#V~9Nc{1g92&XPL0!r)2D_ZPrrdhl&7bnBfB981R;{ClZ+ zQ!>;;ccZ)?v743z>5o9eXwJoLdIF81H@07y&puw+hblgT z6T(WpFTytQM-AYXF8>&0h($9uOX1Mzx^U^bV(6QNXroNlPxA39C(J9gu@Rr7JiR$S z;UxEQxpQir4|t|w0lJdG{`JE7h%c_+eu@0*PLz26E;6H-0oYeGT;?Z#+?>*zUj);W z`G*-<**VxRL??Zex3J_WkX3F1rHc*HS(922N?=FI&7|{AeQ-MflbZn?p|9lT-TQ2w zAMCc5t1A=leT$Z7k1n+^_4Jpxby+X`m#ujBPVB2vCuo9MbUv8JZ}Z8Vjlawnb9fef zF9MbB!{=oyNwzeo;m<$TmI&M2AR;DWhe^g7mY{C{tNIZsr6sjAkD$@S8xW!YlgJ<} z6+7cmV4bw1yHo<>`57?s*4_o+U}|cmO`>fhVhuTCjUKQNZ;vEg`QZG%mJRt;$Pijb zisnJqixBw+>Vh>m+h92-&iXol6ZF%rf|i&C2KZT6>Rh0gj6{&3V%Av$oyI@FJD>Q+ zVyXD42M0?0?I<1#2ZGqT(NzN}Gz7gGCQ2o{WGAN9G-o8{X$!B=d{mZ+BSk%CN5=4F0v+M8V? zo%e`WHU{q!jJX>w)Q&G`3urYn5O^4Tne2usFeqU|d0XV%Fd^TZY78kjeOXy6^ne`m zF2MsU`z+OBe>Rw6Q=hLe06A7S)eS8u>p}ZN|C!9HFEN>%5u*4YRPN@v_l!91fu$mb z3qdI&Au-A}CNh3hKk`ZrsOoIF&o51;O!eI6TWcfH9&Vv((M>fcnWSK@5Sut1;+CVn z*Birm8tn(q(ykvm8c;&mjTG*Hl1zF*2mA871q#F?nYit3zvstnS)pUkvbk_`(rYwP zI<+Fu{+csXqz6BD9ou>4qtFewk$EE+rBJjQeYTw$09)n5bN>?pP_F`~K&_%9T0NOw zVIJJcxS;O@N%v;2=Z`0po`U_M`yb~$2kYBy(@!orEfOVFT~{CmM`(AMgnZ z_d8nu!X{Y6W}&0ouMvx6jj>6Q*WE(oXV_XO04&k<68-}ml%i?A-Upa7M-ABMoX!x- zyW0DtlRIUbhq(xUp^)b&`$f{0tf5;qYz;G!2yB>{?Dd3{JA2p^@@dgop?Mas=?aro z8y>XcUfsU6x9Ek70f|bn@DW$0c2R1O6RA{y1+d*{cM_ONhi>XO03@4LV6+%DBE@7> ztd5iWkuz}UK%i3#@)dVvs!h1^?TtQZ~9{Rm2qJv8|ms&|pl>BZVUlKiZuNFB7RbpC4A9?y~WMW@+BUzj%6cpz&1qgX*DFz^h`N7c1Wv8QN% zE12p)$l1ZYayG92j$GiveI2qg7%FP36i(7wb$DmPF;Ac@bStR;J=DyFZQr-db<9V_ zNXxK|&ns0CgM!B>YX+hy01gQ!8D?42Ovw)p=7w>`Relp@>~qw7L_565SGZmIF>_P$ zyf=%)K(1_N&HvgkWD5pr1(h;*d)sl{b)Gn$9*EytTG7Q8gSpm3U5g>>!2i3=HHCgG zecv3*64Yufiubj>vge}nWaX{my}?J0#%Bu%-&(sQb3632tJ~;Y*{bmFhj;NOHlcjy-ZU12smlfQA+m$BSR+S84sB!(i zT}jTMbFCG$EL8Zj1IB5^Enp{E`A*{2_aYf?n-cyHJKIQ%*p}+h%O|l$8y)J?g3ZKK za{kKAGQsR*&8&wCUh|8Z;aGtQF9Wme-YF>+x48#Irf>ZQXMbz_iS^qU@Z|r6_U0$e zMZKG0-LMeJ^m&&HZv3>mdSq#pO=#a|+Xc-A_8*jx(r5~I5~#~xwd;7jW)-a`niaW_ zussC3h3Ovz?vp7LL0hRI@7O@nrjAW__2{Z+4#BAV`#>}-jd*uiMf9ENUPKZ{{#s;} z%I7y3r$UqoUFrDeAypY}dPT>SgvdmZu!c*( zp8QO}k-WkWIi`rk+vGY8k{k5yH6oo)+%x5a)SMOF-+EFNRKQOPGLgut?-fDA<1|5Y zG(^l+0{I!fuwwhpA$1$FFH1~rDX)g?8iz!zga+-pd-w?6(N^JL2Y`Q<_UU-k>{NfO zLBHQ}G}-e{2S7w1O7l!y{at*SXy#+Jw*))OiBGRXf=4{GAK-pz-KM##fam+uuB)6NBf6g8BIS!Ly-?ZObGPzz7yzSE&)^1Rl-ufW)W?1aS zSNs`C57%wAY&qw}S(^@(jMtJ6^D01hiZfU= z+4aPy{Ab~lNkfyuF!P4EbP^_w1MbDgWy;fCERKn=ZTgOcD7R465oc*;{k8%knI55; zvoJ<#pI=X{CRNum1iCw|r*u9#vuJAX)5SQ|>6TOkeSC@$O}vM0pR2LwqFH7J1n{kMZ_8a{n!s7U7Kcc)~Lp`U@ zzL1^OswR4DdrpLl@j)ILVM`15ND=H+-#*nJF9FT#ZRxG+b^Rxi9?$X%vk`IcUpaIW z;PDfbFwfTRr(~HGSx?zc1cx*hmS9qz{1N2wg#`5!hkh?=s9Zf~&8}Hou&3c~W%Q!0 zQnm@=@n4_orpZt>pHYgPU?*+3zlOAbJ%#w_45x83(@~SYO|2>{HI#HFG{9piL~|w; zh)1CzJc3&Ud+p}g?)Z8tz9`Fhk~cmhtNx{V1SBb@NB>T!a*Xo^D8JVW^wzn?2ojg&-F*q$nTYbO!gLVJq_jwH(iP+_-Y0$H`d$l; z%)LU01>RF#SG);1P=$wyW)F*qM~o6V8_Y~??BVvu3IIsgw`9(25?A*6b-LWdwcw*| zZPBTO_@N*47j>VQeHc5ew0#1zvV#|?F!xo%t8OP(yv4_!jNu|8g!L0zeqXr{DJ%ci z(BO0J{%RB->xha$^1EY=@!&_11BB3Y?1vF7UMmQ>%E{ZDatXJxL*C!=lpsJ?q{s%y z1W0Ql9p{w7MVpRK#Zp+1h=U)KBn9cxB&7#GF|>_H$47e_!P&E+t5u%c523!3Z#S!x z_AD=&6ku9c`B9Jfk&rsDNg*BE6j$4tnKB@Mt84Fo-CUmgwdoQfo;2AFo;ANv}ff8XqyS*=K*#K)nJZN5SX38CeR zYbawJ64%jBs>Ef)_jIAkQ6v-lX#du` zD5LJ&^-_9VOP7F&Ra|MZcla<#IJH~ER@+3PP;n}0M{x!y5R~myr8IBephzM#g(2Dz zMNZFGjU`72f{!q;Y4yBKCbZ@&NqI+?k!lIHKE@REn_W?od~tayqB$W_3Jx6U zDL045UA<{{vkz>0JE0C(q|XGIfU6lE<|iRYDoC$4X4<8OU-{)0@4LApr?QM#pg;AC`B1yKpL=>u_@Rxe+735 zu{z)PMP0q3GV_L^ryyGzl|nhhzU$ZK#3nTwKTqj2p!kbVq)6Ck^hJ~fd)3Ho!gaw?M$~4C!FGr$jDDTWZ&}vRh0kav5*X9HsG=F!&CyobBE(N!{=n6Xe z1qZU8+lZu<33Ub7^NJB39vGdA*f`O`TdB`+h^T^Ru@0w(khXE&k~;N6!_CBoxG&g0 zhxy;nue<}nHlyh^2$W{w4r<6L+(u_msj|#!i4$9^_8q!q?K82Qtb|eglDWR0x>R3n zlShEQB2WN&G0+WereqXs)IOAP$;#FL)q%PA7%zC9xCU6Nl%u;%E22x=+6(YAvzK(e zh@5V5P-8D2J8JA9f}HZ|FO05_&b&fcB|jPlydnE|jMbG?H0QbZ{B@4h{4Mogh1(1d zH8IYyuYDd4V=}rVKeub^YXmbcJNFm43!F|SX~9vH|MXB@{>G?R?W{M)kdKZ7EiZTo zrp@oGz;~$)^fiMkY>9;uwG*r@30njn(Cz z%@z6>9SLHf33QvAmap3j`bPfYbN1(_r(uQixTy(t_jtdWI>vUAdUc4mYEl@WQWZvi zm(@h{X~#W$Dj7a>=l6SGbMAb9<&$&2Bg@zq&P&Np$SJq9r0BF*&b5=cS~OLl-|)kq zk+n_D&-BV_nTou=Kqn6f5kb*(AezxUi%?5-k)wOe_nG5nB>jtEF4G58WQ zu4WPaUP!Vo$I{{&4VEeCu%t{%3D1~g-!f@2&rGF|m;OTSv65Erg2jvQVELLVL4pdO zeuA^j|5cT@bjPIY;GxegDR*4<)9wXu{@3(pn3J_}tXD(utY5 z{b|)cg-#3g(2{|ja!l#<`9$j+|a!`oG_cm;-L~@zd%+A z&*jjQq)LSQitIHgmDDX}NO{D|#-&$g^R>2vA^F9|1Mw}x+410gibn%^o5GvpIhp$E z=eiPbc?wP}HUxH57h2${{AfbBo3}iX=Jf-kkfa zgO@3)MGVA%^HxZZ6Gpa!#ZX0IOWZ8soA*Gp=BZr4)cfdro@oPRHOJ)Bf zC9__Q*h;oBo)CS6S)cpULJ2nI2NY(Lt3a4X4AMwU&+Wp^Y&lKDBJ&&U()(bY3V z4P!}dbo`Y?te91@H-?Krti7ht`ROxh$rKMd5AXSK{ug7&I(Ob9D?^nRS-k?o(ZkkV zCC(bNn$q`GVRxD8a(UjY)zw5P;ZatUfkXr-gB|-IyI8(sWy>QzX_4WFSv}(Qr~_Io zIyw%q+cWN05!MAFFogii*4Pt3xA?1ezemAE?oA( zM#572(Cb`B5zBvJ3ew*8Cb!XazSCYWM_x)l=llyB;x*9+WDvef?=J_7evCYS5bF=Z=<4*o?N)=7o)jo*yL{-e|~?S zW=^rkv9Pv>SYnm?d3T`nN4%O-$Bjq(j$$>rlc)z&F2-Q!{0QMcM9zI2U7D(njhna| zsFe=`DLBj^w`w<%-=b{KIGs0wZzoD``uwb1Al%`IKee@fZRt4Oz&ak16iw}835r?| z__bD91xDFk2^gD(eR}kxdW*$mX0M)WF`Ef67u^JNcVNpN0|uDB6UpdjwXgOKi|dQ( zYi;ZJbMcqJRPmwau&;#4`(W2jBUVGRA4pg9!t3+=Mjez!qe&+VvCMvploA$~8Laqa z6J!5tEeK2K`+bG|pRvtlNI0k-*`r`9u~RkfXxALIwm*^zjXQa5kbll z%yH^#*rrwSBmM}avA#N|Twqh+^O9HakCVPwQZSz(e3W1UlBL6aj#BIMoOrds`t*XR zYsm^X-}2d${s+06Djkm#42Df5lAe`?olCcpui8-hFrnn%Le@^oe7X?rbVCbzg`-4a zp@~FRkUprw3D~N2-UNsJ^QzyH5#Co)dv$h~iziUHe!$bxnj3Q7ws)kZYMwVm=PR`~ zvak`z4R^CNcEM54t>qX(& zl9=>GwysqmaG~u5WMblYZpbE2^zew}g)MInC-zq!P3qnkV?&1=H-t&G+0OwQmp;^4 zaSo8*0{03;g_NT!HbZuphyG$BF;sQ_wBG@I<5)8;xH~7jW>Be`06c%$_Gm^4O{`;& z0kq)SH!(`!<{qPPwgmoV_NWII)oWV&CLfA>E_$nM>~i)3wIFQ8I+huwVos%=q2RWh zJTWZY1F+n}Q5?&QE@PUJB#Vg;PNT6{_oCK1u-D&J!EkrV2zWhc2z@rpkLE1gblLly z8S&&+B7>119tF#Tnw10LsfL|Cm63|E=@&UuQze-c`Q$&f3Bu7=vrz}6GNh{389~F2 zcPJKw{RMP5p|p)NErP*wr4G#xGVBpXF#VP#99Jdzfu;Ssoq8#Dc!|Oe@_rFKhn&c!(QqJcNI7`w8i$K>VNqCtw{eO@Nv6*}sED-!1 zS;JBETHhj~#O!uNh7IjlVE{QzK{XuP)btvLRPHSfgjnRcuTdz<(RTAiE}4LNY&Y4N zv#qp;^?Bxd)qvsq5h|>HEq`GiStjs}_~O#7lZnJ@E6Z38%9ppivkg0y(1hMxxDP;! zpwDFygdnxrplK$0{N^Q2^F5rPxwo=Xr!*xCe__|uY)A`Jn1@;Cs0L`%%@~#Y%p4y7 zV{AZ%#G}Z1WTUU9wIgXe@369=WNQ1fQJe?M4~F?Va%+YQE$Mto9C&NRW5diWmHK`< z9p${16iX<)#gUW!YyK{C`b=|Kpv<&ihf%t(kh8bYk`c}y5$OB0z$De3G*a9frut%r zZwu2(aKlz~q_f<_oc6_%^JlEj#bRx<3p?kaLDe2AwY!1VER{DF6=5XvMJ`8L_}LM8DP0d6|If>oN``evG?Mc|Q)y(^D@vQcVj4t0OLQAGUoxrmpK0N} zl_M>x*FMHE5Q$IR z!%ZKaiJ)12H6ya2rr(FpaMrr=WphAyI(Zh%W(&(!y0@LL;xu@>eV}Y=n6lO;_)l)b zV3XWTNY0`+>j{y)XoJnGlg^B){&1#u(+_KY5vQPf*iS7vhqH&I?wDoFs`wmeLixRQ z7Nh)duR=s^Lp1bD>#7~t2WYgQ%OAL`44D`E8Bl%NnCo!Gh72aK0BRsk-OvV*X4l?o zFz5VG1>iGzjFBJZGPPhCp{B)wn~jx%Ke6Ltaa0+A;&W;u<9mM>{3L(&Wap?5vGm}&2(C=WvY4sNt=>9FTPOL2Br;Rv- ze)r#}L0RN=xhOx)-0|WjR4rl==R4e0Z~tzjToE9%?>qnNW6(ETW|3fWPfdOi_6SM> z$3(~@U9YtC;xEiWkNogI$3$Q}$GI=?7gqfd(SP|Ad9oDl%fG9BBL=wtXQ2HcdmDUg z@G>4@e_;}UL-L+)#c4m`V=$)bJ$Rtt@>wP*dA`4}b;o^i3>MI{!-k<&MmI^f38=jd zJ2joUMtTYMa)Z~m-Nlg2aR8IH_<6KtES3Tz>pjneiey~{&HeWEOFps=cu)-+3{gTW zRlq?9)N${Xp0h|flq}EMYGOfr7ci?rEK-b-&+T`8K;XPaoP@*of;Tw>mLbaJ$!T&- z#y|81xbZM~0^~@(>SNRH@BhA%&@MJulNy>|N1z5S4+&g2LZd;5(G66W)9q|$3QFjk zPfz!QKQ`@g@MFdQg9Fj>V@NL#y15$c9kcMg_u>$(+vmu0EG}Td{r5z&pf#7wz`3PD zL;;LOw+=%vCopLZ+zXq{`|M_HzNxd?4{L5yH z03&++d{6WJ$PUU(!6fUwJaF$Tf~L4|S-dzGD=r%0!wDM}4A{84C`WnCx(w^SBcvRL zTO$N^VE-YNU}eALL&e!2JD!R&hsi2f2 zYf39Wjdhhi^OvsF8;7h;_-WNEAe4(6uFdovj7SKxbJY)vYi4xNf$Wm{6XtK(cW zN?lU;1RtIS6FO8KK{AP!HOE90t*Lmw%EeKs6d@eum9I#E zcT^xIMhAIVe06c5i_+KcN{(t_2&ZR{4P?F+qq(fjl}2b+#9LC7GPN_u{ek(#(ihwU zZ@Gmr18)Mwijmck?TRGAH`#b<_AF&Q?{HhLrI}(yzbU|8Z6wk~rn@)&l6)Q>oE$0q zCw_wt{fco4-ywElboBJxJ3h~9JTWl2VYWO|4`x{;}gOyZE&zkd-j1VRUvbl zr0ctQx5FHeVG3H6;-p68z^c zUc8GNI~>(Xa>FYrZy%OPf3?UYC|*+3@ZMzfqF>aDzn#z~DH2NcCQS7G!&@s~$rJoy zG^C*cJKz&El^T3xWWDUIqg>i#)j~L--E&9QWBIK_ZdZ_$j3~{hVsN&14I#JVi88w5 zhAGA5APgoGSMVs_D(%6cYIGWw)0ALKmgZ^OIgdy5Xsq(cI6Ap=!!}A)vl#vAIQRG7 z4?me~(R)tPV(PMz-Fzv-!d%XsW8Pts;D+%s9lcWy;`x`#6OYBc=@bYZG;T@m*F~#IYztcsG_xK1GYzpv) z6H1>s4ExvQTf;`X0!Jy2!y-?p17;Hcu!Z0JcS)o@_~<_ zr7g!#1jRO(ybgOiekWhlN4Q%eu!Y2y0=RM%?l@cXJq(B7FJztWftB0Kpmqrpg^a?x3r!L}*asU36|&k~pEM^_c8;GJ}S z7X-$!xkz$Fq&f&>QyM(0W?CHjY<;5a!5$XMJ`B~nroS4}%uB;pS}am)|7}-q!q@l2 zRVm#-+3OQa{VH?s+zclRx&D^zc3OFrnx~bSKVj!+1UqrQG>n-zJ_P1}a5AA;>6rvg zf3__e*;Nw(HYJ&RcPqaXZ(N^9!o=lI&Y$TX%JjXB`SZgeIdfS85nasIRg^cdJb!gc z{)L(I8#_LZ2=35Ih4^QIkw5TktL(KD|D*^=jwfd~<&)EHO3J%As)p)ZcXIXDMdII) zbPo%OScSF0?=e#j)})aQhb%ZXeYlal5ig8dABW0PNB}g{;MSk&ikSSR# z^|ASazg0lFiTVpOVAz>=bM0QODE5LDnY0P9w?>TRhb3O=nPATzC9Z#w&(ntGG2DnC zEWY0oAGNMO*R)uD>tSU@%>BAYTvuPDI{ez99hQ~;z><5V3(Z+640R)vp^0OhUuna? z6%c!Ou8@xd8WTAUD5|>>{8s?PG%CuFj&ApP@vlCTDuEj@OHTwl{gz%1vdM;jwCdVW zLf@J?o^1bSE{c5qvqP>|$Wmk?li99=2nU51q0cwlA4$tBF60W;Zp8_}CGDm?+T&l9iS6C5 zU~XFiY~rac6}Dp)rGt!D?N@Wv9{C-0Uum6OA4Md1{;zxCJddPB zCBiR!^bkicMgMz@T_0{O&38#=OLJBrV~;5VlukIq=y%+D@qt*h_5mDob-cC~0)`jZ z!TlL8{tr&~yjOcD^?`@C#A+{#$7; zA&98s-6yYvTit#0>D6q1Q4l zm^$rG(I)0l({Y~?STrAe`u8qPdl7Dln#Yaz>L1U@8dZ^ zxLDni_kG!eZ^@Y{=Md`jd!?q3d*sF4`ySt$Sq99KpSGuP-50UZ84~H-%AHrhM&AIu zRISuH>`_XS(|BhvfGcDV*(+6U*C%0R`0WgPq`ELUQp=O3WX)RmLMYE?`%jCYu2A9@ zQ$nkw`|je3-q&^z9-7Hpc;a|%buB-ycrHyLP)ZX>93lzmuVf7n(-+TpphU#Q&rhGCe9vFc%$ zL`+#Q#4JB6kNXRoyWpt`KVwvfnR(qv*oIS8xJN!Qgrjjqk7>QW?`exgF5yQpl_ZH{ zKYW7zAdeFS39is5G-m^8%5k^#yKs`O+RB8tF7ibJqdZ@a+-d3VWq>?MJf*G-xa!uH zu+h&#w0w?t%x?dK;@d%PNpGT*WwtV0z_4Ik>N;#By?PR@mgit8F}_7c_tKkX5DgC;o`94#WKeb(>^* z6X>IsTVPQ|%gaOusMLZ!hEd>089i=qOUo0%6s3DC+@A5Cz$_=pU-{tU#WzyHI3R6@LwXqg$`=U`#W z@?C612HMIW9U#orW-PblZLdCLMjsH?K*x{P}S}xe1frB;s|3n3EGu4mVht z5FTScrVAF=!RGp$ai_`cw0WtHD?Nhn34@vLQuu@P8_il0FtS!(cmn12l^TdmC_Vlq ztSYbg44a%cE+O@>mWyP6lwzH}KCqD9W44z65#LZe~|5nMy!n)}QW{p@h-JpWH zvf^u8ck#pDDXnS||BvAbwY3RG^L@QKKcWS-0!psR|}<`J)UFS$=L<8E5zlZGg_m%^K4)^R1f*v`CvvhZMzpHut=f10L$DO+EFqv_za zR1`Bn%@u(J6&GuS7Meeqa{$1_b#TzY(Pf(zVO(n;l)3={h+vyq=_E2D<6@3!2#{%u zJ?csh{V%(uIPCPkKjtqCzj^+6P)8p96YNz)oFCah1+!ptaR0M?QR-RsKL;+vqHvw& z@f_(s`>V#u7g5l1St4RlrZf^O;}l70K(?yR>Vmuf{MO}*egc?%VC>>;a1Qd5?9b0D z6X6)rtH#Lvl0bWh6MHIap;$DxJ1fMq>ML%QyI38xDBi;JF6T5lfPDD>rkH2sZAn^& z+OKUU1{QrXN?dv_>+?lwoM^u=@dMy4u*ho$Uh} zqY#qt8(5jfnuUOG%paS0`(|yhwT3uHI465Mt& zPb$$2Lxt5Z%@Z|GGhga8QOh#Ir+m2gVV$u#e8HCU2WRwi%$?%a`uFO@qU|Z zYwH+vFg;JDMv(p3hB)*B!0J9F1NJ z@l5?l!+N9pMtlS)p-H&|zwMM&UooCP+ea5%JVm#3ZPUV(XkJ4S&v9YIAlCj$P)&Z@ zw{@MVqApdkTD@c1Rk&LX05Fk)aM`=TA(z&k z#p^zdCW-g5u|FH&N3B%Ec_-G7%+{~hPQec05mXf^v?ETrJ%>nMRS61mkjw)*rpss^ z?fahGZ4}n+DtR`-V6L>-Pf zm?*$-ZxAOe=3SA39^iuTHdaFEt%TI(S|`UI=WjE!RyuaB!W%nu;`Z8se&J2KUoR$} z0tej}_0Cz>gsdfxxY4Qu7WdEs>zYdyO?yddHV2!H^b>zRd#|cJb^?)-L_P?de-&p5 z&>h&3@KuqPvrbr@tQ|xv7>9PI(0;Y#r&`~|ZXYRuVXkFS<#Xq|%@iK~cR$r~#NO+l zviKB?sdGm3Yh5*4Dk1ZWE!i;jz?32O^UG1Ytzrvjja);YB3e&`pc{@lNmIM*K&VlHR3C3^MC zs(W^7d7!3ANqiqY#kr#LpJ{w7wtqjqAUfAZTmKkS0KT0QQX-MGHcc`mg`}*%YW1ucgv^H4 zUVH^p{DR|xb65ZR``PLzADpT!>Nf3m%B5D$&mu2LJkk5uWXHd-8{Xo&w+#c zv9=fXSx(Cp=#0=Uwq57TMX!B*AmaT^iQ;@PilJXDc`t64q!_VLyLw>FM~;1HS>$PQ zZC&gJi8{41HP2dHyvoCzdQ%cQ@tzJ?)j#XwPw2s2H6~|3gu@J< z13?}PH|$pNiJXbL>cKdf&cZj!Y&=aLfrE%Ze={18_Y$j4T_H5&ee4=iT z4hU8Ispj->r!})jw??eiO8##i-2ddlRoikJ?!OADfIc3FQ>oJp|H_WPFTrp7J1 zM*YXutv@|ao3*$;&{>^^kZ4tYm)Xa>~pTvy^<+ZYTJ12SeWDO z29QAV=syW08RLcjub<0Ieeba40IG3VoRy(Rbl6h_Hi@+4M*51NnpWWXTjy@r?ZyIO ze$3&`7yk@sK=T-ZN}0e)d09(^04k0c#lYDo%GB}53b%v4FHRVeXL5gGGJq{qbI#2T z6eyRi#-J#~f=cgbhxP)E^f~uuXYOm#_@JtE*nOT2aQsG_URXk?V5Zp9LJ=nerKjs^ z@t{wXD^V;2hV+Si4Xgt?Y8CZeiitP$e8NY86W^VU6q3E2Scj7WZz0b5UDtPy4ynQ3 z!yJ#X@u^{3C9zCZCA;r=GnTO><;sAOI?ZT0I@a{kdN*IfuQ zsyEh~o*IP%!aFYPa@WuiUxvIDmj>Hbhg(iI^}iNe>ecGM(u3YD_Z9f@^Qs9UNGH%9 zuh*Ivadq^L0A1Zk1$(hlxw5%^Hg|D;qGhsurnPpWbNZVq+=`#vuGLA z$3p+>>N;B0NdL!Z2Uz9)Uzo{{0=LQBeW!R;ge%{-ZyWhdAZb!n2_#K2vf{RR>6Dua zkj#{#EgBJ{I!zOR1x1Fn|9IU1z%_T64(S2fU9R)|lj9t9i=jrZb?vF#|2V6?RcOHEk=(^ab4p3FZZ=1* z$uc?V+!D2?wKCx-$q2XnTI{9bPahRk#(T4VO1&v(7TwWTmd%qx+mb@%Sfab#;m| z8{sRrQd>3CcjhxW(vY+9u9kv@&DGJ<#|H8&9i8(s=3xX0R;@eI8U(n~T)2LFnI8P@ zOlMv?4w-t7f_k|HEUL75**G@JlviL|aP-wKN5l8yVvwUxzhgyZ>3svyHd%dvM@rjv zLQS(0><&{6-<-llMb<_VG%5@j#qBF8az9ovSL!g_V~_2+myg?$LPys*>1LyJanIpq z=pR8_9vqzSRg5icGDkSQo3-kx!D#P=o{H{=)W+%#_O7=uTUiHcmQT^I-V$(fifXpS zdl;85kuxUr9s#S68MQ??sfMYro2N?DbXo+<$>Y>Ja_o11yTM}K-jCHTK9atLJ>c%U zG&I@dad!lUCL588Y`1)+>{@r0<`*;r+g*hfa%OB;HL~7@J&qqL&YDvrdq!PBy=%mm zmt&nM-cC+3iL#rTq8X)g8ZF%ZaqZ)50HtvD7?8$Dq{K+79 z&xKOF)FA)8UvD+WNUge}dR`^}x&n z?=#a%c&%Z$8v`2W zo;KG@S}%(1h7|MMuPvQC@w@$r_q%Da5aII7(=(KW%OW8X=JtG3Gs}| zoA4W5j|3Sr8vw;1&p2xv8=hlil!n8ZGR88B8y&>PhVOfioXk32Y))q1$B*_au9ByX zichl{KI}&^1SdL`eRD0$F=XY){@OYf8g~?VM?_k5H)iCqMU9Pef4;Vgf7E364V(zK z<`QjtB9!e;POUxphT_sPlzgWw(klsjvK;nxWlh>qxshV8SFgvik!6@}T!~8RO0Pgz z+YLdZYIgHO;85TbEtl^$*ea<}o5vU8C0RZ-J&4VQJWHQZJlk90yurMDFRz~Mo14e( zl4gXd0n`0HU8)}ppRDH2CWbiL7eTcQIoVe8GKq5R*t@j;f9P^sRigk)cDCHqbYSwi+DS;nrim6Dw-S+j35)?vnce((Bxzt8i1&iVb}sB=0_=6>Jr z>$+aoYe|^$w&$psY(}!LP6qCD=A4llt3FP<_^V(@aLbqe(PR48&kU<5V=ir&$F#9v z2)onYWWo#8`3Jf>6bo#6C39XU?mZ(}8G4)fsg1dj{wzT@znACMWvk7{&Jkz1RSlni zU7QKNDRv2!%`pJE)|y}JxgDEn(3U#?(ZU?8&ez}lo`)Z^pxCv|%x~oOX56yyfsDDA5Xa9vBbgqwDXDY0X}Tk&U;) zo@S(kWxa(0?qDj4!nn|A{L?JYa~coNJexZ6#h1bD(`rxh8=EnM(0TKVE2_9)zTt{q zQ%5w)iA9-d>dDnxF&F4|Z?Y)R-ap_#+#cLdygFQ4#x5>)@tnU$JT&gWT3YRc=%Bl$ zK=0#zFOEH!$ziDb`Ult@Scl66D$4AIU~Y``^wA6{G$2}OgR)OUh885oX~=v^LY7p% zC`Cebft-%WkU+7>-R zBn_6@$O7gf_5^N|qQgq1{@+=z@kCcb&BScbrgP8DE?p&&kprum4hznvEYo+}1vKv( z;4=_O`0K^h_E=;QPRm%D#S@~R%`((}x&7jLws~F2L7YNP=4m~DtGF_|oWK^FdJhxm9k91sVeB3^cM1}bJss0{bM0EPIQsGN**_2## z8yTUq5p~82VtGF>J)8)ru8yi-W>qzyxSw!fHH%YIyjPind|x-Tj}sPtbWh}wa-wQT zC~5AXlquL7xUC&t{Vc_w{tK;8>1*#rydsd~bQ^pkAfD&9Gh!hZ7w+zRRPI65S1wRv zevjl;{E_bCQ}Z&*&XWPmKd|uaI`a6wEakXK`Z3h&tys#@2nHydc~I;5{D$dSzC9OZ z33JUE<2R{^|G=08FkP@G25M2BuA5@ij!n4;#k%q&RYgnqRe~vL-A131%nV>O>v9pMRoXFvu($7i2FB0zgzSHyB|H!-H?A3p6g{)DPf_i89J2m+xZC9eXYta3Bo?%ob%a=t9O((F8d{?Pt|t>^Gilh*B%*&P z?&DCYNostd({*3D>?|jL<|7wwW7vs}J|L_lBWU+G0P=Y;P|awt$L2$ut1vWmQBml?$l3>NLWOyPg9CP*`Sa)m=Sf8}`*g{(`0U65vKdN#<&@WE}jleJx zWD32{$IJFe1nyjP7=*?Zxu=f%|6+Q8ChPO54Y1I1El*YoxQH%)W_YL0B&Y)0hvVp! zk@-qklp=vfwatnM+-XQ+bGHRw!qJq1cs#+2TaCaa1K`QAss;AMUp8X`Fe3HGhm?kT zE_D@x-w;kCn-$pczAWA23~&xZo#(+S&%EHYh}c$Xn+de|)`k^;-Qgr0nAzd?Kn1!u zp_bFnnoB)IxPuAMdgv4N*`Byn+vY|{mIhv=#2hg~$bJ^|5I%z*D%Ah8aEu>o@_7{Y zOXk)^l@Ofv?RbFH0V@pPr0~n#daiL%_sCMaJq-SxJAwErFtaDEMWfik!~}kPRG+lg zGnfVN!hbbP1a2Lmk$8j4G;8mli4`R;x1V~#t))~jmYO(^pj}l9N-r>hOnZGLsXisP zRX*#%O4s}`Fa4jdhguZK`-`HUfLhKp{k0Hh=k8j>%g{VFV&gU@AN2h+`gC+Fd4ROL zrpjVn?o~Di=G(P)vvX62=7UDp4mO7pk94sLo)ZJLLSnS2GFzLcJygfFv$T(m75Q2{kJZ{!U*?p>gM9}3=Sf}%w(~N{ z8Y>nzQ9A+vw;67n-a5`!3}&oRCihi~X@?ek7dQNM_ij0PS{FTE-@PaLuIIGo1p>d` zs$;Cfl5K3n=kP8)UYSzY!gRiP20Uj>*L11MD+e zy(_p2tSj_K{()hx@kLUuR#@De5AJvKFT2^FB~$e@{PY!?5^*%zVOV+hDf0qldSgt_w2!8q)r(xLo*gxGuv50uwv!u+F3|84Gpd~P7(;nr~aBHP*bQ21Yad_467<% zJD~}gb@WzuC4FPtDBP1*e7T16qfN%AoNkHrWW}_XPr}M1vZ?|$b$ZEWC7^G&5l!hw zJmqUj^ii`9%`J_a0xgZnmKxKQ?@3OwoTw@uTTf@ee&8=uErvAf#{~*>^rQ?QIXAYz z_kYG8Kn_sD1tgY!sF~g0$5{k47@^!R_|IN;E7sTN0B}ypfBj9s_Xa$KD-Cctvh-IU z;K&OfavHk6wau$r3)S|m84}FP&DIX-ey;gz)s%cabmCIIEzXL%M_d;*I)&|+$Z^Iy z=Q`9knHMfHHaSoC2ycz1$3Ii&gYX%!0brg=mWq3>5Z*!aZmQ8V>#@)N&xrLiMHe8d zj-1bLhpgg|k!(dt&$)*7n@w3pJjf@0KSIp$$a%D5Z{RY|1Um1tOG-lHoyYnF6~}*I zM;P4}Mq;wtg89Q;mxIVe(@}2ymqDzt?Q*c?I*s4;n5xcG3sv6l8Ky>Gz+%E~@&>?D z;8#8bARkZKr9g$iQ!W0*LLI?GGY79#hKrih#3WIjJtn9xFtc!U{F09+crx!*-A(q3elLIlOn_ z7xc~##2Wnj4yR3=C&MJ?lJh|NJ5^g!AnVb!@^O8AsJFUsIisF`vNDsPQ1ojNF4VSN z91Cz;P5fMZl5Cc-PUOX^$uTwzNp-IkuhXSwXm2o3vT()_+dW1zA=ql+yy$_I6502_r&5YsQKRLbTisYT1LP3(g<=Kq@S}T zi5l$ipWGdIEug!xe1&~a3ZNEl%i~>b?Ccey&^+((ctz`=Q579j%|*g@a-H(DbZUTb zx5y`KMqRkTO<3f^!laFO9~tmM9@wQ_^}hruv(^6Zwfg7Jx>quUd@_s+?k#GkdOw13 z{vMZ>jo;^$yj7^~R$*51Df<5N%IksC0l*n5_d;HNL&J+9%Isx_`A`ZAbr!+m1HS!A zBQu{VV?<+ZHRiOMC|`&-|H}E6?xpU5-HBc*k!)yYN%WwkvTmbG9!k|z@5qB6^1xKv zU#!do^SH8SX=jL?U2}I5zA)^COtuRrHoZS4MzB4f!?&Vd&WMimogA<^7hj*KsuA@D zD>$+nfa7dvQd<00j~wWqSb$l?9~nUH*)#Nf54%YVz$>l23R@Mt|39yEezs3V#qVri zrW?>>o$bx1jLKj6P97IjN}5}Pb4sN5IV)#gI8hf#skWU8I=;H2%+oit3%O?%uAOgM z&PT+ES=-=seC5nUuUpmrxI;ftaKn15)~m8D0anVW3_A~#*BKyrkm0a3mxOx5r(NQ0 z4fN($a?Fb2ZTu?)$2-P04HnHBm~2Xx9zmZ_nV49kK%<9eg3dt#9n9JMtvX5TAHJ4+ zZ7x+&+fKto>SFt3KkF#PV)A|vgZP+ei#2j~ZlE#`tPKNzB5@7104>OD?^JTBrAsXJzI!#`%J8OVS_YXa0nDxod(0# z7)G0`h{V0FhTj^MtA`=8G%lUc;&Of*e><+kNrHCYr_S=jXT^(SKOQU+C(W)C1l1uw zm&~e31ve_dlMi|bs3UqXAAuEIIA7LlCs71Du4lhWze*4X?cwUrB3kWB+ExoXW9+W-zdU66@k{ypV6z?1Tfz4@jJ(&(T*J%v{lz#4x866@e|Yivmc8Uui$k@P z-KEy3eXjaV2%qf~?<6GOJ`p#Ga^_C>bj`_yvmBfBvK)1l2 zGZFJdex6yRR(}vv=dan?B9l63I(6srb(QD5anjVqz?qE_Mgo$}D_uLYFQ@L>jMW-y zSkjqPZQHG)&yIA69VHMQeK}A08A#ISPaWZO4qlV5#A_`acT`DeNd0U?B_} zHEUiNqqT?{C%+JuCsr=Oi_2i_{dwyvfl}9ip!gP~8u7?qH7`u4PF+|)wz~;E+Z8_$ z*k$1;lmC38IM>jCy-*+QB-_i}OZl`W_;NWlWWZbIPhu|pw=^?CU)CV30+v`*nv*en zFCH&5awrK*l;Ox(0q9e+F_fPp)j6>ML9ko=FDs*0&BG=VJ?TrmAw3VVku_ zki^nB+L?5KCNxl8rG@75@gQpXE0AYV4f8^o9-7cHB#543o z*p6;xSRV0QfxJ$6q(yp8T)Q+_;;$91N%Zgg7U)?LyaWgvX}Gps^I4qh-RBV*C+hhR z<$a%vd?he>BSK+fAr-#^ojz;IEi7nC0K3K5xJY6Z+|4>W>DwkdQ>-V8D~%^3_N9 z?{HohLjT8;PcXHr)YJjWP@F09nR4EGjI!joN0xh}NC_Cc-rB%?Dx_yj?$L31?Oo<0 zi`b_VblfL2J3#+yXlb?+BGsHpLtlBo*j-lA>*@+kcz5%j@Ps09G#-4RXOdu-lN`uW zF#RX?(JiJWp4y%?FYPB;Lg0iTLqZv?ZY}XAZm)pbd|>rN12RwkDc{Tmw*c@1NyTiq z^0zshCk4D^WLu!!dYwNd3&IZNW6J-5oso0Q7RS~%gkK%Ut_`ldN5@d~RNG$(<{vJa zsKg!VQZ7ATcqx18UT=sf5381nAby2+yl!HVVvn5q8DT|v;I12({}tzsCDWli^&Bhg z4fG-dr1n*XYMpiZ)A&xNhn(c$p`!5v+b^NbuwcOeiFlW{h4I@sq!wT!X4_Rg1aab? zoPDPD1T1DO5l)mBuTuRl(|azN?mR7&*HHgro8rYX%W`Np+f4=u^avXuV=vj@eCK~B zz8ikqIK*$Abz(k}+CjwKrX&6dMWgDEaQ1nRtt0;U7KkG6S!ZPbSFQwNaew+~T6Y}X z88eqN`U>>_cD(!Vdg4!9F<+0SZk$S*|M5INRzf6)K=Tchr4#+!ry4dU$W2-%GdIsg zUrB!uhbjF)m1u1(OK?8ScP4Mx#APVy?5_KsiR$(Jq;uxWpGa4EVCyMDQ(5USxTSh2GU`41?oZMOGj3`^SJ$PkuRF}6 zLp8qg#n$Po>8MxAT@_X0>gO2U)S1GW$k4i?xCBokFGuoosF(wd+q%!k66e~$J6+@2 zju!lAnMs=md^Llwe<$5E7L}LuK0E0Ddw;W-1V;T<57dqe&`9ln7%^@qI|RKTk!s9( zz?clXG>67u1fn70)QFjPkg~!?7LMXu*;0? zW<{}J@EMxwI8k2Nnylp?2HwB&LGUIrZ0@bIwI;jlGg>`Oj#PJfi`_Igb~(aigu* zXv5p+rc#eB`tRU!PqJ#d}LK=G;>c6pRO~?~C8Mpc`3n{r#=1SUADiZlL z43@Oc$bhM65ka$d@mRKL^o=)bPr?VvG{m;3>3%NFi zh?uS$`GDQF2Nh!;tI#6r)~gGZ@}&L#66E@^gg3GB9Z%y`Thr!~Nf{j^7f7LRMPasw z_y=o$`Dwv&i$Jn&EZ!erv z_A9^Y=f{i?Kj09uRv!d|9Cg=|+Hd!^Dn?cuFBoN)_mo|lev@oi43Liha)Cc%EgD6m z-(CF>Yd7l3$23LdMn-;G@wa0CJq3%A9oiJ!zB2>P5GTteD=@Z9b-lF$CHs_KXZr$VM60d0@kGi+(Gq zg^N&aTim@we}K9T1gCNvK|DDiG@|;9rC1KE7F67rYCuPfH{i=q$*@bF3naCh^_3|` zdpn;($Mk#+iS0Xc@OREWdq?$h(rHeuj(seCFB9&oEwSdF!I}s;5-+^J73}GHo%YZg zo!8T#u#ZX3#H-QCHvYSUzOftQKsN~$W*+Ndi~FHuHGLv$D0 z7=}hGkc2KzuECEp*xci#6GGX}LsZ6-Y}r&1fAh%p4`|;EyA-Zt8Niy|6T`}1xSh>F zKbx`j@#Due<;!UVZc1(T7LAH^wnjzBd6d}q1hMtTr=M^(16|ukt3GH&kMeVVmt@U? z4%J1NU2r@FP8eqB=z~7pTg?L&edUv5c-Tter~*|V!u$j{#3s; zf}++bW1Mh(T-I{Rgs;r1sBG@#{tSG)m zrTNp@DWLY*4HjA`IcMA zX6&xmTwX8>QSp7VJ8gLRj`Z5|sitnk^flmq?9~Y+3QVS-rY!V%tQd?w9xR`#C`{6L zpq8)I5sxE{ukehBWCLycT^8zm7_}$N)}f7kkf6w3nQncVhWq=6H!UA>486XIpCp_7 zsdo^=e~KRXPLre(CXi~V7t2s1d6}H7{-$%JgUa_Qa=G@tohi+X++;&y2UP zMuc@dXlO+2+{1Ra=Y3U+L<}j|&fz6{EBd;oXirwit|H###a@C=#TICzTxoe` zIKDVREbCz|d;-qf9h)APwi|G?O! zd(k^BlGljr{cI!$`fX&#YUT!M#6+xYr!M^1>-~p%%dSGu2E7$|)&%V+FwX7GY;@W| zm3G;dz~9_3A>e0ZABsWU!f_iS$`@tzOUxej90NCr3QxuRXuYMrNs zIjXm`DtRA_6kt@U9ppA+Pm>$e3LQVd69h1yB%yOvcda{M@>uhRo2(pHVO637Po#3_ zoZ2LkyRcK!7RKv3cQ0DVGL1o2w<3oTPw9-dS@@2sw97aC|055SId6(=bsc@KqU^6Q z@Ba;bRwJ#Lt~5}sr{yvf83}0b8i%p1S2_!Oh(!@u>oFq_r_TKp)hcmy3XZ*)EBw&l$~C=y>VwqtkQYgWxts{a;y5c1|;1ie>YBbNYxONj~tZB;(q5WtMTCjO3OxO zY>gGF9FSDz6e%+|oe5AHX)!E7$-I})lK9;lVVpvTpP_`1IVz^oQ2I6=p-cI;q>L$n3Efn;7ys|NVu*D&10u zjKr-^{frZieiX44QqHAoOw3z!JdmX4lcddlGZ#wMkAzb1VPU>uL#?FliB0`8k027^AZ|J6=pa2mswf?T}2}oi`vii^yVQCspgQnppl@BoL;SX5{x}U3`?|A!V!`Pt7 zGdsa^Hq5DL%C{+YT`~DJ!%l5N8j78F+2Qt$GylNol!b=d=NSf^$8HMO((pj?nNM2F z0%KudJf&i_Q2y<%FBJ&aO*5A}Y-h?&TXPWM)(}9^Gs|b8B}$Itrq4fRF8P{EGsS*R zQ=*$)h~1}R%gVgE>td)r=STfNKJ6`sLyP9&-7|v73u}kW23u~FZ;lL|sriWaw?FDR zcUFGi?^fLKw#3StnuEpUD&!_YY!_Uz>fhc14d6H92z;sBVwneL9+>;3ZV(U!{IAn1 z1-wy}E@oCm>2c=$BZr$Xj$$$)I2}Jx?EEC)(%a|2OSMlU7tbCyU}LV^*QLISj_+25 zmj2`EaB*)BTF9aQwX#FvBQipyE7eON$YWmVMA{6BY%g)acZYCw--4c{{*i-)O%6@| zpa-Td4^`y&?lG#(2|A`FdXTU{I}96Wwg9gayQFAfij~Y!01P83XVL)_qWmmSixNm1 zHtO3rhq4cUE5sOq`X2LDq2hCQNb{vr?08&hG{^}Ym981r-jko!hR#F;$S&sMs0d>IO9T22J;G(5W4=~PNKf!l! zvb_&P`^8Q*@RpL_ZUzNa$qK^TTSQyiQe+lQ8BOK_IdAIK1cyY%_n=iqG9S?00br8HOFX%pt30kw%|&Sja6*=k9uFs z;;_;hpDf#RI>&pG-72(l@hT;>docrNf;e75u0B&b2shUu`u(U$VPd&c*5HEBylZG` z&yKnq$EPFU@dZBAL&w3PmEC}|i;74Eb>EWj?8+nDHk7+@sVoYh#|#_u=}C0v1tqt# z|1>*TT7i5IHQAXnJ1+KxAYl6^&g2?qXBm^P0T5?T_9MdfyUI%R^HczrKs=50FLoz2 zoQkcp&oVpp0J0_LOHQgvJs(TMfwQjEj#2gbL@Sd-6c^`U!|}pNz_%^)KoBGeeRlB} zM0YlEzAd01o41xV=pjz3o`qxhO=gCr`vgp0YP?%FNQ;bFp0N!GeCktn5MF|l?C|Ss z^E`~U=R5Atu6~(@*r{ZP4svOF{|-8A^3XAbPjsgYwbD92Hj8rpdeBwkXRHTeUBNEt z`S4bTo@-7?Y|>w03my@_IOnLu{@SlD2AeaatE$8W`F9A+J^_4zzXJ^rR>FxE1WD%h zi6ZE<_$u)Wwt&#L@Qn&FQ8(llB*qH~0{=_)vS!HX>iKbRdect1uR<@iaT&|)^E9oE zE85tw_NPewFrzI)FyHgMC#*YJh7+0U-)K#$7-9(1tRbR)J0B;X)=hT@$=23}C zEalI;`ca<+rdv!VuQ~ws)DxNJ5~Gh|GyUr|6k_~ps=wMD@nsCASw)g^L8%p`6Al?R zCvk6YgiVr9Z$iqH&ycVS>QY-s-4BDc69+W6=eg>hd#m#TG3iA=*v%`A6=Dxsu}Vdh z5z?!iGh-BcQhlOY)qa}Scdl_T=aHRmCcsW9@3)Q~s9;sw&)vD9)8v)?4{Udd-O~}8X?4hn{-BO!GTbf~} zaXWf>>TYE123%eGT#Sm5-?7!_Q)6J3Z#~bM+TZxS;*tun5~F2EDz2Fe#}a((i=%EA1Qx#m5(=0V_e1;G2wz$%j78uLJSl&P7r- zW&s+?*8Me0u?2lx?7Y7XzW&5>gUI@va!)#?+~hQQZaKct`utjoe1y}25ZpZeI3L{EB_aSA1St;poom3QUe8^e+H zyg`VTl>!uTIEZyke;+z;CX<)36R{F^WCT0D8ho1l6{#PIgbWpOth!)^!yZnc-mPDE zYU2<8de8Lx@P5*>`kvaPLsX!=fQxTs+n-Sx`gdL?qwJa-nUskL`doIU#G7Z*NCk?r zpI1NBPF3o4%5E668s2VUofqIah;wh_**FO|+Q)GZ^Y9ifD6B#IH^K?Pu&#IM(y1)8Q2SlU zW>_i|d1T?Mj)?n72?pqA+2GM=j1u%qbBq zfwRr#3+P!nM6_`6yaFAqZglfS^)iba+-CvTT{pm-m|W?jp#|R^*OR3oZeITaGR>HJ z6(IaCxK{O+Z`s7{j!_k;cV+*MG7Yxev3}-q?XA#2mp_Q1H~@`khdlZ zHi?7aDVU88@E9I`^CB#QhotXfA>om?#=`hP&8YRFJ5aFL#W zzsWva7;Zem>-?eC^~2=!iH0l}{7_HQ{~@Keu?ae|R^(i)uHlDTm#@OT9Dj+8)jgpH z6^~r80uchcQx#!JnzdYhtdu*J#1ri;lS#GET8?vBlIpef3A?sNe`r2I*1+QR8vvaS ze=HJj`N_1FRN144e?fGooaRxG90E-+M##)ii-!!%th=c~bkF~;(vh`3Ct8M@nBQcB zJ4Fe^L~2Pu(Q0GmoC43`-~8Y{?1}p!l15|eumrHoCY?dVd(7MdL^X+wJIr{0lfV}X zW&KBqf401S+A)X`OOvg%_pWq0mtY0LMF@g3Ig9b<9oM(b`Ze2-~3L>+dNNZZdmzHI5H%n`_VnVIgFX^)$$pyv4~R=(H}NQi9U zgG)`rL)Vf;kg)45tE}Vm%Mqi(j9-N(?aOj84&84wQB>2TS$+Uy zkZKn-Hhm}Cw`8j;woLVE2c^og?w=qb(aDK(&E6*@)5*b<&+b0PscAIpHI3K#96Fwq z(DK>m)Z9jlenkAD6c|k}CUcxQCqkdAgYH!3^{bR2{;{1844k{GEL4*R*sf2>J^OU3Z^oHCI1D>eB^C4h%NLF zCkXbC%%zgIwl-r~H{z{oVt+2#mByX$`rTV|iu}tg8SA{hVwK0Qdm+ODT)09aj$P*k zQ|D1>s6;_-r?n7YNbO}pEZ zq8c?-=(~&Mu7aK+d7f9~4^tHYPw}IL%~-8gMEDa?{<>jdKs|K)^?Az1%PIvO+x{|z zJ3X9>j^b=(CUUqO_+XWL;EgIO9<%FQO>=xs^dFa>I}h2ePl4`f2XA+@rPNGV27ih3 z^*QYFd<9S=-<60Y5#+*;Pa|z1h(nuPg`zt0x zliyoQZez`rht878RgxH*7cKwrT^nl3*h5AtL2QE_h;UB6rlI|x!plu@zwEDz4sxld zp}5>~(i^+Ad<94=eLk3qsP&ixg`KFFRLs3kT5>)(_m=VX?Rjr&>zxF~#ibi(GGIHa zRlJzP5at*KfrXv(mOV~OChIyqk1tw3O?_gmbH=6j0%Lmfg|i%jmgi#Sdw7+rn+MAi za9)sr+)IiHnT}^?BUJKP9^O}YNxR*X0Xy&me)seVejyrnVNXv&-(twWImtav!R#m5 z>%6yYbZ*#lqa)JMisrwNP^DTy8=Qap>IKyo-d5c)kop-39sX*!!AoTaZD-14O%No_ z)LsVYm))8B#q^87yKt^7V$(|Xl`vJ@ZIT4Y;-T*m1Ig+uLx827rHv{84{I(md3a0i z6{v%`%=uduiVaIrIkXeBC(e-YcLaH)+Qz?|09)M5MrQoQwNz_-y@|0kcx}|V|A7rS zfT|$6u$ZOMmCfBGup{g(^aQxa>Je*6hJKk(8Q->RZiu1^H%$3_m7wXK1Oc|!%wbgb zp{Bu8wCK@HdN83y#L`yLuj>EY_GlFtBZZX`6;L;LP!df|uNiQV~t z<3O?x-b>f5S;loxB`;Q;tB7$P3bgyp4L|G^>BC*D&A~)Dp5*pNC?I`>?RQL2(T6tz zKRtQ?;*PpJYadcr#Lq*0?8>pp_lKP;WCM?4DZt_KZK?)P;H&?O0+Rnl1P!k(1m52! zo*<}KYoxr7)Z2E~5KFyNH^hkeXT^%o{2!8oIukYCMM69Z-!~>&ZqHbVK_1Zu(2-MZ zX_HG9ssL4g5*Q;yQ_)1Vcz2U>Pw8}h6!r}A3nyp>@uLjPt%gMS+FyBcK1q)f#&7M# zFPYmu3j!O`$d@NO5lCL`c857vBd*gS>z^s0X@72LtbDmBs(n~NeO^%rXK}m(o}3pI zVEEyCKnn!^#Tr;J?ATuJd53bFiaAX3{^NHR+yh@Rm;TjjY>f20*7>x1NERA6pR=TV zdHgv9xmG$V-rcV8Sf43lr&3#EWJ0W2GSo#vVf`9)X!wo-@MR?(nWe4B9-k+MeTdNz zDV!iOVud<~IRi4~**y>cftjrU zUNd9wub`uO%ZTMI-->Aol5IBpH+XMT6*V9$b_QK<*__N!R!W@eM5IgicHsL%Cgq_1 z!z!0qOUZ|{AO?QaA^Fx*v9#bw(hU$Z;NU_KsX{KupYwI8{r0havOb}5jsBID3$Nt@ zx3YouR~UVgP$BRq6fyZMw57BzlxeK`JN3$R0hB%J*yz7QNwxECgdiVqBJ)zLxg`;!KuJbg0S_pJfd&C}~HhJ&$^$TQ5sH;gD#ki3Pf^_cm#3y^D$ii<4en&k6YZkMpYLmjo1 zS!CsSQ2tc`l6kAujxO5#zSg@6U!JqSYT|w}cix8n<3a&uChA17VkAvTy}iBBzq$UU zl`L9W@+w>9iE@emU43XEvqQgCmu_x$`KB;IiK9)Qp$L{7)AmNtC(#5gdtyM!t#MVgU*c+ z!Q#KH-#?+MTu|S*=Qji`$~Dl(Eaqj@)$X+`37G1^7r!VLbm)W z7LR3Q9?gBbBA270{Y};ir-O4+CVs9?m_{B}Xl)Vj8y~LQy^5QOqNHvOJ{bi*jcJd! zUFkO7YSnpVp1D7j)O-2&?eGITBJU=-#|X@TIi}9o1A@*vG8;_KNCjyYb37QLON_^_ zg}RLMSAml})jb0rR1-I09<2<==kW1jy+nZ6WR=YS&QRXKK0A#d?SWSU9~VHo9mo*z zmfcl@#%(;K6p{0-NWI61K@pqR_Ko^{w4DpV;sG?oG|t8fPN>$?I78+jN?183j7I=l z(#8$_!1$0E8^!TAglrZ=ldmGe*AKiun-~uUa2KF{(590YIEnhDO`d~yMM`Hby6&eF zWD757&eWWfI4R&RM1)zxvtS-$1N;@`2H5jz7ta9p<;P0kzm(@OSd4^G`X3r3Re=0Y(W^a#g5;6?LwgdpO*f*~c-j5G?iD(3N}01Y#c_8104@O0KH*Oo;Ju#!Ux%Jn2g3fFKj)0EBfVCsJ?dNZ}%f@hG*ZAFlv}r zbvckW*ffQ`y&gq%`r&&|aH(9XKrp4rr-A+GEkixzC7&?3=;}4Lplq$XG4>^jG383w zO(pGFks&G5EqlG_P7D4BHDMJH5AtKFh7vbh^FS>qdca$H9HdeJyv8go1cDY&#Tzqx zE(Rw%n`1@jiMd`<#pvS-TvY3#qCud*=OZ0sK(4yI==|>WLADM(g2#QIqSnJ)kcL*J zdT6VCWKubyWZNso2A|y?3$v(1_O!401*PT1X_b}SB6~j4S=5&dEF5FvyPJA{Z$k^# zSk=#*)oXH3(nR8hv_4Bg{RE1e2svPW`)UL+93-$>4|4Uail%>|@jt#^49d3k^z3zj z)^g|+bOVBH>ov@kWcDY4*85GzE)Z*RO}AEc{PG3!qS2wwZ9usFi7;UF*R>rCfct!T znrd)C@8nDj5ZKt_KnpRclvQ-tHd;P!wVr32*p3~M0$w~0L$%O_y1DR`jKN&X@*DwT zpE65ECnXX`@nk%ljn7~fb0rq2bjGoyB#UtJsj6Rb3(LxisS_j6s>du`rDSfkoR{U& ztkD$Lp{)4%AmbA0_?ZB8Op7(qc+&EIVEafh=!;?jAoYKbaV|MEr%^^xOu)^2jo-5y z25!hVzN8O_k~gDM5h*Zdka?NB@?4PbPqx6d6&z7ZHEX^>E#DH!eage|UnV<}_*ci2 zEd7G-%pb*5viS>fdSwm~hKLOwO4ak_5>z+O=nNz$O0Yq9JUv~lo%s8vv7cPowta0u z#K;K95q^M+HpC*g1Fq3dl+)5wSg3f>gKPty8xrutIOfxJ*w{Eh8}+u-^AMUinn`UK`BU8%&(EjBqt(&s(h9a*`W{b@;P!vgX@0ivTWq7=UtWqEz(xG z!XH4C0MypNH9c!qf4qX&lFi-Bhk5-`&iw7G^klss{+#Idb_dpqyeK~RL48$qLMZIn z(JU5hKdl}sIhkK13%s#T(-~Z#j1S#2#hPrCrD6EXdsNblTVmcF)`_>Ln3nRwc#t5Z zghJ8X{4R{~D^C6tp^LrJ;LGe6S^x475;u*%YE7izN5ne&gy?J1b~L4y;=10|COrk`Wqjd-;~&2$udDp7EA_#&?1ZiP2C#2$bnd}F{|!K=t2swGOv2#~9_sxA zEm+#qguw;Z8C?6PdhVX>(|TV3VLh8vMi?@@C+;nD&2L?Zgq<*FTM~fIuU{TMP983MpGSjJe&mEqN^$rr%_pd$bFbrEllX zUrO@X8ogbt4+9SVUbz<@_z0S7EMrBRp;G&bS}kYi@cJ)bK=C8BtLPKEH6(TKrHMs4 z%Ig)`AmZ?!-RNk%#0oaFb!r z4SN4V^B#8+esv4#>+9u3DORh>(m{=Z-W`&G)pa`;KA1QaQ(%XLmf*WTtY!xg`X_EC zO%!#M5s;LFGzl;tyBCdOcehLyWk;ZqgT9o25{c z?wyl&fC$c|iTdkmJm$151*cg*i3{2s>Nvbd+qUMFq!i@i}wfLsp*rg)Z>sdSF==sBl&KWBqCKfftQ=6s1Kp zO=hNP^>q}!B4CtweQ!;SYG{$gx#c?lUm$^RixBH36PUh-CXzijr-41IZ=;S|UY6gv zIQy;ALe*O}nM=a~S$bQ^3}3$pvXB2)c+m)FOD@wW#A)$DKT1UL-y!k>8>#gDX|Eno z&6HBcFT%cpq!2hI=yf)9Miq<&#An(kJP3!i5eY0%+tTb>eX!gBX)p|S0me`Z$Syf? z&~W}>E&1>Dj2I0;;D5r>9w;!UVg=3Vj~NQk5&+g_ras2Oj5IP-EX+d7E?fjxbK6Ea zP?zd1FrTP}SJYOI>y3z%_u~td`@st+G;U~C*htL8l65eVEt~2!j@Vdg7W3RW{yq!p zF-fnF_o+Y+r)bON@@JD1*MQXY=`qm9u}NF*=R{_61Vi8IVz-9JZ9hSFIawcFj#gx&>aWodj)Crt1=Hw)G4WD>JQZ+&3sgFs zZ)XanB))VQ1hXTSx9cKj0FZ#Gp)ZMppWAg7KN~HP-EKE95UB7KASJQd^EorPj&9w! z7l$)+(69QKoKa92JpNB*KrsIB0ZRlprYhjhq2`SDVZhI+arO&tJ2B&GAcZ96k83Lx zFIN<-s^~NgFEPGp8uaydQ6jqVJ59r3w_sngLaZ<;Oe8J%Jt^Ncr_r*|YE0}_e~k3j z9m^pp`BquI>x_}hs7YRGM&0UpY7KiuRmD}Z=V_(yN!3Wb#?$KSNo6&I71}$!*hE86 z^QJqL5!NHyp6ovJNfRHA-q#28UyrjfZ%KW!IHI3JYqS=`HBPV=i?%{Hw$+RjM6v8p z@l1ZdDlS2GL_!`nA9FGun2arEhR`P$;!Ba2Pr{O|eWjph8qpq!X{+~cm{ELGm7$t z&GpU?6zsY`8xJ6oSzftl*K*8%kQ|q8t;A(m`%Kb?>x&+Yllg8iM&%r%#JAQjl?C3c za3;GO(s3fi=5b;7*cWvrVQD!r(%ws{yfddeSiF5+8tisQeAGHWWKYz^Ax)#uj+(9|Bb)BIvcgx!c-gmSg4aMfEW=+~!u%W#Yr;RFX z&u)B*>(kO(tWF@TOgU_sd%_rEdZUaZfDly?_O8;tXI%Hryilfw0W{@XB8M9L?MW+n zMgXJJ2cY|0sy29;*{ZkP@8C%3vahaTei4yVbbxg2kdx)Gy;$ClvkG4{hGWqQqODRRHk zdwvI8O52{+~=L6lOj?CI#C<}BxQG4JJZ}MG8V_|joJ_WU^yRCovr3X zsAnD=w?B^j-G4OUExWF%kD1*e*e{-|1}v<)T*S6=x!TIL%Dk(8ENZ*y83f~%h0-wa zo$|V}`7h05RUF9Dg6xNgSC4~fn2*}&TlB?OdSCQTEBjm709sW(IVbh;wt}`SVSoI} z%IQcf;_$u#FaFfKn>oB}{WJZ3+zcbpH~-IgCnb;19+zt+>V7m}YX0Re`^xqP5NaG$nw|)Uv>a0~<(T2$*Rg zZAF84$=Kr)SoMQ>H4c6KZF9X6ev$kY)KX@eVbNOPOM!Gwcln@v&x}|HA8nDgph4=kD z&*!h-@%saI9AoTQyszsz&)4}17xehOd{tmuL%>EpwM%BeEtH5RK`A4e@-G+n6|HDT zhG^+QGccA?h0?8|6z2O|1Mfocw#I>4$!k0I=jRY<8E<_R$a}%s^&>#se>CVvrPfgL zK`=Kr>WTHdH#9yV4SR;mGC?66an^K-c(DQ{yCN@&r~c`kdsEdRlT5l4y+44hhvCX{ zXQ!8NB0LcahNDi!RcF)%<_s&;z)xZKz(&Ape> zFz8nacW#&0Q$Kb7g1*=%G~5t#n`g2Lp1*+g^|~P`>Ak7_nTv<<`}Pl9QOhG4jX)CU!=5RNj1(}Vm1TE(EO8Zqf9KJ5*9e-F9m;%}GUFzrf##R|N2ljtLI}prG*TB2dr4~ z*fAb1g^%THw@xj`dip4Hk{a~F=FJVi&^+rYx42K}rCE5LaW!IQT~g!TQ_SeC8#3!U zHxKj$A`uv8+3Oim#?Yc+xQhAi6N3-vpW?*ToP6Cw(#_f6Xj;-2P3sV6&#K+ zAWR>UE)BZY(X@8W=wq?BkcAJa06~W}0P;z*^GM3yiO^WqI|!7yKstRNH@1MI`6x=< z+p-2F$Git9rN1`3;+H_56m~Y5e^wF$I)KJbbugCIM+M}OJ8_3ig>%Pj%YPwXvI*>n zQS|o3;)O;3SwD}LDSyQ~QGlY^y&`YK6T0VfxPLrSP45mzvVpANCE!aCAXwipYa&N^ zE7dh-h5Re7tf+z`BdIRrvCNVCwe`{@S8dfme=|3q&B7oIVO92aBlw%PC3y=y`|`)q zHR%9uuD${%aaR1*`an1JcWsV#4D*F=whFm7Jg-jlPzClp_*<4jz}4Mz<-o_BuG8Lf z%z5X^S?x0Un7i&900qtmBbfl~0@{M+W5(#P$<<+z6hjMhWgQra`sE9#d2`nEK55mA za;(c)>E$gjAey>PgV^mgFae&Z)?|LfxdFeWQa@qzo>gV+{@NSx_oE7K8o9kJzV5n3 z`jXvVB$*3cn?2W7ZUM#ul)&b-N|O%oN@>HLwY$n!?K4xo9hHO_e?HkaFfh#wKw!ii zmGsuL?NA0n8?Thup}C?w7@P_6nPDk{dy{`-`&9Gyd*MV6H+#>7)iwEZ*sEK}ORcsy z$t!0`LIN#Q%hHQ)O7VYSBH~KVr#71Ck$__Qz#-FD&D}i2d))4M|F>P2o#;lT~WT+=t{e&nW^y0a4kzkGspnT*Bfjw{cYNi+H+nIG_~?*Fxh zPj*I5kxc>nsbX{yB4u3eX=dCYSo%190>$uAfYt-(uWLO--%x=Dro?N($aOep6S<@* zK^$r$`K096e3;(5+IXl5fzMWtyJ(#jnjVX=| zTi6ur||OFYaEq0bx+{HJ>R*XrOO%L6?R*3-rc zTjSlF*FJat;GurVot8}fqGt|Tm$*iFa4*sLxqISg-$Y1Ee(TzPeJFc?bcJiUM2w1_ z^0AWZjZ^~(zpU^N_d@yXwP_n;RTxIZBZ3fC5ks9^&z$%C&Gpx{v}sLOZ-}%->@co# za&=}j(z~nq^-H}+8t_8JLb*|5;o?zZdUq&*Jv~f@LV>NCF=$;(ov+5$s($b)j8!`5 z$AoZlQ!(^;EhhkBJf8AT^DJ2Y1#(Vbt}qT7TdOD!%ZRIER?+^QBi>GEBMY!cMbGH% z$LyMynNy5n&#=8-+bog~%A)KET)QelMC=~^8p&EIE+b)*voIERP@~Qzu;JOKgQxDm z%jc1TX8a!Lk%dfbc@w;K7FE0R&1I&^% zZ1GU_e&m9=;Swnnqqfc*N+;^}&5$7uuB!`x>rltj z9C0AjH@7*tENz9d?|$0B&;6C(h;b=6QivopYaY76cnS0KXSZM27N0Zelnq|{KsAgA zw;Eo#Fw(mw= zu_W6G<@_V-h^3_${?BGW1JSR07?^NnfOb6-kMDP$!8XP zW=AfwLV}0pWrcW}*i;S9?w8rQ-EU;O=iU= z*=xz6^QgD=v-8J zt6up+m6xg?jGj*lb%Gp$rh}fh^4!2MT~hXLNs&Nvd5>68>$wY7f?i~1z6Tc`TUr;0QLLOZNFEb;Mf9mUc(*@K1z%V>Qpl&C*&o!5jW%Mf4RpaXBm5Ad3h$N zHeO>)`NdiZ7p71s=FlZJa-uHB__%`zS)x<;xgw<f!P;1X^yKGqAI-Lv#eMxz>;{5k$u{PFidNPIg;<=XWCMegA|F4`sui9ay9?MM&p zehXByJ~VovvZU%lY5hx+(>ckx4HA@}0$XV*1LSUm<9vMRvgJ9K4<kD4dEk44lHK^$ zf@b#vkC17(N7jc{ZPPjB;s_jnejx<=3|w`Of@)y%pK&ZG-etGE9=8IsE8_*(YTRP- zIj1Sb!3pwm)9m)8*6^chn=&wfTI2|Y``^#oZ~x0Im~M3Q0c3>YY%ofX4b4@8PJOa` z!_)623|uNME^Fb-nk$No2*w>M8hKU;Qf83$wb6o`h@x-D<;J}Y?mHjTFYhz?#@pN~&qb|-{#;|$vyAZs3AkkW)ml5PGh{UKfD3yb%o{UlW9uRy@M ztKlxt$Mqxn>-koPtT&c--LWUgTTY<=SBdzYpJH@|?U4}!)43A3f^;vf=ybt$1oF&^ zK&)GC*OxkdJ~h?V^FRPV5}1t&W3<=2u`x|Dn^8P)$|Oof_BXQMDW+F86NZA+$KH*8i-gnS1yA)hSY<_Tu){VhSssh$(Eso-h zmxffT-ubX5Fq75nj}$roEsAI;=usEjDW##+uXLS4W-1sBjWL^i$9axNSKi$y+@lE) zNU5Tjk$a#dQ!A7wdzvA^DTRG@obirB$XmY?+ynU8IulI}H?SP1?&M%sH4zSP4rg30 zz;U3VsRYia9=@Xau8z|7g)anR2H6#$NgiFEs_lEg07WG2G<4%8L zF7FEeiZpqiTP$IlYiZO^4<=tfw&Ny$;O_PgG$L1?vr? z1axSr8MFGpj=hkqd$QYY|A0>kE%MS)gf$#FEXSVS`)>Tgam0D6Q2-oy0J{z>>S8A) z+%!($DZ5lNQ$xGn6(RXo+VcC+mG^S!N z>8BBhPX=>edyx1zxvDpq5w&RCAn3&V7Jil2yoTOuDI#`5op&eyRqPjb4k&9eLCA*p z$kQkF|62OUG{5!L&TExlukPfEVX_W2Hhe`D$%syqVhZ zwN#harxMT;Z{4q|zxxBLrL|kN1&o2eGYAG)I>_5W!pA$|Zx)NnUQ~Feg=H$J>hw!| zhp2_8a1i_QYRmv)))6nDQ4AMjm&=*z9``DKb~$iwY!Nu+OZ%AE$36yW zfNrw|w3ISOy;Kuu#%v5K{=l|KUnhSeCblLF0L58Rff@~Bvo(zsF+*x)Z!VG^8GRs! zAL;9w(DnF&w@#{p6)f1sKd>swB9f)}U~lX<#p@{Y8lc#K2{AR7sxqc5bl1+?F==HE zW~xwZvBew&7`v-YxUI}Qa{NRT8WMv+jStI#egqt7nZ!%pbqz#M!k96Vl=!})5>D9m zBH56C;B#eLX6xi3`y`%&v>am2k-e6-P}}m6-v>Ktd{hg4sMCiGg-`x9SvYDDfOm67 zPv|M|0PgeJ&?R@!nYX}4CZ!Td&Y|1(E`MNJ2O34-6w3HFyXrjtR2yru?ZJo!6lT{_u;p3*VY3?dIvO z6C>ypyb^R}4g`@Ok&oryZ_+REC}6sDyLS^0LnK)%?mX_f>9?>8PPfOfuiTt{1y&8Q z%?SsW2lLN%z8aR8FM6F7sqHSy>a-Zx$UN|OJP*^Nfwb@bsy)u|#W9-@z3=!8pZ+E} zWdh-GocPcKYV0<|Pps`uGACoYcc<*M68y3^xF1w_5UDjJi8K`s!k_zH5A8WDN2p6R z= z@J+Q%9{*R;uw|zWmY*FysKa-FYt~DTrEOYuFC+MT=J^B5^|?F`?R|1a2faQc!@lvT<(bQ4QNmEPjIZmr?q{NDfw^w~WkV)Sw6R04iAvA4RpQy!QGmi*9ld{_ zR5Ev^GUPkUyTv+eek%Nx%GA%lN~5h>e_{mul+v2B0Jz+2!~e@|M_`Wr4!z%!zaUDi z@qDK3TnaAqi>ZeXT5(Vwt~JhO(=q27iJOVIbmVEOP0$dJa3+B2M63AqAvQ+wIpX34 zXG|cTwW;WI^_z->2M2cgx?_O=Sg{&AILa1!SU9jv(uK=t*O%8s9Pa+kjo5!>H~1g_ zzJG6H;B=6V8t{at_5S5lYvPhKuAb?6`}pRf$`y&!tIA15n_G-KAn_a>c8(&ifDqN$ zgj2CTqwVqB-FU<#e?On2&tN~cal>9l1xK2nOiR9qzY?XXsdy-oBC+JUBZoS~Fzumn zY+Q~@@~p2_lT8j2!`!%@&baqvnNrjuH$HQ!Btzj1QQG2l|BeqH`W%k=NorTsSG#c4 zm1+v-`Ut*_1<@%B>7Y=XYR-Ckh^?ls_(Tp~c>GXx(1IRX|D0c5g{BVulxkyQcUC`CuI{*rm_)rcgAk}u;n#|{xkZA99IugY?8SL z+>EZ5{~T2>^oi3|AZjxkd^<2%s%OMF@b#dXi$8{~SUGIZsH54~)<7uJCBeKLJ` zwj-iy^S=y%0dSEzu@B8GhH}Xt8g{aSvu;JtKld^PnX2p%4)%LS1(oxzOLS1J&e?-l zvr|gePUY?ryPbPaA}!zw*B|^t@;M^hA#cw`Q(kk(szWsVhefkB3voZczVybC+^w~!%FHZF>@2W5SY#PX#F(74J@WDQR z-I}o2?c!!X)2VXg1kh+^#>A+gdS z28$;gg7plTrVHF7=g)(6L<#VV$@2sJTfZX9nY%dXR)3t`xq+VvS}syiy?Wbk_3+u+)mm7X*MZWxagM(w4Ap1%ltF% z;RD*hrvrxSvwpf;roM~q@AoA>AKv~zOQx-^j_|P&5y4E3vdsive*>)L{-)eQM?fRX zpsa##56g-WU(qjH7V6ZB1GPUefAcS+4QoRN&d${7weGvUZS+j}1ONUTh3@|u9=?#j z4p#clFKLAPQYOp({l2vJhM`Xx509X!oV;gxx?SJ&=wq}1o5%CIi9yvst;r2E;bUb~ z`?Yz8Ij9}ETpJ%tJ|=gWD*woxH5R{kV3iU3g#mERl+J}qf3T2uMF$VJ|D{TsqKQHB zm(jB!clwLAlV=(}s5RgZRxeYb2w_46fo?*ciD%7^6(PCQKVm_yl8)+eo!?B#1YAktkBZN?m>=gLm9~7?$Vouwgu+i)SkV$p%QzhPb%U)vNh@ zJfsgt31}aTVJoO7-zmk8IL?cZP%JJPF~fsL0^$c8J!)Gc=Zh|BnJ2@2@ZD~4U>)Bb z5D~W_YJ6@jo>FCv^{_Otse8j2z^HgB=5FkY;xvw80BFA8p`}x&$7IWI!f)`D``8*- z_9FHyl{(OiW8ygqoQ$m+LM8>lqi_00n}p+kE8uIRgRd{xG@aJgra@hpE4LRyeGQ`I zhrE4p$}g$D$*K$AxMC2cOrOiBqqrhSXC|aoR3sr0&r-f?EmaZDtoGBJ_}L->wpGK$ zKX(tm5Go?P&BZ;ra2~VLq+J{D;=|Gva^;uct4z2Iw}*vnz!RMLE22ye{JgQbtwg^u zf0Zng!h;hh_d$7=L&d=;XFwa+!@N|^4zVE9PpBlN8;*o|zB3t1^C8zLbgO0%>=pa+ z+2=I+#Kz8#oD_>M&pylCev41xRy!^C_kdfPz`vPmvl+Nk7?0b!7uXaISB%ttnP+u< zhZ5>7f4SxM>tN`b@Kf^uG%mWxOFT!?!V%($PhjHei+pJKo7FBb@Y|1qN8D#|v(UKq zb6G_CiF~SD4Bf50yBwP|w|?~a?qopUxn`hZ4sC+UHdMm8MUQwA@r-EUK2iCT;idxT zX1K%pgV};W=QE?s)iEZ`Uaw$lDHDZsZWk=4eX#CGK;+q*MMjEjh;Klo5ntM2wP^Lxb0dD@nyHFZm= zW>3w`vGD%hW21bkr3?I)>Lph z5nZ)=-u+-d(f^*$<`~jfpM;8<1C74|ZwVpdb0SEL@^f*S&&Shze93RZ`MYQ?PZQ`% z26UmeieRD!B15bViP+n6{EwDTG;~9%1gHEvdugZwz^G4*+KE|PvVI(XWJ9%d~2ZA+Vk`dQnNIC7@E4r)nM#u&Irj$SQ-`N@eMwEfWE0$8MBJs zv*c5q7RpWuxKvSAQ4;i|{MF@4kHXGS-zR{i?*F(w{pU7n)-%s>zA{-kitSx(R2v1@ zfBcFRI2$6Z<4M9qA!{CypM@;~uCh%wm0Res3vakL*Uj#nR(5pes%6T3-W26o}^6tOt5Qs%gSlZR>lPAPEq2gB0;kqss&C{U#{lrqq2)@KH=Pd$R46{$~^9hK|k z^peg!<=9gq*$&Z&V-#Je2QJxrr6%w%;R_!_Oj-$S`Il@m!}ubD&vPkJ?a)+Jk-0tf zZ4+!tL)S9otoncX==bD56;j}mWA1>ypZ9S7iJoITJr><(l^_!b-`inB|3t2tpI7RV z7cEQV%7;qhq=>r8WIgZ#0r_@rd)k~}Xa3S!8ct%jX=`TO^t3!&{{(@}c`5%vCm~?! z_s+}*61hhPOvPrAYYiMd=04lJmq$N{!8Ek*1GayUhexfC#`3sH>$>rtU zbh!drFcmsLxjpo0K4|MqA-E3ThUT}7okihlIw%D0Qe5A#Z9KcFycXKR(Ux^jWY%!# zH|*h8*!;RID}6<@9rwlhMAL?_3gz7(I%hg>;B>FJCzCi?ePlZF&rj?smIbPuV!95r zf$%reyu(e!i$*T})`sikd=>3O9@1AVUcP>m@9q83+gIJ}hkgr-yd)RjK9W;xU0m16? zA20Pf9dntMKHxPV&+pdt)v z>K@36s@DzxMy-K8)z3dLW!<*@hoB9-7>fvMeV-OGm_Oa$im2g<1PTUvsn2wesEcB? za1xQnrdGR)yCq4kv5OGVD^d~9u4)dm>uq)68@GQ}x%x5b=~I9&tY*S4gJ8F53e$qO z4VW@G-SX>Lmz=aN#BdO|IqAfi0O=2@YERWt+3x6oN+{o?39-yAiVs?vSN_Ek4y}GV z-nJ8+b7WnFsK=DakcX=4);j$3?)4QcvjLKJ#TPazP6{wTmVrvjx}7?k4op#dxnmT- z&pr}!Z!zeO`Rr3q%9Np6Ws8|ry_lsRyjzkeM_bCx1Tbr$NIIczf)AsK`Y% z3+@gWyrXKhfsjO0EiHwM=Lb1C&2LNIcoqG6BYQ!Tc*;HxfNpXYWPUi4tXyW4ZYxLR zT^(q3>lfCLlCo1=0wlgwJoTnLm~IxB!B0f1f6bRM-!Rq2wy-!%MItY zhqWjAOS3l^4}Z6ZHl)2c!nHygFvOR$K$22hBv+mczF5<_EjGqhXV6;vgkeTUjeZ?Q zUvxj9h&A18s^n%2Nnrg*E;hMS>70wMMdauu%hlM6!tDF`eR~Q!IX%gTS00jB)bf&~ z`y9kNO~ek%acN52;V|-hif8}*f{sB#qNaG7q?uLA1oBgM{gGo#*aU_hw>_Ua#qO@OgJ54!Oa{yb2mvi`Q=h;sOv*r6@J@fOWgKF20ipy>;LvyV zS(9Xk+Ow`%-r_sk*U&#SqRk9p^b`S?!E}E8k$hqt##hFH(N_FK8qe?0|0(Jbe*v!d z0G0TZD0)hB?dl?!WiFMc9=>eBL2YfXEj}=0bUuvS+CC!)N&g-7lh1aVIPafaO4$97 znj1STCRc6#vH*v#!!~vY1Lw@;>)m-P_TS3-8(q!=#3;tv z(t_e}S638gsB=Ci*@8$5-<&BjTMBA|l!(v3Guetn%cApUZtXqrE@he(inF za_p%;uxpXhDkqyTww2a<4@Vn}R~&NlTvyfBh4WI%%R?R2QWU03ty-en^>*3` zU4LNq6U+W*-~O_@u|M<~I+b?k=IiCUaslG;-ecrrrAe-=g9R2>pxmy}H!Bl5^0J^k z3}|KY|2(7(?ByA#&rwjXL*x1^lB}`i!;Z7Imh$1L0^7{5r#aLeYgscpUsP7to$_-@ zuD9&6k~(m1o6#ZOc28^)N>foo8CFMV9fRCeNHav9Gw|=#Y07u>luv%W23w+riM&8F zLKs;Ym#^H_$zR+&5fipX4}i$#VV*Ygiuo{^2`hg3ITrh(9lc3?S4MR)917l^T63mb zHhy-^(ect7(nAGAz6}-65jqhokbwdBryUD z-}%X+18rvOqwa@MipEY09REjw*@wPLx#DqhojR!&bw>Cxi(t56U<}Q3IlGCM$%x`tAV?dD^=`24#?*xPOY{dn6v3yt#c0nXFM zeT#bhfowHDerDa$MEz;_biu}?VOMD8K$aD+kENeIEedT-$wi@x`o2vm3FPqAxph8G zyWE$GScbB`_0_gtz2sOt)-EkA`S8gf7*>ioTN(D!pJlKhBW6npYh+^3e>Wt~z;5F9 z$nOQJ^5=?FsaMv+mxY1=*;qh{ke<<f>=iPH_a0m9cB_K%~D&NLh|Y9V!c#$Vs3&|jj8k*BX3jM_ZAT45Z+U9La3R^D(s+~XEt?uYK? z$Fylf#hCRo*zXuR6W7BcMK)!4K#th|LD0_WP~N20?NZRWp}r1ubBfrjJEANd4C1V( zhZhMBbG#S16NgJk=l!lsidV)T$Y|3Usdc*LURO_Iyf%7Oc5%1;B5e)w?uy8CICfOX zlgDr-j8Y~18nZ$p6%N>I0;UJ_YqMe27Ju_z8D~qHk-Cq7%R+~57Fd!g7KEb%^i{*` z6ZyJXs`ddl+9;ZxSBw+eBvmf`^CXGRV= z2`|uuwTLS!t7>@XeVy(kwDiLN;b1TA<*8+JmeXz~r_P~MHLr1!T&Mw>@99huYE8b{ z!1=Yu`DrG(>N_X$aK!?3?JNZkNP;={j}r4U^)cv~XNYn{Gdo{vk}#4^p8ZPyrjp>h z_SKDC3ZjrqQ!;PNhI^k|sfPAxldD!CDW;bJQrL^0Razd@rkzU5t#fWV@CX&rJ9hZQ%o`c5Rf@gKeS>mF~NM##a=yuTH%XoVt$)RXYSqpW-UV-KW?l#-`@1j z$mNw^_Z`qsH zFPa4BGa}tD|57AiYgiz=ZdZ;fS@5v2>25dX3>`QI=Q!>^t>C&gl#Hir47jZ(s|t7&>Ff@|bo-vK+MZdo6!e+njgc;a z+by4A15JzpyXfIpYWY}-bZ$scCL+{PB)zIK`e`ul4Yj}VECOT9d@l7DEoPJaWUrj~ ziFPhtG<50Bc*)f;*xm^hBSt@;sO35~`hG82q%JJR@1Ef3ow-v-K}0#G?jkXZq-hxg zBQ;QgU!zsHVgt)Xu-Rd3>dy=mIJP>yd1O``wIy`|d@=PO?O#+uqD)ZpP^&z5@6d;7 z_d%zSl$PJkj967#@<;+~yw~-^Hb^u)&{Mr)>-27ejHfzA77)Pav0phK_YXhB=Ok=i z489H47a>*m@Q3rRp9KH*aIgUtnfe+$$StmeD5H=1uAW_aNmGB;PqAcKI0(#kIEN7@ z$A&~(<7N~{8utY#F<2u&sgDx@4lIl_dz;&IbsFSX(n%A&e_*a%9caReh?`r;^cYn- zLFi8LlaSyJp!(iir*1IC&d1`p#s8;kHa^rU8WicS|6=XzablGdFC4MYq;KY zcR{8!TbzrlVTH?&R~?|NzrkV8l}cu6I5XyAHD_P0*yo)4_ygJQG#a$~KnQ&(ihMF7 z?#yV4G!olS75M!j{GU8L`9o`XhW+2kt3ccD=gzg_$9Gs_+oA2JeOjcD*?q8c&$ZtF z&UoJ{UFE~Uc~GVOSKQ2%*8?~Kbsi5MV5K%kZ}ku+z?@TcaJi}c!5G+{79ky!hEvC;TW%riln+&$iH1qfS_lpxgSf%Wrq}#q(}Q; zda4Uy)h81B&iMk9`xRx4nL27&L|TN!O;fXu1<+E$#kM3TUlId=iRIUj;8GK8U1GEM z@66p6jDy;_4U@~#q3`$PMrzQHg);wXYpX<|6W{_d!PAEJbaS=z3_CKKk1NLU`kcR) z`8$shTv)pKKqHL_g5(0Cp5bfb>b@if@;xSSX-y%b2#4tntdqT*K4)W^Lg_ zDO+^u>Ve*^)rChY4PCu7b$IXLJR~A>~NIy#jNR_A8>=A}MRV7n;L_|3yH^XUxwa4hkU3 z6_|IYpIt+Tk}3#Y8QUO;(2`sSQ{g`}|2`opZ_fI#{%rr*Nli=ed1=BO@T;zUvhwIn zyIA-<_20)V`YIrP&&&YmyJ7@XpSC9@iQtZ=CLZ#b7PR{h;NsEDxW71qKHPwCsbtVC z9mGSw<-mVK23OFbR0P=@etTMobdLH9jQbWdV2L_f!w*INKKlYu0seb&CLTO{)ew00 z1o^?a`PDQ}04`4qWWax({QGteAGDp=s})Vt0G;JdFt`^{PJG(n^Q{nmu$c3OY;*aa z$*fwfRs+;HQf*Gk_?u#BPB4;Zq&>6x{2PdAXR1XUu!q+;&zYZ` zm|G+BVt56LCtJ1W6JQf5Un*+LYs|1ir@QKlDxK%SZ10Gl@mIyK%-m@wf7P}i9V2_w zp*lY+#G#;u1sj63rG<7`h5f2~X)@|&IpB;&xqELnh4bde#%|ZlSH>1!+7a01(xSGq z89lYLo0WVCFZgBP9Fz6azlg$fDEzkk7MUul+!aB07411%p6NQ8TqU^f^TU8rocv22 z1BvZ&CjS~z`gf)asMAcwCK@kgLTAG0V`N+(Qt_g{2S_<;lLesDuHDysvDLDwx>a0? zA4@n-`ZaEu|#`rUx?+cml8@cvyAa zkl}U>o5KTgwVLk;0^fJa%`!+=TOGJs%H_lnyic`-Ji~IHK4|$hLnrj@bbsJN$+Y>i#sPL~P^z zV@Gq+E{NGgXTV`Q=e%LpleZ zvdCYojm))1;Ds=56FTlbj#7h+eZPhq^6YIPf3{xNdt5hFi^^PxE(%|I28&_|30Tnh zA6mCcqVdZ!GWN=HaNU78wS(Nde_%h6MTCvbu(C)-ZF3F#^8(I?%fIe}a{MpVzX2D% zDhbDv<{Y22?KwWJ2=I@NJ;1<2M(<7GNq%`#&`@ih3-WN@lo3;wD}HFEYBmUMhgy7e z63Ym(wubR|h1I#gd*QkIPAU&jGgAqU)5GI3p57hLxHispLHOVH##2q+%*pcIDa*YU znQ?Xz$aejtbFhIsk+)O6W-Xn2{2=Sd4=)#tSR%Ms4F<&>#n+$q6Ze^U;;d|E-a0W{ z51@nj>w0e3P(2Orh&3;Z_-=`u<&SbM$_uN%4BL_|OvJyPbC<&>@4VEik9g28B06JW znEyrn-7Sh&#jkEg5qqf<{$scI-`lSStde~z@%lJhvfHQcN-l1Tf}~FY5|JVC<1cP4 zhr?==W2aJhp%oigN_5k?$8Tubj=c@=kLx0cnhlgymR0U3+4L`0=a!$`EfTX^2@i46 zcfSzR){qW3B0%+d%<}OdMq<+Dyy(a&_A6OR)cABrr z<-&Hn>d8N_hYIo;b#SfzT-TiAx!bFTj(HYv-sf2lsc>XhlrbIE)niAD6VzKeDsd=4 z+~$a!9)mBD$U5){x@b|O|1PmO^L;7ulxV-ZK7w$5JHPZD1@AP&PP?Zpm-GFBTC>Z1 zqS_;+Yky#;(ky2}4mW{*+lDItp`Omy|LEobuI1c@DlsD5)G>JwQB!6jw@QxCNhP-JhcL!o14#fUH}|x0b7E+_xw26YE4dSCQ7q8(i?hH& zH@`UGyjb?J8=5@SQR2c~KEPx@f#7krAkcO7qh46S>!}~fX+PIR5wF9cW{zx;TH2gY z27$_uwP>i}I+N(iY{j~WMRD;f3{&XmNDD=99Row)gd@xxw|&{D|hGhnrEbso1b2WudS4S$sAcJzcD;Dru@?W#(K;Z1HtbB!hNQ% zmbfqV-oowXqvAF8TuG)S4%}h4Is=Dk7`4H%g0-irFvl(AWz21ApEI`)@Y#&uW!!tO zLu;gLx$J+rS3HI0BWv#PgcRtiT(r{L246-K!m)oVA4b$LHI;_^_W9Dt8*@4lI%uuZ z_+6&ZjYrhBr+u!UhX)x{;C=?$W<$0nHr@`Bhabsi^nM)x5xUq2PhV> z>}Hd(a})H-yVVR4%*_u(TH?`O!m}IKJ{nxUpiFH7m*SBrN><2gIA^>9cFNF|XnT47 z{rD+O2Iv<_?BRl+n15$3J>=O4${hvJ|^iL8s{wp)2^*) zy^OhG&)=k0=nNxj6=}*3kA2HFFRP_w9^nwFJ||e&cwvrh`B9R^XPZ&;L=rm9(AXvtqw0Q8vI$UI*;?ciHL#$LWy-28E$d(BP_Jk>ZxH!zzj)1w zZUc5kMO8~E4rS#}aS7VZQ&qw2yty+dHYPK#^xh44<4X4}_$%WwjW6uE0=CM4S0$P5)_Z@woWM^gq)UZ=t9a!ucbkPDAqe)<&^ zobPFJuPCC`UlR9wq|w!qMVIfj3ca9ZWJN$ozzH3fw+1?sOt^limVwNTF_L3=XWJ_|*PinIj;C>Vs!7umzBvvIA)`HgG;saCC#nZF zWa9>MXREJII5%T4xlvCI$E38}-=)G9C#!FsEAh;nanH;eZB6LzuKoVog3aiB(3e{l zZ*l5#Mf~MNrfD}&^Kb|uPTR7JwCqG6qCHM;jh*5_7)0KETz*SnD12G8R{V>dM}$|F zO@iYDCV<5!LNB_J>sqsQIBa$%ewUHeS36NtcMm^eEM6QKW5t4DX50KJgsdp6j-C05 z&Kqg@GP3eU>GF_?UV=vXr^50494Dhr&TQmM2A7{gBf>;+*3Zj(>yTB7ZTV2-r*S2_ zu!}wBALzFxQQW*#Y!K{u;i$2F154Q<;%pQ3ccYQfdX%HfmU7Yik7>%XXE-g~Z(Q+b z=PkD77S=p-0IDQr=EhgE3lf#L1D~!?Wjjf8O@<_FigU5v9V9la%iZYM>ySdOUlUGb zET48!w@$H@_WLyyZ)_GicSBx|~7U<>9)kC<8JI@wB|CB!2H=gF{c^P z2Ocv~Y;TYJ@V;$+<_WL!<;1VLlNv`PL;C#LF zDdM$4rY8Pa4@dS%)t4`@I1qeHf4_Yt_jYW}{5N_9?wu76Zg`(l!K2+dwZequ-q!vf z4sX}e9=~d~W}D-FU$`VKSN~zuQd;w^JA=BtUWMY>vqR8j8pK`Lj4vX!t|7{KdqhM` z!;F7Xvl|;`D~r1BJQegV=XPjfpr8Sv=o2TW9;l)U80^g%h4}`>675?L_11#jCg$H% z`U)P1c6LNDXes_EP_F28_0g1flpj+s4DNV*ryM_asqKR7=?)skxqHRErQK)f&}(u+ zT7~gei|tT_VcalPg@5A>3IUKfJpcbE(qdTHK}4*R%^}xuwxTS^z3tpxkn2ogXe^J+ z?#xf}F^|yJ*e+#xmmXUh8jsCv`#F{5j@t$(6h^v=_r}ARALZpFeUsiGb6nc0QbSXqC7>7N1X*g>95b3e9WIM z#kIVBi%RGed!ZKcLBxRMn%s5_K#jI->8{xF-VtLZdq;L~Pf=?`pB_C7L1Eee*cp1s zn=L~}?2LeTms{Unb!%C$t(o)n95%Y=mmk%sJxq4Xp9wGT4??C+EQPY+4U>=M9}=}_ z=M>l`0sa(*4)@i_=hiX3`q4?-GJuP4(D56Z636O`z9|jqC4xN6Ev_M^@9Z-TbvJ!6 z@RpHCM;+QLv%sOF+v5AE0ywe{K2*n&+L_Wo8%b<9;%J-&vr}e1=Q{4#bU~WdQL(oWXcW>{6m2BX$Z{HL7u6qfEgBJV zW3`0eiSI?#oOvg;x6%p{9^!^3e~$s+_V?l|c$ zkYt0p!brsrm8OMDy-N$t&-_~0o|}U_NpRmp*!GH5fwH(Hvf;z$Q+m<7X6-8-KH2S= z2Ew2MB(kp=`N}*w>-`P>9>R}5fM(1*-Mj+Dg=LPT>B zn4_t-k@f&@>GT+=Tp!G7pScL^i`6)xxjuFvT+7OTKxQgn$~-9Gvg7sEu&|rzxURa( z8iCp%^f8iLF&2m)LI1!Kv2&J(^}_w;qnhB2s0YC<@GIL`qCCLmY+oSfkB|j}E5DAA z12AMdf)1_#=)f*P!WY~#)g(Y3{)qsV9)JmA;EenOTg(iGHp2i-zBQJ7m6oJ|*ysMs z2tQ(t05P@0Cy*2%afE4%0Zd~AU>bIRF^3L905reX1kenp*b4H%IltJp?jb|m3RIJE z5BjwImxr=z9tGd@OjSpY%AH4UB_r1mY?71s_f+Jn<>QFNgnytIrk=AEQ+TKwTwFsU z(j!m;J7VVa0JyHq=b+O?V9W|Vd+Y!1sBVAJfO{Pb0ION(EI>M3&Y%xq#@YmfY90Vz zbsco~?Vt^-ok`gWTt*k@ld11lVz+bdkuo0?hj96J2AMC|)B8%`yrg24UcLMS(`ML$ zmK^MM8eS1aY>_1d$XV@e)T$L5BKb09EuhHy!kxy5(~lEpWRr<@NTaW@-yQHJNbn=I&0ZgXGtLc`=Xw=a5DH z;*luWSCR{6fT~th$jxnc?8{htMbq@*d3vQSzU^gQ{G-QYCKE50?s=mKjrrx%!z;@&!tch-x?gL4hX<=vGuPYoA zLOQfA;`57(WVtfrk<$~GzMJm%8E1adesGZkT&`1huoD29mio`2M;2mE%(r*?|IPW#X8f#DACq?p95|L!TP{^I z?~wmOOPON>Ojb|xs%4JJd6BQE9rh3yqyyAv@>sUkV?86x9+F3D6e3P0bz0H9xcFdv z?=Mvav|1pR5xPvp)56}iOB?LGBd+A9CJM2XJX0D(WiO9+?*9+E`w^_MFC7%XEG z`NUAKTahRL=4Fikx>Q=>Z+9?t8OtZ}HCdc0Eh%pXfVUK4^DAsM7XMcEX#PC|mAFBm z5~ROmW}sVMs(+Yb1hd|KxY7og2bh#9QNlgvowJct-w*y@V`m-@_1pIS(J0E6tdXTC zYC=S^jufNpk?bX88ItVlSBouMC=)_u-`5#iC|R=aCVR-f@53xTr+)W+-Pip*&mY%c z<`1uz8LxBB?{R#N&++~wO(kPE0*sVVSrWd#{Z96h!S>T zA1RQM}Q(4HdRD;WkA7VXEFFIri<5?Qx0k@xsqeTw1Z0n$tF2jtBt zDHoz9mvnQ{bPccbLqz;$V}W>ECDGhhV<2l2>Z^mCa(U{iAYM09-()(frXcwKX(}09 zGix~uk{y@6s}w~x12^j6FtYlL`tu#d%>HCenAN;L2a#Q13OosZUn=EaJ9M#uG@sTiiw&cNYk~3oBo8=_h{hXh@9&4i(y?bs@ zd>vaolLsrzlU+v4QS6K6(?FZSIpQt*??*-6IzETio>woJ_~vc@&N zb~~J(WcZxWGZ`U3q^Uo69H(VIJa$U8YuwkjdBXuP$)vJknP17puBVMamk_z{FXvlV zRmGou!73&g`84OFRgB*yhks&fQE+Zdi4<@foS_x!pmuvCHcw$-Nv~#2qrW0P^HAK)kmVTE* zdSb-U-j!rX=geQTg^8E8Y#YL7%2l}+p2H+xgP(^MI|4sIXSR6KXrFwMLzuFKGhN@` z2(RM<1d`-_ssUSXazSm?OXFqn)|zF;{~SFZ|6tJDIRtymjcpf{%m6?Jt@R zOiufDAF~RdeElm0lYI5%iYZNi>l)nxKA~$^vO`u5zj1ygBA)%V)xAq<5o)G6UOqL) zj_;&H1V8J^d?B5I-?3VKzxuU9oh~n%Io|KM@k045-8-}AHOCaos1{xCznmYuKRoe5 z%1rNGNsnsD`3j;|u1`)2+rX=wc8(KgEjdj^*-WS{@oe4pRrLS~Hn+P{!%Lm0`gF?}hwe-o&VVL3O0Px_uouYF@di5H{d*^f6) z4qM-wI*)tN+vK{Ub*s!UwByU=bD}K7Pxn5AyXMwnoKGGRfC3b>7M}19s+7eE7o4E1 z%!L1V?RO{WE((VlEb={GXzrQ#4QGr!P{Qa*woVoNNs)ge zY2x)Q3HxiZAEK3?JYcZ1W#vqk&|dv^S`I^<>|)x19V6F$tIE0JdYo%q@ z&$XNrv~j=sgQhPFmPaj7ewcdEQh#Jj73%d4tvi#fVo5Best5_gfV?Pz`i_Xk%KBcA6x}-oQ7qN2u=vtelz4Ct;=%3proc}w=?m=cQR8Z#s74mY zw5QO<0g#LsLDg;S;ar2_xoG|;I9cUHPfCQSMg)QFz+g4{lb!L=!lANUT9I=?m(Q7U zDCT(=@5xAgQu$vykUWSt>nS8{w< z#ywKm5m@Yet+vSEjW3qEc1I)33bx+G>VPLyJUhfL~~PY+TsQvueHwPgZ`mb z@F=u#0GoGX5Yry`X!tib>0UYQs)Z3NpXn9(0rj;L1P{IV3w7PD)s?!`_IvEkKklJa zs3T$9d4&Y6yLgK7I4^#C*>4Ul@bo3+D3$*u^n(yZ<}b0W+9wU0#YkHfu`LjBX5AL< zzt}r`01d4atV~rrZ{of9Mz&~==B3WUfk9H5(!)Ln5r@x07vyXWq=fJ%j%qr2IJ$$d zhI8@A8t$OOn&ouMB$-`7ZSi)R-IBl7v@7n%c_F<2)q}wZR-I#yJY8-^=}@{gxwTA2 zSBZCqKgKFn7bmE$5579c+)cGjK-Qc_n4O1>j1$Ctg&i+EP9Tbl1nOe z&e(!iC(a9G&`l%rkEhv%X5%sv+&)iK4C9rLo{H`}x{)$i(4%x3f2bDi9IdPDmE149 zfAonUPW6pt24{G`H^x~3&I7^nn$~B74hna3ZHJxvJ!ptVSZ%qdoHYJdKR6GT&3~lt zkp7;)8-Zv`pRaNYj}dM5G0_hx+4*+qn2Ibgii;+??it9c1m?Gq_dnupxgWfdI3y>3 z^7ypCu@`M_Zf77Zt!vqqjCS?V@D@MK8t2U(m3h;dA@ZFinyvY28pJ*yCPw_q=$(x9 z`mF}`Te4Df#lNzJ`b=xnEi`lZpY5H3R=Lwez#!>m0<0#})>|vmO7=0v+RBRf2llvJ zZO_mBc|x6OqVJ8~jA@PHLARSrHW{t=Da5DQ2R&r$G#%x#ya>bVOd+{v6y5{5VAL(Y}UDwk)lT^O|++?K(^BTp0tMx8cLX5#zs;Uk+dE zd$2U39Yq=&!p?}F_2P*z(cOJnAIb5$mRs=}+dxBXiKekI{+c zsNJk14`{xDSRs$8rJqCR`vW3dr8%z*Ww+A1i$0rMJmgCN7(Wbl9d@^y>K>MRUb04F zNvG1W$hdw>&5!K{@bo^e6yt#!>L=9Kr#6Qh7g1Mu{JZ$p&Lfp`I4H-20c`8CP3ii( zwDK_A0ik9GpB495f|>B-7%0oA3SweEaUl;An&zM^(Y$=I)Xmiuiwf=4Hcsb#E)cFd zTcF5GP@W-y6O?o&W#R=hoxk17!x&IF^1baMM=@ZG0{yJNJHm zK&HjI=^F!?47|^{d})#&VZt1;y*tc&ppr5eMNrC12OqV=ra{`WswG$BHALGAtim4| zjTFy#-Y}I<;Hhb2+zZFkfJJ@w{A!?J_W=x^Mrj$aVVt}S{kXSym>F{BFf*hY$+Q3* zN$mgXWa+rX+=T*!kEFbo+L!b(bj&+vlJuC|evQ3hy(`kJh8fk~+!y(`nNMBceS>>p zP*EA(j`t8%M299~Ty_)y&|yViUh4CBSml?Sh19YgQ`9H3N8@zn&aoe*A8!E8_D?L^h}#`Kz@F+b6z#3su2=BZ6+x*gSh0tTA((@KY@XC6uv3_ZmW zJ#f^%g?uO zJsG_+d+6~&PW|%swDQ0DkD&GMW}gm10CJ}5I}k>k^a?3`l7CgP5nnI9@$T*8&{A^t zr9ZIi!j$2S7{5O-8e?gQ{A`dFEIR1s|JCq7(*;NU!!fu&;6`s)uvJ=)}hKc9;<0vB50krGKqMxyS3zy@Ea z?$OO7m-E=lQ4fO)6}avyZn@82U$VTlUWu)f?JRX8rx(b++iG2j9Md+O)c*BAZ!fWO z#f%5kJRmfTRadQ@OAZv1%A&fj)8rGbI0D2iTO zbl>L9_AT8#&;ajr9<>lnoPthKwhU_gPJF90VNg_h!U^@=-q<7qaj_QUDA-eky0_0T z=;`Bd(Y4DO`_aIFbtBH{tARG@0#^iB&*cl0GD%-im}l2zULtmVpd2@@LI!SY(uia% z6x~4h-Q3?@1s<{S=#maX0v>o^mdEAlz~RfXt-59N!9;2AE|X)YF0|1HP9&{$M>qJy znXh-2O1$&*(sTIg+4K(Z_b?SoNBHgv!$pxn6lNppnE7H5@jm7wFq%RN=`eBkzJ|%1 zUN&}2!pVAFxn#M?=KXKM1UbsHM51H9R!SJv6G4vJXImGRy?kW1=RC9q9$*p=m5tW! z9io|^+c9jU6}xor&$iistAaN4_o+!=Ha_s#5B&G0-9JA+Ru-4ln3Wq8Y1PIwar$Ew z0IzkF0I!$Uo<#<`&i@7^wKvLVA>zUn`^t5;JQ~@@l~W9IJnTFwGdI8k1LH|Xy2VRvhm|nnnBDDCRZCDgI7?eZ8hAw4qIUH6wd0Zp>ljJcEbuwik*y%BltE`Bj<- zwZ1Yr>XN?8Q&^mqvT8-k>g~nbJMszD|I<0JwGw8hOv1Re8I69lc;vV3K3W>Q4r^Z{ zTu|C`E6Ay2q618{8-?0x0suX~3PXwSjx7B|k= z*8KJQXUBe%zjZjz8HQx&>clAQjlmgTt?sYP?4b^PiMS_q%V5m?tZePj|vmVAkn9z+s< z>(E%JSlLo8cJC|~Bxc``%-#DXg45r%9igua$@hjKI^}IJI4N*&&7T8HZ-0O z1Xsv&!8VDQAOSF8O8U=+1eA>y=qn!ci$Uww`WFTYGev_5*#tlD!KTb-5f z2B9w&rpAb!{HgV*-^BN8maAKv+i)v)hQDs4LQW~m_k=Uv!MiVPho6nlc?=s2P{;3# zg?H0jaJW28n0vp%f75Mp$oN;@L$BtpaBISTB<##?ULkB@oTIN$Dy7UW!PTR1N_~V| zLWK24j(#-Pn@au7J#TuJCG&uBuI?0lO23FBi>4#W6T&9yORVxRl57tAAW1dHRq&2I zeM&p1WU=_06uDndWTsuW%<(DvPu%fKg=HT|c{CTt`6D&mdkFTLY=TksDMQA$uC_j| zc&*M6Z`PXg;*+(~2jL&^2rP3x`j|J0rHinG?|+HnZf_$c2A#<*P}QESyJm0%gr$OxqW*^T53hZxjHEi)H*KMZ$rH) zZco-MFD{oMmi)d!KEuO^PDU%RH06ExrXRW#)K1d%6rC^%a}8e`(=0WS-f)b(?6|b1 zXF{-1D(kN+%P&*7#!UtbaQ2bry;2w#EAjDT&z`w-0kP|=IpJ9=kB6QKLP5Z!w9nCT zMJql_t4BTa(ybHwqThl}8(v$Lp@?4Z9F&rg(qx+aZE()6jBeJgLeqHV(^fpoo^IEr zT&q*u5ozM^CG%{|Nk#Z&IB+XrT2H`*AOuNlJu)!MlS$*tm%dNQvxuSe7xz2oH9SQ1 z&o1V^qp|(<`}diIZG;~Us;qCeZw17`I%H6*JMolUeg^+W|M4M3(k_8L>a$nfknFvP z;H0Rl%W(_rB%9O2$DCvF{oTg`fi`lKO;2|~l6c4*2`#d64d#`BC|PlqyB=An^26VQ};in=zp1`c^Wp1N7S9= z|GgtL)X<@ko>pH9#$nfYlg?_Qj2=I?GA~j(_87CS_nguv;>v!_;J`7kCL-<8;RP=I z#`T_V0P?IU{uO_sL3QaATI#B)5g&C3MVBz4aBGBvSV z9^40G%4fwSwe>JHfkfliJzeV)s=LjgzqvFxlZ;Kb=OnUc+PEYqYb@@QB1~f>-@whA=6vFcGo0>D~VA>M-1d*3t|RQ@h`&lePG^6H3cT*xAld5TMub2-_q z*V2i6H16+jQaU&KA(sYk!HFHbS~T=_+Y5P;gYtkR@dvg$BMY>p6+I;$GqzU8!-5{P zjpULKfX5Cse%%4EKag^G_}4}@;1tjYKqE3;JE>qiKC!t!3Eo1v5m*bb|Hr7mY%U+W zhOVN1u+ydfu6Vx-wJR2$vPNhcfR^GSQ~$t}qqF|8>Z^W1iLnsobm>M-hD=Zg@1dWd z@Tb)PH8vlw$cE&2-9jh_B}@er{<)(Q#zvw`xmo-VjI2%|jpvY)X7i_9+=tVbyvOXz zC2ZCuEVpyn$APUo)hX<|u@SV^;!q+z`!xZko)W^#jD3i(S+{Jz1 zleTHz0ei4a1nN5z2PZ#z`ZVC@WXr>>g02oSTo@2(?(mWZkoLNUrg)Ja>`IglIM=eP+vt|ICNyd!zRf%WpL69QT#_ zY%Vf7&W~44vfnsD`*v0Ry34yjCdj~P%IP5@16Ys`Hz$Q-PrthPcPSYzoJYn;7*I*w z1I}VWVZk@B-?64UYfjurtkoH+KhLrSr)>gl>WIr3B)XQPHFlq&|e!U>r56u0rVS40TqQrk*yg+uZaL6+e)HuxsP9D-y#O?pxMTOgl3+%`rs|#7-pcsw? zmRG^a@vIIml+D7y0NF(Zlgfs9V*coDt6I0@blUboj?kITmw2Aj(C}T;*%IFvK2LEIC3#=N_)@JG^OE}PxrAg7vtuzyL7WX+hAg6=5%JHi4Zx; zHx+-tze{W`$_c_Z@&b2NR15d_Ds`x>raGwRt+(XMnGhdQ6Y?iB_SjUrVYZM`P*mdr zcp7z{b&S1FHcb8vs_~W{dC^_`A8y!)@mP01w(0I?$LdEoy@9jZlf0R0(k{bQcVekd zY5zA>odznAM-^lSZ^yd*mg;DaEHWNB`(69$(<}vr+sjl6x#pF~lhYKI30kj-MQO9; zE^WD1ZiuJ$iSQ9Wy7~?$cd2}L{eG#rGwrC=70@%qJ-tZGk+oTqzUy;e{c!JJXUy2- zfpH7k%ZaV=OR7V(#`B)$Pc$#hIo!w}pvMT;DqD5;s&dOSh;!MV861KqD}P@b8)|mg z{mA6~xq^vp0i8qW9X;E-bK9|u-1XT$Fis+Gjzz%HdSa7pMhnJs)f88lTTK$fYO;y0 zI5gE>#S=^47O=#~ff$93D(~m?xyKWH??A5K%{)Vf{skI03TC2~4^u1M^PxvttT zRwk;vZO;1iirmhHGC&$IU!P5x;`RiZmgrf>UHnsAOa27$$MhS&D&AiMARZ6e15T*Q z_1&r;!`Ou5rzSb<$Cb3GKf23IVu}~OvGw9PrV^J#kj=F$$y1ATmbeY87^5Rhh_=(z zDZ8X9*otu8abK57VVX5x?NqVi+Aw6?VwS%k;ra(u!APf{$h!$b%fgeP_e zH-OfqQUJ+n6K+XykGn;2pg9D-7+7DPZYGy<|AB#d$yonR4MHWjb3h8AE=-haXpKLx z+A@5wp7;l5OR7E7y(40xAW9EC#(@p@7)t?i_W-1^ZWF8}=|$;s^u9Sbv_$W+VhuNR8G zlvjm-)!S3Kg|iGW{lxFa3>_cXUFH)Ua7FYt>4pUaEqnCCnd%Fgt?k&}ltd1)V(E&M ziUSh;u5CACwN>CSo1YksDL_~_TZMj$jm|&!+9Uw!ai;fuPt>P}c}gS(=UUoz*#$0! zcPSx~5$sb3jVV8>L%ddkqEm94(yy4DVOeVQ05D|Do9cZ#w(Jad>IXO39P8!Y8>rCW z>6xVN66fhk1Y5eevO}FQUK!5_mIR0|+Hx_lt&@=WDQ2R2BFZ3f# zk7*+aTVZTOm<*ZK=DJ=dDq>j76#b5Cn-unZyR^lC~ zRAQa#b)9Fl=v%QwE-R<*pQr$#Ru4f+q0N6k@M)p5RL`l8Fi~^O75dUlqW8b-yQ&+m zGLg!0$BrY{Dq2CjF&irt07|f&uOq$uqBn(*_v@E_G>Mv&sBE4_?FxmTJ@jx2TQ{R? z&T}L0M!x&|OpTr<5V(SaW_k0ia_=xoIQ-Ah F{{gL7JrDo@ delta 147698 zcmY(qWk3|&`#-#dprmw%v?3uAk_#d&0tOu_BC!Heg4Cdtw6xM7NG~8ucb9a@l1n$c zNGz}{&v^g7&x`+yvoDxocjnAF*Y&B18lxQeN%?h!kQ7s~=4>wTqz*GwClhDi$FC_IUzo}(amDbsJSvme|-Pl&$~ReVL7h(q%cA%#j`BxNSr)I zu&bH*Ps)c%=*%>8P1;$-%80P7Gb;RqO^?$nxf`jT`g5n5F=<$@Wx_El<6NPK9+OO* zWwb#VaDy1FS*C?P1v-EmUe?xI^-?WJx>%P7e{F^f-VQ-23|qcP8vCl`%-L6JVm^Me zTaP(Vk80i`#1HhOkZg39%GaDkD@UexT>I2(n8DP zk?7;`5dup;cu!GF*s<(7EBr^E8oND(x4@4zoi`VrGT(1{0HROUUZu~`98PCV@n1oL z5RU36K7D)ZIuQYkp4AOW)DH+gHLCY>5kE-iyj4#E^n0-(p zI1U!J@R379O^o;c%Qu)bH)T!}IR9l$8#Pwj8Y2yt@=4Vc=hx)AwB6{p!iCYnC(N4>pgBp;6kKNzJb#)OrWtWCPlETu61eQlUJkTGBH!Y9_& zb7~qOORi{mpoyXGjCXYL@Jg{MZ5pgXoJu?{y!Ba&#mJ2#tNHVEHL`TZwW_0gD=NtHaCeRh5N!=d)= zrz(&~G>vgb^UZ3I)E_96sXd|}TgO+w@THekDd{`m=8#&?a z9O$mdx9FF$;Aw{TpGcO8H|OgNxM36fhgO;B!O(*&GV#rOTdwvp2G}3^CKUa@*czt3 zivhp#SFi6?X>CgrjOV?Vlg?X)(qfektS+EoB&GMCocx`2xT$LIVDRk@bBf0`_0igT z+K(qvTS(8qBgH%GiQF+Wb^DYF-*RJm%3U-1`ytiava+u|N=Zn>+G|J2reY z_r-IyNBTuS2$Wk1lLE+A8y`l%R?5h%RJsN`EC2jvD*4K6`NZ#Gql4csKUmhJhaXgR ze6@K3{-e7334Eh)7qYFjODa%zNj7$2J`F_)O*-Zxq93Gih;|!aLSR0{=mQZGoKA!sHAZ=Qj;F;n#A!9g3ky~DC1N~AgHE89k@*}MIyL<~I25l$8z5IN3?2%K>D+7gV#MfON=}FbT(Xazv~Vn3K?=tZ zy7z!4H&6ZnYAhK~49*)of3*tA)+X@toGBzu#LOJ2qyFnP+pBT+AvuD~dWoK&q^8t? zPRDv@EWWCMPeHdg(v13-S?22k&+-#n9=H`&ShaC{Z|`NLh2oxUWo-o^i%9C^^-Gmr z#kQ;)zVfKiALJ1Y4N1+D2b!>f9&;w%oB}+(s{q%dfEa zKmS;j(~04JIRmwR8rr)Ifdw|)g)GFJ*R!tWgbP99k68o(B6*V$_m-QcrPYPD9PPqR zQPHa1iwo+^cl_E&%0pt8o5=Ahtc|8kIY*U~hx|mNPV{fCAgzRlb4=(f(Hf`_l&TfqVm9Y(;5j74bi=w;!GmsfK8x%m}j&un`asvZQ$ zLAE#H&+xR=3}uVxM^RT0^Wz89f4jKQab5`?Xh0wfm~TPgf9aDNskvr?fBbfY=Eq(^ zeDtgEajei9objSt+vAqw>E}TJw;fS&PMzK!7yB^2xFbcXrm4GR@BA)wDn_{HFWRY5 z<}J0y=a0R(8E7KJ!`ysoEE-zBs(G^9#+ z#M^v9>`&JDx=LeA4(rSqPCmyjkkvBY#1CW}p;Qe13{)JKk_ zI^#?i)2H3GSCD2Nb719&U~-I>p0*Pr%Qt;TL4Mh1@$3e++wSXegwC&Mh++-&+hRes zKZlpM`eH$sXR%h=J}_~>S4)Z~9IQE{CvdvxQDPkbdFUiH%L~O}LiD8dE>IGSdC$O2 zi8QOM(L^^l`DHfn&XOAsH*bZf`4PZFdbGz8wYVmw_Nh@h$C_YkuCIipBc!)aVmPg0 z*Niv4AKOOG>G976E;2+Ft zK22Htaukocg52+mV>Fv>*r`d#HYBDsPvQ%CKol+S0pDr8g4}3ST*`|^@m%;9kjm7M zN#tJ!Z)O&r!VkkCYsY$&7PH%~JN_(n(Zf%ZN!F1sb*uK}oQV#L^GWB#nbX9#!hw~sATYbGCT?;}KGeM-UVhh1fa7MyiO|J6kU`J?;h z&{3w?;|H9_%2=fq!-RvTP*V_{}SIL4>rTpQkC{8a2c9HyeVsD>MujRVqul$SN_XF5ZrjxNHURJ8p{nhzD+Z2jV1-oaSUCuC3 zw0tTF%=SuEJ41-LTbae2xlFkUaz@DER`A4}0dm{I386iPQ}O&|VZ860B*~NHU% z?5Qv4%KEU<<9ilQ<$A+6+Y&=mZ};*9FvioIGXWHr)~e$k7h=C0J`}p#d^wO75*4a$ z$X-mXuTnzr3ald(_S3Q0&t2YT4%BPrSw|)T9boC6;5sQT%L$Ox#B?z?hqDjiFwBJ>BcsLhz8|1@s>Q0qrokipgF>Rbmv_!c#tnT1 zKsxA#rf+UVymAHBs?&LqN`7uM=6FehaRacD^LRJq;{p|Ii@RI?4juE9p95T-c!2376X%-Mi~+v5Un;Gi07MHVj2OvZbbd~nFIWW0Ix|RL zDRU$;^qOHqyK1IJ%}u?u$NRq%_3$C<1D;0)9(KEfZ8xty$(q!(ku?=?_W(DeTb z_hsnvP8s$B^VuwLQgZJe9hZ7SAFdFJvf4_99x}E}NdYI$&cNa;5Lwv0fNDcpioAw9 z>J^&R7D}B@;@*p73)qL9M1f_>mcz3XIWn7VC(zD#1xcQVoqBN=6Q*zAiJ#US4bo|k zzCJ`WNsskiZ(~Fk+3tKAw92A#evJ0L=|Hnx-?WMxDoN{caffI^cM??BVs-|6QnrM0 z0?7Uw$z(Z%9srBvJ@bd?K~^pL@E4;K3@*+~=|g8a83@N3j+&pk>m00xWAWST9!c!;n%n=38HQ})Zar4!MFgG@vr>M00zU0XXRt4zaHc}FwHASi_4vEsDvHiBtw7Zmkf@Cgz^0P$y|2F z@w;na%_lCd`70UN>CfK`Rte|8{4i=lUBg3pmt$mxwg2aT>m;5Ph!(3nDfQGIr@N?T z)V&YlHrHw>rr!#yya#{c;pc2IdH*yHwjM44%!R(j10S;})Ac%8r6Y5`cw1&-Ul-DWZNzUe(Jgr`W>{7{RI&Ott-t1IDqCXx_}uiLn{F?s!* z6`XRar?cI_tGeipE<>w7(@r0HWc^O!Gf((iA({KN&yL|G?2*xll#``Rdx)gz_iBob zfv~PSB!-+poRqGi%9FS|j~5u@_q@H<5N37aPw0X18&ujr{fw0^g5b}n@i}!E;tFz; zuh7Zn^WofH-LE=5Q7`HrV)@xDq!m&X@fFfM+ESx$qGBf`#BU`;epb9ap-*~yi3w)G zxug6&EcH>n&#i{S(2yYTc~z@mS+{rMKm-&f)7fCsGvEkEve_P8Jd$-6oa-K=#zK;B z#uLydD`N;=$F~x)0O89>@&S91{a4X;d{4{R!&!_uJ2|fx+GSCRZ>IDFX(e|&THI1i z9)!Cs==2)KO0i@~%FAihUTF5NF3ga#4rNB^ zWOpE=V^j3-9!a*{tU%1HB8%UPPo!f3GD2`!1)V~ygIYD_wy%(*1f!zUuqn+s5+l{Gtw-Fa^pN;+LLQ)CBZJMD(boPMxesQA<&X zP+K@&Nj6m9jVlCEJpVp02Jw*CFbizcwyjV!<;3Tn?(^)yg|d9R^2{^a{I-)Y{}8SB zEphs!W+t9^{t-ludUmP(NstHKTn<-nO0RP$^2MTD(|&1j&83o6UnTxB`}q~52lh-4 z4djO+vT{09$4kF#j+${h53@)TBwsU7nPSiRgV(a|IaYcK;!8Ex&E0NlrefYFY%2V5^aT;XzMMm-*eYs%(=n!nKsrE-D|ul=CzY{&U#I7M^`T}0?8 zs-c$a5P6oeg|ADfa@TKTXw;#n;WH?Eq(%miE(sBRQxcvkgRU|x%|B7Of+$Meutw0|G}+O8mU06nZ`=3=zxy@<8a zpWx>!+q$L|Xu)8_mck!NVO|;BNeWa>?_%$8vD95spYTqR&6>g!0jK$*DKt`!(s6AnW*sD4V4lo8 z3m2E|{<|3kACG$BMTHJXwdlH^1Nqz1JBo-OiB8uQzwmxlS*7XCB1af;yeeAsGBXH# zgrV#(H+h1$OfS}&9JaGnB+iH$y-Y2$R*wHA&27d$9OEdE+CH{`yak&VeKg_Nx^2o^ zTZX&gS%xF4*@dGf?m8ZbWco7ElvI@Omq<{rI=m(#ybkhXseUhtR5lLPjySp&wFV!r zwr$7R)32EqsLvpPq6Ak|eC##BWT1x-2Jq(eMn-4HhOijFq1iGI%3y3k<4Qf3wpKy} zUXN{_-t`|4EK5>r%+Arf_qfmIl&DsK1XcmAug9k%v7v@aN zIP6zsc~3`P=nJJVL7bMt9jd$-J@~b^NUYScY}^&3Yg)Kyo{&>s{CZ`LQUuGzD)8~p z@1FYS2+x%R`i0@Y=B5ZnaiXaQzIh2Nmm41hFGsg593ebKIl=l2%B_%>1UeuJHODqpvePTk7Sx8Lxc4OUc$ymp*CK6f~_N?H2W0ul$cI{aVu{7ynkzI)KrV3 z-r-qP8BZO**@rb2(luhLwDKyhPOVc$`S|^G8w!~hfQHBc1{YduV_D} zerOO}Xa$DnhgGI(ggbYonsn5$w@?XVzx$-Ki~NGu0-e9JDt6WhnFmw6r)T6QoYyej zLYz(=4YS%|%w~2BkrvAX40Ccr`NV7A1XjIT{10kh?h{3_uY^O69RA^h2G5$h5ZUan zj$W(!{T(BLZU5lG?Z(?aD8snFZF!G~4^q{1)2|?IVr2WtT~kh0l{ANq(RI(W<8lH$Bs$Kcw;W@6#fG_$^i1@=(8dXNYj**kBPGs;B~Qu9Ui@n(dT(l*B}ViF@>Qn2VaYxL-50l4y8qWP~K0Vc5&atZst0 zZd}Sn^SDVW$kQS1ZdObjsK34HQR<{Y*0Vz5ABwXZ3dgm8Pzu`VCyn*3Mh;dQ>;CyT zx~>^^dgm=y0KB?xnEj8Q4@&3zyJ?w|yERi8&F>yP;6ihgfwioF=toY`Rt?&r-r{HW zyVJKFhW;=U}zhEvvNZ0Nxrot(y$_0tOQ+x-Q=@s;JFZ2 z>U_a~d6I|PxarkA_;l`leOFwinarh!r77Jp*rBT|f^QLkTwH~j`!tJ0#f5U>hGJvI zAVr|778{5?v!bsT3dhx=VOurSJ}BYQ+$TNmN$(nV^A%6kaKu-TkK%qR`G6UA@|}}) z1x7dCuI9;y-2IC^LFle-0KpZ+raiM1By9TExo^5sKNQL$4F7)z)iaCo3CZ+#UYTk& zuxh&?xv0#&&&`**ClJP?iIDm;klxu7Z9aYqXk19Urul{ zx(!nO$gJw|@KM;gx3bQo@v7m|Uymg>gBp;`b`ea>$n(^EzqseY%#Ob201UT#D`hflBij^Q zEdxYFm8S32zL)dI)_l7+OWEaUpv=r@Nj@TZN#;n)#^@(uX^LE4)*5lkOpxbj{M#+N zQEEKydoOp(==DDGM#h?ccii0E!290(qQcm31rOLM+)KT~m)FTPO<~_xLio22AH3iS z%er9)2i0jgI_(jAXTYu0{B}=bp7J!2(!P=kw!9z=^Rxa#a20y~`*vsP0ysgw*XMJX9hkjn4Jh*HDO61Rn&Fs>Uv(%2UU(N8u zgJvm~fw^|E*AYz;V}ti%<{lR4O?-;Sj*y5Ym$VSxAqKYyX)>~fknI}7Fn`YUO{()yU{nCDvdC_JS`jjhZaQv8}O(~3o^I$?L8im5-9pfrZdt8<|vynX@H zG6O#y%nl@nHCKn;2Kc-=3s)ou%d|Dco^UgXU7~ALtjcYd5DayZ8 zdD7&>cU1|YWXLk5k;Z$dOY6=IvD(H_$=N?Z6=9D^SCOXY7oNY6yEnQo7o+WnTC`|Y zzRjC^7Y@qRd19THdK?$gky{0RuLEv@tHkB;6(raVmAk&Ma58Zsjg0Cv#xW`j{pT8B zfrqSO*uNN~Fh|S?8%mt(^w=_HSC84u4YrJRav7DPyvGK8MkjdqpRJ)Zzmh73#g0n) zX#q_(-e~A0h9?%J3u8dL2W39%P%zxy>tamnt?d_}6(xFa-$j|jh9Nl@8}n$|NY1d> z)=T3>h|OE8qGPTo2mODOOrZAi-v>C1Ek#D(P9dbt1ZcKDz-tU?Gndk3%`Z5gU)(E2 z3K8A!Ku#!ek2p$cKF>;5@=85;w1gVDC?=#HL+pI5xPpXx_Dq|)oV}Bpgblo!5&cRa zL4BGGyHuUF0wE^HGxjS;lzZQ?9+@Tow=0NV4Y}uAm);Zss&D6sJtHaOqsI@VN?8Y< zRm+C#6Mt6>gt#29!>9R|TChp;Fn=~Dl5{VdYObRLr8kd#NF>B?Bmr{B_zFV4z3lYTu#FVlr&g2fBti18Hv)q46nJ?Ps#Bh*OK^z})Jsg4& z2;^;-TijxU^AJtu^nA+ajjH9FB!Sca z)3Q1zd|#oO_`|Js>fLFHVnp_tfXlyW_{2<*z>}*1sd$B#lgHFPig!@c`13!cJIWju z3?N^(b-#jaD{w4pDUz#DSYJW761c`3Z@AhGv6z!l00sp3e?HHx>?fRR}|VX*mbO|VLSsw(r83-=J}P2l6iRo$0%JrHm6A_8y0+-q(6L)ic0e!l3cXB7zF;0PI<3h3fj5OR@rRWNrYdOR?pyxadokj-Wbd%SCGLl3WHmHZl?M!e zbfawKEs58p(O9-41iXb4;+IJh->-|1Eu30rKIl%p;q~eCdj&HW`cCB5!d(nCE?CTZ zq=c>XXBysSAVxhc65Kqtmqn0F3yfqp2Ej#DWU&J$`8y@d06iSDo}CahJa;oil0=Y( z9@$B5a;zO5j_KYS804iL+VwLDgGNC$M&0L0+TI}sH21Oq;tKMV@L;e8^%NV1?Axs=E@Mnxr_Y z`hFoIuo4FSFdgk)r1kQCMSI*brd1cpS;|Qq4qdvdxRW(jReIkX!DMQ2*|e%i4m?Cv zXR2=c#YlPAT^hBeJjwsyyrLy}`K;-Wrd(O08)=?j3FRUM1 z)+YuTr`+4QOH^=d_ZPnjPu88-^@w0TaNntQD$QjvdHufi!q2aOaGu^k`5HLb527R+ zqBJ`8q%-O!CC?bo2NsOaW{+Me)KOO&!efifc1#sB^6h47>Vs|c^sf(5*KRuOxhjFa zK$zHTm54ZN*FkQG?%nd2p z<0gtWyOm(O(EJ(B)Rjr50A11b@Nfjp&Y#AH4AHj}4W83_vAIpePXkR5S17fT{0xlK z@cVK+N7Pw+-qP8t1h8UVf*>OLQqCwJW_f4KotNI|KBC4gvd#8gh{^gD#DghL@!V%R zVSDjBr_alkQkaNh{bTG(J5$BOA>LhY01=EwX|%z1<(+NHq!63po*XZFYBdef6@W zO~st|%~~iayJr?v_`mM(OG=E~jj_H_i+13Uz2R0*GMbE1i|5i_-bgwSxOY2i6x@j``7zYf56VI zzKEpw8Hygt2dh>;VlfJ9so#9x@Ariv&m3QelD9Bi^AMKJ)Sb#PS1T}!gkJojiW9sL z!CIGcvQ5LKZipgEO^K_fc0XL^2o3MAsis$|>+!RZ&fQem>Lpc)r+KIV7^mb1Hp-R^ zY*=kpKhsM)!|R)H#R0EiQV0KNR>!1wUaz54`aj^M8x6iR9WvZt=!+tvav$PmyN(=r;6Y8B{9FH;OtWKlB3! zW4F1|bzw`?xp{_)$SNKsb2< z$M^JH*Q&!)IL~3oQzvM!X%R6Roqt&o!kM4G#c}Jf(hAuYCtL za>Yi+k2zZ5;lGX-ssCU@`Wz1!CRdy#$iJk%sXnBNj+)fG^kxt58?Bn%p)>$P6NY*< z1QhVq$Tw2n}yKy;nxQHi& z!HepXGD%AF=C`JG>KC?|LR7X(u0w|cL=4O~K2?!NERuIz+i{wZJoO>3+~L!(cgEf% zTSVX4+>A%@vMUh9p+j-n$BsZpRJ-ZC->-=ehoTZ#&UO_c+%=D?KCe(bztTN4zV<;l zDpjjqY0P(&?kM)*6=YU>#}530Tggw#2;%^vcr;-cqEzQ;eCoiw;U4_PHktM)&n2OH zPJRFK&onGsr;L#iB!+Uk^5d8;vU{ucH9oePV17i}EnpHUESys>Zu9D^%0Jh;@uG)u zeP>zllStP@QoEK|LLaD4edOil>;w}*w$Uz@fyUnXL6W+#=YdZr9P={P=V)%gfWn7e zv7cWMIfCYe9mOh9+9zdpkD;;xFP(0=^<--|&w`mA)RvT8Rzv!R-COlL^zyW`W<;O$ z6z>G@)|`8`YbrQ1eeqzL@*kkwX-s}Rb$CDVw>taTEC1Jx5N|ijm|U#0_9$OnQuj>I zDc{GxgZBsTe%oYOz1vCE@u27)mKx|V&}I9XdQrRf_eb^pUdPeD=>s>M@3Q}GA0bt= zcKf(|zy&jP%Ju}TZGM`XDo7{Qh&hc(_FANWziy4d)eb2Zf1j2zyBH2$kRNvz&25a) znh4HonoDcQN|IoR!ANWnpDs7)Jx6!PmRM?h^mOKKh@ybGIJ@xC?hbuOj!Fc=H!2w46URPKWv~+CJ&tdnb!|8x|jFuoDM`9M~q;1 zG*@v~koOfEie4*q4e07v0C2RYoS@Tw_xI%E;6$_U$DOd6k7=i8b=eBSIRc5EKczF` zkPGZ{CA(vYo@k3dN!G1xg1kiZ1f8k{+pN$?oD_w0Gf!3JL~haoO3J4*-KNtfG2tV; zx3!FyOkA_ecq@?rGY)j|_cxW^06cp@7gWZ0otWJ!Yxn1UaBJ(blV$p9-s?ohF`8{ohW}Shf+ipS=aETRSDuv&a zS?RgfPX6Zl*Qi746ZZ?3B222tL+k3o?U(FxFUGE~xj*$olPd0%mZXz*c-w}QzNsF| z$q?dmU6&Qj`$obSrvZE$tl^7uiOi@fRlerx&tu@Y5_7{+wX5^5xrrvJQE;|Bm0#ea z(7(s7fqqwHKVZDJbjlsu!O zB;qGA2rz2lD6w)`>}Vc|r@on-c1FNy{1l4CqKCt>jzL5M)477=3_Jy4b~kzq=;<0< zE8GW}%a;l);-x<63pF==--l?AHe`n2SYk^9|Cl-;z*ALPH7M|x%VzR!{;=L16x$gq zq(zOTw>P=%8^K+mq{*x^MIh*Y(e~7bH<7_9HiphQ8-nO8O6~s=mgn6ocolE;h9atA z$Nc(R=L!wc;7 zlF~a^9OHNkE!*0Cm?Hhtj;A&wRHaJDHdj_chjC{ zwbOBb+3nhVF;~ih4eIL^MBL{ywKwF?V=%!<6bDLEpod;O`|NNQmXxzEriV}s`bzB@ z!V5N1si|qfl@SnwbKUHw{+_d-;lAo2&NcrVdN2#p_<->3HVOjbn;(fiv#x_5(Tcf`sS7W&GRfJROe^u-IL(@P_F{K^VNOCTtkOu%*8 zTQGMpOkaEz7Vp|Wm~bT3o7anL^|@iFcd_|TBY!2&{U6Zee#i|Fy@{61@yb*4n%Dj% z-V4$|`S4W$#WLypU{ElqjQ4`m)!k>^8ghJ?%VO93&E|yR4+yH$EEOvd9)X=7JWa2) z$-8;ieTuob57&<=Bt_Qy_6r zkoI3j1%$3(V0dF6%XkE|6qv@WuE*?UvJ3#7mNyY!GM8&7TZzz`$p2DLvnv-F6d7#g zr1d4IkNn@>)4=i6&u_5iM;;44!EB+s>{`BoSw8GB#N7xP6`lOfNs4^HN0Zb<@GDPD zXUh6;)KK9?3%R|FX#;2S;mGzPy<)68Tvfa-52Cl=uzI$$>fS;xkB&5?oBp<~Q%CmokFlYrnM$o-^6~$IbpOJ1;2@wl zNt#w=V#H`G@+mJ4{c`eULHP`W)nYyN_OXvp9}Z)dpie5~&x%zBibi=rH^0oDFZ2qc z{7M5Sd?_J@J(@Va08}pjctm`L3b+avgZVQ(tZEr*eZ1TM)|V4n1v+Y+KM!CE=6o%< z&NEqWKzDYu!&;6A6aVRz`7<~_YVrcC>n7EKtt21*sraSPg=aL#Tc+&18U9>BezK;; zX7*)6hwAHvi2hA~L>CPJM=N$jug@CP0GHSExX>xUAQuxS4dyPNM^}k!3@(({$Vd$W zMt;i?nqVGspYrwZbMq}G;q$XM{)km_`lguvhYmPM5lz6M2EY~K58FHrh+p&D7$@1OA&JQgJI@1hpF zG6X`$Wg^7zk?Q}+f&hvgBWbR(5>ZW*RX4u3dimn{m|tKI2yM2HFR6Bc@$O_k+rK6) zdH+_c&|3^nA(e~Df?!7UXHX_E$n1{*oV}XGju*(ZpgXgMQ7uPO+F(4oj2_#zBJ!5& zntJG?DM|UH#t55nUB(gRx9yFtbQ$-@E8zFrGZBm}dCYsqU!c>ueb$AnmvsHkUUEDu5g!1F#ByCc zILly}Dm(hXAu^B}@$5MKq01EnBCHEOmNJ78W{u@NS&_X%$mBa6E!Y*rk>D(6Z(0~X z>2VZUwD}_8|I{yK%K!2~;c9U*1c@W7;)>T5yOe5uQr*z!$71ioIGO6c@z3X@|H!A^ z_;D0j(IKXi-cbwhq7V}S{XHW$@+(OFQoM>5C&18+4dNo(>07Q$xB$9!!$GZMYM?yuj9A?+E8Lxs^z!87aY{*+x1`4?(L!RERlM=&Sm$avu?W`#63d zUIpY!qsqjg$0v@lEW@s~Lcly}lScx);B! zQZUC4vt^R&eo9Ljd8pUlq54EXYw=IGo;KKej5;k~PqwJ?ojLQbb0~Cmf~`&{W(Aa@ z<8O_z8@XD7`PwkOFq~pp8O`_T?;n7zv_F6J#$M=M>`t4RSPG1Gx1dTjbmlAeZ`nj$ zLF%~I*w8PjLDq~g)CjH$EW=tonVA2eE6F>gx38^a!i0X=fiCrqR}tq(=I$j}0$Z>~ zC#z^ocYg676LwoBrW-7mx~?*dEI1l_v3RPVr{gElL!`c!%mFQ>5YHo{q|Atv#50=_ z9A&9F)n}b=Z@|b!uieTq0}F<_OYt#{BWkU}%BoT$^I}_T8Z2H}H}I0fsJtLezPVni7$+B3jc6THfSFo@8FJ94k zAF4CSUp;=R6jsD&++UgYII1ccR0|RxK->pCk2MTN-Ai8?cqmE?9SP1eiQi52PyN&d z`51K0n7$$wd@AyDtHcAK6gc!mgddd-C*O5-vNJeW(2WXk=VjS4Q)0z;VemDM%XUWt z>XqZWKdNiQ2;&4^a!fziV!rdET=aO#s-x)7tZ5snK~d;YP;tlmJ+h*umA73^q1Cb+ zJ*J+a?ho9lsb{xfzjVVN58V`sQ|C{w_`@g|-4PD?ODWubF1f%CV8hMy0?2i>k4$;8 zUQ`Q{-5e!oXJ3hp4jju*8e-F<0N+`p02PsU3s&|69==-lpHvDSFw7R;9#(B_?eb># zr$jf3>k?bCjgGOj(sozhyY`hRw$^cjG{X)c^|CbcDqTe{M57-Xcd;3FzL4?T`{6|L z{(f|A7L|qxVq6RlJTNtN$dSDj-?2-3L$B}t*%`9m%SqzB+qhzJN=wrO!jX5`rYxB6 zt9>=e?5@8GzvFzsg?6WpBg+FW_oFWF1}~$IQocj!PkG7dgpa$26ncL!Q@Hdlz4yCj zRass+UTQeiJw|S3b5Y*L{D@2WK^C%oQrgM+U0BW7r8rit*vi~Q=4iT2 zuM;Vpf)HFN_w93a&zD6%_~HYuL9D%6c3aRPuuR9<6X$Z>b*HVUkP1n$P&{L5hqsv( z)=Ep}?GUf5v>kJETZ4kfkbN?f;4vVvI?@i`V%x(*tshjh%h4c~Ndhz&<9*#_w6d(A1at_REY#^eA;?JTGUQynlg9}Ss z)N;-sh`UQEJ&S*M?qBf(IB(jEIJ3qh1y(O%B{=~?TlG`PB^?{~DN%X5e#ixzuhejA z2JdnY=ru2A!_?vWF_Gr+3G?>m$E_Ed-<+okKq@4&OewZLf-_L4h*pDFFxRQ>^0B?) zdTJUV*Do9kHis7du_udkUjFMt_omJ}QyZKMkwjTwioxZ;f)hwDGIltL@cg-;;^{Qc z|5a;(N|J4@Uote3e_!?KF_(A;5`8Cjjt%EY_ z1D!2~=!M1yW@adR+1*>UoK{NhdO~=HDMOhE$)sro!6N&@*t;h~w|Ef&Hq=Y4Tb;;y@(1S1eXnV9vpj%dHcY*;wPV>mhfh3K>Z^Yy$H zUFo5-qgkPSDMthUM{6w>4zYDBjgE?lM{|RY;-PR?{mq=djC13Ww@{yQkv=?E>cT^7!7uLXwU6dW( z0>jzp3P~2P3X5m@(4&n!U``V%4jNl9y%Bf6Tgv0^#lqrpei`%swAz02R;F}6{~Q} z*>&*Eb(z-7H9wW?XV`}~^+^o?zSz#-RgXs;Cee_Rh%zRu!vNF)LzQ@gBeyY1Z&lZ} z2ff&~janUXgqs5lGqAubNG!QwS6S$h8M|M+W_eAI-kljbuCG}X))>LI)n!E|mMh54 zJg4&|fi74$I5_pN$B1ds%cW8H7u@gH_2m#|B0^APhN2!&f^YwE0s`@PR2TF};vZV? zKW^Um+^D^1TsnRB|7V_Gl-A6lMG?S4#w2i3#f6T?23;-^Y_~+Mfi(eH^&hdp@!@ZA z`Lw3M{mMkB@smIBv`sd^loy*h*S@a9;)Ut|&u51A{I4K^3fe82FP+zJ|G?9In+7hO zLvXrWmmM5nm8Y2gAD1}-uV!Uk#B$`^+@4A2{LCv~tTTp`kqpm`2+Eiy1`U<$PZqko zcj^;8DDn$*L#eGO0-yMFN&}S#BKH~Yc-*_*}%68A2^Set% zvtzC!uFIyTBj$#a2uXAj5a~0c%in^Ju*stO84kL}sOxcy>GEBcJP6+XVoUO1uAqLL zzhukIg3Pb=*-qBCIW2Q7<@aPRPw7^!AngC>%)fuSg;D#|osS}|jr7|>q;_UvW(1QK zlN@0Gl2fqY>iQ-}>Al(urF=TmWgiB(ALz{*WxCaNLd3=*P@@{ zzk{z}TM$i1=Z+F#AJHcG%AjMphjT?{c2fIRYlo+QTPw5H_zR9m;w~%A#~m?XmKwgI zw+_4A%;%-Sr&_{4%29%f1Mf!-C@j^{BgX=IJ%5fAB^EgpiZ!Rt$QpbA>pYXH!Q%GAiQA-h1ygNC^<)-FVKq_j$j(AJj1zn1qnM|7*=P z=Wo4>#L%r<;r|$FF(o^4Ebv;aE*tNg)f58leV;VjKo{Oyx`A>Gppe-mT!g4OuISuj zA5CRO?ca0){VH^aQe607hH#AT;!ou&X6c3`B#C*ifcyzoh&LwiGsa3GUQPzXT^H$Dr(hrD^bmXN^ z%rcmX^ydj((9=Q#AvTu@H)b(0Fsn>7Qr^Sss)__2&JYf;&!!!KAG<#g%I5aUa1#Z_ zYr9`4g3;WiB7bGei8>!@q8yB)!{#x$BA}v11Im_rw~~EIQU4e@JWOD|vJ(s0_3ilw zz>Y%NIemxrZ&>J#Ssy};T~Rhj30MIQA6moZ;lfJ6y~9UDh7xDHRbR{re~ShHV3bjH z8f<9b?My87gnP`jR9(Pz9TFH_btZQo{1Mf}!! z3V{N}o3_Zup$t}6a+#Ynq^?39-1Lb~O``y2)8-TTH__!p_+pW{;xOdUxZ*Eh$_V+< z>%Qn9sOSO5tBniEac!}PZ0oH*5J6)x)=x~O54%lW)mq2(;4iZEH)AztpBu}&Ah~|1 z5(VjE74!@BH1&iR3Q9pFMTyR+U;Nug9htpRQDIGLO?l99FGBTm+ebJUd1MO9zpu1xbw%U9cKRpg&Z@;g=72q$fY-O)Q6XW_ zTz3l&mMLMWXR9?K5V2(}8P4Bj<~sT!AxC9JAYJ(7D=gvXpP(XJSW*psWIkB7v%y^X zET7)3VT0HS1NM%(iqHmpu0&BCVoPLifKrh$59%#NY%x! z1v;N^bWEi|;~X1jzT8kDyf`c{bm_K&p}Eivjo*@3>ZbAxP$xK*;Q38@+~hy{>m_PI z9(c%nMWu;CPXK+#nq{9U^KN9C@b#Tp1&Mo6%Ei^kEyW^u3a=Z{+a*3xn+Q^(v`@e1 zk)@k#42)rt$|ZtT-aS+JMLHQ9Qof-tV+}06idA$EO2pxV`pkKf8XSovPR!RGMdxcg z@|PG;ypl}=@ulR0Q1&)2KFCBb&(c;60Sn>R-ZliSK8RWw`gJ4dQGj(fXAo%rU(fql zr=PtkW!lcYD^kF3thny};<%lDXHs?`YUZItC!Pl<#5@~vM90%Dic}~w1*3F(LFGP% znn*j`Ek!h3E!a2P=qAXSOyu$%@;{-!#^ z(N6=E5F4+lqi*bR{1&6McC&Blwk2S6=*N>|LMeD4jAq-tmXe7p(z4-}na?v;GCC)h z^>=2{UXNR7(FVz}vZ0&1@(k26Mv7W}#M_HwFs zD72v#AFFUZp(Yj`5>bEU%zpLpw#JR7NxZJJkmDZ^sWEn7L9*=U7Z=m(-Hd@-cYZ&w zP{>%zwtzbHos1V>HwRdiDSBYXJCt51Cy=!K151brF7c`v`_50cR*n<;_^LvGSkE z!FrL?7z6OWg6a)y7-65OeaF(wz!q3@b`x@J6STWK+cIcaTfO8zODVusa$iS>QH7&H zVSlXs4}^Z*QNfOLm;*eowpDS%Gn|JbJHNCFVrvnB}KAh<|C$U zXJ3C4>uC;tix3HtA=d;BGD>`E6MnsyisN+r-n)DK6v1O$ZN2~{cJCcC1`iY-vEXxs zg{t@oyMpe?K@sI9LS0GOD(2;zkRuzOh{5eeH1xeofxf*9e&({i+{aDfbSKJD4 znO9X=lTF;6EzDKFz05>`7ciK;QKMxuM_FfoYi#V}jcE&Yd-zbZa05OmuJ>h(cW+>(fmf% zcziFZZcHVcKKTY_t>xI$Hx+O~yGcX91CU}TGteG#;~V}jdEI{c!>zk>j{JuAfBRH!=ljb z<1(muZS}cYOLKx%<*9yOFBY3E*nL8|M($n$=6=3THe`4SVDC<*i|bZ&McscMKW^#H zy#H!S>^fgFOhEdkYeCkW6%*6`yS*Hn?(Dt-{esyG^+mbIh2m}UlDE?E-YA(*fA#ZZ zj&2gBXS3*BR4u~56Iz8g_S2DOWBoHqj?YVipG|gYASKNQP;g&K)wp6JJXS#0<$>sk zukeIorBf%qyQ|Xc^3NTE0!dYP!$J6L3^{}mRU&xnpY(|4&v(oW-D6t_af5MBM`mZo z&L3@jIyKa+D62J&5Er{~HHolZ6TKZ@qmOaiMC6EgZIss{#HD=Gc-oh%CA;p0bfOmJ z!(2M7@CUhyU^R$jBCPWMY%*Y;Z8|-%b;B`Ex6%#n@V(>h=wp5r6ZPwaOe3h&ZeYMTgKPJkf_N-udAYa^`LCjZM;+Y_RvEOy!syj}jeljmZ4%S_Wz1m#k335c-+;pQh zxJ73ZGUhI#RxF&_#%BXR2AUBpbjctJ_Z3sAQWuV`%IRx|h=27L*M|bH_G6sRa|m5E z{ovl9e^n}Ib8zx(reJqxu`00P&@sgYrs1BGokBvYkI_yuH9Ymy895G6h{ySM^@F$wXBHc1jkVIt9byl8@ZN+r zP33OnlNyO1-(?;WW~Ttxc@NKtL^D;(b6)udpxsBHf)%>P%mzr9M>;uYn4PbSVk3vuu3wV z0LJEws$&=JPrm*}z3_W*6Y_()fggPxRMyK-t)qN{i>Hsrp33OncFn?GkH+;FeBT#C zA)VvKT6|13O%!G`IKTb?#X2^0ja{k+F5SNXUKk%3e9+7b(VfABrJ%iHTfH z6ganUi7)(2*yn_}dsiuJ%5{9<Qhf>uR zM&sHh4`FkB`eb7uZ&oeXz^#9pGLBeu?^c1KS2)oHo1pAR8$F*V58TVl$(%w+>C7g$ zC+rk{vr5M=9Hm+69|0$@QTw~K4lmrGLDEXhYPy10BQAetnp(RK3pA?2|7!0Yo8 zps5MAqd{o;JbXb0V8K3eS&U1bRFG~IG3_Pjtra7js+8X85bhOzhQtEjJbof`MLRyY zcU~dZVkLl|^ZSCoHNWD*BuVpl(I`&6@F1N}%VgVD_=zR^)Ir<4d$xy=|$i_`5}tDTWQMCRyIHf%Nga>8fr^a_?<^BOC6ODLT@oZ-niozdfrqsY(0Bj zWrjF^c`#KBSiO$W3wi!we#e<5PG;Yu0PM4grCCzj(~Yei47wT1r|hZ)r+<|Ef@>WF z%}%U4PDe=T)I%Q^_dAaa9Ugr_lD~^UeBm62+@yRO*2V>Sp@csaKLF0<^&1%6wHA8~ zxkWm}9HTmhji0hSQdfCQT25N?cKB>e#TvmFlkYkJi1aX+LwbaNtZnY9Lfhiwi(Txg z*6HZqmlNyGa(A~(<#|L49)~-2?o;5E>&LIwgTig=j@v=ZEmws*#DnT<-|j}}qf+wa z3o&s<^dfu|8>2g&Q%8YZa!1N|v+(nF9;VJ#CZ7Is50?)?Ulv1`K30kg)#syAaWrG3 zbfhOnu50xWXIbjOJ=~DjBC(AiRZjMfrXBs8vbRnpyeBZh*R1}(yzq?q9L+lh4ZLf{ zg39Y9Q1y2WFA7=qYVLGGHF)IJ(aAyO`qFuPjvXqcD7IgB9v*>x{|`U$=w@vSfQPlM zfqn?9|E(c9mp9y+HLa%OTxHUcz(?ZJc}x9hKRCEfn8ui1xx7rGIg(t6Y)Ul2`XbR88dWCK7)c#oF_Sk55FUh${Qg| zHM*^QJ}3{VeNSrC@*HQwg%4g9Ee2v~UNXzazuDWHh#pKC|0Mhh0h(r6ElA&XN-kz2 zVk=#1gx%c~_6Log!(Sb*{}gd(#bdQ1c^Aavufh}EA=qo<1&6w;ADiBj@%$m#xEAyC z6m;TxcL$v5Vuf2BXrgXtJ(HoOxet4va%)GR_1F_0#8*Zm-CpiLEl0;q$H~g@-GVuf zJo@9q?)*NCUJ@Oy8So+6u1ub==lnc6H>vkPrJECH;0*fd9(i^cn!9?{nXOH=>r(dH;Zb-7dal9vhk*kwAo~j+NcNO680{yp&^G}-IPy=78 z_+jsEOEA3Q$@u0cq}@u#<_nd&xe@yZGV#i6it-Xt5 zLNo9JtGV$hFt*knxcvxW_<54soXzh?>s5!YrNMkK+*m0~-d}j=15>FQO7mirT#OpM z)AN2(@SS9@IzU+HG$*p-)N-cxzNdJ2sXBUl@Wu-=6SeDlge=AM+0&$tJQ(v{hCtee z>sY_p9LTd@r1h|AB)kDjgh>5G33fJ?w~;EeEG49#+6!vTm=7*{{QnyC-Rk2I(UPS;Kt9Qhqf_EMePvg}V5(qzsk(Kqx>xVurFYVtImEb#) z5a55LawX@3aJ3*?Xe{%-AWDm;>YJaSbI~npI^^2%S1KpI!^rEuD)mUEBeRU(CMH<* zSxDrbm=Nr*th62UWPLU2UY&jvcPCvKc9O(y7U83!9ls8~mQXP4v_S{N{L&LP>}G7! zysm{X{J=M@Nb<-o{8LPyT?|5X&{o8d5}c4m%}xs<^P*JAquP>GICG?j$HZeRG*9F7 z?l&dR#uZ~TG8dU_Kq8UbS}_d(gdi3>liahSKPR;jkJ)_-(H_OP@I z4A~%JquZn^L!M1xvE2aD)^Y|SUkOethdmt5(Eeqkge}%?B|CZFG|w=B<~!;w%@KH4_9cni;vq+t8|~^K zC<j(08efm zvdw)MEqIj`U={in`;tYn>Oa?ytP;zT&D1b1$<1VC|*UJ%kmPI5g~Dg5@KX zuxut=6|29SwWUbwM(N%OLz`f+YM04aE^uP?@xGdlC^2n!C-!OnEE}k?f93{@A3#sV z+6w{LRZ{8QpKh9SRenX1wXQ@d%w=(}iIVjyQ&4q6AKrSjk?3qPLygS2({TYmoaF-u z@=)r!)I^SSjUyk4PJd9@-7r%r8Q^&`T8Y7P3}V ze34h;eR_Gn=epwgFXSuE28~Ap+^^G25vw$(sBkQ(D0qeQ2^@fKE+5Kfx30XHhQ7Eo zikjZGHnp-+D_`a}t1CB;^|v_x;iL5C(kMC(Hg)&B`HGYltAuztCy@Cm>*Nv5uogFIOw7Y+YP#dD zb8SwfzZB>8g^iJpCg9-q17dxa-2_&$M_~j#b4@sL^nIKLzAB!AXuMl=adVSbo&eW( z`Q~firhpuXZw^5b3b(R0iJi2(rS}iI1~>YRtjPttefU>ZUw{Ww>P>*mSnV(CNPN*y zUE~jh&Zvg8CO+nqHqO>x?82%KHNUfv*DteH0lrGbe{2a;vO=g2-YnKEj5|jz%-|?l zvjDmuiTUcYcV(6w*O3O;Ds3+QH?fOu%gTByiibP8NWp1=9ML*ZRocW-R^n=HiUn}~ zbbr6^+!SReiBj(8?Ys~hX8(+8eyMpja1pnJXt48E%hD&^9k)(ET^#X%?_DS2AJgPR zzFjagBUp%tPl0(#7CjYA#$06~kcmK;s{s4E;i)WYJgTLoSIs`N=)69Q?8YM0FT+M5 zkb6NHsT)!)w!?=%AB=PeI$Y^S{n9xD6GZmGHIJn?^b86kd_>Mq$v}7T9dLFoa10Bx z^(aOwlpjPyZpMPfxJEMg#npetj8i7}ixk`g6djkK+d2#$U`si{n-aX{4or0jj^^TUEXTn;Ee+c`^E$fzB*vQiMyM!gGDh%z8 zA6f52_N^)+*swAKFV@r&o(-ZdBy7kP8&5hGlmGEEN?-o2c%`i!*QGep%qjjr5}3nL zYf1@ATj~a5t&>1h#6XW|9<=Gh{|&}!7a9Ux^377YsJ#jJwI*z39tc=ZTOoyAt;?l(D(Z zb2rc#w$bo~4eTWu6V5bO-Epu}*L^VmdOYjic&zx3?Vw!Rftqvy@Zqp`cL{=~$txZ2 zg~si<^TE&K^Oa7s|Me!^Mayl?BT8|*X|_N@2yB5J&9ybJ_V_|z2ZmYs`;?#=p7R47 ze#HhFevt(ZX~B8400mPLK{a&GMr`R+@Sg{&^fsAuYmP*nZR9D!qT*p?bxs1)`?KKy zVcleHB`)CF-^Z$5yqbK_*LojlT1z-%hfd5&CSTaUKSXG5ATu67dscD(SbMRoOw7rl zjSMzkUIiHiWw4xZ6i9w#783?Kam9;73p1}rEEHh-G(SQveG_(53!tKoeDzzqb@YxZ z*iZ7`C5K%co{IKAw7&-AKjLvW4-y<;)kyKZlKvkj@$%p7U4E9bw`^t#UMIrDtLqbg zoy6JQA0ubV_aQWU0J&xh;-gpr%FeAmhef0}Mt9Vj`Fjw1f?g8Gz3qa;kKBwzX0fav z)1d9ffsRQeoyU!#b$ysK-1vjvW0sNBaTw$Vrk_yN+7kJ~nlj@nS+o7kcM)8}_p%xN zC`G~cf^T8Q=~+G6{)4lzLjJNE?-Y$i<=bz(?25McEo~$HgaqeM>X~&wOQ+g^sC{UX zNX6*g%IY>TIAeJ)Esckg(~k5ViM0x!t(f``0=}f~sWaDRBEA%qte*&>1k)XTPPR*lC=5^C?zKo>xnxgbi6fV{{)9{gqpL7g1V7 zQt_Qmyd{~&W)=#qgN$n8_R7xn+VfB^w)Mqe!rDOm(+T{7=9OuS@f0v`48veav@Nf$$+Y7rl zI>{bHb3!#4a-Tq5W!^1?NVIK}YN=_mCT_hQj{(@pOG2+jf~e;|kT#fgXUs*Stkc%_ zC8pC3nRR?yW5Y_7MVJyL7faB?tDYgt&U?WPXCWJuvfEsE4C$3{*O+m$Cx30=LniA&H+Gws55cg_Ch9A~T5i$y6i^ z;9(xz|7#hCEl`f`fFll&Fj#}yooTk0z+%4x2BszMyF>5Gjfpf(&)iF*W*Ya>U7`O> zRKOGO24P4(3j0)=Vd&e%hDa@DwXaJ5s^$J_j4#W&;C(gCA`y=p9W&~K%G9`X))!bh z(86=CKJg+c&5obfZocN-ArN%~KL`7;{rUeV?tLY#sxoMI($MSusItYQDArp+TK69w zx2u5qi3v%Pu@Iu~hDleS*k^qGt~CxXvA$TR>B3u<7yVvihDOQZX0h$OSZzysnbC+} zzweT~F0;K6J?)2&a%L(YHteGuDbu^HTp|y8@Q0U$fXI(Z3vze#U`t3bq+Sc%JF&D2 zAvS8UbdtvdWOvPRS5tgN`!(e#%EF&8S}GI|gYVF#AeZ&sf)H9@hDo>}YM-STk>ak7 zgMUKp_Rv~@C-5S?H@c~D{q`mfY6mNExxxAY*m##*kJ`rr=SfZ0b7Y#)&2D-F{uV

D#Q3kS=7~pu?&xTS)4ikFBmR}QPo6r)T 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 z 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 Date: Thu, 29 Feb 2024 10:59:09 +0800 Subject: [PATCH 349/446] Fix subprocess creation in directories managed by tramp-androidsu * lisp/net/tramp-androidsu.el (tramp-androidsu-maybe-open-connection): Set connection property remote-namespace to t or nil subject to whether su runs in the global mount namespace. (tramp-androidsu-adb-handle-make-process): Delete function. (tramp-androidsu-make-process): New function. (tramp-androidsu-file-name-handler-alist): Switch to tramp-androidsu-make-process. --- lisp/net/tramp-androidsu.el | 134 ++++++++++++++++++++++++++++++++---- 1 file changed, 119 insertions(+), 15 deletions(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index fd9edb6a92e..1623a0341b2 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -118,11 +118,10 @@ multibyte mode and waits for the shell prompt to appear." ;; Set sentinel. Initialize variables. (set-process-sentinel p #'tramp-process-sentinel) (tramp-post-process-creation p vec) - ;; Replace `login-args' place holders. (setq command (format "exec su - %s || exit" (or user "root"))) - + (tramp-set-connection-property vec "remote-namespace" nil) ;; Attempt to execute the shell inside the global mount ;; namespace if requested. (when tramp-androidsu-mount-global-namespace @@ -140,6 +139,8 @@ multibyte mode and waits for the shell prompt to appear." (tramp-adb-send-command-and-check vec "su -mm -c 'exit 24'" 24))) (when tramp-androidsu-su-mm-supported + (tramp-set-connection-property + vec "remote-namespace" t) (setq command (format "exec su -mm - %s || exit" (or user "root")))))) ;; Send the command. @@ -156,27 +157,21 @@ multibyte mode and waits for the shell prompt to appear." ;; Set connection-local variables. (tramp-set-connection-local-variables vec) - ;; Change prompt. (tramp-adb-send-command vec (format "PS1=%s" (tramp-shell-quote-argument tramp-end-of-output))) - ;; Disable line editing. (tramp-adb-send-command vec "set +o vi +o vi-esccomplete +o vi-tabcomplete +o emacs") - ;; Dump option settings in the traces. (when (>= tramp-verbose 9) (tramp-adb-send-command vec "set -o")) - ;; Disable Unicode. (tramp-adb-send-command vec "set +U") - ;; Disable echo expansion. (tramp-adb-send-command vec "stty -inlcr -onlcr -echo kill '^U' erase '^H'" t) - ;; Check whether the echo has really been disabled. ;; Some implementations, like busybox, don't support ;; disabling. @@ -191,14 +186,12 @@ multibyte mode and waits for the shell prompt to appear." (tramp-adb-send-command vec "stty icanon erase ^H cols 32767" t))) - ;; Set the remote PATH to a suitable value. (tramp-set-connection-property vec "remote-path" - "/system/bin:/system/xbin") - + '("/system/bin" + "/system/xbin")) ;; Mark it as connected. (tramp-set-connection-property p "connected" t)))) - ;; Cleanup, and propagate the signal. ((error quit) (tramp-cleanup-connection vec t) @@ -386,8 +379,119 @@ FUNCTION." (defalias 'tramp-androidsu-handle-make-nearby-temp-file (tramp-androidsu-generate-wrapper #'tramp-handle-make-nearby-temp-file)) -(defalias 'tramp-androidsu-adb-handle-make-process - (tramp-androidsu-generate-wrapper #'tramp-adb-handle-make-process)) +(defun tramp-androidsu-make-process (&rest args) + "Like `tramp-handle-make-process', but modified for Android." + (when args + (with-parsed-tramp-file-name (expand-file-name default-directory) nil + (let ((default-directory tramp-compat-temporary-file-directory) + (name (plist-get args :name)) + (buffer (plist-get args :buffer)) + (command (plist-get args :command)) + (coding (plist-get args :coding)) + (noquery (plist-get args :noquery)) + (connection-type + (or (plist-get args :connection-type) process-connection-type)) + (filter (plist-get args :filter)) + (sentinel (plist-get args :sentinel)) + (stderr (plist-get args :stderr))) + (unless (stringp name) + (signal 'wrong-type-argument (list #'stringp name))) + (unless (or (bufferp buffer) (string-or-null-p buffer)) + (signal 'wrong-type-argument (list #'bufferp buffer))) + (unless (consp command) + (signal 'wrong-type-argument (list #'consp command))) + (unless (or (null coding) + (and (symbolp coding) (memq coding coding-system-list)) + (and (consp coding) + (memq (car coding) coding-system-list) + (memq (cdr coding) coding-system-list))) + (signal 'wrong-type-argument (list #'symbolp coding))) + (when (eq connection-type t) + (setq connection-type 'pty)) + (unless (or (and (consp connection-type) + (memq (car connection-type) '(nil pipe pty)) + (memq (cdr connection-type) '(nil pipe pty))) + (memq connection-type '(nil pipe pty))) + (signal 'wrong-type-argument (list #'symbolp connection-type))) + (unless (or (null filter) (eq filter t) (functionp filter)) + (signal 'wrong-type-argument (list #'functionp filter))) + (unless (or (null sentinel) (functionp sentinel)) + (signal 'wrong-type-argument (list #'functionp sentinel))) + (unless (or (null stderr) (bufferp stderr)) + (signal 'wrong-type-argument (list #'bufferp stderr))) + (let* ((buffer + (if buffer + (get-buffer-create buffer) + ;; BUFFER can be nil. We use a temporary buffer. + (generate-new-buffer tramp-temp-buffer-name))) + (orig-command command) + (env (mapcar + (lambda (elt) + (when (tramp-compat-string-search "=" elt) elt)) + tramp-remote-process-environment)) + ;; We use as environment the difference to toplevel + ;; `process-environment'. + (env (dolist (elt process-environment env) + (when + (and + (tramp-compat-string-search "=" elt) + (not + (member + elt (default-toplevel-value 'process-environment)))) + (setq env (cons elt env))))) + ;; Add remote path if exists. + (env (let ((remote-path + (string-join (tramp-get-remote-path v) ":"))) + (setenv-internal env "PATH" remote-path 'keep))) + (env (setenv-internal + env "INSIDE_EMACS" (tramp-inside-emacs) 'keep)) + (env (mapcar #'tramp-shell-quote-argument (delq nil env))) + ;; Quote command. + (command (mapconcat #'tramp-shell-quote-argument command " ")) + ;; Set cwd and environment variables. + (command + (append + `("cd" ,(tramp-shell-quote-argument localname) "&&" "(" "env") + env `(,command ")"))) + ;; Add remote shell if needed. + (command + (if (consp (tramp-get-method-parameter v 'tramp-direct-async)) + (append + (tramp-get-method-parameter v 'tramp-direct-async) + `(,(string-join command " "))) + command)) + p) + ;; Generate a command to start the process using `su' with + ;; suitable options for specifying the mount namespace and + ;; suchlike. + (setq + p (make-process + :name name :buffer buffer + :command (if (tramp-get-connection-property v "remote-namespace") + (append (list "su" "-mm" "-" (or user "root") "-c") + command) + (append (list "su" "-" (or user "root") "-c") + command)) + :coding coding :noquery noquery :connection-type connection-type + :sentinel sentinel :stderr stderr)) + ;; Set filter. Prior Emacs 29.1, it doesn't work reliably + ;; to provide it as `make-process' argument when filter is + ;; t. See Bug#51177. + (when filter + (set-process-filter p filter)) + (tramp-post-process-creation p v) + ;; Query flag is overwritten in `tramp-post-process-creation', + ;; so we reset it. + (set-process-query-on-exit-flag p (null noquery)) + ;; This is needed for ssh or PuTTY based processes, and + ;; only if the respective options are set. Perhaps, the + ;; setting could be more fine-grained. + ;; (process-put p 'tramp-shared-socket t) + (process-put p 'remote-command orig-command) + (tramp-set-connection-property p "remote-command" orig-command) + (when (bufferp stderr) + (tramp-taint-remote-process-buffer stderr)) + p))))) (defalias 'tramp-androidsu-sh-handle-make-symbolic-link (tramp-androidsu-generate-wrapper @@ -508,7 +612,7 @@ FUNCTION." (make-directory-internal . ignore) (make-lock-file-name . tramp-androidsu-handle-make-lock-file-name) (make-nearby-temp-file . tramp-androidsu-handle-make-nearby-temp-file) - (make-process . tramp-androidsu-adb-handle-make-process) + (make-process . tramp-androidsu-make-process) (make-symbolic-link . tramp-androidsu-sh-handle-make-symbolic-link) (memory-info . tramp-androidsu-handle-memory-info) (process-attributes . tramp-androidsu-handle-process-attributes) From 862dfef88d8e62d12bac3ca2e44e035a2ff5b298 Mon Sep 17 00:00:00 2001 From: Robert Pluim Date: Thu, 29 Feb 2024 09:29:04 +0100 Subject: [PATCH 350/446] Pacify more docstring control char warnings * lisp/org/org-macs.el (org-split-string): Escape control chars. * lisp/org/ox-latex.el (org-latex-guess-babel-language): And here. --- lisp/org/org-macs.el | 2 +- lisp/org/ox-latex.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el index 2332c0c927c..aafbdf0e0aa 100644 --- a/lisp/org/org-macs.el +++ b/lisp/org/org-macs.el @@ -982,7 +982,7 @@ Otherwise, return nil." "Splits STRING into substrings at SEPARATORS. SEPARATORS is a regular expression. When nil, it defaults to -\"[ \f\t\n\r\v]+\". +\"[ \\f\\t\\n\\r\\v]+\". Unlike `split-string', matching SEPARATORS at the beginning and end of string are ignored." diff --git a/lisp/org/ox-latex.el b/lisp/org/ox-latex.el index b409f552a2b..bca387e5935 100644 --- a/lisp/org/ox-latex.el +++ b/lisp/org/ox-latex.el @@ -1632,7 +1632,7 @@ explicitly been loaded. Then it is added to the rest of package's options. The optional argument to Babel or the mandatory argument to -`\babelprovide' command may be \"AUTO\" which is then replaced +`\\babelprovide' command may be \"AUTO\" which is then replaced with the language of the document or `org-export-default-language' unless language in question is already loaded. From b8ba3cb7f00504ec58fda867a44631cc14b3343d Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 29 Feb 2024 11:04:07 +0100 Subject: [PATCH 351/446] * Improve 'native-comp-async-report-warnings-errors' tag * lisp/emacs-lisp/comp-run.el (native-comp-async-report-warnings-errors): Improve tag. --- lisp/emacs-lisp/comp-run.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/comp-run.el b/lisp/emacs-lisp/comp-run.el index 8fcbe31cf0b..c78b5ece9bd 100644 --- a/lisp/emacs-lisp/comp-run.el +++ b/lisp/emacs-lisp/comp-run.el @@ -72,9 +72,9 @@ Set this variable to nil to suppress warnings altogether, or to the symbol `silent' to log warnings but not pop up the *Warnings* buffer." :type '(choice - (const :tag "Do not report warnings" nil) - (const :tag "Report and display warnings" t) - (const :tag "Report but do not display warnings" silent)) + (const :tag "Do not report warnings/errors" nil) + (const :tag "Report and display warnings/errors" t) + (const :tag "Report but do not display warnings/errors" silent)) :version "28.1") (defcustom native-comp-always-compile nil From 8e5baaddec2d6a7f48ca0a08e0a95a51c6cbb151 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 29 Feb 2024 11:25:00 +0100 Subject: [PATCH 352/446] * Add 'native-comp-async-report-warnings-errors-kind' * lisp/emacs-lisp/comp-run.el (native-comp-async-report-warnings-errors-kind): Add new customize. --- lisp/emacs-lisp/comp-run.el | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/comp-run.el b/lisp/emacs-lisp/comp-run.el index c78b5ece9bd..eec50c39c68 100644 --- a/lisp/emacs-lisp/comp-run.el +++ b/lisp/emacs-lisp/comp-run.el @@ -77,6 +77,19 @@ buffer." (const :tag "Report but do not display warnings/errors" silent)) :version "28.1") +(defcustom native-comp-async-report-warnings-errors-kind 'importants + "Select which kind of warnings and errors to report. + +Set this variable to `importants' to have only important warnings and +all errors to be reported. + +Set this variable to `all' to have all warnings and errors to be +reported." + :type '(choice + (const :tag "Report all warnings/errors" all) + (const :tag "Report only important warnings and errors" importants)) + :version "30.1") + (defcustom native-comp-always-compile nil "Non-nil means unconditionally (re-)compile all files." :type 'boolean @@ -184,13 +197,21 @@ processes from `comp-async-compilations'" (let ((warning-suppress-types (if (eq native-comp-async-report-warnings-errors 'silent) (cons '(comp) warning-suppress-types) - warning-suppress-types))) + warning-suppress-types)) + (regexp (if (eq native-comp-async-report-warnings-errors-kind 'all) + "^.*?\\(?:Error\\|Warning\\): .*$" + (rx bol + (*? nonl) + (or + (seq "Error: " (*? nonl)) + (seq "Warning: the function ā€˜" (1+ (not "’")) + "’ is not known to be defined.")) + eol)))) (with-current-buffer (process-buffer process) (save-excursion (accept-process-output process) (goto-char (or comp-last-scanned-async-output (point-min))) - (while (re-search-forward "^.*?\\(?:Error\\|Warning\\): .*$" - nil t) + (while (re-search-forward regexp nil t) (display-warning 'comp (match-string 0))) (setq comp-last-scanned-async-output (point-max))))) (accept-process-output process))) From 62bdd307a7fd6c319529b7b20425b993a2945043 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 29 Feb 2024 14:15:30 +0100 Subject: [PATCH 353/446] * etc/TODO (Native compiler improvements): Remove an entry as completed. --- etc/TODO | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/etc/TODO b/etc/TODO index 0152cf9303e..52c77ccc28d 100644 --- a/etc/TODO +++ b/etc/TODO @@ -910,22 +910,6 @@ restore the redirection through funcall. *** Features to be improved or missing -**** Diagnostic - -***** Filtering async warnings - -Add a new 'native-comp-async-report-warnings-errors' value such that -we filter out all the uninteresting warnings (that the programmer -already got during byte compilation) but we still report the important -ones ('the function ā€˜xxx’ is not known to be defined.'). - -This way even if the package developer doesn't use native compilation -it can get the bug report for the issue and -'*Async-native-compile-log*' is not too crowded. - -This new value for 'native-comp-async-report-warnings-errors' should -be default. - **** Fix portable dumping so that you can redump without using -batch ***** Redumps and native compiler "preloaded" sub-folder. From 39239982403f01a37d42d1cd8db0b2ed0b48b50c Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 29 Feb 2024 15:37:19 +0200 Subject: [PATCH 354/446] Improve documentation of recent changes in comp-run.el * lisp/emacs-lisp/comp-run.el (native-comp-async-warnings-errors-kind): Rename from 'native-comp-async-report-warnings-errors-kind', and rename 'importants' to 'important'; all users changed. Doc fix. * etc/NEWS: Announce the new option. --- etc/NEWS | 6 ++++++ lisp/emacs-lisp/comp-run.el | 17 ++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index b4a1c887f2e..b1e3130ab79 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1960,6 +1960,12 @@ The warning name is 'docstrings-control-chars'. *** The warning about wide docstrings can now be disabled separately. Its warning name is 'docstrings-wide'. +--- +** New user option 'native-comp-async-warnings-errors-kind'. +It allows control of what kinds of warnings and errors from asynchronous +native compilation are reported to the parent Emacs process. The +default is to report all errors and only important warnings. + +++ ** New function declaration and property 'important-return-value'. The declaration '(important-return-value t)' sets the diff --git a/lisp/emacs-lisp/comp-run.el b/lisp/emacs-lisp/comp-run.el index eec50c39c68..057760322ab 100644 --- a/lisp/emacs-lisp/comp-run.el +++ b/lisp/emacs-lisp/comp-run.el @@ -77,17 +77,16 @@ buffer." (const :tag "Report but do not display warnings/errors" silent)) :version "28.1") -(defcustom native-comp-async-report-warnings-errors-kind 'importants - "Select which kind of warnings and errors to report. +(defcustom native-comp-async-warnings-errors-kind 'important + "Which kind of warnings and errors to report from async native compilation. -Set this variable to `importants' to have only important warnings and -all errors to be reported. - -Set this variable to `all' to have all warnings and errors to be -reported." +Setting this variable to `important' (the default) will report +only important warnings and all errors. +Setting this variable to `all' will report all warnings and +errors." :type '(choice (const :tag "Report all warnings/errors" all) - (const :tag "Report only important warnings and errors" importants)) + (const :tag "Report important warnings and all errors" important)) :version "30.1") (defcustom native-comp-always-compile nil @@ -198,7 +197,7 @@ processes from `comp-async-compilations'" (if (eq native-comp-async-report-warnings-errors 'silent) (cons '(comp) warning-suppress-types) warning-suppress-types)) - (regexp (if (eq native-comp-async-report-warnings-errors-kind 'all) + (regexp (if (eq native-comp-async-warnings-errors-kind 'all) "^.*?\\(?:Error\\|Warning\\): .*$" (rx bol (*? nonl) From 093c2e1ab9db5e0309bf9bbb5deb9a7dcbad6267 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Thu, 29 Feb 2024 16:21:05 +0100 Subject: [PATCH 355/446] ; Fix some wording in recent obarray changes. --- doc/lispref/symbols.texi | 2 +- lisp/obarray.el | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi index 5207ea4ea7b..6f9b1ef0ec7 100644 --- a/doc/lispref/symbols.texi +++ b/doc/lispref/symbols.texi @@ -231,7 +231,7 @@ Emacs Lisp provides a different namespacing system called This function creates and returns a new obarray. The optional @var{size} may be used to specify the number of symbols that it is expected to hold, but since obarrays grow automatically -as needed, this rarely provide any benefit. +as needed, this rarely provides any benefit. @end defun @defun obarrayp object diff --git a/lisp/obarray.el b/lisp/obarray.el index e6e51c1382a..5e646db9ab7 100644 --- a/lisp/obarray.el +++ b/lisp/obarray.el @@ -29,10 +29,11 @@ (defconst obarray-default-size 4) (make-obsolete-variable 'obarray-default-size - "obarrays now grow automatically" "30.1") + "obarrays now grow automatically." "30.1") -(defun obarray-size (_ob) obarray-default-size) -(make-obsolete 'obarray-size "obarrays now grow automatically" "30.1") +(defun obarray-size (_ob) + (declare (obsolete "obarrays now grow automatically." "30.1")) + obarray-default-size) ;; Don’t use obarray as a variable name to avoid shadowing. (defun obarray-get (ob name) @@ -42,7 +43,7 @@ Return nil otherwise." (defun obarray-put (ob name) "Return symbol named NAME from obarray OB. -Creates and adds the symbol if doesn't exist." +Creates and adds the symbol if it doesn't exist." (intern name ob)) (defun obarray-remove (ob name) From e18a6fbb44ac48998a1aebe25136a59e5a419b57 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 29 Feb 2024 18:25:12 +0200 Subject: [PATCH 356/446] ; Tweak recently-added NEWS entry. --- etc/NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index b1e3130ab79..198563e0fc0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1964,7 +1964,10 @@ Its warning name is 'docstrings-wide'. ** New user option 'native-comp-async-warnings-errors-kind'. It allows control of what kinds of warnings and errors from asynchronous native compilation are reported to the parent Emacs process. The -default is to report all errors and only important warnings. +default is to report all errors and only important warnings. If you +were used to customizing 'native-comp-async-report-warnings-errors' to +nil or 'silent', we suggest that you now leave it at its default value, +and see if you get only warnings that matter. +++ ** New function declaration and property 'important-return-value'. From 8305d0e0c909a5dd91a21cc1daea6298aae9eda7 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Thu, 29 Feb 2024 19:50:04 +0200 Subject: [PATCH 357/446] Add tabulated-list-groups and Buffer-menu-group-by (bug#69305) * doc/lispref/modes.texi (Tabulated List Mode): Add defvar tabulated-list-groups. * lisp/buff-menu.el (Buffer-menu-group-by): New defcustom. (Buffer-menu-unmark-all-buffers): Use tabulated-list-get-entry to check whether the current line contains an entry. (list-buffers-noselect): Enable outline-minor-mode for tabulated-list-groups. (list-buffers--refresh): When Buffer-menu-group-by is non-nil, set tabulated-list-groups. (Buffer-menu-group-by-mode, Buffer-menu-group-by-root): New functions. * lisp/emacs-lisp/tabulated-list.el (tabulated-list-groups): New buffer-local variable. (tabulated-list-print-fake-header): Add distinct overlay property 'fake-header'. (tabulated-list-header-overlay-p): Filter out overlays that don't have the property 'fake-header'. (tabulated-list-print): Use the variable 'tabulated-list-groups' to sort entries in groups separately. (tabulated-list-print-entries): New function factored out from 'tabulated-list-print'. * test/lisp/emacs-lisp/tabulated-list-tests.el (tabulated-list-groups): New test. --- doc/lispref/modes.texi | 35 ++++++++++ etc/NEWS | 9 +++ lisp/buff-menu.el | 54 +++++++++++++--- lisp/emacs-lisp/tabulated-list.el | 68 ++++++++++++++++---- test/lisp/emacs-lisp/tabulated-list-tests.el | 41 ++++++++++++ 5 files changed, 185 insertions(+), 22 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 630e42e6878..7a4a722d595 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1246,6 +1246,41 @@ Otherwise, the value should be a function which returns a list of the above form when called with no arguments. @end defvar +@defvar tabulated-list-groups +This buffer-local variable specifies the groups of entries displayed in +the Tabulated List buffer. Its value should be either a list, or a +function. + +If the value is a list, each list element corresponds to one group, and +should have the form @w{@code{(@var{group-name} @var{entries})}}, where +@var{group-name} is a string inserted before all group entries, and +@var{entries} have the same format as @code{tabulated-list-entries} +(see above). + +Otherwise, the value should be a function which returns a list of the +above form when called with no arguments. + +You can use @code{seq-group-by} to create @code{tabulated-list-groups} +from @code{tabulated-list-entries}. For example: + +@smallexample +@group + (setq tabulated-list-groups + (seq-group-by 'Buffer-menu-group-by-mode + tabulated-list-entries)) +@end group +@end smallexample + +where you can define @code{Buffer-menu-group-by-mode} like this: + +@smallexample +@group +(defun Buffer-menu-group-by-mode (entry) + (concat "* " (aref (cadr entry) 5))) +@end group +@end smallexample +@end defvar + @defvar tabulated-list-revert-hook This normal hook is run prior to reverting a Tabulated List buffer. A derived mode can add a function to this hook to recompute diff --git a/etc/NEWS b/etc/NEWS index 198563e0fc0..72757622958 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1356,6 +1356,11 @@ will return the URL for that bug. This allows for rcirc logs to use a custom timestamp format, than the chat buffers use by default. +--- +*** New user option 'Buffer-menu-group-by'. +It splits buffers by groups that are displayed with headings +in Outline minor mode. + --- *** New command 'Buffer-menu-toggle-internal'. This command toggles the display of internal buffers in Buffer Menu mode; @@ -2070,6 +2075,10 @@ inside 'treesit-language-source-alist', so that calling It may be useful, for example, for the purposes of bisecting a treesitter grammar. ++++ +** New buffer-local variable 'tabulated-list-groups'. +It prints and sorts the groups of entries separately. + * Changes in Emacs 30.1 on Non-Free Operating Systems diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index e13c3b56b4e..1d52feb5733 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -95,6 +95,25 @@ as it is by default." :group 'Buffer-menu :version "22.1") +(defcustom Buffer-menu-group-by nil + "If non-nil, buffers are grouped by function. +This function takes one argument: a list of entries in the same format +as in `tabulated-list-entries', and should return a list in the format +suitable for `tabulated-list-groups'. Also when this variable is non-nil, +then `outline-minor-mode' is enabled in the Buffer Menu. Then with the +default value of `outline-regexp' you can use Outline minor mode commands +to show/hide groups of buffers. +The default options can group by a mode, and by a root directory of +a project or just `default-directory'." + :type '(choice (const :tag "No grouping" nil) + (function-item :tag "Group by mode" + Buffer-menu-group-by-mode) + (function-item :tag "Group by project root or directory" + Buffer-menu-group-by-root) + (function :tag "Custom function")) + :group 'Buffer-menu + :version "30.1") + (defvar-local Buffer-menu-files-only nil "Non-nil if the current Buffer Menu lists only file buffers. This is set by the prefix argument to `buffer-menu' and related @@ -408,14 +427,12 @@ When called interactively prompt for MARK; RET remove all marks." (interactive "cRemove marks (RET means all):" Buffer-menu-mode) (save-excursion (goto-char (point-min)) - (when (tabulated-list-header-overlay-p) - (forward-line)) (while (not (eobp)) - (let ((xmarks (list (aref (tabulated-list-get-entry) 0) - (aref (tabulated-list-get-entry) 2)))) - (when (or (char-equal mark ?\r) - (member (char-to-string mark) xmarks)) - (Buffer-menu--unmark))) + (when-let ((entry (tabulated-list-get-entry))) + (let ((xmarks (list (aref entry 0) (aref entry 2)))) + (when (or (char-equal mark ?\r) + (member (char-to-string mark) xmarks)) + (Buffer-menu--unmark)))) (forward-line)))) (defun Buffer-menu-unmark-all () @@ -674,7 +691,12 @@ See more at `Buffer-menu-filter-predicate'." (setq Buffer-menu-buffer-list buffer-list) (setq Buffer-menu-filter-predicate filter-predicate) (list-buffers--refresh buffer-list old-buffer) - (tabulated-list-print)) + (tabulated-list-print) + (when tabulated-list-groups + (setq-local outline-minor-mode-cycle t + outline-minor-mode-highlight t + outline-minor-mode-use-buttons 'in-margins) + (outline-minor-mode 1))) buffer)) (defun Buffer-menu-mouse-select (event) @@ -750,7 +772,11 @@ See more at `Buffer-menu-filter-predicate'." `("Mode" ,Buffer-menu-mode-width t) '("File" 1 t))) (setq tabulated-list-use-header-line Buffer-menu-use-header-line) - (setq tabulated-list-entries (nreverse entries))) + (setq tabulated-list-entries (nreverse entries)) + (when Buffer-menu-group-by + (setq tabulated-list-groups + (seq-group-by Buffer-menu-group-by + tabulated-list-entries)))) (tabulated-list-init-header)) (defun tabulated-list-entry-size-> (entry1 entry2) @@ -769,4 +795,14 @@ See more at `Buffer-menu-filter-predicate'." (abbreviate-file-name list-buffers-directory)) (t ""))) +(defun Buffer-menu-group-by-mode (entry) + (concat "* " (aref (cadr entry) 5))) + +(declare-function project-root "project" (project)) +(defun Buffer-menu-group-by-root (entry) + (concat "* " (with-current-buffer (car entry) + (if-let ((project (project-current))) + (project-root project) + default-directory)))) + ;;; buff-menu.el ends here diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 9884a2fc24b..c86e3f9c5df 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -139,6 +139,21 @@ If `tabulated-list-entries' is a function, it is called with no arguments and must return a list of the above form.") (put 'tabulated-list-entries 'permanent-local t) +(defvar-local tabulated-list-groups nil + "Groups displayed in the current Tabulated List buffer. +This should be either a function, or a list. +If a list, each element has the form (GROUP-NAME ENTRIES), +where: + + - GROUP-NAME is a group name as a string, which is displayed + at the top line of each group. + + - ENTRIES is a list described in `tabulated-list-entries'. + +If `tabulated-list-groups' is a function, it is called with no +arguments and must return a list of the above form.") +(put 'tabulated-list-groups 'permanent-local t) + (defvar-local tabulated-list-padding 0 "Number of characters preceding each Tabulated List mode entry. By default, lines are padded with spaces, but you can use the @@ -362,15 +377,17 @@ Do nothing if `tabulated-list--header-string' is nil." (if tabulated-list--header-overlay (move-overlay tabulated-list--header-overlay (point-min) (point)) (setq-local tabulated-list--header-overlay - (make-overlay (point-min) (point)))) - (overlay-put tabulated-list--header-overlay - 'face 'tabulated-list-fake-header)))) + (make-overlay (point-min) (point))) + (overlay-put tabulated-list--header-overlay 'fake-header t) + (overlay-put tabulated-list--header-overlay + 'face 'tabulated-list-fake-header))))) (defsubst tabulated-list-header-overlay-p (&optional pos) "Return non-nil if there is a fake header. Optional arg POS is a buffer position where to look for a fake header; defaults to `point-min'." - (overlays-at (or pos (point-min)))) + (seq-find (lambda (o) (overlay-get o 'fake-header)) + (overlays-at (or pos (point-min))))) (defun tabulated-list-revert (&rest _ignored) "The `revert-buffer-function' for `tabulated-list-mode'. @@ -427,6 +444,9 @@ This sorts the `tabulated-list-entries' list if sorting is specified by `tabulated-list-sort-key'. It then erases the buffer and inserts the entries with `tabulated-list-printer'. +If `tabulated-list-groups' is non-nil, each group of entries +is printed and sorted separately. + Optional argument REMEMBER-POS, if non-nil, means to move point to the entry with the same ID element as the current line. @@ -437,6 +457,9 @@ be removed from entries that haven't changed (see `tabulated-list-put-tag'). Don't use this immediately after changing `tabulated-list-sort-key'." (let ((inhibit-read-only t) + (groups (if (functionp tabulated-list-groups) + (funcall tabulated-list-groups) + tabulated-list-groups)) (entries (if (functionp tabulated-list-entries) (funcall tabulated-list-entries) tabulated-list-entries)) @@ -447,7 +470,14 @@ changing `tabulated-list-sort-key'." (setq saved-col (current-column))) ;; Sort the entries, if necessary. (when sorter - (setq entries (sort entries sorter))) + (if groups + (setq groups + (mapcar (lambda (group) + (cons (car group) (sort (cdr group) sorter))) + groups)) + (setq entries (sort entries sorter)))) + (unless (functionp tabulated-list-groups) + (setq tabulated-list-groups groups)) (unless (functionp tabulated-list-entries) (setq tabulated-list-entries entries)) ;; Without a sorter, we have no way to just update. @@ -459,6 +489,25 @@ changing `tabulated-list-sort-key'." (unless tabulated-list-use-header-line (tabulated-list-print-fake-header))) ;; Finally, print the resulting list. + (if groups + (dolist (group groups) + (insert (car group) ?\n) + (when-let ((saved-pt-new (tabulated-list-print-entries + (cdr group) sorter update entry-id))) + (setq saved-pt saved-pt-new))) + (setq saved-pt (tabulated-list-print-entries + entries sorter update entry-id))) + (when update + (delete-region (point) (point-max))) + (set-buffer-modified-p nil) + ;; If REMEMBER-POS was specified, move to the "old" location. + (if saved-pt + (progn (goto-char saved-pt) + (move-to-column saved-col)) + (goto-char (point-min))))) + +(defun tabulated-list-print-entries (entries sorter update entry-id) + (let (saved-pt) (while entries (let* ((elt (car entries)) (tabulated-list--near-rows @@ -495,14 +544,7 @@ changing `tabulated-list-sort-key'." (forward-line 1) (delete-region old (point)))))) (setq entries (cdr entries))) - (when update - (delete-region (point) (point-max))) - (set-buffer-modified-p nil) - ;; If REMEMBER-POS was specified, move to the "old" location. - (if saved-pt - (progn (goto-char saved-pt) - (move-to-column saved-col)) - (goto-char (point-min))))) + saved-pt)) (defun tabulated-list-print-entry (id cols) "Insert a Tabulated List entry at point. diff --git a/test/lisp/emacs-lisp/tabulated-list-tests.el b/test/lisp/emacs-lisp/tabulated-list-tests.el index 8be2be3139e..e53268b3f14 100644 --- a/test/lisp/emacs-lisp/tabulated-list-tests.el +++ b/test/lisp/emacs-lisp/tabulated-list-tests.el @@ -130,4 +130,45 @@ (should-error (tabulated-list-sort) :type 'user-error) (should-error (tabulated-list-sort 4) :type 'user-error))) +(ert-deftest tabulated-list-groups () + (with-temp-buffer + (tabulated-list-mode) + (setq tabulated-list-groups + (reverse + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) + tabulated-list--test-entries))) + (setq tabulated-list-format tabulated-list--test-format) + (setq tabulated-list-padding 7) + (tabulated-list-init-header) + (tabulated-list-print) + ;; Basic printing. + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + zzzz-game zzzz-game 2113 installed play zzzz in Emacs + mode mode 1128 installed A simple mode for editing Actionscript 3 files +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +")) + ;; Sort and preserve position. + (forward-line 2) + (let ((pos (thing-at-point 'line))) + (tabulated-list-next-column 2) + (tabulated-list-sort) + (should (equal (thing-at-point 'line) pos)) + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + mode mode 1128 installed A simple mode for editing Actionscript 3 files + zzzz-game zzzz-game 2113 installed play zzzz in Emacs +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +"))))) + ;;; tabulated-list-tests.el ends here From 4dd4f145b8528d5a742af4268073c24d629801d8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 29 Feb 2024 20:57:12 +0200 Subject: [PATCH 358/446] ; Improve documentation of last changeset (bug#69305) * etc/NEWS (Example): * doc/lispref/modes.texi (Tabulated List Mode): Improve documentation of 'Buffer-menu-group-by' and 'tabulated-list-groups'. * lisp/buff-menu.el (Buffer-menu-group-by): Doc fix. --- doc/lispref/modes.texi | 3 ++- etc/NEWS | 6 +++--- lisp/buff-menu.el | 17 +++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 7a4a722d595..8bdf596bf9e 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1248,7 +1248,7 @@ above form when called with no arguments. @defvar tabulated-list-groups This buffer-local variable specifies the groups of entries displayed in -the Tabulated List buffer. Its value should be either a list, or a +the Tabulated List buffer. Its value should be either a list or a function. If the value is a list, each list element corresponds to one group, and @@ -1271,6 +1271,7 @@ from @code{tabulated-list-entries}. For example: @end group @end smallexample +@noindent where you can define @code{Buffer-menu-group-by-mode} like this: @smallexample diff --git a/etc/NEWS b/etc/NEWS index 72757622958..df07b2a9d79 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1358,8 +1358,8 @@ chat buffers use by default. --- *** New user option 'Buffer-menu-group-by'. -It splits buffers by groups that are displayed with headings -in Outline minor mode. +It controls how buffers are divided into groups that are displayed with +headings using Outline minor mode. --- *** New command 'Buffer-menu-toggle-internal'. @@ -2077,7 +2077,7 @@ treesitter grammar. +++ ** New buffer-local variable 'tabulated-list-groups'. -It prints and sorts the groups of entries separately. +It controls display and separate sorting of groups of entries. * Changes in Emacs 30.1 on Non-Free Operating Systems diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index 1d52feb5733..ca417290018 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -96,15 +96,16 @@ as it is by default." :version "22.1") (defcustom Buffer-menu-group-by nil - "If non-nil, buffers are grouped by function. -This function takes one argument: a list of entries in the same format -as in `tabulated-list-entries', and should return a list in the format -suitable for `tabulated-list-groups'. Also when this variable is non-nil, -then `outline-minor-mode' is enabled in the Buffer Menu. Then with the -default value of `outline-regexp' you can use Outline minor mode commands -to show/hide groups of buffers. + "If non-nil, a function to call to divide buffer-menu buffers into groups. +This function is called with one argument: a list of entries in the same +format as in `tabulated-list-entries', and should return a list in the +format suitable for `tabulated-list-groups'. Also, when this variable +is non-nil, `outline-minor-mode' is enabled in the Buffer Menu and you +can use Outline minor mode commands to show/hide groups of buffers, +according to the value of `outline-regexp'. The default options can group by a mode, and by a root directory of -a project or just `default-directory'." +a project or just `default-directory'. +If this is nil, buffers are not divided into groups." :type '(choice (const :tag "No grouping" nil) (function-item :tag "Group by mode" Buffer-menu-group-by-mode) From 2549eabc97f191ecea65d88d59cf21e5e0c81be8 Mon Sep 17 00:00:00 2001 From: Dan Jacobson Date: Fri, 1 Mar 2024 12:44:44 +0800 Subject: [PATCH 359/446] Fix typos in vnvni.el. * lisp/leim/quail/vnvni.el ("vietnamese-vni"): Fix typos. (Bug#69485) Copyright-paperwork-exempt: yes --- lisp/leim/quail/vnvni.el | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/lisp/leim/quail/vnvni.el b/lisp/leim/quail/vnvni.el index 59d1a82eb21..ae5941cbfc7 100644 --- a/lisp/leim/quail/vnvni.el +++ b/lisp/leim/quail/vnvni.el @@ -125,8 +125,8 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("A61" ?įŗ¤) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE ("a62" ?įŗ§) ; LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE ("A62" ?įŗ¦) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE - ("a63" ?įŗ©) ; LATIN SMALL LETTER A WITH CIRCUMFLEX AND HO6K ABOVE - ("A63" ?įŗØ) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HO6K ABOVE + ("a63" ?įŗ©) ; LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + ("A63" ?įŗØ) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE ("a64" ?įŗ«) ; LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE ("A64" ?įŗŖ) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE ("a65" ?įŗ­) ; LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW @@ -135,42 +135,42 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("A81" ?įŗ®) ; LATIN CAPITAL LETTER A WITH BREVE AND ACUTE ("a82" ?įŗ±) ; LATIN SMALL LETTER A WITH BREVE AND GRAVE ("A82" ?įŗ°) ; LATIN CAPITAL LETTER A WITH BREVE AND GRAVE - ("a83" ?įŗ³) ; LATIN SMALL LETTER A WITH BREVE AND HO6K ABOVE - ("A83" ?įŗ²) ; LATIN CAPITAL LETTER A WITH BREVE AND HO6K ABOVE + ("a83" ?įŗ³) ; LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + ("A83" ?įŗ²) ; LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE ("a84" ?įŗµ) ; LATIN SMALL LETTER A WITH BREVE AND TILDE ("A84" ?įŗ“) ; LATIN CAPITAL LETTER A WITH BREVE AND TILDE ("a85" ?įŗ·) ; LATIN SMALL LETTER A WITH BREVE AND DOT BELOW ("A85" ?įŗ¶) ; LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW ("e5" ?įŗ¹) ; LATIN SMALL LETTER E WITH DOT BELOW ("E5" ?įŗø) ; LATIN CAPITAL LETTER E WITH DOT BELOW - ("e3" ?įŗ») ; LATIN SMALL LETTER E WITH HO6K ABOVE - ("E3" ?įŗŗ) ; LATIN CAPITAL LETTER E WITH HO6K ABOVE + ("e3" ?įŗ») ; LATIN SMALL LETTER E WITH HOOK ABOVE + ("E3" ?įŗŗ) ; LATIN CAPITAL LETTER E WITH HOOK ABOVE ("e4" ?įŗ½) ; LATIN SMALL LETTER E WITH TILDE ("E4" ?įŗ¼) ; LATIN CAPITAL LETTER E WITH TILDE ("e61" ?įŗæ) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE ("E61" ?įŗ¾) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE ("e62" ?ề) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE ("E62" ?Ề) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE - ("e63" ?ể) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND HO6K ABOVE - ("E63" ?Ể) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HO6K ABOVE + ("e63" ?ể) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + ("E63" ?Ể) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE ("e64" ?į»…) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE ("E64" ?Ễ) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE ("e65" ?ệ) ; LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW ("E65" ?Ệ) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW - ("i3" ?ỉ) ; LATIN SMALL LETTER I WITH HO6K ABOVE - ("I3" ?Ỉ) ; LATIN CAPITAL LETTER I WITH HO6K ABOVE + ("i3" ?ỉ) ; LATIN SMALL LETTER I WITH HOOK ABOVE + ("I3" ?Ỉ) ; LATIN CAPITAL LETTER I WITH HOOK ABOVE ("i5" ?ị) ; LATIN SMALL LETTER I WITH DOT BELOW ("I5" ?Ị) ; LATIN CAPITAL LETTER I WITH DOT BELOW ("o5" ?į») ; LATIN SMALL LETTER O WITH DOT BELOW ("O5" ?Ọ) ; LATIN CAPITAL LETTER O WITH DOT BELOW - ("o3" ?į») ; LATIN SMALL LETTER O WITH HO6K ABOVE - ("O3" ?į»Ž) ; LATIN CAPITAL LETTER O WITH HO6K ABOVE + ("o3" ?į») ; LATIN SMALL LETTER O WITH HOOK ABOVE + ("O3" ?į»Ž) ; LATIN CAPITAL LETTER O WITH HOOK ABOVE ("o61" ?ố) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE ("O61" ?Ố) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE ("o62" ?ồ) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE ("O62" ?į»’) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE - ("o63" ?ổ) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND HO6K ABOVE - ("O63" ?į»”) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HO6K ABOVE + ("o63" ?ổ) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + ("O63" ?į»”) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE ("o64" ?į»—) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE ("O64" ?į»–) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE ("o65" ?į»™) ; LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELO7 @@ -179,22 +179,22 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("O71" ?Ớ) ; LATIN CAPITAL LETTER O WITH HORN AND ACUTE ("o72" ?į») ; LATIN SMALL LETTER O WITH HORN AND GRAVE ("O72" ?Ờ) ; LATIN CAPITAL LETTER O WITH HORN AND GRAVE - ("o73" ?ở) ; LATIN SMALL LETTER O WITH HORN AND HO6K ABOVE - ("O73" ?į»ž) ; LATIN CAPITAL LETTER O WITH HORN AND HO6K ABOVE + ("o73" ?ở) ; LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + ("O73" ?į»ž) ; LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE ("o74" ?į»”) ; LATIN SMALL LETTER O WITH HORN AND TILDE ("O74" ?į» ) ; LATIN CAPITAL LETTER O WITH HORN AND TILDE ("o75" ?ợ) ; LATIN SMALL LETTER O WITH HORN AND DOT BELO7 ("O75" ?Ợ) ; LATIN CAPITAL LETTER O WITH HORN AND DOT BELO7 ("u5" ?Ễ) ; LATIN SMALL LETTER U WITH DOT BELO7 ("U5" ?Ụ) ; LATIN CAPITAL LETTER U WITH DOT BELO7 - ("u3" ?į»§) ; LATIN SMALL LETTER U WITH HO6K ABOVE - ("U3" ?Ủ) ; LATIN CAPITAL LETTER U WITH HO6K ABOVE + ("u3" ?į»§) ; LATIN SMALL LETTER U WITH HOOK ABOVE + ("U3" ?Ủ) ; LATIN CAPITAL LETTER U WITH HOOK ABOVE ("u71" ?ứ) ; LATIN SMALL LETTER U WITH HORN AND ACUTE ("U71" ?Ứ) ; LATIN CAPITAL LETTER U WITH HORN AND ACUTE ("u72" ?ừ) ; LATIN SMALL LETTER U WITH HORN AND GRAVE ("U72" ?Ừ) ; LATIN CAPITAL LETTER U WITH HORN AND GRAVE - ("u73" ?į»­) ; LATIN SMALL LETTER U WITH HORN AND HO6K ABOVE - ("U73" ?Ử) ; LATIN CAPITAL LETTER U WITH HORN AND HO6K ABOVE + ("u73" ?į»­) ; LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + ("U73" ?Ử) ; LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE ("u74" ?ữ) ; LATIN SMALL LETTER U WITH HORN AND TILDE ("U74" ?į»®) ; LATIN CAPITAL LETTER U WITH HORN AND TILDE ("u75" ?į»±) ; LATIN SMALL LETTER U WITH HORN AND DOT BELO7 @@ -203,20 +203,20 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("Y2" ?Ỳ) ; LATIN CAPITAL LETTER Y WITH GRAVE ("y5" ?ỵ) ; LATIN SMALL LETTER Y WITH DOT BELO7 ("Y5" ?ồ) ; LATIN CAPITAL LETTER Y WITH DOT BELO7 - ("y3" ?į»·) ; LATIN SMALL LETTER Y WITH HO6K ABOVE - ("Y3" ?į»¶) ; LATIN CAPITAL LETTER Y WITH HO6K ABOVE + ("y3" ?į»·) ; LATIN SMALL LETTER Y WITH HOOK ABOVE + ("Y3" ?į»¶) ; LATIN CAPITAL LETTER Y WITH HOOK ABOVE ("y4" ?ỹ) ; LATIN SMALL LETTER Y WITH TILDE ("Y4" ?Ỹ) ; LATIN CAPITAL LETTER Y WITH TILDE ("d9" ?đ) ; LATIN SMALL LETTER D WITH STROKE ("D9" ?Đ) ; LATIN CAPITAL LETTER D WITH STROKE ;("$$" ?ā‚«) ; U+20AB DONG SIGN (#### check) - ("a22" ["a22"]) + ("a22" ["a2"]) ("A22" ["A2"]) ("a11" ["a1"]) ("A11" ["A1"]) - ("a66"' ["a6"]) - ("A66"' ["A6"]) + ("a66" ["a6"]) + ("A66" ["A6"]) ("a44" ["a4"]) ("A44" ["A4"]) ("e22" ["e2"]) @@ -248,7 +248,7 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("i44" ["i4"]) ("I44" ["I4"]) ("u44" ["u4"]) - ("U44" ["u4"]) + ("U44" ["U4"]) ("o77" ["o7"]) ("O77" ["O7"]) ("u77" ["u7"]) @@ -283,7 +283,7 @@ and postfix: E66 -> E6, a55 -> a5, etc. ("Y33" ["Y3"]) ("y44" ["y4"]) ("Y44" ["Y4"]) - ("d9" ["d9"]) + ("d99" ["d9"]) ("D99" ["D9"]) ;("$$$" ["$$"]) From 0567f3b817ba25c8e216347cc7118fa7786039d9 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 1 Mar 2024 09:16:38 +0100 Subject: [PATCH 360/446] * Fix compilation warning in 'cl--supertypes-for-typeof-types' * lisp/emacs-lisp/cl-preloaded.el (cl--supertypes-for-typeof-types): Fix warning. --- lisp/emacs-lisp/cl-preloaded.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index fb06b127676..30753bcd5c5 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -99,8 +99,7 @@ the symbols returned by `type-of', and SUPERTYPES is the list of its supertypes from the most specific to least specific.") (defun cl--supertypes-for-typeof-types (type) - (cl-loop with res = () - with agenda = (list type) + (cl-loop with agenda = (list type) while agenda for element = (car agenda) unless (or (eq element t) ;; no t in `cl--typeof-types'. From 4372a056fef90e5927d1a627fe0eb2bb01eb0dfb Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 1 Mar 2024 09:27:22 +0100 Subject: [PATCH 361/446] * doc/lispref/objects.texi (Type Hierarchy): Small improvements --- doc/lispref/objects.texi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index 01f82d56528..9a4c1473d75 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -2501,9 +2501,9 @@ regardless of whether this optimization is in use. @node Type Hierarchy Lisp types are organized in a hierarchy, this means that types can -derive from other types. Objects of a type A (which derives from type -B) inherite all the charateristics of type B. This also means that -every objects of type A is at the same time of type B. +derive from other types. Objects of a type B (which derives from type +A) inherite all the charateristics of type A. This also means that +every objects of type B is at the same time of type A. Every type derives from type @code{t}. @@ -2516,4 +2516,4 @@ follow: @image{type_hierarchy,,,,png} For example type @code{list} derives from (is a special kind of) type -@code{sequence} wich on itself derives from @code{t}. +@code{sequence} which on itself derives from @code{t}. From ae80192d97b8d0e54a9429091cd84190bdbeb49e Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 1 Mar 2024 10:32:32 +0200 Subject: [PATCH 362/446] ; * src/buffer.c (Fmake_indirect_buffer): Doc fix. --- src/buffer.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 2d3e04f78cd..32a05010311 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -774,14 +774,20 @@ DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, BASE-BUFFER should be a live buffer, or the name of an existing buffer. NAME should be a string which is not the name of an existing buffer. + +Interactively, prompt for BASE-BUFFER (offering the current buffer as +the default), and for NAME (offering as default the name of a recently +used buffer). + Optional argument CLONE non-nil means preserve BASE-BUFFER's state, such as major and minor modes, in the indirect buffer. - CLONE nil means the indirect buffer's state is reset to default values. If optional argument INHIBIT-BUFFER-HOOKS is non-nil, the new buffer does not run the hooks `kill-buffer-hook', -`kill-buffer-query-functions', and `buffer-list-update-hook'. */) +`kill-buffer-query-functions', and `buffer-list-update-hook'. + +Interactively, CLONE and INHIBIT-BUFFER-HOOKS are nil. */) (Lisp_Object base_buffer, Lisp_Object name, Lisp_Object clone, Lisp_Object inhibit_buffer_hooks) { From 31a4bec609578afd453caf232f78e275c3a075bc Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 1 Mar 2024 10:52:50 +0200 Subject: [PATCH 363/446] Fix documentation of last change * doc/lispref/objects.texi (Type Hierarchy): Fix wording and markup. * doc/lispref/elisp.texi (Top): Add new node to @detailmenu. --- doc/lispref/elisp.texi | 1 + doc/lispref/objects.texi | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi index ed254795d90..71139db4359 100644 --- a/doc/lispref/elisp.texi +++ b/doc/lispref/elisp.texi @@ -300,6 +300,7 @@ Lisp Data Types * Type Predicates:: Tests related to types. * Equality Predicates:: Tests of equality between any two objects. * Mutability:: Some objects should not be modified. +* Type Hierarchy:: Type Hierarchy of Emacs Lisp objects. Programming Types diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index 9a4c1473d75..dd212ef700c 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -60,7 +60,7 @@ to use these types can be found in later chapters. * Type Predicates:: Tests related to types. * Equality Predicates:: Tests of equality between any two objects. * Mutability:: Some objects should not be modified. -* Type Hierarchy:: Type Hierarchy. +* Type Hierarchy:: Type Hierarchy of Emacs Lisp objects. @end menu @node Printed Representation @@ -2499,11 +2499,13 @@ instances. Lisp programs should be written so that they work regardless of whether this optimization is in use. @node Type Hierarchy +@section Type Hierarchy of Emacs Lisp Objects -Lisp types are organized in a hierarchy, this means that types can -derive from other types. Objects of a type B (which derives from type -A) inherite all the charateristics of type A. This also means that -every objects of type B is at the same time of type A. +Lisp object types are organized in a hierarchy, which means that types +can derive from other types. Objects of type B (which derives from type +A) inherit all the characteristics of type A@. This also means that +every object of type B is at the same time an object of type A from +which it derives. Every type derives from type @code{t}. @@ -2511,9 +2513,10 @@ New types can be defined by the user through @code{defclass} or @code{cl-defstruct}. The Lisp Type Hierarchy for primitive types can be represented as -follow: +follows: -@image{type_hierarchy,,,,png} +@noindent +@image{type_hierarchy,,,,.jpg} For example type @code{list} derives from (is a special kind of) type -@code{sequence} which on itself derives from @code{t}. +@code{sequence} which itself derives from @code{t}. From b2d18ff944ae374fa03579ca2574f1fba8ae2e4b Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Fri, 1 Mar 2024 12:11:07 -0500 Subject: [PATCH 364/446] Verilog-mode update from upstream https://github.com/veripool/verilog-mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/progmodes/verilog-mode.el (verilog-auto-inst) (verilog-auto-inst-param): Remove intended formfeeds. Our ability to detect unintended formfeeds elsewhere outweighs their limited utility here. Contributed by Mattias EngdegĆ„rd. (verilog-at-constraint-p) (verilog-at-struct-mv-p, verilog-at-struct-p, verilog-calc-1) (verilog-in-case-region-p, verilog-in-fork-region-p) (verilog-in-generate-region-p, verilog-set-auto-endcomments): Fix indentation problem when there is a signal named "module_something" (#1861). Cleanup RexEx groupings. (verilog-read-sub-decls-expr): Fix apostrophe parser in AUTOWIRE (#1854) (#1855). (verilog-auto-inst-port): Fix AUTOINST multi-dimensional array [] substitution. Reported by Caleb Begly. (verilog-property-re, verilog-beg-of-statement, verilog-calc-1): Concurrent SVA statement pattern-matching learns 'restrict property' and 'cover sequence' expression for proper indentation around those constructs. This addresses more patterns in IEEE 1800-2017's 'concurrent_sasertion_statement' grammar. (verilog-read-sub-decls-line): Fix `verilog-auto-ignore-concat' with parenthesis signals. Reported by Dmitri Sorkin. (verilog-simplify-range-expression): Fix `verilog-auto-inst-param-value' confusing structure selects. Reported by Mike Bertone. --- lisp/progmodes/verilog-mode.el | 114 ++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 45 deletions(-) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 6081372af33..7af78f2229a 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -9,7 +9,7 @@ ;; Keywords: languages ;; The "Version" is the date followed by the decimal rendition of the Git ;; commit hex. -;; Version: 2023.06.06.141322628 +;; Version: 2024.03.01.121933719 ;; Yoni Rabkin contacted the maintainer of this ;; file on 19/3/2008, and the maintainer agreed that when a bug is @@ -124,7 +124,7 @@ ;; ;; This variable will always hold the version number of the mode -(defconst verilog-mode-version "2023-06-06-86c6984-vpo-GNU" +(defconst verilog-mode-version "2024-03-01-7448f97-vpo-GNU" "Version of this Verilog mode.") (defconst verilog-mode-release-emacs t "If non-nil, this version of Verilog mode was released with Emacs itself.") @@ -2556,11 +2556,13 @@ find the errors." (defconst verilog-assignment-operation-re-2 (concat "\\(.*?\\)" verilog-assignment-operator-re)) +;; Loosely related to IEEE 1800's concurrent_assertion_statement +(defconst verilog-concurrent-assertion-statement-re + "\\(\\<\\(assert\\|assume\\|cover\\|restrict\\)\\>\\s-+\\<\\(property\\|sequence\\)\\>\\)\\|\\(\\\\)") + (defconst verilog-label-re (concat verilog-identifier-sym-re "\\s-*:\\s-*")) (defconst verilog-property-re - (concat "\\(" verilog-label-re "\\)?" - ;; "\\(assert\\|assume\\|cover\\)\\s-+property\\>" - "\\(\\(assert\\|assume\\|cover\\)\\>\\s-+\\\\)\\|\\(assert\\)")) + (concat "\\(" verilog-label-re "\\)?" verilog-concurrent-assertion-statement-re)) (defconst verilog-no-indent-begin-re (eval-when-compile @@ -2715,7 +2717,6 @@ find the errors." "\\(\\\\)\\|" ; 7 "\\(\\\\)\\|" verilog-property-re "\\|" - "\\(\\(" verilog-label-re "\\)?\\\\)\\|" "\\(\\\\)\\|" "\\(\\\\)\\|" "\\(\\\\)\\|" @@ -4843,7 +4844,7 @@ Uses `verilog-scan' cache." (not (or (looking-at "\\<") (forward-word-strictly -1))) ;; stop if we see an assertion (perhaps labeled) (and - (looking-at "\\(\\w+\\W*:\\W*\\)?\\(\\<\\(assert\\|assume\\|cover\\)\\>\\s-+\\\\)\\|\\(\\\\)") + (looking-at (concat "\\(\\w+\\W*:\\W*\\)?" verilog-concurrent-assertion-statement-re)) (progn (setq h (point)) (save-excursion @@ -4970,7 +4971,7 @@ More specifically, point @ in the line foo : @ begin" (while t (verilog-re-search-backward (concat "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\|\\[^:]\\)\\|" - "\\(\\\\)\\>") + "\\(\\\\)") nil 'move) (cond ((match-end 4) @@ -5010,7 +5011,7 @@ More specifically, after a generate and before an endgenerate." (while (and (/= nest 0) (verilog-re-search-backward - "\\<\\(module\\)\\|\\(connectmodule\\)\\|\\(endmodule\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\|\\(if\\)\\|\\(case\\)\\|\\(for\\)\\>" nil 'move) + "\\<\\(?:\\(module\\)\\|\\(connectmodule\\)\\|\\(endmodule\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\|\\(if\\)\\|\\(case\\)\\|\\(for\\)\\)\\>" nil 'move) (cond ((match-end 1) ; module - we have crawled out (throw 'done 1)) @@ -5038,7 +5039,7 @@ More specifically, after a generate and before an endgenerate." (save-excursion (while (and (/= nest 0) - (verilog-re-search-backward "\\<\\(fork\\)\\|\\(join\\(_any\\|_none\\)?\\)\\>" lim 'move) + (verilog-re-search-backward "\\<\\(?:\\(fork\\)\\|\\(join\\(_any\\|_none\\)?\\)\\)\\>" lim 'move) (cond ((match-end 1) ; fork (setq nest (1- nest))) @@ -5335,7 +5336,7 @@ primitive or interface named NAME." (match-end 3) (goto-char there) (let ((nest 0) - (reg "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(assert\\)")) + (reg "\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)\\|\\(\\\\)")) (catch 'skip (while (verilog-re-search-backward reg nil 'move) (cond @@ -6244,7 +6245,7 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)." (match-end 22)) (throw 'continue 'foo)) - ((looking-at "\\") + ((looking-at "\\<\\(?:class\\|struct\\|function\\|task\\)\\>") ;; *sigh* These words have an optional prefix: ;; extern {virtual|protected}? function a(); ;; and we don't want to confuse this with @@ -6268,12 +6269,16 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)." (throw 'nesting 'defun)))) ;; - ((looking-at "\\") + ((looking-at "\\<\\(property\\|sequence\\)\\>") ;; *sigh* - ;; {assert|assume|cover} property (); are complete - ;; and could also be labeled: - foo: assert property - ;; but - ;; property ID () ... needs endproperty + ;; - {assert|assume|cover|restrict} property (); are complete + ;; - cover sequence (); is complete + ;; and could also be labeled: + ;; - foo: assert property + ;; - bar: cover sequence + ;; but: + ;; - property ID () ... needs endproperty + ;; - sequence ID () ... needs endsequence (verilog-beg-of-statement) (if (looking-at verilog-property-re) (throw 'continue 'statement) ; We don't need an endproperty for these @@ -6940,7 +6945,7 @@ Also move point to constraint." (let ( (pt (point)) (pass 0)) (verilog-backward-ws&directives) (verilog-backward-token) - (if (looking-at (concat "\\\\|" verilog-in-constraint-re)) + (if (looking-at (concat "\\<\\(?:constraint\\|coverpoint\\|cross\\|with\\)\\>\\|" verilog-in-constraint-re)) (progn (setq pass 1) (if (looking-at "\\") (progn (verilog-backward-ws&directives) @@ -6981,7 +6986,7 @@ Also move point to constraint." (save-excursion (if (and (equal (char-after) ?\{) (verilog-backward-token)) - (looking-at "\\") + (looking-at "\\<\\(?:struct\\|union\\|packed\\|\\(un\\)?signed\\)\\>") nil))) (defun verilog-at-struct-mv-p () @@ -6989,7 +6994,7 @@ Also move point to constraint." (let ((pt (point))) (if (and (equal (char-after) ?\{) (verilog-backward-token)) - (if (looking-at "\\") + (if (looking-at "\\<\\(?:struct\\|union\\|packed\\|\\(un\\)?signed\\)\\>") (progn (verilog-beg-of-statement) (point)) (progn (goto-char pt) nil)) (progn (goto-char pt) nil)))) @@ -9675,7 +9680,7 @@ Return an array of [outputs inouts inputs wire reg assign const gparam intf]." (cond ;; {..., a, b} requires us to recurse on a,b ;; To support {#{},{#{a,b}} we'll just split everything on [{},] - ((string-match "^\\s-*{\\(.*\\)}\\s-*$" expr) + ((string-match "^\\s-*'?{\\(.*\\)}\\s-*$" expr) (let ((mlst (split-string (match-string 1 expr) "[{},]")) mstr) (while (setq mstr (pop mlst)) @@ -9755,7 +9760,10 @@ Inserts the list of signals found, using submodi to look up each port." ;; We intentionally ignore (non-escaped) signals with .s in them ;; this prevents AUTOWIRE etc from noticing hierarchical sigs. (when port - (cond ((looking-at "[^\n]*AUTONOHOOKUP")) + (cond ((and verilog-auto-ignore-concat + (looking-at "[({]")) + nil) ; {...} or (...) historically ignored with auto-ignore-concat + ((looking-at "[^\n]*AUTONOHOOKUP")) ((looking-at "\\([a-zA-Z_][a-zA-Z_0-9]*\\)\\s-*)") (verilog-read-sub-decls-sig submoddecls par-values comment port @@ -11436,7 +11444,7 @@ This repairs those mis-inserted by an AUTOARG." (while (string-match (concat "\\([[({:*/<>+-]\\)" ; - must be last "(\\<\\([0-9A-Za-z_]+\\))" - "\\([])}:*/<>+-]\\)") + "\\([])}:*/<>.+-]\\)") out) (setq out (replace-match "\\1\\2\\3" nil nil out))) (while (string-match @@ -11531,7 +11539,8 @@ This repairs those mis-inserted by an AUTOARG." ;;(verilog-simplify-range-expression "[(TEST[1])-1:0]") ;;(verilog-simplify-range-expression "[1<<2:8>>2]") ; [4:2] ;;(verilog-simplify-range-expression "[2*4/(4-2) +2+4 <<4 >>2]") -;;(verilog-simplify-range-expression "[WIDTH*2/8-1:0]") +;;(verilog-simplify-range-expression "[WIDTH*2/8-1:0]") ; "[WIDTH*2/8-1:0]" +;;(verilog-simplify-range-expression "[(FOO).size:0]") ; "[FOO.size:0]" (defun verilog-clog2 (value) "Compute $clog2 - ceiling log2 of VALUE." @@ -12247,18 +12256,12 @@ If PAR-VALUES replace final strings with these parameter values." (vl-memory (verilog-sig-memory port-st)) (vl-mbits (if (verilog-sig-multidim port-st) (verilog-sig-multidim-string port-st) "")) - (vl-bits (if (or (eq verilog-auto-inst-vector t) - (and (eq verilog-auto-inst-vector `unsigned) - (not (verilog-sig-signed port-st))) - (not (assoc port (verilog-decls-get-signals moddecls))) - (not (equal (verilog-sig-bits port-st) - (verilog-sig-bits - (assoc port (verilog-decls-get-signals moddecls)))))) - (or (verilog-sig-bits port-st) "") - "")) + (vl-bits (or (verilog-sig-bits port-st) "")) (case-fold-search nil) (check-values par-values) - tpl-net dflt-bits) + auto-inst-vector + auto-inst-vector-tpl + tpl-net dflt-bits) ;; Replace parameters in bit-width (when (and check-values (not (equal vl-bits ""))) @@ -12281,6 +12284,16 @@ If PAR-VALUES replace final strings with these parameter values." vl-mbits (verilog-simplify-range-expression vl-mbits) vl-memory (when vl-memory (verilog-simplify-range-expression vl-memory)) vl-width (verilog-make-width-expression vl-bits))) ; Not in the loop for speed + (setq auto-inst-vector + (if (or (eq verilog-auto-inst-vector t) + (and (eq verilog-auto-inst-vector `unsigned) + (not (verilog-sig-signed port-st))) + (not (assoc port (verilog-decls-get-signals moddecls))) + (not (equal (verilog-sig-bits port-st) + (verilog-sig-bits + (assoc port (verilog-decls-get-signals moddecls)))))) + vl-bits + "")) ;; Default net value if not found (setq dflt-bits (if (or (and (verilog-sig-bits port-st) (verilog-sig-multidim port-st)) @@ -12290,7 +12303,7 @@ If PAR-VALUES replace final strings with these parameter values." (if vl-memory "." "") (if vl-memory vl-memory "") "*/") - (concat vl-bits)) + (concat auto-inst-vector)) tpl-net (concat port (if (and vl-modport ;; .modport cannot be added if attachment is @@ -12329,10 +12342,21 @@ If PAR-VALUES replace final strings with these parameter values." (if (numberp value) (setq value (number-to-string value))) value)) (substring tpl-net (match-end 0)))))) + ;; Get range based off template net + (setq auto-inst-vector-tpl + (if (or (eq verilog-auto-inst-vector t) + (and (eq verilog-auto-inst-vector `unsigned) + (not (verilog-sig-signed port-st))) + (not (assoc tpl-net (verilog-decls-get-signals moddecls))) + (not (equal (verilog-sig-bits port-st) + (verilog-sig-bits + (assoc tpl-net (verilog-decls-get-signals moddecls)))))) + vl-bits + "")) ;; Replace @ and [] magic variables in final output (setq tpl-net (verilog-string-replace-matches "@" tpl-num nil nil tpl-net)) (setq tpl-net (verilog-string-replace-matches "\\[\\]\\[\\]" dflt-bits nil nil tpl-net)) - (setq tpl-net (verilog-string-replace-matches "\\[\\]" vl-bits nil nil tpl-net))) + (setq tpl-net (verilog-string-replace-matches "\\[\\]" auto-inst-vector-tpl nil nil tpl-net))) ;; Insert it (when (or tpl-ass (not verilog-auto-inst-template-required)) (verilog--auto-inst-first indent-pt section) @@ -12502,7 +12526,7 @@ Typing \\[verilog-auto] will make this into: endmodule Where the list of inputs and outputs came from the inst module. - + Exceptions: Unless you are instantiating a module multiple times, or the module is @@ -12527,7 +12551,7 @@ Exceptions: // Outputs .o (o[31:0])); - + Templates: For multiple instantiations based upon a single template, create a @@ -12598,7 +12622,7 @@ Templates: .ptl_bus (ptl_busnew[3:0]), .... - + Multiple Module Templates: The same template lines can be applied to multiple modules with @@ -12613,7 +12637,7 @@ Multiple Module Templates: */ Note there is only one AUTO_TEMPLATE opening parenthesis. - + @ Templates: It is common to instantiate a cell multiple times, so templates make it @@ -12678,7 +12702,7 @@ Multiple Module Templates: .ptl_mapvalidx (BAR_ptl_mapvalid), .ptl_mapvalidp1x (ptl_mapvalid_BAR)); - + Regexp Templates: A template entry of the form @@ -12702,7 +12726,7 @@ Regexp Templates: subscript: .\\(.*\\)_l (\\1_[]), - + Lisp Templates: First any regular expression template is expanded. @@ -12747,7 +12771,7 @@ Lisp Templates: After the evaluation is completed, @ substitution and [] substitution occur. - + Ignoring Hookup: AUTOWIRE and related AUTOs will read the signals created by a template. @@ -12756,7 +12780,7 @@ Ignoring Hookup: .pci_req_l (pci_req_not_to_wire), //AUTONOHOOKUP - + For more information see the \\[verilog-faq] and forums at URL `https://www.veripool.org'." (save-excursion @@ -12910,7 +12934,7 @@ Typing \\[verilog-auto] will make this into: endmodule Where the list of parameter connections come from the inst module. - + Templates: You can customize the parameter connections using AUTO_TEMPLATEs, From 8b96503b6e8514f1f9f92895a0707c78b1bbd1fd Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 1 Mar 2024 18:56:02 +0100 Subject: [PATCH 365/446] * lisp/emacs-lisp/cl-preloaded.el (cl--typeof-types): Define as var. --- lisp/emacs-lisp/cl-preloaded.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 30753bcd5c5..b2b921192ff 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -92,7 +92,7 @@ Each sublist is in the form (TYPE . DIRECT_SUBTYPES)" for child in children do (cl-pushnew parent (gethash child cl--direct-supertypes-of-type)))) -(defconst cl--typeof-types nil +(defvar cl--typeof-types nil "Alist of supertypes. Each element has the form (TYPE . SUPERTYPES) where TYPE is one of the symbols returned by `type-of', and SUPERTYPES is the list of its From 5e20b114ef32d504f4429fd35ecd0d5dcf3bd8db Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 2 Mar 2024 14:04:56 +0800 Subject: [PATCH 366/446] Implement dead key combination on Android * src/android.c (android_init_key_character_map) (android_get_dead_char): New functions. (android_wc_lookup_string): New argument COMPOSE_STATE. Ignore key events with the COMBINING_ACCENT flag set while recording their character values there, and combine such characters with the key event when processing a subsequent key event. * src/androidgui.h (struct android_compose_status): New structure. * src/androidterm.c (handle_one_android_event): Port dead key combination code from X. (bug#69321) --- src/android.c | 122 ++++++++++++++++++++++++++++++++++++++++++++-- src/androidgui.h | 12 ++++- src/androidterm.c | 19 +++++++- 3 files changed, 148 insertions(+), 5 deletions(-) diff --git a/src/android.c b/src/android.c index 41481afa475..eb6981093be 100644 --- a/src/android.c +++ b/src/android.c @@ -123,6 +123,12 @@ struct android_emacs_cursor jmethodID constructor; }; +struct android_key_character_map +{ + jclass class; + jmethodID get_dead_char; +}; + /* The API level of the current device. */ static int android_api_level; @@ -203,6 +209,9 @@ static struct android_emacs_window window_class; /* Various methods associated with the EmacsCursor class. */ static struct android_emacs_cursor cursor_class; +/* Various methods associated with the KeyCharacterMap class. */ +static struct android_key_character_map key_character_map_class; + /* The time at which Emacs was installed, which also supplies the mtime of asset files. */ struct timespec emacs_installation_time; @@ -1865,6 +1874,32 @@ android_init_emacs_cursor (void) #undef FIND_METHOD } +static void +android_init_key_character_map (void) +{ + jclass old; + + key_character_map_class.class + = (*android_java_env)->FindClass (android_java_env, + "android/view/KeyCharacterMap"); + eassert (key_character_map_class.class); + + old = key_character_map_class.class; + key_character_map_class.class + = (jclass) (*android_java_env)->NewGlobalRef (android_java_env, + (jobject) old); + ANDROID_DELETE_LOCAL_REF (old); + + if (!key_character_map_class.class) + emacs_abort (); + + key_character_map_class.get_dead_char + = (*android_java_env)->GetStaticMethodID (android_java_env, + key_character_map_class.class, + "getDeadChar", "(II)I"); + eassert (key_character_map_class.get_dead_char); +} + JNIEXPORT void JNICALL NATIVE_NAME (initEmacs) (JNIEnv *env, jobject object, jarray argv, jobject dump_file_object) @@ -1913,6 +1948,7 @@ NATIVE_NAME (initEmacs) (JNIEnv *env, jobject object, jarray argv, android_init_emacs_drawable (); android_init_emacs_window (); android_init_emacs_cursor (); + android_init_key_character_map (); /* Set HOME to the app data directory. */ setenv ("HOME", android_files_dir, 1); @@ -5376,11 +5412,51 @@ android_translate_coordinates (android_window src, int x, ANDROID_DELETE_LOCAL_REF (coordinates); } +/* Return the character produced by combining the diacritic character + DCHAR with the key-producing character C in *VALUE. Value is 1 if + there is no character for this combination, 0 otherwise. */ + +static int +android_get_dead_char (unsigned int dchar, unsigned int c, + unsigned int *value) +{ + jmethodID method; + jclass class; + jint result; + + /* Call getDeadChar. */ + class = key_character_map_class.class; + method = key_character_map_class.get_dead_char; + result = (*android_java_env)->CallStaticIntMethod (android_java_env, + class, method, + (jint) dchar, + (jint) c); + + if (result) + { + *value = result; + return 0; + } + + return 1; +} + +/* Return a Unicode string in BUFFER_RETURN, a buffer of size + WCHARS_BUFFER, from the key press event EVENT, much like + XmbLookupString. If EVENT represents a key press without a + corresponding Unicode character, return its keysym in *KEYSYM_RETURN. + Return the action taken in *STATUS_RETURN. + + COMPOSE_STATUS, if non-NULL, should point to a structure for + temporary information to be stored in during dead key + composition. */ + int android_wc_lookup_string (android_key_pressed_event *event, wchar_t *buffer_return, int wchars_buffer, int *keysym_return, - enum android_lookup_status *status_return) + enum android_lookup_status *status_return, + struct android_compose_status *compose_status) { enum android_lookup_status status; int rc; @@ -5389,6 +5465,7 @@ android_wc_lookup_string (android_key_pressed_event *event, jsize size; size_t i; JNIEnv *env; + unsigned int unicode_char; env = android_java_env; status = ANDROID_LOOKUP_NONE; @@ -5402,6 +5479,13 @@ android_wc_lookup_string (android_key_pressed_event *event, { if (event->unicode_char) { + /* KeyCharacterMap.COMBINING_ACCENT. */ + if ((event->unicode_char & 0x80000000) && compose_status) + goto dead_key; + + /* Remove combining accent bits. */ + unicode_char = event->unicode_char & ~0x80000000; + if (wchars_buffer < 1) { *status_return = ANDROID_BUFFER_OVERFLOW; @@ -5409,7 +5493,31 @@ android_wc_lookup_string (android_key_pressed_event *event, } else { - buffer_return[0] = event->unicode_char; + /* If COMPOSE_STATUS holds a diacritic mark unicode_char + ought to be combined with, and this combination is + valid, return the result alone with no keysym. */ + + if (compose_status + && compose_status->chars_matched + && !android_get_dead_char (compose_status->accent, + unicode_char, + &unicode_char)) + { + buffer_return[0] = unicode_char; + *status_return = ANDROID_LOOKUP_CHARS; + compose_status->chars_matched = 0; + return 1; + } + else if (compose_status && compose_status->chars_matched) + { + /* If the combination is valid the compose status must + be reset and no character returned. */ + compose_status->chars_matched = 0; + status = ANDROID_LOOKUP_NONE; + return 0; + } + + buffer_return[0] = unicode_char; status = ANDROID_LOOKUP_CHARS; rc = 1; } @@ -5426,7 +5534,6 @@ android_wc_lookup_string (android_key_pressed_event *event, } *status_return = status; - return rc; } @@ -5482,6 +5589,15 @@ android_wc_lookup_string (android_key_pressed_event *event, *status_return = status; return rc; + + dead_key: + /* event->unicode_char is a dead key, which are diacritic marks that + should not be directly inserted but instead be combined with a + subsequent character before insertion. */ + *status_return = ANDROID_LOOKUP_NONE; + compose_status->chars_matched = 1; + compose_status->accent = event->unicode_char & ~0x80000000; + return 0; } diff --git a/src/androidgui.h b/src/androidgui.h index 89317581191..73b60c483d3 100644 --- a/src/androidgui.h +++ b/src/androidgui.h @@ -612,6 +612,15 @@ struct android_window_changes enum android_stack_mode stack_mode; }; +struct android_compose_status +{ + /* Accent character to be combined with another. */ + unsigned int accent; + + /* Number of characters matched. */ + int chars_matched; +}; + extern int android_pending (void); extern void android_next_event (union android_event *); extern bool android_check_if_event (union android_event *, @@ -707,7 +716,8 @@ extern void android_translate_coordinates (android_window, int, int, int *, int *); extern int android_wc_lookup_string (android_key_pressed_event *, wchar_t *, int, int *, - enum android_lookup_status *); + enum android_lookup_status *, + struct android_compose_status *); extern void android_recreate_activity (android_window); extern void android_update_ic (android_window, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); diff --git a/src/androidterm.c b/src/androidterm.c index 2bd2b45743d..baf26abe322 100644 --- a/src/androidterm.c +++ b/src/androidterm.c @@ -811,6 +811,7 @@ handle_one_android_event (struct android_display_info *dpyinfo, int keysym; ptrdiff_t nchars, i; struct window *w; + static struct android_compose_status compose_status; /* It is okay for this to not resemble handle_one_xevent so much. Differences in event handling code are much less nasty than @@ -947,6 +948,14 @@ handle_one_android_event (struct android_display_info *dpyinfo, extra_keyboard_modifiers); modifiers = event->xkey.state; + /* In case Meta is ComposeCharacter, clear its status. According + to Markus Ehrnsperger + Markus.Ehrnsperger@lehrstuhl-bross.physik.uni-muenchen.de this + enables ComposeCharacter to work whether or not it is combined + with Meta. */ + if (modifiers & ANDROID_ALT_MASK) + memset (&compose_status, 0, sizeof (compose_status)); + /* Common for all keysym input events. */ XSETFRAME (inev.ie.frame_or_window, any); inev.ie.modifiers @@ -960,7 +969,8 @@ handle_one_android_event (struct android_display_info *dpyinfo, nchars = android_wc_lookup_string (&event->xkey, copy_bufptr, copy_bufsiz, &keysym, - &status_return); + &status_return, + &compose_status); /* android_lookup_string can't be called twice, so there's no way to recover from buffer overflow. */ @@ -1000,6 +1010,13 @@ handle_one_android_event (struct android_display_info *dpyinfo, } } + /* If a compose sequence is in progress, we break here. + Otherwise, chars_matched is always 0. */ + if (compose_status.chars_matched > 0 && nchars == 0) + break; + + memset (&compose_status, 0, sizeof (compose_status)); + if (nchars == 1 && copy_bufptr[0] >= 32) { /* Deal with characters. */ From f89cb6b63612a3dce113fa454fece82953fb5d5c Mon Sep 17 00:00:00 2001 From: Kazuhiro Ito Date: Sat, 2 Mar 2024 08:44:56 +0900 Subject: [PATCH 367/446] Fix Japanese language environment on Cygwin and MS-Windows * lisp/language/japan-util.el (setup-japanese-environment-internal): Prefer UTF-8 for Cygwin and other Posix hosts; prefer Codepage 932 on DOS/Windows. (Bug#69493) --- lisp/language/japan-util.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/language/japan-util.el b/lisp/language/japan-util.el index 93e8ab24971..b058eab7029 100644 --- a/lisp/language/japan-util.el +++ b/lisp/language/japan-util.el @@ -29,8 +29,8 @@ ;;;###autoload (defun setup-japanese-environment-internal () - (prefer-coding-system (if (memq system-type '(windows-nt ms-dos cygwin)) - 'japanese-shift-jis + (prefer-coding-system (if (memq system-type '(windows-nt ms-dos)) + 'japanese-cp932 'utf-8)) (use-cjk-char-width-table 'ja_JP)) From e581c111165c4d138b72b6493717ed22fcb68a8e Mon Sep 17 00:00:00 2001 From: Kazuhiro Ito Date: Sat, 2 Mar 2024 08:49:15 +0900 Subject: [PATCH 368/446] * lisp/language/japanese.el (map): Fix typo (bug#69494). --- lisp/language/japanese.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/language/japanese.el b/lisp/language/japanese.el index dd65409c839..8957d1a49af 100644 --- a/lisp/language/japanese.el +++ b/lisp/language/japanese.el @@ -79,7 +79,7 @@ (#x00A2 . #xFFE0) ; CENT SIGN FULLWIDTH CENT SIGN (#x00A3 . #xFFE1) ; POUND SIGN FULLWIDTH POUND SIGN (#x00AC . #xFFE2) ; NOT SIGN FULLWIDTH NOT SIGN - (#x00A6 . #xFFE4) ; BROKEN LINE FULLWIDTH BROKEN LINE + (#x00A6 . #xFFE4) ; BROKEN BAR FULLWIDTH BROKEN BAR ))) (define-translation-table 'japanese-ucs-jis-to-cp932-map map) (setq map (mapcar (lambda (x) (cons (cdr x) (car x))) map)) From c3dc64a1071acc1f622094f91d8f046afedb7b45 Mon Sep 17 00:00:00 2001 From: Yoshiku Onu Date: Thu, 29 Feb 2024 13:29:44 +0500 Subject: [PATCH 369/446] Add new input method "english-colemak" * lisp/leim/quail/latin-post.el ("english-colemak"): New input method. (Bug#69471) * etc/NEWS: Announce it. Copyright-paperwork-exempt: yes --- etc/NEWS | 4 +++ lisp/leim/quail/latin-post.el | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index df07b2a9d79..792e178c3b6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -432,6 +432,10 @@ functions in CJK locales. *** New input methods for the Urdu, Pashto, and Sindhi languages. These languages are spoken in Pakistan and Afghanistan. +--- +*** New input method "english-colemak". +This input method supports the Colemak keyboard layout. + *** Additional 'C-x 8' key translations for "Ʀ" and "Ɔ". These characters can now be input with 'C-x 8 a e' and 'C-x 8 A E', respectively, in addition to the existing translations 'C-x 8 / e' and diff --git a/lisp/leim/quail/latin-post.el b/lisp/leim/quail/latin-post.el index 0d2c1888426..25e7c4a64a8 100644 --- a/lisp/leim/quail/latin-post.el +++ b/lisp/leim/quail/latin-post.el @@ -1616,6 +1616,7 @@ Doubling the postfix separates the letter and postfix: e.g. a^^ -> a^ ;; Italian (itln) ;; Spanish (spnsh) ;; Dvorak (dvorak) +;; Colemak (colemak) ;; ;;; 92.12.15 created for Mule Ver.0.9.6 by Takahashi N. ;;; 92.12.29 modified by Takahashi N. @@ -2224,6 +2225,55 @@ Dead accent is right to Ʀ." nil t t t t nil nil nil nil nil t) ("?" ?Z) ) +;; +(quail-define-package + "english-colemak" "English" "CM@" t + "English (ASCII) input method simulating Colemak keyboard" + nil t t t t nil nil nil nil nil t) + +;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ `~ +;; qQ wW fF pP gG jJ lL uU yY ;: [{ ]} +;; aA rR sS tT dD hH nN eE iI oO '" \| +;; zZ xX cC vV bB kK mM ,< .> /? + +(quail-define-rules + ("e" ?f) + ("r" ?p) + ("t" ?g) + ("y" ?j) + ("u" ?l) + ("i" ?u) + ("o" ?y) + ("p" ?\;) + ("s" ?r) + ("d" ?s) + ("f" ?t) + ("g" ?d) + ("j" ?n) + ("k" ?e) + ("l" ?i) + (";" ?o) + ("n" ?k) + + ("E" ?F) + ("R" ?P) + ("T" ?G) + ("Y" ?J) + ("U" ?L) + ("I" ?U) + ("O" ?Y) + ("P" ?\:) + ("S" ?R) + ("D" ?S) + ("F" ?T) + ("G" ?D) + ("J" ?N) + ("K" ?E) + ("L" ?I) + (":" ?O) + ("N" ?K) + ) + (quail-define-package "latin-postfix" "Latin" "L<" t "Latin character input method with postfix modifiers. From 51b560b45b0653e126d17cfe278aa46e6604c867 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 2 Mar 2024 19:12:29 +0200 Subject: [PATCH 370/446] * doc/lispref/modes.texi (Tabulated List Mode): Unindent example. --- doc/lispref/modes.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 8bdf596bf9e..a2e8f42cf1d 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1265,9 +1265,9 @@ from @code{tabulated-list-entries}. For example: @smallexample @group - (setq tabulated-list-groups - (seq-group-by 'Buffer-menu-group-by-mode - tabulated-list-entries)) +(setq tabulated-list-groups + (seq-group-by 'Buffer-menu-group-by-mode + tabulated-list-entries)) @end group @end smallexample From 7b4c4e68464272cc7941cb53b4421cf0e3d3c3cd Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 2 Mar 2024 19:15:14 +0200 Subject: [PATCH 371/446] * lisp/buff-menu.el (Buffer-menu-marked-buffers): Add save-excursion. --- lisp/buff-menu.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index ca417290018..ec5337e3fda 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -556,15 +556,16 @@ in the selected frame, and will remove any marks." (defun Buffer-menu-marked-buffers (&optional unmark) "Return the list of buffers marked with `Buffer-menu-mark'. If UNMARK is non-nil, unmark them." - (let (buffers) - (Buffer-menu-beginning) - (while (re-search-forward "^>" nil t) - (let ((buffer (Buffer-menu-buffer))) - (if (and buffer unmark) - (tabulated-list-set-col 0 " " t)) - (if (buffer-live-p buffer) - (push buffer buffers)))) - (nreverse buffers))) + (save-excursion + (let (buffers) + (Buffer-menu-beginning) + (while (re-search-forward "^>" nil t) + (let ((buffer (Buffer-menu-buffer))) + (if (and buffer unmark) + (tabulated-list-set-col 0 " " t)) + (if (buffer-live-p buffer) + (push buffer buffers)))) + (nreverse buffers)))) (defun Buffer-menu-isearch-buffers () "Search for a string through all marked buffers using Isearch." From ebab7276139888266ae0f27bd3b2874e2ed8c077 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 2 Mar 2024 19:22:30 +0200 Subject: [PATCH 372/446] * lisp/replace.el (perform-replace): Accept default bindings in lookup-key. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set ACCEPT-DEFAULT arg of lookup-key to t (bug#69342). This will allow the users to ignore unbound keys with ā€˜(define-key query-replace-map [t] 'ignore)’. --- lisp/replace.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/replace.el b/lisp/replace.el index fa460a16063..49e7c85c487 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -2916,7 +2916,7 @@ characters." ;; If last typed key in previous call of multi-buffer perform-replace ;; was `automatic-all', don't ask more questions in next files - (when (eq (lookup-key map (vector last-input-event)) 'automatic-all) + (when (eq (lookup-key map (vector last-input-event) t) 'automatic-all) (setq query-flag nil multi-buffer t)) (cond @@ -3100,7 +3100,7 @@ characters." ;; read-event that clobbers the match data. (set-match-data real-match-data) (setq key (vector key)) - (setq def (lookup-key map key)) + (setq def (lookup-key map key t)) ;; Restore the match data while we process the command. (cond ((eq def 'help) (let ((display-buffer-overriding-action From 5f543fb4b2f24639c7a6215991b14fca24daf194 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sat, 2 Mar 2024 19:31:07 +0200 Subject: [PATCH 373/446] * lisp/net/dictionary.el: Better handling of messages and errors. (dictionary-do-search, dictionary-do-matching): Insert formatted messages to the top of the output buffer instead of displaying transient messages in the echo area (bug#69312). (dictionary-do-matching, dictionary-lookup-definition) (dictionary-popup-matching-words): Use 'user-error' instead of 'error' for non-technical errors. --- lisp/net/dictionary.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el index 1981b757017..e8ac9b679a0 100644 --- a/lisp/net/dictionary.el +++ b/lisp/net/dictionary.el @@ -787,7 +787,7 @@ FUNCTION is the callback which is called for each search result." Optional argument NOMATCHING controls whether to suppress the display of matching words." - (message "Searching for %s in %s" word dictionary) + (insert (format-message "Searching for `%s' in `%s'\n" word dictionary)) (dictionary-send-command (concat "define " (dictionary-encode-charset dictionary "") " \"" @@ -799,13 +799,13 @@ of matching words." (if (dictionary-check-reply reply 552) (progn (unless nomatching - (insert "Word not found") + (insert (format-message "Word `%s' not found\n" word)) (dictionary-do-matching word dictionary "." (lambda (reply) - (insert ", maybe you are looking for one of these words\n\n") + (insert "Maybe you are looking for one of these words\n") (dictionary-display-only-match-result reply))) (dictionary-post-buffer))) (if (dictionary-check-reply reply 550) @@ -1128,8 +1128,8 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." (defun dictionary-do-matching (word dictionary strategy function) "Search for WORD with STRATEGY in DICTIONARY and display them with FUNCTION." - (message "Lookup matching words for %s in %s using %s" - word dictionary strategy) + (insert (format-message "Lookup matching words for `%s' in `%s' using `%s'\n" + word dictionary strategy)) (dictionary-send-command (concat "match " (dictionary-encode-charset dictionary "") " " (dictionary-encode-charset strategy "") " \"" @@ -1141,10 +1141,13 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." (if (dictionary-check-reply reply 551) (error "Strategy \"%s\" is invalid" strategy)) (if (dictionary-check-reply reply 552) - (error (concat - "No match for \"%s\" with strategy \"%s\" in " - "dictionary \"%s\".") - word strategy dictionary)) + (let ((errmsg (format-message + (concat + "No match for `%s' with strategy `%s' in " + "dictionary `%s'.") + word strategy dictionary))) + (insert errmsg "\n") + (user-error errmsg))) (unless (dictionary-check-reply reply 152) (error "Unknown server answer: %s" (dictionary-reply reply))) (funcall function reply))) @@ -1271,7 +1274,7 @@ prompt for DICTIONARY." (interactive) (let ((word (current-word))) (unless word - (error "No word at point")) + (user-error "No word at point")) (dictionary-new-search (cons word dictionary-default-dictionary)))) (defun dictionary-previous () @@ -1311,7 +1314,8 @@ prompt for DICTIONARY." (defun dictionary-popup-matching-words (&optional word) "Display entries matching WORD or the current word if not given." (interactive) - (dictionary-do-matching (or word (current-word) (error "Nothing to search for")) + (dictionary-do-matching (or word (current-word) + (user-error "Nothing to search for")) dictionary-default-dictionary dictionary-default-popup-strategy 'dictionary-process-popup-replies)) From 7f8717c6fd3e19b41048ce9a391d59540886cdee Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Sat, 2 Mar 2024 18:07:36 -0800 Subject: [PATCH 374/446] Use funcall on function values in gnus-agent.el See bug#68931 * lisp/gnus/gnus-agent.el (gnus-category-make-function-1): Don't just pass function values in to be byte compiled, wrap them in funcall first. --- lisp/gnus/gnus-agent.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el index 1726b806913..0928b179787 100644 --- a/lisp/gnus/gnus-agent.el +++ b/lisp/gnus/gnus-agent.el @@ -2920,8 +2920,9 @@ The following commands are available: ;; Functions are just returned as is. ((or (symbolp predicate) (functionp predicate)) - `(,(or (cdr (assq predicate gnus-category-predicate-alist)) - predicate))) + (let ((fun (or (cdr (assq predicate gnus-category-predicate-alist)) + predicate))) + (if (symbolp fun) `(,fun) `(funcall ',fun)))) ;; More complex predicate. ((consp predicate) `(,(cond From 8d11b7e4275affdf66f28ec4a719fc8124252a3d Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 3 Mar 2024 16:33:53 +0100 Subject: [PATCH 375/446] * Fix 'cl--typeof-types' computation * lisp/emacs-lisp/cl-preloaded.el (cl--supertypes-lane) (cl--supertypes-lanes-res): Define vars. (cl--supertypes-for-typeof-types-rec): Define function. (cl--supertypes-for-typeof-types): Reimplement. --- lisp/emacs-lisp/cl-preloaded.el | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index b2b921192ff..512cf31ead5 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -98,17 +98,24 @@ Each element has the form (TYPE . SUPERTYPES) where TYPE is one of the symbols returned by `type-of', and SUPERTYPES is the list of its supertypes from the most specific to least specific.") +(defvar cl--supertypes-lane nil) +(defvar cl--supertypes-lanes-res nil) + +(defun cl--supertypes-for-typeof-types-rec (type) + ;; Walk recursively the DAG upwards, when the top is reached collect + ;; the current lane in `cl--supertypes-lanes-res'. + (push type cl--supertypes-lane) + (if-let ((parents (gethash type cl--direct-supertypes-of-type))) + (dolist (parent parents) + (cl--supertypes-for-typeof-types-rec parent)) + (push (reverse (cdr cl--supertypes-lane)) ;; Don't include `t'. + cl--supertypes-lanes-res )) + (pop cl--supertypes-lane)) + (defun cl--supertypes-for-typeof-types (type) - (cl-loop with agenda = (list type) - while agenda - for element = (car agenda) - unless (or (eq element t) ;; no t in `cl--typeof-types'. - (memq element res)) - append (list element) into res - do (cl-loop for c in (gethash element cl--direct-supertypes-of-type) - do (setq agenda (append agenda (list c)))) - do (setq agenda (cdr agenda)) - finally (cl-return res))) + (let (cl--supertypes-lane cl--supertypes-lanes-res) + (cl--supertypes-for-typeof-types-rec type) + (merge-ordered-lists cl--supertypes-lanes-res))) (maphash (lambda (type _) (push (cl--supertypes-for-typeof-types type) cl--typeof-types)) From f677b4499964c9449d760c4c6e60130b103ed5a8 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sun, 3 Mar 2024 16:58:25 +0100 Subject: [PATCH 376/446] * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-test-62): Revert change. --- test/lisp/emacs-lisp/comp-cstr-tests.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/lisp/emacs-lisp/comp-cstr-tests.el b/test/lisp/emacs-lisp/comp-cstr-tests.el index c3a7092819d..955a99ced57 100644 --- a/test/lisp/emacs-lisp/comp-cstr-tests.el +++ b/test/lisp/emacs-lisp/comp-cstr-tests.el @@ -169,8 +169,8 @@ The arg is an alist of: type specifier -> expected type specifier." ((and symbol (not symbol)) . nil) ;; 61 ((and atom (not symbol)) . atom) - ;; 62 - ((and atom (not string)) . (or array atom)) + ;; 62 Conservative FIXME + ((and atom (not string)) . (or array sequence atom)) ;; 63 Conservative ((and symbol (not (member foo))) . symbol) ;; 64 Conservative From 23c984a7dea950e15b969fe5b7ca0395315f207a Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 3 Mar 2024 18:58:47 +0200 Subject: [PATCH 377/446] * lisp/net/dictionary.el (dictionary-new-matching): Add dictionary-pre-buffer. This is necessary to prepare the dictionary buffer for further processing that also includes setting buffer-read-only to nil to be able to insert text. (bug#69312) --- lisp/net/dictionary.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el index e8ac9b679a0..e9e6b1292b5 100644 --- a/lisp/net/dictionary.el +++ b/lisp/net/dictionary.el @@ -1118,6 +1118,7 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." "Run a new matching search on WORD." (dictionary-ensure-buffer) (dictionary-store-positions) + (dictionary-pre-buffer) (dictionary-do-matching word dictionary-default-dictionary dictionary-default-strategy 'dictionary-display-match-result) From db7b87867b3002d72444f06110e3625aa8de680e Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 3 Mar 2024 19:49:36 +0200 Subject: [PATCH 378/446] * lisp/net/dictionary.el (dictionary-display-match-result): More fixes. Remove 'dictionary-pre-buffer' that was moved to 'dictionary-new-matching' in the previous commit (bug#69312). --- lisp/net/dictionary.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el index e9e6b1292b5..7967c650999 100644 --- a/lisp/net/dictionary.el +++ b/lisp/net/dictionary.el @@ -1176,8 +1176,6 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." (defun dictionary-display-match-result (reply) "Display the results in REPLY from a match operation." - (dictionary-pre-buffer) - (let ((number (nth 1 (dictionary-reply-list reply))) (list (dictionary-simple-split-string (dictionary-read-answer) "\n+"))) (insert number " matching word" (if (equal number "1") "" "s") From 5254c582efb3e7171e955dde653e7530d2d3ffef Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 2 Mar 2024 14:48:29 -0500 Subject: [PATCH 379/446] ox-texinfo:: Require only TEXINFO_DIR_CATEGORY Until now @dircategory/@direntry entries were added only if both TEXINFO_DIR_CATEGORY and TEXINFO_DIR_TITLE were set. And the setting of TEXINFO_DIR_TITLE had to be careful to provide exactly the right syntax. This patch changes various things in this regard: - Only require TEXINFO_DIR_CATEGORY in order to generate `@dircategory` and `@direntry`. - Use the document title by default if TEXINFO_DIR_DESC is missing. - Use the filename by default when TEXINFO_DIR_TITLE is missing. - Try and make it harder to provide a direntry that does not have the right format or refers to a different filename than the one we're outputting to. * lisp/org/ox-texinfo.el: Remove redundant `:group` arguments. Prefer #' to quote function names. (org-texinfo-template): Use sane defaults for `@direntry`. * doc/misc/org.org (Texinfo specific export settings): Adjust accordingly. --- doc/misc/org.org | 11 ++++++-- lisp/org/ox-texinfo.el | 58 ++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/doc/misc/org.org b/doc/misc/org.org index 05ab5b36ca0..f4590525892 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -15322,11 +15322,18 @@ the general options (see [[*Export Settings]]). #+cindex: @samp{TEXINFO_DIR_TITLE}, keyword The directory title of the document. + This is the short name under which the ~m~ command will find your + manual in the main Info directory. It defaults to the base name of + the Texinfo file. + + If you need more control, it can also be the full entry using the + syntax ~* TITLE: (FILENAME).~. - =TEXINFO_DIR_DESC= :: #+cindex: @samp{TEXINFO_DIR_DESC}, keyword The directory description of the document. + Defaults to the title of the document. - =TEXINFO_PRINTED_TITLE= :: @@ -15422,7 +15429,7 @@ Here is an example that writes to the Info directory file: #+begin_example ,#+TEXINFO_DIR_CATEGORY: Emacs -,#+TEXINFO_DIR_TITLE: Org Mode: (org) +,#+TEXINFO_DIR_TITLE: Org Mode ,#+TEXINFO_DIR_DESC: Outline-based notes management and organizer #+end_example @@ -15830,7 +15837,7 @@ Texinfo code. ,#+TEXINFO_HEADER: @syncodeindex pg cp ,#+TEXINFO_DIR_CATEGORY: Texinfo documentation system -,#+TEXINFO_DIR_TITLE: sample: (sample) +,#+TEXINFO_DIR_TITLE: sample ,#+TEXINFO_DIR_DESC: Invoking sample ,#+TEXINFO_PRINTED_TITLE: GNU Sample diff --git a/lisp/org/ox-texinfo.el b/lisp/org/ox-texinfo.el index 84313645e6e..5065c3fb63c 100644 --- a/lisp/org/ox-texinfo.el +++ b/lisp/org/ox-texinfo.el @@ -110,6 +110,10 @@ (:subtitle "SUBTITLE" nil nil parse) (:subauthor "SUBAUTHOR" nil nil newline) (:texinfo-dircat "TEXINFO_DIR_CATEGORY" nil nil t) + ;; FIXME: The naming of these options is unsatisfactory: + ;; TEXINFO_DIR_DESC corresponds (and defaults) to the document's + ;; title, whereas TEXINFO_DIR_TITLE corresponds (and defaults) to + ;; its filename. (:texinfo-dirtitle "TEXINFO_DIR_TITLE" nil nil t) (:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t) (:texinfo-printed-title "TEXINFO_PRINTED_TITLE" nil nil t) @@ -147,12 +151,10 @@ "Default document encoding for Texinfo output. If nil it will default to `buffer-file-coding-system'." - :group 'org-export-texinfo :type 'coding-system) (defcustom org-texinfo-default-class "info" "The default Texinfo class." - :group 'org-export-texinfo :type '(string :tag "Texinfo class")) (defcustom org-texinfo-classes @@ -205,7 +207,6 @@ The sectioning structure of the class is given by the elements following the header string. For each sectioning level, a number of strings is specified. A %s formatter is mandatory in each section string and will be replaced by the title of the section." - :group 'org-export-texinfo :version "27.1" :package-version '(Org . "9.2") :type '(repeat @@ -233,7 +234,6 @@ TEXT the main headline text (string). TAGS the tags as a list of strings (list of strings or nil). The function result will be used in the section format string." - :group 'org-export-texinfo :type 'function :version "26.1" :package-version '(Org . "8.3")) @@ -244,38 +244,32 @@ The function result will be used in the section format string." "Column at which to start the description in the node listings. If a node title is greater than this length, the description will be placed after the end of the title." - :group 'org-export-texinfo :type 'integer) ;;;; Timestamps (defcustom org-texinfo-active-timestamp-format "@emph{%s}" "A printf format string to be applied to active timestamps." - :group 'org-export-texinfo :type 'string) (defcustom org-texinfo-inactive-timestamp-format "@emph{%s}" "A printf format string to be applied to inactive timestamps." - :group 'org-export-texinfo :type 'string) (defcustom org-texinfo-diary-timestamp-format "@emph{%s}" "A printf format string to be applied to diary timestamps." - :group 'org-export-texinfo :type 'string) ;;;; Links (defcustom org-texinfo-link-with-unknown-path-format "@indicateurl{%s}" "Format string for links with unknown path type." - :group 'org-export-texinfo :type 'string) ;;;; Tables (defcustom org-texinfo-tables-verbatim nil "When non-nil, tables are exported verbatim." - :group 'org-export-texinfo :type 'boolean) (defcustom org-texinfo-table-scientific-notation nil @@ -285,7 +279,6 @@ The format should have \"%s\" twice, for mantissa and exponent \(i.e. \"%s\\\\times10^{%s}\"). When nil, no transformation is made." - :group 'org-export-texinfo :type '(choice (string :tag "Format string") (const :tag "No formatting" nil))) @@ -297,7 +290,6 @@ This should an indicating command, e.g., \"@code\", \"@kbd\" or \"@samp\". It can be overridden locally using the \":indic\" attribute." - :group 'org-export-texinfo :type 'string :version "26.1" :package-version '(Org . "9.1") @@ -323,7 +315,6 @@ to typeset and protects special characters. When no association is found for a given markup, text is returned as-is." - :group 'org-export-texinfo :version "26.1" :package-version '(Org . "9.1") :type 'alist @@ -341,7 +332,6 @@ The function must accept two parameters: The function should return the string to be exported. The default function simply returns the value of CONTENTS." - :group 'org-export-texinfo :version "24.4" :package-version '(Org . "8.2") :type 'function) @@ -361,7 +351,6 @@ The function must accept six parameters: CONTENTS the contents of the inlinetask, as a string. The function should return the string to be exported." - :group 'org-export-texinfo :type 'function) ;;;; LaTeX @@ -374,7 +363,6 @@ fragments as Texinfo \"@displaymath\" and \"@math\" commands respectively. Alternatively, when set to `detect', the exporter does so only if the installed version of Texinfo supports the necessary commands." - :group 'org-export-texinfo :package-version '(Org . "9.6") :type '(choice (const :tag "Detect" detect) @@ -391,7 +379,6 @@ body but is followed by another item, then the second item is transcoded to `@itemx'. See info node `(org)Plain lists in Texinfo export' for how to enable this for individual lists." :package-version '(Org . "9.6") - :group 'org-export-texinfo :type 'boolean :safe t) @@ -406,7 +393,6 @@ relative file name, %F by the absolute file name, %b by the file base name (i.e. without directory and extension parts), %o by the base directory of the file and %O by the absolute file name of the output file." - :group 'org-export-texinfo :version "26.1" :package-version '(Org . "9.1") :type '(repeat :tag "Shell command sequence" @@ -416,8 +402,8 @@ the output file." '("aux" "toc" "cp" "fn" "ky" "pg" "tp" "vr") "The list of file extensions to consider as Texinfo logfiles. The logfiles will be remove if `org-texinfo-remove-logfiles' is + non-nil." - :group 'org-export-texinfo :type '(repeat (string :tag "Extension"))) (defcustom org-texinfo-remove-logfiles t @@ -815,19 +801,31 @@ holding export options." (format "@copying\n%s@end copying\n\n" (org-element-normalize-string (org-export-data copying info)))) - ;; Info directory information. Only supply if both title and - ;; category are provided. - (let ((dircat (plist-get info :texinfo-dircat)) - (dirtitle - (let ((title (plist-get info :texinfo-dirtitle))) - (and title - (string-match "^\\(?:\\* \\)?\\(.*?\\)\\(\\.\\)?$" title) - (format "* %s." (match-string 1 title)))))) - (when (and dircat dirtitle) + ;; Info directory information. Only supply if category is provided. + ;; FIXME: A Texinfo doc without a direntry is significantly less useful + ;; since it won't appear in the main Info-directory, so maybe we should + ;; use a default category like "misc"? + (let* ((dircat (plist-get info :texinfo-dircat)) + (dt (plist-get info :texinfo-dirtitle)) + (file (file-name-sans-extension + (or (org-strip-quotes (plist-get info :texinfo-filename)) + (plist-get info :output-file)))) + (dirtitle + (cond + ((and dt + (or (string-match "\\`\\* \\(.*?\\)\\(\\.\\)?\\'" dt) + (string-match "\\`\\(.*(.*)\\)\\(\\.\\)?\\'" dt))) + ;; `dt' is already "complete". + (format "* %s." (match-string 1 dt))) + ((and dt (not (equal dt file))) + (format "* %s: (%s)." dt file)) + (t (format "* %s." file))))) + (when dircat (concat "@dircategory " dircat "\n" "@direntry\n" (let ((dirdesc - (let ((desc (plist-get info :texinfo-dirdesc))) + (let ((desc (or (plist-get info :texinfo-dirdesc) + title))) (cond ((not desc) nil) ((string-suffix-p "." desc) desc) (t (concat desc ".")))))) @@ -1590,7 +1588,7 @@ information." (concat "@noindent" (mapconcat - 'identity + #'identity (delq nil (list (let ((closed (org-element-property :closed planning))) From 99483e214fdafa76e8001c7009dff13a76c33f32 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 2 Mar 2024 15:23:17 -0500 Subject: [PATCH 380/446] Set org-macro-templates more lazily --- lisp/org/org-macro.el | 8 +++++--- lisp/org/org-macs.el | 4 +++- lisp/org/org.el | 21 ++++++++++----------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lisp/org/org-macro.el b/lisp/org/org-macro.el index 737eab5d2bb..acc8f5e593b 100644 --- a/lisp/org/org-macro.el +++ b/lisp/org/org-macro.el @@ -78,12 +78,14 @@ ;;; Variables -(defvar-local org-macro-templates nil +(defvar-local org-macro-templates t "Alist containing all macro templates in current buffer. Associations are in the shape of (NAME . TEMPLATE) where NAME stands for macro's name and template for its replacement value, -both as strings. This is an internal variable. Do not set it -directly, use instead: +both as strings. +`t' means that it has not yet been initialized. + +This is an internal variable. Do not set it directly, use instead: #+MACRO: name template") diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el index aafbdf0e0aa..53943d343d8 100644 --- a/lisp/org/org-macs.el +++ b/lisp/org/org-macs.el @@ -132,6 +132,8 @@ Version mismatch is commonly encountered in the following situations: ;; Use `with-silent-modifications' to ignore cosmetic changes and ;; `org-unmodified' to ignore real text modifications. +;; FIXME: Won't "real text modifications" break the undo data if +;; `buffer-undo-list' is let-bound to t? (defmacro org-unmodified (&rest body) "Run BODY while preserving the buffer's `buffer-modified-p' state." (declare (debug (body))) @@ -141,7 +143,7 @@ Version mismatch is commonly encountered in the following situations: (let ((buffer-undo-list t) (inhibit-modification-hooks t)) ,@body) - (set-buffer-modified-p ,was-modified))))) + (restore-buffer-modified-p ,was-modified))))) (defmacro org-with-base-buffer (buffer &rest body) "Run BODY in base buffer for BUFFER. diff --git a/lisp/org/org.el b/lisp/org/org.el index d361408eaca..3fb8fce78d3 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -716,8 +716,9 @@ defined in org-duration.el.") "Load all extensions listed in `org-modules'." (when (or force (not org-modules-loaded)) (dolist (ext org-modules) - (condition-case nil (require ext) - (error (message "Problems while trying to load feature `%s'" ext)))) + (condition-case err (require ext) + (error (message "Problems while trying to load feature `%s':\n%S" + ext err)))) (setq org-modules-loaded t))) (defun org-set-modules (var value) @@ -855,7 +856,7 @@ depends on, if any." :group 'org-export :version "26.1" :package-version '(Org . "9.0") - :initialize 'custom-initialize-set + :initialize #'custom-initialize-set :set (lambda (var val) (if (not (featurep 'ox)) (set-default-toplevel-value var val) ;; Any back-end not required anymore (not present in VAL and not @@ -905,9 +906,9 @@ depends on, if any." (eval-after-load 'ox '(dolist (backend org-export-backends) - (condition-case nil (require (intern (format "ox-%s" backend))) - (error (message "Problems while trying to load export back-end `%s'" - backend))))) + (condition-case err (require (intern (format "ox-%s" backend))) + (error (message "Problems while trying to load export back-end `%s':\n%S" + backend err))))) (defcustom org-support-shift-select nil "Non-nil means make shift-cursor commands select text when possible. @@ -4772,7 +4773,7 @@ This is for getting out of special buffers like capture.") (require 'org-pcomplete) (require 'org-src) (require 'org-footnote) -(require 'org-macro) +;; (require 'org-macro) ;; babel (require 'ob) @@ -4852,8 +4853,6 @@ The following commands are available: (when (and org-element-cache-persistent org-element-use-cache) (org-persist-load 'org-element--cache (current-buffer) t)) - ;; Initialize macros templates. - (org-macro-initialize-templates) ;; Initialize radio targets. (org-update-radio-target-regexp) ;; Indentation. @@ -10459,7 +10458,7 @@ EXTRA is additional text that will be inserted into the notes buffer." org-log-note-this-command this-command org-log-note-recursion-depth (recursion-depth) org-log-setup t) - (add-hook 'post-command-hook 'org-add-log-note 'append)) + (add-hook 'post-command-hook #'org-add-log-note 'append)) (defun org-skip-over-state-notes () "Skip past the list of State notes in an entry." @@ -10488,7 +10487,7 @@ EXTRA is additional text that will be inserted into the notes buffer." "Pop up a window for taking a note, and add this note later." (when (and (equal org-log-note-this-command this-command) (= org-log-note-recursion-depth (recursion-depth))) - (remove-hook 'post-command-hook 'org-add-log-note) + (remove-hook 'post-command-hook #'org-add-log-note) (setq org-log-setup nil) (setq org-log-note-window-configuration (current-window-configuration)) (delete-other-windows) From 1d9d07fb00e6b62641c07af68f986e700b5f6cee Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 3 Mar 2024 18:08:50 -0500 Subject: [PATCH 381/446] (cl--typeof-types): Rework to fix some regressions Initialize the variables directly in their declaration, so there no time where they exist but aren't yet initialized. This also allows us to mark `cl--typeof-types` as a `defconst` again. More importantly, specify the DAG by direct supertypes rather than direct subtypes. This is slightly less compact, but it's necessary to let us specify the *order* of the supertypes, which is necessary for example to preserve the desired ordering of methods when several methods can be applied. Fix a few more regressions, such as removing `atom` from the parents of `function` since some lists are considered as functions, adding `number-or-marker` as supertype of `integer-or-marker`, and re-adding `native-comp-unit`. I carefully compared all elements of `cl--typeof-types` to make sure they are the same as before (with one exception for `null`). * lisp/emacs-lisp/cl-preloaded.el (cl--type-hierarchy): Delete var. (cl--direct-supertypes-of-type, cl--typeof-types): Initialize directly in the declaration. (cl--supertypes-lane, cl--supertypes-lanes-res): Delete vars. (cl--supertypes-for-typeof-types-rec) (cl--supertypes-for-typeof-types): Delete functions. --- lisp/emacs-lisp/cl-preloaded.el | 117 +++++++++++++++----------------- 1 file changed, 54 insertions(+), 63 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 512cf31ead5..a4ddc55b257 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -50,77 +50,68 @@ (apply #'error string (append sargs args)) (signal 'cl-assertion-failed `(,form ,@sargs))))) - -(defconst cl--type-hierarchy - ;; Please run `sycdoc-update-type-hierarchy' in - ;; etc/syncdoc-type-hierarchy.el each time this is updated to - ;; reflect in the documentation. - '((t sequence atom) - (sequence list array) - (atom - class structure tree-sitter-compiled-query tree-sitter-node - tree-sitter-parser user-ptr font-object font-entity font-spec - condvar mutex thread terminal hash-table frame buffer function - window process window-configuration overlay integer-or-marker - number-or-marker symbol array obarray) - (number float integer) - (number-or-marker marker number) - (integer bignum fixnum) - (symbol keyword boolean symbol-with-pos) - (array vector bool-vector char-table string) - (list null cons) - (integer-or-marker integer marker) - (compiled-function byte-code-function) - (function subr module-function compiled-function) - (boolean null) - (subr subr-native-elisp subr-primitive) - (symbol-with-pos keyword)) - "List of lists describing all the edges of the builtin type -hierarchy. -Each sublist is in the form (TYPE . DIRECT_SUBTYPES)" - ;; Given type hierarchy is a DAG (but mostly a tree) I believe this - ;; is the most compact way to express it. - ) - (defconst cl--direct-supertypes-of-type - (make-hash-table :test #'eq) + (let ((table (make-hash-table :test #'eq))) + (dolist (x '((sequence t) + (atom t) + (list sequence) + (array sequence atom) + (float number) + (integer number integer-or-marker) + (marker integer-or-marker number-or-marker) + (integer-or-marker number-or-marker) + (number number-or-marker) + (bignum integer) + (fixnum integer) + (keyword symbol) + (boolean symbol) + (symbol-with-pos symbol) + (vector array) + (bool-vector array) + (char-table array) + (string array) + ;; FIXME: This results in `atom' coming before `list' :-( + (null boolean list) + (cons list) + (byte-code-function compiled-function) + (subr compiled-function) + (module-function function atom) + (compiled-function function atom) + (subr-native-elisp subr) + (subr-primitive subr))) + (puthash (car x) (cdr x) table)) + ;; And here's the flat part of the hierarchy. + (dolist (atom '( tree-sitter-compiled-query tree-sitter-node + tree-sitter-parser user-ptr + font-object font-entity font-spec + condvar mutex thread terminal hash-table frame + ;; function ;; FIXME: can be a list as well. + buffer window process window-configuration + overlay number-or-marker + symbol obarray native-comp-unit)) + (cl-assert (null (gethash atom table))) + (puthash atom '(atom) table)) + table) "Hash table TYPE -> SUPERTYPES.") -(cl-loop - for (parent . children) in cl--type-hierarchy - do (cl-loop - for child in children - do (cl-pushnew parent (gethash child cl--direct-supertypes-of-type)))) - -(defvar cl--typeof-types nil +(defconst cl--typeof-types + (letrec ((alist nil) + (allparents + (lambda (type) + ;; FIXME: copy&pasted from `cl--class-allparents'. + (let ((parents (gethash type cl--direct-supertypes-of-type))) + (cons type + (merge-ordered-lists + (mapcar allparents (remq t parents)))))))) + (maphash (lambda (type _) + (push (funcall allparents type) alist)) + cl--direct-supertypes-of-type) + alist) "Alist of supertypes. Each element has the form (TYPE . SUPERTYPES) where TYPE is one of the symbols returned by `type-of', and SUPERTYPES is the list of its supertypes from the most specific to least specific.") -(defvar cl--supertypes-lane nil) -(defvar cl--supertypes-lanes-res nil) - -(defun cl--supertypes-for-typeof-types-rec (type) - ;; Walk recursively the DAG upwards, when the top is reached collect - ;; the current lane in `cl--supertypes-lanes-res'. - (push type cl--supertypes-lane) - (if-let ((parents (gethash type cl--direct-supertypes-of-type))) - (dolist (parent parents) - (cl--supertypes-for-typeof-types-rec parent)) - (push (reverse (cdr cl--supertypes-lane)) ;; Don't include `t'. - cl--supertypes-lanes-res )) - (pop cl--supertypes-lane)) - -(defun cl--supertypes-for-typeof-types (type) - (let (cl--supertypes-lane cl--supertypes-lanes-res) - (cl--supertypes-for-typeof-types-rec type) - (merge-ordered-lists cl--supertypes-lanes-res))) - -(maphash (lambda (type _) - (push (cl--supertypes-for-typeof-types type) cl--typeof-types)) - cl--direct-supertypes-of-type) - (defconst cl--all-builtin-types (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) From 1a37fe3a66930bb8151a29c722dbe3bebc20d033 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 3 Mar 2024 22:09:19 -0500 Subject: [PATCH 382/446] Revert "Set org-macro-templates more lazily" This reverts commit 99483e214fdafa76e8001c7009dff13a76c33f32. --- lisp/org/org-macro.el | 8 +++----- lisp/org/org-macs.el | 4 +--- lisp/org/org.el | 21 +++++++++++---------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/lisp/org/org-macro.el b/lisp/org/org-macro.el index acc8f5e593b..737eab5d2bb 100644 --- a/lisp/org/org-macro.el +++ b/lisp/org/org-macro.el @@ -78,14 +78,12 @@ ;;; Variables -(defvar-local org-macro-templates t +(defvar-local org-macro-templates nil "Alist containing all macro templates in current buffer. Associations are in the shape of (NAME . TEMPLATE) where NAME stands for macro's name and template for its replacement value, -both as strings. -`t' means that it has not yet been initialized. - -This is an internal variable. Do not set it directly, use instead: +both as strings. This is an internal variable. Do not set it +directly, use instead: #+MACRO: name template") diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el index 53943d343d8..aafbdf0e0aa 100644 --- a/lisp/org/org-macs.el +++ b/lisp/org/org-macs.el @@ -132,8 +132,6 @@ Version mismatch is commonly encountered in the following situations: ;; Use `with-silent-modifications' to ignore cosmetic changes and ;; `org-unmodified' to ignore real text modifications. -;; FIXME: Won't "real text modifications" break the undo data if -;; `buffer-undo-list' is let-bound to t? (defmacro org-unmodified (&rest body) "Run BODY while preserving the buffer's `buffer-modified-p' state." (declare (debug (body))) @@ -143,7 +141,7 @@ Version mismatch is commonly encountered in the following situations: (let ((buffer-undo-list t) (inhibit-modification-hooks t)) ,@body) - (restore-buffer-modified-p ,was-modified))))) + (set-buffer-modified-p ,was-modified))))) (defmacro org-with-base-buffer (buffer &rest body) "Run BODY in base buffer for BUFFER. diff --git a/lisp/org/org.el b/lisp/org/org.el index 3fb8fce78d3..d361408eaca 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -716,9 +716,8 @@ defined in org-duration.el.") "Load all extensions listed in `org-modules'." (when (or force (not org-modules-loaded)) (dolist (ext org-modules) - (condition-case err (require ext) - (error (message "Problems while trying to load feature `%s':\n%S" - ext err)))) + (condition-case nil (require ext) + (error (message "Problems while trying to load feature `%s'" ext)))) (setq org-modules-loaded t))) (defun org-set-modules (var value) @@ -856,7 +855,7 @@ depends on, if any." :group 'org-export :version "26.1" :package-version '(Org . "9.0") - :initialize #'custom-initialize-set + :initialize 'custom-initialize-set :set (lambda (var val) (if (not (featurep 'ox)) (set-default-toplevel-value var val) ;; Any back-end not required anymore (not present in VAL and not @@ -906,9 +905,9 @@ depends on, if any." (eval-after-load 'ox '(dolist (backend org-export-backends) - (condition-case err (require (intern (format "ox-%s" backend))) - (error (message "Problems while trying to load export back-end `%s':\n%S" - backend err))))) + (condition-case nil (require (intern (format "ox-%s" backend))) + (error (message "Problems while trying to load export back-end `%s'" + backend))))) (defcustom org-support-shift-select nil "Non-nil means make shift-cursor commands select text when possible. @@ -4773,7 +4772,7 @@ This is for getting out of special buffers like capture.") (require 'org-pcomplete) (require 'org-src) (require 'org-footnote) -;; (require 'org-macro) +(require 'org-macro) ;; babel (require 'ob) @@ -4853,6 +4852,8 @@ The following commands are available: (when (and org-element-cache-persistent org-element-use-cache) (org-persist-load 'org-element--cache (current-buffer) t)) + ;; Initialize macros templates. + (org-macro-initialize-templates) ;; Initialize radio targets. (org-update-radio-target-regexp) ;; Indentation. @@ -10458,7 +10459,7 @@ EXTRA is additional text that will be inserted into the notes buffer." org-log-note-this-command this-command org-log-note-recursion-depth (recursion-depth) org-log-setup t) - (add-hook 'post-command-hook #'org-add-log-note 'append)) + (add-hook 'post-command-hook 'org-add-log-note 'append)) (defun org-skip-over-state-notes () "Skip past the list of State notes in an entry." @@ -10487,7 +10488,7 @@ EXTRA is additional text that will be inserted into the notes buffer." "Pop up a window for taking a note, and add this note later." (when (and (equal org-log-note-this-command this-command) (= org-log-note-recursion-depth (recursion-depth))) - (remove-hook 'post-command-hook #'org-add-log-note) + (remove-hook 'post-command-hook 'org-add-log-note) (setq org-log-setup nil) (setq org-log-note-window-configuration (current-window-configuration)) (delete-other-windows) From 445f376e4e613ebee94d2844926269bfa8793858 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 3 Mar 2024 22:09:24 -0500 Subject: [PATCH 383/446] Revert "ox-texinfo:: Require only TEXINFO_DIR_CATEGORY" This reverts commit 5254c582efb3e7171e955dde653e7530d2d3ffef. --- doc/misc/org.org | 11 ++------ lisp/org/ox-texinfo.el | 58 ++++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/doc/misc/org.org b/doc/misc/org.org index f4590525892..05ab5b36ca0 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -15322,18 +15322,11 @@ the general options (see [[*Export Settings]]). #+cindex: @samp{TEXINFO_DIR_TITLE}, keyword The directory title of the document. - This is the short name under which the ~m~ command will find your - manual in the main Info directory. It defaults to the base name of - the Texinfo file. - - If you need more control, it can also be the full entry using the - syntax ~* TITLE: (FILENAME).~. - =TEXINFO_DIR_DESC= :: #+cindex: @samp{TEXINFO_DIR_DESC}, keyword The directory description of the document. - Defaults to the title of the document. - =TEXINFO_PRINTED_TITLE= :: @@ -15429,7 +15422,7 @@ Here is an example that writes to the Info directory file: #+begin_example ,#+TEXINFO_DIR_CATEGORY: Emacs -,#+TEXINFO_DIR_TITLE: Org Mode +,#+TEXINFO_DIR_TITLE: Org Mode: (org) ,#+TEXINFO_DIR_DESC: Outline-based notes management and organizer #+end_example @@ -15837,7 +15830,7 @@ Texinfo code. ,#+TEXINFO_HEADER: @syncodeindex pg cp ,#+TEXINFO_DIR_CATEGORY: Texinfo documentation system -,#+TEXINFO_DIR_TITLE: sample +,#+TEXINFO_DIR_TITLE: sample: (sample) ,#+TEXINFO_DIR_DESC: Invoking sample ,#+TEXINFO_PRINTED_TITLE: GNU Sample diff --git a/lisp/org/ox-texinfo.el b/lisp/org/ox-texinfo.el index 5065c3fb63c..84313645e6e 100644 --- a/lisp/org/ox-texinfo.el +++ b/lisp/org/ox-texinfo.el @@ -110,10 +110,6 @@ (:subtitle "SUBTITLE" nil nil parse) (:subauthor "SUBAUTHOR" nil nil newline) (:texinfo-dircat "TEXINFO_DIR_CATEGORY" nil nil t) - ;; FIXME: The naming of these options is unsatisfactory: - ;; TEXINFO_DIR_DESC corresponds (and defaults) to the document's - ;; title, whereas TEXINFO_DIR_TITLE corresponds (and defaults) to - ;; its filename. (:texinfo-dirtitle "TEXINFO_DIR_TITLE" nil nil t) (:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t) (:texinfo-printed-title "TEXINFO_PRINTED_TITLE" nil nil t) @@ -151,10 +147,12 @@ "Default document encoding for Texinfo output. If nil it will default to `buffer-file-coding-system'." + :group 'org-export-texinfo :type 'coding-system) (defcustom org-texinfo-default-class "info" "The default Texinfo class." + :group 'org-export-texinfo :type '(string :tag "Texinfo class")) (defcustom org-texinfo-classes @@ -207,6 +205,7 @@ The sectioning structure of the class is given by the elements following the header string. For each sectioning level, a number of strings is specified. A %s formatter is mandatory in each section string and will be replaced by the title of the section." + :group 'org-export-texinfo :version "27.1" :package-version '(Org . "9.2") :type '(repeat @@ -234,6 +233,7 @@ TEXT the main headline text (string). TAGS the tags as a list of strings (list of strings or nil). The function result will be used in the section format string." + :group 'org-export-texinfo :type 'function :version "26.1" :package-version '(Org . "8.3")) @@ -244,32 +244,38 @@ The function result will be used in the section format string." "Column at which to start the description in the node listings. If a node title is greater than this length, the description will be placed after the end of the title." + :group 'org-export-texinfo :type 'integer) ;;;; Timestamps (defcustom org-texinfo-active-timestamp-format "@emph{%s}" "A printf format string to be applied to active timestamps." + :group 'org-export-texinfo :type 'string) (defcustom org-texinfo-inactive-timestamp-format "@emph{%s}" "A printf format string to be applied to inactive timestamps." + :group 'org-export-texinfo :type 'string) (defcustom org-texinfo-diary-timestamp-format "@emph{%s}" "A printf format string to be applied to diary timestamps." + :group 'org-export-texinfo :type 'string) ;;;; Links (defcustom org-texinfo-link-with-unknown-path-format "@indicateurl{%s}" "Format string for links with unknown path type." + :group 'org-export-texinfo :type 'string) ;;;; Tables (defcustom org-texinfo-tables-verbatim nil "When non-nil, tables are exported verbatim." + :group 'org-export-texinfo :type 'boolean) (defcustom org-texinfo-table-scientific-notation nil @@ -279,6 +285,7 @@ The format should have \"%s\" twice, for mantissa and exponent \(i.e. \"%s\\\\times10^{%s}\"). When nil, no transformation is made." + :group 'org-export-texinfo :type '(choice (string :tag "Format string") (const :tag "No formatting" nil))) @@ -290,6 +297,7 @@ This should an indicating command, e.g., \"@code\", \"@kbd\" or \"@samp\". It can be overridden locally using the \":indic\" attribute." + :group 'org-export-texinfo :type 'string :version "26.1" :package-version '(Org . "9.1") @@ -315,6 +323,7 @@ to typeset and protects special characters. When no association is found for a given markup, text is returned as-is." + :group 'org-export-texinfo :version "26.1" :package-version '(Org . "9.1") :type 'alist @@ -332,6 +341,7 @@ The function must accept two parameters: The function should return the string to be exported. The default function simply returns the value of CONTENTS." + :group 'org-export-texinfo :version "24.4" :package-version '(Org . "8.2") :type 'function) @@ -351,6 +361,7 @@ The function must accept six parameters: CONTENTS the contents of the inlinetask, as a string. The function should return the string to be exported." + :group 'org-export-texinfo :type 'function) ;;;; LaTeX @@ -363,6 +374,7 @@ fragments as Texinfo \"@displaymath\" and \"@math\" commands respectively. Alternatively, when set to `detect', the exporter does so only if the installed version of Texinfo supports the necessary commands." + :group 'org-export-texinfo :package-version '(Org . "9.6") :type '(choice (const :tag "Detect" detect) @@ -379,6 +391,7 @@ body but is followed by another item, then the second item is transcoded to `@itemx'. See info node `(org)Plain lists in Texinfo export' for how to enable this for individual lists." :package-version '(Org . "9.6") + :group 'org-export-texinfo :type 'boolean :safe t) @@ -393,6 +406,7 @@ relative file name, %F by the absolute file name, %b by the file base name (i.e. without directory and extension parts), %o by the base directory of the file and %O by the absolute file name of the output file." + :group 'org-export-texinfo :version "26.1" :package-version '(Org . "9.1") :type '(repeat :tag "Shell command sequence" @@ -402,8 +416,8 @@ the output file." '("aux" "toc" "cp" "fn" "ky" "pg" "tp" "vr") "The list of file extensions to consider as Texinfo logfiles. The logfiles will be remove if `org-texinfo-remove-logfiles' is - non-nil." + :group 'org-export-texinfo :type '(repeat (string :tag "Extension"))) (defcustom org-texinfo-remove-logfiles t @@ -801,31 +815,19 @@ holding export options." (format "@copying\n%s@end copying\n\n" (org-element-normalize-string (org-export-data copying info)))) - ;; Info directory information. Only supply if category is provided. - ;; FIXME: A Texinfo doc without a direntry is significantly less useful - ;; since it won't appear in the main Info-directory, so maybe we should - ;; use a default category like "misc"? - (let* ((dircat (plist-get info :texinfo-dircat)) - (dt (plist-get info :texinfo-dirtitle)) - (file (file-name-sans-extension - (or (org-strip-quotes (plist-get info :texinfo-filename)) - (plist-get info :output-file)))) - (dirtitle - (cond - ((and dt - (or (string-match "\\`\\* \\(.*?\\)\\(\\.\\)?\\'" dt) - (string-match "\\`\\(.*(.*)\\)\\(\\.\\)?\\'" dt))) - ;; `dt' is already "complete". - (format "* %s." (match-string 1 dt))) - ((and dt (not (equal dt file))) - (format "* %s: (%s)." dt file)) - (t (format "* %s." file))))) - (when dircat + ;; Info directory information. Only supply if both title and + ;; category are provided. + (let ((dircat (plist-get info :texinfo-dircat)) + (dirtitle + (let ((title (plist-get info :texinfo-dirtitle))) + (and title + (string-match "^\\(?:\\* \\)?\\(.*?\\)\\(\\.\\)?$" title) + (format "* %s." (match-string 1 title)))))) + (when (and dircat dirtitle) (concat "@dircategory " dircat "\n" "@direntry\n" (let ((dirdesc - (let ((desc (or (plist-get info :texinfo-dirdesc) - title))) + (let ((desc (plist-get info :texinfo-dirdesc))) (cond ((not desc) nil) ((string-suffix-p "." desc) desc) (t (concat desc ".")))))) @@ -1588,7 +1590,7 @@ information." (concat "@noindent" (mapconcat - #'identity + 'identity (delq nil (list (let ((closed (org-element-property :closed planning))) From f5c65dae099485f4df128b61d36ae9e5af8518a8 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 4 Mar 2024 11:21:53 +0800 Subject: [PATCH 384/446] Update tramp-androidsu * doc/misc/tramp.texi (Quick Start Guide): Remove documentation pertaining to tramp-androidsu.el. (Inline methods): Document it here instead. * lisp/net/tramp-androidsu.el (tramp-androidsu-mount-global-namespace) (tramp-androidsu-remote-path, tramp-androidsu-local-shell-name) (tramp-androidsu-local-tmp-directory, add-to-list) (tramp-androidsu-maybe-open-connection) (tramp-androidsu-handle-access-file) (tramp-androidsu-handle-add-name-to-file) (tramp-androidsu-handle-copy-directory) (tramp-androidsu-sh-handle-copy-file) (tramp-androidsu-handle-copy-file) (tramp-androidsu-adb-handle-delete-directory) (tramp-androidsu-handle-delete-directory) (tramp-androidsu-adb-handle-delete-file) (tramp-androidsu-handle-delete-file) (tramp-androidsu-handle-directory-file-name) (tramp-androidsu-handle-directory-files) (tramp-androidsu-adb-handle-directory-files-and-attributes) (tramp-androidsu-handle-directory-files-and-attributes) (tramp-androidsu-handle-dired-uncache) (tramp-androidsu-adb-handle-exec-path) (tramp-androidsu-handle-exec-path) (tramp-androidsu-handle-expand-file-name) (tramp-androidsu-handle-file-accessible-directory-p) (tramp-androidsu-adb-handle-file-attributes) (tramp-androidsu-handle-file-attributes) (tramp-androidsu-handle-file-directory-p) (tramp-androidsu-handle-file-equal-p) (tramp-androidsu-adb-handle-file-executable-p) (tramp-androidsu-handle-file-executable-p) (tramp-androidsu-adb-handle-file-exists-p) (tramp-androidsu-handle-file-exists-p) (tramp-androidsu-handle-file-group-gid) (tramp-androidsu-handle-file-in-directory-p) (tramp-androidsu-sh-handle-file-local-copy) (tramp-androidsu-handle-file-local-copy) (tramp-androidsu-handle-file-locked-p) (tramp-androidsu-handle-file-modes) (tramp-androidsu-adb-handle-file-name-all-completions) (tramp-androidsu-handle-file-name-all-completions) (tramp-androidsu-handle-file-name-as-directory) (tramp-androidsu-handle-file-name-case-insensitive-p) (tramp-androidsu-handle-file-name-completion) (tramp-androidsu-handle-file-name-directory) (tramp-androidsu-handle-file-name-nondirectory) (tramp-androidsu-handle-file-newer-than-file-p) (tramp-androidsu-handle-file-notify-add-watch) (tramp-androidsu-handle-file-notify-rm-watch) (tramp-androidsu-handle-file-notify-valid-p) (tramp-androidsu-adb-handle-file-readable-p) (tramp-androidsu-handle-file-readable-p) (tramp-androidsu-handle-file-regular-p) (tramp-androidsu-handle-file-remote-p) (tramp-androidsu-handle-file-selinux-context) (tramp-androidsu-handle-file-symlink-p) (tramp-androidsu-adb-handle-file-system-info) (tramp-androidsu-handle-file-system-info) (tramp-androidsu-handle-file-truename) (tramp-androidsu-handle-file-user-uid) (tramp-androidsu-adb-handle-file-writable-p) (tramp-androidsu-handle-file-writable-p) (tramp-androidsu-handle-find-backup-file-name) (tramp-androidsu-handle-insert-directory) (tramp-androidsu-handle-insert-file-contents) (tramp-androidsu-handle-list-system-processes) (tramp-androidsu-handle-load, tramp-androidsu-handle-lock-file) (tramp-androidsu-handle-make-auto-save-file-name) (tramp-androidsu-adb-handle-make-directory) (tramp-androidsu-handle-make-directory) (tramp-androidsu-handle-make-lock-file-name) (tramp-androidsu-handle-make-nearby-temp-file) (tramp-androidsu-make-process) (tramp-androidsu-sh-handle-make-symbolic-link) (tramp-androidsu-handle-make-symbolic-link) (tramp-androidsu-handle-memory-info) (tramp-androidsu-handle-process-attributes) (tramp-androidsu-adb-handle-process-file) (tramp-androidsu-handle-process-file) (tramp-androidsu-sh-handle-rename-file) (tramp-androidsu-handle-rename-file) (tramp-androidsu-adb-handle-set-file-modes) (tramp-androidsu-handle-set-file-modes) (tramp-androidsu-adb-handle-set-file-times) (tramp-androidsu-handle-set-file-times) (tramp-androidsu-handle-set-visited-file-modtime) (tramp-androidsu-handle-shell-command) (tramp-androidsu-handle-start-file-process) (tramp-androidsu-handle-substitute-in-file-name) (tramp-androidsu-handle-temporary-file-directory) (tramp-androidsu-adb-handle-get-remote-gid) (tramp-androidsu-handle-get-remote-gid) (tramp-androidsu-adb-handle-get-remote-groups) (tramp-androidsu-handle-get-remote-groups) (tramp-androidsu-adb-handle-get-remote-uid) (tramp-androidsu-handle-get-remote-uid) (tramp-androidsu-handle-unlock-file) (tramp-androidsu-handle-verify-visited-file-modtime) (tramp-androidsu-sh-handle-write-region) (tramp-androidsu-handle-write-region) (tramp-androidsu-file-name-handler-alist): Make hard-coded executable and file names defconsts, remove redundant wrapper functions and remove names of wrapped functions from their wrappers. --- doc/misc/tramp.texi | 19 +- lisp/net/tramp-androidsu.el | 405 +++++++++++++----------------------- 2 files changed, 152 insertions(+), 272 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 09b875ad3fa..d67e2fcb64c 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -510,7 +510,6 @@ default host name. Therefore, it is convenient to open a file as The method @option{sg} stands for ``switch group''; here the user name is used as the group to change to. The default host name is the same. - @anchor{Quick Start Guide Combining ssh, plink, su, sudo and doas methods} @section Combining @option{ssh} or @option{plink} with @option{su}, @option{sudo} or @option{doas} @cindex method @option{ssh} @@ -523,8 +522,6 @@ is used as the group to change to. The default host name is the same. @cindex @option{sudo} method @cindex method @option{doas} @cindex @option{doas} method -@cindex method @option{androidsu} -@cindex @option{androidsu} method If the @option{su}, @option{sudo} or @option{doas} option should be performed on another host, it can be combined with a leading @@ -535,12 +532,6 @@ a simple case, the syntax looks like @file{@trampfn{ssh@value{postfixhop}user@@host|sudo,,/path/to/file}}. @xref{Ad-hoc multi-hops}. -The @option{su} method and other shell-based methods conflict with -non-standard @command{su} implementations popular among Android users -and the restricted command-line utilities distributed with that system. -The @option{androidsu} method enables accessing files through -@command{su} on such systems, but multi-hops are not supported. - @anchor{Quick Start Guide sudoedit method} @section Using @command{sudoedit} @cindex method @option{sudoedit} @@ -826,6 +817,16 @@ editing as another user. The host can be either @samp{localhost} or the host returned by the function @command{(system-name)}. See @ref{Multi-hops} for an exception to this behavior. +@cindex method @option{androidsu} +@cindex @option{androidsu} method +Because the default implementation of the @option{su} method and other +shell-based methods conflict with non-standard @command{su} +implementations popular among Android users and the restricted +command-line utilities distributed with that system, a largely +equivalent @option{androidsu} method is provided for that system with +workarounds for its many idiosyncrasies, with the exception that +multi-hops are unsupported. + @item @option{sudo} @cindex method @option{sudo} @cindex @option{sudo} method diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index 1623a0341b2..12453d40acd 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -1,7 +1,8 @@ -;;; tramp-androidsu.el --- TRAMP method for Android superuser shells -*- lexical-binding:t -*- +;;; tramp-androidsu.el --- Tramp method for Android superuser shells -*- lexical-binding:t -*- ;; Copyright (C) 2024 Free Software Foundation, Inc. +;; Author: Po Lu ;; Keywords: comm, processes ;; Package: tramp @@ -22,12 +23,15 @@ ;;; Commentary: +;; `su' method implementation for Android. +;; ;; The `su' method struggles (as do other shell-based methods) with the ;; crippled versions of many Unix utilities installed on Android, ;; workarounds for which are implemented in the `adb' method. This ;; method defines a shell-based method that is identical in function to -;; `su', but reuses such code from the `adb' method where applicable and -;; also provides for certain mannerisms of popular Android `su' +;; and replaces if connecting to a local Android machine `su', but +;; reuses such code from the `adb' method where applicable and also +;; provides for certain mannerisms of popular Android `su' ;; implementations. ;;; Code: @@ -43,33 +47,51 @@ ;;;###tramp-autoload (defcustom tramp-androidsu-mount-global-namespace t "When non-nil, browse files from within the global mount namespace. -On systems that assign each application a unique view of the filesystem -by executing them within individual mount namespaces and thus conceal -each application's data directories from others, invoke `su' with the -option `-mm' in order for the shell launched to run within the global -mount namespace, so that TRAMP may edit files belonging to any and all -applications." +On systems that assign each application a unique view of the +filesystem by executing them within individual mount namespaces +and thus conceal each application's data directories from +others, invoke `su' with the option `-mm' in order for the shell +launched to run within the global mount namespace, so that Tramp +may edit files belonging to any and all applications." :group 'tramp :version "30.1" :type 'boolean) +;;;###tramp-autoload +(defcustom tramp-androidsu-remote-path '("/system/bin" + "/system/xbin") + "Directories in which to search for transfer programs and the like." + :group 'tramp + :version "30.1" + :type '(list string)) + (defvar tramp-androidsu-su-mm-supported 'unknown "Whether `su -mm' is supported on this system.") +;;;###tramp-autoload +(defconst tramp-androidsu-local-shell-name "/system/bin/sh" + "Name of the local shell on Android.") + +;;;###tramp-autoload +(defconst tramp-androidsu-local-tmp-directory "/data/local/tmp" + "Name of the local temporary directory on Android.") + ;;;###tramp-autoload (tramp--with-startup (add-to-list 'tramp-methods `(,tramp-androidsu-method - (tramp-login-program "su") - (tramp-login-args (("-") ("%u"))) - (tramp-remote-shell "/system/bin/sh") - (tramp-remote-shell-login ("-l")) - (tramp-remote-shell-args ("-c")) - (tramp-tmpdir "/data/local/tmp") - (tramp-connection-timeout 10))) - + (tramp-login-program "su") + (tramp-login-args (("-") ("%u"))) + (tramp-remote-shell ,tramp-androidsu-local-shell-name) + (tramp-remote-shell-login ("-l")) + (tramp-remote-shell-args ("-c")) + (tramp-tmpdir ,tramp-androidsu-local-tmp-directory) + (tramp-connection-timeout 10) + (tramp-shell-name ,tramp-androidsu-local-shell-name))) (add-to-list 'tramp-default-host-alist - `(,tramp-androidsu-method nil "localhost"))) + `(,tramp-androidsu-method nil "localhost")) + (add-to-list 'tramp-default-user-alist + `(,tramp-androidsu-method nil ,tramp-root-id-string))) (defvar android-use-exec-loader) ; androidfns.c. @@ -112,15 +134,14 @@ multibyte mode and waits for the shell prompt to appear." ;; there's no guarantee that it's ;; possible to execute it with ;; `android-use-exec-loader' off. - "/system/bin/sh" "-i")) + tramp-androidsu-local-shell-name "-i")) (user (tramp-file-name-user vec)) command) ;; Set sentinel. Initialize variables. (set-process-sentinel p #'tramp-process-sentinel) (tramp-post-process-creation p vec) ;; Replace `login-args' place holders. - (setq command (format "exec su - %s || exit" - (or user "root"))) + (setq command (format "exec su - %s || exit" user)) (tramp-set-connection-property vec "remote-namespace" nil) ;; Attempt to execute the shell inside the global mount ;; namespace if requested. @@ -142,7 +163,7 @@ multibyte mode and waits for the shell prompt to appear." (tramp-set-connection-property vec "remote-namespace" t) (setq command (format "exec su -mm - %s || exit" - (or user "root")))))) + user))))) ;; Send the command. (tramp-message vec 3 "Sending command `%s'" command) (tramp-adb-send-command vec command t t) @@ -154,7 +175,6 @@ multibyte mode and waits for the shell prompt to appear." (with-current-buffer (process-buffer p) (tramp-wait-for-regexp p tramp-connection-timeout "#[[:space:]]*$")) - ;; Set connection-local variables. (tramp-set-connection-local-variables vec) ;; Change prompt. @@ -167,7 +187,8 @@ multibyte mode and waits for the shell prompt to appear." ;; Dump option settings in the traces. (when (>= tramp-verbose 9) (tramp-adb-send-command vec "set -o")) - ;; Disable Unicode. + ;; Disable Unicode, for otherwise Unicode filenames will + ;; not be decoded correctly. (tramp-adb-send-command vec "set +U") ;; Disable echo expansion. (tramp-adb-send-command @@ -188,8 +209,7 @@ multibyte mode and waits for the shell prompt to appear." t))) ;; Set the remote PATH to a suitable value. (tramp-set-connection-property vec "remote-path" - '("/system/bin" - "/system/xbin")) + tramp-androidsu-remote-path) ;; Mark it as connected. (tramp-set-connection-property p "connected" t)))) ;; Cleanup, and propagate the signal. @@ -223,163 +243,49 @@ FUNCTION." (fset 'tramp-adb-wait-for-output tramp-adb-wait-for-output) (fset 'tramp-adb-maybe-open-connection tramp-adb-maybe-open-connection))))) -(defalias 'tramp-androidsu-handle-access-file - (tramp-androidsu-generate-wrapper #'tramp-handle-access-file)) - -(defalias 'tramp-androidsu-handle-add-name-to-file - (tramp-androidsu-generate-wrapper #'tramp-handle-add-name-to-file)) - -(defalias 'tramp-androidsu-handle-copy-directory - (tramp-androidsu-generate-wrapper #'tramp-handle-copy-directory)) - -(defalias 'tramp-androidsu-sh-handle-copy-file +(defalias 'tramp-androidsu-handle-copy-file (tramp-androidsu-generate-wrapper #'tramp-sh-handle-copy-file)) -(defalias 'tramp-androidsu-adb-handle-delete-directory +(defalias 'tramp-androidsu-handle-delete-directory (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-directory)) -(defalias 'tramp-androidsu-adb-handle-delete-file +(defalias 'tramp-androidsu-handle-delete-file (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-file)) -(defalias 'tramp-androidsu-handle-directory-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-directory-file-name)) - -(defalias 'tramp-androidsu-handle-directory-files - (tramp-androidsu-generate-wrapper #'tramp-handle-directory-files)) - -(defalias 'tramp-androidsu-adb-handle-directory-files-and-attributes +(defalias 'tramp-androidsu-handle-directory-files-and-attributes (tramp-androidsu-generate-wrapper #'tramp-adb-handle-directory-files-and-attributes)) -(defalias 'tramp-androidsu-handle-dired-uncache - (tramp-androidsu-generate-wrapper #'tramp-handle-dired-uncache)) - -(defalias 'tramp-androidsu-adb-handle-exec-path +(defalias 'tramp-androidsu-handle-exec-path (tramp-androidsu-generate-wrapper #'tramp-adb-handle-exec-path)) -(defalias 'tramp-androidsu-handle-expand-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-expand-file-name)) - -(defalias 'tramp-androidsu-handle-file-accessible-directory-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-accessible-directory-p)) - -(defalias 'tramp-androidsu-adb-handle-file-attributes +(defalias 'tramp-androidsu-handle-file-attributes (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-attributes)) -(defalias 'tramp-androidsu-handle-file-directory-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-directory-p)) - -(defalias 'tramp-androidsu-handle-file-equal-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-equal-p)) - -(defalias 'tramp-androidsu-adb-handle-file-executable-p +(defalias 'tramp-androidsu-handle-file-executable-p (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-executable-p)) -(defalias 'tramp-androidsu-adb-handle-file-exists-p +(defalias 'tramp-androidsu-handle-file-exists-p (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-exists-p)) -(defalias 'tramp-androidsu-handle-file-group-gid - (tramp-androidsu-generate-wrapper #'tramp-handle-file-group-gid)) - -(defalias 'tramp-androidsu-handle-file-in-directory-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-in-directory-p)) - -(defalias 'tramp-androidsu-sh-handle-file-local-copy +(defalias 'tramp-androidsu-handle-file-local-copy (tramp-androidsu-generate-wrapper #'tramp-sh-handle-file-local-copy)) -(defalias 'tramp-androidsu-handle-file-locked-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-locked-p)) - -(defalias 'tramp-androidsu-handle-file-modes - (tramp-androidsu-generate-wrapper #'tramp-handle-file-modes)) - -(defalias 'tramp-androidsu-adb-handle-file-name-all-completions +(defalias 'tramp-androidsu-handle-file-name-all-completions (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-name-all-completions)) -(defalias 'tramp-androidsu-handle-file-name-as-directory - (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-as-directory)) - -(defalias 'tramp-androidsu-handle-file-name-case-insensitive-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-case-insensitive-p)) - -(defalias 'tramp-androidsu-handle-file-name-completion - (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-completion)) - -(defalias 'tramp-androidsu-handle-file-name-directory - (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-directory)) - -(defalias 'tramp-androidsu-handle-file-name-nondirectory - (tramp-androidsu-generate-wrapper #'tramp-handle-file-name-nondirectory)) - -(defalias 'tramp-androidsu-handle-file-newer-than-file-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-newer-than-file-p)) - -(defalias 'tramp-androidsu-handle-file-notify-add-watch - (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-add-watch)) - -(defalias 'tramp-androidsu-handle-file-notify-rm-watch - (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-rm-watch)) - -(defalias 'tramp-androidsu-handle-file-notify-valid-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-notify-valid-p)) - -(defalias 'tramp-androidsu-adb-handle-file-readable-p +(defalias 'tramp-androidsu-handle-file-readable-p (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-readable-p)) -(defalias 'tramp-androidsu-handle-file-regular-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-regular-p)) - -(defalias 'tramp-androidsu-handle-file-remote-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-remote-p)) - -(defalias 'tramp-androidsu-handle-file-selinux-context - (tramp-androidsu-generate-wrapper #'tramp-handle-file-selinux-context)) - -(defalias 'tramp-androidsu-handle-file-symlink-p - (tramp-androidsu-generate-wrapper #'tramp-handle-file-symlink-p)) - -(defalias 'tramp-androidsu-adb-handle-file-system-info +(defalias 'tramp-androidsu-handle-file-system-info (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-system-info)) -(defalias 'tramp-androidsu-handle-file-truename - (tramp-androidsu-generate-wrapper #'tramp-handle-file-truename)) - -(defalias 'tramp-androidsu-handle-file-user-uid - (tramp-androidsu-generate-wrapper #'tramp-handle-file-user-uid)) - -(defalias 'tramp-androidsu-adb-handle-file-writable-p +(defalias 'tramp-androidsu-handle-file-writable-p (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-writable-p)) -(defalias 'tramp-androidsu-handle-find-backup-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-find-backup-file-name)) - -(defalias 'tramp-androidsu-handle-insert-directory - (tramp-androidsu-generate-wrapper #'tramp-handle-insert-directory)) - -(defalias 'tramp-androidsu-handle-insert-file-contents - (tramp-androidsu-generate-wrapper #'tramp-handle-insert-file-contents)) - -(defalias 'tramp-androidsu-handle-list-system-processes - (tramp-androidsu-generate-wrapper #'tramp-handle-list-system-processes)) - -(defalias 'tramp-androidsu-handle-load - (tramp-androidsu-generate-wrapper #'tramp-handle-load)) - -(defalias 'tramp-androidsu-handle-lock-file - (tramp-androidsu-generate-wrapper #'tramp-handle-lock-file)) - -(defalias 'tramp-androidsu-handle-make-auto-save-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-make-auto-save-file-name)) - -(defalias 'tramp-androidsu-adb-handle-make-directory +(defalias 'tramp-androidsu-handle-make-directory (tramp-androidsu-generate-wrapper #'tramp-adb-handle-make-directory)) -(defalias 'tramp-androidsu-handle-make-lock-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-make-lock-file-name)) - -(defalias 'tramp-androidsu-handle-make-nearby-temp-file - (tramp-androidsu-generate-wrapper #'tramp-handle-make-nearby-temp-file)) - -(defun tramp-androidsu-make-process (&rest args) +(defun tramp-androidsu-handle-make-process (&rest args) "Like `tramp-handle-make-process', but modified for Android." (when args (with-parsed-tramp-file-name (expand-file-name default-directory) nil @@ -493,150 +399,123 @@ FUNCTION." (tramp-taint-remote-process-buffer stderr)) p))))) -(defalias 'tramp-androidsu-sh-handle-make-symbolic-link +(defalias 'tramp-androidsu-handle-make-symbolic-link (tramp-androidsu-generate-wrapper #'tramp-sh-handle-make-symbolic-link)) -(defalias 'tramp-androidsu-handle-memory-info - (tramp-androidsu-generate-wrapper #'tramp-handle-memory-info)) - -(defalias 'tramp-androidsu-handle-process-attributes - (tramp-androidsu-generate-wrapper #'tramp-handle-process-attributes)) - -(defalias 'tramp-androidsu-adb-handle-process-file +(defalias 'tramp-androidsu-handle-process-file (tramp-androidsu-generate-wrapper #'tramp-adb-handle-process-file)) -(defalias 'tramp-androidsu-sh-handle-rename-file +(defalias 'tramp-androidsu-handle-rename-file (tramp-androidsu-generate-wrapper #'tramp-sh-handle-rename-file)) -(defalias 'tramp-androidsu-adb-handle-set-file-modes +(defalias 'tramp-androidsu-handle-set-file-modes (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-modes)) -(defalias 'tramp-androidsu-adb-handle-set-file-times +(defalias 'tramp-androidsu-handle-set-file-times (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-times)) -(defalias 'tramp-androidsu-handle-set-visited-file-modtime - (tramp-androidsu-generate-wrapper #'tramp-handle-set-visited-file-modtime)) - -(defalias 'tramp-androidsu-handle-shell-command - (tramp-androidsu-generate-wrapper #'tramp-handle-shell-command)) - -(defalias 'tramp-androidsu-handle-start-file-process - (tramp-androidsu-generate-wrapper #'tramp-handle-start-file-process)) - -(defalias 'tramp-androidsu-handle-substitute-in-file-name - (tramp-androidsu-generate-wrapper #'tramp-handle-substitute-in-file-name)) - -(defalias 'tramp-androidsu-handle-temporary-file-directory - (tramp-androidsu-generate-wrapper #'tramp-handle-temporary-file-directory)) - -(defalias 'tramp-androidsu-adb-handle-get-remote-gid +(defalias 'tramp-androidsu-handle-get-remote-gid (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-gid)) -(defalias 'tramp-androidsu-adb-handle-get-remote-groups +(defalias 'tramp-androidsu-handle-get-remote-groups (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-groups)) -(defalias 'tramp-androidsu-adb-handle-get-remote-uid +(defalias 'tramp-androidsu-handle-get-remote-uid (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-uid)) -(defalias 'tramp-androidsu-handle-unlock-file - (tramp-androidsu-generate-wrapper #'tramp-handle-unlock-file)) - -(defalias 'tramp-androidsu-handle-verify-visited-file-modtime - (tramp-androidsu-generate-wrapper #'tramp-handle-verify-visited-file-modtime)) - -(defalias 'tramp-androidsu-sh-handle-write-region +(defalias 'tramp-androidsu-handle-write-region (tramp-androidsu-generate-wrapper #'tramp-sh-handle-write-region)) ;;;###tramp-autoload (defconst tramp-androidsu-file-name-handler-alist '(;; `abbreviate-file-name' performed by default handler. - (access-file . tramp-androidsu-handle-access-file) - (add-name-to-file . tramp-androidsu-handle-add-name-to-file) + (access-file . tramp-handle-access-file) + (add-name-to-file . tramp-handle-add-name-to-file) ;; `byte-compiler-base-file-name' performed by default handler. - (copy-directory . tramp-androidsu-handle-copy-directory) - (copy-file . tramp-androidsu-sh-handle-copy-file) - (delete-directory . tramp-androidsu-adb-handle-delete-directory) - (delete-file . tramp-androidsu-adb-handle-delete-file) + (copy-directory . tramp-handle-copy-directory) + (copy-file . tramp-androidsu-handle-copy-file) + (delete-directory . tramp-androidsu-handle-delete-directory) + (delete-file . tramp-androidsu-handle-delete-file) ;; `diff-latest-backup-file' performed by default handler. - (directory-file-name . tramp-androidsu-handle-directory-file-name) - (directory-files . tramp-androidsu-handle-directory-files) + (directory-file-name . tramp-handle-directory-file-name) + (directory-files . tramp-handle-directory-files) (directory-files-and-attributes - . tramp-androidsu-adb-handle-directory-files-and-attributes) + . tramp-androidsu-handle-directory-files-and-attributes) (dired-compress-file . ignore) - (dired-uncache . tramp-androidsu-handle-dired-uncache) - (exec-path . tramp-androidsu-adb-handle-exec-path) - (expand-file-name . tramp-androidsu-handle-expand-file-name) - (file-accessible-directory-p . tramp-androidsu-handle-file-accessible-directory-p) + (dired-uncache . tramp-handle-dired-uncache) + (exec-path . tramp-androidsu-handle-exec-path) + (expand-file-name . tramp-handle-expand-file-name) + (file-accessible-directory-p . tramp-handle-file-accessible-directory-p) (file-acl . ignore) - (file-attributes . tramp-androidsu-adb-handle-file-attributes) - (file-directory-p . tramp-androidsu-handle-file-directory-p) - (file-equal-p . tramp-androidsu-handle-file-equal-p) - (file-executable-p . tramp-androidsu-adb-handle-file-executable-p) - (file-exists-p . tramp-androidsu-adb-handle-file-exists-p) - (file-group-gid . tramp-androidsu-handle-file-group-gid) - (file-in-directory-p . tramp-androidsu-handle-file-in-directory-p) - (file-local-copy . tramp-androidsu-sh-handle-file-local-copy) - (file-locked-p . tramp-androidsu-handle-file-locked-p) - (file-modes . tramp-androidsu-handle-file-modes) - (file-name-all-completions . tramp-androidsu-adb-handle-file-name-all-completions) - (file-name-as-directory . tramp-androidsu-handle-file-name-as-directory) - (file-name-case-insensitive-p . tramp-androidsu-handle-file-name-case-insensitive-p) - (file-name-completion . tramp-androidsu-handle-file-name-completion) - (file-name-directory . tramp-androidsu-handle-file-name-directory) - (file-name-nondirectory . tramp-androidsu-handle-file-name-nondirectory) + (file-attributes . tramp-androidsu-handle-file-attributes) + (file-directory-p . tramp-handle-file-directory-p) + (file-equal-p . tramp-handle-file-equal-p) + (file-executable-p . tramp-androidsu-handle-file-executable-p) + (file-exists-p . tramp-androidsu-handle-file-exists-p) + (file-group-gid . tramp-handle-file-group-gid) + (file-in-directory-p . tramp-handle-file-in-directory-p) + (file-local-copy . tramp-androidsu-handle-file-local-copy) + (file-locked-p . tramp-handle-file-locked-p) + (file-modes . tramp-handle-file-modes) + (file-name-all-completions . tramp-androidsu-handle-file-name-all-completions) + (file-name-as-directory . tramp-handle-file-name-as-directory) + (file-name-case-insensitive-p . tramp-handle-file-name-case-insensitive-p) + (file-name-completion . tramp-handle-file-name-completion) + (file-name-directory . tramp-handle-file-name-directory) + (file-name-nondirectory . tramp-handle-file-name-nondirectory) ;; `file-name-sans-versions' performed by default handler. - (file-newer-than-file-p . tramp-androidsu-handle-file-newer-than-file-p) - (file-notify-add-watch . tramp-androidsu-handle-file-notify-add-watch) - (file-notify-rm-watch . tramp-androidsu-handle-file-notify-rm-watch) - (file-notify-valid-p . tramp-androidsu-handle-file-notify-valid-p) + (file-newer-than-file-p . tramp-handle-file-newer-than-file-p) + (file-notify-add-watch . tramp-handle-file-notify-add-watch) + (file-notify-rm-watch . tramp-handle-file-notify-rm-watch) + (file-notify-valid-p . tramp-handle-file-notify-valid-p) (file-ownership-preserved-p . ignore) - (file-readable-p . tramp-androidsu-adb-handle-file-readable-p) - (file-regular-p . tramp-androidsu-handle-file-regular-p) - (file-remote-p . tramp-androidsu-handle-file-remote-p) - (file-selinux-context . tramp-androidsu-handle-file-selinux-context) - (file-symlink-p . tramp-androidsu-handle-file-symlink-p) - (file-system-info . tramp-androidsu-adb-handle-file-system-info) - (file-truename . tramp-androidsu-handle-file-truename) - (file-user-uid . tramp-androidsu-handle-file-user-uid) - (file-writable-p . tramp-androidsu-adb-handle-file-writable-p) - (find-backup-file-name . tramp-androidsu-handle-find-backup-file-name) + (file-readable-p . tramp-androidsu-handle-file-readable-p) + (file-regular-p . tramp-handle-file-regular-p) + (file-remote-p . tramp-handle-file-remote-p) + (file-selinux-context . tramp-handle-file-selinux-context) + (file-symlink-p . tramp-handle-file-symlink-p) + (file-system-info . tramp-androidsu-handle-file-system-info) + (file-truename . tramp-handle-file-truename) + (file-user-uid . tramp-handle-file-user-uid) + (file-writable-p . tramp-androidsu-handle-file-writable-p) + (find-backup-file-name . tramp-handle-find-backup-file-name) ;; `get-file-buffer' performed by default handler. - (insert-directory . tramp-androidsu-handle-insert-directory) - (insert-file-contents . tramp-androidsu-handle-insert-file-contents) - (list-system-processes . tramp-androidsu-handle-list-system-processes) - (load . tramp-androidsu-handle-load) - (lock-file . tramp-androidsu-handle-lock-file) - (make-auto-save-file-name . tramp-androidsu-handle-make-auto-save-file-name) - (make-directory . tramp-androidsu-adb-handle-make-directory) + (insert-directory . tramp-handle-insert-directory) + (insert-file-contents . tramp-handle-insert-file-contents) + (list-system-processes . tramp-handle-list-system-processes) + (load . tramp-handle-load) + (lock-file . tramp-handle-lock-file) + (make-auto-save-file-name . tramp-handle-make-auto-save-file-name) + (make-directory . tramp-androidsu-handle-make-directory) (make-directory-internal . ignore) - (make-lock-file-name . tramp-androidsu-handle-make-lock-file-name) - (make-nearby-temp-file . tramp-androidsu-handle-make-nearby-temp-file) - (make-process . tramp-androidsu-make-process) - (make-symbolic-link . tramp-androidsu-sh-handle-make-symbolic-link) - (memory-info . tramp-androidsu-handle-memory-info) - (process-attributes . tramp-androidsu-handle-process-attributes) - (process-file . tramp-androidsu-adb-handle-process-file) - (rename-file . tramp-androidsu-sh-handle-rename-file) + (make-lock-file-name . tramp-handle-make-lock-file-name) + (make-nearby-temp-file . tramp-handle-make-nearby-temp-file) + (make-process . tramp-androidsu-handle-make-process) + (make-symbolic-link . tramp-androidsu-handle-make-symbolic-link) + (memory-info . tramp-handle-memory-info) + (process-attributes . tramp-handle-process-attributes) + (process-file . tramp-androidsu-handle-process-file) + (rename-file . tramp-androidsu-handle-rename-file) (set-file-acl . ignore) - (set-file-modes . tramp-androidsu-adb-handle-set-file-modes) + (set-file-modes . tramp-androidsu-handle-set-file-modes) (set-file-selinux-context . ignore) - (set-file-times . tramp-androidsu-adb-handle-set-file-times) - (set-visited-file-modtime . tramp-androidsu-handle-set-visited-file-modtime) - (shell-command . tramp-androidsu-handle-shell-command) - (start-file-process . tramp-androidsu-handle-start-file-process) - (substitute-in-file-name . tramp-androidsu-handle-substitute-in-file-name) - (temporary-file-directory . tramp-androidsu-handle-temporary-file-directory) + (set-file-times . tramp-androidsu-handle-set-file-times) + (set-visited-file-modtime . tramp-handle-set-visited-file-modtime) + (shell-command . tramp-handle-shell-command) + (start-file-process . tramp-handle-start-file-process) + (substitute-in-file-name . tramp-handle-substitute-in-file-name) + (temporary-file-directory . tramp-handle-temporary-file-directory) (tramp-get-home-directory . ignore) - (tramp-get-remote-gid . tramp-androidsu-adb-handle-get-remote-gid) - (tramp-get-remote-groups . tramp-androidsu-adb-handle-get-remote-groups) - (tramp-get-remote-uid . tramp-androidsu-adb-handle-get-remote-uid) + (tramp-get-remote-gid . tramp-androidsu-handle-get-remote-gid) + (tramp-get-remote-groups . tramp-androidsu-handle-get-remote-groups) + (tramp-get-remote-uid . tramp-androidsu-handle-get-remote-uid) (tramp-set-file-uid-gid . ignore) (unhandled-file-name-directory . ignore) - (unlock-file . tramp-androidsu-handle-unlock-file) + (unlock-file . tramp-handle-unlock-file) (vc-registered . ignore) - (verify-visited-file-modtime . tramp-androidsu-handle-verify-visited-file-modtime) - (write-region . tramp-androidsu-sh-handle-write-region)) + (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime) + (write-region . tramp-androidsu-handle-write-region)) "Alist of TRAMP handler functions for superuser sessions on Android.") ;; It must be a `defsubst' in order to push the whole code into @@ -669,7 +548,7 @@ arguments to pass to the OPERATION." (with-eval-after-load 'shell (connection-local-set-profiles - `(:application tramp :protocol ,tramp-adb-method) + `(:application tramp :protocol ,tramp-androidsu-method) 'tramp-adb-connection-local-default-shell-profile 'tramp-adb-connection-local-default-ps-profile)) From 2b5d43081a30f816dd38a16c7b5bfbad712a779b Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 3 Mar 2024 23:08:16 -0500 Subject: [PATCH 385/446] (major-mode-remap(-defaults)): New var and function (bug#69191) While `major-mode-remap-alist` provides a way for users to indicate the major mode of their choice, we need a similar variable for the use of packages. This patch adds a new `major-mode-remap-defaults` and changes various packages to obey it or make use of it. I think it nicely cleans the regexp duplication between CC-mode and `c-ts-mode.el` and also makes it easier/cleaner for users to override the changes made by `*-ts-mode.el`. * lisp/files.el (major-mode-remap-defaults): New variable. (major-mode-remap): New function. (set-auto-mode-0): Use it. * doc/lispref/modes.texi (Auto Major Mode): Document them. * lisp/textmodes/tex-mode.el (tex--redirect-to-submode): Use `major-mode-remap`. (major-mode-remap-defaults): Set it to remap AUCTeX modes by default. * lisp/progmodes/ruby-ts-mode.el (auto-mode-alist): Leave it alone. (major-mode-remap-defaults): Set this one instead. * lisp/progmodes/c-ts-mode.el (c-or-c++-ts-mode): Use `major-mode-remap`. (auto-mode-alist): Leave it alone. (major-mode-remap-defaults): Set this one instead. * lisp/org/ox.el (org-export-to-buffer): Modernize docstring accordingly. * lisp/progmodes/cc-mode.el (c-or-c++-mode): * lisp/org/ox-latex.el (org-latex-export-as-latex): * lisp/org/ox-koma-letter.el (org-koma-letter-export-as-latex): * lisp/org/ox-beamer.el (org-beamer-export-as-latex): Use `major-mode-remap` when available. --- doc/lispref/modes.texi | 33 ++++++++++++++++++++++++++ etc/NEWS | 4 ++++ lisp/files.el | 19 ++++++++++++--- lisp/org/ox-beamer.el | 5 +++- lisp/org/ox-koma-letter.el | 4 +++- lisp/org/ox-latex.el | 5 +++- lisp/org/ox.el | 2 +- lisp/progmodes/c-ts-mode.el | 42 +++++++++++++++------------------- lisp/progmodes/cc-mode.el | 22 ++++++++++-------- lisp/progmodes/go-ts-mode.el | 2 ++ lisp/progmodes/ruby-ts-mode.el | 14 ++---------- lisp/textmodes/tex-mode.el | 18 ++++++++++----- 12 files changed, 113 insertions(+), 57 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index a2e8f42cf1d..b034fecd77b 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -791,6 +791,39 @@ init file.) @end smallexample @end defvar +@defvar major-mode-remap-defaults +This variable contains an association list indicating which function +to call to activate a given major mode. This is used for file formats +that can be supported by various major modes, where this variable can be +used to indicate which alternative should be used by default. + +For example, a third-party package providing a much improved Pascal +major mode, can use the following to tell @code{normal-mode} to use +@code{spiffy-pascal-mode} for all the files that would normally use @code{pascal-mode}: + +@smallexample +@group +(add-to-list 'major-mode-remap-defaults '(pascal-mode . spiffy-pascal-mode)) +@end group +@end smallexample + +This variable has the same format as @code{major-mode-remap-alist}. +If both lists match a major mode, the entry in +@code{major-mode-remap-alist} takes precedence. +@end defvar + +@defun major-mode-remap mode +This function returns the major mode to use instead of @var{mode} +according to @code{major-mode-remap-alist} and +@code{major-mode-remap-defaults}. It returns @var{mode} if the mode +is not remapped by those variables. + +When a package wants to activate a major mode for a particular file +format, it should use this function, passing as @code{mode} argument the +canonical major mode for that file format, to find which specific major +mode to activate, so as to take into account the user's preferences. +@end defun + @node Mode Help @subsection Getting Help about a Major Mode @cindex mode help diff --git a/etc/NEWS b/etc/NEWS index 792e178c3b6..41bff184676 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1595,6 +1595,10 @@ values. * Lisp Changes in Emacs 30.1 +** New var 'major-mode-remap-defaults' and function 'major-mode-remap'. +The first is like Emacs-29's 'major-mode-remap-alist' but to be set by +packages (instead of users). The second looks up those two variables. + +++ ** Pcase's functions (in 'pred' and 'app') can specify the argument position. For example, instead of '(pred (< 5))' you can write '(pred (> _ 5))'. diff --git a/lisp/files.el b/lisp/files.el index ed18bc5841e..dd7580b6580 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3413,7 +3413,7 @@ checks if it uses an interpreter listed in `interpreter-mode-alist', matches the buffer beginning against `magic-mode-alist', compares the file name against the entries in `auto-mode-alist', then matches the buffer beginning against `magic-fallback-mode-alist'. -It also obeys `major-mode-remap-alist'. +It also obeys `major-mode-remap-alist' and `major-mode-remap-defaults'. If `enable-local-variables' is nil, or if the file name matches `inhibit-local-variables-regexps', this function does not check @@ -3559,9 +3559,22 @@ we don't actually set it to the same mode the buffer already has." Every entry is of the form (MODE . FUNCTION) which means that in order to activate the major mode MODE (specified via something like `auto-mode-alist', file-local variables, ...) we should actually call -FUNCTION instead." +FUNCTION instead. +FUNCTION can be nil to hide other entries (either in this var or in +`major-mode-remap-defaults') and means that we should call MODE." :type '(alist (symbol) (function))) +(defvar major-mode-remap-defaults nil + "Alist mapping file-specified mode to actual mode. +This works like `major-mode-remap-alist' except it has lower priority +and it is meant to be modified by packages rather than users.") + +(defun major-mode-remap (mode) + "Return the function to use to enable MODE." + (or (cdr (or (assq mode major-mode-remap-alist) + (assq mode major-mode-remap-defaults))) + mode)) + ;; When `keep-mode-if-same' is set, we are working on behalf of ;; set-visited-file-name. In that case, if the major mode specified is the ;; same one we already have, don't actually reset it. We don't want to lose @@ -3578,7 +3591,7 @@ same, do nothing and return nil." (eq mode (car set-auto-mode--last)) (eq major-mode (cdr set-auto-mode--last))))) (when mode - (funcall (alist-get mode major-mode-remap-alist mode)) + (funcall (major-mode-remap mode)) (unless (eq mode major-mode) (setq set-auto-mode--last (cons mode major-mode))) mode))) diff --git a/lisp/org/ox-beamer.el b/lisp/org/ox-beamer.el index 3d4d998432d..d3a90179d73 100644 --- a/lisp/org/ox-beamer.el +++ b/lisp/org/ox-beamer.el @@ -1008,7 +1008,10 @@ will be displayed when `org-export-show-temporary-export-buffer' is non-nil." (interactive) (org-export-to-buffer 'beamer "*Org BEAMER Export*" - async subtreep visible-only body-only ext-plist (lambda () (LaTeX-mode)))) + async subtreep visible-only body-only ext-plist + (if (fboundp 'major-mode-remap) + (major-mode-remap 'latex-mode) + #'LaTeX-mode))) ;;;###autoload (defun org-beamer-export-to-latex diff --git a/lisp/org/ox-koma-letter.el b/lisp/org/ox-koma-letter.el index aef25232c20..38460d1749e 100644 --- a/lisp/org/ox-koma-letter.el +++ b/lisp/org/ox-koma-letter.el @@ -911,7 +911,9 @@ non-nil." (let (org-koma-letter-special-contents) (org-export-to-buffer 'koma-letter "*Org KOMA-LETTER Export*" async subtreep visible-only body-only ext-plist - (lambda () (LaTeX-mode))))) + (if (fboundp 'major-mode-remap) + (major-mode-remap 'latex-mode) + #'LaTeX-mode)))) ;;;###autoload (defun org-koma-letter-export-to-latex diff --git a/lisp/org/ox-latex.el b/lisp/org/ox-latex.el index bca387e5935..98b388081ea 100644 --- a/lisp/org/ox-latex.el +++ b/lisp/org/ox-latex.el @@ -4160,7 +4160,10 @@ will be displayed when `org-export-show-temporary-export-buffer' is non-nil." (interactive) (org-export-to-buffer 'latex "*Org LATEX Export*" - async subtreep visible-only body-only ext-plist (lambda () (LaTeX-mode)))) + async subtreep visible-only body-only ext-plist + (if (fboundp 'major-mode-remap) + (major-mode-remap 'latex-mode) + #'LaTeX-mode))) ;;;###autoload (defun org-latex-convert-region-to-latex () diff --git a/lisp/org/ox.el b/lisp/org/ox.el index 19bf559c9e7..8e2fdd22acd 100644 --- a/lisp/org/ox.el +++ b/lisp/org/ox.el @@ -6608,7 +6608,7 @@ use it to set a major mode there, e.g., (interactive) (org-export-to-buffer \\='latex \"*Org LATEX Export*\" async subtreep visible-only body-only ext-plist - #\\='LaTeX-mode)) + (major-mode-remap 'latex-mode))) When expressed as an anonymous function, using `lambda', POST-PROCESS needs to be quoted. diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 4ef17daf876..315bb68699e 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1190,7 +1190,6 @@ BEG and END are described in `treesit-range-rules'." "C-c C-c" #'comment-region "C-c C-k" #'c-ts-mode-toggle-comment-style) -;;;###autoload (define-derived-mode c-ts-base-mode prog-mode "C" "Major mode for editing C, powered by tree-sitter. @@ -1439,36 +1438,33 @@ should be used. This function attempts to use file contents to determine whether the code is C or C++ and based on that chooses whether to enable `c-ts-mode' or `c++-ts-mode'." + (declare (obsolete c-or-c++-mode "30.1"))? (interactive) - (if (save-excursion - (save-restriction - (save-match-data ; Why `save-match-data'? - (widen) - (goto-char (point-min)) - (re-search-forward c-ts-mode--c-or-c++-regexp nil t)))) - (c++-ts-mode) - (c-ts-mode))) + (let ((mode + (if (save-excursion + (save-restriction + (save-match-data ; Why `save-match-data'? + (widen) + (goto-char (point-min)) + (re-search-forward c-ts-mode--c-or-c++-regexp nil t)))) + 'c++-ts-mode) + 'c-ts-mode)) + (funcall (major-mode-remap mode)))) + ;; The entries for C++ must come first to prevent *.c files be taken ;; as C++ on case-insensitive filesystems, since *.C files are C++, ;; not C. (if (treesit-ready-p 'cpp) - (add-to-list 'auto-mode-alist - '("\\(\\.ii\\|\\.\\(CC?\\|HH?\\)\\|\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\|\\.\\(cc\\|hh\\)\\)\\'" - . c++-ts-mode))) + (add-to-list 'major-mode-remap-defaults + '(c++-mode . c++-ts-mode))) (when (treesit-ready-p 'c) - (add-to-list 'auto-mode-alist - '("\\(\\.[chi]\\|\\.lex\\|\\.y\\(acc\\)?\\)\\'" . c-ts-mode)) - (add-to-list 'auto-mode-alist '("\\.x[pb]m\\'" . c-ts-mode)) - ;; image-mode's association must be before the C mode, otherwise XPM - ;; images will be initially visited as C files. Also note that the - ;; regexp must be different from what files.el does, or else - ;; add-to-list will not add the association where we want it. - (add-to-list 'auto-mode-alist '("\\.x[pb]m\\'" . image-mode))) + (add-to-list 'major-mode-remap-defaults '(c++-mode . c++-ts-mode)) + (add-to-list 'major-mode-remap-defaults '(c-mode . c-ts-mode))) -(if (and (treesit-ready-p 'cpp) - (treesit-ready-p 'c)) - (add-to-list 'auto-mode-alist '("\\.h\\'" . c-or-c++-ts-mode))) +(when (and (treesit-ready-p 'cpp) + (treesit-ready-p 'c)) + (add-to-list 'major-mode-remap-defaults '(c-or-c++-mode . c-or-c++-ts-mode))) (provide 'c-ts-mode) (provide 'c++-ts-mode) diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 64a679eacc7..e46ac2e2178 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -2902,15 +2902,19 @@ This function attempts to use file contents to determine whether the code is C or C++ and based on that chooses whether to enable `c-mode' or `c++-mode'." (interactive) - (if (save-excursion - (save-restriction - (save-match-data - (widen) - (goto-char (point-min)) - (re-search-forward c-or-c++-mode--regexp - (+ (point) c-guess-region-max) t)))) - (c++-mode) - (c-mode))) + (let ((mode + (if (save-excursion + (save-restriction + (save-match-data + (widen) + (goto-char (point-min)) + (re-search-forward c-or-c++-mode--regexp + (+ (point) c-guess-region-max) t)))) + 'c++-mode) + 'c-mode)) + (funcall (if (fboundp 'major-mode-remap) + (major-mode-remap mode) + mode)))) ;; Support for C++ diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el index 65adc1c55ea..296e4d0037d 100644 --- a/lisp/progmodes/go-ts-mode.el +++ b/lisp/progmodes/go-ts-mode.el @@ -262,6 +262,8 @@ (treesit-major-mode-setup))) (if (treesit-ready-p 'go) + ;; FIXME: Should we instead put `go-mode' in `auto-mode-alist' + ;; and then use `major-mode-remap-defaults' to map it to `go-ts-mode'? (add-to-list 'auto-mode-alist '("\\.go\\'" . go-ts-mode))) (defun go-ts-mode--defun-name (node &optional skip-prefix) diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el index 426ae248cac..cdfa3dca498 100644 --- a/lisp/progmodes/ruby-ts-mode.el +++ b/lisp/progmodes/ruby-ts-mode.el @@ -1211,18 +1211,8 @@ leading double colon is not added." (setq-local syntax-propertize-function #'ruby-ts--syntax-propertize)) (if (treesit-ready-p 'ruby) - ;; Copied from ruby-mode.el. - (add-to-list 'auto-mode-alist - (cons (concat "\\(?:\\.\\(?:" - "rbw?\\|ru\\|rake\\|thor" - "\\|jbuilder\\|rabl\\|gemspec\\|podspec" - "\\)" - "\\|/" - "\\(?:Gem\\|Rake\\|Cap\\|Thor" - "\\|Puppet\\|Berks\\|Brew" - "\\|Vagrant\\|Guard\\|Pod\\)file" - "\\)\\'") - 'ruby-ts-mode))) + (add-to-list 'major-mode-remap-defaults + '(ruby-mode . ruby-ts-mode))) (provide 'ruby-ts-mode) diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index 616b8871090..02ee1242c72 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -1036,14 +1036,20 @@ says which mode to use." ;; `tex--guess-mode' really tries to guess the *type* of file, ;; so we still need to consult `major-mode-remap-alist' ;; to see which mode to use for that type. - (alist-get mode major-mode-remap-alist mode)))))) + (major-mode-remap mode)))))) -;; The following three autoloaded aliases appear to conflict with -;; AUCTeX. We keep those confusing aliases for those users who may -;; have files annotated with -*- LaTeX -*- (e.g. because they received +;; Support files annotated with -*- LaTeX -*- (e.g. because they received ;; them from someone using AUCTeX). -;; FIXME: Turn them into autoloads so that AUCTeX can override them -;; with its own autoloads? Or maybe rely on `major-mode-remap-alist'? +;;;###autoload (add-to-list 'major-mode-remap-defaults '(TeX-mode . tex-mode)) +;;;###autoload (add-to-list 'major-mode-remap-defaults '(plain-TeX-mode . plain-tex-mode)) +;;;###autoload (add-to-list 'major-mode-remap-defaults '(LaTeX-mode . latex-mode)) + +;; FIXME: These aliases conflict with AUCTeX, but we still need them +;; because of packages out there which call these functions directly. +;; They should be patched to use `major-mode-remap'. +;; It would be nice to mark them obsolete somehow to encourage using +;; something else, but the obsolete declaration would become invalid +;; and confusing when AUCTeX *is* installed. ;;;###autoload (defalias 'TeX-mode #'tex-mode) ;;;###autoload (defalias 'plain-TeX-mode #'plain-tex-mode) ;;;###autoload (defalias 'LaTeX-mode #'latex-mode) From 6dacb60bb135dbb002c2ce1c70f70430c5d1bbff Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Mon, 4 Mar 2024 07:19:22 +0100 Subject: [PATCH 386/446] ; Fix last major-mode-remap-defaults change. --- lisp/org/ox.el | 2 +- lisp/progmodes/c-ts-mode.el | 6 +++--- lisp/progmodes/cc-mode.el | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lisp/org/ox.el b/lisp/org/ox.el index 8e2fdd22acd..bf2d9b569af 100644 --- a/lisp/org/ox.el +++ b/lisp/org/ox.el @@ -6608,7 +6608,7 @@ use it to set a major mode there, e.g., (interactive) (org-export-to-buffer \\='latex \"*Org LATEX Export*\" async subtreep visible-only body-only ext-plist - (major-mode-remap 'latex-mode))) + (major-mode-remap \\='latex-mode))) When expressed as an anonymous function, using `lambda', POST-PROCESS needs to be quoted. diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 315bb68699e..38b72e59388 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1438,7 +1438,7 @@ should be used. This function attempts to use file contents to determine whether the code is C or C++ and based on that chooses whether to enable `c-ts-mode' or `c++-ts-mode'." - (declare (obsolete c-or-c++-mode "30.1"))? + (declare (obsolete c-or-c++-mode "30.1")) (interactive) (let ((mode (if (save-excursion @@ -1447,8 +1447,8 @@ the code is C or C++ and based on that chooses whether to enable (widen) (goto-char (point-min)) (re-search-forward c-ts-mode--c-or-c++-regexp nil t)))) - 'c++-ts-mode) - 'c-ts-mode)) + 'c++-ts-mode + 'c-ts-mode))) (funcall (major-mode-remap mode)))) ;; The entries for C++ must come first to prevent *.c files be taken diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index e46ac2e2178..1a9d0907bd0 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -2910,8 +2910,8 @@ the code is C or C++ and based on that chooses whether to enable (goto-char (point-min)) (re-search-forward c-or-c++-mode--regexp (+ (point) c-guess-region-max) t)))) - 'c++-mode) - 'c-mode)) + 'c++-mode + 'c-mode))) (funcall (if (fboundp 'major-mode-remap) (major-mode-remap mode) mode)))) From 912e37b811107768e0cb3bc95184177f817dbdb2 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Mon, 4 Mar 2024 10:33:49 +0100 Subject: [PATCH 387/446] Fix 'set-window-configuration' and 'window-state-put' Fix some bugs with 'window-state-put' (Bug#69093). Add new hook 'window-kept-windows-functions' (Bug#68235). * doc/lispref/windows.texi (Window Configurations): Mention 'window-kept-windows-functions'. (Window Hooks): Describe new abnormal hook 'window-kept-windows-functions'. * src/marker.c (Fmarker_last_position): New function to return the last position of a marker even if its buffer is now dead. * src/window.c (Fset_window_configuration): If 'window-kept-windows-functions' is non-nil, do not delete any window whose buffer is now dead but remember all such windows in a list to pass to 'window-kept-windows-functions'. Run 'window-kept-windows-functions' if it is non-nil. (Vwindow_kept_windows_functions): New abnormal hook run by Fset_window_configuration and 'window-state-put' with two arguments - the frame whose configuration is restored and a list of entries for each window whose buffer was found dead during restoration. Each entry is a list of four elements, the window, the dead buffer, and the last know positions of the start and point of that window. * lisp/window.el (window-state-put-kept-windows) (window-state-put-selected-window): New variables. (window--state-put-2): Make sure buffer is live before restoring its state. Set 'window-state-put-selected-window' to state's selected window. If 'window-kept-windows-functions' is non-nil, do not delete any windows whose buffer is found dead but remember all such windows in a list to pass to 'window-kept-windows-functions'. (window-state-put): Run 'window-kept-windows-functions' if it is non-nil. Select window recorded in 'window-state-put-selected-window'. --- doc/lispref/windows.texi | 40 ++++++++++++++++++++-- lisp/window.el | 65 ++++++++++++++++++++++++++++++++---- src/marker.c | 13 ++++++++ src/window.c | 71 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 173 insertions(+), 16 deletions(-) diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi index f14e74bc785..fe3dc573df5 100644 --- a/doc/lispref/windows.texi +++ b/doc/lispref/windows.texi @@ -6266,9 +6266,13 @@ this function does is to restore the value of the variable If the buffer of a window of @var{configuration} has been killed since @var{configuration} was made, that window is, as a rule, removed from -the restored configuration. However, if that window is the last -window remaining in the restored configuration, another live buffer is -shown in it. +the restored configuration. However, if that window is the last window +remaining in the restored configuration, another live buffer is shown in +it. Also, if the variable @var{window-kept-windows-functions} is +non-@code{nil}, any window whose buffer is now dead is not deleted. +Rather, this function will show another live buffer in that window and +include an entry for that window when calling any function in +@var{window-kept-windows-functions} (@pxref{Window Hooks}). Here is a way of using this function to get the same effect as @code{save-window-excursion}: @@ -6357,6 +6361,15 @@ a live window, it is replaced by a new live window created on the same frame before putting @var{state} into it. If @var{window} is @code{nil}, it puts the window state into a new window. +If the buffer of any window recorded in @var{state} has been killed +since @var{state} was made, that window is, as a rule, not restored. +However, if that window is the only window in @var{state}, another live +buffer will be shown in it. Also, if the variable +@var{window-kept-windows-functions} is non-@code{nil}, any window whose +buffer is now dead is restored. This function will show another live +buffer in it and include an entry for that window when calling a +function in @var{window-kept-windows-functions} (@pxref{Window Hooks}). + If the optional argument @var{ignore} is non-@code{nil}, it means to ignore minimum window sizes and fixed-size restrictions. If @var{ignore} is @code{safe}, this means windows can get as small as one line @@ -6623,6 +6636,27 @@ Lock fontification function, which will be called whenever parts of a buffer are (re)fontified because a window was scrolled or its size changed. @xref{Other Font Lock Variables}. +@cindex window kept windows functions +@defvar window-kept-windows-functions + This variable holds a list of functions that Emacs will call after +restoring a window configuration via @code{set-window-configuration} or +state via @code{window-state-put} (@pxref{Window Configurations}). When +the value of this variable is non-@code{nil}, these functions will not +delete any window whose buffer has been killed since the corresponding +configuration or state was saved, but show some live buffer in it. + +The value should be a list of functions that take two arguments. The +first argument specifies the frame whose windows have been restored. +The second argument specifies a list of entries for each window whose +buffer has been found dead at the time @code{set-window-configuration} +or @code{window-state-put} tried to restore it. Each entry is a list of +four values - the window whose buffer was found dead, the dead buffer, +and the last known positions of start and point of the buffer in that +window. Any function run by this hook should check that the window is +live since another function run by this hook may have deleted it in the +meantime. +@end defvar + @cindex window change functions The remainder of this section covers six hooks that are called during redisplay provided a significant, non-scrolling change of a diff --git a/lisp/window.el b/lisp/window.el index 6df20353b5e..29336f573f8 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -6174,6 +6174,12 @@ value can be also stored on disk and read back in a new session." (defvar window-state-put-stale-windows nil "Helper variable for `window-state-put'.") +(defvar window-state-put-kept-windows nil + "Helper variable for `window-state-put'.") + +(defvar window-state-put-selected-window nil + "Helper variable for `window-state-put'.") + (defun window--state-put-1 (state &optional window ignore totals pixelwise) "Helper function for `window-state-put'." (let ((type (car state))) @@ -6278,9 +6284,10 @@ value can be also stored on disk and read back in a new session." (set-window-parameter window (car parameter) (cdr parameter)))) ;; Process buffer related state. (when state - (let ((buffer (get-buffer (car state))) - (state (cdr state))) - (if buffer + (let* ((old-buffer-or-name (car state)) + (buffer (get-buffer old-buffer-or-name)) + (state (cdr state))) + (if (buffer-live-p buffer) (with-current-buffer buffer (set-window-buffer window buffer) (set-window-hscroll window (cdr (assq 'hscroll state))) @@ -6348,7 +6355,18 @@ value can be also stored on disk and read back in a new session." (set-window-point window (cdr (assq 'point state)))) ;; Select window if it's the selected one. (when (cdr (assq 'selected state)) - (select-window window)) + ;; This used to call 'select-window' which, however, + ;; can be partially undone because the current buffer + ;; may subsequently change twice: When leaving the + ;; present 'with-current-buffer' and when leaving the + ;; containing 'with-temp-buffer' form (Bug#69093). + ;; 'window-state-put-selected-window' should now work + ;; around that bug but we leave this 'select-window' + ;; in since some code run before the part that fixed + ;; it might still refer to this window as the selected + ;; one. + (select-window window) + (setq window-state-put-selected-window window)) (set-window-next-buffers window (delq nil (mapcar (lambda (buffer) @@ -6375,7 +6393,20 @@ value can be also stored on disk and read back in a new session." ;; save the window with the intention of deleting it later ;; if possible. (switch-to-prev-buffer window) - (push window window-state-put-stale-windows))))))) + (if window-kept-windows-functions + (let* ((start (cdr (assq 'start state))) + ;; Handle both - marker positions from writable + ;; states and markers from non-writable states. + (start-pos (if (markerp start) + (marker-last-position start) + start)) + (point (cdr (assq 'point state))) + (point-pos (if (markerp point) + (marker-last-position point) + point))) + (push (list window old-buffer-or-name start-pos point-pos) + window-state-put-kept-windows)) + (push window window-state-put-stale-windows)))))))) (defun window-state-put (state &optional window ignore) "Put window state STATE into WINDOW. @@ -6388,8 +6419,20 @@ If WINDOW is nil, create a new window before putting STATE into it. Optional argument IGNORE non-nil means ignore minimum window sizes and fixed size restrictions. IGNORE equal `safe' means windows can get as small as `window-safe-min-height' and -`window-safe-min-width'." +`window-safe-min-width'. + +If the abnormal hook `window-kept-windows-functions' is non-nil, +do not delete any windows saved by STATE whose buffers were +deleted since STATE was saved. Rather, show some live buffer in +them and call the functions in `window-kept-windows-functions' +with a list of two arguments: the frame where STATE was put and a +list of entries for each such window. Each entry contains four +elements - the window, its old buffer and the last positions of +`window-start' and `window-point' for the buffer in that window. +Always check the window for liveness because another function run +by this hook may have deleted it." (setq window-state-put-stale-windows nil) + (setq window-state-put-kept-windows nil) ;; When WINDOW is internal or nil, reduce it to a live one, ;; then create a new window on the same frame to put STATE into. @@ -6482,6 +6525,7 @@ windows can get as small as `window-safe-min-height' and (error "Window %s too small to accommodate state" window) (setq state (cdr state)) (setq window-state-put-list nil) + (setq window-state-put-selected-window nil) ;; Work on the windows of a temporary buffer to make sure that ;; splitting proceeds regardless of any buffer local values of ;; `window-size-fixed'. Release that buffer after the buffers of @@ -6490,14 +6534,21 @@ windows can get as small as `window-safe-min-height' and (set-window-buffer window (current-buffer)) (window--state-put-1 state window nil totals pixelwise) (window--state-put-2 ignore pixelwise)) + (when (window-live-p window-state-put-selected-window) + (select-window window-state-put-selected-window)) (while window-state-put-stale-windows (let ((window (pop window-state-put-stale-windows))) - ;; Avoid that 'window-deletable-p' throws an error if window + ;; Avoid that 'window-deletable-p' throws an error if window ;; was already deleted when exiting 'with-temp-buffer' above ;; (Bug#54028). (when (and (window-valid-p window) (eq (window-deletable-p window) t)) (delete-window window)))) + (when window-kept-windows-functions + (run-hook-with-args + 'window-kept-windows-functions + frame window-state-put-kept-windows) + (setq window-state-put-kept-windows nil)) (window--check frame)))) (defun window-state-buffers (state) diff --git a/src/marker.c b/src/marker.c index 1559dd52719..2abc951fc76 100644 --- a/src/marker.c +++ b/src/marker.c @@ -463,6 +463,18 @@ DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0, return Qnil; } +DEFUN ("marker-last-position", Fmarker_last_position, Smarker_last_position, 1, 1, 0, + doc: /* Return last position of MARKER in its buffer. +This is like `marker-position' with one exception: If the buffer of +MARKER is dead, it returns the last position of MARKER in that buffer +before it was killed. */) + (Lisp_Object marker) +{ + CHECK_MARKER (marker); + + return make_fixnum (XMARKER (marker)->charpos); +} + /* Change M so it points to B at CHARPOS and BYTEPOS. */ static void @@ -830,6 +842,7 @@ void syms_of_marker (void) { defsubr (&Smarker_position); + defsubr (&Smarker_last_position); defsubr (&Smarker_buffer); defsubr (&Sset_marker); defsubr (&Scopy_marker); diff --git a/src/window.c b/src/window.c index 0c84b4f4bf3..ea761fad8bc 100644 --- a/src/window.c +++ b/src/window.c @@ -7109,6 +7109,24 @@ current at the start of the function. If DONT-SET-MINIWINDOW is non-nil, the mini-window of the frame doesn't get set to the corresponding element of CONFIGURATION. +Normally, this function will try to delete any dead window in +CONFIGURATION whose buffer has been deleted since CONFIGURATION was +made. However, if the abnormal hook `window-kept-windows-functions' is +non-nil, it will preserve such a window in the restored layout and show +another buffer in it. + +After restoring the frame layout, this function runs the abnormal hook +`window-kept-windows-functions' with two arguments - the frame whose +layout it has restored and a list of entries for each window whose +buffer has been found dead when it tried to restore CONFIGURATION: Each +entry is a list of four elements where +`window' denotes the window whose buffer was found dead, `buffer' +denotes the dead buffer, and `start' and `point' denote the last known +positions of `window-start' and `window-point' of the buffer in that +window. Any function run by this hook should check such a window for +liveness because another function run by this hook may have deleted it +in the meantime." + If CONFIGURATION was made from a frame that is now deleted, only frame-independent values can be restored. In this case, the return value is nil. Otherwise the value is t. */) @@ -7119,6 +7137,7 @@ the return value is nil. Otherwise the value is t. */) struct Lisp_Vector *saved_windows; Lisp_Object new_current_buffer; Lisp_Object frame; + Lisp_Object kept_windows = Qnil; Lisp_Object old_frame = selected_frame; struct frame *f; ptrdiff_t old_point = -1; @@ -7359,6 +7378,11 @@ the return value is nil. Otherwise the value is t. */) BUF_PT (XBUFFER (w->contents)), BUF_PT_BYTE (XBUFFER (w->contents))); w->start_at_line_beg = true; + if (!NILP (Vwindow_kept_windows_functions)) + kept_windows = Fcons (list4 (window, p->buffer, + Fmarker_last_position (p->start), + Fmarker_last_position (p->pointm)), + kept_windows); } else if (!NILP (w->start)) /* Leaf window has no live buffer, get one. */ @@ -7379,6 +7403,11 @@ the return value is nil. Otherwise the value is t. */) dead_windows = Fcons (window, dead_windows); /* Make sure window is no more dedicated. */ wset_dedicated (w, Qnil); + if (!NILP (Vwindow_kept_windows_functions)) + kept_windows = Fcons (list4 (window, p->buffer, + Fmarker_last_position (p->start), + Fmarker_last_position (p->pointm)), + kept_windows); } } @@ -7430,12 +7459,13 @@ the return value is nil. Otherwise the value is t. */) unblock_input (); /* Scan dead buffer windows. */ - for (; CONSP (dead_windows); dead_windows = XCDR (dead_windows)) - { - window = XCAR (dead_windows); - if (WINDOW_LIVE_P (window) && !EQ (window, FRAME_ROOT_WINDOW (f))) - delete_deletable_window (window); - } + if (!NILP (Vwindow_kept_windows_functions)) + for (; CONSP (dead_windows); dead_windows = XCDR (dead_windows)) + { + window = XCAR (dead_windows); + if (WINDOW_LIVE_P (window) && !EQ (window, FRAME_ROOT_WINDOW (f))) + delete_deletable_window (window); + } /* Record the selected window's buffer here. The window should already be the selected one from the call above. */ @@ -7482,6 +7512,11 @@ the return value is nil. Otherwise the value is t. */) minibuf_selected_window = data->minibuf_selected_window; SAFE_FREE (); + + if (!NILP (Vrun_hooks) && !NILP (Vwindow_kept_windows_functions)) + run_hook_with_args_2 (Qwindow_kept_windows_functions, frame, + kept_windows); + return FRAME_LIVE_P (f) ? Qt : Qnil; } @@ -8479,6 +8514,8 @@ syms_of_window (void) DEFSYM (Qheader_line_format, "header-line-format"); DEFSYM (Qtab_line_format, "tab-line-format"); DEFSYM (Qno_other_window, "no-other-window"); + DEFSYM (Qwindow_kept_windows_functions, + "window-kept-windows-functions"); DEFVAR_LISP ("temp-buffer-show-function", Vtemp_buffer_show_function, doc: /* Non-nil means call as function to display a help buffer. @@ -8636,6 +8673,28 @@ its buffer or its total or body size since the last redisplay. Each call is performed with the frame temporarily selected. */); Vwindow_configuration_change_hook = Qnil; + DEFVAR_LISP ("window-kept-windows-functions", + Vwindow_kept_windows_functions, + doc: /* Functions run after restoring a window configuration or state. +These functions are called by `set-window-configuration' and +`window-state-put'. When the value of this variable is non-nil, these +functions restore any window whose buffer has been deleted since the +corresponding configuration or state was saved. Rather than deleting +such a window, `set-window-configuration' and `window-state-put' show +some live buffer in it. + +The value should be a list of functions that take two arguments. The +first argument specifies the frame whose configuration has been +restored. The second argument, if non-nil, specifies a list of entries +for each window whose buffer has been found dead at the time +'set-window-configuration' or `window-state-put' tried to restore it in +that window. Each entry is a list of four values - the window whose +buffer was found dead, the dead buffer, and the positions of start and +point of the buffer in that window. Note that the window may be already +dead since another function on this list may have deleted it in the +meantime. */); + Vwindow_kept_windows_functions = Qnil; + DEFVAR_LISP ("recenter-redisplay", Vrecenter_redisplay, doc: /* Non-nil means `recenter' redraws entire frame. If this option is non-nil, then the `recenter' command with a nil From 0df3dc3d46fe7848aabb3ca5ff7085ca59799f43 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 4 Mar 2024 14:59:27 +0200 Subject: [PATCH 388/446] Avoid crashes due to base-less indirect buffer * src/buffer.c (Fkill_buffer): Prevent killing a buffer if its indirect buffer refuses to be killed. (Bug#69529) --- src/buffer.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 126f3eb055a..9f55a8813fa 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1971,8 +1971,16 @@ cleaning up all windows currently displaying the buffer to be killed. */) Lisp_Object tail, other; FOR_EACH_LIVE_BUFFER (tail, other) - if (XBUFFER (other)->base_buffer == b) - Fkill_buffer (other); + { + struct buffer *obuf = XBUFFER (other); + if (obuf->base_buffer == b) + { + Fkill_buffer (other); + if (BUFFER_LIVE_P (obuf)) + error ("Unable to kill buffer whose indirect buffer `%s' cannot be killed", + SDATA (BVAR (obuf, name))); + } + } /* Exit if we now have killed the base buffer (Bug#11665). */ if (!BUFFER_LIVE_P (b)) From 3b7cb55e5bec692fc1055e0b70a95afb4fac107f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 27 Feb 2024 12:31:57 +0100 Subject: [PATCH 389/446] ; * etc/NEWS: add missing definite article --- etc/NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 41bff184676..06856602ea8 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1964,8 +1964,8 @@ Example: "Uses c:\remote\dir\files and the key \C-x." ...) -where the docstring contains four control characters 'CR', 'DEL', 'FF' -and 'C-x'. +where the docstring contains the four control characters 'CR', 'DEL', +'FF' and 'C-x'. The warning name is 'docstrings-control-chars'. From 2c2a15bd171ecbf87fdac4405c7ea5f567fcf38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Sun, 3 Mar 2024 15:55:30 +0100 Subject: [PATCH 390/446] ; * lisp/vc/diff-mode.el (diff--refine-hunk): Escape literal `+`. --- lisp/vc/diff-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 99ac50c155a..ac7d55c8a46 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -2353,7 +2353,7 @@ by `diff-refine-hunk'." (match-end 0) 'diff-refine-removed)) (goto-char middle) - (while (re-search-forward "^\\(?:+.*\n\\)+" end t) + (while (re-search-forward "^\\(?:\\+.*\n\\)+" end t) (diff--refine-propertize (match-beginning 0) (match-end 0) 'diff-refine-added)))))) From b9e8474a4470f71c30a4b89651fd3c5f2ef92ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 4 Mar 2024 10:44:19 +0100 Subject: [PATCH 391/446] Repair miscompilation of single-arg `apply` (bug#69533) * lisp/emacs-lisp/byte-opt.el (byte-optimize-apply): Don't optimise single-argument `apply`; it's a legacy construct. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases): Add test case. --- lisp/emacs-lisp/byte-opt.el | 3 ++- test/lisp/emacs-lisp/bytecomp-tests.el | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index add13a5c312..f75be3f71ad 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1448,7 +1448,8 @@ See Info node `(elisp) Integer Basics'." (defun byte-optimize-apply (form) (let ((len (length form))) - (if (>= len 2) + ;; Single-arg `apply' is an abomination that we don't bother optimizing. + (if (> len 2) (let ((fn (nth 1 form)) (last (nth (1- len) form))) (cond diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el index 8ccac492141..26408e8685a 100644 --- a/test/lisp/emacs-lisp/bytecomp-tests.el +++ b/test/lisp/emacs-lisp/bytecomp-tests.el @@ -800,6 +800,9 @@ inner loops respectively." ;; Aristotelian identity optimization (let ((x (bytecomp-test-identity 1))) (list (eq x x) (eql x x) (equal x x))) + + ;; Legacy single-arg `apply' call + (apply '(* 2 3)) ) "List of expressions for cross-testing interpreted and compiled code.") From 11ffb4656d768b09e1f7dfacc091d85eef4a403a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Mon, 4 Mar 2024 14:14:05 +0100 Subject: [PATCH 392/446] Revert "Replace XSETSYMBOL with make_lisp_symbol" This reverts commit de6b1e1efb1a36c69e7a6e09297e1de5b1477121. While it did simplify code, there aren't much in the way of technical benefits the change at this time, and there were protest against the unwarranted style change. --- src/alloc.c | 12 ++++++++---- src/buffer.c | 4 ++-- src/data.c | 33 +++++++++++++++++++-------------- src/eval.c | 2 +- src/lisp.h | 1 + 5 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 16257469aa6..2ffd2415447 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3960,7 +3960,7 @@ Its value is void, and its function definition and property list are nil. */) if (symbol_free_list) { ASAN_UNPOISON_SYMBOL (symbol_free_list); - val = make_lisp_symbol (symbol_free_list); + XSETSYMBOL (val, symbol_free_list); symbol_free_list = symbol_free_list->u.s.next; } else @@ -3976,7 +3976,7 @@ Its value is void, and its function definition and property list are nil. */) } ASAN_UNPOISON_SYMBOL (&symbol_block->symbols[symbol_block_index]); - val = make_lisp_symbol (&symbol_block->symbols[symbol_block_index]); + XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index]); symbol_block_index++; } @@ -7398,8 +7398,12 @@ process_mark_stack (ptrdiff_t base_sp) mark_stack_push_value (SYMBOL_VAL (ptr)); break; case SYMBOL_VARALIAS: - mark_stack_push_value (make_lisp_symbol (SYMBOL_ALIAS (ptr))); - break; + { + Lisp_Object tem; + XSETSYMBOL (tem, SYMBOL_ALIAS (ptr)); + mark_stack_push_value (tem); + break; + } case SYMBOL_LOCALIZED: { struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr); diff --git a/src/buffer.c b/src/buffer.c index 9f55a8813fa..43a9249528c 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1340,7 +1340,7 @@ buffer_local_value (Lisp_Object variable, Lisp_Object buffer) case SYMBOL_LOCALIZED: { /* Look in local_var_alist. */ struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); - variable = make_lisp_symbol (sym); /* Update In case of aliasing. */ + XSETSYMBOL (variable, sym); /* Update In case of aliasing. */ result = assq_no_quit (variable, BVAR (buf, local_var_alist)); if (!NILP (result)) { @@ -4985,7 +4985,7 @@ defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd, const char *namestring, sym->u.s.declared_special = true; sym->u.s.redirect = SYMBOL_FORWARDED; SET_SYMBOL_FWD (sym, bo_fwd); - PER_BUFFER_SYMBOL (offset) = make_lisp_symbol (sym); + XSETSYMBOL (PER_BUFFER_SYMBOL (offset), sym); if (PER_BUFFER_IDX (offset) == 0) /* Did a DEFVAR_PER_BUFFER without initializing the corresponding diff --git a/src/data.c b/src/data.c index c87b5317618..df08eaf8102 100644 --- a/src/data.c +++ b/src/data.c @@ -1256,7 +1256,7 @@ If OBJECT is not a symbol, just return it. */) struct Lisp_Symbol *sym = XSYMBOL (object); while (sym->u.s.redirect == SYMBOL_VARALIAS) sym = SYMBOL_ALIAS (sym); - object = make_lisp_symbol (sym); + XSETSYMBOL (object, sym); } return object; } @@ -1506,9 +1506,12 @@ swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_ if (blv->fwd.fwdptr) set_blv_value (blv, do_symval_forwarding (blv->fwd)); /* Choose the new binding. */ - tem1 = assq_no_quit (make_lisp_symbol (symbol), - BVAR (current_buffer, local_var_alist)); - set_blv_where (blv, Fcurrent_buffer ()); + { + Lisp_Object var; + XSETSYMBOL (var, symbol); + tem1 = assq_no_quit (var, BVAR (current_buffer, local_var_alist)); + set_blv_where (blv, Fcurrent_buffer ()); + } if (!(blv->found = !NILP (tem1))) tem1 = blv->defcell; @@ -1652,8 +1655,7 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, set_blv_value (blv, do_symval_forwarding (blv->fwd)); /* Find the new binding. */ - /* May have changed via aliasing. */ - symbol = make_lisp_symbol (sym); + XSETSYMBOL (symbol, sym); /* May have changed via aliasing. */ Lisp_Object tem1 = assq_no_quit (symbol, BVAR (XBUFFER (where), local_var_alist)); @@ -2057,10 +2059,13 @@ make_blv (struct Lisp_Symbol *sym, bool forwarded, union Lisp_Val_Fwd valcontents) { struct Lisp_Buffer_Local_Value *blv = xmalloc (sizeof *blv); - Lisp_Object tem = Fcons (make_lisp_symbol (sym), - forwarded - ? do_symval_forwarding (valcontents.fwd) - : valcontents.value); + Lisp_Object symbol; + Lisp_Object tem; + + XSETSYMBOL (symbol, sym); + tem = Fcons (symbol, (forwarded + ? do_symval_forwarding (valcontents.fwd) + : valcontents.value)); /* Buffer_Local_Values cannot have as realval a buffer-local or keyboard-local forwarding. */ @@ -2216,7 +2221,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */) } /* Make sure this buffer has its own value of symbol. */ - variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ + XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist)); if (NILP (tem)) { @@ -2296,7 +2301,7 @@ From now on the default value will apply in this buffer. Return VARIABLE. */) notify_variable_watchers (variable, Qnil, Qmakunbound, Fcurrent_buffer ()); /* Get rid of this buffer's alist element, if any. */ - variable = make_lisp_symbol (sym); /* Propagate variable indirection. */ + XSETSYMBOL (variable, sym); /* Propagate variable indirection. */ tem = assq_no_quit (variable, BVAR (current_buffer, local_var_alist)); if (!NILP (tem)) bset_local_var_alist @@ -2341,7 +2346,7 @@ Also see `buffer-local-boundp'.*/) Lisp_Object tmp; struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); XSETBUFFER (tmp, buf); - variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ + XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ if (EQ (blv->where, tmp)) /* The binding is already loaded. */ return blv_found (blv) ? Qt : Qnil; @@ -2391,7 +2396,7 @@ value in BUFFER, or if VARIABLE is automatically buffer-local (see struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym); if (blv->local_if_set) return Qt; - variable = make_lisp_symbol (sym); /* Update in case of aliasing. */ + XSETSYMBOL (variable, sym); /* Update in case of aliasing. */ return Flocal_variable_p (variable, buffer); } case SYMBOL_FORWARDED: diff --git a/src/eval.c b/src/eval.c index 9d3b98eb359..95eb21909d2 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3475,7 +3475,7 @@ specbind (Lisp_Object symbol, Lisp_Object value) switch (sym->u.s.redirect) { case SYMBOL_VARALIAS: - sym = SYMBOL_ALIAS (sym); symbol = make_lisp_symbol (sym); goto start; + sym = SYMBOL_ALIAS (sym); XSETSYMBOL (symbol, sym); goto start; case SYMBOL_PLAINVAL: /* The most common case is that of a non-constant symbol with a trivial value. Make that as fast as we can. */ diff --git a/src/lisp.h b/src/lisp.h index 4fc44745211..f353e4956eb 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1380,6 +1380,7 @@ make_lisp_ptr (void *ptr, enum Lisp_Type type) #define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons)) #define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike)) #define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String)) +#define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (b)) #define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float)) /* Return a Lisp_Object value that does not correspond to any object. From 5b49a38d1b37707bbbc8c069ed20ce7cd18fb2ac Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Mon, 4 Mar 2024 15:44:24 +0100 Subject: [PATCH 393/446] tramp-androidsu.el code cleanup * lisp/net/tramp-androidsu.el (tramp-androidsu-generate-wrapper): Prefer #' notation for function names. (tramp-androidsu-handle-copy-file) (tramp-androidsu-handle-file-local-copy) (tramp-androidsu-handle-make-symbolic-link) (tramp-androidsu-handle-rename-file) (tramp-androidsu-handle-write-region): Don't use a wrapper. (tramp-adb-connection-local-default-ps-profile): Don't initialize, this happens in tramp-db.el. --- lisp/net/tramp-androidsu.el | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index 12453d40acd..c7fb67d4081 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -232,19 +232,19 @@ FUNCTION." ;; tramp-adb-wait-for-output addresses problems introduced ;; by the adb utility itself, not Android utilities, so ;; replace it with the regular TRAMP function. - (fset 'tramp-adb-wait-for-output #'tramp-wait-for-output) + (fset #'tramp-adb-wait-for-output #'tramp-wait-for-output) ;; Likewise, except some special treatment is necessary on ;; account of flaws in Android's su implementation. - (fset 'tramp-adb-maybe-open-connection + (fset #'tramp-adb-maybe-open-connection #'tramp-androidsu-maybe-open-connection) (apply function args)) ;; Restore the original definitions of the functions overridden ;; above. - (fset 'tramp-adb-wait-for-output tramp-adb-wait-for-output) - (fset 'tramp-adb-maybe-open-connection tramp-adb-maybe-open-connection))))) + (fset #'tramp-adb-wait-for-output tramp-adb-wait-for-output) + (fset #'tramp-adb-maybe-open-connection + tramp-adb-maybe-open-connection))))) -(defalias 'tramp-androidsu-handle-copy-file - (tramp-androidsu-generate-wrapper #'tramp-sh-handle-copy-file)) +(defalias 'tramp-androidsu-handle-copy-file #'tramp-sh-handle-copy-file) (defalias 'tramp-androidsu-handle-delete-directory (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-directory)) @@ -253,7 +253,8 @@ FUNCTION." (tramp-androidsu-generate-wrapper #'tramp-adb-handle-delete-file)) (defalias 'tramp-androidsu-handle-directory-files-and-attributes - (tramp-androidsu-generate-wrapper #'tramp-adb-handle-directory-files-and-attributes)) + (tramp-androidsu-generate-wrapper + #'tramp-adb-handle-directory-files-and-attributes)) (defalias 'tramp-androidsu-handle-exec-path (tramp-androidsu-generate-wrapper #'tramp-adb-handle-exec-path)) @@ -268,10 +269,11 @@ FUNCTION." (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-exists-p)) (defalias 'tramp-androidsu-handle-file-local-copy - (tramp-androidsu-generate-wrapper #'tramp-sh-handle-file-local-copy)) + #'tramp-sh-handle-file-local-copy) (defalias 'tramp-androidsu-handle-file-name-all-completions - (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-name-all-completions)) + (tramp-androidsu-generate-wrapper + #'tramp-adb-handle-file-name-all-completions)) (defalias 'tramp-androidsu-handle-file-readable-p (tramp-androidsu-generate-wrapper #'tramp-adb-handle-file-readable-p)) @@ -400,14 +402,12 @@ FUNCTION." p))))) (defalias 'tramp-androidsu-handle-make-symbolic-link - (tramp-androidsu-generate-wrapper - #'tramp-sh-handle-make-symbolic-link)) + #'tramp-sh-handle-make-symbolic-link) (defalias 'tramp-androidsu-handle-process-file (tramp-androidsu-generate-wrapper #'tramp-adb-handle-process-file)) -(defalias 'tramp-androidsu-handle-rename-file - (tramp-androidsu-generate-wrapper #'tramp-sh-handle-rename-file)) +(defalias 'tramp-androidsu-handle-rename-file #'tramp-sh-handle-rename-file) (defalias 'tramp-androidsu-handle-set-file-modes (tramp-androidsu-generate-wrapper #'tramp-adb-handle-set-file-modes)) @@ -424,8 +424,7 @@ FUNCTION." (defalias 'tramp-androidsu-handle-get-remote-uid (tramp-androidsu-generate-wrapper #'tramp-adb-handle-get-remote-uid)) -(defalias 'tramp-androidsu-handle-write-region - (tramp-androidsu-generate-wrapper #'tramp-sh-handle-write-region)) +(defalias 'tramp-androidsu-handle-write-region #'tramp-sh-handle-write-region) ;;;###tramp-autoload (defconst tramp-androidsu-file-name-handler-alist @@ -458,7 +457,8 @@ FUNCTION." (file-local-copy . tramp-androidsu-handle-file-local-copy) (file-locked-p . tramp-handle-file-locked-p) (file-modes . tramp-handle-file-modes) - (file-name-all-completions . tramp-androidsu-handle-file-name-all-completions) + (file-name-all-completions + . tramp-androidsu-handle-file-name-all-completions) (file-name-as-directory . tramp-handle-file-name-as-directory) (file-name-case-insensitive-p . tramp-handle-file-name-case-insensitive-p) (file-name-completion . tramp-handle-file-name-completion) @@ -542,10 +542,6 @@ arguments to pass to the OPERATION." (tramp-register-foreign-file-name-handler #'tramp-androidsu-file-name-p #'tramp-androidsu-file-name-handler)) -(connection-local-set-profile-variables - 'tramp-adb-connection-local-default-ps-profile - tramp-adb-connection-local-default-ps-variables) - (with-eval-after-load 'shell (connection-local-set-profiles `(:application tramp :protocol ,tramp-androidsu-method) From 6e801077ae88e72dbad32015a083602062c4efe3 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 4 Mar 2024 17:09:29 +0200 Subject: [PATCH 394/446] ; * src/composite.c (composition_compute_stop_pos): Add comment. --- src/composite.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/composite.c b/src/composite.c index a9b037f4a4a..84cea8bcad6 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1153,12 +1153,12 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos, } else if (charpos > endpos) { - /* Search backward for a pattern that may be composed and the - position of (possibly) the last character of the match is + /* Search backward for a pattern that may be composed such that + the position of (possibly) the last character of the match is closest to (but not after) START. The reason for the last - character is that set_iterator_to_next works in reverse order, - and thus we must stop at the last character for composition - check. */ + character is that set_iterator_to_next works in reverse + order, and thus we must stop at the last character for + composition check. */ unsigned char *p; int len; /* Limit byte position used in fast_looking_at. This is the @@ -1171,6 +1171,22 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos, p = SDATA (string) + bytepos; c = string_char_and_length (p, &len); limit = bytepos + len; + /* The algorithmic idea behind the loop below is somewhat tricky + and subtle. Keep in mind that any arbitrarily long sequence + of composable characters can potentially be composed to end + at or before START. So the fact that we find a character C + before START that can be composed with several following + characters does not mean we can exit the loop, because some + character before C could also be composed, yielding a longer + composed sequence which ends closer to START. And since a + composition can be arbitrarily long, it is very important to + know where to stop the search back, because the default -- + BEGV -- could be VERY far away. Since searching back is only + needed when delivering bidirectional text reordered for + display, and since no character composition can ever cross + into another embedding level, the search could end when it + gets to the end of the current embedding level, but this + limit should be imposed by the caller. */ while (char_composable_p (c)) { val = CHAR_TABLE_REF (Vcomposition_function_table, c); From 94632c611e6ba5607a1039a8939d5ab173ee5bfb Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 4 Mar 2024 11:19:08 -0500 Subject: [PATCH 395/446] Revert "Update some native comp tests" This reverts commit 4a0d430bdc3650ca3dfd8bdd14781764fbcbdc7e. AFAICT that commit was made to accomodate regressions introduced in the new `cl-preloaded.el` code and these have been fixed. --- test/lisp/emacs-lisp/comp-cstr-tests.el | 2 +- test/src/comp-tests.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/lisp/emacs-lisp/comp-cstr-tests.el b/test/lisp/emacs-lisp/comp-cstr-tests.el index 955a99ced57..991ab1f40eb 100644 --- a/test/lisp/emacs-lisp/comp-cstr-tests.el +++ b/test/lisp/emacs-lisp/comp-cstr-tests.el @@ -196,7 +196,7 @@ The arg is an alist of: type specifier -> expected type specifier." ;; 74 ((and boolean (or number marker)) . nil) ;; 75 - ((and atom (or number marker)) . (or integer-or-marker number-or-marker)) + ((and atom (or number marker)) . number-or-marker) ;; 76 ((and symbol (or number marker)) . nil) ;; 77 diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el index 67d632823b2..fbcb6ca9560 100644 --- a/test/src/comp-tests.el +++ b/test/src/comp-tests.el @@ -1029,7 +1029,7 @@ Return a list of results." (if (= x y) x 'foo)) - '(or (member foo) number-or-marker integer-or-marker)) + '(or (member foo) number-or-marker)) ;; 14 ((defun comp-tests-ret-type-spec-f (x) @@ -1169,7 +1169,7 @@ Return a list of results." ((defun comp-tests-ret-type-spec-f (x) (when (> x 1.0) x)) - '(or null number-or-marker integer-or-marker)) + '(or null number-or-marker)) ;; 36 ((defun comp-tests-ret-type-spec-f (x y) From 167c17c1ad740b35ed1c875b57817784655851d9 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 4 Mar 2024 12:02:45 -0500 Subject: [PATCH 396/446] admin/syncdoc-type-hierarchy.el: Move from `etc` AFAICT `admin` is where we keep these kinds of files. --- {etc => admin}/syncdoc-type-hierarchy.el | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {etc => admin}/syncdoc-type-hierarchy.el (100%) diff --git a/etc/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el similarity index 100% rename from etc/syncdoc-type-hierarchy.el rename to admin/syncdoc-type-hierarchy.el From b06916cb218b133a4ebc9d7fa87b370fc2c2ed02 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 4 Mar 2024 13:24:34 -0500 Subject: [PATCH 397/446] syncdoc-type-hierarchy.el: Adjust to changes in `cl-preloaded.el` * admin/syncdoc-type-hierarchy.el (syncdoc-lispref-dir): Use `macroexp-file-name`. (syncdoc-hierarchy): New var. (syncdoc-insert-dot-content, syncdoc-make-type-table): Use it. (syncdoc-update-type-hierarchy): Don't crash if `dot` is absent. --- admin/syncdoc-type-hierarchy.el | 83 ++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/admin/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el index b3dfe63406a..cb4df63a312 100644 --- a/admin/syncdoc-type-hierarchy.el +++ b/admin/syncdoc-type-hierarchy.el @@ -24,8 +24,8 @@ ;; This file is used to keep the type hierarchy representation present ;; in the elisp manual in sync with the current type hierarchy. This -;; is specified in `cl--type-hierarchy' in cl-preloaded.el, so each -;; time `cl--type-hierarchy' is modified +;; is specified in `cl--direct-supertypes-of-type' in cl-preloaded.el, so each +;; time `cl--direct-supertypes-of-type' is modified ;; `syncdoc-update-type-hierarchy' must be run before the ;; documentation is regenerated. @@ -37,17 +37,49 @@ (require 'cl-lib) (require 'org-table) -(defconst syncdoc-lispref-dir (concat (file-name-directory - (or load-file-name - buffer-file-name)) - "../doc/lispref/")) +(defconst syncdoc-lispref-dir + (expand-file-name "../doc/lispref/" + (file-name-directory + (or (macroexp-file-name) + buffer-file-name)))) + +(defconst syncdoc-hierarchy + (let ((ht (copy-hash-table cl--direct-supertypes-of-type))) + ;; Include info about "representative" other structure types, + ;; to illustrate how they fit. + (mapc #'require '(kmacro eieio-base elisp-mode frameset transient)) + (let ((extra-types '(advice kmacro cl-structure-object cl-structure-class + eieio-default-superclass eieio-named transient-infix + xref-elisp-location frameset-register)) + (seen ())) + (while extra-types + (let* ((type (pop extra-types)) + (class (get type 'cl--class)) + (parents (cl--class-parents class))) + (unless (member type seen) + (push type seen) + (push (type-of class) extra-types) + (puthash type (cond + (parents + (let ((ps (mapcar #'cl--class-name parents))) + (setq extra-types (append ps extra-types)) + ps)) + ;; EIEIO's parents don't mention the default. + ((and (eq (type-of class) 'eieio--class) + (not (eq type 'eieio-default-superclass))) + '(eieio-default-superclass)) + ;; OClosures can still be lists :-( + ((eq 'oclosure type) '(t)) + (t '(atom))) + ht))))) + ht)) (defun syncdoc-insert-dot-content (rankdir) (maphash (lambda (child parents) (cl-loop for parent in parents do (insert " \"" (symbol-name child) "\" -> \"" (symbol-name parent) "\";\n"))) - cl--direct-supertypes-of-type) + syncdoc-hierarchy) (sort-lines nil (point-min) (point-max)) (goto-char (point-min)) @@ -58,18 +90,24 @@ (defun syncdoc-make-type-table (file) (with-temp-file file (insert "|Type| Derived Types|\n|-\n") - (cl-loop for (type . children) in cl--type-hierarchy - do (insert "|" (symbol-name type) " |") - do (cl-loop with x = 0 - for child in children - for child-len = (length (symbol-name child)) - when (> (+ x child-len 2) 60) - do (progn - (insert "|\n||") - (setq x 0)) - do (insert (symbol-name child) " ") - do (cl-incf x (1+ child-len)) ) - do (insert "\n")) + (let ((subtypes ())) + ;; First collect info from the "builtin" types. + (maphash (lambda (type parents) + (dolist (parent parents) + (push type (alist-get parent subtypes)))) + syncdoc-hierarchy) + (cl-loop for (type . children) in (reverse subtypes) + do (insert "|" (symbol-name type) " |") + do (cl-loop with x = 0 + for child in (reverse children) + for child-len = (length (symbol-name child)) + when (> (+ x child-len 2) 60) + do (progn + (insert "|\n||") + (setq x 0)) + do (insert (symbol-name child) " ") + do (cl-incf x (1+ child-len)) ) + do (insert "\n"))) (org-table-align))) (defun syncdoc-update-type-hierarchy () @@ -77,9 +115,10 @@ (interactive) (with-temp-buffer (syncdoc-insert-dot-content "LR") - (call-process-region nil nil "dot" t (current-buffer) nil "-Tjpg" "-o" - (expand-file-name "type_hierarchy.jpg" - syncdoc-lispref-dir))) + (with-demoted-errors "%S" ;In case "dot" is not found! + (call-process-region nil nil "dot" t (current-buffer) nil "-Tjpg" "-o" + (expand-file-name "type_hierarchy.jpg" + syncdoc-lispref-dir)))) (syncdoc-make-type-table (expand-file-name "type_hierarchy.txt" syncdoc-lispref-dir))) From 1a35eb86b8cb75ce390525dd3394a52376b622a6 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 5 Mar 2024 11:23:27 +0800 Subject: [PATCH 398/446] Rearrange Android splash screen messages * lisp/startup.el (fancy-startup-tail, fancy-startup-screen) (normal-splash-screen): Adjust for function renaming; move the storage permissions notice to the top of the splash screen. * lisp/term/android-win.el (android-after-splash-screen): Rename from android-before-splash-screen and adjust layout lightly. * src/android.c (android_wc_lookup_string): Terminate character composition after a character is returned, whether it contain a Unicode character or not. --- lisp/startup.el | 19 ++++++++----------- lisp/term/android-win.el | 14 +++++++------- src/android.c | 4 ++++ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lisp/startup.el b/lisp/startup.el index 33e1124b998..357a4154e4c 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -2040,10 +2040,6 @@ a face or button specification." (call-interactively 'recover-session))) " to recover the files you were editing.")))) - ;; Insert the permissions notice if the user has yet to grant Emacs - ;; storage permissions. - (when (fboundp 'android-after-splash-screen) - (funcall 'android-after-splash-screen t)) (when concise (fancy-splash-insert :face 'variable-pitch "\n" @@ -2096,6 +2092,10 @@ splash screen in another window." (make-local-variable 'startup-screen-inhibit-startup-screen) (if pure-space-overflow (insert pure-space-overflow-message)) + ;; Insert the permissions notice if the user has yet to grant Emacs + ;; storage permissions. + (when (fboundp 'android-before-splash-screen) + (funcall 'android-before-splash-screen t)) (unless concise (fancy-splash-head)) (dolist (text fancy-startup-text) @@ -2202,7 +2202,10 @@ splash screen in another window." (if pure-space-overflow (insert pure-space-overflow-message)) - + ;; Insert the permissions notice if the user has yet to grant + ;; Emacs storage permissions. + (when (fboundp 'android-before-splash-screen) + (funcall 'android-before-splash-screen nil)) ;; The convention for this piece of code is that ;; each piece of output starts with one or two newlines ;; and does not end with any newlines. @@ -2244,12 +2247,6 @@ splash screen in another window." (insert "\n\nIf an Emacs session crashed recently, " "type M-x recover-session RET\nto recover" " the files you were editing.\n")) - - ;; Insert the permissions notice if the user has yet to grant - ;; Emacs storage permissions. - (when (fboundp 'android-after-splash-screen) - (funcall 'android-after-splash-screen nil)) - (use-local-map splash-screen-keymap) ;; Display the input that we set up in the buffer. diff --git a/lisp/term/android-win.el b/lisp/term/android-win.el index b7b0920626e..1d10402b15d 100644 --- a/lisp/term/android-win.el +++ b/lisp/term/android-win.el @@ -398,7 +398,7 @@ directory /content/storage. (inhibit-read-only t)) (fill-region (point-min) (point-max)))))))) -(defun android-after-splash-screen (fancy-p) +(defun android-before-splash-screen (fancy-p) "Insert a brief notice on the absence of storage permissions. If storage permissions are as yet denied to Emacs, insert a short notice to that effect, followed by a button that enables the user @@ -412,14 +412,14 @@ screen display; see `fancy-splash-insert'." (fancy-splash-insert :face '(variable-pitch font-lock-function-call-face) - "\nPermissions necessary to access external storage directories have -been denied. Click " + "Permissions necessary to access external storage directories have" + "\nbeen denied. Click " :link '("here" android-display-storage-permission-popup) - " to grant them.") + " to grant them.\n") (insert - "\nPermissions necessary to access external storage directories have been -denied. ") - (insert-button "Click here to grant them." + "Permissions necessary to access external storage directories" + "\nhave been denied. ") + (insert-button "Click here to grant them.\n" 'action #'android-display-storage-permission-popup 'follow-link t) (newline)))) diff --git a/src/android.c b/src/android.c index eb6981093be..5b3fbb25373 100644 --- a/src/android.c +++ b/src/android.c @@ -5533,6 +5533,10 @@ android_wc_lookup_string (android_key_pressed_event *event, rc = 0; } + /* Terminate any ongoing character composition after a key is + registered. */ + if (compose_status) + compose_status->chars_matched = 0; *status_return = status; return rc; } From 418ad866bf846a6a3328d91df28c958be75337be Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 4 Mar 2024 23:12:29 -0500 Subject: [PATCH 399/446] cl-preloaded.el: Further fine-tuning * lisp/emacs-lisp/cl-preloaded.el (cl--direct-supertypes-of-type): Fix some left over issues: - Remove redundant `number-or-marker` from `marker`s parents. - Add `function` to the types, since it was missing. (cl--typeof-types): Add a warning for missing type info. * admin/syncdoc-type-hierarchy.el (syncdoc-hierarchy): Fix parent of `oclosure`. * doc/lispref/type_hierarchy.txt: * doc/lispref/type_hierarchy.jpg: Update. --- admin/syncdoc-type-hierarchy.el | 2 +- doc/lispref/type_hierarchy.jpg | Bin 223501 -> 237291 bytes doc/lispref/type_hierarchy.txt | 49 ++++++++++++++++++-------------- lisp/emacs-lisp/cl-preloaded.el | 21 ++++++++++++-- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/admin/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el index cb4df63a312..6448369625b 100644 --- a/admin/syncdoc-type-hierarchy.el +++ b/admin/syncdoc-type-hierarchy.el @@ -69,7 +69,7 @@ (not (eq type 'eieio-default-superclass))) '(eieio-default-superclass)) ;; OClosures can still be lists :-( - ((eq 'oclosure type) '(t)) + ((eq 'oclosure type) '(function)) (t '(atom))) ht))))) ht)) diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/type_hierarchy.jpg index b7eba7d1cf7a8c07a479b13db6e059a3810fad13..6b9be98581762073999158a2b8bf6e91801b4be4 100644 GIT binary patch literal 237291 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

-*O4xwUe{C`8)a*V27n)(U8fK8M1U1S5x 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

!%Vq5>bmBfxS8aU$2K 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 z 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%0DP8C(a(Us8M|k&$*-vc8l)%c>v#Pm((yjY^ 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

Wia|O2XfAhKK=NVBc_}c+z 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

`_GVb78c&LOOzzM62-Mi{&{cl9 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 Date: Mon, 4 Mar 2024 23:42:50 -0500 Subject: [PATCH 400/446] disass.el (disassemble-1): Minor simplification * lisp/emacs-lisp/disass.el (disassemble-1): Remove code for functions of the form (lambda ARGS (byte-code ...)) which we don't use any more nowadays. --- lisp/emacs-lisp/disass.el | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/lisp/emacs-lisp/disass.el b/lisp/emacs-lisp/disass.el index b7db2adde59..850cc2085f7 100644 --- a/lisp/emacs-lisp/disass.el +++ b/lisp/emacs-lisp/disass.el @@ -54,7 +54,7 @@ (defun disassemble (object &optional buffer indent interactive-p) "Print disassembled code for OBJECT in (optional) BUFFER. OBJECT can be a symbol defined as a function, or a function itself -\(a lambda expression or a compiled-function object). +\(a lambda expression or a byte-code-function object). If OBJECT is not already compiled, we compile it, but do not redefine OBJECT if it is a symbol." (interactive @@ -70,7 +70,7 @@ redefine OBJECT if it is a symbol." (save-excursion (if (or interactive-p (null buffer)) (with-output-to-temp-buffer "*Disassemble*" - (set-buffer "*Disassemble*") + (set-buffer standard-output) (let ((lexical-binding lb)) (disassemble-internal object indent (not interactive-p)))) (set-buffer buffer) @@ -250,29 +250,22 @@ OBJ should be a call to BYTE-CODE generated by the byte compiler." ;; if the succeeding op is byte-switch, display the jump table ;; used (cond ((eq (car-safe (car-safe (cdr lap))) 'byte-switch) - (insert (format "")) - ;; if the value of the constant is compiled code, then - ;; recursively disassemble it. - ((or (byte-code-function-p arg) - (and (consp arg) (functionp arg) - (assq 'byte-code arg)) + (insert (format "")) + ;; if the value of the constant is compiled code, then + ;; recursively disassemble it. + ((or (byte-code-function-p arg) (and (eq (car-safe arg) 'macro) - (or (byte-code-function-p (cdr arg)) - (and (consp (cdr arg)) - (functionp (cdr arg)) - (assq 'byte-code (cdr arg)))))) + (byte-code-function-p (cdr arg)))) (cond ((byte-code-function-p arg) (insert "\n")) - ((functionp arg) - (insert "")) (t (insert "\n"))) (disassemble-internal arg @@ -285,7 +278,7 @@ OBJ should be a call to BYTE-CODE generated by the byte compiler." (+ indent disassemble-recursive-indent))) ((eq (car-safe (car-safe arg)) 'byte-code) (insert "(...)\n") - (mapc ;recurse on list of byte-code objects + (mapc ;Recurse on list of byte-code objects. (lambda (obj) (disassemble-1 obj From dcdb066025ca7ed813fa832bf931d411a9d109a0 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 5 Mar 2024 11:17:48 +0100 Subject: [PATCH 401/446] Adapt tramp.texi * doc/misc/tramp.texi (Quick Start Guide): Add androidsu. (Inline methods): Make androidsu an own item. --- doc/misc/tramp.texi | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index d67e2fcb64c..131a23b7423 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -488,28 +488,33 @@ an @command{ssh} server: @file{@trampfn{plink,user@@host,/path/to/file}}. -@anchor{Quick Start Guide su, sudo, doas and sg methods} -@section Using @option{su}, @option{sudo}, @option{doas} and @option{sg} +@anchor{Quick Start Guide su, sudo, doas, androidsu and sg methods} +@section Using @option{su}, @option{sudo}, @option{doas}, @option{androidsu} and @option{sg} @cindex method @option{su} @cindex @option{su} method @cindex method @option{sudo} @cindex @option{sudo} method @cindex method @option{doas} @cindex @option{doas} method +@cindex method @option{androidsu} +@cindex @option{androidsu} method @cindex method @option{sg} @cindex @option{sg} method Sometimes, it is necessary to work on your local host under different permissions. For this, you can use the @option{su} or @option{sudo} connection method. On OpenBSD systems, the @option{doas} connection -method offers the same functionality. These methods use @samp{root} -as default user name and the return value of @code{(system-name)} as -default host name. Therefore, it is convenient to open a file as -@file{@trampfn{sudo,,/path/to/file}}. +method offers the same functionality. If your local system is +Android, use the method @option{androidsu} instead of @option{su}. + +These methods use @samp{root} as default user name and the return +value of @code{(system-name)} as default host name. Therefore, it is +convenient to open a file as @file{@trampfn{sudo,,/path/to/file}}. The method @option{sg} stands for ``switch group''; here the user name is used as the group to change to. The default host name is the same. + @anchor{Quick Start Guide Combining ssh, plink, su, sudo and doas methods} @section Combining @option{ssh} or @option{plink} with @option{su}, @option{sudo} or @option{doas} @cindex method @option{ssh} @@ -532,6 +537,7 @@ a simple case, the syntax looks like @file{@trampfn{ssh@value{postfixhop}user@@host|sudo,,/path/to/file}}. @xref{Ad-hoc multi-hops}. + @anchor{Quick Start Guide sudoedit method} @section Using @command{sudoedit} @cindex method @option{sudoedit} @@ -817,6 +823,7 @@ editing as another user. The host can be either @samp{localhost} or the host returned by the function @command{(system-name)}. See @ref{Multi-hops} for an exception to this behavior. +@item @option{androidsu} @cindex method @option{androidsu} @cindex @option{androidsu} method Because the default implementation of the @option{su} method and other @@ -2058,7 +2065,7 @@ machine @var{host} port sudo login @var{user} password secret @var{user} and @var{host} are the strings returned by @code{(user-login-name)} and @code{(system-name)}. If one of these -methods is connected via a multi hop (@pxref{Multi-hops}), the +methods is connected via a multi-hop (@pxref{Multi-hops}), the credentials of the previous hop are used. @vindex auth-source-save-behavior From 3023976b484e52f756ac9fc4c87cc7c6c5192b05 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 5 Mar 2024 11:48:08 +0100 Subject: [PATCH 402/446] * Copy type hierarchy representation to the info dir * doc/lispref/Makefile.in (auxfiles) ($(buildinfodir)/type_hierarchy.txt) ($(buildinfodir)/type_hierarchy.jpg): New targets. ($(buildinfodir)/elisp.info): Add dependecy. --- doc/lispref/Makefile.in | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/lispref/Makefile.in b/doc/lispref/Makefile.in index 476b8cf8fe6..4c6b14593ff 100644 --- a/doc/lispref/Makefile.in +++ b/doc/lispref/Makefile.in @@ -144,7 +144,15 @@ ps: $(PS_TARGETS) ${buildinfodir}: ${MKDIR_P} $@ -$(buildinfodir)/elisp.info: $(srcs) | ${buildinfodir} +auxfiles: $(buildinfodir)/type_hierarchy.txt $(buildinfodir)/type_hierarchy.jpg + +$(buildinfodir)/type_hierarchy.txt: $(srcdir)/type_hierarchy.txt | ${buildinfodir} + cp $< $@ + +$(buildinfodir)/type_hierarchy.jpg: $(srcdir)/type_hierarchy.jpg | ${buildinfodir} + cp $< $@ + +$(buildinfodir)/elisp.info: $(srcs) auxfiles | ${buildinfodir} $(AM_V_GEN)$(MAKEINFO) $(MAKEINFO_OPTS) $(INFO_OPTS) -o $@ $< elisp.dvi: $(srcs) From 4673b99071399bf43329741d3f5ab56eb6854572 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 5 Mar 2024 15:07:05 +0100 Subject: [PATCH 403/446] * Makefile.in (install-info): Install type_hierarchy* files as well. --- Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in index 5f3227a9ad5..e7fc19e6494 100644 --- a/Makefile.in +++ b/Makefile.in @@ -812,6 +812,7 @@ install-info: info done; \ (cd "$${thisdir}"; \ ${INSTALL_INFO} --info-dir="$(DESTDIR)${infodir}" "$(DESTDIR)${infodir}/$$elt"); \ + cp type_hierarchy* $(DESTDIR)${infodir}/; \ # Used by elisp.info. done; \ fi From 5155f5b1cc0a48566d0f419de8cffd845638e567 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 5 Mar 2024 15:21:44 +0100 Subject: [PATCH 404/446] * Makefile.in (uninstall): Clean-up type_hierarchy* files. --- Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in index e7fc19e6494..d54583399d0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -955,6 +955,7 @@ uninstall: uninstall-$(NTDIR) uninstall-doc uninstall-gsettings-schemas ext=.gz; else ext=; fi; \ rm -f $$elt$$ext $$elt-[1-9]$$ext $$elt-[1-9][0-9]$$ext; \ done; \ + rm -f type_hierarchy.jpg type_hierarchy.txt; \ fi) (if [ -n "${GZIP_PROG}" ]; then \ ext=.gz; else ext=; fi; \ From 9cf0f254bae79f6b6cda01e7a4b77fabec9f3f8f Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 5 Mar 2024 18:42:49 +0200 Subject: [PATCH 405/446] * lisp/net/dictionary.el: More fixes for dictionary-new-matching (bug#69312) (dictionary-new-matching): Change the order of standard calls to be the same as in 'dictionary-new-search'. Use new function 'dictionary-new-matching-internal'. (dictionary-new-matching-internal): New function based on 'dictionary-new-search-internal'. --- lisp/net/dictionary.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lisp/net/dictionary.el b/lisp/net/dictionary.el index 7967c650999..d4dfa33716c 100644 --- a/lisp/net/dictionary.el +++ b/lisp/net/dictionary.el @@ -1116,17 +1116,22 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." (defun dictionary-new-matching (word) "Run a new matching search on WORD." - (dictionary-ensure-buffer) (dictionary-store-positions) - (dictionary-pre-buffer) - (dictionary-do-matching word dictionary-default-dictionary - dictionary-default-strategy - 'dictionary-display-match-result) - (dictionary-store-state 'dictionary-do-matching + (dictionary-ensure-buffer) + (dictionary-new-matching-internal word dictionary-default-dictionary + dictionary-default-strategy + 'dictionary-display-match-result) + (dictionary-store-state 'dictionary-new-matching-internal (list word dictionary-default-dictionary dictionary-default-strategy 'dictionary-display-match-result))) +(defun dictionary-new-matching-internal (word dictionary strategy function) + "Start a new matching for WORD in DICTIONARY after preparing the buffer. +FUNCTION is the callback which is called for each search result." + (dictionary-pre-buffer) + (dictionary-do-matching word dictionary strategy function)) + (defun dictionary-do-matching (word dictionary strategy function) "Search for WORD with STRATEGY in DICTIONARY and display them with FUNCTION." (insert (format-message "Lookup matching words for `%s' in `%s' using `%s'\n" From f16a85e317d940aa2e0f0375ec5d1917cb04ade3 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 5 Mar 2024 18:50:51 +0200 Subject: [PATCH 406/446] New property 'context-menu-functions' (bug#62250) * lisp/iimage.el (iimage-mode-buffer): Set context-menu-functions text property to '(image-context-menu)'. * lisp/image.el (image-context-menu): New function. (put-image): Set context-menu-functions overlay property to '(image-context-menu)'. (insert-image, insert-sliced-image): Set context-menu-functions text property to '(image-context-menu)'. * lisp/mouse.el (context-menu-map): Use mouse-posn-property 'context-menu-functions' and call its funs at the end. --- etc/NEWS | 4 ++++ lisp/iimage.el | 1 + lisp/image.el | 33 ++++++++++++++++++++++++++++++--- lisp/mouse.el | 14 ++++++++++---- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 06856602ea8..a4b42263c36 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2087,6 +2087,10 @@ treesitter grammar. ** New buffer-local variable 'tabulated-list-groups'. It controls display and separate sorting of groups of entries. +--- +** New property 'context-menu-functions'. +Like the variable with the same name it adds a list of context menus. + * Changes in Emacs 30.1 on Non-Free Operating Systems diff --git a/lisp/iimage.el b/lisp/iimage.el index 205141577c9..0f2297465fe 100644 --- a/lisp/iimage.el +++ b/lisp/iimage.el @@ -134,6 +134,7 @@ Examples of image filename patterns to match: :max-width (- (nth 2 edges) (nth 0 edges)) :max-height (- (nth 3 edges) (nth 1 edges))) keymap ,image-map + context-menu-functions (image-context-menu) modification-hooks (iimage-modification-hook))) (remove-list-of-text-properties diff --git a/lisp/image.el b/lisp/image.el index 2ebce59a98c..662e7eaf25d 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -193,6 +193,29 @@ or \"ffmpeg\") is installed." "h" #'image-flip-horizontally "v" #'image-flip-vertically)) +(defun image-context-menu (menu click) + "Populate MENU with image-related commands at CLICK." + (when (mouse-posn-property (event-start click) 'display) + (define-key menu [image-separator] menu-bar-separator) + (let ((easy-menu (make-sparse-keymap "Image"))) + (easy-menu-define nil easy-menu nil + '("Image" + ["Zoom In" image-increase-size + :help "Enlarge the image"] + ["Zoom Out" image-decrease-size + :help "Shrink the image"] + ["Rotate Clockwise" image-rotate + :help "Rotate the image"] + ["Flip horizontally" image-flip-horizontally + :help "Flip horizontally"] + ["Flip vertically" image-flip-vertically + :help "Flip vertically"])) + (dolist (item (reverse (lookup-key easy-menu [menu-bar image]))) + (when (consp item) + (define-key menu (vector (car item)) (cdr item)))))) + + menu) + (defun image-load-path-for-library (library image &optional path no-error) "Return a suitable search path for images used by LIBRARY. @@ -620,6 +643,7 @@ means display it in the right marginal area." (overlay-put overlay 'put-image t) (overlay-put overlay 'before-string string) (overlay-put overlay 'keymap image-map) + (overlay-put overlay 'context-menu-functions '(image-context-menu)) overlay))) @@ -672,8 +696,9 @@ is non-nil, this is inhibited." inhibit-isearch ,inhibit-isearch keymap ,(if slice image-slice-map - image-map))))) - + image-map) + context-menu-functions + (image-context-menu))))) ;;;###autoload (defun insert-sliced-image (image &optional string area rows cols) @@ -709,7 +734,9 @@ The image is automatically split into ROWS x COLS slices." (add-text-properties start (point) `(display ,(list (list 'slice x y dx dy) image) rear-nonsticky (display keymap) - keymap ,image-slice-map)) + keymap ,image-slice-map + context-menu-functions + (image-context-menu))) (setq x (+ x dx)))) (setq x 0.0 y (+ y dy)) diff --git a/lisp/mouse.el b/lisp/mouse.el index d1b06c2040d..26835437c08 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -414,13 +414,17 @@ Each function receives the menu and the mouse click event and returns the same menu after adding own menu items to the composite menu. When there is a text property `context-menu-function' at CLICK, it overrides all functions from `context-menu-functions'. +Whereas the property `context-menu-functions' doesn't override +the variable `context-menu-functions', but adds menus from the +list in the property after adding menus from the variable. At the end, it's possible to modify the final menu by specifying the function `context-menu-filter-function'." (let* ((menu (make-sparse-keymap (propertize "Context Menu" 'hide t))) (click (or click last-input-event)) - (window (posn-window (event-start click))) - (fun (mouse-posn-property (event-start click) - 'context-menu-function))) + (start (event-start click)) + (window (posn-window start)) + (fun (mouse-posn-property start 'context-menu-function)) + (funs (mouse-posn-property start 'context-menu-functions))) (unless (eq (selected-window) window) (select-window window)) @@ -430,7 +434,9 @@ the function `context-menu-filter-function'." (run-hook-wrapped 'context-menu-functions (lambda (fun) (setq menu (funcall fun menu click)) - nil))) + nil)) + (dolist (fun funs) + (setq menu (funcall fun menu click)))) ;; Remove duplicate separators as well as ones at the beginning or ;; end of the menu. From 3cb06145070ff5d4a220f1144434f1ba6c1976f7 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 5 Mar 2024 19:14:28 +0200 Subject: [PATCH 407/446] * lisp/tab-bar.el (tab-bar-tab-post-select-functions): New hook (bug#69093). (tab-bar-select-tab): Call tab-bar-tab-post-select-functions at the end. --- etc/NEWS | 4 ++++ lisp/tab-bar.el | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index a4b42263c36..b4343a7941b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -275,10 +275,14 @@ selected or deselected at the end of executing the current command. ** Tab Bars and Tab Lines +--- *** New user option 'tab-bar-tab-name-format-functions'. It can be used to add, remove and reorder functions that change the appearance of every tab on the tab bar. +--- +*** New hook 'tab-bar-tab-post-select-functions'. + +++ ** New optional argument for modifying directory-local variables. The commands 'add-dir-local-variable', 'delete-dir-local-variable' and diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 3e1d8278b04..61efa332e0b 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -1385,6 +1385,14 @@ inherits the current tab's `explicit-name' parameter." tabs)))) +(defcustom tab-bar-tab-post-select-functions nil + "List of functions to call after selecting a tab. +Two arguments are supplied: the previous tab that was selected before, +and the newly selected tab." + :type '(repeat function) + :group 'tab-bar + :version "30.1") + (defvar tab-bar-minibuffer-restore-tab nil "Tab number for `tab-bar-minibuffer-restore-tab'.") @@ -1499,7 +1507,10 @@ Negative TAB-NUMBER counts tabs from the end of the tab bar." (tab-bar--current-tab-make (nth to-index tabs))) (unless tab-bar-mode - (message "Selected tab '%s'" (alist-get 'name to-tab)))) + (message "Selected tab '%s'" (alist-get 'name to-tab))) + + (run-hook-with-args 'tab-bar-tab-post-select-functions + from-tab to-tab)) (force-mode-line-update)))) From 33976ecf244082346cbc71ff1102ef7de1ed36fe Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 5 Mar 2024 19:32:29 +0200 Subject: [PATCH 408/446] ; * etc/NEWS: Fix wording and punctuation of a recently added entry. --- etc/NEWS | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index b4343a7941b..fd957fdb115 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2092,8 +2092,10 @@ treesitter grammar. It controls display and separate sorting of groups of entries. --- -** New property 'context-menu-functions'. -Like the variable with the same name it adds a list of context menus. +** New text property 'context-menu-functions'. +Like the variable with the same name, it adds menus from the list that +is the value of the property to context menus shown when clicking on the +text which as this property. * Changes in Emacs 30.1 on Non-Free Operating Systems From d5f11e890c598cd2e15cb2fd93e604ed100ce355 Mon Sep 17 00:00:00 2001 From: Vincenzo Pupillo Date: Tue, 5 Mar 2024 22:36:34 +0100 Subject: [PATCH 409/446] * Makefile.in (install-info): Fix target (bug#69569). --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index d54583399d0..6f014909307 100644 --- a/Makefile.in +++ b/Makefile.in @@ -812,7 +812,7 @@ install-info: info done; \ (cd "$${thisdir}"; \ ${INSTALL_INFO} --info-dir="$(DESTDIR)${infodir}" "$(DESTDIR)${infodir}/$$elt"); \ - cp type_hierarchy* $(DESTDIR)${infodir}/; \ # Used by elisp.info. + cp type_hierarchy* $(DESTDIR)${infodir}/; \ done; \ fi From 845d334c10ab8a12ac5eead90abfa9cae1f4b67c Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 6 Mar 2024 10:20:36 +0800 Subject: [PATCH 410/446] ; Fix last change * lisp/net/tramp-androidsu.el (tramp-androidsu-generate-wrapper): Arguments to fset must be symbols rather than functions. --- lisp/net/tramp-androidsu.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index c7fb67d4081..c24ac079022 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -232,16 +232,16 @@ FUNCTION." ;; tramp-adb-wait-for-output addresses problems introduced ;; by the adb utility itself, not Android utilities, so ;; replace it with the regular TRAMP function. - (fset #'tramp-adb-wait-for-output #'tramp-wait-for-output) + (fset 'tramp-adb-wait-for-output #'tramp-wait-for-output) ;; Likewise, except some special treatment is necessary on ;; account of flaws in Android's su implementation. - (fset #'tramp-adb-maybe-open-connection + (fset 'tramp-adb-maybe-open-connection #'tramp-androidsu-maybe-open-connection) (apply function args)) ;; Restore the original definitions of the functions overridden ;; above. - (fset #'tramp-adb-wait-for-output tramp-adb-wait-for-output) - (fset #'tramp-adb-maybe-open-connection + (fset 'tramp-adb-wait-for-output tramp-adb-wait-for-output) + (fset 'tramp-adb-maybe-open-connection tramp-adb-maybe-open-connection))))) (defalias 'tramp-androidsu-handle-copy-file #'tramp-sh-handle-copy-file) From 1a5850a3af0693f022bb0a62e36bb84f762287c7 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 6 Mar 2024 10:48:28 +0800 Subject: [PATCH 411/446] Don't report files from read-only adb partitions as writable * lisp/net/tramp-adb.el (tramp-adb-handle-file-writable-p): Ignore the file-attributes cache, since file mode is not a reliable indicator of writability. --- lisp/net/tramp-adb.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 8ad7c271b4f..aaeb5fabb80 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -508,12 +508,11 @@ Emacs dired can't find files." (with-parsed-tramp-file-name (expand-file-name filename) nil (with-tramp-file-property v localname "file-writable-p" (if (file-exists-p filename) - ;; Examine `file-attributes' cache to see if request can be - ;; satisfied without remote operation. - (if (tramp-file-property-p v localname "file-attributes") - (tramp-check-cached-permissions v ?w) - (tramp-adb-send-command-and-check - v (format "test -w %s" (tramp-shell-quote-argument localname)))) + ;; The file-attributes cache is unreliable since its + ;; information does not take partition writability into + ;; account, so a call to test must never be skipped. + (tramp-adb-send-command-and-check + v (format "test -w %s" (tramp-shell-quote-argument localname))) ;; If file doesn't exist, check if directory is writable. (and (file-directory-p (file-name-directory filename)) From 9526bd3cf8eb5e5ed78c7fb8eb03d9e7dac9b941 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 6 Mar 2024 15:41:37 +0100 Subject: [PATCH 412/446] * Update syncdoc to dump all preloaded type hierarchy * admin/syncdoc-type-hierarchy.el (syncdoc-file) (syncdoc-emacs-repo-dir): New constants. (syncdoc-lispref-dir): Make use of. (syncdoc-all-types): New function. (comp--direct-supertypes): Declare. (syncdoc-hierarchy): Update. (syncdoc-update-type-hierarchy0): Rename from 'syncdoc-update-type-hierarchy' and make non interactive. (syncdoc-update-type-hierarchy): New function. --- admin/syncdoc-type-hierarchy.el | 74 +++++++++++++++++---------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/admin/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el index 6448369625b..b8cd71fe84e 100644 --- a/admin/syncdoc-type-hierarchy.el +++ b/admin/syncdoc-type-hierarchy.el @@ -37,42 +37,40 @@ (require 'cl-lib) (require 'org-table) +(defconst syncdoc-file (or (macroexp-file-name) buffer-file-name)) + +(defconst syncdoc-emacs-repo-dir + (expand-file-name "../" (file-name-directory syncdoc-file))) + (defconst syncdoc-lispref-dir - (expand-file-name "../doc/lispref/" - (file-name-directory - (or (macroexp-file-name) - buffer-file-name)))) + (expand-file-name "doc/lispref/" syncdoc-emacs-repo-dir)) + +(defconst syncdoc-all-types + (let (res) + (maphash (lambda (type _) + (push type res)) + cl--direct-supertypes-of-type) + + (mapatoms (lambda (type) + (when (cl-find-class type) + (push type res))) + obarray) + res) + "List of all types.") + +(declare-function 'comp--direct-supertypes "comp-cstr.el") (defconst syncdoc-hierarchy - (let ((ht (copy-hash-table cl--direct-supertypes-of-type))) - ;; Include info about "representative" other structure types, - ;; to illustrate how they fit. - (mapc #'require '(kmacro eieio-base elisp-mode frameset transient)) - (let ((extra-types '(advice kmacro cl-structure-object cl-structure-class - eieio-default-superclass eieio-named transient-infix - xref-elisp-location frameset-register)) - (seen ())) - (while extra-types - (let* ((type (pop extra-types)) - (class (get type 'cl--class)) - (parents (cl--class-parents class))) - (unless (member type seen) - (push type seen) - (push (type-of class) extra-types) - (puthash type (cond - (parents - (let ((ps (mapcar #'cl--class-name parents))) - (setq extra-types (append ps extra-types)) - ps)) - ;; EIEIO's parents don't mention the default. - ((and (eq (type-of class) 'eieio--class) - (not (eq type 'eieio-default-superclass))) - '(eieio-default-superclass)) - ;; OClosures can still be lists :-( - ((eq 'oclosure type) '(function)) - (t '(atom))) - ht))))) - ht)) + (progn + ;; Require it here so we don't load it before `syncdoc-all-types' is + ;; computed. + (require 'comp-cstr) + (cl-loop + with comp-ctxt = (make-comp-cstr-ctxt) + with h = (make-hash-table :test #'eq) + for type in syncdoc-all-types + do (puthash type (comp--direct-supertypes type) h) + finally return h))) (defun syncdoc-insert-dot-content (rankdir) (maphash (lambda (child parents) @@ -110,9 +108,8 @@ do (insert "\n"))) (org-table-align))) -(defun syncdoc-update-type-hierarchy () +(defun syncdoc-update-type-hierarchy0 () "Update the type hierarchy representation used by the elisp manual." - (interactive) (with-temp-buffer (syncdoc-insert-dot-content "LR") (with-demoted-errors "%S" ;In case "dot" is not found! @@ -122,4 +119,11 @@ (syncdoc-make-type-table (expand-file-name "type_hierarchy.txt" syncdoc-lispref-dir))) +(defun syncdoc-update-type-hierarchy () + "Update the type hierarchy representation used by the elisp manual." + (interactive) + (call-process (expand-file-name "src/emacs" syncdoc-emacs-repo-dir) + nil t t "-Q" "--batch" "-l" syncdoc-file + "-f" "syncdoc-update-type-hierarchy0")) + ;;; syncdoc-type-hierarchy.el ends here From a5d3ce38fa77296f12bf15a9451d4c151f10d766 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Wed, 6 Mar 2024 15:50:33 +0100 Subject: [PATCH 413/446] Re-generate type_hierarchy.* * doc/lispref/type_hierarchy.txt: Update. * doc/lispref/type_hierarchy.jpg: Likewise. --- doc/lispref/type_hierarchy.jpg | Bin 237291 -> 358752 bytes doc/lispref/type_hierarchy.txt | 56 +++++++++++++++++---------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/type_hierarchy.jpg index 6b9be98581762073999158a2b8bf6e91801b4be4..518255566b9fbb02a8dc2d4deb325ace974e40fa 100644 GIT binary patch literal 358752 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%0Aht$kUsR|G52jZbS5V-g_%Nksvo0CVM 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 b!E%4uIzYp;o%5fm|13C&_`eLZ?_>W0BIJnI literal 237291 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

-*O4xwUe{C`8)a*V27n)(U8fK8M1U1S5x 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

!%Vq5>bmBfxS8aU$2K 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 z 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%0DP8C(a(Us8M|k&$*-vc8l)%c>v#Pm((yjY^ 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

Wia|O2XfAhKK=NVBc_}c+z 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 Date: Wed, 6 Mar 2024 16:43:45 +0100 Subject: [PATCH 414/446] Rename type_hierarchy.* -> elisp_type_hierarchy.* * doc/lispref/elisp_type_hierarchy.txt: Renamed. * doc/lispref/elisp_type_hierarchy.jpg: Likewise. * doc/lispref/Makefile.in (auxfiles) ($(buildinfodir)/elisp_type_hierarchy.txt) ($(buildinfodir)/elisp_type_hierarchy.jpg): Update. * admin/syncdoc-type-hierarchy.el (syncdoc-update-type-hierarchy0): Likewise. * Makefile.in (install-info, uninstall): Likewise. --- Makefile.in | 4 ++-- admin/syncdoc-type-hierarchy.el | 4 ++-- doc/lispref/Makefile.in | 6 +++--- ...{type_hierarchy.jpg => elisp_type_hierarchy.jpg} | Bin ...{type_hierarchy.txt => elisp_type_hierarchy.txt} | 0 doc/lispref/objects.texi | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename doc/lispref/{type_hierarchy.jpg => elisp_type_hierarchy.jpg} (100%) rename doc/lispref/{type_hierarchy.txt => elisp_type_hierarchy.txt} (100%) diff --git a/Makefile.in b/Makefile.in index 6f014909307..20394cb333d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -812,7 +812,7 @@ install-info: info done; \ (cd "$${thisdir}"; \ ${INSTALL_INFO} --info-dir="$(DESTDIR)${infodir}" "$(DESTDIR)${infodir}/$$elt"); \ - cp type_hierarchy* $(DESTDIR)${infodir}/; \ + cp elisp_type_hierarchy* $(DESTDIR)${infodir}/; \ done; \ fi @@ -955,7 +955,7 @@ uninstall: uninstall-$(NTDIR) uninstall-doc uninstall-gsettings-schemas ext=.gz; else ext=; fi; \ rm -f $$elt$$ext $$elt-[1-9]$$ext $$elt-[1-9][0-9]$$ext; \ done; \ - rm -f type_hierarchy.jpg type_hierarchy.txt; \ + rm -f elisp_type_hierarchy.jpg elisp_type_hierarchy.txt; \ fi) (if [ -n "${GZIP_PROG}" ]; then \ ext=.gz; else ext=; fi; \ diff --git a/admin/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el index b8cd71fe84e..b5cfdfd8e74 100644 --- a/admin/syncdoc-type-hierarchy.el +++ b/admin/syncdoc-type-hierarchy.el @@ -114,9 +114,9 @@ (syncdoc-insert-dot-content "LR") (with-demoted-errors "%S" ;In case "dot" is not found! (call-process-region nil nil "dot" t (current-buffer) nil "-Tjpg" "-o" - (expand-file-name "type_hierarchy.jpg" + (expand-file-name "elisp_type_hierarchy.jpg" syncdoc-lispref-dir)))) - (syncdoc-make-type-table (expand-file-name "type_hierarchy.txt" + (syncdoc-make-type-table (expand-file-name "elisp_type_hierarchy.txt" syncdoc-lispref-dir))) (defun syncdoc-update-type-hierarchy () diff --git a/doc/lispref/Makefile.in b/doc/lispref/Makefile.in index 4c6b14593ff..9b7b6d8ea9d 100644 --- a/doc/lispref/Makefile.in +++ b/doc/lispref/Makefile.in @@ -144,12 +144,12 @@ ps: $(PS_TARGETS) ${buildinfodir}: ${MKDIR_P} $@ -auxfiles: $(buildinfodir)/type_hierarchy.txt $(buildinfodir)/type_hierarchy.jpg +auxfiles: $(buildinfodir)/elisp_type_hierarchy.txt $(buildinfodir)/elisp_type_hierarchy.jpg -$(buildinfodir)/type_hierarchy.txt: $(srcdir)/type_hierarchy.txt | ${buildinfodir} +$(buildinfodir)/elisp_type_hierarchy.txt: $(srcdir)/elisp_type_hierarchy.txt | ${buildinfodir} cp $< $@ -$(buildinfodir)/type_hierarchy.jpg: $(srcdir)/type_hierarchy.jpg | ${buildinfodir} +$(buildinfodir)/elisp_type_hierarchy.jpg: $(srcdir)/elisp_type_hierarchy.jpg | ${buildinfodir} cp $< $@ $(buildinfodir)/elisp.info: $(srcs) auxfiles | ${buildinfodir} diff --git a/doc/lispref/type_hierarchy.jpg b/doc/lispref/elisp_type_hierarchy.jpg similarity index 100% rename from doc/lispref/type_hierarchy.jpg rename to doc/lispref/elisp_type_hierarchy.jpg diff --git a/doc/lispref/type_hierarchy.txt b/doc/lispref/elisp_type_hierarchy.txt similarity index 100% rename from doc/lispref/type_hierarchy.txt rename to doc/lispref/elisp_type_hierarchy.txt diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index dd212ef700c..41171bcaafc 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -2516,7 +2516,7 @@ The Lisp Type Hierarchy for primitive types can be represented as follows: @noindent -@image{type_hierarchy,,,,.jpg} +@image{elisp_type_hierarchy,,,,.jpg} For example type @code{list} derives from (is a special kind of) type @code{sequence} which itself derives from @code{t}. From b12059e4c320f374735a9c00975ef12cb964043f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 6 Mar 2024 17:51:42 +0100 Subject: [PATCH 415/446] Tramp fixes after running regression tests on Android * lisp/net/tramp-adb.el (tramp-adb-maybe-open-connection): Unset environment variable PS2. * lisp/net/tramp-androidsu.el (tramp-default-host-alist): Don't add an entry; `tramp-default-host' is set properly. (tramp-androidsu-maybe-open-connection): Don't set connection property "remote-namespace" to nil, this is the default anyway. Don't set connection property "remote-path", we use connection-local values instead. Unset environment variable PS2. Dump shell options after setting all of them. (tramp-androidsu-handle-make-process): Don't use hard-coded user "root". (tramp-androidsu-connection-local-default-variables): New defvar. Add it to connection-local profiles. --- lisp/net/tramp-adb.el | 2 +- lisp/net/tramp-androidsu.el | 53 ++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index aaeb5fabb80..da23d062c2e 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -1266,7 +1266,7 @@ connection if a previous connection has died for some reason." (tramp-set-connection-property p "prompt" (rx "///" (literal prompt) "#$")) (tramp-adb-send-command - vec (format "PS1=\"///\"\"%s\"\"#$\"" prompt)) + vec (format "PS1=\"///\"\"%s\"\"#$\" PS2=''" prompt)) ;; Disable line editing. (tramp-adb-send-command diff --git a/lisp/net/tramp-androidsu.el b/lisp/net/tramp-androidsu.el index c24ac079022..09bee323f5e 100644 --- a/lisp/net/tramp-androidsu.el +++ b/lisp/net/tramp-androidsu.el @@ -88,8 +88,6 @@ may edit files belonging to any and all applications." (tramp-tmpdir ,tramp-androidsu-local-tmp-directory) (tramp-connection-timeout 10) (tramp-shell-name ,tramp-androidsu-local-shell-name))) - (add-to-list 'tramp-default-host-alist - `(,tramp-androidsu-method nil "localhost")) (add-to-list 'tramp-default-user-alist `(,tramp-androidsu-method nil ,tramp-root-id-string))) @@ -130,7 +128,7 @@ multibyte mode and waits for the shell prompt to appear." (p (start-process (tramp-get-connection-name vec) (tramp-get-connection-buffer vec) ;; Disregard - ;; tramp-encoding-shell, as + ;; `tramp-encoding-shell', as ;; there's no guarantee that it's ;; possible to execute it with ;; `android-use-exec-loader' off. @@ -142,17 +140,16 @@ multibyte mode and waits for the shell prompt to appear." (tramp-post-process-creation p vec) ;; Replace `login-args' place holders. (setq command (format "exec su - %s || exit" user)) - (tramp-set-connection-property vec "remote-namespace" nil) ;; Attempt to execute the shell inside the global mount ;; namespace if requested. (when tramp-androidsu-mount-global-namespace (progn (when (eq tramp-androidsu-su-mm-supported 'unknown) ;; Change the prompt in advance so that - ;; tramp-adb-send-command-and-check can call - ;; tramp-search-regexp. + ;; `tramp-adb-send-command-and-check' can call + ;; `tramp-search-regexp'. (tramp-adb-send-command - vec (format "PS1=%s" + vec (format "PS1=%s PS2=''" (tramp-shell-quote-argument tramp-end-of-output))) (setq tramp-androidsu-su-mm-supported @@ -179,17 +176,17 @@ multibyte mode and waits for the shell prompt to appear." (tramp-set-connection-local-variables vec) ;; Change prompt. (tramp-adb-send-command - vec (format "PS1=%s" + vec (format "PS1=%s PS2=''" (tramp-shell-quote-argument tramp-end-of-output))) ;; Disable line editing. (tramp-adb-send-command vec "set +o vi +o vi-esccomplete +o vi-tabcomplete +o emacs") - ;; Dump option settings in the traces. - (when (>= tramp-verbose 9) - (tramp-adb-send-command vec "set -o")) ;; Disable Unicode, for otherwise Unicode filenames will ;; not be decoded correctly. (tramp-adb-send-command vec "set +U") + ;; Dump option settings in the traces. + (when (>= tramp-verbose 9) + (tramp-adb-send-command vec "set -o")) ;; Disable echo expansion. (tramp-adb-send-command vec "stty -inlcr -onlcr -echo kill '^U' erase '^H'" t) @@ -204,12 +201,8 @@ multibyte mode and waits for the shell prompt to appear." (tramp-message vec 5 "Remote echo still on. Ok.") ;; Make sure backspaces and their echo are enabled ;; and no line width magic interferes with them. - (tramp-adb-send-command vec - "stty icanon erase ^H cols 32767" - t))) - ;; Set the remote PATH to a suitable value. - (tramp-set-connection-property vec "remote-path" - tramp-androidsu-remote-path) + (tramp-adb-send-command + vec "stty icanon erase ^H cols 32767" t))) ;; Mark it as connected. (tramp-set-connection-property p "connected" t)))) ;; Cleanup, and propagate the signal. @@ -229,9 +222,9 @@ FUNCTION." (symbol-function #'tramp-adb-maybe-open-connection))) (unwind-protect (progn - ;; tramp-adb-wait-for-output addresses problems introduced + ;; `tramp-adb-wait-for-output' addresses problems introduced ;; by the adb utility itself, not Android utilities, so - ;; replace it with the regular TRAMP function. + ;; replace it with the regular Tramp function. (fset 'tramp-adb-wait-for-output #'tramp-wait-for-output) ;; Likewise, except some special treatment is necessary on ;; account of flaws in Android's su implementation. @@ -376,10 +369,8 @@ FUNCTION." p (make-process :name name :buffer buffer :command (if (tramp-get-connection-property v "remote-namespace") - (append (list "su" "-mm" "-" (or user "root") "-c") - command) - (append (list "su" "-" (or user "root") "-c") - command)) + (append (list "su" "-mm" "-" user "-c") command) + (append (list "su" "-" user "-c") command)) :coding coding :noquery noquery :connection-type connection-type :sentinel sentinel :stderr stderr)) ;; Set filter. Prior Emacs 29.1, it doesn't work reliably @@ -516,7 +507,7 @@ FUNCTION." (vc-registered . ignore) (verify-visited-file-modtime . tramp-handle-verify-visited-file-modtime) (write-region . tramp-androidsu-handle-write-region)) - "Alist of TRAMP handler functions for superuser sessions on Android.") + "Alist of Tramp handler functions for superuser sessions on Android.") ;; It must be a `defsubst' in order to push the whole code into ;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading. @@ -542,6 +533,20 @@ arguments to pass to the OPERATION." (tramp-register-foreign-file-name-handler #'tramp-androidsu-file-name-p #'tramp-androidsu-file-name-handler)) +;;; Default connection-local variables for Tramp. + +(defconst tramp-androidsu-connection-local-default-variables + `((tramp-remote-path . ,tramp-androidsu-remote-path)) + "Default connection-local variables for remote androidsu connections.") + +(connection-local-set-profile-variables + 'tramp-androidsu-connection-local-default-profile + tramp-androidsu-connection-local-default-variables) + +(connection-local-set-profiles + `(:application tramp :protocol ,tramp-androidsu-method) + 'tramp-androidsu-connection-local-default-profile) + (with-eval-after-load 'shell (connection-local-set-profiles `(:application tramp :protocol ,tramp-androidsu-method) From 59e470dd5de6e75c4d3bb91c876c8540faf33fdb Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Sat, 17 Feb 2024 20:49:15 -0800 Subject: [PATCH 416/446] When navigating through history in EWW, don't keep adding to 'eww-history' This resolves an issue where navigating back and then forward kept adding new history entries so you could never hit the "end" (bug#69232). * lisp/net/eww.el (eww-before-browse-history-function): New option. (eww-history-position): Add docstring. (eww-mode-map, eww-context-menu): Use correct predicates for when to enable back/forward. (eww-save-history): Save history entry in its original place when viewing a historical page. (eww--before-browse): New function... (eww, eww-follow-link, eww-readable): ... call it. (eww-render): Don't set 'eww-history-position' here... (eww--before-browse): ... instead, set it here. (eww-back-url): Set 'eww-history-position' based on the result of 'eww-save-history'. (eww-forward-url): Set 'eww-history-position' directly, since 'eww-save-history' no longer adds a new entry in this case. (eww-delete-future-history, eww-clone-previous-history): New functions. * test/lisp/net/eww-tests.el: New file. * etc/NEWS: Announce this change. --- doc/misc/eww.texi | 9 ++ etc/NEWS | 13 +++ lisp/net/eww.el | 123 ++++++++++++++++++++++--- test/lisp/net/eww-tests.el | 179 +++++++++++++++++++++++++++++++++++++ 4 files changed, 312 insertions(+), 12 deletions(-) create mode 100644 test/lisp/net/eww-tests.el diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi index 5e69b11d347..d31fcf1802b 100644 --- a/doc/misc/eww.texi +++ b/doc/misc/eww.texi @@ -192,6 +192,15 @@ history press @kbd{H} (@code{eww-list-histories}) to open the history buffer @file{*eww history*}. The history is lost when EWW is quit. If you want to remember websites you can use bookmarks. +@vindex eww-before-browse-history-function + By default, when browsing to a new page from a ``historical'' one +(i.e.@: a page loaded by navigating back via @code{eww-back-url}), EWW +will first delete any history entries newer than the current page. This +is the same behavior as most other web browsers. You can change this by +customizing @code{eww-before-browse-history-function} to another value. +For example, setting it to @code{ignore} will preserve the existing +history entries and simply prepend the new page to the history list. + @vindex eww-history-limit Along with the URLs visited, EWW also remembers both the rendered page (as it appears in the buffer) and its source. This can take a diff --git a/etc/NEWS b/etc/NEWS index fd957fdb115..745b3b12936 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1018,6 +1018,19 @@ When invoked with the prefix argument ('C-u'), This is useful for continuing reading the URL in the current buffer when the new URL is fetched. +--- +*** History navigation in EWW now works like other browsers. +Previously, when navigating back and forward through page history, EWW +would add a duplicate entry to the end of the history list each time. +This made it impossible to navigate to the "end" of the history list. +Now, navigating through history in EWW simply changes your position in +the history list, allowing you to reach the end as expected. In +addition, when browsing to a new page from a "historical" one (i.e. a +page loaded by navigating back through history), EWW deletes the history +entries newer than the current page. To change the behavior when +browsing from "historical" pages, you can customize +'eww-before-browse-history-function'. + ** go-ts-mode +++ diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 5a25eef9e3c..2936bc8f099 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -182,6 +182,33 @@ the tab bar is enabled." (const :tag "Open new tab when tab bar is enabled" tab-bar) (const :tag "Never open URL in new tab" nil))) +(defcustom eww-before-browse-history-function #'eww-delete-future-history + "A function to call to update history before browsing to a new page. +EWW provides the following values for this option: + +* `eww-delete-future-history': Delete any history entries after the + currently-shown one. This is the default behavior, and works the same + as in most other web browsers. + +* `eww-clone-previous-history': Clone and prepend any history entries up + to the currently-shown one. This is like `eww-delete-future-history', + except that it preserves the previous contents of the history list at + the end. + +* `ignore': Preserve the current history unchanged. This will result in + the new page simply being prepended to the existing history list. + +You can also set this to any other function you wish." + :version "30.1" + :group 'eww + :type '(choice (function-item :tag "Delete future history" + eww-delete-future-history) + (function-item :tag "Clone previous history" + eww-clone-previous-history) + (function-item :tag "Preserve history" + ignore) + (function :tag "Custom function"))) + (defcustom eww-after-render-hook nil "A hook called after eww has finished rendering the buffer." :version "25.1" @@ -312,7 +339,10 @@ parameter, and should return the (possibly) transformed URL." (defvar eww-data nil) (defvar eww-history nil) -(defvar eww-history-position 0) +(defvar eww-history-position 0 + "The 1-indexed position in `eww-history'. +If zero, EWW is at the newest page, which isn't yet present in +`eww-history'.") (defvar eww-prompt-history nil) (defvar eww-local-regex "localhost" @@ -402,6 +432,7 @@ For more information, see Info node `(eww) Top'." (t (get-buffer-create "*eww*")))) (eww-setup-buffer) + (eww--before-browse) ;; Check whether the domain only uses "Highly Restricted" Unicode ;; IDNA characters. If not, transform to punycode to indicate that ;; there may be funny business going on. @@ -654,7 +685,6 @@ The renaming scheme is performed in accordance with (with-current-buffer buffer (plist-put eww-data :url url) (eww--after-page-change) - (setq eww-history-position 0) (and last-coding-system-used (set-buffer-file-coding-system last-coding-system-used)) (unless shr-fill-text @@ -905,6 +935,11 @@ The renaming scheme is performed in accordance with `((?u . ,(or url "")) (?t . ,title)))))))) +(defun eww--before-browse () + (funcall eww-before-browse-history-function) + (setq eww-history-position 0 + eww-data (list :title ""))) + (defun eww--after-page-change () (eww-update-header-line-format) (eww--rename-buffer)) @@ -1037,6 +1072,7 @@ the like." (base (plist-get eww-data :url))) (eww-score-readability dom) (eww-save-history) + (eww--before-browse) (eww-display-html nil nil (list 'base (list (cons 'href base)) (eww-highest-readability dom)) @@ -1129,9 +1165,9 @@ the like." ["Reload" eww-reload t] ["Follow URL in new buffer" eww-open-in-new-buffer] ["Back to previous page" eww-back-url - :active (not (zerop (length eww-history)))] + :active (< eww-history-position (length eww-history))] ["Forward to next page" eww-forward-url - :active (not (zerop eww-history-position))] + :active (> eww-history-position 1)] ["Browse with external browser" eww-browse-with-external-browser t] ["Download" eww-download t] ["View page source" eww-view-source] @@ -1155,9 +1191,9 @@ the like." (easy-menu-define nil easy-menu nil '("Eww" ["Back to previous page" eww-back-url - :visible (not (zerop (length eww-history)))] + :active (< eww-history-position (length eww-history))] ["Forward to next page" eww-forward-url - :visible (not (zerop eww-history-position))] + :active (> eww-history-position 1)] ["Reload" eww-reload t])) (dolist (item (reverse (lookup-key easy-menu [menu-bar eww]))) (when (consp item) @@ -1280,16 +1316,20 @@ instead of `browse-url-new-window-flag'." (interactive nil eww-mode) (when (>= eww-history-position (length eww-history)) (user-error "No previous page")) - (eww-save-history) - (setq eww-history-position (+ eww-history-position 2)) + (if (eww-save-history) + ;; We were at the latest page (which was just added to the + ;; history), so go back two entries. + (setq eww-history-position 2) + (setq eww-history-position (1+ eww-history-position))) (eww-restore-history (elt eww-history (1- eww-history-position)))) (defun eww-forward-url () "Go to the next displayed page." (interactive nil eww-mode) - (when (zerop eww-history-position) + (when (<= eww-history-position 1) (user-error "No next page")) (eww-save-history) + (setq eww-history-position (1- eww-history-position)) (eww-restore-history (elt eww-history (1- eww-history-position)))) (defun eww-restore-history (elem) @@ -1959,6 +1999,7 @@ If EXTERNAL is double prefix, browse in new buffer." (eww-same-page-p url (plist-get eww-data :url))) (let ((point (point))) (eww-save-history) + (eww--before-browse) (plist-put eww-data :url url) (goto-char (point-min)) (if-let ((match (text-property-search-forward 'shr-target-id target #'member))) @@ -2289,11 +2330,69 @@ If ERROR-OUT, signal user-error if there are no bookmarks." ;;; History code (defun eww-save-history () + "Save the current page's data to the history. +If the current page is a historial one loaded from +`eww-history' (e.g. by calling `eww-back-url'), this will update the +page's entry in `eww-history' and return nil. Otherwise, add a new +entry to `eww-history' and return t." (plist-put eww-data :point (point)) (plist-put eww-data :text (buffer-string)) - (let ((history-delete-duplicates nil)) - (add-to-history 'eww-history eww-data eww-history-limit t)) - (setq eww-data (list :title ""))) + (if (zerop eww-history-position) + (let ((history-delete-duplicates nil)) + (add-to-history 'eww-history eww-data eww-history-limit t) + (setq eww-history-position 1) + t) + (setf (elt eww-history (1- eww-history-position)) eww-data) + nil)) + +(defun eww-delete-future-history () + "Remove any entries in `eww-history' after the currently-shown one. +This is useful for `eww-before-browse-history-function' to make EWW's +navigation to a new page from a historical one work like other web +browsers: it will delete any \"future\" history elements before adding +the new page to the end of the history. + +For example, if `eww-history' looks like this (going from newest to +oldest, with \"*\" marking the current page): + + E D C* B A + +then calling this function updates `eww-history' to: + + C* B A" + (when (> eww-history-position 1) + (setq eww-history (nthcdr (1- eww-history-position) eww-history) + ;; We don't really need to set this since `eww--before-browse' + ;; sets it too, but this ensures that other callers can use + ;; this function and get the expected results. + eww-history-position 1))) + +(defun eww-clone-previous-history () + "Clone and prepend entries in `eww-history' up to the currently-shown one. +These cloned entries get added to the beginning of `eww-history' so that +it's possible to navigate back to the very first page for this EWW +without deleting any history entries. + +For example, if `eww-history' looks like this (going from newest to +oldest, with \"*\" marking the current page): + + E D C* B A + +then calling this function updates `eww-history' to: + + C* B A E D C B A + +This is useful for setting `eww-before-browse-history-function' (which +see)." + (when (> eww-history-position 1) + (setq eww-history (take eww-history-limit + (append (nthcdr (1- eww-history-position) + eww-history) + eww-history)) + ;; As with `eww-delete-future-history', we don't really need + ;; to set this since `eww--before-browse' sets it too, but + ;; let's be thorough. + eww-history-position 1))) (defvar eww-current-buffer) diff --git a/test/lisp/net/eww-tests.el b/test/lisp/net/eww-tests.el new file mode 100644 index 00000000000..ced84322e3a --- /dev/null +++ b/test/lisp/net/eww-tests.el @@ -0,0 +1,179 @@ +;;; eww-tests.el --- tests for eww.el -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'ert) +(require 'eww) + +(defvar eww-test--response-function (lambda (url) (concat "\n" url)) + "A function for returning a mock response for URL. +The default just returns an empty list of headers URL as the body.") + +(defmacro eww-test--with-mock-retrieve (&rest body) + "Evaluate BODY with a mock implementation of `eww-retrieve'. +This avoids network requests during our tests. Additionally, prepare a +temporary EWW buffer for our tests." + (declare (indent 1)) + `(cl-letf (((symbol-function 'eww-retrieve) + (lambda (url callback args) + (with-temp-buffer + (insert (funcall eww-test--response-function url)) + (apply callback nil args))))) + (with-temp-buffer + (eww-mode) + ,@body))) + +(defun eww-test--history-urls () + (mapcar (lambda (elem) (plist-get elem :url)) eww-history)) + +;;; Tests: + +(ert-deftest eww-test/history/new-page () + "Test that when visiting a new page, the previous one goes into the history." + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (should (equal (eww-test--history-urls) + '("http://one.invalid/"))) + (eww "three.invalid") + (should (equal (eww-test--history-urls) + '("http://two.invalid/" + "http://one.invalid/"))))) + +(ert-deftest eww-test/history/back-forward () + "Test that navigating through history just changes our history position. +See bug#69232." + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (eww "three.invalid") + (let ((url-history '("http://three.invalid/" + "http://two.invalid/" + "http://one.invalid/"))) + ;; Go back one page. This should add "three.invalid" to the + ;; history, making our position in the list 2. + (eww-back-url) + (should (equal (eww-test--history-urls) url-history)) + (should (= eww-history-position 2)) + ;; Go back again. + (eww-back-url) + (should (equal (eww-test--history-urls) url-history)) + (should (= eww-history-position 3)) + ;; At the beginning of the history, so trying to go back should + ;; signal an error. + (should-error (eww-back-url)) + ;; Go forward once. + (eww-forward-url) + (should (equal (eww-test--history-urls) url-history)) + (should (= eww-history-position 2)) + ;; Go forward again. + (eww-forward-url) + (should (equal (eww-test--history-urls) url-history)) + (should (= eww-history-position 1)) + ;; At the end of the history, so trying to go forward should + ;; signal an error. + (should-error (eww-forward-url))))) + +(ert-deftest eww-test/history/reload-in-place () + "Test that reloading historical pages updates their history entry in-place. +See bug#69232." + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (eww "three.invalid") + (eww-back-url) + ;; Make sure our history has the original page text. + (should (equal (plist-get (nth 1 eww-history) :text) + "http://two.invalid/")) + (should (= eww-history-position 2)) + ;; Reload the page. + (let ((eww-test--response-function + (lambda (url) (concat "\nreloaded " url)))) + (eww-reload) + (should (= eww-history-position 2))) + ;; Go to another page, and make sure the history is correct, + ;; including the reloaded page text. + (eww "four.invalid") + (should (equal (eww-test--history-urls) '("http://two.invalid/" + "http://one.invalid/"))) + (should (equal (plist-get (nth 0 eww-history) :text) + "reloaded http://two.invalid/")) + (should (= eww-history-position 0)))) + +(ert-deftest eww-test/history/before-navigate/delete-future-history () + "Test that going to a new page from a historical one deletes future history. +See bug#69232." + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (eww "three.invalid") + (eww-back-url) + (eww "four.invalid") + (eww "five.invalid") + (should (equal (eww-test--history-urls) '("http://four.invalid/" + "http://two.invalid/" + "http://one.invalid/"))) + (should (= eww-history-position 0)))) + +(ert-deftest eww-test/history/before-navigate/ignore-history () + "Test that going to a new page from a historical one preserves history. +This sets `eww-before-browse-history-function' to `ignore' to preserve +history. See bug#69232." + (let ((eww-before-browse-history-function #'ignore)) + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (eww "three.invalid") + (eww-back-url) + (eww "four.invalid") + (eww "five.invalid") + (should (equal (eww-test--history-urls) '("http://four.invalid/" + "http://three.invalid/" + "http://two.invalid/" + "http://one.invalid/"))) + (should (= eww-history-position 0))))) + +(ert-deftest eww-test/history/before-navigate/clone-previous () + "Test that going to a new page from a historical one clones prior history. +This sets `eww-before-browse-history-function' to +`eww-clone-previous-history' to clone the history. See bug#69232." + (let ((eww-before-browse-history-function #'eww-clone-previous-history)) + (eww-test--with-mock-retrieve + (eww "one.invalid") + (eww "two.invalid") + (eww "three.invalid") + (eww-back-url) + (eww "four.invalid") + (eww "five.invalid") + (should (equal (eww-test--history-urls) + '(;; New page and cloned history. + "http://four.invalid/" + "http://two.invalid/" + "http://one.invalid/" + ;; Original history. + "http://three.invalid/" + "http://two.invalid/" + "http://one.invalid/"))) + (should (= eww-history-position 0))))) + +(provide 'eww-tests) +;; eww-tests.el ends here From 8aabd835747297818d538cc16b3f53fcc1dd67f6 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Thu, 7 Mar 2024 09:56:02 +0200 Subject: [PATCH 417/446] * lisp/follow.el: Put property 'isearch-scroll' on 'follow-recenter'. --- lisp/follow.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/follow.el b/lisp/follow.el index ce40317ca59..874e546bd6d 100644 --- a/lisp/follow.el +++ b/lisp/follow.el @@ -874,6 +874,7 @@ from the bottom." (when (< dest win-s) (setq follow-internal-force-redisplay t)))))) +(put 'follow-recenter 'isearch-scroll t) (defun follow-redraw () "Arrange windows displaying the same buffer in successor order. From 5ffcca121bb79b97c6a0f941c71a61505032d8f8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 7 Mar 2024 10:11:44 +0200 Subject: [PATCH 418/446] ; Improve documentation of image properties * lisp/image.el (create-image, image-property): Add to do strings link to description of image properties in ELisp manual. * doc/lispref/display.texi (Defining Images): Fix example and add cross-reference to where image properties are described. (Image Descriptors): Add index entry. --- doc/lispref/display.texi | 9 +++++++-- lisp/image.el | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index 34f215820ed..c6b29e87b3a 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -6041,6 +6041,7 @@ event is composed by combining the @var{id} of the hot-spot with the mouse event; for instance, @code{[area4 mouse-1]} if the hot-spot's @var{id} is @code{area4}. +@findex image-compute-scaling-factor Note that the map's coordinates should reflect the displayed image after all transforms have been done (rotation, scaling and so on), and also note that Emacs (by default) performs auto-scaling of images, so @@ -6759,11 +6760,15 @@ from the file's name. The remaining arguments, @var{props}, specify additional image properties---for example, -@c ':heuristic-mask' is not documented? @example -(create-image "foo.xpm" 'xpm nil :heuristic-mask t) +(create-image "foo.xpm" 'xpm nil :mask 'heuristic) @end example +@noindent +@xref{Image Descriptors}, for the list of supported properties. Some +properties are specific to certain image types, and are described in +subsections specific to those types. + The function returns @code{nil} if images of this type are not supported. Otherwise it returns an image descriptor. @end defun diff --git a/lisp/image.el b/lisp/image.el index ef29698f647..4e50f678433 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -494,9 +494,13 @@ use its file extension as image type. Optional DATA-P non-nil means FILE-OR-DATA is a string containing image data. Optional PROPS are additional image attributes to assign to the image, -like, e.g. `:mask MASK'. If the property `:scale' is not given and the -display has a high resolution (more exactly, when the average width of a -character in the default font is more than 10 pixels), the image is +like, e.g. `:mask MASK'. See Info node `(elisp)Image Descriptors' for +the list of supported properties; see the nodes following that node +for properties specific to certain image types. + +If the property `:scale' is not given and the display has a high +resolution (more exactly, when the average width of a character +in the default font is more than 10 pixels), the image is automatically scaled up in proportion to the default font. Value is the image created, or nil if images of type TYPE are not supported. @@ -571,7 +575,11 @@ Internal use only." Properties can be set with (setf (image-property IMAGE PROPERTY) VALUE) -If VALUE is nil, PROPERTY is removed from IMAGE." +If VALUE is nil, PROPERTY is removed from IMAGE. + +See Info node `(elisp)Image Descriptors' for the list of +supported properties; see the nodes following that node for +properties specific to certain image types." (declare (gv-setter image--set-property)) (plist-get (cdr image) property)) From 61b2f5f96b1d9dfd2fd908e09fac0d4163049c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Wed, 6 Mar 2024 12:03:06 +0100 Subject: [PATCH 419/446] Single string literal in body is return value only, not doc string A function or macro body consisting of a single string literal now only uses it as a return value. Previously, it had the dual uses as return value and doc string, which was never what the programmer wanted and had some inconvenient consequences (bug#69387). This change applies to `lambda`, `defun`, `defsubst` and `defmacro` forms; most other defining forms already worked in the sensible way. * lisp/emacs-lisp/bytecomp.el (byte-compile-lambda): Don't use a lone string literal as doc string. * test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el (foo): Update docstring warning test. * doc/lispref/functions.texi (Function Documentation): Update. * etc/NEWS: Announce. --- doc/lispref/functions.texi | 13 ++++++------- etc/NEWS | 16 ++++++++++++++++ lisp/emacs-lisp/bytecomp.el | 9 ++++----- .../warn-wide-docstring-defun.el | 3 ++- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi index 344b3ff3a50..ff635fc54b2 100644 --- a/doc/lispref/functions.texi +++ b/doc/lispref/functions.texi @@ -498,13 +498,12 @@ indentation of the following lines is inside the string; what looks nice in the source code will look ugly when displayed by the help commands. - You may wonder how the documentation string could be optional, since -there are required components of the function that follow it (the body). -Since evaluation of a string returns that string, without any side effects, -it has no effect if it is not the last form in the body. Thus, in -practice, there is no confusion between the first form of the body and the -documentation string; if the only body form is a string then it serves both -as the return value and as the documentation. + A documentation string must always be followed by at least one Lisp +expression; otherwise, it is not a documentation string at all but the +single expression of the body and used as the return value. +When there is no meaningful value to return from a function, it is +standard practice to return @code{nil} by adding it after the +documentation string. The last line of the documentation string can specify calling conventions different from the actual function arguments. Write diff --git a/etc/NEWS b/etc/NEWS index 745b3b12936..3a57084688d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1818,6 +1818,22 @@ Tree-sitter conditionally sets 'forward-sexp-function' for major modes that have defined 'sexp' in 'treesit-thing-settings' to enable sexp-related motion commands. ++++ +** Returned strings are never docstrings. +Functions and macros whose bodies consist of a single string literal now +only return that string; it is not used as a docstring. Example: + + (defun sing-a-song () + "Sing a song.") + +The above function returns the string '"Sing a song."' but has no +docstring. Previously, that string was used as both a docstring and +return value, which was never what the programmer wanted. If you want +the string to be a docstring, add an explicit return value. + +This change applies to 'defun', 'defsubst', 'defmacro' and 'lambda' +forms; other defining forms such as 'cl-defun' already worked this way. + ** New or changed byte-compilation warnings --- diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index c3355eedd75..cf0e6d600dd 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -3061,12 +3061,11 @@ lambda-expression." (append (if (not lexical-binding) arglistvars) byte-compile-bound-variables)) (body (cdr (cdr fun))) - (doc (if (stringp (car body)) + ;; Treat a final string literal as a value, not a doc string. + (doc (if (and (cdr body) (stringp (car body))) (prog1 (car body) - ;; Discard the doc string from the body - ;; unless it is the last element of the body. - (if (cdr body) - (setq body (cdr body)))))) + ;; Discard the doc string from the body. + (setq body (cdr body))))) (int (assq 'interactive body)) command-modes) (when lexical-binding diff --git a/test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el b/test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el index 94b0e80c979..571f7f6f095 100644 --- a/test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el +++ b/test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el @@ -1,3 +1,4 @@ ;;; -*- lexical-binding: t -*- (defun foo () - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + nil) From 90c2e287b7654c22b66012059c953c976c1596c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 7 Mar 2024 14:29:36 +0100 Subject: [PATCH 420/446] Revert "Suppress docstring control char warning in macro-generated function" This reverts commit eeb89a5cb292bffe40ba7d0b0cf81f82f8452bf8. It is no longer needed now that (lambda (...) "string") does not have a doc string (bug#69387). --- lisp/progmodes/cc-defs.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index 2c793c8a99d..e45ab76ec07 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -2579,8 +2579,7 @@ constant. A file is identified by its base name." ;; dependencies on the `c-lang-const's in VAL.) (setq val (c--macroexpand-all val)) - (setq bindings `(cons (cons ',assigned-mode (lambda () nil ,val)) - ,bindings) + (setq bindings `(cons (cons ',assigned-mode (lambda () ,val)) ,bindings) args (cdr args)))) ;; Compile in the other files that have provided source From aec0f610cb5aace1301cd230e57844a93d40cccd Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 7 Mar 2024 12:19:28 -0800 Subject: [PATCH 421/446] ; * test/lisp/net/eww-tests.el (eww-test--response-function): Fix typo. --- test/lisp/net/eww-tests.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/lisp/net/eww-tests.el b/test/lisp/net/eww-tests.el index ced84322e3a..bd00893d503 100644 --- a/test/lisp/net/eww-tests.el +++ b/test/lisp/net/eww-tests.el @@ -26,7 +26,8 @@ (defvar eww-test--response-function (lambda (url) (concat "\n" url)) "A function for returning a mock response for URL. -The default just returns an empty list of headers URL as the body.") +The default just returns an empty list of headers and the URL as the +body.") (defmacro eww-test--with-mock-retrieve (&rest body) "Evaluate BODY with a mock implementation of `eww-retrieve'. From e42f14f0e034d0b20c6b9fd0fea23686699e7df0 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Wed, 6 Mar 2024 13:27:07 -0800 Subject: [PATCH 422/446] Support expanding Eshell globs for remote file names * lisp/eshell/em-glob.el (eshell-glob-chars-regexp): New function... (eshell-glob-regexp): ... use it. (eshell-glob-p): New function... (eshell-glob-convert): ... use it, and return the deepest start directory possible. * lisp/eshell/esh-util.el (eshell-split-path): Rename to... (eshell-split-path): ... this, and account for remote file names. * test/lisp/eshell/em-glob-tests.el (em-glob-test/convert/current-start-directory) (em-glob-test/convert/relative-start-directory) (em-glob-test/convert/absolute-start-directory) (em-glob-test/convert/remote-start-directory): New tests (bug#69592). --- lisp/eshell/em-glob.el | 36 ++++++++++++++-------- lisp/eshell/esh-util.el | 51 +++++++++++++++++-------------- test/lisp/eshell/em-glob-tests.el | 30 ++++++++++++++++++ 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/lisp/eshell/em-glob.el b/lisp/eshell/em-glob.el index b0c3e6e7a11..7fc6958a00f 100644 --- a/lisp/eshell/em-glob.el +++ b/lisp/eshell/em-glob.el @@ -190,6 +190,12 @@ interpretation." '(("**/" . recurse) ("***/" . recurse-symlink))) +(defsubst eshell-glob-chars-regexp () + "Return the lazily-created value for `eshell-glob-chars-regexp'." + (or eshell-glob-chars-regexp + (setq-local eshell-glob-chars-regexp + (format "[%s]+" (apply 'string eshell-glob-chars-list))))) + (defun eshell-glob-regexp (pattern) "Convert glob-pattern PATTERN to a regular expression. The basic syntax is: @@ -210,11 +216,8 @@ set to true, then these characters will match themselves in the resulting regular expression." (let ((matched-in-pattern 0) ; How much of PATTERN handled regexp) - (while (string-match - (or eshell-glob-chars-regexp - (setq-local eshell-glob-chars-regexp - (format "[%s]+" (apply 'string eshell-glob-chars-list)))) - pattern matched-in-pattern) + (while (string-match (eshell-glob-chars-regexp) + pattern matched-in-pattern) (let* ((op-begin (match-beginning 0)) (op-char (aref pattern op-begin))) (setq regexp @@ -239,6 +242,10 @@ resulting regular expression." (regexp-quote (substring pattern matched-in-pattern)) "\\'"))) +(defun eshell-glob-p (pattern) + "Return non-nil if PATTERN has any special glob characters." + (string-match (eshell-glob-chars-regexp) pattern)) + (defun eshell-glob-convert-1 (glob &optional last) "Convert a GLOB matching a single element of a file name to regexps. If LAST is non-nil, this glob is the last element of a file name. @@ -291,14 +298,13 @@ The result is a list of three elements: symlinks. 3. A boolean indicating whether to match directories only." - (let ((globs (eshell-split-path glob)) - (isdir (eq (aref glob (1- (length glob))) ?/)) + (let ((globs (eshell-split-filename glob)) + (isdir (string-suffix-p "/" glob)) start-dir result last-saw-recursion) (if (and (cdr globs) (file-name-absolute-p (car globs))) - (setq start-dir (car globs) - globs (cdr globs)) - (setq start-dir ".")) + (setq start-dir (pop globs)) + (setq start-dir (file-name-as-directory "."))) (while globs (if-let ((recurse (cdr (assoc (car globs) eshell-glob-recursive-alist)))) @@ -306,11 +312,15 @@ The result is a list of three elements: (setcar result recurse) (push recurse result) (setq last-saw-recursion t)) - (push (eshell-glob-convert-1 (car globs) (null (cdr globs))) - result) + (if (or result (eshell-glob-p (car globs))) + (push (eshell-glob-convert-1 (car globs) (null (cdr globs))) + result) + ;; We haven't seen a glob yet, so instead append to the start + ;; directory. + (setq start-dir (file-name-concat start-dir (car globs)))) (setq last-saw-recursion nil)) (setq globs (cdr globs))) - (list (file-name-as-directory start-dir) + (list start-dir (nreverse result) isdir))) diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el index f0acfecb701..129134814e3 100644 --- a/lisp/eshell/esh-util.el +++ b/lisp/eshell/esh-util.el @@ -447,29 +447,34 @@ Prepend remote identification of `default-directory', if any." (parse-colon-path path-env)) (parse-colon-path path-env)))) -(defun eshell-split-path (path) - "Split a path into multiple subparts." - (let ((len (length path)) - (i 0) (li 0) - parts) - (if (and (eshell-under-windows-p) - (> len 2) - (eq (aref path 0) ?/) - (eq (aref path 1) ?/)) - (setq i 2)) - (while (< i len) - (if (and (eq (aref path i) ?/) - (not (get-text-property i 'escaped path))) - (setq parts (cons (if (= li i) "/" - (substring path li (1+ i))) parts) - li (1+ i))) - (setq i (1+ i))) - (if (< li i) - (setq parts (cons (substring path li i) parts))) - (if (and (eshell-under-windows-p) - (string-match "\\`[A-Za-z]:\\'" (car (last parts)))) - (setcar (last parts) (concat (car (last parts)) "/"))) - (nreverse parts))) +(defun eshell-split-filename (filename) + "Split a FILENAME into a list of file/directory components." + (let* ((remote (file-remote-p filename)) + (filename (file-local-name filename)) + (len (length filename)) + (index 0) (curr-start 0) + parts) + (when (and (eshell-under-windows-p) + (string-prefix-p "//" filename)) + (setq index 2)) + (while (< index len) + (when (and (eq (aref filename index) ?/) + (not (get-text-property index 'escaped filename))) + (push (if (= curr-start index) "/" + (substring filename curr-start (1+ index))) + parts) + (setq curr-start (1+ index))) + (setq index (1+ index))) + (when (< curr-start len) + (push (substring filename curr-start) parts)) + (setq parts (nreverse parts)) + (when (and (eshell-under-windows-p) + (string-match "\\`[A-Za-z]:\\'" (car parts))) + (setcar parts (concat (car parts) "/"))) + (if remote (cons remote parts) parts))) + +(define-obsolete-function-alias 'eshell-split-path + 'eshell-split-filename "30.1") (defun eshell-to-flat-string (value) "Make value a string. If separated by newlines change them to spaces." diff --git a/test/lisp/eshell/em-glob-tests.el b/test/lisp/eshell/em-glob-tests.el index 6d922666ea3..fc460a59eed 100644 --- a/test/lisp/eshell/em-glob-tests.el +++ b/test/lisp/eshell/em-glob-tests.el @@ -61,6 +61,9 @@ component ending in \"symlink\" is treated as a symbolic link." ;;; Tests: + +;; Glob expansion + (ert-deftest em-glob-test/expand/splice-results () "Test that globs are spliced into the argument list when `eshell-glob-splice-results' is non-nil." @@ -115,6 +118,33 @@ value of `eshell-glob-splice-results'." (eshell-command-result-equal "list ${listify *.no}" '(("*.no")))))))) + +;; Glob conversion + +(ert-deftest em-glob-test/convert/current-start-directory () + "Test converting a glob starting in the current directory." + (should (equal (eshell-glob-convert "*.el") + '("./" (("\\`.*\\.el\\'" . "\\`\\.")) nil)))) + +(ert-deftest em-glob-test/convert/relative-start-directory () + "Test converting a glob starting in a relative directory." + (should (equal (eshell-glob-convert "some/where/*.el") + '("./some/where/" (("\\`.*\\.el\\'" . "\\`\\.")) nil)))) + +(ert-deftest em-glob-test/convert/absolute-start-directory () + "Test converting a glob starting in an absolute directory." + (should (equal (eshell-glob-convert "/some/where/*.el") + '("/some/where/" (("\\`.*\\.el\\'" . "\\`\\.")) nil)))) + +(ert-deftest em-glob-test/convert/remote-start-directory () + "Test converting a glob starting in a remote directory." + (should (equal (eshell-glob-convert "/ssh:nowhere.invalid:some/where/*.el") + '("/ssh:nowhere.invalid:/some/where/" + (("\\`.*\\.el\\'" . "\\`\\.")) nil)))) + + +;; Glob matching + (ert-deftest em-glob-test/match-any-string () "Test that \"*\" pattern matches any string." (with-fake-files '("a.el" "b.el" "c.txt" "dir/a.el") From 00f86833ac5423d57825213ef8b611978be0a3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20J=C3=B6rg?= Date: Fri, 8 Mar 2024 00:37:36 +0100 Subject: [PATCH 423/446] ; perl-mode, cperl-mode: Fix $\" in strings (Bug#69604) * lisp/progmodes/perl-mode.el (perl-syntax-propertize-function): Add to syntax-propertize-rules that $ is punctuation in strings. * lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): capture $\ to catch the edge case of "$\"". Make $ a punctuation char in strings and comments. * test/lisp/progmodes/cperl-mode-tests.el (cperl-test-bug-69604): New testcases with various combinations of $ " \ --- lisp/progmodes/cperl-mode.el | 12 ++++++++++-- lisp/progmodes/perl-mode.el | 11 ++++++++++- test/lisp/progmodes/cperl-mode-tests.el | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 113eed64917..10ac80dffd5 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -4014,7 +4014,10 @@ recursive calls in starting lines of here-documents." ;; 1+6+2+1+1+6+1+1+1=20 extra () before this: "\\|" ;; -------- backslash-escaped stuff, don't interpret it - "\\\\\\(['`\"($]\\)") ; BACKWACKED something-hairy + "\\\\\\(['`\"($]\\)" ; BACKWACKED something-hairy + "\\|" + ;; -------- $\ is a variable in code, but not in a string + "\\(\\$\\\\\\)") ""))) warning-message) (unwind-protect @@ -4068,7 +4071,12 @@ recursive calls in starting lines of here-documents." (cperl-modify-syntax-type bb cperl-st-punct))) ;; No processing in strings/comments beyond this point: ((or (nth 3 state) (nth 4 state)) - t) ; Do nothing in comment/string + ;; Edge case: In a double-quoted string, $\ is not the + ;; punctuation variable, $ must not quote \ here. We + ;; generally make $ a punctuation character in strings + ;; and comments (Bug#69604). + (when (match-beginning 22) + (cperl-modify-syntax-type (match-beginning 22) cperl-st-punct))) ((match-beginning 1) ; POD section ;; "\\(\\`\n?\\|^\n\\)=" (setq b (match-beginning 0) diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el index f74390841fe..f6c4dbed1e2 100644 --- a/lisp/progmodes/perl-mode.el +++ b/lisp/progmodes/perl-mode.el @@ -251,7 +251,16 @@ ;; correctly the \() construct (Bug#11996) as well as references ;; to string values. ("\\(\\\\\\)['`\"($]" (1 (unless (nth 3 (syntax-ppss)) - (string-to-syntax ".")))) + (string-to-syntax ".")))) + ;; A "$" in Perl code must escape the next char to protect against + ;; misinterpreting Perl's punctuation variables as unbalanced + ;; quotes or parens. This is not needed in strings and broken in + ;; the special case of "$\"" (Bug#69604). Make "$" a punctuation + ;; char in strings. + ("\\$" (0 (if (save-excursion + (nth 3 (syntax-ppss (match-beginning 0)))) + (string-to-syntax ".") + (string-to-syntax "/")))) ;; Handle funny names like $DB'stop. ("\\$ ?{?\\^?[_[:alpha:]][_[:alnum:]]*\\('\\)[_[:alpha:]]" (1 "_")) ;; format statements diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el index 62b7fdab7f7..9d9718f719c 100644 --- a/test/lisp/progmodes/cperl-mode-tests.el +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -1431,6 +1431,25 @@ cperl-mode fontifies text after the delimiter as Perl code." (should (equal (get-text-property (point) 'face) font-lock-comment-face)))) +(ert-deftest cperl-test-bug-69604 () + "Verify that $\" in a double-quoted string does not end the string. +Both `perl-mode' and `cperl-mode' treat ?$ as a quoting/escaping char to +avoid issues with punctuation variables. In a string, however, this is +not appropriate." + (let ((strings + '("\"$\\\" in string ---\"; # \"" ; $ must not quote \ + "$\" . \" in string ---\"; # \"" ; $ must quote \ + "\"\\$\" . \" in string ---\"; # \""))) ; \$ must not quote + (dolist (string strings) + (with-temp-buffer + (insert string) + (funcall cperl-test-mode) + (font-lock-ensure) + (goto-char (point-min)) + (search-forward "in string") + (should (equal (get-text-property (point) 'face) + font-lock-string-face)))))) + (ert-deftest test-indentation () (ert-test-erts-file (ert-resource-file "cperl-indents.erts"))) From e4d1739a2917a1b2ab279f4765f015e667e07db0 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 8 Mar 2024 10:58:17 +0800 Subject: [PATCH 424/446] Declare 124 new Android permissions * doc/emacs/android.texi (Android Environment): Document new permissions and delete recently introduced permissions from the list for Android 5.1 and earlier. * java/AndroidManifest.xml.in: Declare 124 new permissions to enable invoking features they protect from code running inside Emacs. --- doc/emacs/android.texi | 359 ++++++++++++++++++++++++++++++------ java/AndroidManifest.xml.in | 126 +++++++++++++ 2 files changed, 429 insertions(+), 56 deletions(-) diff --git a/doc/emacs/android.texi b/doc/emacs/android.texi index 0ea96d91492..a45ec84f3f0 100644 --- a/doc/emacs/android.texi +++ b/doc/emacs/android.texi @@ -474,33 +474,200 @@ version of Android being used: @itemize @bullet @item Under more or less recent releases of Android, such as Android 6.0 and -later, Emacs only receives the following permissions upon -installation: +later, Emacs only receives the following permissions upon installation, +subject to the presence or absence of individual permissions in the +version of Android installed: @itemize @minus @item -@code{android.permission.VIBRATE} +@code{android.permission.ACCESS_ADSERVICES_AD_ID} +@item +@code{android.permission.ACCESS_ADSERVICES_ATTRIBUTION} +@item +@code{android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE} +@item +@code{android.permission.ACCESS_ADSERVICES_TOPICS} +@item +@code{android.permission.ACCESS_LOCATION_EXTRA_COMMANDS} @item @code{android.permission.ACCESS_NETWORK_STATE} @item -@code{android.permission.INTERNET} +@code{android.permission.ACCESS_NOTIFICATION_POLICY} @item -@code{android.permission.SET_WALLPAPER} +@code{android.permission.ACCESS_WIFI_STATE} @item -@code{android.permission.NFC} +@code{android.permission.AUTHENTICATE_ACCOUNTS} @item -@code{android.permission.TRANSMIT_IR} +@code{android.permission.BLUETOOTH} @item -@code{android.permission.WAKE_LOCK} +@code{android.permission.BLUETOOTH_ADMIN} +@item +@code{android.permission.BROADCAST_STICKY} +@item +@code{android.permission.CALL_COMPANION_APP} +@item +@code{android.permission.CHANGE_NETWORK_STATE} +@item +@code{android.permission.CHANGE_WIFI_MULTICAST_STATE} +@item +@code{android.permission.CHANGE_WIFI_STATE} +@item +@code{android.permission.CREDENTIAL_MANAGER_QUERY_CANDIDATE_CREDENTIALS} +@item +@code{android.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS} +@item +@code{android.permission.CREDENTIAL_MANAGER_SET_ORIGIN} +@item +@code{android.permission.DELIVER_COMPANION_MESSAGES} +@item +@code{android.permission.DETECT_SCREEN_CAPTURE} +@item +@code{android.permission.DISABLE_KEYGUARD} +@item +@code{android.permission.ENFORCE_UPDATE_OWNERSHIP} +@item +@code{android.permission.EXPAND_STATUS_BAR} +@item +@code{android.permission.FLASHLIGHT} @item @code{android.permission.FOREGROUND_SERVICE} @item +@code{android.permission.FOREGROUND_SERVICE_CAMERA} +@item +@code{android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE} +@item +@code{android.permission.FOREGROUND_SERVICE_DATA_SYNC} +@item +@code{android.permission.FOREGROUND_SERVICE_FILE_MANAGEMENT} +@item +@code{android.permission.FOREGROUND_SERVICE_HEALTH} +@item +@code{android.permission.FOREGROUND_SERVICE_LOCATION} +@item +@code{android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK} +@item +@code{android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION} +@item +@code{android.permission.FOREGROUND_SERVICE_MICROPHONE} +@item +@code{android.permission.FOREGROUND_SERVICE_PHONE_CALL} +@item +@code{android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING} +@item @code{android.permission.FOREGROUND_SERVICE_SPECIAL_USE} +@item +@code{android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED} +@item +@code{android.permission.GET_PACKAGE_SIZE} +@item +@code{android.permission.GET_TASKS} +@item +@code{android.permission.HIDE_OVERLAY_WINDOWS} +@item +@code{android.permission.HIGH_SAMPLING_RATE_SENSORS} +@item +@code{android.permission.INTERNET} +@item +@code{android.permission.KILL_BACKGROUND_PROCESSES} +@item +@code{android.permission.MANAGE_ACCOUNTS} +@item +@code{android.permission.MANAGE_OWN_CALLS} +@item +@code{android.permission.MODIFY_AUDIO_SETTINGS} +@item +@code{android.permission.NFC} +@item +@code{android.permission.NFC_PREFERRED_PAYMENT_INFO} +@item +@code{android.permission.NFC_TRANSACTION_EVENT} +@item +@code{android.permission.PERSISTENT_ACTIVITY} +@item +@code{android.permission.QUERY_ALL_PACKAGES} +@item +@code{android.permission.READ_BASIC_PHONE_STATE} +@item +@code{android.permission.READ_INSTALL_SESSIONS} +@item +@code{android.permission.READ_NEARBY_STREAMING_POLICY} +@item +@code{android.permission.READ_PROFILE} +@item +@code{android.permission.READ_SOCIAL_STREAM} +@item +@code{android.permission.READ_SYNC_SETTINGS} +@item +@code{android.permission.READ_SYNC_STATS} +@item +@code{android.permission.READ_USER_DICTIONARY} +@item +@code{android.permission.RECEIVE_BOOT_COMPLETED} +@item +@code{android.permission.REORDER_TASKS} +@item +@code{android.permission.REQUEST_COMPANION_PROFILE_GLASSES} +@item +@code{android.permission.REQUEST_COMPANION_PROFILE_WATCH} +@item +@code{android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND} +@item +@code{android.permission.REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND} +@item +@code{android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND} +@item +@code{android.permission.REQUEST_DELETE_PACKAGES} +@item +@code{android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS} +@item +@code{android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE} +@item +@code{android.permission.REQUEST_PASSWORD_COMPLEXITY} +@item +@code{android.permission.RESTART_PACKAGES} +@item +@code{android.permission.RUN_USER_INITIATED_JOBS} +@item +@code{android.permission.SET_WALLPAPER} +@item +@code{android.permission.SET_WALLPAPER_HINTS} +@item +@code{android.permission.SUBSCRIBED_FEEDS_READ} +@item +@code{android.permission.SUBSCRIBED_FEEDS_WRITE} +@item +@code{android.permission.TRANSMIT_IR} +@item +@code{android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION} +@item +@code{android.permission.USE_BIOMETRIC} +@item +@code{android.permission.USE_CREDENTIALS} +@item +@code{android.permission.USE_EXACT_ALARM} +@item +@code{android.permission.USE_FINGERPRINT} +@item +@code{android.permission.USE_FULL_SCREEN_INTENT} +@item +@code{android.permission.VIBRATE} +@item +@code{android.permission.WAKE_LOCK} +@item +@code{android.permission.WRITE_PROFILE} +@item +@code{android.permission.WRITE_SMS} +@item +@code{android.permission.WRITE_SOCIAL_STREAM} +@item +@code{android.permission.WRITE_SYNC_SETTINGS} +@item +@code{android.permission.WRITE_USER_DICTIONARY} @end itemize -Other permissions must be granted by the user through the system -settings application. Consult the manufacturer of your device for -more details, as how to do this varies by device. +Other permissions must be granted by the user from the system settings +application. Consult the manufacturer of your device for more details, +as how to do this varies by device. @item On Android 5.1 and earlier, Emacs automatically receives the following @@ -508,59 +675,139 @@ permissions it has requested upon being installed: @itemize @minus @item -@code{android.permission.READ_CONTACTS} -@item -@code{android.permission.WRITE_CONTACTS} -@item -@code{android.permission.VIBRATE} -@item @code{android.permission.ACCESS_COARSE_LOCATION} @item -@code{android.permission.ACCESS_NETWORK_STATE} +@code{android.permission.ACCESS_FINE_LOCATION} @item -@code{android.permission.INTERNET} +@code{android.permission.BODY_SENSORS} @item -@code{android.permission.SET_WALLPAPER} -@item -@code{android.permission.READ_CALENDAR} -@item -@code{android.permission.WRITE_CALENDAR} -@item -@code{android.permission.READ_EXTERNAL_STORAGE} -@item -@code{android.permission.WRITE_EXTERNAL_STORAGE} -@item -@code{android.permission.SEND_SMS} -@item -@code{android.permission.RECEIVE_SMS} -@item -@code{android.permission.RECEIVE_MMS} -@item -@code{android.permission.WRITE_SMS} -@item -@code{android.permission.READ_SMS} -@item -@code{android.permission.NFC} -@item -@code{android.permission.TRANSMIT_IR} -@item -@code{android.permission.READ_PHONE_STATE} -@item -@code{android.permission.WAKE_LOCK} -@item -@code{android.permission.FOREGROUND_SEVICE} -@item -@code{android.permission.REQUEST_INSTALL_PACKAGES} -@item -@code{android.permission.REQUEST_DELETE_PACKAGES} -@item -@code{android.permission.SYSTEM_ALERT_WINDOW} -@item -@code{android.permission.RECORD_AUDIO} +@code{android.permission.CALL_PHONE} @item @code{android.permission.CAMERA} @item +@code{android.permission.CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD} +@item +@code{android.permission.GET_ACCOUNTS} +@item @code{android.permission.POST_NOTIFICATIONS} +@item +@code{android.permission.PROCESS_OUTGOING_CALLS} +@item +@code{android.permission.READ_CALENDAR} +@item +@code{android.permission.READ_CALL_LOG} +@item +@code{android.permission.READ_CELL_BROADCASTS} +@item +@code{android.permission.READ_CONTACTS} +@item +@code{android.permission.READ_EXTERNAL_STORAGE} +@item +@code{android.permission.READ_PHONE_NUMBERS} +@item +@code{android.permission.READ_PHONE_STATE} +@item +@code{android.permission.READ_SMS} +@item +@code{android.permission.RECEIVE_MMS} +@item +@code{android.permission.RECEIVE_SMS} +@item +@code{android.permission.RECEIVE_WAP_PUSH} +@item +@code{android.permission.RECORD_AUDIO} +@item +@code{android.permission.REQUEST_INSTALL_PACKAGES} +@item +@code{android.permission.SEND_SMS} +@item +@code{android.permission.SMS_FINANCIAL_TRANSACTIONS} +@item +@code{android.permission.SYSTEM_ALERT_WINDOW} +@item +@code{android.permission.WRITE_CALENDAR} +@item +@code{android.permission.WRITE_CALL_LOG} +@item +@code{android.permission.WRITE_CONTACTS} +@item +@code{android.permission.WRITE_EXTERNAL_STORAGE} +@item +@code{android.permission.WRITE_SETTINGS} +@item +@code{android.permission.ACCESS_LOCATION_EXTRA_COMMANDS} +@item +@code{android.permission.ACCESS_NETWORK_STATE} +@item +@code{android.permission.ACCESS_WIFI_STATE} +@item +@code{android.permission.BLUETOOTH} +@item +@code{android.permission.BLUETOOTH_ADMIN} +@item +@code{android.permission.BROADCAST_STICKY} +@item +@code{android.permission.CHANGE_NETWORK_STATE} +@item +@code{android.permission.CHANGE_WIFI_MULTICAST_STATE} +@item +@code{android.permission.CHANGE_WIFI_STATE} +@item +@code{android.permission.DISABLE_KEYGUARD} +@item +@code{android.permission.EXPAND_STATUS_BAR} +@item +@code{android.permission.FLASHLIGHT} +@item +@code{android.permission.GET_PACKAGE_SIZE} +@item +@code{android.permission.GET_TASKS} +@item +@code{android.permission.INTERNET} +@item +@code{android.permission.KILL_BACKGROUND_PROCESSES} +@item +@code{android.permission.MODIFY_AUDIO_SETTINGS} +@item +@code{android.permission.NFC} +@item +@code{android.permission.PERSISTENT_ACTIVITY} +@item +@code{android.permission.QUERY_ALL_PACKAGES} +@item +@code{android.permission.READ_BASIC_PHONE_STATE} +@item +@code{android.permission.READ_SYNC_SETTINGS} +@item +@code{android.permission.READ_SYNC_STATS} +@item +@code{android.permission.READ_USER_DICTIONARY} +@item +@code{android.permission.RECEIVE_BOOT_COMPLETED} +@item +@code{android.permission.REORDER_TASKS} +@item +@code{android.permission.REQUEST_DELETE_PACKAGES} +@item +@code{android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS} +@item +@code{android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE} +@item +@code{android.permission.RESTART_PACKAGES} +@item +@code{android.permission.SET_WALLPAPER} +@item +@code{android.permission.SET_WALLPAPER_HINTS} +@item +@code{android.permission.TRANSMIT_IR} +@item +@code{android.permission.VIBRATE} +@item +@code{android.permission.WAKE_LOCK} +@item +@code{android.permission.WRITE_SYNC_SETTINGS} +@item +@code{android.permission.WRITE_USER_DICTIONARY} @end itemize While most of these permissions are left unused by Emacs itself, they diff --git a/java/AndroidManifest.xml.in b/java/AndroidManifest.xml.in index b18446bece0..27af9c912fe 100644 --- a/java/AndroidManifest.xml.in +++ b/java/AndroidManifest.xml.in @@ -64,6 +64,132 @@ along with GNU Emacs. If not, see . --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9830421e964cfb39077b69efd38d122e3bacf5d4 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 7 Mar 2024 16:56:42 -0500 Subject: [PATCH 425/446] comp-cstr.el: Fix a minor error and prepare for upcoming changes * lisp/emacs-lisp/comp-cstr.el (comp--cl-class-hierarchy): Add `atom` and `t` only to those types whose "allparents" is clearly not complete. (comp--compute--pred-type-h): Store the cstr rather than the type in the hash-table, as expected by `comp--pred-to-cstr`. --- lisp/emacs-lisp/comp-cstr.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 55d92841cd5..1c6acaa6385 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -89,12 +89,15 @@ Integer values are handled in the `range' slot.") (defun comp--cl-class-hierarchy (x) "Given a class name `x' return its hierarchy." - `(,@(cl--class-allparents (cl--struct-get-class x)) - ;; FIXME: AFAICT, `comp--all-classes' will also find those struct types - ;; which use :type and can thus be either `vector' or `cons' (the latter - ;; isn't `atom'). - atom - t)) + (let ((parents (cl--class-allparents (cl--struct-get-class x)))) + (if (memq t parents) + parents + `(,@parents + ;; FIXME: AFAICT, `comp--all-classes' will also find those struct types + ;; which use :type and can thus be either `vector' or `cons' (the latter + ;; isn't `atom'). + atom + t)))) (defun comp--all-classes () "Return all non built-in type names currently defined." @@ -114,7 +117,7 @@ Integer values are handled in the `range' slot.") for class-name in (comp--all-classes) for pred = (get class-name 'cl-deftype-satisfies) when pred - do (puthash pred class-name h) + do (puthash pred (comp--type-to-cstr class-name) h) finally return h)) (cl-defstruct comp-cstr-ctxt From 4fdcbd09af29e72456c9ca4cfbc9f6e97a88f8b8 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 6 Mar 2024 16:32:35 -0500 Subject: [PATCH 426/446] cl-preloaded.el (built-in-class): New type Add classes describing the built-in types. * lisp/emacs-lisp/cl-preloaded.el (built-in-class): New type. (cl--define-built-in-type): New aux macro. (all built-in types): "Define" them with it. (cl--builtin-type-p): New aux function. (cl--struct-name-p): Use it. (cl--direct-supertypes-of-type, cl--typeof-types, cl--all-builtin-types): Move the definitions to after the built-in classes are defined, and rewrite to make use of those classes. * lisp/emacs-lisp/cl-extra.el (cl-describe-type): Accept two (unused) optional args, for use with `describe-symbol-backends`. (describe-symbol-backends): Simplify accordingly and add ourselves at the end. (cl--class-children): New function. (cl--describe-class): Use it. Also don't show a silly empty list of slots for the built-in types. --- etc/NEWS | 5 + lisp/emacs-lisp/cl-extra.el | 56 +++++--- lisp/emacs-lisp/cl-preloaded.el | 241 +++++++++++++++++++++----------- 3 files changed, 200 insertions(+), 102 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 3a57084688d..2aa669be344 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1612,6 +1612,11 @@ values. * Lisp Changes in Emacs 30.1 +** Built-in types have now corresponding classes. +At the Lisp level, this means that things like (cl-find-class 'integer) +will now return a class object, and at the UI level it means that +things like 'C-h o integer RET' will show some information about that type. + ** New var 'major-mode-remap-defaults' and function 'major-mode-remap'. The first is like Emacs-29's 'major-mode-remap-alist' but to be set by packages (instead of users). The second looks up those two variables. diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el index 9281cd9821e..c8eaca9a77c 100644 --- a/lisp/emacs-lisp/cl-extra.el +++ b/lisp/emacs-lisp/cl-extra.el @@ -714,7 +714,9 @@ PROPLIST is a list of the sort returned by `symbol-plist'. ;; FIXME: We could go crazy and add another entry so describe-symbol can be ;; used with the slot names of CL structs (and/or EIEIO objects). (add-to-list 'describe-symbol-backends - `(nil ,#'cl-find-class ,(lambda (s _b _f) (cl-describe-type s)))) + `(nil ,#'cl-find-class ,#'cl-describe-type) + ;; Document the `cons` function before the `cons` type. + t) (defconst cl--typedef-regexp (concat "(" (regexp-opt '("defclass" "defstruct" "cl-defstruct" @@ -744,7 +746,7 @@ Call `cl--find-class' to get TYPE's propname `cl--class'" (cl--find-class type)) ;;;###autoload -(defun cl-describe-type (type) +(defun cl-describe-type (type &optional _buf _frame) "Display the documentation for type TYPE (a symbol)." (interactive (let ((str (completing-read "Describe type: " obarray #'cl-find-class t))) @@ -766,6 +768,15 @@ Call `cl--find-class' to get TYPE's propname `cl--class'" ;; Return the text we displayed. (buffer-string))))) +(defun cl--class-children (class) + (let ((children '())) + (mapatoms + (lambda (sym) + (let ((sym-class (cl--find-class sym))) + (and sym-class (memq class (cl--class-parents sym-class)) + (push sym children))))) + children)) + (defun cl--describe-class (type &optional class) (unless class (setq class (cl--find-class type))) (let ((location (find-lisp-object-file-name type 'define-type)) @@ -796,10 +807,8 @@ Call `cl--find-class' to get TYPE's propname `cl--class'" (insert (substitute-command-keys (if pl "', " "'")))) (insert ".\n"))) - ;; Children, if available. ”For EIEIO! - (let ((ch (condition-case nil - (cl-struct-slot-value metatype 'children class) - (cl-struct-unknown-slot nil))) + ;; Children. + (let ((ch (cl--class-children class)) cur) (when ch (insert " Children ") @@ -903,22 +912,25 @@ Outputs to the current buffer." (cslots (condition-case nil (cl-struct-slot-value metatype 'class-slots class) (cl-struct-unknown-slot nil)))) - (insert (propertize "Instance Allocated Slots:\n\n" - 'face 'bold)) - (let* ((has-doc nil) - (slots-strings - (mapcar - (lambda (slot) - (list (cl-prin1-to-string (cl--slot-descriptor-name slot)) - (cl-prin1-to-string (cl--slot-descriptor-type slot)) - (cl-prin1-to-string (cl--slot-descriptor-initform slot)) - (let ((doc (alist-get :documentation - (cl--slot-descriptor-props slot)))) - (if (not doc) "" - (setq has-doc t) - (substitute-command-keys doc))))) - slots))) - (cl--print-table `("Name" "Type" "Default") slots-strings has-doc)) + (if (and (null slots) (eq metatype 'built-in-class)) + (insert "This is a built-in type.\n") + + (insert (propertize "Instance Allocated Slots:\n\n" + 'face 'bold)) + (let* ((has-doc nil) + (slots-strings + (mapcar + (lambda (slot) + (list (cl-prin1-to-string (cl--slot-descriptor-name slot)) + (cl-prin1-to-string (cl--slot-descriptor-type slot)) + (cl-prin1-to-string (cl--slot-descriptor-initform slot)) + (let ((doc (alist-get :documentation + (cl--slot-descriptor-props slot)))) + (if (not doc) "" + (setq has-doc t) + (substitute-command-keys doc))))) + slots))) + (cl--print-table `("Name" "Type" "Default") slots-strings has-doc))) (insert "\n") (when (> (length cslots) 0) (insert (propertize "\nClass Allocated Slots:\n\n" 'face 'bold)) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index ea08d35ecec..882b4b5939b 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -50,90 +50,16 @@ (apply #'error string (append sargs args)) (signal 'cl-assertion-failed `(,form ,@sargs))))) -(defconst cl--direct-supertypes-of-type - ;; Please run `sycdoc-update-type-hierarchy' in - ;; `admin/syncdoc-type-hierarchy.el' each time this is modified to - ;; reflect the change in the documentation. - (let ((table (make-hash-table :test #'eq))) - ;; FIXME: Our type DAG has various quirks: - ;; - `subr' says it's a `compiled-function' but that's not true - ;; for those subrs that are special forms! - ;; - Some `keyword's are also `symbol-with-pos' but that's not reflected - ;; in the DAG. - ;; - An OClosure can be an interpreted function or a `byte-code-function', - ;; so the DAG of OClosure types is "orthogonal" to the distinction - ;; between interpreted and compiled functions. - (dolist (x '((sequence t) - (atom t) - (list sequence) - (array sequence atom) - (float number) - (integer number integer-or-marker) - (marker integer-or-marker) - (integer-or-marker number-or-marker) - (number number-or-marker) - (bignum integer) - (fixnum integer) - (keyword symbol) - (boolean symbol) - (symbol-with-pos symbol) - (vector array) - (bool-vector array) - (char-table array) - (string array) - ;; FIXME: This results in `atom' coming before `list' :-( - (null boolean list) - (cons list) - (function atom) - (byte-code-function compiled-function) - (subr compiled-function) - (module-function function) - (compiled-function function) - (subr-native-elisp subr) - (subr-primitive subr))) - (puthash (car x) (cdr x) table)) - ;; And here's the flat part of the hierarchy. - (dolist (atom '( tree-sitter-compiled-query tree-sitter-node - tree-sitter-parser user-ptr - font-object font-entity font-spec - condvar mutex thread terminal hash-table frame - ;; function ;; FIXME: can be a list as well. - buffer window process window-configuration - overlay number-or-marker - symbol obarray native-comp-unit)) - (cl-assert (null (gethash atom table))) - (puthash atom '(atom) table)) - table) - "Hash table TYPE -> SUPERTYPES.") - -(defconst cl--typeof-types - (letrec ((alist nil) - (allparents - (lambda (type) - ;; FIXME: copy&pasted from `cl--class-allparents'. - (let ((parents (gethash type cl--direct-supertypes-of-type))) - (unless parents - (message "Warning: Type without parent: %S!" type)) - (cons type - (merge-ordered-lists - ;; FIXME: Can't remember why `t' is excluded. - (mapcar allparents (remq t parents)))))))) - (maphash (lambda (type _) - (push (funcall allparents type) alist)) - cl--direct-supertypes-of-type) - alist) - "Alist of supertypes. -Each element has the form (TYPE . SUPERTYPES) where TYPE is one of -the symbols returned by `type-of', and SUPERTYPES is the list of its -supertypes from the most specific to least specific.") - -(defconst cl--all-builtin-types - (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) +(defun cl--builtin-type-p (name) + (if (not (fboundp 'built-in-class-p)) ;; Early bootstrap + nil + (let ((class (and (symbolp name) (get name 'cl--class)))) + (and class (built-in-class-p class))))) (defun cl--struct-name-p (name) "Return t if NAME is a valid structure name for `cl-defstruct'." (and name (symbolp name) (not (keywordp name)) - (not (memq name cl--all-builtin-types)))) + (not (cl--builtin-type-p name)))) ;; When we load this (compiled) file during pre-loading, the cl--struct-class ;; code below will need to access the `cl-struct' info, since it's considered @@ -366,6 +292,161 @@ supertypes from the most specific to least specific.") (merge-ordered-lists (mapcar #'cl--class-allparents (cl--class-parents class))))) +(cl-defstruct (built-in-class + (:include cl--class) + (:constructor nil) + (:constructor built-in-class--make (name docstring parents)) + (:copier nil)) + ) + +(defmacro cl--define-built-in-type (name parents &optional docstring &rest _slots) + ;; `slots' is currently unused, but we could make it take + ;; a list of "slot like properties" together with the corresponding + ;; accessor, and then we could maybe even make `slot-value' work + ;; on some built-in types :-) + (declare (indent 2) (doc-string 3)) + (unless (listp parents) (setq parents (list parents))) + (unless (or parents (eq name t)) + (error "Missing parents for %S: %S" name parents)) + `(progn + (put ',name 'cl--class + (built-in-class--make ',name ,docstring + (mapcar (lambda (type) + (let ((class (get type 'cl--class))) + (unless class + (error "Unknown type: %S" type)) + class)) + ',parents))))) + +;; FIXME: Our type DAG has various quirks: +;; - `subr' says it's a `compiled-function' but that's not true +;; for those subrs that are special forms! +;; - Some `keyword's are also `symbol-with-pos' but that's not reflected +;; in the DAG. +;; - An OClosure can be an interpreted function or a `byte-code-function', +;; so the DAG of OClosure types is "orthogonal" to the distinction +;; between interpreted and compiled functions. + +(cl--define-built-in-type t nil "The type of everything.") +(cl--define-built-in-type atom t "The type of anything but cons cells.") + +(cl--define-built-in-type tree-sitter-compiled-query atom) +(cl--define-built-in-type tree-sitter-node atom) +(cl--define-built-in-type tree-sitter-parser atom) +(cl--define-built-in-type user-ptr atom) +(cl--define-built-in-type font-object atom) +(cl--define-built-in-type font-entity atom) +(cl--define-built-in-type font-spec atom) +(cl--define-built-in-type condvar atom) +(cl--define-built-in-type mutex atom) +(cl--define-built-in-type thread atom) +(cl--define-built-in-type terminal atom) +(cl--define-built-in-type hash-table atom) +(cl--define-built-in-type frame atom) +(cl--define-built-in-type buffer atom) +(cl--define-built-in-type window atom) +(cl--define-built-in-type process atom) +(cl--define-built-in-type window-configuration atom) +(cl--define-built-in-type overlay atom) +(cl--define-built-in-type number-or-marker atom + "Abstract super type of both `number's and `marker's.") +(cl--define-built-in-type symbol atom + "Type of symbols." + ;; Example of slots we could document. It would be desirable to + ;; have some way to extract this from the C code, or somehow keep it + ;; in sync (probably not for `cons' and `symbol' but for things like + ;; `font-entity'). + (name symbol-name) + (value symbol-value) + (function symbol-function) + (plist symbol-plist)) + +(cl--define-built-in-type obarray atom) +(cl--define-built-in-type native-comp-unit atom) + +(cl--define-built-in-type sequence t "Abstract super type of sequences.") +(cl--define-built-in-type list sequence) +(cl--define-built-in-type array (sequence atom) "Abstract super type of arrays.") +(cl--define-built-in-type number (number-or-marker) + "Abstract super type of numbers.") +(cl--define-built-in-type float (number)) +(cl--define-built-in-type integer-or-marker (number-or-marker) + "Abstract super type of both `integer's and `marker's.") +(cl--define-built-in-type integer (number integer-or-marker)) +(cl--define-built-in-type marker (integer-or-marker)) +(cl--define-built-in-type bignum (integer) + "Type of those integers too large to fit in a `fixnum'.") +(cl--define-built-in-type fixnum (integer) + (format "Type of small (fixed-size) integers. +The size depends on the Emacs version and compilation options. +For this build of Emacs it's %dbit." + (1+ (logb (1+ most-positive-fixnum))))) +(cl--define-built-in-type keyword (symbol) + "Type of those symbols whose first char is `:'.") +(cl--define-built-in-type boolean (symbol) + "Type of the canonical boolean values, i.e. either nil or t.") +(cl--define-built-in-type symbol-with-pos (symbol) + "Type of symbols augmented with source-position information.") +(cl--define-built-in-type vector (array)) +(cl--define-built-in-type record (atom) + "Abstract type of objects with slots.") +(cl--define-built-in-type bool-vector (array) "Type of bitvectors.") +(cl--define-built-in-type char-table (array) + "Type of special arrays that are indexed by characters.") +(cl--define-built-in-type string (array)) +(cl--define-built-in-type null (boolean list) ;FIXME: `atom' comes before `list'? + "Type of the nil value.") +(cl--define-built-in-type cons (list) + "Type of cons cells." + ;; Example of slots we could document. + (car car) (cdr cdr)) +(cl--define-built-in-type function (atom) + "Abstract super type of function values.") +(cl--define-built-in-type compiled-function (function) + "Abstract type of functions that have been compiled.") +(cl--define-built-in-type byte-code-function (compiled-function) + "Type of functions that have been byte-compiled.") +(cl--define-built-in-type subr (compiled-function) + "Abstract type of functions compiled to machine code.") +(cl--define-built-in-type module-function (function) + "Type of functions provided via the module API.") +(cl--define-built-in-type interpreted-function (function) + "Type of functions that have not been compiled.") +(cl--define-built-in-type subr-native-elisp (subr) + "Type of function that have been compiled by the native compiler.") +(cl--define-built-in-type subr-primitive (subr) + "Type of functions hand written in C.") + +(defconst cl--direct-supertypes-of-type + ;; Please run `sycdoc-update-type-hierarchy' in + ;; `admin/syncdoc-type-hierarchy.el' each time this is modified to + ;; reflect the change in the documentation. + (let ((table (make-hash-table :test #'eq))) + (mapatoms + (lambda (type) + (let ((class (get type 'cl--class))) + (when (built-in-class-p class) + (puthash type (mapcar #'cl--class-name (cl--class-parents class)) + table))))) + table) + "Hash table TYPE -> SUPERTYPES.") + +(defconst cl--typeof-types + (letrec ((alist nil)) + (maphash (lambda (type _) + (let ((class (get type 'cl--class))) + ;; FIXME: Can't remember why `t' is excluded. + (push (remq t (cl--class-allparents class)) alist))) + cl--direct-supertypes-of-type) + alist) + "Alist of supertypes. +Each element has the form (TYPE . SUPERTYPES) where TYPE is one of +the symbols returned by `type-of', and SUPERTYPES is the list of its +supertypes from the most specific to least specific.") + +(defconst cl--all-builtin-types + (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) + (eval-and-compile (cl-assert (null (cl--class-parents (cl--find-class 'cl-structure-object))))) From 76e9c761a45e0157a8ca43eaaf928385d8e0c228 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 7 Mar 2024 15:26:12 -0500 Subject: [PATCH 427/446] * lisp/emacs-lisp/oclosure.el (oclosure): Make it a subtype of `function` --- lisp/emacs-lisp/oclosure.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/oclosure.el b/lisp/emacs-lisp/oclosure.el index 26cd8594dfc..977d5735171 100644 --- a/lisp/emacs-lisp/oclosure.el +++ b/lisp/emacs-lisp/oclosure.el @@ -139,12 +139,15 @@ (:include cl--class) (:copier nil)) "Metaclass for OClosure classes." + ;; The `allparents' slot is used for the predicate that checks if a given + ;; object is an OClosure of a particular type. (allparents nil :read-only t :type (list-of symbol))) (setf (cl--find-class 'oclosure) (oclosure--class-make 'oclosure - "The root parent of all OClosure classes" - nil nil '(oclosure))) + "The root parent of all OClosure types" + nil (list (cl--find-class 'function)) + '(oclosure))) (defun oclosure--p (oclosure) (not (not (oclosure-type oclosure)))) From 7c127fc965fbe781141a6bccbe0b620dc7862b1d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 7 Mar 2024 16:58:15 -0500 Subject: [PATCH 428/446] Make "parentless" structs inherit from their builtin type * lisp/emacs-lisp/cl-preloaded.el (cl--struct-register-child): Register child only in struct parents. (cl-struct-define): Put the "type" as parent of parentless :type structs. Copy slots only from struct parent classes. (cl-structure-object): Set (manually) its parent to `record` and remove assertion that it has no parents. --- lisp/emacs-lisp/cl-preloaded.el | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 882b4b5939b..1b330e7f761 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -112,7 +112,7 @@ (defun cl--struct-register-child (parent tag) ;; Can't use (cl-typep parent 'cl-structure-class) at this stage ;; because `cl-structure-class' is defined later. - (while (recordp parent) + (while (cl--struct-class-p parent) (add-to-list (cl--struct-class-children-sym parent) tag) ;; Only register ourselves as a child of the leftmost parent since structs ;; can only have one parent. @@ -127,9 +127,14 @@ (with-suppressed-warnings ((obsolete cl-old-struct-compat-mode)) (message "cl-old-struct-compat-mode is obsolete!") (cl-old-struct-compat-mode 1))) - (if (eq type 'record) - ;; Defstruct using record objects. - (setq type nil)) + (when (eq type 'record) + ;; Defstruct using record objects. + (setq type nil) + ;; `cl-structure-class' and `cl-structure-object' are allowed to be + ;; defined without specifying the parent, because their parent + ;; doesn't exist yet when they're defined. + (cl-assert (or parent (memq name '(cl-structure-class + cl-structure-object))))) (cl-assert (or type (not named))) (if (boundp children-sym) (add-to-list children-sym tag) @@ -137,7 +142,9 @@ (and (null type) (eq (caar slots) 'cl-tag-slot) ;; Hide the tag slot from "standard" (i.e. non-`type'd) structs. (setq slots (cdr slots))) - (let* ((parent-class (when parent (cl--struct-get-class parent))) + (let* ((parent-class (if parent (cl--struct-get-class parent) + (cl--find-class (if (eq type 'list) 'cons + (or type 'record))))) (n (length slots)) (index-table (make-hash-table :test 'eq :size n)) (vslots (let ((v (make-vector n nil)) @@ -160,7 +167,9 @@ name docstring (unless (symbolp parent-class) (list parent-class)) type named vslots index-table children-sym tag print))) - (unless (symbolp parent-class) + (cl-assert (or (not (symbolp parent-class)) + (memq name '(cl-structure-class cl-structure-object)))) + (when (cl--struct-class-p parent-class) (let ((pslots (cl--struct-class-slots parent-class))) (or (>= n (length pslots)) (let ((ok t)) @@ -417,6 +426,13 @@ For this build of Emacs it's %dbit." (cl--define-built-in-type subr-primitive (subr) "Type of functions hand written in C.") +(unless (cl--class-parents (cl--find-class 'cl-structure-object)) + ;; When `cl-structure-object' is created, built-in classes didn't exist + ;; yet, so we couldn't put `record' as the parent. + ;; Fix it now to close the recursion. + (setf (cl--class-parents (cl--find-class 'cl-structure-object)) + (list (cl--find-class 'record)))) + (defconst cl--direct-supertypes-of-type ;; Please run `sycdoc-update-type-hierarchy' in ;; `admin/syncdoc-type-hierarchy.el' each time this is modified to @@ -447,9 +463,6 @@ supertypes from the most specific to least specific.") (defconst cl--all-builtin-types (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) -(eval-and-compile - (cl-assert (null (cl--class-parents (cl--find-class 'cl-structure-object))))) - ;; Make sure functions defined with cl-defsubst can be inlined even in ;; packages which do not require CL. We don't put an autoload cookie ;; directly on that function, since those cookies only go to cl-loaddefs. From 945af4d9d11192d262f4fabbc66ee83f5beefc86 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 7 Mar 2024 17:45:41 -0500 Subject: [PATCH 429/446] eieio-core.el: Always put a parent in the parents of a class * lisp/emacs-lisp/eieio-core.el (eieio-defclass-internal): Always put a parent in the `parents` slot of the class. * lisp/emacs-lisp/eieio.el (eieio-class-parents): Remove the `eieio-default-superclass` if it's the only parent. (child-of-class-p): Handle all classes in the parents. (eieio-default-superclass): Adjust docstring. --- lisp/emacs-lisp/eieio-core.el | 31 +++++++++++-------------------- lisp/emacs-lisp/eieio.el | 12 ++++++++---- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 9c526f67204..9945e19c65c 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -293,8 +293,7 @@ See `defclass' for more information." ;; reloading the file that does the `defclass', we don't ;; want to create a new class object. (eieio--class-make cname))) - (groups nil) ;; list of groups id'd from slots - (clearparent nil)) + (groups nil)) ;; list of groups id'd from slots ;; If this class already existed, and we are updating its structure, ;; make sure we keep the old child list. This can cause bugs, but @@ -317,6 +316,9 @@ See `defclass' for more information." (setf (eieio--class-children newc) children) (remhash cname eieio-defclass-autoload-map)))) + (unless (or superclasses (eq cname 'eieio-default-superclass)) + (setq superclasses '(eieio-default-superclass))) + (if superclasses (progn (dolist (p superclasses) @@ -336,16 +338,13 @@ See `defclass' for more information." (push c (eieio--class-parents newc)))))) ;; Reverse the list of our parents so that they are prioritized in ;; the same order as specified in the code. - (cl-callf nreverse (eieio--class-parents newc))) - ;; If there is nothing to loop over, then inherit from the - ;; default superclass. - (unless (eq cname 'eieio-default-superclass) - ;; adopt the default parent here, but clear it later... - (setq clearparent t) - ;; save new child in parent - (cl-pushnew cname (eieio--class-children eieio-default-superclass)) - ;; save parent in child - (setf (eieio--class-parents newc) (list eieio-default-superclass)))) + (cl-callf nreverse (eieio--class-parents newc)) + ;; Before adding new slots, let's add all the methods and classes + ;; in from the parent class. + (eieio-copy-parents-into-subclass newc)) + + (cl-assert (eq cname 'eieio-default-superclass)) + (setf (eieio--class-parents newc) (list (cl--find-class 'record)))) ;; turn this into a usable self-pointing symbol; FIXME: Why? (when eieio-backward-compatibility @@ -376,10 +375,6 @@ See `defclass' for more information." cname) "25.1"))) - ;; Before adding new slots, let's add all the methods and classes - ;; in from the parent class. - (eieio-copy-parents-into-subclass newc) - ;; Store the new class vector definition into the symbol. We need to ;; do this first so that we can call defmethod for the accessor. ;; The vector will be updated by the following while loop and will not @@ -512,10 +507,6 @@ See `defclass' for more information." ;; Set up the options we have collected. (setf (eieio--class-options newc) options) - ;; if this is a superclass, clear out parent (which was set to the - ;; default superclass eieio-default-superclass) - (if clearparent (setf (eieio--class-parents newc) nil)) - ;; Create the cached default object. (let ((cache (make-record newc (+ (length (eieio--class-slots newc)) diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el index fba69a36a97..74f5e21db7d 100644 --- a/lisp/emacs-lisp/eieio.el +++ b/lisp/emacs-lisp/eieio.el @@ -449,7 +449,12 @@ If EXTRA, include that in the string returned to represent the symbol." (defun eieio-class-parents (class) ;; FIXME: What does "(overload of variable)" mean here? "Return parent classes to CLASS. (overload of variable)." - (eieio--class-parents (eieio--full-class-object class))) + ;; (declare (obsolete cl--class-parents "30.1")) + (let ((parents (eieio--class-parents (eieio--full-class-object class)))) + (if (and (null (cdr parents)) + (eq (car parents) (cl--find-class 'eieio-default-superclass))) + nil + parents))) (define-obsolete-function-alias 'class-parents #'eieio-class-parents "24.4") @@ -497,7 +502,7 @@ If EXTRA, include that in the string returned to represent the symbol." (setq class (eieio--class-object class)) (cl-check-type class eieio--class) (while (and child (not (eq child class))) - (setq p (append p (eieio--class-parents child)) + (setq p (append p (cl--class-parents child)) child (pop p))) (if child t)))) @@ -680,8 +685,7 @@ If SLOT is unbound, do nothing." (defclass eieio-default-superclass nil nil "Default parent class for classes with no specified parent class. -Its slots are automatically adopted by classes with no specified parents. -This class is not stored in the `parent' slot of a class vector." +Its slots are automatically adopted by classes with no specified parents." :abstract t) (setq eieio-default-superclass (cl--find-class 'eieio-default-superclass)) From bd017175d4571e24ef1fdf84676136af1d36002d Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 01:48:59 -0500 Subject: [PATCH 430/446] Simplify type hierarchy operations Now that built-in types have classes that describe their relationships exactly like struct/eieio/oclosure classes, we can the code that navigates that DAG. * lisp/emacs-lisp/cl-generic.el (cl--generic-struct-tag): Move to `eieio-core.el`. (cl--generic-type-specializers): Rename from `cl--generic-struct-specializers`. Make it work for any class. (cl--generic-typeof-generalizer, cl--generic-oclosure-generalizer): Use it. (cl--generic-struct-generalizer): Delete generalizer. (cl-generic-generalizers :extra "cl-struct"): Delete method. (prefill 0 cl--generic-generalizer): Move to after the typeof. (cl-generic-generalizers :extra "typeof"): Rewrite to use classes rather than `cl--all-builtin-types`. (cl-generic--oclosure-specializers): Delete function. * lisp/emacs-lisp/cl-preloaded.el (cl--direct-supertypes-of-type) (cl--typeof-types, cl--all-builtin-types): Delete constants. * lisp/emacs-lisp/comp-cstr.el (comp--typeof-builtin-types): Delete constant. (comp--cl-class-hierarchy): Simplify. (comp--compute-typeof-types): Simplify now that `comp--cl-class-hierarchy` and `comp--all-classes` work for built-in types as well. (comp--direct-supertypes): Just use `cl--class-parents`. (comp-supertypes): Simplify since typeof-types should now be complete. * lisp/emacs-lisp/eieio-core.el (eieio-defclass-autoload): Use `superclasses` argument, so we can find parents before it's loaded. (eieio--class-precedence-c3, eieio--class-precedence-dfs): Don't add a `eieio-default-superclass` parent any more. (eieio--class/struct-parents): Delete function. (eieio--class-precedence-bfs): Use `eieio--class-parents` instead. Don't stop when reaching `eieio-default-superclass`. (cl--generic-struct-tag): Move from `cl-generic.el`. --- lisp/emacs-lisp/cl-generic.el | 67 ++++++++------------------------- lisp/emacs-lisp/cl-preloaded.el | 30 --------------- lisp/emacs-lisp/comp-cstr.el | 55 ++++----------------------- lisp/emacs-lisp/eieio-core.el | 51 ++++++++++++------------- 4 files changed, 49 insertions(+), 154 deletions(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index f439a97f88c..84eb800ec24 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1330,62 +1330,31 @@ These match if the argument is `eql' to VAL." (cl--generic-prefill-dispatchers (terminal-parameter nil 'xterm--set-selection) (eql nil)) -;;; Support for cl-defstructs specializers. +;;; Dispatch on "normal types". -(defun cl--generic-struct-tag (name &rest _) - ;; Use exactly the same code as for `typeof'. - `(if ,name (type-of ,name) 'null)) - -(defun cl--generic-struct-specializers (tag &rest _) +(defun cl--generic-type-specializers (tag &rest _) (and (symbolp tag) - (let ((class (get tag 'cl--class))) - (when (cl-typep class 'cl-structure-class) + (let ((class (cl--find-class tag))) + (when class (cl--class-allparents class))))) -(cl-generic-define-generalizer cl--generic-struct-generalizer - 50 #'cl--generic-struct-tag - #'cl--generic-struct-specializers) - -(cl-defmethod cl-generic-generalizers :extra "cl-struct" (type) - "Support for dispatch on types defined by `cl-defstruct'." - (or - (when (symbolp type) - ;; Use the "cl--struct-class*" (inlinable) functions/macros rather than - ;; the "cl-struct-*" variants which aren't inlined, so that dispatch can - ;; take place without requiring cl-lib. - (let ((class (cl--find-class type))) - (and (cl-typep class 'cl-structure-class) - (or (null (cl--struct-class-type class)) - (error "Can't dispatch on cl-struct %S: type is %S" - type (cl--struct-class-type class))) - (progn (cl-assert (null (cl--struct-class-named class))) t) - (list cl--generic-struct-generalizer)))) - (cl-call-next-method))) - -(cl--generic-prefill-dispatchers 0 cl--generic-generalizer) - -;;; Dispatch on "system types". - (cl-generic-define-generalizer cl--generic-typeof-generalizer ;; FIXME: We could also change `type-of' to return `null' for nil. 10 (lambda (name &rest _) `(if ,name (type-of ,name) 'null)) - (lambda (tag &rest _) - (and (symbolp tag) (assq tag cl--typeof-types)))) + #'cl--generic-type-specializers) (cl-defmethod cl-generic-generalizers :extra "typeof" (type) - "Support for dispatch on builtin types. -See the full list and their hierarchy in `cl--typeof-types'." + "Support for dispatch on types. +This currently works for built-in types and types built on top of records." ;; FIXME: Add support for other types accepted by `cl-typep' such ;; as `character', `face', `function', ... (or - (and (memq type cl--all-builtin-types) - (progn - ;; FIXME: While this wrinkle in the semantics can be occasionally - ;; problematic, this warning is more often annoying than helpful. - ;;(if (memq type '(vector array sequence)) - ;; (message "`%S' also matches CL structs and EIEIO classes" - ;; type)) - (list cl--generic-typeof-generalizer))) + (and (symbolp type) + (not (eq type t)) ;; Handled by the `t-generalizer'. + (let ((class (cl--find-class type))) + (memq (type-of class) + '(built-in-class cl-structure-class eieio--class))) + (list cl--generic-typeof-generalizer)) (cl-call-next-method))) (cl--generic-prefill-dispatchers 0 integer) @@ -1393,6 +1362,8 @@ See the full list and their hierarchy in `cl--typeof-types'." (cl--generic-prefill-dispatchers 0 cl--generic-generalizer integer) (cl--generic-prefill-dispatchers 0 (eql 'x) integer) +(cl--generic-prefill-dispatchers 0 cl--generic-generalizer) + ;;; Dispatch on major mode. ;; Two parts: @@ -1430,19 +1401,13 @@ Used internally for the (major-mode MODE) context specializers." (defun cl--generic-oclosure-tag (name &rest _) `(oclosure-type ,name)) -(defun cl-generic--oclosure-specializers (tag &rest _) - (and (symbolp tag) - (let ((class (cl--find-class tag))) - (when (cl-typep class 'oclosure--class) - (oclosure--class-allparents class))))) - (cl-generic-define-generalizer cl--generic-oclosure-generalizer ;; Give slightly higher priority than the struct specializer, so that ;; for a generic function with methods dispatching structs and on OClosures, ;; we first try `oclosure-type' before `type-of' since `type-of' will return ;; non-nil for an OClosure as well. 51 #'cl--generic-oclosure-tag - #'cl-generic--oclosure-specializers) + #'cl--generic-type-specializers) (cl-defmethod cl-generic-generalizers :extra "oclosure-struct" (type) "Support for dispatch on types defined by `oclosure-define'." diff --git a/lisp/emacs-lisp/cl-preloaded.el b/lisp/emacs-lisp/cl-preloaded.el index 1b330e7f761..5743684fa89 100644 --- a/lisp/emacs-lisp/cl-preloaded.el +++ b/lisp/emacs-lisp/cl-preloaded.el @@ -433,36 +433,6 @@ For this build of Emacs it's %dbit." (setf (cl--class-parents (cl--find-class 'cl-structure-object)) (list (cl--find-class 'record)))) -(defconst cl--direct-supertypes-of-type - ;; Please run `sycdoc-update-type-hierarchy' in - ;; `admin/syncdoc-type-hierarchy.el' each time this is modified to - ;; reflect the change in the documentation. - (let ((table (make-hash-table :test #'eq))) - (mapatoms - (lambda (type) - (let ((class (get type 'cl--class))) - (when (built-in-class-p class) - (puthash type (mapcar #'cl--class-name (cl--class-parents class)) - table))))) - table) - "Hash table TYPE -> SUPERTYPES.") - -(defconst cl--typeof-types - (letrec ((alist nil)) - (maphash (lambda (type _) - (let ((class (get type 'cl--class))) - ;; FIXME: Can't remember why `t' is excluded. - (push (remq t (cl--class-allparents class)) alist))) - cl--direct-supertypes-of-type) - alist) - "Alist of supertypes. -Each element has the form (TYPE . SUPERTYPES) where TYPE is one of -the symbols returned by `type-of', and SUPERTYPES is the list of its -supertypes from the most specific to least specific.") - -(defconst cl--all-builtin-types - (delete-dups (copy-sequence (apply #'append cl--typeof-types)))) - ;; Make sure functions defined with cl-defsubst can be inlined even in ;; packages which do not require CL. We don't put an autoload cookie ;; directly on that function, since those cookies only go to cl-loaddefs. diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 1c6acaa6385..5922a8caf12 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -38,12 +38,6 @@ (require 'cl-lib) (require 'cl-extra) ;HACK: For `cl-find-class' when `cl-loaddefs' is missing. -(defconst comp--typeof-builtin-types (mapcar (lambda (x) - (append x '(t))) - cl--typeof-types) - ;; TODO can we just add t in `cl--typeof-types'? - "Like `cl--typeof-types' but with t as common supertype.") - (cl-defstruct (comp-cstr (:constructor comp--type-to-cstr (type &aux (null (eq type 'null)) @@ -89,15 +83,7 @@ Integer values are handled in the `range' slot.") (defun comp--cl-class-hierarchy (x) "Given a class name `x' return its hierarchy." - (let ((parents (cl--class-allparents (cl--struct-get-class x)))) - (if (memq t parents) - parents - `(,@parents - ;; FIXME: AFAICT, `comp--all-classes' will also find those struct types - ;; which use :type and can thus be either `vector' or `cons' (the latter - ;; isn't `atom'). - atom - t)))) + (cl--class-allparents (cl--find-class x))) (defun comp--all-classes () "Return all non built-in type names currently defined." @@ -109,8 +95,7 @@ Integer values are handled in the `range' slot.") res)) (defun comp--compute-typeof-types () - (append comp--typeof-builtin-types - (mapcar #'comp--cl-class-hierarchy (comp--all-classes)))) + (mapcar #'comp--cl-class-hierarchy (comp--all-classes))) (defun comp--compute--pred-type-h () (cl-loop with h = (make-hash-table :test #'eq) @@ -275,19 +260,10 @@ Return them as multiple value." (symbol-name y))) (defun comp--direct-supertypes (type) - (or - (gethash type cl--direct-supertypes-of-type) - (let ((supers (comp-supertypes type))) - (cl-assert (eq type (car supers))) - (cl-loop - with notdirect = nil - with direct = nil - for parent in (cdr supers) - unless (memq parent notdirect) - do (progn - (push parent direct) - (setq notdirect (append notdirect (comp-supertypes parent)))) - finally return direct)))) + (when (symbolp type) ;; FIXME: Can this test ever fail? + (let* ((class (cl--find-class type)) + (parents (if class (cl--class-parents class)))) + (mapcar #'cl--class-name parents)))) (defsubst comp-subtype-p (type1 type2) "Return t if TYPE1 is a subtype of TYPE2 or nil otherwise." @@ -359,23 +335,8 @@ Return them as multiple value." (defun comp-supertypes (type) "Return the ordered list of supertypes of TYPE." - ;; FIXME: We should probably keep the results in - ;; `comp-cstr-ctxt-typeof-types' (or maybe even precompute them - ;; and maybe turn `comp-cstr-ctxt-typeof-types' into a hash-table). - ;; Or maybe we shouldn't keep structs and defclasses in it, - ;; and just use `cl--class-allparents' when needed (and refuse to - ;; compute their direct subtypes since we can't know them). - (cl-loop - named loop - with above - for lane in (comp-cstr-ctxt-typeof-types comp-ctxt) - do (let ((x (memq type lane))) - (cond - ((null x) nil) - ((eq x lane) (cl-return-from loop x)) ;A base type: easy case. - (t (setq above - (if above (comp--intersection x above) x))))) - finally return above)) + (or (assq type (comp-cstr-ctxt-typeof-types comp-ctxt)) + (error "Type %S missing from typeof-types!" type))) (defun comp-union-typesets (&rest typesets) "Union types present into TYPESETS." diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 9945e19c65c..5418f53be35 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -191,7 +191,7 @@ Abstract classes cannot be instantiated." ;; We autoload this because it's used in `make-autoload'. ;;;###autoload -(defun eieio-defclass-autoload (cname _superclasses filename doc) +(defun eieio-defclass-autoload (cname superclasses filename doc) "Create autoload symbols for the EIEIO class CNAME. SUPERCLASSES are the superclasses that CNAME inherits from. DOC is the docstring for CNAME. @@ -199,15 +199,9 @@ This function creates a mock-class for CNAME and adds it into SUPERCLASSES as children. It creates an autoload function for CNAME's constructor." ;; Assume we've already debugged inputs. - - ;; We used to store the list of superclasses in the `parent' slot (as a list - ;; of class names). But now this slot holds a list of class objects, and - ;; those parents may not exist yet, so the corresponding class objects may - ;; simply not exist yet. So instead we just don't store the list of parents - ;; here in eieio-defclass-autoload at all, since it seems that they're just - ;; not needed before the class is actually loaded. (let* ((oldc (cl--find-class cname)) - (newc (eieio--class-make cname))) + (newc (eieio--class-make cname)) + (parents (mapcar #'cl-find-class superclasses))) (if (eieio--class-p oldc) nil ;; Do nothing if we already have this class. @@ -218,6 +212,12 @@ It creates an autoload function for CNAME's constructor." use '%s or turn off `eieio-backward-compatibility' instead" cname) "25.1")) + (when (memq nil parents) + ;; If some parents aren't yet fully defined, just ignore them for now. + (setq parents (delq nil parents))) + (unless parents + (setq parents (list (cl--find-class 'eieio-default-superclass)))) + (setf (cl--class-parents newc) parents) (setf (cl--find-class cname) newc) ;; Create an autoload on top of our constructor function. @@ -958,19 +958,13 @@ need be... May remove that later...)" (cdr tuple) nil))) -(defsubst eieio--class/struct-parents (class) - (or (eieio--class-parents class) - `(,eieio-default-superclass))) - (defun eieio--class-precedence-c3 (class) "Return all parents of CLASS in c3 order." (let ((parents (eieio--class-parents class))) (cons class (merge-ordered-lists (append - (or - (mapcar #'eieio--class-precedence-c3 parents) - `((,eieio-default-superclass))) + (mapcar #'eieio--class-precedence-c3 parents) (list parents)) (lambda (remaining-inputs) (signal 'inconsistent-class-hierarchy @@ -984,13 +978,11 @@ need be... May remove that later...)" (classes (copy-sequence (apply #'append (list class) - (or - (mapcar - (lambda (parent) - (cons parent - (eieio--class-precedence-dfs parent))) - parents) - `((,eieio-default-superclass)))))) + (mapcar + (lambda (parent) + (cons parent + (eieio--class-precedence-dfs parent))) + parents)))) (tail classes)) ;; Remove duplicates. (while tail @@ -1003,13 +995,12 @@ need be... May remove that later...)" (defun eieio--class-precedence-bfs (class) "Return all parents of CLASS in breadth-first order." (let* ((result) - (queue (eieio--class/struct-parents class))) + (queue (eieio--class-parents class))) (while queue (let ((head (pop queue))) (unless (member head result) (push head result) - (unless (eq head eieio-default-superclass) - (setq queue (append queue (eieio--class/struct-parents head))))))) + (setq queue (append queue (eieio--class-parents head)))))) (cons class (nreverse result))) ) @@ -1049,6 +1040,14 @@ method invocation orders of the involved classes." ;;;; General support to dispatch based on the type of the argument. +;; FIXME: We could almost use the typeof-generalizer (i.e. the same as +;; used for cl-structs), except that that generalizer doesn't support +;; `:method-invocation-order' :-( + +(defun cl--generic-struct-tag (name &rest _) + ;; Use exactly the same code as for `typeof'. + `(if ,name (type-of ,name) 'null)) + (cl-generic-define-generalizer eieio--generic-generalizer ;; Use the exact same tagcode as for cl-struct, so that methods ;; that dispatch on both kinds of objects get to share this From cc75e103dd2a9d47f29addcc724812162c1a2626 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 8 Mar 2024 20:47:23 +0800 Subject: [PATCH 431/446] Update android_wc_lookup_string * src/android.c (android_wc_lookup_string): Don't clear compose state upon modifier key depress. --- src/android.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/android.c b/src/android.c index 5b3fbb25373..d7bd06f1f34 100644 --- a/src/android.c +++ b/src/android.c @@ -5535,7 +5535,10 @@ android_wc_lookup_string (android_key_pressed_event *event, /* Terminate any ongoing character composition after a key is registered. */ - if (compose_status) + if (compose_status + /* Provided that a modifier key is not the key being + depressed. */ + && !ANDROID_IS_MODIFIER_KEY (event->keycode)) compose_status->chars_matched = 0; *status_return = status; return rc; From b9f7a2274f6a8352085d01c15bf9086ffe25f437 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 8 Mar 2024 15:06:37 +0200 Subject: [PATCH 432/446] ; Improve documentation of 'minibuffer-allow-text-properties' * doc/lispref/minibuf.texi (Text from Minibuffer): Document the default value of 'minibuffer-allow-text-properties'. --- doc/lispref/minibuf.texi | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi index 8c610018745..65a9dca52f4 100644 --- a/doc/lispref/minibuf.texi +++ b/doc/lispref/minibuf.texi @@ -187,7 +187,8 @@ History}. If the variable @code{minibuffer-allow-text-properties} is non-@code{nil}, then the string that is returned includes whatever text properties were present in the minibuffer. Otherwise all the text -properties are stripped when the value is returned. +properties are stripped when the value is returned. (By default this +variable is @code{nil}.) @vindex minibuffer-prompt-properties The text properties in @code{minibuffer-prompt-properties} are applied @@ -350,14 +351,15 @@ See @code{read-regexp} above for details of how these values are used. @end defopt @defvar minibuffer-allow-text-properties -If this variable is @code{nil}, then @code{read-from-minibuffer} -and @code{read-string} strip all text properties from the minibuffer -input before returning it. However, +If this variable is @code{nil}, the default, then +@code{read-from-minibuffer} and @code{read-string} strip all text +properties from the minibuffer input before returning it. However, @code{read-no-blanks-input} (see below), as well as @code{read-minibuffer} and related functions (@pxref{Object from Minibuffer,, Reading Lisp Objects With the Minibuffer}), and all -functions that do minibuffer input with completion, remove the @code{face} -property unconditionally, regardless of the value of this variable. +functions that do minibuffer input with completion, remove the +@code{face} property unconditionally, regardless of the value of this +variable. If this variable is non-@code{nil}, most text properties on strings from the completion table are preserved---but only on the part of the From 966d0a62a1a13a3df5155476d36eafe17999497e Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 8 Mar 2024 14:26:14 +0100 Subject: [PATCH 433/446] * Fix `capitalize` entry in `comp-known-type-specifiers` (bug#69631) * lisp/emacs-lisp/comp-common.el (comp-known-type-specifiers): Fix 'capitalize' entry. --- lisp/emacs-lisp/comp-common.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/comp-common.el b/lisp/emacs-lisp/comp-common.el index 221f819e474..4edfe811586 100644 --- a/lisp/emacs-lisp/comp-common.el +++ b/lisp/emacs-lisp/comp-common.el @@ -119,7 +119,7 @@ Used to modify the compiler environment." (function ((or integer marker) (or integer marker)) string)) (bufferp (function (t) boolean)) (byte-code-function-p (function (t) boolean)) - (capitalize (function (or integer string) (or integer string))) + (capitalize (function ((or integer string)) (or integer string))) (car (function (list) t)) (car-less-than-car (function (list list) boolean)) (car-safe (function (t) t)) From 055e31f1d021ef2c8ac5cca505b5f73118736cff Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 10:47:01 -0500 Subject: [PATCH 434/446] eieio-core.el: Try and fix bug#69631 * lisp/emacs-lisp/eieio-core.el (eieio--class-precedence-c3) (eieio--class-precedence-dfs, eieio--class-precedence-bfs): Use `cl--class-parents` since some of the parents aren't EIEIO classes. --- lisp/emacs-lisp/eieio-core.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 5418f53be35..7af6e9ff1bb 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -960,7 +960,7 @@ need be... May remove that later...)" (defun eieio--class-precedence-c3 (class) "Return all parents of CLASS in c3 order." - (let ((parents (eieio--class-parents class))) + (let ((parents (cl--class-parents class))) (cons class (merge-ordered-lists (append @@ -974,7 +974,7 @@ need be... May remove that later...)" (defun eieio--class-precedence-dfs (class) "Return all parents of CLASS in depth-first order." - (let* ((parents (eieio--class-parents class)) + (let* ((parents (cl--class-parents class)) (classes (copy-sequence (apply #'append (list class) @@ -995,12 +995,12 @@ need be... May remove that later...)" (defun eieio--class-precedence-bfs (class) "Return all parents of CLASS in breadth-first order." (let* ((result) - (queue (eieio--class-parents class))) + (queue (cl--class-parents class))) (while queue (let ((head (pop queue))) (unless (member head result) (push head result) - (setq queue (append queue (eieio--class-parents head)))))) + (setq queue (append queue (cl--class-parents head)))))) (cons class (nreverse result))) ) From 5beb56fb53b2d6ee9d5ad621b7fc2c9d1d0ec9c5 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 11:24:18 -0500 Subject: [PATCH 435/446] EIEIO: Fix regession (bug#69631) Not sure why earlier tests did not catch it, but there are more places where we bump into problems because `eieio--class-precedence-list` now returns also non-EIEIO classes. * lisp/obsolete/eieio-compat.el (eieio--generic-static-object-generalizer): * lisp/emacs-lisp/eieio-core.el (eieio--generic-generalizer) (eieio--generic-subclass-specializers): Handle non-EIEIO parents. * test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el (eieio-test-method-order-list-7): Adjust test. --- lisp/emacs-lisp/eieio-core.el | 10 ++++------ lisp/obsolete/eieio-compat.el | 5 ++--- .../emacs-lisp/eieio-tests/eieio-test-methodinvoke.el | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 7af6e9ff1bb..9a73e7c7441 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -1056,8 +1056,7 @@ method invocation orders of the involved classes." (lambda (tag &rest _) (let ((class (cl--find-class tag))) (and (eieio--class-p class) - (mapcar #'eieio--class-name - (eieio--class-precedence-list class)))))) + (cl--class-allparents class))))) (cl-defmethod cl-generic-generalizers :extra "class" (specializer) "Support for dispatch on types defined by EIEIO's `defclass'." @@ -1079,10 +1078,9 @@ method invocation orders of the involved classes." ;; Instead, we add a new "subclass" specializer. (defun eieio--generic-subclass-specializers (tag &rest _) - (when (eieio--class-p tag) - (mapcar (lambda (class) - `(subclass ,(eieio--class-name class))) - (eieio--class-precedence-list tag)))) + (when (cl--class-p tag) + (mapcar (lambda (class) `(subclass ,class)) + (cl--class-allparents tag)))) (cl-generic-define-generalizer eieio--generic-subclass-generalizer 60 (lambda (name &rest _) `(and (symbolp ,name) (cl--find-class ,name))) diff --git a/lisp/obsolete/eieio-compat.el b/lisp/obsolete/eieio-compat.el index 26648a4d7bb..8fdcebbd1c4 100644 --- a/lisp/obsolete/eieio-compat.el +++ b/lisp/obsolete/eieio-compat.el @@ -150,10 +150,9 @@ Summary: (lambda (tag &rest _) (and (symbolp tag) (setq tag (cl--find-class tag)) (eieio--class-p tag) - (let ((superclasses (eieio--class-precedence-list tag)) + (let ((superclasses (cl--class-allparents tag)) (specializers ())) (dolist (superclass superclasses) - (setq superclass (eieio--class-name superclass)) (push superclass specializers) (push `(eieio--static ,superclass) specializers)) (nreverse specializers))))) @@ -240,7 +239,7 @@ Summary: (declare (obsolete cl-no-applicable-method "25.1")) (apply #'cl-no-applicable-method method object args)) -(define-obsolete-function-alias 'call-next-method 'cl-call-next-method "25.1") +(define-obsolete-function-alias 'call-next-method #'cl-call-next-method "25.1") (defun next-method-p () (declare (obsolete cl-next-method-p "25.1")) ;; EIEIO's `next-method-p' just returned nil when called in an diff --git a/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el b/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el index b244a56779a..fb2c6ea3b68 100644 --- a/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el +++ b/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el @@ -259,7 +259,7 @@ (ans '( (:PRIMARY D) (:PRIMARY D-base1) - ;; (:PRIMARY D-base2) + (:PRIMARY D-base2) (:PRIMARY D-base0) ))) (eitest-F (D nil)) From 345cdd7a70558cd47c2ab3e124e2352debaa57cb Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 11:57:22 -0500 Subject: [PATCH 436/446] (eieio--generic-subclass-specializers): Autoload class * lisp/emacs-lisp/eieio-core.el (eieio--generic-subclass-specializers): Don't forget to handle autoloaded classes. --- lisp/emacs-lisp/eieio-core.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el index 9a73e7c7441..a2f7c4172a3 100644 --- a/lisp/emacs-lisp/eieio-core.el +++ b/lisp/emacs-lisp/eieio-core.el @@ -1079,6 +1079,8 @@ method invocation orders of the involved classes." (defun eieio--generic-subclass-specializers (tag &rest _) (when (cl--class-p tag) + (when (eieio--class-p tag) + (setq tag (eieio--full-class-object tag))) ;Autoload, if applicable. (mapcar (lambda (class) `(subclass ,class)) (cl--class-allparents tag)))) From 966e1be5b337cf71f404a509cae4057b73f3f381 Mon Sep 17 00:00:00 2001 From: Charalampos Mitrodimas Date: Thu, 7 Mar 2024 18:38:15 +0000 Subject: [PATCH 437/446] Do interactive mode tagging for locate.el * lisp/locate.el (locate-tags, locate-find-directory) (locate-find-directory-other-window): Do interactive mode tagging. (Bug#69619) Copyright-paperwork-exempt: yes --- lisp/locate.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/locate.el b/lisp/locate.el index d86e7fa678f..70328d5184e 100644 --- a/lisp/locate.el +++ b/lisp/locate.el @@ -559,7 +559,7 @@ do not work in subdirectories. (defun locate-tags () "Visit a tags table in `*Locate*' mode." - (interactive) + (interactive nil locate-mode) (if (locate-main-listing-line-p) (let ((tags-table (locate-get-filename))) (and (y-or-n-p (format "Visit tags table %s? " tags-table)) @@ -589,7 +589,7 @@ locate database using the shell command in `locate-update-command'." (defun locate-find-directory () "Visit the directory of the file mentioned on this line." - (interactive) + (interactive nil locate-mode) (if (locate-main-listing-line-p) (let ((directory-name (locate-get-dirname))) (if (file-directory-p directory-name) @@ -601,7 +601,7 @@ locate database using the shell command in `locate-update-command'." (defun locate-find-directory-other-window () "Visit the directory of the file named on this line in other window." - (interactive) + (interactive nil locate-mode) (if (locate-main-listing-line-p) (find-file-other-window (locate-get-dirname)) (message "This command only works inside main listing."))) From a4473afefe1a0f171ac6e811853836dd675f93d2 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 9 Mar 2024 10:09:36 +0200 Subject: [PATCH 438/446] Fix case-sensitivity in 'complete-tag' * lisp/progmodes/etags.el (complete-tag): Bind 'completion-ignore-case', so that 'completion-in-region' is affected by it. This fixes a bug made in 30 Apr 2010, when this function was refactored to use 'tags-completion-at-point-function'. Reported by Morgan Willcock . --- lisp/progmodes/etags.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el index 476037eb8bd..597612196fd 100644 --- a/lisp/progmodes/etags.el +++ b/lisp/progmodes/etags.el @@ -2065,7 +2065,8 @@ for \\[find-tag] (which see)." (user-error "%s" (substitute-command-keys "No tags table loaded; try \\[visit-tags-table]"))) - (let ((comp-data (tags-completion-at-point-function))) + (let ((comp-data (tags-completion-at-point-function)) + (completion-ignore-case (find-tag--completion-ignore-case))) (if (null comp-data) (user-error "Nothing to complete") (completion-in-region (car comp-data) (cadr comp-data) From 5d9a8c3704c156cccea90a46362e6bfae0de87f2 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 9 Mar 2024 16:12:40 +0800 Subject: [PATCH 439/446] Enable stack overflow recovery on Android * src/sysdep.c (handle_sigsegv): Return after restoring the original signal handler, which should proceed to call debuggerd to generate a tombstone. (init_sigsegv): Save the original signal handler on Android, to be restored after a signal is received. (init_signals): Call init_sigsegv on Android. --- src/sysdep.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/sysdep.c b/src/sysdep.c index 3a6829dd27a..cf2985b4b89 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -1853,11 +1853,7 @@ init_sigbus (void) #endif -/* This does not work on Android and interferes with the system - tombstone generation. */ - -#if defined HAVE_STACK_OVERFLOW_HANDLING && !defined WINDOWSNT \ - && (!defined HAVE_ANDROID || defined ANDROID_STUBIFY) +#if defined HAVE_STACK_OVERFLOW_HANDLING && !defined WINDOWSNT /* Alternate stack used by SIGSEGV handler below. */ @@ -1921,6 +1917,8 @@ stack_overflow (siginfo_t *siginfo) return 0 <= top - addr && top - addr < (bot - top) >> LG_STACK_HEURISTIC; } +/* Signal handler for SIGSEGV before our new handler was installed. */ +static struct sigaction old_sigsegv_handler; /* Attempt to recover from SIGSEGV caused by C stack overflow. */ @@ -1939,6 +1937,15 @@ handle_sigsegv (int sig, siginfo_t *siginfo, void *arg) if (!fatal && stack_overflow (siginfo)) siglongjmp (return_to_command_loop, 1); +#if defined HAVE_ANDROID && !defined ANDROID_STUBIFY + /* Tombstones (crash reports with stack traces) won't be generated on + Android unless the original SIGSEGV handler is installed and the + signal is resent, such as by returning from the first signal + handler called. */ + sigaction (SIGSEGV, &old_sigsegv_handler, NULL); + return; +#endif /* HAVE_ANDROID && ANDROID_STUBIFY */ + /* Otherwise we can't do anything with this. */ deliver_fatal_thread_signal (sig); } @@ -1961,7 +1968,7 @@ init_sigsegv (void) sigfillset (&sa.sa_mask); sa.sa_sigaction = handle_sigsegv; sa.sa_flags = SA_SIGINFO | SA_ONSTACK | emacs_sigaction_flags (); - if (sigaction (SIGSEGV, &sa, NULL) < 0) + if (sigaction (SIGSEGV, &sa, &old_sigsegv_handler) < 0) return 0; return 1; @@ -1969,16 +1976,12 @@ init_sigsegv (void) #else /* not HAVE_STACK_OVERFLOW_HANDLING or WINDOWSNT */ -#if !defined HAVE_ANDROID || defined ANDROID_STUBIFY - static bool init_sigsegv (void) { return 0; } -#endif - #endif /* HAVE_STACK_OVERFLOW_HANDLING && !WINDOWSNT */ static void @@ -2125,10 +2128,8 @@ init_signals (void) #endif sigaction (SIGBUS, &thread_fatal_action, 0); #endif -#if !defined HAVE_ANDROID || defined ANDROID_STUBIFY if (!init_sigsegv ()) sigaction (SIGSEGV, &thread_fatal_action, 0); -#endif #ifdef SIGSYS sigaction (SIGSYS, &thread_fatal_action, 0); #endif From 1ea3b369021c90701c634c512426f75ce1291d77 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 9 Mar 2024 04:24:30 -0500 Subject: [PATCH 440/446] Auto-commit of loaddefs files. --- lisp/ldefs-boot.el | 2460 +++++++++++++++++++++++--------------------- 1 file changed, 1272 insertions(+), 1188 deletions(-) diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index ef672d6c2e5..b434ee0e37f 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -729,19 +729,19 @@ CONCEALED: CLOSED: A TOPIC whose immediate OFFSPRING and body-text is CONCEALED. OPEN: A TOPIC that is not CLOSED, though its OFFSPRING or BODY may be. -This is a minor mode. If called interactively, toggle the -`Allout mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Allout mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `allout-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (define-obsolete-function-alias 'outlinify-sticky #'allout-outlinify-sticky "29.1") @@ -803,18 +803,18 @@ bindings for easy outline navigation and exposure control, extending outline hot-spot navigation (see `allout-mode'). This is a minor mode. If called interactively, toggle the -`Allout-Widgets mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Allout-Widgets mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `allout-widgets-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "allout-widgets" '("allout-")) @@ -1389,19 +1389,19 @@ Keymap summary \\{artist-mode-map} -This is a minor mode. If called interactively, toggle the -`Artist mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Artist mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `artist-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "artist" '("artist-")) @@ -1534,18 +1534,18 @@ When Auto-insert mode is enabled, when new files are created you can insert a template for the file depending on the mode of the buffer. This is a global minor mode. If called interactively, toggle the -`Auto-Insert mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Auto-Insert mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='auto-insert-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "autoinsert" '("auto-insert")) @@ -1571,19 +1571,19 @@ Use `global-auto-revert-mode' to automatically revert all buffers. Use `auto-revert-tail-mode' if you know that the file will only grow without being changed in the part that is already in the buffer. -This is a minor mode. If called interactively, toggle the -`Auto-Revert mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Auto-Revert +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `auto-revert-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'turn-on-auto-revert-mode "autorevert" "\ @@ -1610,19 +1610,18 @@ suppressed by setting `auto-revert-verbose' to nil. Use `auto-revert-mode' for changes other than appends! This is a minor mode. If called interactively, toggle the -`Auto-Revert-Tail mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Auto-Revert-Tail mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `auto-revert-tail-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'turn-on-auto-revert-tail-mode "autorevert" "\ @@ -1659,19 +1658,18 @@ It displays the text that `global-auto-revert-mode-text' specifies in the mode line. This is a global minor mode. If called interactively, toggle the -`Global Auto-Revert mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Global Auto-Revert mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-auto-revert-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "autorevert" '("auto-revert-" "global-auto-revert-")) @@ -1774,18 +1772,18 @@ functions in `battery-update-functions', which can be used to trigger actions based on battery-related events. This is a global minor mode. If called interactively, toggle the -`Display-Battery mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Display-Battery mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='display-battery-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "battery" '("battery-")) @@ -1949,6 +1947,10 @@ Major mode for editing BibTeX style files. ;;; Generated autoloads from bind-key.el (push (purecopy '(bind-key 2 4 1)) package--builtin-versions) +(defvar personal-keybindings nil "\ +List of bindings performed by `bind-key'. + +Elements have the form ((KEY . [MAP]) CMD ORIGINAL-CMD)") (autoload 'bind-key "bind-key" "\ Bind KEY-NAME to COMMAND in KEYMAP (`global-map' if not passed). @@ -2022,7 +2024,7 @@ other modes. See `override-global-mode'. (fn &rest ARGS)" nil t) (autoload 'describe-personal-keybindings "bind-key" "\ Display all the personal keybindings defined by `bind-key'." t) -(register-definition-prefixes "bind-key" '("bind-key" "override-global-m" "personal-keybindings")) +(register-definition-prefixes "bind-key" '("bind-key" "override-global-m")) ;;; Generated autoloads from emacs-lisp/bindat.el @@ -2755,37 +2757,36 @@ columns on its right towards the left. Toggle hyperlinking bug references in the buffer (Bug Reference mode). This is a minor mode. If called interactively, toggle the -`Bug-Reference mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Bug-Reference mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `bug-reference-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'bug-reference-prog-mode "bug-reference" "\ Like `bug-reference-mode', but only buttonize in comments and strings. This is a minor mode. If called interactively, toggle the -`Bug-Reference-Prog mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Bug-Reference-Prog mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `bug-reference-prog-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "bug-reference" '("bug-reference-")) @@ -2939,12 +2940,6 @@ and corresponding effects. ;;; Generated autoloads from progmodes/c-ts-mode.el -(autoload 'c-ts-base-mode "c-ts-mode" "\ -Major mode for editing C, powered by tree-sitter. - -\\{c-ts-base-mode-map} - -(fn)" t) (autoload 'c-ts-mode "c-ts-mode" "\ Major mode for editing C, powered by tree-sitter. @@ -2994,6 +2989,7 @@ should be used. This function attempts to use file contents to determine whether the code is C or C++ and based on that chooses whether to enable `c-ts-mode' or `c++-ts-mode'." t) +(make-obsolete 'c-or-c++-ts-mode 'c-or-c++-mode "30.1") (register-definition-prefixes "c-ts-mode" '("c-ts-")) @@ -4380,19 +4376,19 @@ checking of documentation strings. \\{checkdoc-minor-mode-map} -This is a minor mode. If called interactively, toggle the -`Checkdoc minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Checkdoc +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `checkdoc-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'checkdoc-package-keywords "checkdoc" "\ @@ -4478,19 +4474,18 @@ or call the function `cl-font-lock-built-in-mode'.") Highlight built-in functions, variables, and types in `lisp-mode'. This is a global minor mode. If called interactively, toggle the -`Cl-Font-Lock-Built-In mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Cl-Font-Lock-Built-In mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='cl-font-lock-built-in-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "cl-font-lock" '("cl-font-lock-")) @@ -4620,19 +4615,18 @@ macro-expansion of `cl-defstruct' that used vectors objects instead of record objects. This is a global minor mode. If called interactively, toggle the -`Cl-Old-Struct-Compat mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Cl-Old-Struct-Compat mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='cl-old-struct-compat-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "cl-lib" '("cl-")) @@ -5031,6 +5025,16 @@ on third call it again advances points to the next difference and so on. (fn IGNORE-WHITESPACE)" t) (register-definition-prefixes "compare-w" '("compare-")) + +;;; Generated autoloads from emacs-lisp/compat.el + + (push (list 'compat + emacs-major-version + emacs-minor-version + 9999) + package--builtin-versions) +(register-definition-prefixes "compat" '("compat-")) + ;;; Generated autoloads from image/compface.el @@ -5180,18 +5184,18 @@ See `compilation-mode'. This is a minor mode. If called interactively, toggle the `Compilation-Shell minor mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `compilation-shell-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'compilation-minor-mode "compile" "\ @@ -5201,20 +5205,19 @@ When Compilation minor mode is enabled, all the error-parsing commands of Compilation major mode are available. See `compilation-mode'. -This is a minor mode. If called interactively, toggle the -`Compilation minor mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +This is a minor mode. If called interactively, toggle the `Compilation +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `compilation-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'compilation-next-error-function "compile" "\ @@ -5272,19 +5275,18 @@ this mode: `enable-completion', `save-completions-flag', and options can be found in the `completion' group. This is a global minor mode. If called interactively, toggle the -`Dynamic-Completion mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Dynamic-Completion mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='dynamic-completion-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "completion" '("*c-def-regexp*" "*lisp-def-regexp*" "accept-completion" "add-" "cdabbrev-" "check-completion-length" "clear-all-completions" "cmpl-" "complet" "current-completion-source" "delete-completion" "enable-completion" "find-" "inside-locate-completion-entry" "interactive-completion-string-reader" "kill-" "list-all-completions" "load-completions-from-file" "make-c" "next-cdabbrev" "num-cmpl-sources" "reset-cdabbrev" "save" "set-c" "symbol-" "use-completion-")) @@ -5304,19 +5306,18 @@ completion suggestion, and \\[completion-preview-prev-candidate] cycles backward. This is a minor mode. If called interactively, toggle the -`Completion-Preview mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Completion-Preview mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `completion-preview-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "completion-preview" '("completion-preview-")) @@ -5543,6 +5544,7 @@ If FIX is non-nil, run `copyright-fix-years' instead. ;;; Generated autoloads from progmodes/cperl-mode.el +(put 'cperl-file-style 'safe-local-variable 'stringp) (put 'cperl-indent-level 'safe-local-variable 'integerp) (put 'cperl-brace-offset 'safe-local-variable 'integerp) (put 'cperl-continued-brace-offset 'safe-local-variable 'integerp) @@ -5550,7 +5552,6 @@ If FIX is non-nil, run `copyright-fix-years' instead. (put 'cperl-continued-statement-offset 'safe-local-variable 'integerp) (put 'cperl-extra-newline-before-brace 'safe-local-variable 'booleanp) (put 'cperl-merge-trailing-else 'safe-local-variable 'booleanp) -(put 'cperl-file-style 'safe-local-variable 'stringp) (autoload 'cperl-mode "cperl-mode" "\ Major mode for editing Perl code. Expression and list commands understand all C brackets. @@ -5903,19 +5904,19 @@ You can customize `cua-enable-cua-keys' to completely disable the CUA bindings, or `cua-prefix-override-inhibit-delay' to change the prefix fallback behavior. -This is a global minor mode. If called interactively, toggle the -`Cua mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a global minor mode. If called interactively, toggle the `Cua +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='cua-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'cua-selection-mode "cua-base" "\ @@ -5938,19 +5939,18 @@ Toggle the region as rectangular. Activates the region if needed. Only lasts until the region is deactivated. This is a minor mode. If called interactively, toggle the -`Cua-Rectangle-Mark mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Cua-Rectangle-Mark mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `cua-rectangle-mark-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "cua-rect" '("cua-")) @@ -5966,19 +5966,18 @@ By convention, this is a list of symbols where each symbol stands for the Keep cursor outside of any `cursor-intangible' text property. This is a minor mode. If called interactively, toggle the -`Cursor-Intangible mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Cursor-Intangible mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `cursor-intangible-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'cursor-sensor-mode "cursor-sensor" "\ @@ -5991,18 +5990,18 @@ the cursor and DIR can be `entered' or `left' depending on whether the cursor is entering the area covered by the text-property property or leaving it. This is a minor mode. If called interactively, toggle the -`Cursor-Sensor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Cursor-Sensor mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `cursor-sensor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "cursor-sensor" '("cursor-sensor-")) @@ -6115,6 +6114,11 @@ Customize GROUP, which must be a customization group, in another window. Customize SYMBOL, which must be a user option. (fn SYMBOL)" t) +(autoload 'customize-toggle-option "cus-edit" "\ +Toggle the value of boolean option SYMBOL for this session. + +(fn SYMBOL)" t) +(defalias 'toggle-option #'customize-toggle-option) (defalias 'customize-variable-other-window 'customize-option-other-window) (autoload 'customize-option-other-window "cus-edit" "\ Customize SYMBOL, which must be a user option. @@ -6368,19 +6372,19 @@ Note, in addition to enabling this minor mode, the major mode must be included in the variable `cwarn-configuration'. By default C and C++ modes are included. -This is a minor mode. If called interactively, toggle the `Cwarn -mode' mode. If the prefix argument is positive, enable the mode, -and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Cwarn mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `cwarn-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-cwarn-mode 'globalized-minor-mode t) @@ -6871,19 +6875,18 @@ See `delete-selection-helper' and `delete-selection-pre-hook' for information on adapting behavior of commands in Delete Selection mode. This is a global minor mode. If called interactively, toggle the -`Delete-Selection mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Delete-Selection mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='delete-selection-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'delete-active-region "delsel" "\ @@ -6964,13 +6967,6 @@ 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) -(autoload 'derived-mode-init-mode-variables "derived" "\ -Initialize variables for a new MODE. -Right now, if they don't already exist, set up a blank keymap, an -empty syntax table, and an empty abbrev table -- these will be merged -the first time the mode is used. - -(fn MODE)") (register-definition-prefixes "derived" '("derived-mode-")) @@ -7042,13 +7038,22 @@ or call the function `desktop-save-mode'.") (autoload 'desktop-save-mode "desktop" "\ Toggle desktop saving (Desktop Save mode). -When Desktop Save mode is enabled, the state of Emacs is saved from -one session to another. In particular, Emacs will save the desktop when -it exits (this may prompt you; see the option `desktop-save'). The next -time Emacs starts, if this mode is active it will restore the desktop. +When Desktop Save mode is enabled, the state of Emacs is saved from one +session to another. The saved Emacs \"desktop configuration\" includes the +buffers, their file names, major modes, buffer positions, window and frame +configuration, and some important global variables. -To manually save the desktop at any time, use the command `\\[desktop-save]'. -To load it, use `\\[desktop-read]'. +To enable this feature for future sessions, customize `desktop-save-mode' +to t, or add this line in your init file: + + (desktop-save-mode 1) + +When this mode is enabled, Emacs will save the desktop when it exits +(this may prompt you, see the option `desktop-save'). The next time +Emacs starts, if this mode is active it will restore the desktop. + +To manually save the desktop at any time, use the command \\[desktop-save]. +To load it, use \\[desktop-read]. Once a desktop file exists, Emacs will auto-save it according to the option `desktop-auto-save-timeout'. @@ -7058,18 +7063,18 @@ To see all the options you can set, browse the `desktop' customization group. For further details, see info node `(emacs)Saving Emacs Sessions'. This is a global minor mode. If called interactively, toggle the -`Desktop-Save mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Desktop-Save mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='desktop-save-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar desktop-locals-to-save '(desktop-locals-to-save truncate-lines case-fold-search case-replace fill-column overwrite-mode change-log-default-name line-number-mode column-number-mode size-indication-mode buffer-file-coding-system buffer-display-time indent-tabs-mode tab-width indicate-buffer-boundaries indicate-empty-lines show-trailing-whitespace) "\ @@ -7503,19 +7508,19 @@ Toggle Diff minor mode. \\{diff-minor-mode-map} -This is a minor mode. If called interactively, toggle the `Diff -minor mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Diff minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `diff-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar diff-add-log-use-relative-names nil "\ @@ -7719,19 +7724,19 @@ This is an alternative to `shell-dirtrack-mode', which works by tracking `cd' and similar commands which change the shell working directory. -This is a minor mode. If called interactively, toggle the -`Dirtrack mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Dirtrack +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `dirtrack-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'dirtrack "dirtrack" "\ @@ -7750,7 +7755,7 @@ from `default-directory'. (autoload 'disassemble "disass" "\ Print disassembled code for OBJECT in (optional) BUFFER. OBJECT can be a symbol defined as a function, or a function itself -(a lambda expression or a compiled-function object). +(a lambda expression or a byte-code-function object). If OBJECT is not already compiled, we compile it, but do not redefine OBJECT if it is a symbol. @@ -7905,19 +7910,19 @@ not appear aligned. See Info node `Displaying Boundaries' for details. This is a minor mode. If called interactively, toggle the -`Display-Fill-Column-Indicator mode' mode. If the prefix -argument is positive, enable the mode, and if it is zero or -negative, disable the mode. +`Display-Fill-Column-Indicator mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `display-fill-column-indicator-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-display-fill-column-indicator-mode 'globalized-minor-mode t) @@ -7977,19 +7982,18 @@ customize `display-line-numbers-type'. To change the type while the mode is on, set `display-line-numbers' directly. This is a minor mode. If called interactively, toggle the -`Display-Line-Numbers mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Display-Line-Numbers mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `display-line-numbers-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-display-line-numbers-mode 'globalized-minor-mode t) @@ -8066,19 +8070,18 @@ of `header-line-format', like this: See also `line-number-display-width'. This is a minor mode. If called interactively, toggle the -`Header-Line-Indent mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Header-Line-Indent mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `header-line-indent-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "display-line-numbers" '("display-line-numbers-" "header-line-indent--")) @@ -8179,19 +8182,19 @@ Toggle displaying buffer via Doc View (Doc View minor mode). See the command `doc-view-mode' for more information on this mode. -This is a minor mode. If called interactively, toggle the -`Doc-View minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Doc-View +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `doc-view-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'doc-view-bookmark-jump "doc-view" "\ @@ -8250,19 +8253,19 @@ Toggle special insertion on double keypresses (Double mode). When Double mode is enabled, some keys will insert different strings when pressed twice. See `double-map' for details. -This is a minor mode. If called interactively, toggle the -`Double mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Double mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `double-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "double" '("double-")) @@ -8870,18 +8873,18 @@ This global minor mode enables `ede-minor-mode' in all buffers in an EDE controlled project. This is a global minor mode. If called interactively, toggle the -`Global Ede mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Global Ede mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-ede-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "ede" '("ede" "global-ede-mode-map" "project-try-ede")) @@ -8919,7 +8922,7 @@ An extant spec symbol is a symbol that is not a function and has a `edebug-form-spec' property. (fn SPEC)") -(defalias 'edebug-defun 'edebug-eval-top-level-form) +(defalias 'edebug-defun #'edebug-eval-top-level-form) (autoload 'edebug-eval-top-level-form "edebug" "\ Evaluate the top level form point is in, stepping through with Edebug. This is like `eval-defun' except that it steps the code for Edebug @@ -9285,9 +9288,9 @@ To change the default, set the variable `ediff-use-toolbar-p', which see." t) (autoload 'edit-kbd-macro "edmacro" "\ Edit a keyboard macro. At the prompt, type any key sequence which is bound to a keyboard macro. -Or, type `\\[kmacro-end-and-call-macro]' or \\`RET' to edit the last -keyboard macro, `\\[view-lossage]' to edit the last 300 -keystrokes as a keyboard macro, or `\\[execute-extended-command]' +Or, type \\[kmacro-end-and-call-macro] or \\`RET' to edit the last +keyboard macro, \\[view-lossage] to edit the last 300 +keystrokes as a keyboard macro, or \\[execute-extended-command] to edit a macro by its command name. With a prefix argument, format the macro in a more concise way. @@ -9359,7 +9362,7 @@ Turn on EDT Emulation." t) ;;; Generated autoloads from progmodes/eglot.el -(push (purecopy '(eglot 1 16)) package--builtin-versions) +(push (purecopy '(eglot 1 17)) package--builtin-versions) (define-obsolete-function-alias 'eglot-update #'eglot-upgrade-eglot "29.1") (autoload 'eglot "eglot" "\ Start LSP server for PROJECT's buffers under MANAGED-MAJOR-MODES. @@ -9494,7 +9497,7 @@ SUPERCLASSES as children. It creates an autoload function for CNAME's constructor. (fn CNAME SUPERCLASSES FILENAME DOC)") -(register-definition-prefixes "eieio-core" '("class-" "eieio-" "inconsistent-class-hierarchy" "invalid-slot-" "unbound-slot")) +(register-definition-prefixes "eieio-core" '("cl--generic-struct-tag" "class-" "eieio-" "inconsistent-class-hierarchy" "invalid-slot-" "unbound-slot")) ;;; Generated autoloads from emacs-lisp/eieio-custom.el @@ -9571,37 +9574,36 @@ inserted around the region instead. To toggle the mode in a single buffer, use `electric-pair-local-mode'. This is a global minor mode. If called interactively, toggle the -`Electric-Pair mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Electric-Pair mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='electric-pair-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'electric-pair-local-mode "elec-pair" "\ Toggle `electric-pair-mode' only in this buffer. This is a minor mode. If called interactively, toggle the -`Electric-Pair-Local mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Electric-Pair-Local mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `electric-pair-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "elec-pair" '("electric-pair-")) @@ -9618,19 +9620,19 @@ to `elide-head-headers-to-hide'. This is suitable as an entry on `find-file-hook' or appropriate mode hooks. -This is a minor mode. If called interactively, toggle the -`Elide-Head mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Elide-Head +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `elide-head-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'elide-head "elide-head" "\ @@ -9998,19 +10000,19 @@ Commands: \\{enriched-mode-map} -This is a minor mode. If called interactively, toggle the -`Enriched mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Enriched +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `enriched-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'enriched-encode "enriched" "\ @@ -10231,19 +10233,19 @@ enough, since keyservers have strict timeout settings. (autoload 'epa-mail-mode "epa-mail" "\ A minor-mode for composing encrypted/clearsigned mails. -This is a minor mode. If called interactively, toggle the -`epa-mail mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `epa-mail +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `epa-mail-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'epa-mail-decrypt "epa-mail" "\ @@ -10293,18 +10295,18 @@ or call the function `epa-global-mail-mode'.") Minor mode to hook EasyPG into Mail mode. This is a global minor mode. If called interactively, toggle the -`Epa-Global-Mail mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Epa-Global-Mail mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='epa-global-mail-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "epa-mail" '("epa-mail-")) @@ -10356,84 +10358,77 @@ Look at CONFIG and try to expand GROUP. ;;; Generated autoloads from erc/erc.el (push (purecopy '(erc 5 6 -4)) package--builtin-versions) +(dolist (symbol '( erc-sasl erc-spelling ; 29 + erc-imenu erc-nicks)) ; 30 + (custom-add-load symbol symbol)) +(custom-autoload 'erc-modules "erc") (autoload 'erc-select-read-args "erc" "\ -Prompt the user for values of nick, server, port, and password. -With prefix arg, also prompt for user and full name.") +Prompt for connection parameters and return them in a plist. +By default, collect `:server', `:port', `:nickname', and +`:password'. With a non-nil prefix argument, also prompt for +`:user' and `:full-name'. Also return various environmental +properties needed by entry-point commands, like `erc-tls'.") (autoload 'erc-server-select "erc" "\ Interactively connect to a server from `erc-server-alist'." t) (make-obsolete 'erc-server-select 'erc-tls "30.1") (autoload 'erc "erc" "\ -ERC is a powerful, modular, and extensible IRC client. -This function is the main entry point for ERC. +Connect to an Internet Relay Chat SERVER on a non-TLS PORT. +Use NICK and USER, when non-nil, to inform the IRC commands of +the same name, possibly factoring in a non-nil FULL-NAME as well. +When PASSWORD is non-nil, also send an opening server password +via the \"PASS\" command. Interactively, prompt for SERVER, +PORT, NICK, and PASSWORD, along with USER and FULL-NAME when +given a prefix argument. Non-interactively, expect the rarely +needed ID parameter, when non-nil, to be a symbol or a string for +naming the server buffer and identifying the connection +unequivocally. Once connected, return the server buffer. (See +Info node `(erc) Connecting' for details about all mentioned +parameters.) -It allows selecting connection parameters, and then starts ERC. +Together with `erc-tls', this command serves as the main entry +point for ERC, the powerful, modular, and extensible IRC client. +Non-interactively, both commands accept the following keyword +arguments, with their defaults supplied by the indicated +\"compute\" functions: -Non-interactively, it takes the keyword arguments - (server (erc-compute-server)) - (port (erc-compute-port)) - (nick (erc-compute-nick)) - (user (erc-compute-user)) - password - (full-name (erc-compute-full-name)) - id + :server `erc-compute-server' + :port `erc-compute-port' + :nick `erc-compute-nick' + :user `erc-compute-user' + :password N/A + :full-name `erc-compute-full-name' + :id' N/A -That is, if called with +For example, when called in the following manner (erc :server \"irc.libera.chat\" :full-name \"J. Random Hacker\") -then the server and full-name will be set to those values, -whereas `erc-compute-port' and `erc-compute-nick' will be invoked -for the values of the other parameters. - -See `erc-tls' for the meaning of ID. +ERC assigns SERVER and FULL-NAME the associated keyword values +and defers to `erc-compute-port', `erc-compute-user', and +`erc-compute-nick' for those respective parameters. (fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" '((let ((erc--display-context `((erc-interactive-display . erc) ,@erc--display-context))) (erc-select-read-args)))) (defalias 'erc-select #'erc) (autoload 'erc-tls "erc" "\ -ERC is a powerful, modular, and extensible IRC client. -This function is the main entry point for ERC over TLS. +Connect to an IRC server over a TLS-encrypted connection. +Interactively, prompt for SERVER, PORT, NICK, and PASSWORD, along +with USER and FULL-NAME when given a prefix argument. +Non-interactively, also accept a CLIENT-CERTIFICATE, which should +be a list containing the file name of the certificate's key +followed by that of the certificate itself. Alternatively, +accept a value of t instead of a list, to tell ERC to query +`auth-source' for the certificate's details. -It allows selecting connection parameters, and then starts ERC -over TLS. - -Non-interactively, it takes the keyword arguments - (server (erc-compute-server)) - (port (erc-compute-port)) - (nick (erc-compute-nick)) - (user (erc-compute-user)) - password - (full-name (erc-compute-full-name)) - client-certificate - id - -That is, if called with - - (erc-tls :server \"irc.libera.chat\" :full-name \"J. Random Hacker\") - -then the server and full-name will be set to those values, -whereas `erc-compute-port' and `erc-compute-nick' will be invoked -for the values of their respective parameters. - -CLIENT-CERTIFICATE, if non-nil, should either be a list where the -first element is the certificate key file name, and the second -element is the certificate file name itself, or t, which means -that `auth-source' will be queried for the key and the -certificate. Authenticating using a TLS client certificate is -also referred to as \"CertFP\" (Certificate Fingerprint) -authentication by various IRC networks. - -Example usage: +Example client certificate (CertFP) usage: (erc-tls :server \"irc.libera.chat\" :port 6697 :client-certificate \\='(\"/home/bandali/my-cert.key\" \"/home/bandali/my-cert.crt\")) -When present, ID should be a symbol or a string to use for naming -the server buffer and identifying the connection unequivocally. -See Info node `(erc) Network Identifier' for details. Like -CLIENT-CERTIFICATE, this parameter cannot be specified -interactively. +See the alternative entry-point command `erc' as well as Info +node `(erc) Connecting' for a fuller description of the various +parameters, like ID. (fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" '((let ((erc-default-port erc-default-port-tls) (erc--display-context `((erc-interactive-display . erc-tls) ,@erc--display-context))) (erc-select-read-args)))) (autoload 'erc-handle-irc-url "erc" "\ @@ -10701,6 +10696,46 @@ Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test). (fn TEST-OR-TEST-NAME)" t) (register-definition-prefixes "ert" '("ert-")) + +;;; Generated autoloads from emacs-lisp/ert-font-lock.el + +(autoload 'ert-font-lock-deftest "ert-font-lock" "\ +Define test NAME (a symbol) using assertions from TEST-STR. + +Other than MAJOR-MODE and TEST-STR parameters, this macro accepts +the same parameters and keywords as `ert-deftest' and is intended +to be 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 3) +(function-put 'ert-font-lock-deftest 'lisp-indent-function 2) +(autoload 'ert-font-lock-deftest-file "ert-font-lock" "\ +Define test NAME (a symbol) using assertions from FILE. + +FILE - path to a file with assertions in ERT resource director as +return by `ert-resource-directory'. + +Other than MAJOR-MODE and FILE parameters, this macro accepts the +same parameters and keywords as `ert-deftest' and is intended to +be used 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 3) +(function-put 'ert-font-lock-deftest-file 'lisp-indent-function 2) +(autoload 'ert-font-lock-test-string "ert-font-lock" "\ +Check font faces in TEST-STRING set by MODE. + +The function is meant to be run from within an ERT test. + +(fn TEST-STRING MODE)") +(autoload 'ert-font-lock-test-file "ert-font-lock" "\ +Check font faces in FILENAME set by MODE. + +The function is meant to be run from within an ERT test. + +(fn FILENAME MODE)") +(register-definition-prefixes "ert-font-lock" '("ert-font-lock--")) + ;;; Generated autoloads from emacs-lisp/ert-x.el @@ -11086,6 +11121,49 @@ for \\[find-tag] (which see)." t) (autoload 'etags--xref-backend "etags") (register-definition-prefixes "etags" '("default-tags-table-function" "etags-" "file-of-tag" "find-tag-" "goto-tag-location-function" "initialize-new-tags-table" "last-tag" "list-tags-function" "select-tags-table-" "snarf-tag-function" "tag" "verify-tags-table-function")) + +;;; Generated autoloads from progmodes/etags-regen.el + +(put 'etags-regen-regexp-alist 'safe-local-variable (lambda (value) (and (listp value) (seq-every-p (lambda (group) (and (consp group) (listp (car group)) (listp (cdr group)) (seq-every-p #'stringp (car group)) (seq-every-p #'stringp (cdr group)))) value)))) +(put 'etags-regen-file-extensions 'safe-local-variable (lambda (value) (and (listp value) (seq-every-p #'stringp value)))) +(put 'etags-regen-ignores 'safe-local-variable (lambda (value) (and (listp value) (seq-every-p #'stringp value)))) +(defvar etags-regen-mode nil "\ +Non-nil if Etags-Regen mode is enabled. +See the `etags-regen-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `etags-regen-mode'.") +(custom-autoload 'etags-regen-mode "etags-regen" nil) +(autoload 'etags-regen-mode "etags-regen" "\ +Minor mode to automatically generate and update tags tables. + +This minor mode generates the tags table automatically based on +the current project configuration, and later updates it as you +edit the files and save the changes. + +If you select a tags table manually (for example, using +\\[visit-tags-table]), then this mode will be effectively +disabled for the entire session. Use \\[tags-reset-tags-tables] +to countermand the effect of a previous \\[visit-tags-table]. + +This is a global minor mode. If called interactively, toggle the +`Etags-Regen mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `(default-value \\='etags-regen-mode)'. + +The mode's hook is called both when the mode is enabled and when it is +disabled. + +(fn &optional ARG)" t) +(register-definition-prefixes "etags-regen" '("etags-regen-")) + ;;; Generated autoloads from language/ethio-util.el @@ -11892,19 +11970,19 @@ Minor mode for a buffer-specific default face. When enabled, the face specified by the variable `buffer-face-mode-face' is used to display the buffer text. -This is a minor mode. If called interactively, toggle the -`Buffer-Face mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Buffer-Face +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `buffer-face-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'buffer-face-set "face-remap" "\ @@ -12377,12 +12455,14 @@ earlier in the `setq-connection-local'. The return value of the (fn [VARIABLE VALUE]...)" nil t) (autoload 'connection-local-p "files-x" "\ Non-nil if VARIABLE has a connection-local binding in `default-directory'. +`default-directory' must be a remote file name. If APPLICATION is nil, the value of `connection-local-default-application' is used. (fn VARIABLE &optional APPLICATION)" nil t) (autoload 'connection-local-value "files-x" "\ Return connection-local VARIABLE for APPLICATION in `default-directory'. +`default-directory' must be a remote file name. If APPLICATION is nil, the value of `connection-local-default-application' is used. If VARIABLE does not have a connection-local binding, the return @@ -12900,19 +12980,19 @@ suitable for the current buffer. The commands `flymake-reporting-backends' summarize the situation, as does the special *Flymake log* buffer. -This is a minor mode. If called interactively, toggle the -`Flymake mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Flymake +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `flymake-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'flymake-mode-on "flymake" "\ @@ -12977,19 +13057,19 @@ in your init file. \\[flyspell-region] checks all words inside a region. \\[flyspell-buffer] checks the whole buffer. -This is a minor mode. If called interactively, toggle the -`Flyspell mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Flyspell +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `flyspell-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'turn-on-flyspell "flyspell" "\ @@ -13045,7 +13125,7 @@ being able to use 144 or 216 lines instead of the normal 72... (your mileage may vary). To split one large window into two side-by-side windows, the commands -`\\[split-window-right]' or `\\[follow-delete-other-windows-and-split]' can be used. +\\[split-window-right] or \\[follow-delete-other-windows-and-split] can be used. Only windows displayed in the same frame follow each other. @@ -13054,19 +13134,19 @@ This command runs the normal hook `follow-mode-hook'. Keys specific to Follow mode: \\{follow-mode-map} -This is a minor mode. If called interactively, toggle the -`Follow mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Follow mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `follow-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'follow-scroll-up-window "follow" "\ @@ -13152,19 +13232,19 @@ provides footnote support for `message-mode'. To get started, play around with the following keys: \\{footnote-minor-mode-map} -This is a minor mode. If called interactively, toggle the -`Footnote mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Footnote +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `footnote-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "footnote" '("footnote-")) @@ -13618,19 +13698,18 @@ being transferred. This list may grow up to a size of the list) is deleted every time a new one is added (at the front). This is a global minor mode. If called interactively, toggle the -`Gdb-Enable-Debug mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Gdb-Enable-Debug mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='gdb-enable-debug)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'gdb "gdb-mi" "\ @@ -13794,19 +13873,19 @@ Minor mode for making identifiers likeThis readable. When this mode is active, it tries to add virtual separators (like underscores) at places they belong to. -This is a minor mode. If called interactively, toggle the -`Glasses mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Glasses +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `glasses-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "glasses" '("glasses-")) @@ -13826,19 +13905,18 @@ If enabled, all glyphless characters will be displayed as boxes that display their acronyms. This is a minor mode. If called interactively, toggle the -`Glyphless-Display mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Glyphless-Display mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `glyphless-display-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "glyphless-mode" '("glyphless-mode-")) @@ -14319,19 +14397,18 @@ Minor mode for providing mailing-list commands. \\{gnus-mailing-list-mode-map} This is a minor mode. If called interactively, toggle the -`Gnus-Mailing-List mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Gnus-Mailing-List mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `gnus-mailing-list-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "gnus-ml" '("gnus-mailing-list-")) @@ -14718,19 +14795,19 @@ Also fontifies the buffer appropriately (see `goto-address-fontify-p' and (autoload 'goto-address-mode "goto-addr" "\ Minor mode to buttonize URLs and e-mail addresses in the current buffer. -This is a minor mode. If called interactively, toggle the -`Goto-Address mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Goto-Address +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `goto-address-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-goto-address-mode 'globalized-minor-mode t) @@ -14761,19 +14838,18 @@ See `goto-address-mode' for more information on Goto-Address mode. Like `goto-address-mode', but only for comments and strings. This is a minor mode. If called interactively, toggle the -`Goto-Address-Prog mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Goto-Address-Prog mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `goto-address-prog-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "goto-addr" '("goto-addr")) @@ -15129,18 +15205,18 @@ or call the function `gud-tooltip-mode'.") Toggle the display of GUD tooltips. This is a global minor mode. If called interactively, toggle the -`Gud-Tooltip mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Gud-Tooltip mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='gud-tooltip-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'lldb "gud" "\ @@ -15582,6 +15658,9 @@ whose documentation describes the minor mode. If called from Lisp with a non-nil BUFFER argument, display documentation for the major and minor modes of that buffer. +When `describe-mode-outline' is non-nil, Outline minor mode +is enabled in the Help buffer. + (fn &optional BUFFER)" t) (autoload 'describe-widget "help-fns" "\ Display a buffer with information about a widget. @@ -15907,19 +15986,19 @@ position (number of characters into buffer) Hi-lock: end is found. A mode is excluded if it's in the list `hi-lock-exclude-modes'. -This is a minor mode. If called interactively, toggle the -`Hi-Lock mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Hi-Lock +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `hi-lock-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-hi-lock-mode 'globalized-minor-mode t) @@ -16083,22 +16162,22 @@ Several variables affect how the hiding is done: \\{hide-ifdef-mode-map} -This is a minor mode. If called interactively, toggle the -`Hide-Ifdef mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Hide-Ifdef +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `hide-ifdef-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) -(register-definition-prefixes "hideif" '("backward-ifdef" "down-ifdef" "forward-ifdef" "hide-ifdef" "hif-" "intern-safe" "next-ifdef" "previous-ifdef" "show-ifdef" "up-ifdef")) +(register-definition-prefixes "hideif" '("backward-ifdef" "down-ifdef" "forward-ifdef" "hide-ifdef" "hif-" "next-ifdef" "previous-ifdef" "show-ifdef" "up-ifdef")) ;;; Generated autoloads from progmodes/hideshow.el @@ -16160,19 +16239,19 @@ Lastly, the normal hook `hs-minor-mode-hook' is run using `run-hooks'. Key bindings: \\{hs-minor-mode-map} -This is a minor mode. If called interactively, toggle the `hs -minor mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `hs minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `hs-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'turn-off-hideshow "hideshow" "\ @@ -16206,19 +16285,18 @@ buffer with the contents of a file \\[highlight-compare-buffers] highlights differences between two buffers. This is a minor mode. If called interactively, toggle the -`Highlight-Changes mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Highlight-Changes mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `highlight-changes-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'highlight-changes-visible-mode "hilit-chg" "\ @@ -16235,18 +16313,18 @@ This command does not itself set Highlight Changes mode. This is a minor mode. If called interactively, toggle the `Highlight-Changes-Visible mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `highlight-changes-visible-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'highlight-changes-remove-highlight "hilit-chg" "\ @@ -16372,19 +16450,19 @@ non-selected window. Hl-Line mode uses the function When `hl-line-sticky-flag' is nil, Hl-Line mode highlights the line about point in the selected window only. -This is a minor mode. If called interactively, toggle the -`Hl-Line mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Hl-Line +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `hl-line-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar global-hl-line-mode nil "\ @@ -16406,18 +16484,18 @@ Global-Hl-Line mode uses the function `global-hl-line-highlight' on `post-command-hook'. This is a global minor mode. If called interactively, toggle the -`Global Hl-Line mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Global Hl-Line mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-hl-line-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "hl-line" '("global-hl-line-" "hl-line-")) @@ -16777,19 +16855,19 @@ An enhanced `icomplete-mode' that emulates `ido-mode'. This global minor mode makes minibuffer completion behave more like `ido-mode' than regular `icomplete-mode'. -This is a global minor mode. If called interactively, toggle the -`Fido mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a global minor mode. If called interactively, toggle the `Fido +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='fido-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar icomplete-mode nil "\ @@ -16817,18 +16895,18 @@ completions: \\{icomplete-minibuffer-map} This is a global minor mode. If called interactively, toggle the -`Icomplete mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Icomplete mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='icomplete-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar icomplete-vertical-mode nil "\ @@ -16849,19 +16927,18 @@ the value of `max-mini-window-height', and the way the mini-window is resized depends on `resize-mini-windows'. This is a global minor mode. If called interactively, toggle the -`Icomplete-Vertical mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Icomplete-Vertical mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='icomplete-vertical-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar fido-vertical-mode nil "\ @@ -16879,18 +16956,18 @@ When turning on, if non-vertical `fido-mode' is off, turn it on. If it's on, just add the vertical display. This is a global minor mode. If called interactively, toggle the -`Fido-Vertical mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Fido-Vertical mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='fido-vertical-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (when (locate-library "obsolete/iswitchb") @@ -17380,19 +17457,19 @@ See `inferior-emacs-lisp-mode' for details. (autoload 'iimage-mode "iimage" "\ Toggle Iimage mode on or off. -This is a minor mode. If called interactively, toggle the -`Iimage mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Iimage mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `iimage-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "iimage" '("iimage-" "turn-off-iimage-mode")) @@ -17464,9 +17541,13 @@ use its file extension as image type. Optional DATA-P non-nil means FILE-OR-DATA is a string containing image data. Optional PROPS are additional image attributes to assign to the image, -like, e.g. `:mask MASK'. If the property `:scale' is not given and the -display has a high resolution (more exactly, when the average width of a -character in the default font is more than 10 pixels), the image is +like, e.g. `:mask MASK'. See Info node `(elisp)Image Descriptors' for +the list of supported properties; see the nodes following that node +for properties specific to certain image types. + +If the property `:scale' is not given and the display has a high +resolution (more exactly, when the average width of a character +in the default font is more than 10 pixels), the image is automatically scaled up in proportion to the default font. Value is the image created, or nil if images of type TYPE are not supported. @@ -17531,21 +17612,25 @@ BUFFER nil or omitted means use the current buffer. (fn START END &optional BUFFER)") (autoload 'find-image "image" "\ -Find an image, choosing one of a list of image specifications. +Find an image that satisfies one of a list of image specifications. SPECS is a list of image specifications. -Each image specification in SPECS is a property list. The contents of -a specification are image type dependent. All specifications must at -least contain either the property `:file FILE' or `:data DATA', -where FILE is the file to load the image from, and DATA is a string -containing the actual image data. If the property `:type TYPE' is -omitted or nil, try to determine the image type from its first few +Each image specification in SPECS is a property list. The +contents of a specification are image type dependent; see the +info node `(elisp)Image Descriptors' for details. All specifications +must at least contain either the property `:file FILE' or `:data DATA', +where FILE is the file from which to load the image, and DATA is a +string containing the actual image data. If the property `:type TYPE' +is omitted or nil, try to determine the image type from its first few bytes of image data. If that doesn't work, and the property `:file -FILE' provide a file name, use its file extension as image type. -If `:type TYPE' is provided, it must match the actual type -determined for FILE or DATA by `create-image'. Return nil if no -specification is satisfied. +FILE' provide a file name, use its file extension as idication of the +image type. If `:type TYPE' is provided, it must match the actual type +determined for FILE or DATA by `create-image'. + +The function returns the image specification for the first specification +in the list whose TYPE is supported and FILE, if specified, exists. It +returns nil if no specification in the list can be satisfied. If CACHE is non-nil, results are cached and returned on subsequent calls. @@ -17762,20 +17847,19 @@ are always available in Dired: \\[image-dired-dired-toggle-marked-thumbs] Toggle thumbnails in front of file names. \\[image-dired-dired-edit-comment-and-tags] Edit comment and tags of marked images. -This is a minor mode. If called interactively, toggle the -`Image-Dired minor mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +This is a minor mode. If called interactively, toggle the `Image-Dired +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `image-dired-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'image-dired-display-thumbs-append "image-dired-dired" "\ @@ -17881,18 +17965,18 @@ An image file is one whose name has an extension in `image-file-name-regexps'. This is a global minor mode. If called interactively, toggle the -`Auto-Image-File mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Auto-Image-File mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='auto-image-file-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "image-file" '("image-file-")) @@ -17913,19 +17997,19 @@ Toggle Image minor mode in this buffer. Image minor mode provides the key \\\\[image-toggle-display], to switch back to `image-mode' and display an image file as the actual image. -This is a minor mode. If called interactively, toggle the `Image -minor mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Image minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `image-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'image-mode-to-text "image-mode" "\ @@ -18126,19 +18210,18 @@ indented towards the left by the column number at the start of that text. This is a global minor mode. If called interactively, toggle the -`Kill-Ring-Deindent mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Kill-Ring-Deindent mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='kill-ring-deindent-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "indent-aux" '("kill-ring-deindent-buffer-substring-function")) @@ -18831,19 +18914,19 @@ SPC. For spell-checking \"on the fly\", not just after typing SPC or RET, use `flyspell-mode'. -This is a minor mode. If called interactively, toggle the -`ISpell minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `ISpell minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `ispell-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'ispell-message "ispell" "\ @@ -19049,7 +19132,7 @@ Major mode for editing JSON, powered by tree-sitter. ;;; Generated autoloads from jsonrpc.el -(push (purecopy '(jsonrpc 1 0 23)) package--builtin-versions) +(push (purecopy '(jsonrpc 1 0 24)) package--builtin-versions) (register-definition-prefixes "jsonrpc" '("jsonrpc-")) @@ -19849,7 +19932,7 @@ For example, in Usenet articles, sections of text quoted from another author are indented, or have each line start with `>'. To quote a section of text, define a keyboard macro which inserts `>', put point and mark at opposite ends of the quoted section, and use -`\\[apply-macro-to-region-lines]' to mark the entire section. +\\[apply-macro-to-region-lines] to mark the entire section. Suppose you wanted to build a keyword table in C where each entry looked like this: @@ -19871,7 +19954,7 @@ and write a macro to massage a word into a table entry: \\C-x ) and then select the region of un-tablified names and use -`\\[apply-macro-to-region-lines]' to build the table from the names. +\\[apply-macro-to-region-lines] to build the table from the names. (fn TOP BOTTOM &optional MACRO)" t) (define-key ctl-x-map "q" 'kbd-macro-query) @@ -20033,18 +20116,18 @@ headers (those specified by `mail-abbrev-mode-regexp'), based on the entries in your `mail-personal-alias-file'. This is a global minor mode. If called interactively, toggle the -`Mail-Abbrevs mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Mail-Abbrevs mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='mail-abbrevs-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'mail-abbrevs-setup "mailabbrev" "\ @@ -20360,19 +20443,19 @@ The slave buffer is stored in the buffer-local variable `master-of'. You can set this variable using `master-set-slave'. You can show yourself the value of `master-of' by calling `master-show-slave'. -This is a minor mode. If called interactively, toggle the -`Master mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Master mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `master-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "master" '("master-")) @@ -20398,18 +20481,18 @@ recursion depth in the minibuffer prompt. This is only useful if This is a global minor mode. If called interactively, toggle the `Minibuffer-Depth-Indicate mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='minibuffer-depth-indicate-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "mb-depth" '("minibuffer-depth-")) @@ -20565,7 +20648,7 @@ Major mode for editing MetaPost sources. ;;; Generated autoloads from mh-e/mh-acros.el -(register-definition-prefixes "mh-acros" '("defmacro-mh" "defun-mh" "mh-" "with-mh-folder-updating")) +(register-definition-prefixes "mh-acros" '("mh-" "with-mh-folder-updating")) ;;; Generated autoloads from mh-e/mh-alias.el @@ -20855,18 +20938,18 @@ or call the function `midnight-mode'.") Non-nil means run `midnight-hook' at midnight. This is a global minor mode. If called interactively, toggle the -`Midnight mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Midnight mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='midnight-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'clean-buffer-list "midnight" "\ @@ -20910,19 +20993,19 @@ such that hitting RET would enter a non-default value, the prompt is modified to remove the default indication. This is a global minor mode. If called interactively, toggle the -`Minibuffer-Electric-Default mode' mode. If the prefix argument -is positive, enable the mode, and if it is zero or negative, -disable the mode. +`Minibuffer-Electric-Default mode' mode. If the prefix argument is +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='minibuffer-electric-default-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "minibuf-eldef" '("minibuf")) @@ -21440,19 +21523,19 @@ Toggle Msb mode. This mode overrides the binding(s) of `mouse-buffer-menu' to provide a different buffer menu using the function `msb'. -This is a global minor mode. If called interactively, toggle the -`Msb mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a global minor mode. If called interactively, toggle the `Msb +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='msb-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "msb" '("mouse-select-buffer" "msb")) @@ -21741,18 +21824,18 @@ or call the function `mouse-wheel-mode'.") Toggle mouse wheel support (Mouse Wheel mode). This is a global minor mode. If called interactively, toggle the -`Mouse-Wheel mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Mouse-Wheel mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='mouse-wheel-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "mwheel" '("mouse-wheel-" "mwheel-")) @@ -22763,7 +22846,7 @@ Coloring: ;;; Generated autoloads from org/org.el -(push (purecopy '(org 9 6 13)) package--builtin-versions) +(push (purecopy '(org 9 6 15)) package--builtin-versions) (autoload 'org-babel-do-load-languages "org" "\ Load the languages defined in `org-babel-load-languages'. @@ -23495,19 +23578,19 @@ Toggle Outline minor mode. See the command `outline-mode' for more information on this mode. -This is a minor mode. If called interactively, toggle the -`Outline minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Outline +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `outline-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'outline-search-level "outline" "\ @@ -24118,6 +24201,8 @@ FUN in `pred' and `app' can take one of the forms: call it with one argument (F ARG1 .. ARGn) call F with ARG1..ARGn and EXPVAL as n+1'th argument + (F ARG1 .. _ .. ARGn) + call F, passing EXPVAL at the _ position. FUN, BOOLEXP, and subsequent PAT can refer to variables bound earlier in the pattern by a SYMBOL pattern. @@ -24156,8 +24241,8 @@ As with `pcase-let', BINDINGS are of the form (PATTERN EXP), but the EXP in each binding in BINDINGS can use the results of the destructuring bindings that precede it in BINDINGS' order. -Each EXP should match (i.e. be of compatible structure) to its -respective PATTERN; a mismatch may signal an error or may go +Each EXP should match its respective PATTERN (i.e. be of structure +compatible to PATTERN); a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil. (fn BINDINGS &rest BODY)" nil t) @@ -24170,8 +24255,8 @@ All EXPs are evaluated first, and then used to perform destructuring bindings by matching each EXP against its respective PATTERN. Then BODY is evaluated with those bindings in effect. -Each EXP should match (i.e. be of compatible structure) to its -respective PATTERN; a mismatch may signal an error or may go +Each EXP should match its respective PATTERN (i.e. be of structure +compatible to PATTERN); a mismatch may signal an error or may go undetected, binding variables to arbitrary values, such as nil. (fn BINDINGS &rest BODY)" nil t) @@ -24772,11 +24857,6 @@ they are not by default assigned to keys." t) (defalias 'edit-picture 'picture-mode) (register-definition-prefixes "picture" '("picture-")) - -;;; Generated autoloads from language/pinyin.el - -(register-definition-prefixes "pinyin" '("pinyin-character-map")) - ;;; Generated autoloads from textmodes/pixel-fill.el @@ -24797,18 +24877,18 @@ or call the function `pixel-scroll-mode'.") A minor mode to scroll text pixel-by-pixel. This is a global minor mode. If called interactively, toggle the -`Pixel-Scroll mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Pixel-Scroll mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='pixel-scroll-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'pixel-scroll-precision-scroll-down-page "pixel-scroll" "\ @@ -24838,19 +24918,18 @@ When enabled, this minor mode allows you to scroll the display precisely, according to the turning of the mouse wheel. This is a global minor mode. If called interactively, toggle the -`Pixel-Scroll-Precision mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Pixel-Scroll-Precision mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='pixel-scroll-precision-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "pixel-scroll" '("pixel-")) @@ -25614,8 +25693,6 @@ requires quoting, e.g. `\\[quoted-insert]'. (fn REGEXP)" t) (autoload 'project-or-external-find-regexp "project" "\ Find all matches for REGEXP in the project roots or external roots. -With \\[universal-argument] prefix, you can specify the file name -pattern to search for. (fn REGEXP)" t) (autoload 'project-find-file "project" "\ @@ -25771,8 +25848,8 @@ Otherwise, `default-directory' is temporarily set to the current project's root. If OVERRIDING-MAP is non-nil, it will be used as -`overriding-local-map' to provide shorter bindings from that map -which will take priority over the global ones. +`overriding-terminal-local-map' to provide shorter bindings +from that map which will take priority over the global ones. (fn &optional OVERRIDING-MAP PROMPT-FORMAT)" t) (autoload 'project-prefix-or-any-command "project" "\ @@ -25822,7 +25899,7 @@ line and comments can also be enclosed in /* ... */. If an optional argument SYSTEM is non-nil, set up mode for the given system. To find out what version of Prolog mode you are running, enter -`\\[prolog-mode-version]'. +\\[prolog-mode-version]. Commands: \\{prolog-mode-map} @@ -26452,19 +26529,18 @@ or call the function `rcirc-track-minor-mode'.") Global minor mode for tracking activity in rcirc buffers. This is a global minor mode. If called interactively, toggle the -`Rcirc-Track minor mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Rcirc-Track minor mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='rcirc-track-minor-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "rcirc" '("rcirc-" "with-rcirc-")) @@ -26527,18 +26603,18 @@ buffers you switch to a lot, you can say something like the following: (add-hook \\='buffer-list-update-hook #\\='recentf-track-opened-file) This is a global minor mode. If called interactively, toggle the -`Recentf mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Recentf mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='recentf-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "recentf" '("recentf-")) @@ -26669,18 +26745,18 @@ Activates the region if it's inactive and Transient Mark mode is on. Only lasts until the region is next deactivated. This is a minor mode. If called interactively, toggle the -`Rectangle-Mark mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Rectangle-Mark mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `rectangle-mark-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "rect" '("apply-on-rectangle" "clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" "rectangle-" "spaces-string" "string-rectangle-")) @@ -26708,19 +26784,19 @@ auto-filling. For true \"word wrap\" behavior, use `visual-line-mode' instead. -This is a minor mode. If called interactively, toggle the -`Refill mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Refill mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `refill-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "refill" '("refill-")) @@ -26770,19 +26846,19 @@ on the menu bar. ------------------------------------------------------------------------------ -This is a minor mode. If called interactively, toggle the -`Reftex mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Reftex mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `reftex-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'reftex-reset-scanning-information "reftex" "\ @@ -27004,18 +27080,18 @@ keys for repeating. See `describe-repeat-maps' for a list of all repeatable commands. This is a global minor mode. If called interactively, toggle the -`Repeat mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Repeat mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='repeat-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'repeat-exit "repeat" "\ @@ -27091,19 +27167,19 @@ reveals invisible text around point. Also see the `reveal-auto-hide' variable. -This is a minor mode. If called interactively, toggle the -`Reveal mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Reveal mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `reveal-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar global-reveal-mode nil "\ @@ -27120,18 +27196,18 @@ Toggle Reveal mode in all buffers (Global Reveal mode). Reveal mode renders invisible text around point visible again. This is a global minor mode. If called interactively, toggle the -`Global Reveal mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Global Reveal mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-reveal-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "reveal" '("reveal-")) @@ -27674,19 +27750,19 @@ conventionally have a suffix of `.rnc'). The variable `rng-schema-locating-files' specifies files containing rules to use for finding the schema. -This is a minor mode. If called interactively, toggle the -`Rng-Validate mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Rng-Validate +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `rng-validate-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "rng-valid" '("rng-")) @@ -27800,19 +27876,19 @@ When ReST minor mode is enabled, the ReST mode keybindings are installed on top of the major mode bindings. Use this for modes derived from Text mode, like Mail mode. -This is a minor mode. If called interactively, toggle the `Rst -minor mode' mode. If the prefix argument is positive, enable the -mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Rst minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `rst-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "rst" '("rst-")) @@ -27860,19 +27936,19 @@ Use the command `ruler-mode' to change this variable.") (autoload 'ruler-mode "ruler-mode" "\ Toggle display of ruler in header line (Ruler mode). -This is a minor mode. If called interactively, toggle the `Ruler -mode' mode. If the prefix argument is positive, enable the mode, -and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Ruler mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `ruler-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "ruler-mode" '("ruler-")) @@ -28070,7 +28146,8 @@ For more details, see Info node `(elisp) Extending Rx'. (fn NAME [(ARGS...)] RX)" nil t) (function-put 'rx-define 'lisp-indent-function 'defun) -(eval-and-compile (defun rx--pcase-macroexpander (&rest regexps) "A pattern that matches strings against `rx' REGEXPS in sexp form. +(autoload 'rx--pcase-macroexpander "rx" "\ +A pattern that matches strings against `rx' REGEXPS in sexp form. REGEXPS are interpreted as in `rx'. The pattern matches any string that is a match for REGEXPS, as if by `string-match'. @@ -28084,7 +28161,9 @@ following constructs: (backref REF) matches whatever the submatch REF matched. REF can be a number, as usual, or a name introduced by a previous (let REF ...) - construct." (rx--pcase-expand regexps))) + construct. + +(fn &rest REGEXPS)") (define-symbol-prop 'rx--pcase-macroexpander 'edebug-form-spec 'nil) (define-symbol-prop 'rx 'pcase-macroexpander #'rx--pcase-macroexpander) (autoload 'rx--pcase-expand "rx" "\ @@ -28164,18 +28243,18 @@ Calling it at any other time replaces your current minibuffer histories, which is probably undesirable. This is a global minor mode. If called interactively, toggle the -`Savehist mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Savehist mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='savehist-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "savehist" '("savehist-")) @@ -28198,18 +28277,18 @@ This means when you visit a file, point goes to the last place where it was when you previously visited the same file. This is a global minor mode. If called interactively, toggle the -`Save-Place mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Save-Place mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='save-place-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'save-place-local-mode "saveplace" "\ @@ -28225,19 +28304,18 @@ file: (save-place-mode 1) This is a minor mode. If called interactively, toggle the -`Save-Place-Local mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Save-Place-Local mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `save-place-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "saveplace" '("save-place")) @@ -28324,18 +28402,18 @@ When Scroll-All mode is enabled, scrolling commands invoked in one window apply to all visible windows in the same frame. This is a global minor mode. If called interactively, toggle the -`Scroll-All mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Scroll-All mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='scroll-all-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "scroll-all" '("scroll-all-")) @@ -28359,19 +28437,19 @@ boundaries during scrolling. Note that the default key binding to `scroll' will not work on MS-Windows systems if `w32-scroll-lock-modifier' is non-nil. -This is a minor mode. If called interactively, toggle the -`Scroll-Lock mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Scroll-Lock +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `scroll-lock-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "scroll-lock" '("scroll-lock-")) @@ -28435,18 +28513,18 @@ Semantic mode. \\{semantic-mode-map} This is a global minor mode. If called interactively, toggle the -`Semantic mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Semantic mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='semantic-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "semantic" '("bovinate" "semantic-")) @@ -28755,18 +28833,18 @@ Server mode runs a process that accepts commands from the `server-start' for details. This is a global minor mode. If called interactively, toggle the -`Server mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Server mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='server-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'server-save-buffers-kill-terminal "server" "\ @@ -29107,6 +29185,10 @@ Make the shell buffer the current buffer, and return it. ;;; Generated autoloads from emacs-lisp/shortdoc.el +(autoload 'shortdoc--check "shortdoc" "\ + + +(fn GROUP FUNCTIONS)") (defvar shortdoc--groups nil) (defmacro define-short-documentation-group (group &rest functions) "\ Add GROUP to the list of defined documentation groups. @@ -29170,7 +29252,7 @@ execution of the documented form depends on some conditions. A FUNC form can have any number of `:no-eval' (or `:no-value'), `:no-eval*', `:result', `:result-string', `:eg-result' and -`:eg-result-string' properties." (declare (indent defun)) `(progn (setq shortdoc--groups (delq (assq ',group shortdoc--groups) shortdoc--groups)) (push (cons ',group ',functions) shortdoc--groups))) +`:eg-result-string' properties." (declare (indent defun)) (shortdoc--check group functions) `(progn (setq shortdoc--groups (delq (assq ',group shortdoc--groups) shortdoc--groups)) (push (cons ',group ',functions) shortdoc--groups))) (autoload 'shortdoc-display-group "shortdoc" "\ Pop to a buffer with short documentation summary for functions in GROUP. If FUNCTION is non-nil, place point on the entry for FUNCTION (if any). @@ -29435,19 +29517,19 @@ Minor mode to simplify editing output from the diff3 program. \\{smerge-mode-map} -This is a minor mode. If called interactively, toggle the -`SMerge mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `SMerge mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `smerge-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'smerge-start-session "smerge-mode" "\ @@ -29550,19 +29632,19 @@ with `so-long-variable-overrides'. This minor mode is a standard `so-long-action' option. -This is a minor mode. If called interactively, toggle the -`So-Long minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `So-Long +minor mode' mode. If the prefix argument is positive, enable the mode, +and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `so-long-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'so-long-mode "so-long" "\ @@ -29640,18 +29722,18 @@ Use \\[so-long-customize] to open the customization group `so-long' to configure the behavior. This is a global minor mode. If called interactively, toggle the -`Global So-Long mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Global So-Long mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-so-long-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "so-long" '("so-long-" "turn-o")) @@ -29888,6 +29970,24 @@ For example: to sort lines in the region by the first word on each line RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\\\=\\\" (fn REVERSE RECORD-REGEXP KEY-REGEXP BEG END)" t) +(autoload 'sort-on "sort" "\ +Sort SEQUENCE by calling PREDICATE on sort keys produced by ACCESSOR. +SEQUENCE should be the input sequence to sort. +Elements of SEQUENCE are sorted by keys which are obtained by +calling ACCESSOR on each element. ACCESSOR should be a function of +one argument, an element of SEQUENCE, and should return the key +value to be compared by PREDICATE for sorting the element. +PREDICATE is the function for comparing keys; it is called with two +arguments, the keys to compare, and should return non-nil if the +first key should sort before the second key. +The return value is always a new list. +This function has the performance advantage of evaluating +ACCESSOR only once for each element in the input SEQUENCE, and is +therefore appropriate when computing the key by ACCESSOR is an +expensive operation. This is known as the \"decorate-sort-undecorate\" +paradigm, or the Schwartzian transform. + +(fn SEQUENCE PREDICATE ACCESSOR)") (autoload 'sort-columns "sort" "\ Sort lines in region alphabetically by a certain range of columns. For the purpose of this command, the region BEG...END includes @@ -30667,18 +30767,18 @@ Encode/decode your strokes with \\[strokes-encode-buffer], \\{strokes-mode-map} This is a global minor mode. If called interactively, toggle the -`Strokes mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Strokes mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='strokes-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'strokes-decode-buffer "strokes" "\ @@ -30798,19 +30898,19 @@ called a `subword'. Here are some examples: This mode changes the definition of a word so that word commands treat nomenclature boundaries as word boundaries. -This is a minor mode. If called interactively, toggle the -`Subword mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Subword +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `subword-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-subword-mode 'globalized-minor-mode t) @@ -30847,19 +30947,19 @@ syntax are treated as parts of words: e.g., in `superword-mode', \\{superword-mode-map} -This is a minor mode. If called interactively, toggle the -`Superword mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Superword +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `superword-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-superword-mode 'globalized-minor-mode t) @@ -30951,18 +31051,18 @@ mouse to transfer text between Emacs and other programs which use GPM. This is due to limitations in GPM and the Linux kernel. This is a global minor mode. If called interactively, toggle the -`Gpm-Mouse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Gpm-Mouse mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='gpm-mouse-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "t-mouse" '("gpm-mouse-")) @@ -30973,19 +31073,19 @@ it is disabled. (autoload 'tab-line-mode "tab-line" "\ Toggle display of tab line in the windows displaying the current buffer. -This is a minor mode. If called interactively, toggle the -`Tab-Line mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Tab-Line +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `tab-line-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (defvar-local tab-line-exclude nil) @@ -31057,19 +31157,18 @@ variable's value can be toggled by \\[table-fixed-width-mode] at run-time. This is a minor mode. If called interactively, toggle the -`Table-Fixed-Width mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Table-Fixed-Width mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `table-fixed-width-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'table-insert "table" "\ @@ -31926,6 +32025,9 @@ such as if there are no commands in the file, the value of `tex-default-mode' says which mode to use. (fn)" t) + (add-to-list 'major-mode-remap-defaults '(TeX-mode . tex-mode)) + (add-to-list 'major-mode-remap-defaults '(plain-TeX-mode . plain-tex-mode)) + (add-to-list 'major-mode-remap-defaults '(LaTeX-mode . latex-mode)) (defalias 'TeX-mode #'tex-mode) (defalias 'plain-TeX-mode #'plain-tex-mode) (defalias 'LaTeX-mode #'latex-mode) @@ -32475,19 +32577,19 @@ When `tildify-mode' is enabled, if `tildify-string-alist' specifies a hard space representation for current major mode, the `tildify-space-string' buffer-local variable will be set to the representation. -This is a minor mode. If called interactively, toggle the -`Tildify mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Tildify +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `tildify-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "tildify" '("tildify-")) @@ -32523,25 +32625,25 @@ non-nil, the current day and date are displayed as well. This runs the normal hook `display-time-hook' after each update. This is a global minor mode. If called interactively, toggle the -`Display-Time mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Display-Time mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='display-time-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (define-obsolete-function-alias 'display-time-world #'world-clock "28.1") (autoload 'world-clock "time" "\ Display a world clock buffer with times in various time zones. The variable `world-clock-list' specifies which time zones to use. -To turn off the world time display, go to the window and type `\\[quit-window]'." t) +To turn off the world time display, go to the window and type \\[quit-window]." t) (autoload 'emacs-uptime "time" "\ Return a string giving the uptime of this instance of Emacs. FORMAT is a string to format the result, using `format-seconds'. @@ -32822,21 +32924,16 @@ List all timers in a buffer. ;;; Generated autoloads from international/titdic-cnv.el (autoload 'titdic-convert "titdic-cnv" "\ -Convert a TIT dictionary of FILENAME into a Quail package. -Optional argument DIRNAME if specified is the directory name under which -the generated Quail package is saved. -(fn FILENAME &optional DIRNAME)" t) + +(fn FILENAME &optional DIRNAME)") +(make-obsolete 'titdic-convert 'tit-dic-convert "30.1") (autoload 'batch-titdic-convert "titdic-cnv" "\ -Run `titdic-convert' on the files remaining on the command line. -Use this from the command line, with `-batch'; -it won't work in an interactive Emacs. -For example, invoke \"emacs -batch -f batch-titdic-convert XXX.tit\" to - generate Quail package file \"xxx.el\" from TIT dictionary file \"XXX.tit\". -To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\". + (fn &optional FORCE)") -(register-definition-prefixes "titdic-cnv" '("batch-miscdic-convert" "ctlau-" "miscdic-convert" "pinyin-convert" "py-converter" "quail-" "quick-" "tit-" "tsang-" "ziranma-converter")) +(make-obsolete 'batch-titdic-convert 'batch-tit-dic-convert "30.1") +(register-definition-prefixes "titdic-cnv" '("batch-tit-" "tit-")) ;;; Generated autoloads from tmm.el @@ -32914,7 +33011,7 @@ current (i.e., last displayed) category. In Todo mode just the category's unfinished todo items are shown by default. The done items are hidden, but typing -`\\[todo-toggle-view-done-items]' displays them below the todo +\\[todo-toggle-view-done-items] displays them below the todo items. With non-nil user option `todo-show-with-done' both todo and done items are always shown on visiting a category. @@ -33012,6 +33109,61 @@ holds a keymap. (register-definition-prefixes "tooltip" '("tooltip-")) + +;;; Generated autoloads from touch-screen.el + +(autoload 'touch-screen-hold "touch-screen" "\ +Handle a long press EVENT. +Ding and select the window at EVENT, then activate the mark. If +`touch-screen-word-select' is enabled, try to select the whole +word around EVENT; otherwise, set point to the location of EVENT. + +(fn EVENT)" t) +(autoload 'touch-screen-track-tap "touch-screen" "\ +Track a single tap starting from EVENT. +EVENT should be a `touchscreen-begin' event. + +Read touch screen events until a `touchscreen-end' event is +received with the same ID as in EVENT. If UPDATE is non-nil and +a `touchscreen-update' event is received in the mean time and +contains a touch point with the same ID as in EVENT, call UPDATE +with that event and DATA. + +If THRESHOLD is non-nil, enforce a threshold of movement that is +either itself or 10 pixels when it is not a number. If the +aforementioned touch point moves beyond that threshold on any +axis, return nil immediately, and further resume mouse event +translation for the touch point at hand. + +Return nil immediately if any other kind of event is received; +otherwise, return t once the `touchscreen-end' event arrives. + +(fn EVENT &optional UPDATE DATA THRESHOLD)") +(autoload 'touch-screen-track-drag "touch-screen" "\ +Track a single drag starting from EVENT. +EVENT should be a `touchscreen-begin' event. + +Read touch screen events until a `touchscreen-end' event is +received with the same ID as in EVENT. For each +`touchscreen-update' event received in the mean time containing a +touch point with the same ID as in EVENT, call UPDATE with the +touch point in event and DATA, once the touch point has moved +significantly by at least 5 pixels from where it was in EVENT. + +Return nil immediately if any other kind of event is received; +otherwise, return either t or `no-drag' once the +`touchscreen-end' event arrives; return `no-drag' returned if the +touch point in EVENT did not move significantly, and t otherwise. + +(fn EVENT UPDATE &optional DATA)") +(autoload 'touch-screen-inhibit-drag "touch-screen" "\ +Inhibit subsequent `touchscreen-drag' events from being sent. +Prevent `touchscreen-drag' and translated mouse events from being +sent until the touch sequence currently being translated ends. +Must be called from a command bound to a `touchscreen-hold' or +`touchscreen-drag' event.") +(register-definition-prefixes "touch-screen" '("touch-screen-")) + ;;; Generated autoloads from emacs-lisp/tq.el @@ -33224,55 +33376,13 @@ Add archive file name handler to `file-name-handler-alist'." (when (and tramp-ar ;;; Generated autoloads from net/trampver.el -(push (purecopy '(tramp 2 7 0 -1)) package--builtin-versions) +(push (purecopy '(tramp 2 7 1 -1)) package--builtin-versions) (register-definition-prefixes "trampver" '("tramp-")) ;;; Generated autoloads from transient.el (push (purecopy '(transient 0 5 2)) package--builtin-versions) -(autoload 'transient-define-prefix "transient" "\ -Define NAME as a transient prefix command. - -ARGLIST are the arguments that command takes. -DOCSTRING is the documentation string and is optional. - -These arguments can optionally be followed by key-value pairs. -Each key has to be a keyword symbol, either `:class' or a keyword -argument supported by the constructor of that class. The -`transient-prefix' class is used if the class is not specified -explicitly. - -GROUPs add key bindings for infix and suffix commands and specify -how these bindings are presented in the popup buffer. At least -one GROUP has to be specified. See info node `(transient)Binding -Suffix and Infix Commands'. - -The BODY is optional. If it is omitted, then ARGLIST is also -ignored and the function definition becomes: - - (lambda () - (interactive) - (transient-setup \\='NAME)) - -If BODY is specified, then it must begin with an `interactive' -form that matches ARGLIST, and it must call `transient-setup'. -It may however call that function only when some condition is -satisfied; that is one of the reason why you might want to use -an explicit BODY. - -All transients have a (possibly nil) value, which is exported -when suffix commands are called, so that they can consume that -value. For some transients it might be necessary to have a sort -of secondary value, called a scope. Such a scope would usually -be set in the commands `interactive' form and has to be passed -to the setup function: - - (transient-setup \\='NAME nil nil :scope SCOPE) - -(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])" nil t) -(function-put 'transient-define-prefix 'lisp-indent-function 'defun) -(function-put 'transient-define-prefix 'doc-string-elt 3) (autoload 'transient-insert-suffix "transient" "\ Insert a SUFFIX into PREFIX before LOC. PREFIX is a prefix command, a symbol. @@ -33517,18 +33627,18 @@ sessions and after a crash. Manual changes to the file may result in problems. This is a global minor mode. If called interactively, toggle the -`Type-Break mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Type-Break mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='type-break-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'type-break "type-break" "\ @@ -33914,18 +34024,18 @@ and `C-x C-f https://www.gnu.org/ RET' will give you the HTML at that URL in a buffer. This is a global minor mode. If called interactively, toggle the -`Url-Handler mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Url-Handler mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='url-handler-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'url-file-handler "url-handlers" "\ @@ -34012,10 +34122,7 @@ URL can be a URL string, or a URL record of the type returned by ;;; Generated autoloads from url/url-mailto.el -(autoload 'url-mail "url-mailto" "\ - - -(fn &rest ARGS)" t) +(defalias 'url-mail #'message-mail) (autoload 'url-mailto "url-mailto" "\ Handle the mailto: URL syntax. @@ -34478,7 +34585,6 @@ Normalize arguments to delight. ;;; Generated autoloads from use-package/use-package-ensure-system-package.el -(push (purecopy '(use-package-ensure-system-package 0 2)) package--builtin-versions) (autoload 'use-package-normalize/:ensure-system-package "use-package-ensure-system-package" "\ Turn ARGS into a list of conses of the form (PACKAGE-NAME . INSTALL-COMMAND). @@ -35192,6 +35298,25 @@ case, and the process object in the asynchronous case. (progn (load "vc-git" nil t) (vc-git-registered file)))) +(autoload 'vc-git-grep "vc-git" "\ +Run git grep, searching for REGEXP in FILES in directory DIR. +The search is limited to file names matching shell pattern FILES. +FILES may use abbreviations defined in `grep-files-aliases', e.g. +entering `ch' is equivalent to `*.[ch]'. As whitespace triggers +completion when entering a pattern, including it requires +quoting, e.g. `\\[quoted-insert]'. + +With \\[universal-argument] prefix, you can edit the constructed shell command line +before it is executed. +With two \\[universal-argument] prefixes, directly edit and run `grep-command'. + +Collect output in a buffer. While git grep runs asynchronously, you +can use \\[next-error] (`next-error'), or \\\\[compile-goto-error] in the grep output buffer, +to go to the lines where grep found matches. + +This command shares argument histories with \\[rgrep] and \\[grep]. + +(fn REGEXP &optional FILES DIR)" t) (register-definition-prefixes "vc-git" '("vc-")) @@ -35317,7 +35442,7 @@ Key bindings: ;;; Generated autoloads from progmodes/verilog-mode.el -(push (purecopy '(verilog-mode 2023 6 6 141322628)) package--builtin-versions) +(push (purecopy '(verilog-mode 2024 3 1 121933719)) package--builtin-versions) (autoload 'verilog-mode "verilog-mode" "\ Major mode for editing Verilog code. \\ @@ -35592,7 +35717,7 @@ Usage: according to option `vhdl-argument-list-indent'. If option `vhdl-indent-tabs-mode' is nil, spaces are used instead of - tabs. `\\[tabify]' and `\\[untabify]' allow the conversion of spaces to + tabs. \\[tabify] and \\[untabify] allow the conversion of spaces to tabs and vice versa. Syntax-based indentation can be very slow in large files. Option @@ -35903,7 +36028,7 @@ Usage: `vhdl-highlight-translate-off' is non-nil. For documentation and customization of the used colors see - customization group `vhdl-highlight-faces' (`\\[customize-group]'). For + customization group `vhdl-highlight-faces' (\\[customize-group]). For highlighting of matching parenthesis, see customization group `paren-showing'. Automatic buffer highlighting is turned on/off by option `global-font-lock-mode' (`font-lock-auto-fontify' in XEmacs). @@ -35963,14 +36088,14 @@ Usage: sessions using the \"Save Options\" menu entry. Options and their detailed descriptions can also be accessed by using - the \"Customize\" menu entry or the command `\\[customize-option]' - (`\\[customize-group]' for groups). Some customizations only take effect + the \"Customize\" menu entry or the command \\[customize-option] + (\\[customize-group] for groups). Some customizations only take effect after some action (read the NOTE in the option documentation). Customization can also be done globally (i.e. site-wide, read the INSTALL file). Not all options are described in this documentation, so go and see - what other useful user options there are (`\\[vhdl-customize]' or menu)! + what other useful user options there are (\\[vhdl-customize] or menu)! FILE EXTENSIONS: @@ -35999,7 +36124,7 @@ Usage: Maintenance: ------------ -To submit a bug report, enter `\\[vhdl-submit-bug-report]' within VHDL Mode. +To submit a bug report, enter \\[vhdl-submit-bug-report] within VHDL Mode. Add a description of the problem and include a reproducible test case. Questions and enhancement requests can be sent to . @@ -36264,19 +36389,19 @@ then \\[View-leave], \\[View-quit] and \\[View-kill-and-leave] will return to th Entry to view-mode runs the normal hook `view-mode-hook'. -This is a minor mode. If called interactively, toggle the `View -mode' mode. If the prefix argument is positive, enable the mode, -and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `View mode' +mode. If the prefix argument is positive, enable the mode, and if it is +zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `view-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'view-mode-enter "view" "\ @@ -36350,6 +36475,57 @@ Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'." t) (register-definition-prefixes "quail/viqr" '("viet-quail-define-rules")) + +;;; Generated autoloads from visual-wrap.el + +(autoload 'visual-wrap-prefix-mode "visual-wrap" "\ +Display continuation lines with prefixes from surrounding context. + +To enable this minor mode across all buffers, enable +`global-visual-wrap-prefix-mode'. + +This is a minor mode. If called interactively, toggle the +`Visual-Wrap-Prefix mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. + +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. + +To check whether the minor mode is enabled in the current buffer, +evaluate `visual-wrap-prefix-mode'. + +The mode's hook is called both when the mode is enabled and when it is +disabled. + +(fn &optional ARG)" t) +(put 'global-visual-wrap-prefix-mode 'globalized-minor-mode t) +(defvar global-visual-wrap-prefix-mode nil "\ +Non-nil if Global Visual-Wrap-Prefix mode is enabled. +See the `global-visual-wrap-prefix-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-visual-wrap-prefix-mode'.") +(custom-autoload 'global-visual-wrap-prefix-mode "visual-wrap" nil) +(autoload 'global-visual-wrap-prefix-mode "visual-wrap" "\ +Toggle Visual-Wrap-Prefix mode in all buffers. +With prefix ARG, enable Global Visual-Wrap-Prefix mode if ARG is +positive; otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Visual-Wrap-Prefix mode is enabled in all buffers where +`visual-wrap-prefix-mode' would do it. + +See `visual-wrap-prefix-mode' for more information on +Visual-Wrap-Prefix mode. + +(fn &optional ARG)" t) +(register-definition-prefixes "visual-wrap" '("visual-wrap-")) + ;;; Generated autoloads from emacs-lisp/vtable.el @@ -36532,18 +36708,18 @@ current function name is continuously displayed in the mode line, in certain major modes. This is a global minor mode. If called interactively, toggle the -`Which-Function mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Which-Function mode' mode. If the prefix argument is positive, enable +the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='which-function-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "which-func" '("which-func")) @@ -36561,19 +36737,19 @@ See also `whitespace-style', `whitespace-newline' and This mode uses a number of faces to visualize the whitespace; see the customization group `whitespace' for details. -This is a minor mode. If called interactively, toggle the -`Whitespace mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Whitespace +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `whitespace-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'whitespace-newline-mode "whitespace" "\ @@ -36587,19 +36763,18 @@ use `whitespace-mode'. See also `whitespace-newline' and `whitespace-display-mappings'. This is a minor mode. If called interactively, toggle the -`Whitespace-Newline mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Whitespace-Newline mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `whitespace-newline-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-whitespace-mode 'globalized-minor-mode t) @@ -36646,18 +36821,18 @@ See also `whitespace-newline' and `whitespace-display-mappings'. This is a global minor mode. If called interactively, toggle the `Global Whitespace-Newline mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +positive, enable the mode, and if it is zero or negative, disable the +mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='global-whitespace-newline-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'whitespace-toggle-options "whitespace" "\ @@ -36961,19 +37136,19 @@ Show widget browser for WIDGET in other window. (autoload 'widget-minor-mode "wid-browse" "\ Minor mode for traversing widgets. -This is a minor mode. If called interactively, toggle the -`Widget minor mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +This is a minor mode. If called interactively, toggle the `Widget minor +mode' mode. If the prefix argument is positive, enable the mode, and if +it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `widget-minor-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "wid-browse" '("widget-")) @@ -37068,18 +37243,18 @@ for a description of this minor mode.") Global minor mode for default windmove commands. This is a global minor mode. If called interactively, toggle the -`Windmove mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Windmove mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='windmove-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (autoload 'windmove-default-keybindings "windmove" "\ @@ -37215,18 +37390,18 @@ sequence \\`C-c '. If you change your mind (while undoing), you can press \\`C-c ' (calling `winner-redo'). This is a global minor mode. If called interactively, toggle the -`Winner mode' mode. If the prefix argument is positive, enable -the mode, and if it is zero or negative, disable the mode. +`Winner mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='winner-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "winner" '("winner-")) @@ -37294,19 +37469,18 @@ Allow `word-wrap' to fold on all breaking whitespace characters. The characters to break on are defined by `word-wrap-whitespace-characters'. This is a minor mode. If called interactively, toggle the -`Word-Wrap-Whitespace mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. +`Word-Wrap-Whitespace mode' mode. If the prefix argument is positive, +enable the mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `word-wrap-whitespace-mode'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (put 'global-word-wrap-whitespace-mode 'globalized-minor-mode t) @@ -37557,18 +37731,18 @@ mouse functionality for such clicks is still available by holding down the SHIFT key while pressing the mouse button. This is a global minor mode. If called interactively, toggle the -`Xterm-Mouse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. +`Xterm-Mouse mode' mode. If the prefix argument is positive, enable the +mode, and if it is zero or negative, disable the mode. -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. +If called from Lisp, toggle the mode if ARG is `toggle'. Enable the +mode if ARG is nil, omitted, or is a positive number. Disable the mode +if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `(default-value \\='xterm-mouse-mode)'. -The mode's hook is called both when the mode is enabled and when -it is disabled. +The mode's hook is called both when the mode is enabled and when it is +disabled. (fn &optional ARG)" t) (register-definition-prefixes "xt-mouse" '("turn-o" "xt-mouse-epoch" "xterm-mouse-")) @@ -37652,99 +37826,9 @@ run a specific program. The program must be a member of (register-definition-prefixes "zone" '("zone-")) -;;; Generated autoloads from emacs-lisp/ert-font-lock.el +;;; Generated autoloads from net/tramp-androidsu.el -(autoload 'ert-font-lock-deftest "ert-font-lock" "\ -Define test NAME (a symbol) using assertions from TEST-STR. - -Other than MAJOR-MODE and TEST-STR parameters, this macro accepts -the same parameters and keywords as `ert-deftest' and is intended -to be 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 3) -(function-put 'ert-font-lock-deftest 'lisp-indent-function 2) -(autoload 'ert-font-lock-deftest-file "ert-font-lock" "\ -Define test NAME (a symbol) using assertions from FILE. - -FILE - path to a file with assertions in ERT resource director as -return by `ert-resource-directory'. - -Other than MAJOR-MODE and FILE parameters, this macro accepts the -same parameters and keywords as `ert-deftest' and is intended to -be used 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 3) -(function-put 'ert-font-lock-deftest-file 'lisp-indent-function 2) -(autoload 'ert-font-lock-test-string "ert-font-lock" "\ -Check font faces in TEST-STRING set by MODE. - -The function is meant to be run from within an ERT test. - -(fn TEST-STRING MODE)") -(autoload 'ert-font-lock-test-file "ert-font-lock" "\ -Check font faces in FILENAME set by MODE. - -The function is meant to be run from within an ERT test. - -(fn FILENAME MODE)") -(register-definition-prefixes "ert-font-lock" '("ert-font-lock--")) - - -;;; Generated autoloads from touch-screen.el - -(autoload 'touch-screen-hold "touch-screen" "\ -Handle a long press EVENT. -Ding and select the window at EVENT, then activate the mark. If -`touch-screen-word-select' is enabled, try to select the whole -word around EVENT; otherwise, set point to the location of EVENT. - -(fn EVENT)" t) -(autoload 'touch-screen-track-tap "touch-screen" "\ -Track a single tap starting from EVENT. -EVENT should be a `touchscreen-begin' event. - -Read touch screen events until a `touchscreen-end' event is -received with the same ID as in EVENT. If UPDATE is non-nil and -a `touchscreen-update' event is received in the mean time and -contains a touch point with the same ID as in EVENT, call UPDATE -with that event and DATA. - -If THRESHOLD is non-nil, enforce a threshold of movement that is -either itself or 10 pixels when it is not a number. If the -aforementioned touch point moves beyond that threshold on any -axis, return nil immediately, and further resume mouse event -translation for the touch point at hand. - -Return nil immediately if any other kind of event is received; -otherwise, return t once the `touchscreen-end' event arrives. - -(fn EVENT &optional UPDATE DATA THRESHOLD)") -(autoload 'touch-screen-track-drag "touch-screen" "\ -Track a single drag starting from EVENT. -EVENT should be a `touchscreen-begin' event. - -Read touch screen events until a `touchscreen-end' event is -received with the same ID as in EVENT. For each -`touchscreen-update' event received in the mean time containing a -touch point with the same ID as in EVENT, call UPDATE with the -touch point in event and DATA, once the touch point has moved -significantly by at least 5 pixels from where it was in EVENT. - -Return nil immediately if any other kind of event is received; -otherwise, return either t or `no-drag' once the -`touchscreen-end' event arrives; return `no-drag' returned if the -touch point in EVENT did not move significantly, and t otherwise. - -(fn EVENT UPDATE &optional DATA)") -(autoload 'touch-screen-inhibit-drag "touch-screen" "\ -Inhibit subsequent `touchscreen-drag' events from being sent. -Prevent `touchscreen-drag' and translated mouse events from being -sent until the touch sequence currently being translated ends. -Must be called from a command bound to a `touchscreen-hold' or -`touchscreen-drag' event.") -(register-definition-prefixes "touch-screen" '("touch-screen-")) +(register-definition-prefixes "tramp-androidsu" '("tramp-androidsu-")) ;;; End of scraped data @@ -37754,8 +37838,8 @@ Must be called from a command bound to a `touchscreen-hold' or ;; Local Variables: ;; version-control: never ;; no-update-autoloads: t -;; no-byte-compile: t ;; no-native-compile: t +;; no-byte-compile: t ;; coding: utf-8-emacs-unix ;; End: From cc2579c10bc67dc375247490bb55367ef0800435 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sat, 9 Mar 2024 16:13:47 +0100 Subject: [PATCH 441/446] * 'syncdoc-type-hierarchy.el' update due to recent changes * admin/syncdoc-type-hierarchy.el (syncdoc-all-types): Update. --- admin/syncdoc-type-hierarchy.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/admin/syncdoc-type-hierarchy.el b/admin/syncdoc-type-hierarchy.el index b5cfdfd8e74..e14d7fb54e1 100644 --- a/admin/syncdoc-type-hierarchy.el +++ b/admin/syncdoc-type-hierarchy.el @@ -47,10 +47,6 @@ (defconst syncdoc-all-types (let (res) - (maphash (lambda (type _) - (push type res)) - cl--direct-supertypes-of-type) - (mapatoms (lambda (type) (when (cl-find-class type) (push type res))) From 3be70a13d7b27ccdffbd4efb44752d15376d5e57 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Sat, 9 Mar 2024 16:14:14 +0100 Subject: [PATCH 442/446] Run 'syncdoc-update-type-hierarchy'. * doc/lispref/elisp_type_hierarchy.jpg: Update. * doc/lispref/elisp_type_hierarchy.txt: Likewise. --- doc/lispref/elisp_type_hierarchy.jpg | Bin 358752 -> 345570 bytes doc/lispref/elisp_type_hierarchy.txt | 40 +++++++++++++++------------ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/doc/lispref/elisp_type_hierarchy.jpg b/doc/lispref/elisp_type_hierarchy.jpg index 518255566b9fbb02a8dc2d4deb325ace974e40fa..a2e14490dfa39d70473f9624c68b69aad5528297 100644 GIT binary patch literal 345570 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

  • h)gH8@dLN8ZH$W%j7 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%0ATgdf7lQIwr7l)e$7v{Ii+D$ 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

    _H_gC-~OAsU6%v|=0eQXhXeKs(_c!@ zx0al+q|)|-J~~yuuYU|U+Jx$P+!YyQ5m!-Im@R}e7pj@zihB76vQ;A%ACLB~ zgLWHRYlXYFfgq}TEmTH>aw&Js5ATniDATT3%2zO5>0nx^rNM(DPaz$zCd=)W*Pd!w}{^F+n zlY>mUr^uI9oQ>eFq}ct6ceosUp4>(?u7!_^Dg?9n&A4kro_1d4oQF1%Wx0oU3Rsa} zWW^M;f&DISRmE*J3IR&0#+&wEej~PSt5uqGB*8JA0*Nf#mN7q$OVwC@OSh#V`&tEmo1MmD_QQ;`Hc~UT3<`;OUunmxvrE#Vb zMY;BBD3+dW94? z{#F$XK$W%98L4S`ZUBWxrN8~+bG-Sa z5hp9T=U2y-Z>-Q;qC7*uyd(RPt^dw53&SzHUqFtnOJz3f?zfCKCEMF$fmDIMkAE~STe1zwB)?xt5g1V_0|#yi|t)OduWZc#`Oq% zPKG*w-{xNzt95MAz@rFnziaEb7#yoKI%R%W?t=d{G#HhCc;}+G8FtD6h71+YuQSs8 zYF_j5sqx%yw|RX$z{HKUdtd!0hWP5crT)>Lo4U#A=SBCbvDZyw(PBae-M+o6∋p?^sB+9QJ?rK7?$k58c8 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 z ze5C6W;qys3rD>RLJW)jed5@ z-z7TfCao0z>n^EP`J3LCO*JG#j`>p6Q%zP`oqlx-V3vE!G=%oy?7aHdAl zjtr~LSDR(P-<*V7=~PNdNEdXh}rjmR@Prl?NC9HqCMEYR#_)dSp zlRlv_&4G<|am#Ri+aDsIP;8oE03-Sn`H!a;vkc~HP;VolRs_SgJAas76 zy<%qxagk(X3SThVZzwIE9=4g8m3GHE`RgM>JBQ!M$Ro=yU0Ugm9H6b3ZJ1fvQD>JI zY$=J+x9Yu*Nq?g;l7vdmR1Ul4z%Kc?rv{OW_a9P?e^4^SS$4DGQZM&jag(3? z?QuSB8g7w!mrK2~f}&0CUFeia4Rca6>%#%V*Tv=UNawSkT=1aH=hP$n&;-4=pC?PY+)s#7JL;Hq%S(wYhLv+EZ5hh`wpITICQZE5R74loZts>@v?@ z&>)Y@++j&jACJ4waSbEZNmU-O5Hm|{!@nOqYNZlQrX2|=10-qu=<4ky zncz~!_&h5)NsNr5b(%)jsO>AGk59s_B0a31-AQKOyqHZ9$-I5Lhdj4CFiyA7uRunD zJ%P}f|0$n({oxe>OhG33a~0$~Jq61uji${;eW>77%z8=Xx;UlE0K;gzZQy{)D+ZTK zPeb^|x-Rh*u<2q^fo9*l`GcHVDh7{L+$|Z)ezg`4I#es(F7|y@6Wz^iA8w0kdax!* zfQTS?IB$+(P=+l#{oCy;)qpKYkh<){o ze4+Zo(%Zw-aFzbgo76A0=^@;oNCx5{3p;{Z+Fvm7jfOk9_Kx!(*Aatv2nAO;Z&+M9 zdojA}7N@UBCsO=dH^LG}(}ZpJH4tOJE@ggXEGlDWUEz=%IC17GEnf$zuclN(J{VvB zV^%E$`ADB13`PDiVivds{$p6}pCTU=oBtvH7PJkHGxY~cU{6fXf+i&VkIUbQIk6;| zaqYs6F99ml$%N(~V|0PTrEwu3nNtIDh%A_fQJmP+osf+|!Jp`!L_GgzF!TTOr*_So z-Ss8ahkt#MjRRuc{#80JYcX+r(r&!&p|CI9io`x z>5lcUB`Fz#Tl9zKmfcN|!83D=kls4XVi;cKxYAbwK1A^?zpezNU{l2CNPezxOuuTw z1BpqW3sLLTo=Dp?8_ChwJ!E=V(|&cZ8=bPj_AMEjd%Io~(*Qg16t`vy-j&iQ>R$|A zSck`ZE{eZ0p7%`l8<#)$8fq^ORlqwo_PBazi3o(*yWMsxkBvm-RleVS0c&$2h3GXa z!5zsr@+9^8(!SjHRh?J-Lssr*5QH$ygZVliQ1sifJARL?O2{v*Eun4Z8jG+g;1-y> z8J3PcW6=ST8tbclR^fGS>Twx9VpdRjPQEU0IA7sbQzQt<5)9q=7)uB+nL{e6*fBt;n zVh|VNT04pSTD|it)LTi#jYQNDQv&V0P_OCSLt&AD&zJ&+-*l{TjNhNOho)D|2g5;KtU>X>6BECH&g$y#&kVZ z64l6Zt|w;uo&b{6p7mS%W>SX(F*TA7T_Wdp?n~rnaoVRJ~KEb3{m-&Gq5uJN2GEk8k@e zU3~=9hgq(xjamav@eeJ$kcd3O1FlEKd|c=!I=Bnx%WzZ7mCDOJm*1f;Bl zv*-o=cal^mLUG<;$a;wu{g|yw?A{g3W;^j)az$yC?)lFxy04WjIDOp6cJgy(OKdd^ zp+Td2sd6DM=aW3hXcZm$zCHR-z7QNl2^nENa9kyKE`jLt&k}f^E6kc)zGG|n(xT-S z)2nb(id`~GJMXn8;k$!+uwZ0h3An^fD};r*g(ewTtTXKBF1lO|yhwu5tb6mQUr?O# zg&+cXPJ=~u(1&YB{6&Qc&CEJR`gD?o<1C8ywD0Jx(Q87OTRnadzfqqJ3SjZPr4Mq7 zOqOr{ay`t)fiN|@=iM{)P>_J6?;aNByIE6HUT$WP{s@|#$5MC2Rhfm#x?ps?4d&Y+ zDR`jFJW!T+3L71T071f!y{jijOzO8X$S^xM6yeO_XCk@T87^Lf`Xrw>CtgqwDG)0> zXFK$qFcdcdzp(c4qt>$3FHe^&uMU$7%Axyl2EtdNScWt8c-#s7b-w$JP+=Fc`@-se zyL$tI^Xpsm{kx=eyXJbvFKAM?6U6+BZFOl87L;%EUzrIm);!ENX%w$} zlfnRZAgC!nt%P5>B(^C_p#*Ij2D}4BJ>C}gBfR&8gbP|oxSm3v+bxSSivCns8B=A! zPY})np^)c?DfYrWVQC7P2L2)~XRR+SEI2rHwN{I8M{OC3k+dHxL@Z)gt$IZaN^?K# zOe@TDeQHOY!Q5Nr3cC_!9(E@Ml9QTDnp~i*g^xeh43ZvO)>Bse4KZV)upwR%LmVBL zz#&iZ9olfNhPdV(w_ndnqS{+^F0(yAP2JV)q|q>8lkYESY8g|vnr7ZAl_y3A%%OH# zvBY4hBkx?g2(M=WqGeuRSTfBt^D6U714POT1q=ytR{7$EGCNT;p+1PVFri>|8W0&XJ z5J2l~ATlaPTda8L@omQ0#d-9;;E2i^XBOO|wTXto1bTq%7nq~yCwPESl^2ot+T4r)!L@HyWaQ?bfh3EZm1NU~4F zFhw=um&YuS$gFycFU4_luwXtYI51*uTx6^#sW6MbA$Ds&%FK?v_EB>sf82G)WL#W+ z8p;J^77}Ep)NZ4ut_1_U6joGY;UtQj9kVsw)qtr#M5o^CKF%V|&00)kv-%m;aYz4*{+1A0P{+JhY0o8U}ZD^NdB)R{pE)2_e3XQ3{txm~LHezW_ zUgb1K^^{`yI&c+B0&eFSOYy?w9rQ_6qyC>Sntee36l1ROa%nVi_0ZIryp>V)M7G!* zWLP+`Hp*gu+$rF*9V)OEe$hka+h87g1pm@RHpC*>ue+4=&kU$BwxnMmW($vUXLs4yv^sE4}O?QDR_d{>d1@V#gcK z+^QGx9sRS1tVCbL9!Jq=-~Qxlopd@t#bdpMBtWv*9~x0Y&XBX97JBD{;uyV8lh z^sF$4h0yZYJ^kW_MX7aKiHV#WIcH=@j79+|c8ex0WAJ&*ssr$InfV#j>%J4{6~ zd~OJ!%|yCxdIK~**0p_6iJfa;eYOIs(Z+?qpvznrTM6C~fJskSyIo$6I+|5_dSdQ+ z0y~FhlJj$Pb z{7nU5KUpXK=UV>-H5-PTQ3Dl4erG0Yxu5vjO}SrW84enUTB{jN}GFA5qlZ;#RdDr3~D<}LbI=C|sT|hWznhr}y$6Bf@Ivvf-N;$p@OSE2~rKP;Aml zFRFDfx^Nh6Q1WpEC8h@w@&IQ`pq^fa8ZfP~g(B;oCJf6Xuh6(>-4Qh#FjQU$i zD$n*v*R^nc={H2jh3q479>_en^#1)#e5XPAu@8l#Jf)IOyna8tL3EWdf`o7Y^xAnH z=u57eLqL65;>1-{i-yHG0t4?qF}S=Z$=i=?3$=<3JLOPYZ-JK~@=`r+VWykjB)r*a z@h!AP`!5OU9uUt6q2~G<{At}KK4&X&$fbx}PFuBy1BTOVBT!Fu<71P)nU!D*K|Gqpwz5i zhJ9v&10mO;QlcKZv~fQ1c_#7n2mtFu(P0(?b!OC7(*D_ru{SeE;PqRT5J7;}>18CH zTdg9pHOHlNymTYB1II5ruQboC*k$L!Bk`eLdAbG!b$*TW9*+A)%V+Id1J|?IA*9LK z|BP{Row8%hL~d}i(C%qjd8oz0$M4tC4z2}HT)UR^4?Ou(#%)wxnTE*53~64iOTvyx zRQHq5R~7A|7_6iz19t_rC(p)jHdH(1?}RzDVi^Dwcc!j9H(~M$?h^6gnt9qATc(~L zQCu{5dIG<>Di#xx%*U$t5pL7DpB64s3)l^gza(d^NICI^j|Xn`)bM%Tb09m=%24^82$)mrnG+K>FtB;@XQ=Pr`s`ry z43@d8t(Xq2cbSCaCtyT?en=>tJ(?8ohO;O%EtOr$Fk{bl7<<%VQP~z^W|m8CXvg}9x)I_Ly>c1wGc-r)v>{x zOZeh;>-QIk^P()&HNp#lACltN$GTKkou7wd&n+>mSMdfpCDFEQWSZo5FkLXJ;1lER zoqKsRDJ%bxQWyi>os`h)uYD-e&DTsBdP@)JZO87LG!t_+DXcQlgprH>(EGDK5>^GO z)*Qlpu6?^}UfLwz-aHPWC)p5_N6ocaqhKzvg@<0UB6*p;Wr8QgoHL(D$(4fZ7~w}KW8W3SqQx< z#6=8JqGz%cBqn(4f(NLWhQYBrq?+^-qks>a$v$gDnH#35`C4pE$_~7PrJO^2@Ic z&rl0#71QMkZKRbWePZnV@?{c-x^EeaiaHK#e@X4WSZxKzrSd;#e*M{>c^i&K#aLp@ z{(jyV$=OTx1uHy`-&2HfA~GcMw65qTIxEI&vy4@B6)2vrF414(f7y`O`JA$$p|YZ1 zd1!2Aqn+MW>iu1P%nvH0G7%=)OZ$pqAW=gPyBXpkc!ZBKQzBv#Boyq}93J0s+aB0A zZ+NlkdWpmYC}YFdSVgPJby>JSLHKNAal1|R*f4gX!FH3i3p@#w=W`b?-9~*gKR@LM z5&d?3$WRtjdp$y^+~w->#DL=WJFuBtvP9Ud)#<`PY|0IKY6DE-A!YR}kXh zfNE-;{lveY(kE8txFOi|0UADRL_91gu7sUNWlZ6tjATMOHKv2AnUhb^q4D%>DAr+| zP%0r}25zL?MVs`l9B7O8`$Q-BV{U9qQb1 zuj~zxoIA3Tz`(Eby~<@z<*k#~Euc|-f1*)^zzS@IzbCE8apAl`?9@Qyh02EPDA8V2m6x$3 zx~6ax-!fY=_=+!YbgswYW~r}VLUpST4;{p%Q#5v;9{W`2FP4EYfNLurd=by22ynV> zhTrck!K2m^a)h@pl0@@1A;_CvOpqm~~R zWJE+8KYf2=hf9nkfF`Vl@0EN&)2L|F2qJ}dd&2O6O&k&<*Nw83aCdX$M{#MytMqM> zTv#b{SUSS;qeKj%0K-(@;8%@EYLP6lnHiQSD$h=SLPsgX#{Gt5_l=JAub1m6ppRyn zp;+HWreimJNK?$4FD7c~q}cbj{`NY6;xy`y-Cg_Ceh?kuIhdGxP0;k7V|;1c4()K8AUq5iRh5Z1N_6s?iXtw3#DgEriaJNq!JI$ zmIIbd&WYObI;Nn09y*Z11@5XphpoK7Mt5TQ5*EDV|2A9ocNIz|p1^A@g} z?Qg&tz3JVh)?k9_20bVKwK_&T-CUZg65nJB6K;>HziPx;f|YqyD>MIqH;h)(MhCb=p8GClS*(Mlu zL)38R|9U2zwo9McV0sMRp2Uc!u3mP6z1@pS<|nHMFd%dK!YX#kDr4vlxPt!#cAS7B z9%EBqcHr780rStZpWxkQDBbR+He%@8q-C4D?V%xyRW{d7T@y?$eXE3^detP&ZF7<4 z+oONtVZ*Sw4i}!;E);xH83-E2-T-JsfxB6NDU;CilKyy&_kfQ)GGEGhI4eQAQ;-3M zYps6b@!+nf2QHj}u%(3KhbD!Kx+nG`>Az&$%=b5T*bPMh?lK?KrHH4yvV>ze*@GW( z(Yr~kg>S_>ULqq$#j5YS6IVh&;U-(&1U+Yb|1#WW5@X)S--GD}i?#jYkorSo!?DS` z&nkWS=47=WQPE6WkvvW04~%(yRn6QkJd_#Q^eDQc8@u(rxUH`-t<_v)>1Y4EhhBHV zGyaF@GpjLf(q^HhAL>^Uwql)=@P_~v`nws#7Yd-3LE06d0U1dFs7F}{bzO0mpxqs& z(@^zOk?3yV=3)&NfW*J#1$_vZh59{@eww7G&VoKJ9^e8$CF3fk2}A8*?fey6>)AxE z-q}~*h*x~B{&T~DYa}eX1G(2MWEEKQ4vt}|CYBqlN^eKj7LB-2B8Fl>2`cO(!!9|6 zEeng9c$unmcrG76DMJmZn^uhAU>lPC0qm&3XcO#6Bm5(;3F+s6KfZ?~YN;Iaqp9}F z>Yy6h%czZe|GGqunzNzixf4l*+&_=lFRg`{Xo55JUmsHbwtKQ~1W@m*KGw(g6*iik zCXK-^ybU16wbp~7T_^IUb)iV4*2eMkUff`LODQ~rY!_a!0 z42G3DmAUpfE})5qzAP_JE^3Aweovmc(a}4!=koG)VB>X~Twf1Td5$+o7r43Y)xmL` z(O8qDOmT(o!&SBE6BzNVMByyg0$xXp(#n1HF!-h-`f=(^`r&czrY$2PAdw44ee4cG zydGYVrtKXW8Oc>3`3-q;&j4(|lD5arSHLkk1L+rn&GVu1Z0gr1ZRo+pQE#OSF2l}v zO>AO_Q#nxxM_rbl{ki=|jxp!sZoX`$;`UOMI@oGC;Dj+TXE_8l68C~ zUvx0CqFQ9HiN|?Uhi6Wd@bmREX4d7fZN`Dpd?P}9=NnJ(?HYhF7AM;H}hi68d&w;6&|b#>Vi^(r1@oHYr{z6N_< ztUSS(m|6TA;(kZ&7m<{-@NZhMg9?$?>;hyBK67N8ba?OywO&MX9AYBAFwW`~*1XUW zI9(o=9?^}>35_~9w{%QlEoREb8a8{eZg9~{c}7e3rb7s5@a0c_OFp0Yb+=PP%!Kse zAa~2yZEIf6{n50!o&0n2$6myb87o!H^Q(uU5?vH#d|L6sL@73!79TMgwhTG+^u(3_ zL*9D^McJ)u!i{7RP$Z{TKtV|&Nn)c&5)qJ`C1;SFX%xvB6ci;%&XRLZ0s@k?Ns@DD zVgud%&cfHT=bWi;pS@?Qrsl`@1Ff=J`gyvawbp%K_Z7PJPmxosPnEs29RQKjkGcSQ z6~xWYzprdNsS?}N<3*7?0UtWDb$opC&I0e@5CckCc_XghDGzi*lMfoJU?*c8f7I(~ z&3j{$tHsz%FE^CHE_m{pNc7IC)<#`zHy0!I^m_S*&hIK877gM4WP-IOlNS0NetFXj z2;I~eg>+yygZYJInna&W^3)yutmeh!>KDObtpfrcO?B1AyDPJW@Y{k-zcynk(A@Tq zQ_c1IM`jzAg8Jm{i5zc7aA%1RVd<1W=uU&|yjpv9n z1+-h43)(HA@w47WWW70xXZGNrGm zRyCd#J<~jTPx0u1s|MmF`K-wH^9}5+$;uz%?9O}It%7=MT&3JPPmAed`EK3PBI%y? z8~wB@fb&x4)vBZy>j%C-0{)dSci7O@2}!QmxEB+QmdTvb;TS7jC`;{Lr~ML_#o_*y z7QaocS962B%8fX0<4ho-zqA*BJabFWajRHpML`2=GC%G+l!Wtg+T$yu3ZaaQ6a8Gc zU?H5s(_vCUPp)DjayWF?ZY9|2iL9Q}bn9aCNC0y3Q$#&YsG!2pw$G!n#meN}r_pqu zlgD-0QrI+aP+8b#QL*k`8@Qlle1wK3iTVw`bt6^l@Zk1xp{nZsXezn+QTk@9SYtN@ zJ{v)Msqb_Bwh~zP`76u3_3w4xDKnDWmM-yD3inBUaQ@jl6U)~+Pg)4zQW zQzWJp5`r$Ttxn79PB@A||H8b4y2umEpbg z^(U)qc_i1ja7y?)=dNxaW)J_W=Ch8{{hGgGA|8TkXoUYX(9ZmXtt4{@xqj^ zxcbsAbg?Xzb|nqYL=GON+1lgca-}HX3n7=J6Qh*$Y;2dJH*uWFtSbKLRzLqWmZcXd zg`3f1I0!IB5b9B{5jqQc*EG#uNeArtAJj7LK(z-Pn9PU1yUtNh->ZRVXr)&%C$Z|03_MJ0D{9eAcbZ19GTW3{%zBh>ftPPt$&Sw^;joV0M2IB7%9f0L}uPMN8$g`Rw+VGwO{Cc^lixVmJ1N zDbUpfRhk|K|1mjzbED>Lh!XVyl$L0A?CZ~<)himBn-qTn$S5|y;J5$ARneR?0Ea1R zm}CQ?-@5ex@@D~E)`bc#e?0V1v}+C=J%9RO15cN7n}D+@6Hv4N_I2ES2z6I7R?eGn z06W(5?+XO~6=Z6&CmGp_%UnNWd~uMim$ zmVli#fnzT7%b{86(fWF*RgIpkI%)&Y> zxWvCqnE;Ml{e6Y-Dqma2PAtu62^>)|E{|aggQwg?24~uL{RMe_go-&Sp7>j~%6|Cg zj!ZorczAOgNA+sQxNg_rV)4Gx92KX)Iz@R(W42}t+xJpm&(1SqrM?rq`zLy%YXf*% z*JyLYZbj8+=DmR9>TeHq?1BVvb9(NkqMo8^nc_6;S!8}m@e^6 zngn{8IQ1H=gyJ%4zh`IKO0=B(be*x0^=sl@{-36~^)oW1O&9Lw+9Ebot!$CVn>PR7iYH#I_DmvED9vv+wPrAlr& z57wx@S`T{{v-vv{+ApogU0f#5%DaGUl6qga4h#%$x`8W^@!IW%(V(Jx+QO_oKKEx0 zIJq(RH`pG>hgf>!aQlMD0C2UM%eP?(clu1nd~HtGAPxZe*+Hq*UX@H}rE2tUA1_H3A#-vGn{e2m$<1^kQSuI=Ah<>I8dZzuJS;*(msVMtlvH zB7j2J`h%FG1u+xRw^e#U(8y<`>RJevkf#e{4IC{jeY$dk z?TWzW*{`Iif)|6rdop)+_3zs(^EL7rI0>Jx038^wvc?T~%N_X8CBP0nQ|b}TUMVhw zD$YE5ly=hoP8p;M3kt%hJmIozHoD_Mg)zSp=cS>aS8szBVqS7|2fTTXt!`++kBG9Y;_)kqI z(c1T^f|?ZqC7a1x3nb?QwwjVu!?{+_7YS<3k?4ss;m6VlExMi)S-p_}26(XzGs~ER zfbx~To8bieyGOnb+6;{<(J{RFYbpDl#WUm&M;j$fkCh~uUPYgpyVNUuI`S~>=Q|QK zRT{NB^b;k8Dc30aXw%p^rT-$|@JW~+|92dx>M+XP$+tgv+WC*1B!>dvl9MQT!T1Q| zT#kR?z)k;L$5)8zQ3DtmJjC7=BwZTlZt}?ePP$x3I>+tu@SXGQN+&(Z9Cbx4;QkOu zHAepdyC0e+U?qJO7OaPSH|(k5MD0L5Xt2hPG2Pf_UOxJ5kZ^IN0Nmj6$z!7i4G=4<8On3=%e(fiooaF8E9;qcW@kHpwHD zV6kDm&X)NGx|IvtR>4ov>MC+v8g3M^tIzq;_ypHvc2r^|*7YyQOY@lYO|>;c8Us<} zk^QsvDsE@e(vwt5gyPa_m*s~#^r6? z=i=VH0;_xKLlHfuiM5nB+5Y#~4L%zWUJmpJTSAqo!ciiwF_QENkJW3BQ#ZhM2tA9t@~ zILW&K;NwW9P3AvdtQX&0NWC5d61$%J$^fdgN2%TU{?A5|ql6{s85P8|FYO1IW6zNH z?V()r0e0DjyIJhL z#RXEaD9d)OXMurES>I~p{f?R9$=j5a2s@!9{T#u58eHtK{T|h*VyNW%w>N@_{1S9t>u?Jp0hB-06aE!0)k z$KkzEq+_Etyic}5`}NnPmZO`a7f~|8GdJ|m^V2<8XucJ0bV$4IH-CQR>yk~j+{0x; zz{J6a=-6@Y?Ir!v8*bclQ&fkg_^3d+2+eb7xc!K|=DuRx)cL)4QJ)}BpP2Whik2CV zMw9s@bKnLwpxlutmxtdE?VmA-8L(`KwN45JdnBv-{fcLMdZ{ancDIeT1c7sZsxsCAFV4 z+KW52Ev;s&OI~hD>lDRcW=nAqwwf)b$+HYX(ejIzH$Ivj$WP<$yB|bfnluN_-iLGK zZeG5ExmMDh?qRk$19;V4u8sU&kEtk3^o5^2*=8@cvB3goEy1AiZMQO0zuU>KQ~9jb z?9S9P&Agvzrzu`4*jYC78`x7`jM%vIOQSQ86dT90Pc`Aj)I(-lD-?aJ_q`gMwRY{h z$)zV!V6W|0kPDvg4Mf=!Q{7^f-w_i!>EX}Ht&WNaHKQQ{14GSkK%7*!z&KKOD8 zTHUZ!V~afl$R^3zIIGdfw#m#N1^@wd?-h&_G0hUSiG~s zjwkKd=YV^SGV|FJI|5TE9z?(T=q+n*o=1cvb?)`$pByw9uf=*YhAY~$>P6c|Or^Ms zlc362lZ3LBSyuV-U)_WzUlw8@Tor*>rh~vAKrUoj ztA__RliJdQ_$v$BpXgtVMUNDi%`CJN#5o`-nGY`2znZTTS8&RlGx7{4Ra5wq;;=P> zz&8?=`6?GLwFRYvxpLfY5G96~eZrB#rwYnLjdqAC+BHquu_isZMjR;bA6jR6szHuY z%4%Me-kYt+TixkrgPOfL-}z|WGpq!0dnczk;W~4I5=lF3zLmrANt+jGir36+c3o%9T8tSAU{!I%kip)Pc zwA@T3d}Qk)vo{+zkNV&`#WC+Cl4zQksJ5}={LMcn;65-$Rx1E(P}Yt|eb+};bw0_$ ziA<;G0;w{w*GjK$Fm7OZFCwc2KDt(^Za3AmEVbA70nhpv;5{!K<|uGHmd$vY{Au5S z!q18I+Le3OVI6tBsErz5NeNqnjASP3c-WQblT# z+BFSXL*&P@s~Zy^%)h!qpw_r89V6_>CDrY5$qSbd0&EFd6&ALgVPWOgil1#pS?8UGk9p{7HpG5dzcW>A#J+NKvv94H zE35ni_i|M#W1rc}%Xfp=MC>B%+0-Zed8*TNYDOF@&oOt8*Xg!Rn;v)0%W8A7e)-Dy zj*Zbhoh&%~VCXukPytE!#tk(p*U&P0BiM7`TrYEqSXKEhiKCbvsy&wP6Ee9W0~Ouh z0b&}_EIgXlB@Tz@+V=MLqrMfe_}t6)331~U0O1E`N>w{qIc(ca>Di)U{KQU&T1}LN zk7Ad~%Kev2Pxv``JioFN7Mq~8#(7=SLg*Wh`KG;!$rCMKz4Hx_$B))#Mx8o4dwZml zO@#ll;}K9MocSScNY*^OG{M6%+Sqk2NrLXW^6IujolET{&($hdg#|0Ut_qY>5ie^) z^taipsO3`^Sz6vc>3Fim$a_rW)l$M7CHJAB6BURJ7rAs>vvoCbt>MslZh~>VPhl@R z@bJELO5y zSmW7sI2_Hfp+0MB1Uuf~r^n^}%rEH}yrP0V&(X|4A0A#-1ts?M&>}pS2GP-A;Ki8O zr?+Qkrg;T={jly3e-d6^<$0KKGkRfpKE}R*@P|jhQe3Jtpo*nB6FQK|$~}QBfu;th z3|KwHN){GdKUk}t+(8EZ1<_xgZOMk3AqPJUH0Ne-s*?FOd?hW)o%$Bzyo!ZzUf7?( zP|wt!-Skz=oLftY>I}bK4T`L?C0;ZUx9dbw;^c9!i=`7)S7YEEE*>UrpKERTp?Fti zAC_pIx2d$b+|Hc;7_()d1bA;+LMMbH+Rf`jC&9Gd7sZl^r=x+N4Pt?_-?7{#@%|}I z^;8X>?bYkm)l>;J#4w9^ku+4gp~3FrOP%ycV-MW3z~-a9ZEI`88@%>(SR z;?Y})4_Le`;#i{yRy-bDmQax3Bs=I96_8~5s8i7xqWbD`mbE3z*O9NCcV+MSBTWcM zEp<^(7WG}n#LZb|l~R!FRzEAM5Aos4g=AYlnFCbtN*DXZdg-BLKMXhb^ATp{D%@k| zgG=m~eTCx^%Pu(i5h#XvP2A2Sm{1e_J!%@M|z;u@ZFynWk~v zN$`aqz35Hn4_sw!Bm!rMpU)o`+rn9<$@+kdGTDAN+_nFFKu%VP`9Q0t z3Nw*DEENypC2!I4Us`3-kcQe__+!4DBMgTIArvB*4bM|*X=%?Nzb}AYExrA*3rjhi z4I(Z`MZH!NZC$P04c-QY=P=6*jvib^5k{IJfqqlQ*`Il=vWZ_apK5Zy<_vWpe>dqwoWFNwISLEzL**XPDQQ0P>Ua zmoG^nZj@TAwn&m^b%F8?_F`%^U&d1(6qnu(!}B)_T$aV@$4%w0aqy-PDJB6~6;ryl zaxHG_{i;;3!4)Lxgf*6$PJMjjF7 z3gAri(mx4elW~>M2!2@NebOpPIdRMiYIrrdofknR9}hZ-g@+e@XkWGreZ1J*FBp z1z_%&V*Y27H=z3??P~Ty625iBYN!Vno-?bia|~8BClSU13D)%quH|E<_nyq{?92mY z3frWN`jG^u@`N2?=z00;otgTc`vg!!Z>aau&U3KCqG+59l>O%2Uhv$gbzwtzC&chE z?jxf&e%^2_3A^ySQ+l$zVN1=Y5JlBp(lJYtFuow9W5Qxjz;U+c}K<5 zq=>hH0bFDM1uY66FMW*)}1 z{36ouFBzW%DwTiHf2s>cne;pyH6IfsexoAyYV;x=FWvc@GK5UYs6?{;+JX@SC`Vut z(ILV=woG6i+YApAO~m4AZya`bf5%l*nrzfN$5_}#F(^2gj&f)HbOK<;sF(V(3#OB` zl*?O7A=?V!5Mssc+Q8uRfN<~8D`!9D{1fr<4FEvYeH@~fwp<9_JFr4z)eJZ|yx31< zNg^U5v_6nDR5(BPhT4r8g(7_G&6f}9HB0YXZ>{ICJbG2sXZiA_{v|28cIw5{L!2MO z`p20I=iCyNazZs8)XCq5AKH5mNz;1a+^MA|{ff7A2fd+z6z5*3Lq9SSIv<079`6i;vLZHOA2%2)Xmy4E^Y;8jPF_g@c6a55gf zscjbXK3b+%@}_km{_+;Rf391$&e!2-8pras`>j>{2Ci!W}Zlf9LCuV}_)YkD`a#SFeg2*CO;{Ndn(e!6UXA@37yw_@` z)l#hats=Ao5T2U(6xL3TG=z}Vf!sGOq9;n%judFFw7e=}Z<;_;9oQr&7NPw7k9LL* z3k8qflCeFU3AiG{#$1I^kz&O&qlZKj&)3&PFU+bZ(y5EeM_w*ZeTe5qb<61t&uA|S zRlnQeu@H|~z-l798(<1>K z=kVo^3%o%;zq#uMZaj~^WL*tvb^o$_Xt4k)&9Ldgh%b{b=-v7ao-BxIfED@>baOob z$;&I@xl#FQwJ!OA@x#P;*~x%5b465!j*IX8RP4~LCW6e{VJyoe|Eisknbyt{~D;p&(nyql#tG z1hFeRUe>oHOSThDk8W34{U-y^)kfXp5NFux%%C|eQ)k^hB9z-$J3&Gomrimu|7;w= zk$%OIdSf61rKmn;+MCSazAuHnqudvWH2Ivfw{sD1aQG+QKo7(l^rD|BFKW*MbTBNs zZoUc6xnkC@{ug|d^ChF1H{F#-K=+wnV3d=TWw-&p!osRotB#-ZP0@v%trO%qCH^joqkLfu8stT3{%Ljj?xeGs|93%*l~(tz(wvej0|T7{V-$S&jyz{zbj==Ms#S#g5Bx#yR5Ql<3?!&?3RFUb8nW|-BkkMJ|ojDD13Dh${G zGHLviLED9y-@p8kak9ssmgRhJn#@1WCe?~1$Oh%@$C!}R>#1t@*W4#YQpH z*wY+3LyfZ-VIYFPZ}&J2s@!Lt%3MKMnN;yqZkax2BI#VLhX%HZmd?_NQB>jsvc@@O z9@vw=-Gb%R>sM8fId$yk)Sns5!Dhia15RWWV5sZxi2iJLQ_X)nZ+5^b4MkFBGy?qM zE=8w(Ue|rHJ?c6oCfLpAc&P^+P&oFlzjQ{;AU|l3plur2M%F{BnWafl^C=`#>$`7J z*BoBUSQrP60hK*s++O-w`FN3e`53oJebrmzg?G4j(4;Pk^Ti&I0KePTXIpD$9r49F zQ*|vqaOK9?E-n})Zg3`m`Cj+Qv&BwH`mv(7ZgrJL)emFzdk$V5J=9Is3P;0=s|SR& z%j=Rd!fr9YILkNV7msdc2%*-VlY-y6)#Su59{vX)(5eYYA$)fs1x_+UR(f26_> z>OInCz?kSw5aW!H4X1 zAzi_WhvwH=8a^;(z02}q{6%f)tP>5PW7{LlhB()+q?GEQkm!e*>xF)+R^9FQ%pYs# zP$X%_@?TO*bzee`RFpQd`dI`2CIee;x#uJfK?%XiUe|L|Ms9kqRFg*I@Lc`Z_c=k#`2$`Gt65g$vv>HTx_Y|$>-9zS(P`#v zAFS~VG_{_qQ}>%XNG-DMKTh(tC|gLQ@r0{1jAV`2xq8IApFbXMO!(Sgc{lWDfNC#W zta7#o;PED{d((vZO6;Ah?&;ItY-Higv)k?Zrbrof(;dI<#eDESU*&75B{J&-6iln- zyZCjt+aEosc0-KM1-n9S;^?89y+!(0%aj$jXBN$aGcf437T zPQ7hncf5gklT^`H)LI^E9?u755@Ac7Swv0-UG>COANJ*(uccm8y`0Tu`g-Oe9@9{w ze&iLWgrO(9R_SE?U7GaOEtys|)!ypEhSv2(!rkpF+KCEO!go~qwgO^*LWL)(G>HUH zB{{klh|v-*)G4=P?PPgwScaj$pT>Hn+=IQTaa4;w4u>2>{X606h34~7-b}2mi1>Af z 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 az6WM$8yEeCK{v|#6>I-5JV=DKzP|v04`~em literal 358752 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%0Aht$kUsR|G52jZbS5V-g_%Nksvo0CVM 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 b!E%4uIzYp;o%5fm|13C&_`eLZ?_>W0BIJnI diff --git a/doc/lispref/elisp_type_hierarchy.txt b/doc/lispref/elisp_type_hierarchy.txt index 00b6bb91458..d1be8f56c72 100644 --- a/doc/lispref/elisp_type_hierarchy.txt +++ b/doc/lispref/elisp_type_hierarchy.txt @@ -1,29 +1,33 @@ | Type | Derived Types | |---------------------+------------------------------------------------------------| +| atom | mutex record font-spec frame number-or-marker | +| | tree-sitter-compiled-query tree-sitter-node font-entity | +| | tree-sitter-parser hash-table window-configuration | +| | function user-ptr overlay array process font-object symbol | +| | obarray condvar buffer terminal thread window | +| | native-comp-unit | | cl-structure-object | xref-elisp-location org-cite-processor cl--generic-method | | | cl--random-state register-preview-info cl--generic | | | cl--class cl-slot-descriptor uniquify-item registerv | | | isearch--state cl--generic-generalizer lisp-indent-state | +| t | sequence atom | +| compiled-function | subr byte-code-function | +| integer | fixnum bignum | +| symbol | symbol-with-pos keyword boolean | | accessor | oclosure-accessor | | oclosure | advice cconv--interactive-helper advice--forward accessor | | | save-some-buffers-function cl--generic-nnm | -| atom | ppss decoded-time oclosure cl-structure-object timer | -| | native-comp-unit obarray symbol number-or-marker overlay | -| | window-configuration process window buffer frame | -| | hash-table terminal thread mutex condvar font-spec | -| | font-entity font-object user-ptr tree-sitter-parser | -| | tree-sitter-node tree-sitter-compiled-query function array | -| cl--class | cl-structure-class oclosure--class | +| cons | ppss decoded-time | +| cl--class | cl-structure-class oclosure--class built-in-class | | subr | subr-primitive subr-native-elisp | -| function | compiled-function module-function | -| compiled-function | subr byte-code-function | -| list | cons null | +| array | string vector bool-vector char-table | +| number | float integer | +| number-or-marker | integer-or-marker number | +| function | oclosure compiled-function interpreted-function | +| | module-function | +| sequence | list array | +| integer-or-marker | integer marker | | boolean | null | -| array | string char-table bool-vector vector | -| symbol | symbol-with-pos boolean keyword | -| integer | fixnum bignum | -| number-or-marker | number integer-or-marker | -| integer-or-marker | marker integer | -| number | integer float | -| sequence | array list | -| t | atom sequence | +| list | null cons | +| record | cl-structure-object | +| vector | timer | From 454a55dbd963d4b07c0dc0f6d540cc5fd4b4faa7 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 12:44:38 -0500 Subject: [PATCH 443/446] (dir-locals-collect-variables): Avoid spurious safety warnings * lisp/files.el (dir-locals-collect-variables): Silence warnings for extra parents' variables. --- lisp/files.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/files.el b/lisp/files.el index dd7580b6580..3ca4f047144 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -4446,6 +4446,12 @@ to see whether it should be considered." (funcall predicate key) (or (not key) (derived-mode-p key))) + ;; If KEY is an extra parent it may remain not loaded + ;; (hence with some of its mode-specific vars missing their + ;; `safe-local-variable' property), leading to spurious + ;; prompts about unsafe vars (bug#68246). + (if (and (symbolp key) (autoloadp (indirect-function key))) + (ignore-errors (autoload-do-load (indirect-function key)))) (let* ((alist (cdr entry)) (subdirs (assq 'subdirs alist))) (if (or (not subdirs) From c79a509384d33dab6a964ef9a97cbc9a1f1b5bf7 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 12:58:11 -0500 Subject: [PATCH 444/446] Add non-TS modes as extra parent of TS modes (bug#68246) Record the fact that TS modes are alternatives to the non-TS modes using the new `derived-mode-add-parents` functionality. Do the same for long standing similar issues with CPerl-mode. * lisp/textmodes/yaml-ts-mode.el (yaml-ts-mode): * lisp/textmodes/toml-ts-mode.el (toml-ts-mode): * lisp/textmodes/html-ts-mode.el (html-ts-mode): * lisp/textmodes/css-mode.el (css-ts-mode): * lisp/progmodes/typescript-ts-mode.el (typescript-ts-mode, tsx-ts-mode): * lisp/progmodes/sh-script.el (bash-ts-mode): * lisp/progmodes/rust-ts-mode.el (rust-ts-mode): * lisp/progmodes/ruby-ts-mode.el (ruby-ts-mode): * lisp/progmodes/python.el (python-ts-mode): * lisp/progmodes/lua-ts-mode.el (lua-ts-mode): * lisp/progmodes/json-ts-mode.el (json-ts-mode): * lisp/progmodes/js.el (js-ts-mode): * lisp/progmodes/java-ts-mode.el (java-ts-mode): * lisp/progmodes/heex-ts-mode.el (heex-ts-mode): * lisp/progmodes/go-ts-mode.el (go-ts-mode, go-mod-ts-mode): * lisp/progmodes/elixir-ts-mode.el (elixir-ts-mode): * lisp/progmodes/dockerfile-ts-mode.el (dockerfile-ts-mode): * lisp/progmodes/csharp-mode.el (csharp-ts-mode): * lisp/progmodes/cmake-ts-mode.el (cmake-ts-mode): * lisp/progmodes/c-ts-mode.el (c-ts-mode, c++-ts-mode): Add non-TS mode as extra parent. * lisp/progmodes/cperl-mode.el (cperl-mode): Add `perl-mode` as extra parent. --- etc/NEWS | 10 ++++++++++ lisp/progmodes/c-ts-mode.el | 4 ++++ lisp/progmodes/cmake-ts-mode.el | 2 ++ lisp/progmodes/cperl-mode.el | 2 ++ lisp/progmodes/csharp-mode.el | 2 ++ lisp/progmodes/dockerfile-ts-mode.el | 2 ++ lisp/progmodes/elixir-ts-mode.el | 2 ++ lisp/progmodes/go-ts-mode.el | 4 ++++ lisp/progmodes/heex-ts-mode.el | 2 ++ lisp/progmodes/java-ts-mode.el | 2 ++ lisp/progmodes/js.el | 2 ++ lisp/progmodes/json-ts-mode.el | 2 ++ lisp/progmodes/lua-ts-mode.el | 2 ++ lisp/progmodes/python.el | 2 ++ lisp/progmodes/ruby-ts-mode.el | 2 ++ lisp/progmodes/rust-ts-mode.el | 2 ++ lisp/progmodes/sh-script.el | 2 ++ lisp/progmodes/typescript-ts-mode.el | 4 ++++ lisp/textmodes/css-mode.el | 2 ++ lisp/textmodes/html-ts-mode.el | 2 ++ lisp/textmodes/toml-ts-mode.el | 2 ++ lisp/textmodes/yaml-ts-mode.el | 2 ++ 22 files changed, 58 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 2aa669be344..2e51c0490fe 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -62,6 +62,16 @@ more details. * Incompatible Changes in Emacs 30.1 +** Tree-Sitter modes are now declared as submodes of the non-TS modes. +In order to help the use of those Tree-Sitter modes, they are now +declared to have the corresponding non-Tree-Sitter mode as an +additional parent. +This way, things like `.dir-locals.el` settings, and YASnippet +collections of snippets automatically apply to the new Tree-Sitter modes. + +Note that those modes still do not inherit from the non-TS mode, so +configuration settings installed via mode hooks are not affected. + +++ ** URL now never sends user email addresses in HTTP requests. Emacs never sent email addresses by default, but it used to be diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 38b72e59388..a2e7f6fba2e 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1328,6 +1328,8 @@ in your configuration." (lambda (_pos) 'c)) (treesit-font-lock-recompute-features '(emacs-devel))))) +(derived-mode-add-parents 'c-ts-mode '(c-mode)) + ;;;###autoload (define-derived-mode c++-ts-mode c-ts-base-mode "C++" "Major mode for editing C++, powered by tree-sitter. @@ -1371,6 +1373,8 @@ recommended to enable `electric-pair-mode' with this mode." (setq-local add-log-current-defun-function #'c-ts-mode--emacs-current-defun-name)))) +(derived-mode-add-parents 'c++-ts-mode '(c++-mode)) + (easy-menu-define c-ts-mode-menu (list c-ts-mode-map c++-ts-mode-map) "Menu for `c-ts-mode' and `c++-ts-mode'." '("C/C++" diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el index 45c4882d873..b70806f4c30 100644 --- a/lisp/progmodes/cmake-ts-mode.el +++ b/lisp/progmodes/cmake-ts-mode.el @@ -243,6 +243,8 @@ Return nil if there is no name or if NODE is not a defun node." (treesit-major-mode-setup))) +(derived-mode-add-parents 'cmake-ts-mode '(cmake-mode)) + (if (treesit-ready-p 'cmake) (add-to-list 'auto-mode-alist '("\\(?:CMakeLists\\.txt\\|\\.cmake\\)\\'" . cmake-ts-mode))) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 10ac80dffd5..11709bfe00b 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -1934,6 +1934,8 @@ or as help on variables `cperl-tips', `cperl-problems', ;; Setup Flymake (add-hook 'flymake-diagnostic-functions #'perl-flymake nil t)) +(derived-mode-add-parents 'cperl-mode '(perl-mode)) + (defun cperl--set-file-style () (when cperl-file-style (cperl-file-style cperl-file-style))) diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el index 7bf57bcbe21..18114d08528 100644 --- a/lisp/progmodes/csharp-mode.el +++ b/lisp/progmodes/csharp-mode.el @@ -998,6 +998,8 @@ Key bindings: (add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-ts-mode))) +(derived-mode-add-parents 'csharp-ts-mode '(csharp-mode)) + (provide 'csharp-mode) ;;; csharp-mode.el ends here diff --git a/lisp/progmodes/dockerfile-ts-mode.el b/lisp/progmodes/dockerfile-ts-mode.el index f6587018513..e31fd86bbdf 100644 --- a/lisp/progmodes/dockerfile-ts-mode.el +++ b/lisp/progmodes/dockerfile-ts-mode.el @@ -165,6 +165,8 @@ Return nil if there is no name or if NODE is not a stage node." (treesit-major-mode-setup))) +(derived-mode-add-parents 'dockerfile-ts-mode '(dockerfile-mode)) + (if (treesit-ready-p 'dockerfile) (add-to-list 'auto-mode-alist ;; NOTE: We can't use `rx' here, as it breaks bootstrap. diff --git a/lisp/progmodes/elixir-ts-mode.el b/lisp/progmodes/elixir-ts-mode.el index f26c3a49203..9804152d9ab 100644 --- a/lisp/progmodes/elixir-ts-mode.el +++ b/lisp/progmodes/elixir-ts-mode.el @@ -753,6 +753,8 @@ Return nil if NODE is not a defun node or doesn't have a name." (treesit-major-mode-setup) (setq-local syntax-propertize-function #'elixir-ts--syntax-propertize))) +(derived-mode-add-parents 'elixir-ts-mode '(elixir-mode)) + (if (treesit-ready-p 'elixir) (progn (add-to-list 'auto-mode-alist '("\\.elixir\\'" . elixir-ts-mode)) diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el index 296e4d0037d..cc330688dc3 100644 --- a/lisp/progmodes/go-ts-mode.el +++ b/lisp/progmodes/go-ts-mode.el @@ -261,6 +261,8 @@ (treesit-major-mode-setup))) +(derived-mode-add-parents 'go-ts-mode '(go-mode)) + (if (treesit-ready-p 'go) ;; FIXME: Should we instead put `go-mode' in `auto-mode-alist' ;; and then use `major-mode-remap-defaults' to map it to `go-ts-mode'? @@ -439,6 +441,8 @@ what the parent of the node would be if it were a node." (treesit-major-mode-setup))) +(derived-mode-add-parents 'go-mod-ts-mode '(go-mod-mode)) + (if (treesit-ready-p 'gomod) (add-to-list 'auto-mode-alist '("/go\\.mod\\'" . go-mod-ts-mode))) diff --git a/lisp/progmodes/heex-ts-mode.el b/lisp/progmodes/heex-ts-mode.el index 22e8956661d..07b8bfdc74f 100644 --- a/lisp/progmodes/heex-ts-mode.el +++ b/lisp/progmodes/heex-ts-mode.el @@ -187,6 +187,8 @@ With ARG, do it many times. Negative ARG means move backward." (treesit-major-mode-setup))) +(derived-mode-add-parents 'heex-ts-mode '(heex-mode)) + (if (treesit-ready-p 'heex) ;; Both .heex and the deprecated .leex files should work ;; with the tree-sitter-heex grammar. diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el index 00d7d0d75a1..bb4a7df3340 100644 --- a/lisp/progmodes/java-ts-mode.el +++ b/lisp/progmodes/java-ts-mode.el @@ -406,6 +406,8 @@ Return nil if there is no name or if NODE is not a defun node." ("Method" "\\`method_declaration\\'" nil nil))) (treesit-major-mode-setup)) +(derived-mode-add-parents 'java-ts-mode '(java-mode)) + (if (treesit-ready-p 'java) (add-to-list 'auto-mode-alist '("\\.java\\'" . java-ts-mode))) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index ebc098e6a75..6cb84592896 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3916,6 +3916,8 @@ See `treesit-thing-settings' for more information.") (add-to-list 'auto-mode-alist '("\\(\\.js[mx]\\|\\.har\\)\\'" . js-ts-mode)))) +(derived-mode-add-parents 'js-ts-mode '(js-mode)) + (defvar js-ts--s-p-query (when (treesit-available-p) (treesit-query-compile 'javascript diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el index 32bc10bbda9..1fb96555010 100644 --- a/lisp/progmodes/json-ts-mode.el +++ b/lisp/progmodes/json-ts-mode.el @@ -164,6 +164,8 @@ Return nil if there is no name or if NODE is not a defun node." (treesit-major-mode-setup)) +(derived-mode-add-parents 'json-ts-mode '(json-mode)) + (if (treesit-ready-p 'json) (add-to-list 'auto-mode-alist '("\\.json\\'" . json-ts-mode))) diff --git a/lisp/progmodes/lua-ts-mode.el b/lisp/progmodes/lua-ts-mode.el index 8bd3db2b75f..25fd7792f42 100644 --- a/lisp/progmodes/lua-ts-mode.el +++ b/lisp/progmodes/lua-ts-mode.el @@ -798,6 +798,8 @@ Calls REPORT-FN directly." (add-hook 'flymake-diagnostic-functions #'lua-ts-flymake-luacheck nil 'local)) +(derived-mode-add-parents 'lua-ts-mode '(lua-mode)) + (when (treesit-ready-p 'lua) (add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-ts-mode))) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index bedc61408ef..1016655cb62 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -7128,6 +7128,8 @@ implementations: `python-mode' and `python-ts-mode'." (add-to-list 'auto-mode-alist '("\\.py[iw]?\\'" . python-ts-mode)) (add-to-list 'interpreter-mode-alist '("python[0-9.]*" . python-ts-mode)))) +(derived-mode-add-parents 'python-ts-mode '(python-mode)) + ;;; Completion predicates for M-x ;; Commands that only make sense when editing Python code. (dolist (sym '(python-add-import diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el index cdfa3dca498..7133cb0b5b0 100644 --- a/lisp/progmodes/ruby-ts-mode.el +++ b/lisp/progmodes/ruby-ts-mode.el @@ -1210,6 +1210,8 @@ leading double colon is not added." (setq-local syntax-propertize-function #'ruby-ts--syntax-propertize)) +(derived-mode-add-parents 'ruby-ts-mode '(ruby-mode)) + (if (treesit-ready-p 'ruby) (add-to-list 'major-mode-remap-defaults '(ruby-mode . ruby-ts-mode))) diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index c5fc57cc374..c67ac43e4d0 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -474,6 +474,8 @@ See `prettify-symbols-compose-predicate'." (treesit-major-mode-setup))) +(derived-mode-add-parents 'rust-ts-mode '(rust-mode)) + (if (treesit-ready-p 'rust) (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-ts-mode))) diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 43fb8a723bd..ab95dc9f924 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -1639,6 +1639,8 @@ not written in Bash or sh." (setq-local treesit-defun-type-regexp "function_definition") (treesit-major-mode-setup))) +(derived-mode-add-parents 'bash-ts-mode '(sh-mode)) + (advice-add 'bash-ts-mode :around #'sh--redirect-bash-ts-mode ;; Give it lower precedence than normal advice, so other ;; advices take precedence over it. diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el index 9ee9432e4ee..ea4f6417c5a 100644 --- a/lisp/progmodes/typescript-ts-mode.el +++ b/lisp/progmodes/typescript-ts-mode.el @@ -505,6 +505,8 @@ This mode is intended to be inherited by concrete major modes." (treesit-major-mode-setup))) +(derived-mode-add-parents 'typescript-ts-mode '(typescript-mode)) + (if (treesit-ready-p 'typescript) (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-ts-mode))) @@ -562,6 +564,8 @@ at least 3 (which is the default value)." (treesit-major-mode-setup))) +(derived-mode-add-parents 'tsx-ts-mode '(tsx-mode)) + (defvar typescript-ts--s-p-query (when (treesit-available-p) (treesit-query-compile 'typescript diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el index 425f3ec8a30..f5a20e0ca0e 100644 --- a/lisp/textmodes/css-mode.el +++ b/lisp/textmodes/css-mode.el @@ -1830,6 +1830,8 @@ can also be used to fill comments. (add-to-list 'auto-mode-alist '("\\.css\\'" . css-ts-mode)))) +(derived-mode-add-parents 'css-ts-mode '(css-mode)) + ;;;###autoload (define-derived-mode css-mode css-base-mode "CSS" "Major mode to edit Cascading Style Sheets (CSS). diff --git a/lisp/textmodes/html-ts-mode.el b/lisp/textmodes/html-ts-mode.el index 9af2aa6748f..235e1055fa9 100644 --- a/lisp/textmodes/html-ts-mode.el +++ b/lisp/textmodes/html-ts-mode.el @@ -134,6 +134,8 @@ Return nil if there is no name or if NODE is not a defun node." (treesit-major-mode-setup)) +(derived-mode-add-parents 'html-ts-mode '(html-mode)) + (if (treesit-ready-p 'html) (add-to-list 'auto-mode-alist '("\\.html\\'" . html-ts-mode))) diff --git a/lisp/textmodes/toml-ts-mode.el b/lisp/textmodes/toml-ts-mode.el index 1ba410045f5..1b621032f8a 100644 --- a/lisp/textmodes/toml-ts-mode.el +++ b/lisp/textmodes/toml-ts-mode.el @@ -153,6 +153,8 @@ Return nil if there is no name or if NODE is not a defun node." (treesit-major-mode-setup))) +(derived-mode-add-parents 'toml-ts-mode '(toml-mode)) + (if (treesit-ready-p 'toml) (add-to-list 'auto-mode-alist '("\\.toml\\'" . toml-ts-mode))) diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el index a8cb504ef03..210835585fe 100644 --- a/lisp/textmodes/yaml-ts-mode.el +++ b/lisp/textmodes/yaml-ts-mode.el @@ -169,6 +169,8 @@ boundaries. JUSTIFY is passed to `fill-paragraph'." (treesit-major-mode-setup))) +(derived-mode-add-parents 'yaml-ts-mode '(yaml-mode)) + (if (treesit-ready-p 'yaml) (add-to-list 'auto-mode-alist '("\\.ya?ml\\'" . yaml-ts-mode))) From 41de53d4a1c49ef6c6e8ac4ecb0c10cb1b6e07ce Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 12:50:33 -0500 Subject: [PATCH 445/446] Simplify mode-indexed tables in packages Now that we use extra-parents to group alternative major modes, some tables can be simplified to mention only the group's leader. * lisp/align.el (align-c++-modes, align-rules-list): Don't bother listing TS alternatives. (align-perl-modes): Don't bother listing CPerl alternative. * lisp/info-look.el (perl-mode): Simplify. * lisp/cedet/semantic/symref/grep.el (semantic-symref-filepattern-alist): Don't bother listing TS alternatives. * lisp/emulation/viper.el (viper-vi-state-mode-list): Don't bother listing CPerl alternative. * lisp/progmodes/gud.el (gud-tooltip-activate-mouse-motions-if-enabled): Take into account the modes hierarchy. (gud-tooltip-modes): Don't bother listing TS alternatives. * .dir-locals.el (c-ts-mode): Simplify. --- .dir-locals.el | 4 +--- lisp/align.el | 9 ++++----- lisp/cedet/semantic/symref/grep.el | 6 ------ lisp/emulation/viper.el | 1 - lisp/htmlfontify.el | 1 + lisp/info-look.el | 5 ++--- lisp/progmodes/gud.el | 10 ++++------ lisp/progmodes/hideshow.el | 3 +++ 8 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.dir-locals.el b/.dir-locals.el index 1a6acecc206..b34949ae961 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -32,9 +32,7 @@ (electric-quote-comment . nil) (electric-quote-string . nil) (mode . bug-reference-prog))) - (c-ts-mode . ((c-ts-mode-indent-style . gnu) - (indent-tabs-mode . t) - (mode . bug-reference-prog))) + (c-ts-mode . ((c-ts-mode-indent-style . gnu))) ;Inherits `c-mode' settings. (log-edit-mode . ((log-edit-font-lock-gnu-style . t) (log-edit-setup-add-author . t) (vc-git-log-edit-summary-target-len . 50) diff --git a/lisp/align.el b/lisp/align.el index fa95f24fa02..81ccc4b5e2d 100644 --- a/lisp/align.el +++ b/lisp/align.el @@ -181,13 +181,12 @@ If nil, then no messages will ever be printed to the minibuffer." :type '(choice (const :tag "Align a large region silently" nil) integer) :group 'align) -(defcustom align-c++-modes '( c++-mode c-mode java-mode - c-ts-mode c++-ts-mode) +(defcustom align-c++-modes '( c++-mode c-mode java-mode) "A list of modes whose syntax resembles C/C++." :type '(repeat symbol) :group 'align) -(defcustom align-perl-modes '(perl-mode cperl-mode) +(defcustom align-perl-modes '(perl-mode) "A list of modes where Perl syntax is to be seen." :type '(repeat symbol) :group 'align) @@ -576,13 +575,13 @@ The possible settings for `align-region-separate' are: "=" (group (zero-or-more (syntax whitespace))))) (group . (1 2)) - (modes . '(conf-toml-mode toml-ts-mode lua-mode lua-ts-mode))) + (modes . '(conf-toml-mode lua-mode))) (double-dash-comment (regexp . ,(rx (group (zero-or-more (syntax whitespace))) "--" (zero-or-more nonl))) - (modes . '(lua-mode lua-ts-mode)) + (modes . '(lua-mode)) (column . comment-column) (valid . ,(lambda () (save-excursion diff --git a/lisp/cedet/semantic/symref/grep.el b/lisp/cedet/semantic/symref/grep.el index 83e3bc36073..cc4d1546c85 100644 --- a/lisp/cedet/semantic/symref/grep.el +++ b/lisp/cedet/semantic/symref/grep.el @@ -44,9 +44,7 @@ those hits returned.") (defvar semantic-symref-filepattern-alist '((c-mode "*.[ch]") - (c-ts-mode "*.[ch]") (c++-mode "*.[chCH]" "*.[ch]pp" "*.cc" "*.hh") - (c++-ts-mode "*.[chCH]" "*.[ch]pp" "*.cc" "*.hh") (html-mode "*.html" "*.shtml" "*.php") (mhtml-mode "*.html" "*.shtml" "*.php") ; FIXME: remove ; duplication of @@ -55,12 +53,8 @@ those hits returned.") ; major mode definition? (ruby-mode "*.r[bu]" "*.rake" "*.gemspec" "*.erb" "*.haml" "Rakefile" "Thorfile" "Capfile" "Guardfile" "Vagrantfile") - (ruby-ts-mode "*.r[bu]" "*.rake" "*.gemspec" "*.erb" "*.haml" - "Rakefile" "Thorfile" "Capfile" "Guardfile" "Vagrantfile") (python-mode "*.py" "*.pyi" "*.pyw") - (python-ts-mode "*.py" "*.pyi" "*.pyw") (perl-mode "*.pl" "*.PL") - (cperl-mode "*.pl" "*.PL") (lisp-interaction-mode "*.el" "*.ede" ".emacs" "_emacs") ) "List of major modes and file extension pattern. diff --git a/lisp/emulation/viper.el b/lisp/emulation/viper.el index 83fcdf89375..287292a24dc 100644 --- a/lisp/emulation/viper.el +++ b/lisp/emulation/viper.el @@ -388,7 +388,6 @@ widget." idl-mode perl-mode - cperl-mode javascript-mode tcl-mode python-mode diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el index 6b9c623f31f..89c2bee2204 100644 --- a/lisp/htmlfontify.el +++ b/lisp/htmlfontify.el @@ -586,6 +586,7 @@ If a window system is unavailable, calls `hfy-fallback-color-values'." (defvar hfy-cperl-mode-kludged-p nil) (defun hfy-kludge-cperl-mode () + ;; FIXME: Still? "CPerl mode does its damnedest not to do some of its fontification when not in a windowing system - try to trick it..." (declare (obsolete nil "28.1")) diff --git a/lisp/info-look.el b/lisp/info-look.el index da7beafe500..cd59fdf17d7 100644 --- a/lisp/info-look.el +++ b/lisp/info-look.el @@ -985,9 +985,8 @@ Return nil if there is nothing appropriate in the buffer near point." finally return "(python)Index"))))) (info-lookup-maybe-add-help - :mode 'cperl-mode - :regexp "[$@%][^a-zA-Z]\\|\\$\\^[A-Z]\\|[$@%]?[a-zA-Z][_a-zA-Z0-9]*" - :other-modes '(perl-mode)) + :mode 'perl-mode + :regexp "[$@%][^a-zA-Z]\\|\\$\\^[A-Z]\\|[$@%]?[a-zA-Z][_a-zA-Z0-9]*") (info-lookup-maybe-add-help :mode 'latex-mode diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el index b7c85fe7f43..f10b047cc74 100644 --- a/lisp/progmodes/gud.el +++ b/lisp/progmodes/gud.el @@ -3671,8 +3671,7 @@ Treats actions as defuns." (remove-hook 'after-save-hook #'gdb-create-define-alist t)))) (defcustom gud-tooltip-modes '( gud-mode c-mode c++-mode fortran-mode - python-mode c-ts-mode c++-ts-mode - python-ts-mode) + python-mode) "List of modes for which to enable GUD tooltips." :type '(repeat (symbol :tag "Major mode")) :group 'tooltip) @@ -3708,10 +3707,9 @@ only tooltips in the buffer containing the overlay arrow." #'gud-tooltip-activate-mouse-motions-if-enabled) (dolist (buffer (buffer-list)) (with-current-buffer buffer - (if (and gud-tooltip-mode - (memq major-mode gud-tooltip-modes)) - (gud-tooltip-activate-mouse-motions t) - (gud-tooltip-activate-mouse-motions nil))))) + (gud-tooltip-activate-mouse-motions + (and gud-tooltip-mode + (derived-mode-p gud-tooltip-modes)))))) (defvar gud-tooltip-mouse-motions-active nil "Locally t in a buffer if tooltip processing of mouse motion is enabled.") diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el index b181b21118f..07616960565 100644 --- a/lisp/progmodes/hideshow.el +++ b/lisp/progmodes/hideshow.el @@ -254,6 +254,9 @@ This has effect only if `search-invisible' is set to `open'." ;;;###autoload (defvar hs-special-modes-alist + ;; FIXME: Currently the check is made via + ;; (assoc major-mode hs-special-modes-alist) so it doesn't pay attention + ;; to the mode hierarchy. (mapcar #'purecopy '((c-mode "{" "}" "/[*/]" nil nil) (c-ts-mode "{" "}" "/[*/]" nil nil) From 357eb52e094ee751b2ee2f736f7a5e8cc1cdc99c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 8 Mar 2024 12:39:59 -0500 Subject: [PATCH 446/446] (eglot-server-programs): Comment and whitespace only change * lisp/progmodes/eglot.el (eglot-server-programs): Add comment. Make the definition fit into 80 columns. --- lisp/progmodes/eglot.el | 187 +++++++++++++++++++++------------------- 1 file changed, 99 insertions(+), 88 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index f341428cac3..afe3281361d 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -226,94 +226,105 @@ automatically)." when probe return (cons probe args) finally (funcall err))))))) -(defvar eglot-server-programs `(((rust-ts-mode rust-mode) . ("rust-analyzer")) - ((cmake-mode cmake-ts-mode) . ("cmake-language-server")) - (vimrc-mode . ("vim-language-server" "--stdio")) - ((python-mode python-ts-mode) - . ,(eglot-alternatives - '("pylsp" "pyls" ("pyright-langserver" "--stdio") "jedi-language-server" "ruff-lsp"))) - ((js-json-mode json-mode json-ts-mode) - . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") - ("vscode-json-languageserver" "--stdio") - ("json-languageserver" "--stdio")))) - (((js-mode :language-id "javascript") - (js-ts-mode :language-id "javascript") - (tsx-ts-mode :language-id "typescriptreact") - (typescript-ts-mode :language-id "typescript") - (typescript-mode :language-id "typescript")) - . ("typescript-language-server" "--stdio")) - ((bash-ts-mode sh-mode) . ("bash-language-server" "start")) - ((php-mode phps-mode php-ts-mode) - . ,(eglot-alternatives - '(("phpactor" "language-server") - ("php" "vendor/felixfbecker/language-server/bin/php-language-server.php")))) - ((c-mode c-ts-mode c++-mode c++-ts-mode objc-mode) - . ,(eglot-alternatives - '("clangd" "ccls"))) - (((caml-mode :language-id "ocaml") - (tuareg-mode :language-id "ocaml") reason-mode) - . ("ocamllsp")) - ((ruby-mode ruby-ts-mode) - . ("solargraph" "socket" "--port" :autoport)) - (haskell-mode - . ("haskell-language-server-wrapper" "--lsp")) - (elm-mode . ("elm-language-server")) - (mint-mode . ("mint" "ls")) - ((kotlin-mode kotlin-ts-mode) . ("kotlin-language-server")) - ((go-mode go-dot-mod-mode go-dot-work-mode go-ts-mode go-mod-ts-mode) - . ("gopls")) - ((R-mode ess-r-mode) . ("R" "--slave" "-e" - "languageserver::run()")) - ((java-mode java-ts-mode) . ("jdtls")) - ((dart-mode dart-ts-mode) - . ("dart" "language-server" - "--client-id" "emacs.eglot-dart")) - ((elixir-mode elixir-ts-mode heex-ts-mode) - . ,(if (and (fboundp 'w32-shell-dos-semantics) - (w32-shell-dos-semantics)) - '("language_server.bat") - (eglot-alternatives - '("language_server.sh" "start_lexical.sh")))) - (ada-mode . ("ada_language_server")) - (scala-mode . ,(eglot-alternatives - '("metals" "metals-emacs"))) - (racket-mode . ("racket" "-l" "racket-langserver")) - ((tex-mode context-mode texinfo-mode bibtex-mode) - . ,(eglot-alternatives '("digestif" "texlab"))) - (erlang-mode . ("erlang_ls" "--transport" "stdio")) - ((yaml-ts-mode yaml-mode) . ("yaml-language-server" "--stdio")) - (nix-mode . ,(eglot-alternatives '("nil" "rnix-lsp" "nixd"))) - (nickel-mode . ("nls")) - ((nushell-mode nushell-ts-mode) . ("nu" "--lsp")) - (gdscript-mode . ("localhost" 6008)) - ((fortran-mode f90-mode) . ("fortls")) - (futhark-mode . ("futhark" "lsp")) - ((lua-mode lua-ts-mode) . ,(eglot-alternatives - '("lua-language-server" "lua-lsp"))) - (zig-mode . ("zls")) - ((css-mode css-ts-mode) - . ,(eglot-alternatives '(("vscode-css-language-server" "--stdio") - ("css-languageserver" "--stdio")))) - (html-mode . ,(eglot-alternatives '(("vscode-html-language-server" "--stdio") ("html-languageserver" "--stdio")))) - ((dockerfile-mode dockerfile-ts-mode) . ("docker-langserver" "--stdio")) - ((clojure-mode clojurescript-mode clojurec-mode clojure-ts-mode) - . ("clojure-lsp")) - ((csharp-mode csharp-ts-mode) - . ,(eglot-alternatives - '(("omnisharp" "-lsp") - ("csharp-ls")))) - (purescript-mode . ("purescript-language-server" "--stdio")) - ((perl-mode cperl-mode) . ("perl" "-MPerl::LanguageServer" "-e" "Perl::LanguageServer::run")) - (markdown-mode - . ,(eglot-alternatives - '(("marksman" "server") - ("vscode-markdown-language-server" "--stdio")))) - (graphviz-dot-mode . ("dot-language-server" "--stdio")) - (terraform-mode . ("terraform-ls" "serve")) - ((uiua-ts-mode uiua-mode) . ("uiua" "lsp")) - (sml-mode - . ,(lambda (_interactive project) - (list "millet-ls" (project-root project))))) +(defvar eglot-server-programs + ;; FIXME: Maybe this info should be distributed into the major modes + ;; themselves where they could set a buffer-local `eglot-server-program' + ;; instead of keeping this database centralized. + ;; FIXME: With `derived-mode-add-parents' in Emacs≄30, some of + ;; those entries can be simplified, but we keep them for when + ;; `eglot.el' is installed via GNU ELPA in an older Emacs. + `(((rust-ts-mode rust-mode) . ("rust-analyzer")) + ((cmake-mode cmake-ts-mode) . ("cmake-language-server")) + (vimrc-mode . ("vim-language-server" "--stdio")) + ((python-mode python-ts-mode) + . ,(eglot-alternatives + '("pylsp" "pyls" ("pyright-langserver" "--stdio") + "jedi-language-server" "ruff-lsp"))) + ((js-json-mode json-mode json-ts-mode) + . ,(eglot-alternatives '(("vscode-json-language-server" "--stdio") + ("vscode-json-languageserver" "--stdio") + ("json-languageserver" "--stdio")))) + (((js-mode :language-id "javascript") + (js-ts-mode :language-id "javascript") + (tsx-ts-mode :language-id "typescriptreact") + (typescript-ts-mode :language-id "typescript") + (typescript-mode :language-id "typescript")) + . ("typescript-language-server" "--stdio")) + ((bash-ts-mode sh-mode) . ("bash-language-server" "start")) + ((php-mode phps-mode php-ts-mode) + . ,(eglot-alternatives + '(("phpactor" "language-server") + ("php" "vendor/felixfbecker/language-server/bin/php-language-server.php")))) + ((c-mode c-ts-mode c++-mode c++-ts-mode objc-mode) + . ,(eglot-alternatives + '("clangd" "ccls"))) + (((caml-mode :language-id "ocaml") + (tuareg-mode :language-id "ocaml") reason-mode) + . ("ocamllsp")) + ((ruby-mode ruby-ts-mode) + . ("solargraph" "socket" "--port" :autoport)) + (haskell-mode + . ("haskell-language-server-wrapper" "--lsp")) + (elm-mode . ("elm-language-server")) + (mint-mode . ("mint" "ls")) + ((kotlin-mode kotlin-ts-mode) . ("kotlin-language-server")) + ((go-mode go-dot-mod-mode go-dot-work-mode go-ts-mode go-mod-ts-mode) + . ("gopls")) + ((R-mode ess-r-mode) . ("R" "--slave" "-e" + "languageserver::run()")) + ((java-mode java-ts-mode) . ("jdtls")) + ((dart-mode dart-ts-mode) + . ("dart" "language-server" + "--client-id" "emacs.eglot-dart")) + ((elixir-mode elixir-ts-mode heex-ts-mode) + . ,(if (and (fboundp 'w32-shell-dos-semantics) + (w32-shell-dos-semantics)) + '("language_server.bat") + (eglot-alternatives + '("language_server.sh" "start_lexical.sh")))) + (ada-mode . ("ada_language_server")) + (scala-mode . ,(eglot-alternatives + '("metals" "metals-emacs"))) + (racket-mode . ("racket" "-l" "racket-langserver")) + ((tex-mode context-mode texinfo-mode bibtex-mode) + . ,(eglot-alternatives '("digestif" "texlab"))) + (erlang-mode . ("erlang_ls" "--transport" "stdio")) + ((yaml-ts-mode yaml-mode) . ("yaml-language-server" "--stdio")) + (nix-mode . ,(eglot-alternatives '("nil" "rnix-lsp" "nixd"))) + (nickel-mode . ("nls")) + ((nushell-mode nushell-ts-mode) . ("nu" "--lsp")) + (gdscript-mode . ("localhost" 6008)) + ((fortran-mode f90-mode) . ("fortls")) + (futhark-mode . ("futhark" "lsp")) + ((lua-mode lua-ts-mode) . ,(eglot-alternatives + '("lua-language-server" "lua-lsp"))) + (zig-mode . ("zls")) + ((css-mode css-ts-mode) + . ,(eglot-alternatives '(("vscode-css-language-server" "--stdio") + ("css-languageserver" "--stdio")))) + (html-mode . ,(eglot-alternatives + '(("vscode-html-language-server" "--stdio") + ("html-languageserver" "--stdio")))) + ((dockerfile-mode dockerfile-ts-mode) . ("docker-langserver" "--stdio")) + ((clojure-mode clojurescript-mode clojurec-mode clojure-ts-mode) + . ("clojure-lsp")) + ((csharp-mode csharp-ts-mode) + . ,(eglot-alternatives + '(("omnisharp" "-lsp") + ("csharp-ls")))) + (purescript-mode . ("purescript-language-server" "--stdio")) + ((perl-mode cperl-mode) + . ("perl" "-MPerl::LanguageServer" "-e" "Perl::LanguageServer::run")) + (markdown-mode + . ,(eglot-alternatives + '(("marksman" "server") + ("vscode-markdown-language-server" "--stdio")))) + (graphviz-dot-mode . ("dot-language-server" "--stdio")) + (terraform-mode . ("terraform-ls" "serve")) + ((uiua-ts-mode uiua-mode) . ("uiua" "lsp")) + (sml-mode + . ,(lambda (_interactive project) + (list "millet-ls" (project-root project))))) "How the command `eglot' guesses the server to start. An association list of (MAJOR-MODE . CONTACT) pairs. MAJOR-MODE identifies the buffers that are to be managed by a specific