From 96a3b473fa5e152bf2f069f9eca10c370b311c25 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 23 Jul 2020 17:12:33 +0200 Subject: Fix viewing of encrypted S/MIME messages * lisp/gnus/mm-decode.el (mm-possibly-verify-or-decrypt): Don't add a content-type header if there already is one (bug#41659). --- lisp/gnus/mm-decode.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index d33bb56dc9e..a340418507f 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1680,8 +1680,14 @@ If RECURSIVE, search recursively." (t (y-or-n-p (format "Decrypt (S/MIME) part? ")))) (mm-view-pkcs7 parts from)) - (goto-char (point-min)) - (insert "Content-type: text/plain\n\n") + ;; Normally there will be a Content-type header here, but + ;; some mailers don't add that to the encrypted part, which + ;; makes the subsequent re-dissection fail here. + (save-restriction + (mail-narrow-to-head) + (unless (mail-fetch-field "content-type") + (goto-char (point-max)) + (insert "Content-type: text/plain\n\n"))) (setq parts (mm-dissect-buffer t))))) ((equal subtype "signed") (unless (and (setq protocol -- cgit v1.2.3 From d5acc509415869bce22c49ae311f2960494a0bdc Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 24 Jul 2020 17:47:59 +0300 Subject: Fix description of kmacro-* commands in the user manual * doc/emacs/kmacro.texi (Basic Keyboard Macro): Separate old-style macro definition commands from the new style in the summary table. (Bug#42492) --- doc/emacs/kmacro.texi | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/doc/emacs/kmacro.texi b/doc/emacs/kmacro.texi index 7e5085cd2f5..7b1d365ff04 100644 --- a/doc/emacs/kmacro.texi +++ b/doc/emacs/kmacro.texi @@ -49,23 +49,30 @@ intelligent or general. For such things, Lisp must be used. @table @kbd @item @key{F3} -@itemx C-x ( Start defining a keyboard macro (@code{kmacro-start-macro-or-insert-counter}). @item @key{F4} -@itemx C-x e If a keyboard macro is being defined, end the definition; otherwise, execute the most recent keyboard macro (@code{kmacro-end-or-call-macro}). @item C-u @key{F3} -@itemx C-u C-x ( Re-execute last keyboard macro, then append keys to its definition. @item C-u C-u @key{F3} -@itemx C-u C-u C-x ( Append keys to the last keyboard macro without re-executing it. @item C-x C-k r Run the last keyboard macro on each line that begins in the region (@code{apply-macro-to-region-lines}). +@item C-x ( +Start defining a keyboard macro (old style) +(@code{kmacro-start-macro}); with a prefix argument, append keys to +the last macro. +@item C-x ) +End a macro definition (old style) (@code{kmacro-end-macro}); prefix +argument serves as the repeat count for executing the macro. +@item C-x e +Execute the most recently defined keyboard macro +(@code{kmacro-end-and-call-macro}); prefix argument serves as repeat +count. @end table @kindex F3 -- cgit v1.2.3 From efdd4632c95cc6be6efc099cfed051022fff7a84 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Fri, 5 Jun 2020 12:54:01 +0000 Subject: Fix Arabic shaping when column-number-mode is in effect * src/indent.c (scan_for_column, compute_motion): Pass -1, instead of NEUTRAL_DIR, to 'composition_reseat_it'. * src/composite.c (composition_reseat_it): Interpret negative value of BIDI_LEVEL to mean the caller doesn't know what is the bidi direction of the text. (Bug#41005) --- src/composite.c | 4 +++- src/indent.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/composite.c b/src/composite.c index 364d5c9316e..2fbe6796b59 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1217,7 +1217,9 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos, continue; if (charpos < endpos) { - if ((bidi_level & 1) == 0) + if (bidi_level < 0) + direction = Qnil; + else if ((bidi_level & 1) == 0) direction = QL2R; else direction = QR2L; diff --git a/src/indent.c b/src/indent.c index f7db42783c1..939e5931db0 100644 --- a/src/indent.c +++ b/src/indent.c @@ -598,7 +598,7 @@ scan_for_column (ptrdiff_t *endpos, EMACS_INT *goalcol, ptrdiff_t *prevcol) if (cmp_it.id >= 0 || (scan == cmp_it.stop_pos && composition_reseat_it (&cmp_it, scan, scan_byte, end, - w, NEUTRAL_DIR, NULL, Qnil))) + w, -1, NULL, Qnil))) composition_update_it (&cmp_it, scan, scan_byte, Qnil); if (cmp_it.id >= 0) { @@ -1506,7 +1506,7 @@ compute_motion (ptrdiff_t from, ptrdiff_t frombyte, EMACS_INT fromvpos, if (cmp_it.id >= 0 || (pos == cmp_it.stop_pos && composition_reseat_it (&cmp_it, pos, pos_byte, to, win, - NEUTRAL_DIR, NULL, Qnil))) + -1, NULL, Qnil))) composition_update_it (&cmp_it, pos, pos_byte, Qnil); if (cmp_it.id >= 0) { -- cgit v1.2.3 From 4b3085a7fe8980432aa63ddf614fee2a6fb04e94 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 25 Jul 2020 19:25:02 +0300 Subject: Fix last change * src/composite.c (composition_reseat_it): Fix of the commentary, and a minor change of the last fix. --- src/composite.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/composite.c b/src/composite.c index 2fbe6796b59..a5288cb8a25 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1171,7 +1171,9 @@ composition_compute_stop_pos (struct composition_it *cmp_it, ptrdiff_t charpos, character to check, and CHARPOS and BYTEPOS are indices in the string. In that case, FACE must not be NULL. BIDI_LEVEL is the bidi embedding level of the current paragraph, and is used to calculate the - direction argument to pass to the font shaper. + direction argument to pass to the font shaper; value of -1 means the + caller doesn't know the embedding level (used by callers which didn't + invoke the display routines that perform bidi-display-reordering). If the character is composed, setup members of CMP_IT (id, nglyphs, from, to, reversed_p), and return true. Otherwise, update @@ -1256,7 +1258,16 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos, else bpos = CHAR_TO_BYTE (cpos); } - if ((bidi_level & 1) == 0) + /* The bidi_level < 0 case below strictly speaking should + never happen, since we get here when bidi scan direction + is backward in the buffer, which can only happen if the + display routines were called to perform the bidi + reordering. But it doesn't harm to test for that, and + avoid someon raising their brows and thinking it's a + subtle bug... */ + if (bidi_level < 0) + direction = Qnil; + else if ((bidi_level & 1) == 0) direction = QL2R; else direction = QR2L; -- cgit v1.2.3 From bde5f5f8978f704f24cce2fc7beec8c740d0e331 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 25 Jul 2020 23:04:05 +0200 Subject: Backport: Add module test for edge case. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This backports commit 6355a3ec62 from master. Since the bug isn’t present in emacs-27, just backport the test case. * test/data/emacs-module/mod-test.c (Fmod_test_invalid_store_copy): New test module function. (emacs_module_init): Export it. * test/src/emacs-module-tests.el (module--test-assertions--load-non-live-object-with-global-copy): New unit test. --- test/data/emacs-module/mod-test.c | 18 ++++++++++++++++++ test/src/emacs-module-tests.el | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index 8dc9ff144af..f6c1c7cf3d2 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -296,6 +296,22 @@ Fmod_test_invalid_load (emacs_env *env, ptrdiff_t nargs, emacs_value *args, return invalid_stored_value; } +/* The next function works in conjunction with the two previous ones. + It stows away a copy of the object created by + `Fmod_test_invalid_store' in a global reference. Module assertions + should still detect the invalid load of the local reference. */ + +static emacs_value global_copy_of_invalid_stored_value; + +static emacs_value +Fmod_test_invalid_store_copy (emacs_env *env, ptrdiff_t nargs, + emacs_value *args, void *data) +{ + emacs_value local = Fmod_test_invalid_store (env, 0, NULL, NULL); + return global_copy_of_invalid_stored_value + = env->make_global_ref (env, local); +} + /* An invalid finalizer: Finalizers are run during garbage collection, where Lisp code can’t be executed. -module-assertions tests for this case. */ @@ -559,6 +575,8 @@ emacs_module_init (struct emacs_runtime *ert) DEFUN ("mod-test-vector-fill", Fmod_test_vector_fill, 2, 2, NULL, NULL); DEFUN ("mod-test-vector-eq", Fmod_test_vector_eq, 2, 2, NULL, NULL); DEFUN ("mod-test-invalid-store", Fmod_test_invalid_store, 0, 0, NULL, NULL); + DEFUN ("mod-test-invalid-store-copy", Fmod_test_invalid_store_copy, 0, 0, + NULL, NULL); DEFUN ("mod-test-invalid-load", Fmod_test_invalid_load, 0, 0, NULL, NULL); DEFUN ("mod-test-invalid-finalizer", Fmod_test_invalid_finalizer, 0, 0, NULL, NULL); diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index 6f14d4f7fa3..de707a4243a 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el @@ -270,6 +270,24 @@ must evaluate to a regular expression string." (mod-test-invalid-store) (mod-test-invalid-load))) +(ert-deftest module--test-assertions--load-non-live-object-with-global-copy () + "Check that -module-assertions verify that non-live objects aren't accessed. +This differs from `module--test-assertions-load-non-live-object' +in that it stows away a global reference. The module assertions +should nevertheless detect the invalid load." + (skip-unless (or (file-executable-p mod-test-emacs) + (and (eq system-type 'windows-nt) + (file-executable-p (concat mod-test-emacs ".exe"))))) + ;; This doesn't yet cause undefined behavior. + (should (eq (mod-test-invalid-store-copy) 123)) + (module--test-assertion (rx "Emacs value not found in " + (+ digit) " values of " + (+ digit) " environments\n") + ;; Storing and reloading a local value causes undefined behavior, + ;; which should be detected by the module assertions. + (mod-test-invalid-store-copy) + (mod-test-invalid-load))) + (ert-deftest module--test-assertions--call-emacs-from-gc () "Check that -module-assertions prevents calling Emacs functions during garbage collection." -- cgit v1.2.3 From 3838aeb7397ce80134c70fd49f7e9e5ef7aff3e5 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 25 Jul 2020 23:23:19 +0200 Subject: Backport: add another test case for module assertions. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This backports commit 9f01ce6327 from master. Since the bug isn’t present on emacs-27, just backport the new test case. * test/data/emacs-module/mod-test.c (Fmod_test_globref_invalid_free): New test module function. (emacs_module_init): Export it. * test/src/emacs-module-tests.el (module--test-assertions--globref-invalid-free): New unit test. --- test/data/emacs-module/mod-test.c | 14 ++++++++++++++ test/src/emacs-module-tests.el | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index f6c1c7cf3d2..986c20ae8f9 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -191,7 +191,19 @@ Fmod_test_globref_free (emacs_env *env, ptrdiff_t nargs, emacs_value args[], return env->intern (env, "ok"); } +/* Treat a local reference as global and free it. Module assertions + should detect this case even if a global reference representing the + same object also exists. */ +static emacs_value +Fmod_test_globref_invalid_free (emacs_env *env, ptrdiff_t nargs, + emacs_value *args, void *data) +{ + emacs_value local = env->make_integer (env, 9876); + env->make_global_ref (env, local); + env->free_global_ref (env, local); /* Not allowed. */ + return env->intern (env, "nil"); +} /* Return a copy of the argument string where every 'a' is replaced with 'b'. */ @@ -569,6 +581,8 @@ emacs_module_init (struct emacs_runtime *ert) 1, 1, NULL, NULL); DEFUN ("mod-test-globref-make", Fmod_test_globref_make, 0, 0, NULL, NULL); DEFUN ("mod-test-globref-free", Fmod_test_globref_free, 4, 4, NULL, NULL); + DEFUN ("mod-test-globref-invalid-free", Fmod_test_globref_invalid_free, 0, 0, + NULL, NULL); DEFUN ("mod-test-string-a-to-b", Fmod_test_string_a_to_b, 1, 1, NULL, NULL); DEFUN ("mod-test-userptr-make", Fmod_test_userptr_make, 1, 1, NULL, NULL); DEFUN ("mod-test-userptr-get", Fmod_test_userptr_get, 1, 1, NULL, NULL); diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index de707a4243a..e9f13ba368b 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el @@ -299,6 +299,17 @@ during garbage collection." (mod-test-invalid-finalizer) (garbage-collect))) +(ert-deftest module--test-assertions--globref-invalid-free () + "Check that -module-assertions detects invalid freeing of a +local reference." + (skip-unless (or (file-executable-p mod-test-emacs) + (and (eq system-type 'windows-nt) + (file-executable-p (concat mod-test-emacs ".exe"))))) + (module--test-assertion + (rx "Global value was not found in list of " (+ digit) " globals") + (mod-test-globref-invalid-free) + (garbage-collect))) + (ert-deftest module/describe-function-1 () "Check that Bug#30163 is fixed." (with-temp-buffer -- cgit v1.2.3 From 73a2f5104331264656ac830c848912af9389a04b Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 26 Jul 2020 22:54:33 +0200 Subject: Add another test for global module references * test/src/emacs-module-tests.el (mod-test-globref-reordered): New unit test. * test/data/emacs-module/mod-test.c (Fmod_test_globref_reordered): New test module function. (emacs_module_init): Export it. --- test/data/emacs-module/mod-test.c | 31 +++++++++++++++++++++++++++++++ test/src/emacs-module-tests.el | 3 +++ 2 files changed, 34 insertions(+) diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index 986c20ae8f9..8d1b421bb40 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -205,6 +205,35 @@ Fmod_test_globref_invalid_free (emacs_env *env, ptrdiff_t nargs, return env->intern (env, "nil"); } +/* Allocate and free global references in a different order. */ + +static emacs_value +Fmod_test_globref_reordered (emacs_env *env, ptrdiff_t nargs, + emacs_value *args, void *data) +{ + emacs_value booleans[2] = { + env->intern (env, "nil"), + env->intern (env, "t"), + }; + emacs_value local = env->intern (env, "foo"); + emacs_value globals[4] = { + env->make_global_ref (env, local), + env->make_global_ref (env, local), + env->make_global_ref (env, env->intern (env, "foo")), + env->make_global_ref (env, env->intern (env, "bar")), + }; + emacs_value elements[4]; + for (int i = 0; i < 4; ++i) + elements[i] = booleans[env->eq (env, globals[i], local)]; + emacs_value ret = env->funcall (env, env->intern (env, "list"), 4, elements); + env->free_global_ref (env, globals[2]); + env->free_global_ref (env, globals[1]); + env->free_global_ref (env, globals[3]); + env->free_global_ref (env, globals[0]); + return ret; +} + + /* Return a copy of the argument string where every 'a' is replaced with 'b'. */ static emacs_value @@ -583,6 +612,8 @@ emacs_module_init (struct emacs_runtime *ert) DEFUN ("mod-test-globref-free", Fmod_test_globref_free, 4, 4, NULL, NULL); DEFUN ("mod-test-globref-invalid-free", Fmod_test_globref_invalid_free, 0, 0, NULL, NULL); + DEFUN ("mod-test-globref-reordered", Fmod_test_globref_reordered, 0, 0, NULL, + NULL); DEFUN ("mod-test-string-a-to-b", Fmod_test_string_a_to_b, 1, 1, NULL, NULL); DEFUN ("mod-test-userptr-make", Fmod_test_userptr_make, 1, 1, NULL, NULL); DEFUN ("mod-test-userptr-get", Fmod_test_userptr_get, 1, 1, NULL, NULL); diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el index e9f13ba368b..91206156f85 100644 --- a/test/src/emacs-module-tests.el +++ b/test/src/emacs-module-tests.el @@ -160,6 +160,9 @@ changes." (ert-deftest mod-test-globref-free-test () (should (eq (mod-test-globref-free 1 'a "test" 'b) 'ok))) +(ert-deftest mod-test-globref-reordered () + (should (equal (mod-test-globref-reordered) '(t t t nil)))) + (ert-deftest mod-test-string-a-to-b-test () (should (string= (mod-test-string-a-to-b "aaa") "bbb"))) -- cgit v1.2.3 From 688c03f41278a33f580b56c2122d7f52c9a3ed67 Mon Sep 17 00:00:00 2001 From: João Távora Date: Mon, 27 Jul 2020 16:26:33 +0100 Subject: Bring back ElDoc's eldoc-display-message-p, but obsolete it Like others, this is an implementation detail that third parties could be relying on. Better not remove it outright just now, since its implementation is very simple anyway. * lisp/emacs-lisp/eldoc.el (Version): Bump to 1.7.0 (eldoc-display-message-p): Bring back, but obsolete. --- lisp/emacs-lisp/eldoc.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index fcb104e5477..b30836cc0bd 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -5,7 +5,7 @@ ;; Author: Noah Friedman ;; Keywords: extensions ;; Created: 1995-10-06 -;; Version: 1.6.0 +;; Version: 1.7.0 ;; Package-Requires: ((emacs "26.3")) ;; This is a GNU ELPA :core package. Avoid functionality that is not @@ -346,6 +346,12 @@ Also store it in `eldoc-last-message' and return that value." "Compute information to store in `eldoc--last-request-state'." (list (current-buffer) (buffer-modified-tick) (point))) +(defun eldoc-display-message-p () + (eldoc--request-docs-p (eldoc--request-state))) +(make-obsolete 'eldoc-display-message-p + "Use `eldoc-documentation-functions' instead." + "eldoc-1.6.0") + (defun eldoc--request-docs-p (request-state) "Return non-nil when it is appropriate to request docs. REQUEST-STATE is a candidate for `eldoc--last-request-state'" -- cgit v1.2.3 From 9d751aa82202a2e081531f004c1bb0c0dbd9a0d3 Mon Sep 17 00:00:00 2001 From: João Távora Date: Mon, 27 Jul 2020 22:07:38 +0100 Subject: Make newer ElDoc versions are compatible with Emacs < 28 Fixes: bug#42563 For some time, Eldoc has has some Elisp-specific code that shouldn't live there, but in elisp-mode.el. This can be fixed in Emacs master, but since ElDoc is distributed in GNU Elpa and is meant to work with Emacs 26 and 27, this means that that elisp-specific code must still be distributed with eldoc.el and kept up to date. * lisp/emacs-lisp/eldoc.el (eldoc--eval-expression-setup): Ensure implementation is compatible with Emacs < 28. (Version): Bump to 1.8 --- lisp/emacs-lisp/eldoc.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index b30836cc0bd..19b3bd78aea 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -5,7 +5,7 @@ ;; Author: Noah Friedman ;; Keywords: extensions ;; Created: 1995-10-06 -;; Version: 1.7.0 +;; Version: 1.8.0 ;; Package-Requires: ((emacs "26.3")) ;; This is a GNU ELPA :core package. Avoid functionality that is not @@ -229,11 +229,15 @@ expression point is on." :lighter eldoc-minor-mode-string (defun eldoc--eval-expression-setup () ;; Setup `eldoc', similar to `emacs-lisp-mode'. FIXME: Call ;; `emacs-lisp-mode' itself? - (add-hook 'eldoc-documentation-functions - #'elisp-eldoc-var-docstring nil t) - (add-hook 'eldoc-documentation-functions - #'elisp-eldoc-funcall nil t) - (setq eldoc-documentation-strategy 'eldoc-documentation-default) + (cond ((<= emacs-major-version 27) + (declare-function elisp-eldoc-documentation-function "elisp-mode") + (add-function :before-until (local 'eldoc-documentation-function) + #'elisp-eldoc-documentation-function)) + (t (add-hook 'eldoc-documentation-functions + #'elisp-eldoc-var-docstring nil t) + (add-hook 'eldoc-documentation-functions + #'elisp-eldoc-funcall nil t) + (setq eldoc-documentation-strategy 'eldoc-documentation-default))) (eldoc-mode +1)) ;;;###autoload -- cgit v1.2.3 From 9903b391481a6e3c83ccb3d5325e210cfd3eb950 Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Mon, 27 Jul 2020 15:36:09 -0700 Subject: * doc/misc/gnus.texi: Add introductory section to Gnus manual "Don't Panic: Your first 20 minutes with Gnus." --- doc/misc/gnus.texi | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 2f4bc0cbf85..584c54674dd 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -402,6 +402,7 @@ This manual corresponds to Gnus v5.13 @end iftex @menu +* Don't Panic:: Your first 20 minutes with Gnus. * Starting Up:: Finding news can be a pain. * Group Buffer:: Selecting, subscribing and killing groups. * Summary Buffer:: Reading, saving and posting articles. @@ -947,6 +948,140 @@ Emacs for Heathens @end detailmenu @end menu +@node Don't Panic +@chapter Don't Panic +@cindex don't panic +@cindex introduction to Gnus + +Welcome, gentle user, to the Gnus newsreader and email client! Gnus +is unlike most clients, in part because of its endless +configurability, in part because of its historical origins. Gnus is +now a fully-featured email client, but it began life as a Usenet-style +newsreader, and its genes are still newsreader genes. Thus it behaves +a little differently than most mail clients. + +The typical assumptions of a newsreader are: + +@enumerate +@item +The server offers a potentially enormous number of newsgroups on a +variety of subjects. The user may only be interested in some of those +groups, and more interested in some than others. +@item +Many groups see a high volume of articles, and the user won't want to +read all of them. Mechanisms are needed for foregrounding interesting +articles, and backgrounding uninteresting articles. +@item +Once a group has been scanned and dealt with by the user, it's +unlikely to be of further interest until new articles come in. +@end enumerate + +These assumptions lead to certain default Gnus behaviors: + +@enumerate +@item +Not all interesting groups are equally interesting, thus groups have +varying degrees of ``subscribedness'', with different behavior +depending on ``how subscribed'' a group is. +@item +There are many commands and tools for scoring and sorting articles, +or otherwise sweeping them under the rug. +@item +Gnus will only show you groups with unread or ticked articles; +groups with no new articles are hidden. +@item +When entering a group, only unread or ticked articles are shown, +all other articles are hidden. +@end enumerate + +If this seems draconian, think of it as Automatic Inbox Zero. This is +the way Gnus works by default. It is possible to make it work more +like an email client (always showing read groups and read articles), +but that takes some effort on the part of the user. + +The brief introduction below should be enough to get you off the +ground. + +@heading The Basics of Servers, Groups, and Articles +@cindex servers +@cindex groups +@cindex articles + +The fundamental building blocks of Gnus are @dfn{servers}, +@dfn{groups}, and @dfn{articles}. Servers can be local or remote. +Each server maintains a list of groups, and those groups contain +articles. Because Gnus presents a unified interface to a wide variety +of servers, the vocabulary doesn't always quite line up (see @ref{FAQ +- Glossary}, for a more complete glossary). Thus a local maildir is +referred to as a ``server'' (@pxref{Finding the News}) the same as a +Usenet or IMAP server is; ``groups'' (@pxref{Group Buffer}) might mean +an NNTP group, IMAP folder, or local mail directory; and an +``article'' (@pxref{Summary Buffer}) might elsewhere be known as a +message or an email. Gnus employs unified terms for all these things. + +Servers fall into two general categories: ``news-like'', meaning that +the articles are part of a public archive and can't be manipulated by +the user; and ``mail-like'', meaning that the articles are owned by +the user, who can freely edit them, move them around, and delete +them. + +For news-like servers, which typically offer hundreds or thousands of +groups, it's important to be able to subscribe to a subset of those +groups. For mail-like servers, the user is generally automatically +subscribed to all groups (though IMAP, for example, also allows +selective subscription). To change group subscription, enter the +Server buffer (with @kbd{^}) and press @kbd{@key{RET}} on the server +in question. From here, Gnus provides commands to change or toggle +your group subscriptions (@pxref{Browse Foreign Server}). + +A Gnus installation is basically just a list of one or more servers, +plus the user's subscribed groups from those servers, plus articles in +those groups. + +Servers can be added and configured in two places: in the user's +gnus.el startup file, using the @code{gnus-select-method} and +@code{gnus-secondary-select-methods} options, or within Gnus itself +using interactive commands in the Server buffer. @xref{Finding +the News}, for details. + + +@heading Fetching Mail + +New mail has to come from somewhere. Some servers, such as NNTP or +IMAP, are themselves responsible for fetching newly-arrived articles. +Others, such as maildir or mbox servers, only store articles and don't +fetch them from anywhere. + +In the latter case, Gnus provides for @code{mail sources}: places +where new mail is fetched from. A mail source might be a local spool, +or a remote POP server, or some other source of incoming articles. +Mail sources are usually configured globally, but can be specified +per-group (@pxref{Mail Sources} for more information). + +@xref{Scanning New Messages}, for details on fetching new mail. + +@heading Viewing Mail + +By default, Gnus's Group buffer only displays groups with unread +articles. It is always possible to display all the groups temporarily +with @kbd{L}, and to configure Gnus to always display some groups +(@pxref{Listing Groups}). + +@xref{Selecting a Group}, for how to enter a group, and @pxref{Summary +Buffer} for what to do once you're there. + +@heading Sending Mail + +New message composition can be initiated from the Group buffer +(@pxref{Misc Group Stuff}). If you're in a Summary buffer, you can +compose replies and forward emails in addition to starting new +messages, see @ref{Summary Mail Commands}, for details. + +For information about what happens once you've started composing a +message, see @ref{Composing Messages}. For information on setting up +@acronym{SMTP} servers in particular, see @ref{Mail Variables, ,Mail +Variables,message,Message manual}. + @node Starting Up @chapter Starting Gnus @cindex starting up -- cgit v1.2.3 From 3bd748ebbaa2eef993a551cea1c7ddecc563f8d7 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 28 Jul 2020 00:46:30 +0200 Subject: Fix problem with new-mail-mark in Gnus with non-unique names * lisp/gnus/gnus-group.el (gnus-group-new-mail): Call with Gnus group name. (gnus-group-catchup): Ditto. * lisp/gnus/gnus-sum.el (gnus-summary-exit): Ditto. * lisp/gnus/nnimap.el (nnimap-update-info): Store Gnus group name. * lisp/gnus/nnmail.el (nnmail-check-duplication): Store unique Gnus names in the history instead of backend-specific (possibly duplicated) group names (bug#41842). --- lisp/gnus/gnus-group.el | 4 ++-- lisp/gnus/gnus-sum.el | 2 +- lisp/gnus/nnimap.el | 3 +-- lisp/gnus/nnmail.el | 8 +++++++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el index b207c4f1e06..97e10a37a21 100644 --- a/lisp/gnus/gnus-group.el +++ b/lisp/gnus/gnus-group.el @@ -1768,7 +1768,7 @@ already. If INFO-UNCHANGED is non-nil, dribble buffer is not updated." (get-text-property (point-at-bol) 'gnus-unread)) (defun gnus-group-new-mail (group) - (if (nnmail-new-mail-p (gnus-group-real-name group)) + (if (nnmail-new-mail-p group) gnus-new-mail-mark ?\s)) @@ -3600,7 +3600,7 @@ or nil if no action could be taken." (marks (gnus-info-marks (nth 1 entry))) (unread (gnus-sequence-of-unread-articles group))) ;; Remove entries for this group. - (nnmail-purge-split-history (gnus-group-real-name group)) + (nnmail-purge-split-history group) ;; Do the updating only if the newsgroup isn't killed. (if (not (numberp (car entry))) (gnus-message 1 "Can't catch up %s; non-active group" group) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index d731893ecec..c1216a0cc24 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -7311,7 +7311,7 @@ If FORCE (the prefix), also save the .newsrc file(s)." (when gnus-use-cache (gnus-cache-write-active)) ;; Remove entries for this group. - (nnmail-purge-split-history (gnus-group-real-name group)) + (nnmail-purge-split-history group) ;; Make all changes in this group permanent. (unless quit-config (gnus-run-hooks 'gnus-exit-group-hook) diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 3c4e75ede82..be8ad9a6723 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -1670,8 +1670,7 @@ If LIMIT, first try to limit the search to the N last articles." (when (and active recent (> (car (last recent)) (cdr active))) - (push (list (cons (gnus-group-real-name group) 0)) - nnmail-split-history))) + (push (list (cons group 0)) nnmail-split-history))) ;; Note the active level for the next run-through. (gnus-group-set-parameter info 'active (gnus-active group)) (gnus-group-set-parameter info 'uidvalidity uidvalidity) diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el index 3be843c91f1..729f8e347c7 100644 --- a/lisp/gnus/nnmail.el +++ b/lisp/gnus/nnmail.el @@ -1749,7 +1749,13 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (nreverse (nnmail-article-group artnum-func)))))) ;; Add the group-art list to the history list. (if group-art - (push group-art nnmail-split-history) + ;; We need to get the unique Gnus group name for this article + ;; -- there may be identically named groups from several + ;; backends. + (push (cons (gnus-group-prefixed-name (car group-art) + gnus-command-method) + (cdr group-art)) + nnmail-split-history) (delete-region (point-min) (point-max))))) ;;; Get new mail. -- cgit v1.2.3 From b2bb1135d81a533a578c51389831d6aecfa2a5b2 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 28 Jul 2020 00:51:29 +0200 Subject: Fix thinko in previous nnmail.el patch * lisp/gnus/nnmail.el (nnmail-check-duplication): Fix thinko in previous patch -- group-art is a list of pairs, not a pair. --- lisp/gnus/nnmail.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el index 729f8e347c7..b6308140fc9 100644 --- a/lisp/gnus/nnmail.el +++ b/lisp/gnus/nnmail.el @@ -1752,9 +1752,11 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." ;; We need to get the unique Gnus group name for this article ;; -- there may be identically named groups from several ;; backends. - (push (cons (gnus-group-prefixed-name (car group-art) - gnus-command-method) - (cdr group-art)) + (push (mapcar + (lambda (ga) + (cons (gnus-group-prefixed-name (car ga) gnus-command-method) + (cdr ga))) + group-art) nnmail-split-history) (delete-region (point-min) (point-max))))) -- cgit v1.2.3 From 1b2fed81e1f79fd12bfb76adfa2a79d7ddbcaed0 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 28 Jul 2020 09:21:01 +0200 Subject: Apply simpler fix for Tramp bug#39399 * lisp/net/tramp-sh.el (tramp-open-shell): Remove "~/.editrc" editing. (tramp-open-connection-setup-interactive-shell): Move up "set +o vi +o emacs" command. (Bug#39399) --- lisp/net/tramp-sh.el | 127 +++++++++++++++++++++------------------------------ 1 file changed, 53 insertions(+), 74 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 0e55d603a3b..4dc95b1bb05 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -4093,79 +4093,53 @@ file exists and nonzero exit status otherwise." (defun tramp-open-shell (vec shell) "Open shell SHELL." + ;; Find arguments for this shell. (with-tramp-progress-reporter vec 5 (format-message "Opening remote shell `%s'" shell) - ;; Find arguments for this shell. - (let ((extra-args (tramp-get-sh-extra-args shell)) - (p (tramp-get-connection-process vec))) - ;; The readline library can disturb Tramp. For example, the - ;; very recent version of libedit, the *BSD implementation of - ;; readline, confuses Tramp. So we disable line editing. Since - ;; $EDITRC is not supported on all target systems, we must move - ;; ~/.editrc temporarily somewhere else. For bash and zsh we - ;; have disabled this already during shell invocation, see - ;; `tramp-sh-extra-args' (Bug#39399). - ;; The shell prompt might not be set yet, so we must read any - ;; prompt via `tramp-barf-if-no-shell-prompt'. - (unless extra-args - (tramp-send-command vec "rm -f ~/.editrc.tramp" t t) - (tramp-barf-if-no-shell-prompt p 10 "Couldn't find remote shell prompt") - (tramp-send-command - vec "test -e ~/.editrc && mv -f ~/.editrc ~/.editrc.tramp" t t) - (tramp-barf-if-no-shell-prompt p 10 "Couldn't find remote shell prompt") - (tramp-send-command vec "echo 'edit off' >~/.editrc" t t) - (tramp-barf-if-no-shell-prompt - p 10 "Couldn't find remote shell prompt")) - ;; It is useful to set the prompt in the following command - ;; because some people have a setting for $PS1 which /bin/sh - ;; doesn't know about and thus /bin/sh will display a strange - ;; prompt. For example, if $PS1 has "${CWD}" in the value, then - ;; ksh will display the current working directory but /bin/sh - ;; will display a dollar sign. The following command line sets - ;; $PS1 to a sane value, and works under Bourne-ish shells as - ;; well as csh-like shells. We also unset the variable $ENV - ;; because that is read by some sh implementations (eg, bash - ;; when called as sh) on startup; this way, we avoid the startup - ;; file clobbering $PS1. $PROMPT_COMMAND is another way to set - ;; the prompt in /bin/bash, it must be discarded as well. - ;; $HISTFILE is set according to `tramp-histfile-override'. - ;; $TERM and $INSIDE_EMACS set here to ensure they have the - ;; correct values when the shell starts, not just processes - ;; run within the shell. (Which processes include our - ;; initial probes to ensure the remote shell is usable.) - (tramp-send-command - vec (format - (concat - "exec env TERM='%s' INSIDE_EMACS='%s,tramp:%s' " - "ENV=%s %s PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s") - tramp-terminal-type - (or (getenv "INSIDE_EMACS") emacs-version) tramp-version - (or (getenv-internal "ENV" tramp-remote-process-environment) "") - (if (stringp tramp-histfile-override) - (format "HISTFILE=%s" - (tramp-shell-quote-argument tramp-histfile-override)) - (if tramp-histfile-override - "HISTFILE='' HISTFILESIZE=0 HISTSIZE=0" - "")) - (tramp-shell-quote-argument tramp-end-of-output) - shell (or extra-args "")) - t) - ;; Reset ~/.editrc. - (unless extra-args - (tramp-send-command vec "rm -f ~/.editrc" t) - (tramp-send-command - vec "test -e ~/.editrc.tramp && mv -f ~/.editrc.tramp ~/.editrc" t)) - ;; Check proper HISTFILE setting. We give up when not working. - (when (and (stringp tramp-histfile-override) - (file-name-directory tramp-histfile-override)) - (tramp-barf-unless-okay - vec - (format - "(cd %s)" - (tramp-shell-quote-argument - (file-name-directory tramp-histfile-override))) - "`tramp-histfile-override' uses invalid file `%s'" - tramp-histfile-override))) + ;; It is useful to set the prompt in the following command because + ;; some people have a setting for $PS1 which /bin/sh doesn't know + ;; about and thus /bin/sh will display a strange prompt. For + ;; example, if $PS1 has "${CWD}" in the value, then ksh will + ;; display the current working directory but /bin/sh will display + ;; a dollar sign. The following command line sets $PS1 to a sane + ;; value, and works under Bourne-ish shells as well as csh-like + ;; shells. We also unset the variable $ENV because that is read + ;; by some sh implementations (eg, bash when called as sh) on + ;; startup; this way, we avoid the startup file clobbering $PS1. + ;; $PROMPT_COMMAND is another way to set the prompt in /bin/bash, + ;; it must be discarded as well. $HISTFILE is set according to + ;; `tramp-histfile-override'. $TERM and $INSIDE_EMACS set here to + ;; ensure they have the correct values when the shell starts, not + ;; just processes run within the shell. (Which processes include + ;; our initial probes to ensure the remote shell is usable.) + (tramp-send-command + vec (format + (concat + "exec env TERM='%s' INSIDE_EMACS='%s,tramp:%s' " + "ENV=%s %s PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s") + tramp-terminal-type + (or (getenv "INSIDE_EMACS") emacs-version) tramp-version + (or (getenv-internal "ENV" tramp-remote-process-environment) "") + (if (stringp tramp-histfile-override) + (format "HISTFILE=%s" + (tramp-shell-quote-argument tramp-histfile-override)) + (if tramp-histfile-override + "HISTFILE='' HISTFILESIZE=0 HISTSIZE=0" + "")) + (tramp-shell-quote-argument tramp-end-of-output) + shell (or (tramp-get-sh-extra-args shell) "")) + t) + ;; Check proper HISTFILE setting. We give up when not working. + (when (and (stringp tramp-histfile-override) + (file-name-directory tramp-histfile-override)) + (tramp-barf-unless-okay + vec + (format + "(cd %s)" + (tramp-shell-quote-argument + (file-name-directory tramp-histfile-override))) + "`tramp-histfile-override' uses invalid file `%s'" + tramp-histfile-override)) (tramp-set-connection-property (tramp-get-connection-process vec) "remote-shell" shell))) @@ -4236,9 +4210,16 @@ process to set up. VEC specifies the connection." (let ((tramp-end-of-output tramp-initial-end-of-output) (case-fold-search t)) (tramp-open-shell vec (tramp-get-method-parameter vec 'tramp-remote-shell)) + (tramp-message vec 5 "Setting up remote shell environment") + + ;; Disable line editing. + (tramp-send-command vec "set +o vi +o emacs" t) + + ;; Dump option settings in the traces. + (when (>= tramp-verbose 9) + (tramp-send-command vec "set -o" t)) ;; Disable echo expansion. - (tramp-message vec 5 "Setting up remote shell environment") (tramp-send-command vec "stty -inlcr -onlcr -echo kill '^U' erase '^H'" t) ;; Check whether the echo has really been disabled. Some @@ -4312,8 +4293,6 @@ process to set up. VEC specifies the connection." (tramp-message vec 5 "Setting coding system to `%s' and `%s'" cs-decode cs-encode))) - (tramp-send-command vec "set +o vi +o emacs" t) - ;; Check whether the remote host suffers from buggy ;; `send-process-string'. This is known for FreeBSD (see comment ;; in `send_process', file process.c). I've tested sending 624 -- cgit v1.2.3 From 33ee3266286db00feef2839e172f613c4370fc1b Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Tue, 28 Jul 2020 13:44:58 +0300 Subject: Fix uses of deprecated SELinux security_context_t SELinux has used 'char *' in place of its typedef 'security_context_t' since 2014 (v2.3) because the latter was inconvenient to use when paired with the 'const' qualifier. The typedef has been kept around for compatibility with legacy callers, but it is deprecated in SELinux v3.1. See the following URL for the relevant announcement: https://lore.kernel.org/selinux/20200710162034.GC1768200@localhost.localdomain/ * src/fileio.c (Fcopy_file, Ffile_selinux_context) (Fset_file_selinux_context) [HAVE_LIBSELINUX]: Replace deprecated 'security_context_t' typedef with the equivalent 'char *'. --- src/fileio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index 2f1d2f82433..37072d9b6bd 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -2031,7 +2031,7 @@ permissions. */) ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object encoded_file, encoded_newname; #if HAVE_LIBSELINUX - security_context_t con; + char *con; int conlength = 0; #endif #ifdef WINDOWSNT @@ -3118,7 +3118,7 @@ or if SELinux is disabled, or if Emacs lacks SELinux support. */) #if HAVE_LIBSELINUX if (is_selinux_enabled ()) { - security_context_t con; + char *con; int conlength = lgetfilecon (SSDATA (ENCODE_FILE (absname)), &con); if (conlength > 0) { @@ -3163,7 +3163,7 @@ or if Emacs was not compiled with SELinux support. */) Lisp_Object role = CAR_SAFE (CDR_SAFE (context)); Lisp_Object type = CAR_SAFE (CDR_SAFE (CDR_SAFE (context))); Lisp_Object range = CAR_SAFE (CDR_SAFE (CDR_SAFE (CDR_SAFE (context)))); - security_context_t con; + char *con; bool fail; int conlength; context_t parsed_con; -- cgit v1.2.3 From e5889c704f9351c2cb91d8db2b36af72d9ab4151 Mon Sep 17 00:00:00 2001 From: Mattias Engdegård Date: Mon, 27 Jul 2020 11:27:00 +0200 Subject: Simplify and streamline optimizer clauses * lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker): Remove clause for 'with-output-to-temp-buffer', since it is a macro and will have been expanded before reaching this point. Move clauses for 'lambda' and 'closure' to avoid splitting a cond jump table. --- lisp/emacs-lisp/byte-opt.el | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 6f801be5457..48efff911f7 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -391,13 +391,6 @@ (and (nth 1 form) (not for-effect) form)) - ((eq (car-safe fn) 'lambda) - (let ((newform (byte-compile-unfold-lambda form))) - (if (eq newform form) - ;; Some error occurred, avoid infinite recursion - form - (byte-optimize-form-code-walker newform for-effect)))) - ((eq (car-safe fn) 'closure) form) ((memq fn '(let let*)) ;; recursively enter the optimizer for the bindings and body ;; of a let or let*. This for depth-firstness: forms that @@ -444,13 +437,6 @@ ;; will be optimized away in the lap-optimize pass. (cons fn (byte-optimize-body (cdr form) for-effect))) - ((eq fn 'with-output-to-temp-buffer) - ;; this is just like the above, except for the first argument. - (cons fn - (cons - (byte-optimize-form (nth 1 form) nil) - (byte-optimize-body (cdr (cdr form)) for-effect)))) - ((eq fn 'if) (when (< (length form) 3) (byte-compile-warn "too few arguments for `if'")) @@ -530,6 +516,15 @@ ;; Needed as long as we run byte-optimize-form after cconv. ((eq fn 'internal-make-closure) form) + ((eq (car-safe fn) 'lambda) + (let ((newform (byte-compile-unfold-lambda form))) + (if (eq newform form) + ;; Some error occurred, avoid infinite recursion + form + (byte-optimize-form-code-walker newform for-effect)))) + + ((eq (car-safe fn) 'closure) form) + ((byte-code-function-p fn) (cons fn (mapcar #'byte-optimize-form (cdr form)))) -- cgit v1.2.3 From 6c23b1a154bcf9e1ec85b484be83a4fb012a814b Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 18:59:57 +0200 Subject: Update authors.el * admin/authors.el (authors-aliases): Add author aliases. (authors-ignored-files): (authors-valid-file-names): (authors-renamed-files-alist): Update file lists. --- admin/authors.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/admin/authors.el b/admin/authors.el index dc57c0a6b91..1c069173c85 100644 --- a/admin/authors.el +++ b/admin/authors.el @@ -212,6 +212,8 @@ files.") ("Carlos Pita" "memeplex") ("Vinicius Jose Latorre" "viniciusjl") ("Gaby Launay" "galaunay") + ("Alex Gramiak" "alex") + ("Dick R. Chiang" "dickmao") ) "Alist of author aliases. @@ -473,6 +475,9 @@ Changes to files matching one of the regexps in this list are not listed.") ;; Replaced by lisp/thread.el "lisp/emacs-lisp/thread-list.el" "etc/images/slash.bmp" + "src/mini-gmp-emacs.c" + "lib/dosname.h" + "lib/putenv.c" ) "List of files and directories to ignore. Changes to files in this list are not listed.") @@ -877,7 +882,9 @@ Changes to files in this list are not listed.") "library-of-babel.org" "flymake-elisp.el" "flymake-ui.el" - "pinentry.el") + "pinentry.el" + "ledit.el" + "lmenu.el") "File names which are valid, but no longer exist (or cannot be found) in the repository.") @@ -1119,6 +1126,8 @@ in the repository.") ("gnus-news.texi" . "doc/misc/gnus.texi") ("lisp/multifile.el". "lisp/fileloop.el") ("lisp/emacs-lisp/thread.el". "lisp/thread.el") + ("src/mini-gmp.c" . "lib/mini-gmp.c") + ("src/mini-gmp.h" . "lib/mini-gmp.h") ) "Alist of files which have been renamed during their lifetime. Elements are (OLDNAME . NEWNAME).") -- cgit v1.2.3 From f9daa69547f1e91c9dabdf6b47b00e95e11c51e0 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 19:05:56 +0200 Subject: * etc/AUTHORS: Update. --- etc/AUTHORS | 135 ++++++++++++++++-------------------------------------------- 1 file changed, 36 insertions(+), 99 deletions(-) diff --git a/etc/AUTHORS b/etc/AUTHORS index aff24a8d8d3..3e91efb570e 100644 --- a/etc/AUTHORS +++ b/etc/AUTHORS @@ -127,84 +127,18 @@ Albert L. Ting: changed gnus-group.el mail-hist.el Aleksei Gusev: changed progmodes/compile.el -Alexander Becher: changed vc-annotate.el +Alexandru Harsanyi: changed soap-client.el soap-inspect.el emacs3.py + vc-hooks.el vc.el xml.el -Alexander Gramiak: changed w32term.c xterm.c nsterm.m dispextern.h - xdisp.c frame.c image.c nsgui.h w32gui.h xfns.c frame.el termhooks.h - w32fns.c w32term.h faces.el nsterm.h xfaces.c xterm.h frame.h xfont.c - configure.ac and 64 other files - -Alexander Haeckel: changed getset.el - -Alexander Klimov: changed files.el calc-graph.el files.texi man.el rx.el - sendmail.el - -Alexander Kreuzer: changed nnrss.el - -Alexander Kuleshov: changed dns-mode.el files.texi image-mode.el - keyboard.c ld-script.el xdisp.c - -Alexander L. Belikoff: wrote erc.el - -Alexander Pohoyda: co-wrote mail/rmailmm.el -and changed rmailsum.el man.el rmail.el sendmail.el - -Alexander Shopov: changed code-pages.el - -Alexander Vorobiev: changed org-compat.el - -Alexander Zhuckov: changed ebrowse.c - -Alexandre Garreau: changed message.el - -Alexandre Julliard: wrote vc-git.el -and changed vc.el ewoc.el - -Alexandre Oliva: wrote gnus-mlspl.el -and changed unexelf.c format.el iris4d.h iris5d.h regex.c unexsgi.c - -Alexandre Veyrenc: changed fr-refcard.tex - -Alexandru Harsanyi: wrote soap-client.el soap-inspect.el -and changed emacs3.py vc-hooks.el vc.el xml.el - -Alex Branham: changed checkdoc.el bibtex.el em-rebind.el esh-util.el - indent.el js.el lpr.el message.el subr.el text.texi .dir-locals.el - auth-source-pass.el bug-reference.el comint.el conf-mode-tests.el - conf-mode.el dired-x.el dired.el ediff-diff.el ediff-help.el - ediff-hook.el and 41 other files - -Alex Coventry: changed files.el - -Alex Dunn: changed subr-tests.el subr.el - -Alexei Khlebnikov: changed autorevert.el vc-git.el - -Alex Gramiak: changed prolog.el terminal.c - -Alex Kosorukoff: changed org-capture.el - -Alex Murray: changed erc-desktop-notifications.el network-stream.el - -Alex Ott: changed TUTORIAL.ru ede/files.el ru-refcard.tex base.el - cedet-files.el cpp-root.el ede.el ede/generic.el idle.el ispell.el - semantic/format.el - -Alex Reed: changed verilog-mode.el - -Alex Rezinsky: wrote which-func.el - -Alex Schroeder: wrote ansi-color.el cus-theme.el erc-compat.el - erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el master.el - spam-stat.el sql.el +Alex Gramiak: wrote ansi-color.el conf-mode-tests.el cus-theme.el + erc-compat.el erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el + erc.el gnus-mlspl.el master.el soap-client.el soap-inspect.el + spam-stat.el sql.el vc-git.el which-func.el and co-wrote longlines.el mail/rmailmm.el -and changed erc.el erc-track.el erc-button.el erc-stamp.el erc-match.el - erc-autoaway.el erc-nickserv.el rcirc.texi Makefile erc-autojoin.el - erc-fill.el erc-pcomplete.el erc-complete.el erc-ibuffer.el - erc-members.el rmail.el comint.el custom.el erc-bbdb.el erc-chess.el - erc-ezbounce.el and 35 other files - -Alex Shinn: changed files.el +and changed erc-track.el erc-button.el w32term.c xterm.c erc-stamp.el + nsterm.m xdisp.c dispextern.h frame.c image.c nsgui.h w32gui.h xfns.c + erc-match.el frame.el termhooks.h w32fns.c Makefile TUTORIAL.ru + erc-autoaway.el erc-nickserv.el and 215 other files Alfred Correira: changed generic-x.el @@ -1309,7 +1243,7 @@ Diane Murray: changed erc.el erc-backend.el erc-menu.el erc-button.el erc-goodies.el erc-ibuffer.el erc-log.el erc-nicklist.el url-http.el Makefile erc-dcc.el and 36 other files -Dick R. Chiang: changed checkdoc.el +Dick R. Chiang: changed checkdoc.el cl-macs-tests.el cl-macs.el Didier Verna: wrote gnus-diary.el nndiary.el and co-wrote nnml.el @@ -1445,7 +1379,7 @@ Eli Zaretskii: wrote [bidirectional display in xdisp.c] and changed xdisp.c msdos.c w32.c display.texi w32fns.c simple.el files.el fileio.c keyboard.c w32term.c w32proc.c emacs.c files.texi text.texi dispnew.c frames.texi lisp.h dispextern.h window.c process.c - term.c and 1187 other files + term.c and 1188 other files Emanuele Giaquinta: changed configure.ac rxvt.el charset.c etags.c fontset.c frame.el gnus-faq.texi loadup.el lread.c sh-script.el @@ -1767,6 +1701,8 @@ Fujii Hironori: changed w32fns.c Gábor Vida: changed gnus-demon.el auth-source.el ido.el +Gaby Launay: changed auth-source-pass.el + Gareth Jones: changed fns.c gnus-score.el Gareth Rees: changed NEWS.24 @@ -2145,8 +2081,6 @@ Jaesup Kwak: changed xwidget.c Jaeyoun Chung: changed hangul3.el hanja3.el gnus-mule.el hangul.el -J. Alexander Branham: wrote conf-mode-tests.el - Jambunathan K: wrote ox-odt.el and co-wrote ox-html.el and changed org-lparse.el org.el org.texi ox.el icomplete.el @@ -3133,8 +3067,8 @@ Luca Capello: changed mm-encode.el Lucas Werkmeister: changed emacs.c emacs.service Lucid, Inc.: changed byte-opt.el byte-run.el bytecode.c bytecomp.el - delsel.el disass.el faces.el font-lock.el lmenu.el mailabbrev.el - select.el xfaces.c xselect.c + delsel.el disass.el faces.el font-lock.el mailabbrev.el select.el + xfaces.c xselect.c Luc Teirlinck: wrote help-at-pt.el and changed files.el autorevert.el cus-edit.el subr.el simple.el @@ -3485,7 +3419,7 @@ Micah Anderson: changed spook.lines Michael Albinus: wrote autorevert-tests.el dbus-tests.el dbus.el filenotify-tests.el filenotify.el files-x-tests.el secrets-tests.el secrets.el shadowfile-tests.el tramp-archive-tests.el tramp-archive.el - tramp-cmds.el tramp-compat.el tramp-ftp.el tramp-gvfs.el + tramp-cmds.el tramp-compat.el tramp-crypt.el tramp-ftp.el tramp-gvfs.el tramp-integration.el tramp-rclone.el tramp-smb.el tramp-sudoedit.el tramp-tests.el url-tramp-tests.el url-tramp.el vc-tests.el zeroconf.el and co-wrote tramp-cache.el tramp-sh.el tramp.el @@ -3984,7 +3918,7 @@ and co-wrote cal-dst.el and changed lisp.h configure.ac alloc.c process.c fileio.c editfns.c xdisp.c sysdep.c image.c keyboard.c data.c emacs.c fns.c lread.c xterm.c eval.c callproc.c Makefile.in frame.c buffer.c gnulib-comp.m4 - and 1821 other files + and 1813 other files Paul Fisher: changed fns.c @@ -4166,7 +4100,7 @@ Philipp Rumpf: changed electric.el Philipp Stephani: wrote callint-tests.el checkdoc-tests.el cl-preloaded-tests.el ediff-diff-tests.el eval-tests.el ido-tests.el - lread-tests.el mouse-tests.el xt-mouse-tests.el + lread-tests.el mouse-tests.el startup-tests.el xt-mouse-tests.el and changed emacs-module.c emacs-module-tests.el json.c json-tests.el eval.c mod-test.c lisp.h lread.c nsterm.m configure.ac bytecomp.el internals.texi gtkutil.c emacs-module.h.in files.el alloc.c @@ -4255,8 +4189,7 @@ Rajappa Iyer: changed gnus-salt.el Raja R. Harinath: changed gnus-salt.el nnml.el -Rajesh Vaidheeswarran: wrote old-whitespace.el -and changed whitespace.el ffap.el +Rajesh Vaidheeswarran: changed whitespace.el ffap.el Ralf Angeli: wrote scroll-lock.el and changed w32fns.c reftex-cite.el gnus-art.el reftex-toc.el reftex.el @@ -4708,9 +4641,12 @@ Sidney Markowitz: changed doctor.el nsmenu.m Sigbjorn Finne: changed gnus-srvr.el -Simen Heggestøyl: wrote asm-mode-tests.el autoinsert-tests.el - color-tests.el css-mode-tests.el dom-tests.el makesum-tests.el - page-tests.el paren-tests.el ring-tests.el rot13-tests.el sql-tests.el +Simen Heggestøyl: wrote apropos-tests.el asm-mode-tests.el + autoconf-tests.el autoinsert-tests.el check-declare-tests.el + color-tests.el css-mode-tests.el dom-tests.el elide-head-tests.el + glasses-tests.el help-mode-tests.el makesum-tests.el page-tests.el + paren-tests.el po-tests.el ring-tests.el rot13-tests.el sql-tests.el + webjump-tests.el and changed css-mode.el css-mode.css json-tests.el json.el sgml-mode.el scss-mode.scss page.el ring.el rot13.el scheme.el sql.el asm-mode.el autoinsert.el color.el files.el js.el less-css-mode.el @@ -4720,8 +4656,9 @@ and changed css-mode.el css-mode.css json-tests.el json.el sgml-mode.el Simona Arizanova: changed help.el Simon Josefsson: wrote dig.el dns-mode.el flow-fill.el fringe.el imap.el - mml-sec.el mml-smime.el password-cache.el rfc2104.el sieve-mode.el - sieve.el smime.el starttls.el tls.el url-imap.el + mml-sec.el mml-smime.el password-cache.el rfc2104.el + sasl-scram-sha256.el sieve-mode.el sieve.el smime.el starttls.el tls.el + url-imap.el and co-wrote gnus-sieve.el gssapi.el mml1991.el nnfolder.el nnimap.el nnml.el sieve-manage.el and changed message.el gnus-sum.el gnus-art.el smtpmail.el pgg-gpg.el @@ -4769,9 +4706,11 @@ Stefan Bruda: co-wrote prolog.el Stefan Guath: changed find-dired.el -Stefan Kangas: wrote bookmark-tests.el delim-col-tests.el morse-tests.el - paragraphs-tests.el password-cache-tests.el studly-tests.el - tabify-tests.el timezone-tests.el underline-tests.el uudecode-tests.el +Stefan Kangas: wrote bookmark-tests.el cal-julian-tests.el + delim-col-tests.el lunar-tests.el misc-tests.el morse-tests.el + paragraphs-tests.el password-cache-tests.el qp-tests.el + rfc2045-tests.el studly-tests.el tabify-tests.el timezone-tests.el + underline-tests.el uudecode-tests.el and changed bookmark.el package.el efaq.texi package.texi ibuffer.el mwheel.el cperl-mode.el fns.c gud.el simple.el subr.el autoinsert.el comint-tests.el cus-edit.el delim-col.el dired-aux.el dired-x.el @@ -5298,8 +5237,6 @@ Valentin Gatien-Baron: changed emacs-module.c Valentin Wüstholz: changed org.el -Valery Alexeev: changed cyril-util.el cyrillic.el - Van L: changed subr.el Vasilij Schneidermann: changed cus-start.el eww.el cc-mode.el @@ -5359,8 +5296,6 @@ and changed erc-backend.el erc.el erc-services.el hexl.el emacs.c erc-button.el erc-capab.el erc-join.el htmlfontify.texi sh-script.el xterm.c xterm.h -Vladimir Alexiev: changed arc-mode.el nnvirtual.el tmm.el - Vladimir Kazanov: changed java.srt Vladimir Lomov: changed ox-html.el @@ -5535,6 +5470,8 @@ Yuan Fu: changed gdb-mi.el Yuanle Song: changed rng-xsd.el +Yue Daian: wrote cl-font-lock.el + Yu-ji Hosokawa: changed README.W32 Yukihiro Matsumoto: co-wrote ruby-mode.el -- cgit v1.2.3 From c270104e503cf0435a5ae40c5d0e430f4ef4bfb0 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 21:45:39 +0200 Subject: * etc/NEWS.27: Remove temporary markup. --- etc/NEWS.27 | 597 +----------------------------------------------------------- 1 file changed, 1 insertion(+), 596 deletions(-) diff --git a/etc/NEWS.27 b/etc/NEWS.27 index 2c8fa9dd397..7eebb89abf8 100644 --- a/etc/NEWS.27 +++ b/etc/NEWS.27 @@ -15,23 +15,15 @@ in older Emacs versions. You can narrow news to a specific version by calling 'view-emacs-news' with a prefix argument or by typing 'C-u C-h C-n'. -Temporary note: -+++ indicates that all relevant manuals in doc/ have been updated. ---- means no change in the manuals is needed. -When you add a new item, use the appropriate mark if you are sure it -applies, and please also update docstrings as needed. - * Installation Changes in Emacs 27.1 ---- ** Emacs now uses GMP, the GNU Multiple Precision library. By default, if 'configure' does not find a suitable libgmp, it arranges for the included mini-gmp library to be built and used. The new configure option '--without-libgmp' uses mini-gmp even if a suitable libgmp is available. ---- ** Emacs can now use HarfBuzz as its shaping engine. The new configure option '--with-harfbuzz' adds support for the HarfBuzz text shaping engine. It is on by default; use './configure @@ -44,7 +36,6 @@ supported ones, so the font backends that use older shaping engines enabled by default; they can be enabled via the 'font-backend' frame parameter or via X resources. ---- ** The new configure option '--with-json' adds native support for JSON. This uses the Jansson library. The option is on by default; use './configure --with-json=no' to build without Jansson support. The @@ -52,7 +43,6 @@ new JSON functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer' are typically much faster than their Lisp counterparts from json.el. ---- ** The configure option '--with-cairo' is no longer experimental. This builds Emacs with Cairo drawing, and supports built-in printing when Emacs is built with GTK+. Some severe bugs in this build were @@ -61,7 +51,6 @@ that building with Cairo enabled results in using Pango instead of libXft for font support, and that Pango 1.44 has removed support for bitmapped fonts. -+++ ** Emacs now uses a "portable dumper" instead of unexec. This improves compatibility with memory allocation on modern systems, and in particular better supports the Address Space Layout @@ -85,12 +74,10 @@ use the configure-time option '--with-dumping=unexec'; however, please file a bug report describing the situation, as unexec dumping is deprecated, and we plan on removing it in some future release. ---- ** The new configure option '--enable-checking=structs' attempts to check that the portable dumper code has been updated to match the last change to one of the data structures that it relies on. ---- ** The configure options '--enable-checking=conslist' and '--enable-checking=xmallocoverrun' have been withdrawn. The former made Emacs irredeemably slow, and the latter made it crash. Neither @@ -98,19 +85,16 @@ option was useful with modern debugging tools such as AddressSanitizer. (See "etc/DEBUG" for the details of using the modern replacements of the removed configure options.) ---- ** Emacs no longer defaults to using ImageMagick to display images. This is due to security and stability concerns with ImageMagick. To override the default, use 'configure --with-imagemagick'. ---- ** Several configure options now accept an option-argument 'ifavailable'. For example, './configure --with-xpm=ifavailable' now configures Emacs to attempt to use libxpm but to continue building even if libxpm is absent. The other affected options are '--with-gif', '--with-gnutls', '--with-jpeg', '--with-png', and '--with-tiff'. ---- ** The 'etags' program now uses the C library's regular expression matcher. If it's possible, 'etags' will use the regexp matcher from the system's standard C library, otherwise it will be linked with a @@ -120,7 +104,6 @@ configure option '--without-included-regex' forces 'etags' to use the C library's regex matcher even if the regex substitute ordinarily would be used to work around compatibility problems. ---- ** Emacs has been ported to the '-fcheck-pointer-bounds' option of GCC. This causes Emacs to check bounds of some arrays addressed by its internal pointers, which can be helpful when debugging the Emacs @@ -128,7 +111,6 @@ interpreter or modules that it uses. If your platform supports it you can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2 -mmpx -fcheck-pointer-bounds"' on Intel MPX platforms. ---- ** Emacs now normally uses a C pointer type instead of a C integer type to implement Lisp_Object, which is the fundamental machine word type internal to the Emacs Lisp interpreter. This change aims to @@ -137,30 +119,24 @@ option '--enable-check-lisp-object-type' is therefore no longer as useful and so is no longer enabled by default in developer builds, to reduce differences between developer and production builds. ---- ** The distribution tarball now has test cases; 'make check' runs them. This is intended mostly to help developers. ---- ** Emacs now requires GTK 2.24 and GTK 3.10 for the GTK 2 and GTK 3 builds respectively. ---- ** New make target 'help' shows a summary of common make targets. ---- ** Emacs now builds with dynamic module support by default. Pass '--without-modules' to 'configure' to disable dynamic module support. ---- ** The ftx font backend driver is now obsolete and will be removed in Emacs 28. * Startup Changes in Emacs 27.1 -+++ ** Emacs can now use the XDG convention for init files. The 'XDG_CONFIG_HOME' environment variable (which defaults to "~/.config") specifies the XDG configuration parent directory. Emacs @@ -180,7 +156,6 @@ Emacs will never create "$XDG_CONFIG_HOME/emacs". Whichever directory Emacs decides to use, it will set 'user-emacs-directory' to point to it. -+++ ** Emacs can now be configured using an early init file. The file is called "early-init.el", in 'user-emacs-directory'. It is loaded very early in the startup process: before graphical elements @@ -196,7 +171,6 @@ process, and some important parts of the Emacs session, such as 'window-system' and other GUI features, are not yet set up, which could make some customization fail to work. -+++ ** Installed packages are now activated *before* loading the init file. As a result of this change, it is no longer necessary to call 'package-initialize' in your init file. @@ -218,7 +192,6 @@ it won't work right without some adjustment: does not need to pay attention to 'package-load-list' or 'package-user-dir' any more. ---- ** Emacs now notifies systemd when startup finishes or shutdown begins. Units that are ordered after 'emacs.service' will only be started after Emacs has finished initialization and is ready for use. @@ -229,10 +202,8 @@ the new version of the file again.) * Changes in Emacs 27.1 ---- ** Emacs now supports Unicode Standard version 13.0. -+++ ** Emacs now supports resizing and rotating images without ImageMagick. All modern systems support this feature. (On GNU and Unix systems, Cairo drawing or the XRender extension to X11 is required for this to @@ -242,12 +213,10 @@ enable scaling.) The new function 'image-transforms-p' can be used to test whether any given frame supports these capabilities. -+++ ** The Network Security Manager now allows more fine-grained control of what checks to run via the 'network-security-protocol-checks' user option. -+++ ** TLS connections have their security tightened by default. Most of the checks for outdated, believed-to-be-weak TLS algorithms and ciphers are now switched on by default. (In addition, several new @@ -259,7 +228,6 @@ issued), you can either set 'network-security-protocol-checks' to nil, or adjust the elements in that user option to only happen on the 'high' security level (assuming you use the 'medium' level). ---- ** New user option 'nsm-trust-local-network'. Allows skipping Network Security Manager checks for hosts on your local subnet(s). It defaults to nil. Usually, there should be no @@ -267,21 +235,18 @@ need to set this non-nil, and doing that risks opening your local network connections to attacks. So be sure you know what you are doing before changing the value. -+++ ** Native GnuTLS connections can now use client certificates. Previously, this support was only available when using the external 'gnutls-cli' or 'starttls' command. Call 'open-network-stream' with ':client-certificate t' to trigger looking up of per-server certificates via 'auth-source'. -+++ ** New user option 'network-stream-use-client-certificates'. When non-nil, 'open-network-stream' performs lookups of client certificates using 'auth-source' as if ':client-certificate t' were specified if there is no explicit ':client-certificate' parameter. Defaults to nil. -+++ ** 'next/previous-multiframe-window' have been renamed. The new names are as follows: @@ -292,12 +257,11 @@ The old function names are maintained as aliases for backward compatibility. ** emacsclient -+++ + *** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable. The command-line argument '--socket-name' overrides it. (The same behavior as for the pre-existing 'EMACS_SERVER_FILE' variable.) -+++ *** Emacs and emacsclient now default to "$XDG_RUNTIME_DIR/emacs". This is used as the directory for client/server sockets, if Emacs is running on a platform or environment that sets the 'XDG_RUNTIME_DIR' @@ -305,11 +269,9 @@ environment variable to indicate where session sockets should go. To get the old, less-secure behavior, you can set the 'EMACS_SOCKET_NAME' environment variable to an appropriate value. ---- *** When run by root, emacsclient no longer connects to non-root sockets. (Instead you can use Tramp methods to run root commands in a non-root Emacs.) ---- ** 'xft-ignore-color-fonts' now ignores even more color fonts. There are color fonts that managed to bypass the existing checks, causing XFT crashes, they are now filtered out. Setting @@ -317,45 +279,36 @@ causing XFT crashes, they are now filtered out. Setting require setting 'face-ignored-fonts' to filter out problematic fonts. Known problematic fonts are "Noto Color Emoji" and "Emoji One". ---- ** The GTK+ font chooser now respects 'face-ignored-fonts'. When using 'menu-set-font' under GTK3, the available fonts are now matched against 'face-ignored-fonts'. ---- ** The GTK+ font chooser now remembers the previously selected settings. It now remembers the name, size, style, etc. -+++ ** New user option 'what-cursor-show-names'. When non-nil, 'what-cursor-position' will show the name of the character in addition to the decimal/hex/octal representation. Default nil. -+++ ** New function 'network-lookup-address-info'. This does IPv4 and/or IPv6 address lookups on hostnames. -+++ ** 'network-interface-list' can now return IPv4 and IPv6 addresses. IPv4 and IPv6 addresses are now returned by default if available, optionally including netmask/broadcast address information. ---- ** Control of the threshold for using the 'distant-foreground' color. The threshold for color distance below which the 'distant-foreground' color of the face will be used instead of the foreground color can now be controlled via the new variable 'face-near-same-color-threshold'. The default value is 30000, as the previously hard-coded threshold. -+++ ** The function 'read-passwd' uses "*" as default character to hide passwords. -+++ ** The function 'read-answer' now accepts not only single character answers, but also function keys like 'F1', character events such as 'C-M-h', and control characters like 'C-h'. -+++ ** Lexical binding is now used by default when evaluating interactive Elisp. More specifically, 'lexical-binding' is now used by default for 'M-:' and '--eval' (including in evaluations invoked from 'emacsclient' via @@ -371,19 +324,16 @@ to work with lexical binding, or wrap it in an extra level of 'eval'. For example, --eval "FORM" becomes --eval "(eval 'FORM)" (note the extra quote in 'FORM). ---- ** The new user option 'tooltip-resize-echo-area' avoids truncating tooltip text on GUI frames when tooltips are displayed in the echo area. Instead, it resizes the echo area as needed to accommodate the full tool-tip text. ---- ** Show mode line tooltips only if the corresponding action applies. Customize the user option 'mode-line-default-help-echo' to restore the old behavior where the tooltip text is also shown when the corresponding action does not apply. -+++ ** New hook 'server-after-make-frame-hook'. This hook is a convenient place to perform initializations in daemon mode which require GUI features to be available. One example is @@ -392,15 +342,12 @@ the call to 'desktop-read' in this hook, if you want the GUI settings to be restored, or if desktop.el needs to interact with you during restoration of the session. -+++ ** The functions 'set-frame-height' and 'set-frame-width' are now commands, and will set the currently selected frame to the height/ width specified by the numeric prefix. -+++ ** New function 'logcount' calculates an integer's Hamming weight. -+++ ** New function 'libxml-available-p'. This function returns non-nil if libxml support is both compiled in and available at run time. Lisp programs should use this function to @@ -408,7 +355,6 @@ detect built-in libxml support, instead of testing for that indirectly, e.g., by checking that functions like 'libxml-parse-html-region' return nil. -+++ ** 'libxml-parse-xml-region' and 'libxml-parse-html-region' take a parameter that's called DISCARD-COMMENTS, but it really only discards the top-level comment. Therefore this parameter is now @@ -416,83 +362,67 @@ obsolete, and the new utility function 'xml-remove-comments' can be used to remove comments before calling the libxml functions to parse the data. -+++ ** A new DOM (the XML/HTML document structure returned by functions such as 'libxml-parse-html-region') traversal function has been added: 'dom-search', which takes a DOM and a predicate and returns all nodes that match. -+++ ** New function 'fill-polish-nobreak-p', to be used in 'fill-nobreak-predicate'. It blocks line breaking after a one-letter word, also in the case when this word is preceded by a non-space, but non-alphanumeric character. -+++ ** The limit on repetitions in regexps has been raised to 2^16-1. It was previously limited to 2^15-1. For example, the following regular expression was previously invalid, but is now accepted: x\{32768\} ---- ** The German prefix and postfix input methods now support Capital sharp S. ---- ** New input methods 'hawaiian-postfix' and 'hawaiian-prefix'. ---- ** New input methods 'georgian-qwerty' and 'georgian-nuskhuri'. ---- ** New input methods for several variants of the Sami language. The Sami input methods include: 'norwegian-sami-prefix', 'bergsland-hasselbrink-sami-prefix', 'southern-sami-prefix', 'ume-sami-prefix', 'northern-sami-prefix', 'inari-sami-prefix', 'skolt-sami-prefix', and 'kildin-sami-prefix'. -+++ ** Japanese environments use UTF-8 by default. In Japanese environments that do not specify encodings and are not based on MS-Windows, the default encoding is now utf-8 instead of japanese-iso-8bit. -+++ ** New function 'exec-path'. This function by default returns the value of the corresponding user option, but can optionally return the equivalent of 'exec-path' from a remote host. -+++ ** The function 'executable-find' supports an optional argument REMOTE. This triggers searching for the program on the remote host as indicated by 'default-directory'. -+++ ** New user option 'auto-save-no-message'. When set to t, no message will be shown when auto-saving (default value: nil). ---- ** The value of 'make-cursor-line-fully-visible' can now be a function. In addition to nil or non-nil, the value can now be a predicate function. Follow mode uses this to control scrolling of its windows when the last screen line in a window is not fully visible. -+++ ** New variable 'emacs-repository-branch'. It reports the git branch from which Emacs was built. -+++ ** New user option 'switch-to-buffer-obey-display-actions'. When non-nil, 'switch-to-buffer' uses 'pop-to-buffer-same-window' that respects display actions specified by 'display-buffer-alist' and 'display-buffer-overriding-action'. -+++ ** The user option 'switch-to-visible-buffer' is now obsolete. Customize 'switch-to-prev-buffer-skip' instead. -+++ ** New user option 'switch-to-prev-buffer-skip'. This user option allows specifying the set of buffers that may be shown by 'switch-to-prev-buffer' and 'switch-to-next-buffer' more @@ -504,10 +434,8 @@ matches strings where the pattern appears as a subsequence. Put simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex' to 'completion-styles' or 'completion-category-overrides' to use it. ---- ** The 'completion-common-part' face is now visible by default. -+++ ** New face attribute ':extend' to control face extension at EOL. The new face attribute ':extend' controls whether to use the face for displaying the empty space beyond end of line (EOL) till the edge of @@ -524,32 +452,25 @@ Consequently, a theme generally shouldn't specify this attribute unless it has a good reason to do so. ** Connection-local variables -+++ *** Connection-local variables are applied by default like file-local and directory-local variables. -+++ *** The macro 'with-connection-local-variables' has been renamed from 'with-connection-local-profiles'. No argument PROFILES needed any longer. ---- ** New user option 'next-error-verbose' controls when 'next-error' outputs a message about the error locus. ---- ** New user option 'grep-search-path' defines the directories searched for grep hits (this used to be controlled by 'compilation-search-path'). ---- ** New user option 'emacs-lisp-compilation-search-path' defines the directories searched for byte-compiler error messages (this used to be controlled by 'compilation-search-path'). ---- ** Multicolor fonts such as "Noto Color Emoji" can be displayed on Emacs configured with Cairo drawing and linked with cairo >= 1.16.0. -+++ ** Emacs now optionally displays a fill column indicator. This is similar to what 'fill-column-indicator' package provides, but much faster and compatible with 'show-trailing-whitespace'. @@ -564,46 +485,36 @@ in tooltips, as it is not useful there. There are 2 new buffer local variables and 1 face to customize this mode, they are described in the manual "(emacs) Display". -+++ ** 'progress-reporter-update' now accepts an optional suffix string to display. ---- ** New user option 'xref-file-name-display' controls the display of file names in xref buffers. ---- ** New user option 'byte-count-to-string-function'. It is used for displaying file sizes and disk space in some cases. -+++ ** Emacs now interprets RGB triplets like HTML, SVG, and CSS do. The X convention previously used differed slightly, particularly for RGB triplets with a single hexadecimal digit per component. ---- ** The toolbar now shows the equivalent key binding in its tooltips. ---- ** The File menu-bar menu was re-arranged. Print menu items moved to submenu, and also added the new entries for tabs. ---- ** 'scroll-lock-mode' is now bound to the 'Scroll_Lock' key globally. Note that this key binding will not work on MS-Windows systems if 'w32-scroll-lock-modifier' is non-nil. ---- ** 'global-set-key', called interactively, now no longer downcases a key binding with an upper case letter - if you can type it, you can bind it. -+++ ** 'read-from-minibuffer' now works with buffer-local history variables. The HIST argument of 'read-from-minibuffer' now works correctly with buffer-local variables. This means that different buffers can have their own separated input history list if desired. -+++ ** 'backup-by-copying-when-privileged-mismatch' applies to file gid, too. In addition to checking the file owner uid, Emacs also checks that the group gid is not greater than 'backup-by-copying-when-privileged-mismatch'; @@ -612,48 +523,39 @@ if so, 'backup-by-copying-when-mismatch' will be forced on. * Editing Changes in Emacs 27.1 -+++ ** When asked to visit a large file, Emacs now offers to visit it literally. Previously, Emacs would only ask for confirmation before visiting large files. Now it also offers a third alternative: to visit the file literally, as in 'find-file-literally', which speeds up navigation and editing of large files. -+++ ** 'zap-to-char' now uses the history of characters you used to zap to. 'zap-to-char' uses the new 'read-char-from-minibuffer' function to allow navigating through the history of characters that have been input. This is mostly useful for characters that have complex input methods where inputting the character again may involve many keystrokes. -+++ ** 'save-some-buffers' now has a new action in the prompt: 'C-f' will exit the command and switch to the buffer currently being asked about. ---- ** More commands support noncontiguous rectangular regions, namely 'upcase-dwim', 'downcase-dwim', 'capitalize-dwim', 'capitalize-region', 'upcase-initials-region', 'replace-string', 'replace-regexp', and 'delimit-columns-region'. -+++ ** The new 'amalgamating-undo-limit' variable can be used to control how many changes should be amalgamated when using the 'undo' command. ---- ** The 'newline-and-indent' command (commonly bound to 'RET' in many modes) now takes an optional numeric argument to specify how many times is should insert newlines (and indent). -+++ ** New command 'make-empty-file'. ---- ** New variable 'x-wait-for-event-timeout'. This controls how long Emacs will wait for updates to the graphical state to take effect (making a frame visible, for example). -+++ ** New user option 'electric-quote-replace-double'. This option controls whether '"' is replaced in 'electric-quote-mode', in addition to other quote characters. If non-nil, ASCII double-quote @@ -661,59 +563,48 @@ characters that quote text "like this" are replaced by double typographic quotes, “like this”, in text modes, and in comments in non-text modes. ---- ** New user option 'flyspell-case-fold-duplications'. This option controls whether Flyspell mode considers consecutive words to be duplicates if they are not in the same case. If non-nil, the default, words are considered to be duplicates even if their letters' case does not match. ---- ** 'write-abbrev-file' now includes special properties. 'write-abbrev-file' now writes special properties like ':case-fixed' for abbrevs that have them. -+++ ** 'write-abbrev-file' skips empty tables. 'write-abbrev-file' now skips inserting a 'define-abbrev-table' form for tables which do not have any non-system abbrevs to save. -+++ ** The new functions and commands 'text-property-search-forward' and 'text-property-search-backward' have been added. These provide an interface that's more like functions like 'search-forward'. ---- ** 'add-dir-local-variable' now uses dotted pair notation syntax to write alists of variables to ".dir-locals.el". This is the same syntax that you can see in the example of a ".dir-locals.el" file in the node "(emacs) Directory Variables" of the user manual. -+++ ** Network connections using 'local' can now use IPv6. 'make-network-process' now uses the correct loopback address when asked to use ':host 'local' and ':family 'ipv6'. -+++ ** The new function 'replace-region-contents' replaces the current region using a given replacement-function in a non-destructive manner (in terms of 'replace-buffer-contents'). -+++ ** The command 'replace-buffer-contents' now has two optional arguments mitigating performance issues when operating on huge buffers. -+++ ** Dragging 'C-M-mouse-1' now marks rectangular regions. -+++ ** The command 'delete-indentation' now operates on the active region. If the region is active, the command joins all the lines in the region. When there's no active region, the command works on the current and the previous or the next line, as before. -+++ ** You can now change the font size with the mouse wheel. Scrolling the mouse wheel with the Ctrl key pressed will now act the same as the 'C-x C-+' and 'C-x C--' commands. @@ -721,18 +612,15 @@ same as the 'C-x C-+' and 'C-x C--' commands. * Changes in Specialized Modes and Packages in Emacs 27.1 ---- ** New HTML mode skeleton 'html-id-anchor'. This new command (which inserts an _ skeleton) is bound to 'C-c C-c #'. -+++ ** New command 'font-lock-refontify'. This is an interactive convenience function to be used when developing font locking for a mode. It recomputes the font locking data and then re-fontifies the buffer. ---- ** Font Lock is smarter about fontifying unterminated strings and comments. When you type a quote that starts a string, or a comment delimiter that starts a comment, font-lock will not immediately refontify the @@ -743,28 +631,22 @@ comment. This is controlled by the new user option 'jit-lock-antiblink-grace', which specifies the delay in seconds. The default is 2 seconds; set to nil to get back the old behavior. ---- ** The 'C' command in 'tar-mode' will now preserve the timestamp of the extracted file if the new user option 'tar-copy-preserve-time' is non-nil. ---- ** 'autoconf-mode' is now used instead of 'm4-mode' for the "acinclude.m4" / "aclocal.m4" / "acsite.m4" files. ---- ** On GNU/Linux, 'M-x battery' will now list all batteries, no matter what they're named, and the 'battery-linux-sysfs-regexp' variable has been removed. ---- ** The 'list-processes' command now includes port numbers in the network connection information (in addition to the host name). ---- ** The 'cl' package is now officially deprecated in favor of 'cl-lib'. ---- ** desktop *** When called interactively with a prefix arg 'C-u', 'desktop-read' @@ -772,115 +654,94 @@ now prompts the user for the directory containing the desktop file. ** display-line-numbers-mode -+++ *** New faces 'line-number-major-tick' and 'line-number-minor-tick', and user options 'display-line-numbers-major-tick' and 'display-line-numbers-minor-tick' can be used to highlight the line numbers of lines multiple of certain numbers. -+++ *** New variable 'display-line-numbers-offset', when non-zero, adds an offset to absolute line numbers. ** winner -+++ *** A new user option, 'winner-boring-buffers-regexp', has been added. ** table -+++ *** 'table-generate-source' now supports wiki and mediawiki. This command can now output wiki and mediawiki format tables. ** telnet-mode ---- *** Reverting a buffer in 'telnet-mode' will restart a closed connection. ** goto-addr ---- *** A way to more conveniently specify what URI address schemes should be ignored has been added via the 'goto-address-uri-schemes-ignored' variable. ** tex-mode -+++ *** 'latex-noindent-commands' controls indentation of certain commands. You can use this new user option to control indentation of arguments of \emph, \footnote, and similar commands. ** byte compiler -+++ *** 'byte-compile-dynamic' is now obsolete. This is because on the one hand it suffers from misbehavior in corner cases that have plagued it for years, and on the other hand experience indicates that it doesn't bring any measurable benefit. ---- *** The 'g' keystroke in "*Compile-Log*" buffers has been bound to a new command that will recompile the file previously compiled with 'M-x byte-compile-file' and the like. ** compile.el ---- *** In 'compilation-error-regexp-alist', 'line' (and 'end-line') can be functions. -+++ *** 'compilation-context-lines' can now take the value t; this is like nil, but instead of scrolling the current line to the top of the screen when there is no left fringe, it inserts a visible arrow before column zero. ---- *** The new 'compilation-transform-file-match-alist' user option can be used to transform file name matches compilation output, and remove known false positives being recognized as warnings/errors. ** cl-lib.el -+++ *** 'cl-defstruct' has a new ':noinline' argument to prevent inlining its functions. -+++ *** 'cl-defstruct' slots accept a ':documentation' property. ---- *** 'cl-values-list' will now signal an error if its argument isn't a list. ** doc-view.el ---- *** New commands 'doc-view-presentation' and 'doc-view-fit-window-to-page'. ---- *** Added support for password-protected PDF files. ---- *** A new user option 'doc-view-pdftotext-program-args' has been added to allow controlling how the conversion to text is done. -+++ *** The prefix key 's' was changed to 'c' for slicing commands to avoid conflicts with 'image-mode' key 's'. The new key 'c' still has good mnemonics of "cut", "clip", "crop". ** Ido ---- *** New user option 'ido-big-directories' to mark directories whose names match certain regular expressions as big. Ido won't attempt to list the contents of such directories when completing file names. ** Minibuffer -+++ *** New user option 'minibuffer-beginning-of-buffer-movement'. This option allows control of how the 'M-<' command works in the minibuffer. If non-nil, point will move to the end of the prompt @@ -888,7 +749,6 @@ the minibuffer. If non-nil, point will move to the end of the prompt preserves the original behavior of 'M-<' moving to the beginning of the prompt. -+++ *** When the minibuffer is active, echo-area messages are displayed at the end of the minibuffer instead of hiding the minibuffer by the echo area display. The new user option 'minibuffer-message-clear-timeout' @@ -898,19 +758,15 @@ temporarily overwrote the minibuffer contents until the user typed something, set 'set-message-function' and 'clear-message-function' to nil. ---- *** Minibuffer now uses 'minibuffer-message' to display error messages at the end of the active minibuffer. To disable this, remove 'minibuffer-error-initialize' from 'minibuffer-setup-hook'. -+++ *** 'y-or-n-p' now uses the minibuffer to read 'y' or 'n' answer. ---- *** Some commands that previously used 'read-char-choice' now read a character using the minibuffer by 'read-char-from-minibuffer'. ---- ** map.el *** Now also understands plists. @@ -919,10 +775,8 @@ a character using the minibuffer by 'read-char-from-minibuffer'. *** 'map-contains-key' now returns a boolean rather than the key. *** Deprecate the 'testfn' args of 'map-elt' and 'map-contains-key'. *** New generic function 'map-insert'. -+++ *** The 'type' arg can be a list '(hash-table :key1 VAL1 :key2 VAL2 ...)'. ---- ** seq.el New convenience functions 'seq-first' and 'seq-rest' give easy access to respectively the first and all but the first elements of sequences. @@ -930,22 +784,18 @@ to respectively the first and all but the first elements of sequences. The new predicate function 'seq-contains-p' should be used instead of the now obsolete 'seq-contains'. ---- ** Follow mode In the current follow group of windows, "ghost" cursors are no longer displayed in the non-selected follow windows. To get the old behavior back, customize 'follow-hide-ghost-cursors' to nil. -+++ ** New variable 'warning-fill-column' for 'display-warning'. ** Windmove ---- *** 'windmove-create-window' when non-nil makes a new window. This happens upon moving off the edge of the frame. -+++ *** Windmove supports directional window display and selection. The new command 'windmove-display-default-keybindings' binds default keys with provided modifiers (by default, Shift-Meta) to the commands @@ -959,7 +809,6 @@ display the buffer in the same window, for example, 'S-M-0 C-h e' displays the "*Messages*" buffer in the same window. 'S-M-t C-h r' displays the Emacs manual in a new tab. -+++ *** Windmove also supports directional window deletion. The new command 'windmove-delete-default-keybindings' binds default keys with provided prefix (by default, 'C-x') and modifiers (by default, @@ -969,12 +818,10 @@ With a prefix arg 'C-u', also kills the buffer in that window. With 'M-0', deletes the selected window and selects the window that was in the specified direction. -+++ *** New command 'windmove-swap-states-in-direction' binds default keys to the commands that swap the states of the selected window with the window in the specified direction. ---- *** Windmove code no longer used is now obsolete. That includes the user option 'windmove-window-distance-delta' and the functions 'windmove-coord-add', 'windmove-constrain-to-range', @@ -982,104 +829,82 @@ functions 'windmove-coord-add', 'windmove-constrain-to-range', 'windmove-constrain-loc-for-movement', 'windmove-wrap-loc-for-movement', 'windmove-reference-loc' and 'windmove-other-window-loc'. ---- ** Octave mode The mode is automatically enabled in files that start with the 'function' keyword. ** project.el -+++ *** New commands 'project-search' and 'project-query-replace-regexp'. ---- *** New user option 'project-read-file-name-function'. ** Etags -+++ *** 'next-file' is now an obsolete alias of 'tags-next-file'. ---- *** 'tags-loop-revert-buffers' is an obsolete alias of 'fileloop-revert-buffers'. -+++ *** The 'tags-loop-continue' function along with the 'tags-loop-operate' and 'tags-loop-scan' variables are now obsolete; use the new 'fileloop-initialize' and 'fileloop-continue' functions instead. -+++ *** etags is now able to read Zstandard-compressed files. ** bibtex ---- *** New commands 'bibtex-next-entry' and 'bibtex-previous-entry'. In 'bibtex-mode-map', 'forward-paragraph' and 'backward-paragraph' are remapped to these, respectively. ** Dired -+++ *** New command 'dired-create-empty-file'. -+++ *** New command 'dired-number-of-marked-files'. It is by default bound to '* N'. ---- *** The marking commands now report how many files were marked by the command itself, not how many files are marked in total. -+++ *** The new user option 'dired-create-destination-dirs' controls whether 'dired-do-copy' and 'dired-rename-file' should create non-existent directories in the destination. -+++ *** 'dired-dwim-target' can be customized to prefer either the next window, or one of the most recently visited windows with a Dired buffer. -+++ *** When the new user option 'dired-vc-rename-file' is non-nil, Dired performs file renaming using underlying version control system. ---- *** Zstandard compression is now supported for 'dired-do-compress' and 'dired-do-compress-to'. ---- *** On systems that support suid/guid files, Dired now fontifies the permissions of such files with a special face 'dired-set-id'. ---- *** A new face, 'dired-special', is used to highlight sockets, named pipes, block devices and character devices. ** Find-Dired ---- *** New user option 'find-dired-refine-function'. The default value is 'find-dired-sort-by-filename'. ---- *** New sorting options for the user option 'find-ls-option'. ** Change Logs and VC ---- *** New user option 'vc-tor'. When non-nil, this user option causes the VC commands to communicate with the repository via Tor's proxy, using the 'torsocks' wrapper script. The default is nil. -+++ *** New command 'log-edit-generate-changelog-from-diff', bound to 'C-c C-w'. This generates ChangeLog entries from the VC fileset diff. -+++ *** Recording ChangeLog entries doesn't require an actual file. If a ChangeLog file doesn't exist, and if the new user option 'add-log-dont-create-changelog-file' is non-nil (which is the @@ -1089,32 +914,26 @@ still be used if it exists.) Set the user option to nil to get the previous behavior of always creating a buffer that visits a ChangeLog file. -+++ *** The new 'd' command ('vc-dir-clean-files') in 'vc-dir-mode' buffers will delete the marked files (or if no files are marked, the file under point). This command does not notify the VC backend, and is mostly useful for unregistered files. ---- *** 'vc-dir-ignore' now takes a prefix argument to ignore all marked files. ---- *** New user option 'vc-git-grep-template'. This new user option allows customizing the default arguments passed to 'git-grep' when 'vc-git-grep' is used. ---- *** Command 'vc-git-stash' now respects marks in the "*vc-dir*" buffer. When some files are marked, only those are stashed. When no files are marked, all modified files are stashed, as before. ---- *** 'vc-dir' now shows a button allowing you to hide the stash list. Controlled by user option 'vc-git-show-stash'. Default t means show the entire list as before. An integer value limits the list length (but still allows you to show the entire list via the button). ---- *** 'vc-git-stash' is now bound to 'C' in the stash headers. -- @@ -1122,44 +941,35 @@ the entire list as before. An integer value limits the list length 'vc-git-stash' and 'vc-git-stash-snapshot' can now be run using 'C' and 'S' respectively, including when there are no stashes. ---- *** The new hook 'vc-retrieve-tag-hook' runs after retrieving a tag. ---- *** 'vc-hg' now invokes 'smerge-mode' when visiting files. Code that attempted to invoke 'smerge-mode' when visiting an Hg file with conflicts existed in earlier versions of Emacs, but incorrectly never detected a conflict due to invalid assumptions about cached values. -+++ *** The Hg (Mercurial) back-end now supports 'vc-region-history'. The 'C-x v h' command now works in buffers that visit files controlled by Hg. -+++ *** The Hg (Mercurial) back-end now prompts for revision to merge when you invoke 'C-x v m' ('vc-merge'). ---- *** The Hg (Mercurial) back-end now uses tags, branches and bookmarks instead of revision numbers as completion candidates when it prompts for a revision. ---- *** New user option 'vc-hg-revert-switches'. It specifies switches to pass to Hg's 'revert' command. -+++ *** 'C-u C-x v D' ('vc-root-version-diff') prompts for two revisions and compares their entire trees. ---- *** 'C-x v M D' ('vc-diff-mergebase') and 'C-x v M L' ('vc-log-mergebase') print diffs and logs between the merge base (common ancestor) of two given revisions. -+++ *** New command 'vc-log-search' asks for a pattern, searches it in the revision log, and displays matched log entries in the log buffer. For example, 'M-x vc-log-search RET bug#36644 RET' @@ -1168,7 +978,6 @@ With a prefix argument asks for a command, so for example, 'C-u M-x vc-log-search RET git log -1 f302475 RET' will display just one log entry found by its revision number. -+++ *** It is now possible to display a specific revision given by its ID. If you invoke 'C-x v L' ('vc-print-root-log') with a numeric argument of 1, as in 'C-1 C-x v L' or 'C-u 1 C-x v L', it asks for a revision @@ -1176,56 +985,46 @@ ID, and shows its log entry together with the diffs introduced by the revision's commit. (For some less capable VCSes, only the log entry is shown.) ---- *** New user option 'vc-find-revision-no-save'. With non-nil, 'vc-find-revision' doesn't write the created buffer to file. ---- *** 'C-x v =' can now mimic Magit's diff format. Set the new user option 'diff-font-lock-prettify' to t for that, see below under "Diff mode". ---- *** The 'diff' function arguments OLD and NEW may each be a buffer rather than a file, in non-interactive calls. This change was made in Emacs 24.1, but wasn't documented until now. -+++ *** New command 'diff-buffers' interactively diffs two buffers. ** Diff mode -+++ *** Hunks are now automatically refined by font-lock. To disable refinement, set the new user option 'diff-refine' to nil. To get back the old behavior where hunks are refined as you navigate through a diff, set 'diff-refine' to the symbol 'navigate'. -+++ *** 'diff-auto-refine-mode' is deprecated in favor of 'diff-refine'. It is no longer enabled by default and binding it no longer has any effect. -+++ *** Better syntax highlighting of Diff hunks. Fragments of source in Diff hunks are now by default highlighted according to the appropriate major mode. Customize the new user option 'diff-font-lock-syntax' to nil to disable this. ---- *** File headers can be shortened, mimicking Magit's diff format. To enable it, set the new user option 'diff-font-lock-prettify' to t. On GUI frames, this option also displays the insertion and deletion indicators on the left fringe. -+++ *** Prefix arg of 'diff-goto-source' means jump to the old revision of the file under version control if point is on an old changed line, or to the new revision of the file otherwise. ** Texinfo -+++ *** New function for inserting '@pxref', '@xref', or '@ref' commands. The function 'texinfo-insert-dwim-@ref', bound to 'C-c C-c r' by default, inserts one of three types of references based on the text @@ -1234,35 +1033,29 @@ start of a sentence or at '(point-min)', else '@ref'. ** Browse-url ---- *** The function 'browse-url-emacs' can now visit a URL in selected window. It now treats the optional 2nd argument to mean that the URL should be shown in the currently selected window. ---- *** A new function, 'browse-url-add-buttons' can be used to add clickable links to most ordinary special-mode buffers that display text that have URLs embedded. 'browse-url-button-regexp' controls what's considered a button. ---- *** New user option 'browse-url-secondary-browser-function'. It can be set to a function that invokes an alternative browser. ** Comint -+++ *** 'send-invisible' is now an obsolete alias for 'comint-send-invisible'. Also, 'shell-strip-ctrl-m' is declared obsolete. -+++ *** 'C-c .' ('comint-insert-previous-argument') no longer interprets '&'. This feature caused problems when '&&' was present in the previous command. Since this command emulates 'M-.' in Bash and zsh, neither of which treats '&' specially, the feature was removed for compatibility with these shells. -+++ *** 'comint-insert-previous-argument' can now count arguments from the end. By default, invoking 'C-c .' with a numeric argument N would copy the Nth argument, counting from the first one. But if the new user option @@ -1272,11 +1065,9 @@ better emulate 'M-.' in both Bash and zsh, since the former counts from the beginning of the arguments, while the latter counts from the end. -+++ *** 'comint-run' can now accept a list of switches to pass to the program. 'C-u M-x comint-run' will prompt for the switches interactively. -+++ *** Abnormal hook 'comint-password-function' has been added. This hook permits a derived mode to supply a password for the underlying command interpreter without prompting the user. For @@ -1292,7 +1083,6 @@ if it had been supplied on the command line. ** SQL ---- *** SQL Indent Minor Mode SQL Mode now supports the ELPA 'sql-indent' package for assisting sophisticated SQL indenting rules. Note, however, that SQL is not @@ -1305,19 +1095,16 @@ prefer to rely upon existing Emacs facilities for formatting code but the 'sql-indent' package provides facilities to aid more casual SQL developers layout queries and complex expressions. ---- **** 'sql-use-indent-support' (default t) enables SQL indention support. The 'sql-indent' package from ELPA must be installed to get the indentation support in 'sql-mode' and 'sql-interactive-mode'. ---- **** 'sql-mode-hook' and 'sql-interactive-mode-hook' changed. Both hook variables have had 'sql-indent-enable' added to their default values. If you have existing customizations to these variables, you should make sure that the new default entry is included. ---- *** Connection Wallet Database passwords can now by stored in NETRC or JSON data files that may optionally be encrypted. When establishing an interactive session @@ -1336,48 +1123,39 @@ be encrypted with GPG by adding an additional ".gpg" suffix. ** Term ---- *** 'term-read-noecho' is now obsolete, use 'read-passwd' instead. -+++ *** 'serial-term' now takes an optional parameter to leave the emulator in line mode. ** Flymake -+++ *** The variable 'flymake-diagnostic-types-alist' is obsolete. You should instead set properties on known diagnostic symbols, like ':error' and ':warning', as demonstrated in the Flymake manual. -+++ *** New user option 'flymake-start-on-save-buffer'. Control whether Flymake starts checking the buffer on save. ---- *** Flymake and backend functions may exchange hints about buffer changes. This enables more efficient backends. See the docstring of 'flymake-diagnostic-functions' or the Flymake manual for details. -+++ *** 'flymake-start-syntax-check-on-newline' is now obsolete, use 'post-self-insert-hook' to check on newline. ** Ruby ---- *** The Rubocop Flymake diagnostic function will only run Lint cops if it can't find the config file. --- *** Rubocop is called with 'bundle exec' if Gemfile mentions it. ---- *** New command 'ruby-find-library-file' bound to 'C-c C-f'. ** Package ---- *** Warn if "footer line" is missing, but still install package. package.el used to refuse to install a package without the so-called "footer line", which appears at the very end of the file: @@ -1392,24 +1170,20 @@ Note that versions of Emacs older than 27.1 will not only refuse to install packages without such a line -- they will be unable to parse package data. It is therefore recommended to keep this line. -+++ *** Change of 'package-check-signature' for packages with multiple sigs. In previous Emacsen, t checked that all signatures are valid. Now t only checks that at least one signature is valid and the new 'all' value needs to be used if you want to enforce that all signatures are valid. This only affects packages with multiple signatures. -+++ *** The meaning of 'allow-unsigned' in 'package-check-signature' has changed slightly: If a usable OpenPGP configuration can't be found (for instance, if gpg isn't installed), it now has the same meaning as nil. ---- *** New function 'package-get-version' lets packages query their own version. Example use in auctex.el: '(defconst auctex-version (package-get-version))' ---- *** New 'package-quickstart' feature. When 'package-quickstart' is non-nil, package.el precomputes a big autoloads file so that activation of packages can be done much faster, @@ -1419,10 +1193,8 @@ It also causes user options like 'package-user-dir' and is run rather than at startup so you don't need to set them in your early init file. ---- *** New function 'package-activate-all'. -+++ *** New functions for filtering packages list. A new function has been added which allows users to filter the packages list by name: 'package-menu-filter-by-name'. By default, it @@ -1432,13 +1204,10 @@ is bound to '/ n'. Additionally, the function (from 'f'). To clear any of the two filters, the user can now call the 'package-menu-clear-filter' function, bound to '/ /' by default. ---- *** Imenu support has been added to 'package-menu-mode'. ---- *** The package list can now be sorted by version or description. -+++ *** In Package Menu, 'g' now updates package data from archives. Previously, 'g' invoked 'tabulated-list-revert' which did not update the cached archive data. It is now bound to 'revert-buffer', which @@ -1448,19 +1217,16 @@ will update the data. ** Info -+++ *** Clicking on the left/right arrow icon in the Info tool-bar while holding down the Ctrl key pops up a menu of previously visited Info nodes where you can select a node to go back (like in browsers). ---- *** Info can now follow 'file://' protocol URLs. The 'file://' URLs in Info documents can now be followed by passing them to the 'browse-url' function, like the other protocols: 'ftp', 'http', and 'https'. This allows having references to local HTML files, for example. ---- ** Display of man pages now limits the width for formatting pages. The new user option 'Man-width-max' (80 by default) limits the number of columns passed to the 'man' program for formatting man pages. This @@ -1469,40 +1235,32 @@ windows (which are customary with today's large displays). ** Xref -+++ *** New command 'xref-find-definitions-at-mouse'. This command finds definitions of the identifier at the place of a mouse click event, and is intended to be bound to a mouse event. -+++ *** Changing 'xref-marker-ring-length' works after xref.el is loaded. Previously, setting 'xref-marker-ring-length' would only take effect if set before xref.el was loaded. ---- *** 'xref-find-definitions' now sets the mark at the buffer position where it was invoked. ---- *** New xref faces 'xref-file-header', 'xref-line-number', 'xref-match'. ---- *** New user option 'xref-show-definitions-function'. It encapsulates the logic pertinent to showing the result of 'xref-find-definitions'. The user can change it to customize its behavior and the display of results. ---- *** Search results show the buffer even for one hit. The search-type Xref commands (e.g. 'xref-find-references' or 'project-find-regexp') now show the results buffer even when there is only one hit. This can be altered by changing 'xref-show-xrefs-function'. -+++ *** Xref buffers support refreshing the search results. A new command 'xref-revert-buffer' is bound to 'g'. ---- *** Imenu support has been added to 'xref--xref-buffer-mode'. *** New generic method 'xref-backend-identifier-completion-ignore-case'. @@ -1511,7 +1269,6 @@ identifier completion. ** Checkdoc ---- *** Checkdoc can now optionally spell-check doc strings. Invoking 'checkdoc-buffer' with a non-nil TAKE-NOTES argument (interactively, with a prefix arg) will now spell-check the doc @@ -1519,7 +1276,6 @@ strings and report all the spelling mistakes. ** Icomplete -+++ *** New minor mode Fido mode. This mode is based on Icomplete, and its name stands for "Fake Ido". The point of this mode is to be an 'ido-mode' workalike, providing @@ -1529,29 +1285,24 @@ completion facilities. ** Ecomplete ---- *** The Ecomplete sorting has changed to a decay-based algorithm. This can be controlled by the new 'ecomplete-sort-predicate' user option. ---- *** The 'ecomplete-database-file' file is now placed in "~/.emacs.d/ecompleterc" by default. Of course it will still find it if you have it in "~/.ecompleterc". ** Gnus ---- *** 'mm-uu-diff-groups-regexp' now defaults to matching all groups, which means that "git am" diffs are recognized everywhere. -+++ *** Two new Gnus summary mode navigation commands have been added, bound to the '[' and ']' keys: 'gnus-summary-prev-unseen-article' and 'gnus-summary-next-unseen-article'. These take you (respectively) to the previous unseen or next unseen article. (These are the ones that are marked with "." in the summary mode lines.) -+++ *** The Gnus user variable 'nnimap-expunge' supports three new values: 'never' for never expunging messages, 'immediately' for immediately expunging deleted messages, and 'on-exit' to expunge deleted articles @@ -1561,67 +1312,53 @@ result in Gnus expunging all messages that have been flagged as deleted by any IMAP client (rather than just those that have been deleted by Gnus). -+++ *** New user option 'gnus-use-atomic-windows' makes Gnus window layouts atomic. See the "(elisp) Atomic Windows" node of the Elisp manual for details. -+++ *** There's a new value for 'gnus-article-date-headers', 'combined-local-lapsed', which will show both the time (in the local timezone) and the lapsed time. ---- *** Gnus now maps imaps to 993 only on old MS-Windows versions. The nnimap backend used to do this unconditionally to work around problems on old versions of MS-Windows. This is now done only for Windows XP and older. -+++ *** The nnimap backend now has support for IMAP namespaces. This feature can be enabled by setting the new 'nnimap-use-namespaces' server variable to non-nil. -+++ *** A prefix argument to 'gnus-summary-limit-to-score' will limit in reverse. Limit to articles with score "at or below" the SCORE argument rather than "at or above". ---- *** The function 'gnus-score-find-favorite-words' has been renamed from 'gnus-score-find-favourite-words'. ---- *** Gmane has been removed as an nnir backend, since Gmane no longer has a search engine. -+++ *** Splitting mail on common mailing list headers has been added. See the concept index in the Gnus manual for the 'match-list' entry. -+++ *** nil is no longer an allowed value for 'mm-text-html-renderer'. -+++ *** The default value of 'mm-inline-large-images' has changed from nil to 'resize', which means that large images will be resized instead of displayed with an external program by default. -+++ *** A new Gnus summary mode command, 'S A' ('gnus-summary-attach-article') can be used to attach the current article(s) to a pre-existing Message buffer, or create a new Message buffer with the article(s) attached. -+++ *** A new Gnus summary mode command, 'w' ('gnus-summary-browse-url') scans the article buffer for URLs, and offers them to the user to open with 'browse-url'. ---- *** New user option 'nnir-notmuch-filter-group-names-function'. This option controls whether and how to use Gnus search groups as 'path:' search terms to 'notmuch'. ---- *** The buttons in the Gnus article buffer were formerly widgets (i.e., buttons from widget.el). This has now changed, and they are now buttons (from button.el), and commands like 'TAB' now search for @@ -1631,22 +1368,18 @@ fail. ** erc ---- *** New hook 'erc-insert-done-hook'. This hook is called after strings have been inserted into the buffer, and is free to alter point and window configurations, as it's not called from inside a 'save-excursion', as opposed to 'erc-insert-post-hook'. ---- *** 'erc-button-google-url' has been renamed to 'erc-button-search-url' and its value has been changed to Duck Duck Go. ---- *** 'erc-send-pre-hook' and 'erc-send-this' have been obsoleted. The user option to use instead to alter text to be sent is now 'erc-pre-send-functions'. ---- *** Improve matching/highlighting of nicknames. Open and close parenthesis and apostrophe are not considered valid nick characters anymore, matching the given grammar in RFC 2812 @@ -1654,43 +1387,35 @@ section 2.3.1. This enables correct matching and highlighting of nicks when they are surrounded by parentheses, like "(nick)", and when adjacent to an apostrophe, like "nick's". ---- *** Set 'erc-button-url-regexp' to 'browse-url-button-regexp' which better handles surrounding pair of parentheses. ---- *** New function 'erc-switch-to-buffer-other-window' which is like 'erc-switch-to-buffer', but opens the buffer in another window. ---- *** New function 'erc-track-switch-buffer-other-window' which is like 'erc-track-switch-buffer', but opens the buffer in another window. ** EUDC ---- *** XEmacs support has been removed. ** eww/shr -+++ *** The new user option 'shr-cookie-policy' can be used to control when to use cookies when fetching embedded images. The default is to use them when the images are from the same domain as the main HTML document. -+++ *** The 'eww' command can now create a new EWW buffer. Invoking the command with a prefix argument will cause it to create a new EWW buffer for the URL instead of reusing the default one. -+++ *** Clicking with the Ctrl key or 'C-u RET' on a link opens a new tab when tab-bar-mode is enabled. -+++ *** The 'd' ('eww-download') command now falls back to current page's URL. If this command is invoked with no URL at point, it now downloads the current page instead of signaling an error. @@ -1700,30 +1425,24 @@ current page instead of signaling an error. 'shr-selected-link' face to give the user feedback that the command has been executed. -+++ *** New user option 'shr-discard-aria-hidden'. If set, shr will not render tags with attribute 'aria-hidden="true"'. This attribute is meant to tell screen readers to ignore a tag. -+++ *** 'shr-external-browser' has been made into an obsolete alias of 'browse-url-secondary-browser-function'. ---- *** 'shr-tag-ol' now respects the ordered list 'start' attribute. ---- *** The following tags are now handled: '', '', and ''. ** Htmlfontify -+++ *** The functions 'hfy-color', 'hfy-color-vals' and 'hfy-fallback-color-values' and the variables 'hfy-fallback-color-map' and 'hfy-rgb-txt-color-map' have been renamed from names that used 'colour' instead of 'color'. -+++ ** Enriched mode supports the 'charset' text property. You can add or modify the 'charset' text properties of text using the 'Edit->Text Properties->Special Properties' menu, or by invoking the @@ -1733,70 +1452,57 @@ restored when the file is visited. ** Smtpmail ---- *** Authentication mechanisms can be added via external packages, by defining new 'cl-defmethod' of 'smtpmail-try-auth-method'. -+++ *** To always force smtpmail to send credentials over on the first attempt when communicating with the SMTP server(s), the 'smtpmail-servers-requiring-authorization' user option can be used. -+++ *** smtpmail will now try resending mail when getting a transient "4xx" error message from the SMTP server. The new 'smtpmail-retries' user option says how many times to retry. ** Footnote mode ---- *** Support Hebrew-style footnotes. ---- *** Footnote text lines are now aligned. Can be controlled via the new user option 'footnote-align-to-fn-text'. ** CSS mode ---- *** A new command 'css-cycle-color-format' for cycling between color formats (e.g. "black" => "#000000" => "rgb(0, 0, 0)") has been added, bound to 'C-c C-f'. ---- *** CSS mode, SCSS mode, and Less CSS mode now have support for Imenu. ** SGML mode ---- *** 'sgml-quote' now handles double quotes and apostrophes when escaping text and in addition all numeric entities when unescaping text. ** Python mode ---- *** Python mode supports three different font lock decoration levels. The maximum level is used by default; customize 'font-lock-maximum-decoration' to tone down the decoration. ---- *** New user option 'python-pdbtrack-kill-buffers'. If non-nil, the default, buffers opened during pdbtracking session are killed when pdbtracking session is finished. ---- *** New function 'python-shell-send-statement. It sends the statement delimited by 'python-nav-beginning-of-statement' and 'python-nav-end-of-statement' to the inferior Python process. ** Help ---- *** Descriptions of variables and functions give an estimated first release where the variable or function appeared in Emacs. ---- *** Output format of 'C-h l' ('view-lossage') has changed. For convenience, 'view-lossage' now displays the last keystrokes and commands in the same format as the edit buffer of @@ -1804,23 +1510,19 @@ and commands in the same format as the edit buffer of the buffer generated by 'view-lossage' to the "*Edit Macro*" buffer created by 'edit-last-kbd-macro', and to save the macro by 'C-c C-c'. ---- *** The list of help commands produced by 'C-h C-h' ('help-for-help') can now be searched via 'C-s'. ** Ibuffer ---- *** New filter 'ibuffer-filter-by-process'; bound to '/ E'. ---- *** All mode filters can now accept a list of symbols. This means you can now easily filter several major modes, as well as a single mode. ** Search and Replace -+++ *** Isearch supports a prefix argument for 'C-s' ('isearch-repeat-forward') and 'C-r' ('isearch-repeat-backward'). With a prefix argument, these commands repeat the search for the specified occurrence of the search string. @@ -1830,7 +1532,6 @@ This makes possible also to use a prefix argument for 'M-s .' Also a prefix argument is supported for 'isearch-yank-until-char', 'isearch-yank-word-or-char', 'isearch-yank-symbol-or-char'. -+++ *** To go to the first/last occurrence of the current search string is possible now with new commands 'isearch-beginning-of-buffer' and 'isearch-end-of-buffer' bound to 'M-s M-<' and 'M-s M->' in Isearch. @@ -1839,14 +1540,12 @@ counting from the beginning/end of the buffer. This complements 'C-s'/'C-r' that searches for the next Nth relative occurrence with a numeric argument. -+++ *** 'isearch-lazy-count' shows the current match number and total number of matches in the Isearch prompt. User options 'lazy-count-prefix-format' and 'lazy-count-suffix-format' define the format of the current and the total number of matches in the prompt's prefix and suffix, respectively. ---- *** 'lazy-highlight-buffer' highlights matches in the full buffer. It is useful in combination with 'lazy-highlight-cleanup' customized to nil to leave matches highlighted in the whole buffer after exiting isearch. @@ -1855,7 +1554,6 @@ navigation through the matches without flickering is more smooth. 'lazy-highlight-buffer-max-at-a-time' controls the number of matches to highlight in one iteration while processing the full buffer. -+++ *** New isearch bindings. 'C-M-z' invokes new function 'isearch-yank-until-char', which yanks everything from point up to but not including the specified @@ -1871,27 +1569,21 @@ string to highlight lines matching the search string. This is similar to the existing binding 'M-s h r' ('highlight-regexp') that highlights JUST the search string. -+++ *** New user option 'isearch-yank-on-move' provides options t and 'shift' to extend the search string by yanking text that ends at the new position after moving point in the current buffer. 'shift' extends the search string by motion commands while holding down the shift key. -+++ *** 'isearch-allow-scroll' provides a new option 'unlimited' to allow scrolling any distance off screen. ---- *** Isearch now remembers the regexp-based search mode for words/symbols and case-sensitivity together with search strings in the search ring. ---- *** Isearch now has its own tool-bar and menu-bar menu. -+++ *** 'flush-lines' prints and returns the number of deleted matching lines. ---- *** 'char-fold-to-regexp' now matches more variants of a base character. The table used to check for equivalence of characters is now built using the complete chain of unicode decompositions of a character, @@ -1899,7 +1591,6 @@ rather than stopping after one level, such that searching for e.g. "GREEK SMALL LETTER IOTA" will now also find "GREEK SMALL LETTER IOTA WITH OXIA". -+++ *** New char-folding options: 'char-fold-include' lets you add ad hoc foldings, 'char-fold-exclude' to remove foldings from default decomposition, and 'char-fold-symmetric' to search for any of an equivalence class of @@ -1910,7 +1601,6 @@ to find "e". ** Debugger -+++ *** The Lisp Debugger is now based on 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1918,45 +1608,37 @@ the Elisp manual for documentation of the new mode and its commands. ** Edebug -+++ *** 'edebug-eval-last-sexp' and 'edebug-eval-print-last-sexp' interactively now take a zero prefix analogously to the non-Edebug counterparts. -+++ *** New faces 'edebug-enabled-breakpoint' and 'edebug-disabled-breakpoint'. When setting breakpoints in Edebug, an overlay with these faces are placed over the point in question, depending on whether they are enabled or not. -+++ *** New command 'edebug-toggle-disable-breakpoint'. This command allows you to disable a breakpoint temporarily. This is mainly useful with breakpoints that are conditional and would take some time to recreate. -+++ *** New command 'edebug-unset-breakpoints'. To clear all breakpoints in the current form, the 'U' command in 'edebug-mode', or 'M-x edebug-unset-breakpoints' can be used. ---- *** Re-instrumenting a function with Edebug will now try to preserve previously-set breakpoints. However, if the code has changed substantially, this may not be possible. -+++ *** New command 'edebug-remove-instrumentation'. This command removes Edebug instrumentation from all functions that have been instrumented. -+++ *** The runtime behavior of Edebug's instrumentation can be changed using the new variables 'edebug-behavior-alist', 'edebug-after-instrumentation-function' and 'edebug-new-definition-function'. Edebug's behavior can be changed globally or for individual definitions. -+++ *** Edebug's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification, links and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1973,14 +1655,12 @@ been instrumented by Edebug. ** Enhanced xterm support ---- *** New user option 'xterm-set-window-title' controls whether Emacs sets the XTerm window title. This feature is experimental and is disabled by default. ** Grep -+++ *** 'rgrep', 'lgrep' and 'zrgrep' now hide part of the command line that contains a list of ignored directories and files. Clicking on the button with ellipsis unhides it. @@ -1988,16 +1668,13 @@ The abbreviation can be disabled by the new user option 'grep-find-abbreviate'. The new command 'grep-find-toggle-abbreviation' toggles it interactively. ---- *** 'grep-find-use-xargs' is now customizable with sorting options. ** ERT -+++ *** New variable 'ert-quiet' allows making ERT output in batch mode less verbose by removing non-essential information. -+++ *** ERT's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -2005,73 +1682,61 @@ the Elisp manual for documentation of the new mode and its commands. ** Gamegrid ---- *** Gamegrid now determines its default glyph size based on display dimensions, instead of always using 16 pixels. As a result, Tetris, Snake and Pong are better playable on HiDPI displays. ---- *** 'gamegrid-add-score' can now sort scores from lower to higher. This is useful for games where lower scores are better, like time-based games. ** Filecache ---- *** Completing file names in the minibuffer via 'C-TAB' now uses the styles as configured by the user option 'completion-styles'. -+++ ** New macros 'thunk-let' and 'thunk-let*'. These macros are analogue to 'let' and 'let*', but create bindings that are evaluated lazily. ** next-error -+++ *** New user option 'next-error-find-buffer-function'. The value should be a function that determines how to find the next buffer to be used by 'next-error' and 'previous-error'. The default is to use the last buffer that navigated to the current error. -+++ *** New command 'next-error-select-buffer'. It can be used to set any buffer as the next one to be used by 'next-error' and 'previous-error'. ** nxml-mode ---- *** The default value of 'nxml-sexp-element-flag' is now t. This means that pressing 'C-M-SPACE' now selects the entire tree by default, and not just the opening element. ** Eshell ---- *** TAB completion uses the standard 'completion-at-point' rather than 'pcomplete'. Its UI is slightly different but can be customized to behave similarly, e.g. Pcomplete's default cycling can be obtained with '(setq completion-cycle-threshold 5)'. -+++ *** Expansion of history event designators is disabled by default. To restore the old behavior, use (add-hook 'eshell-expand-input-functions #'eshell-expand-history-references) ---- *** The function 'eshell-uniquify-list' has been renamed from 'eshell-uniqify-list'. ---- *** The function 'eshell/kill' is now able to handle signal switches. Previously 'eshell/kill' would fail if provided a kill signal to send to the process. It now accepts signals specified either by name or by its number. ---- *** Emacs now follows symlinks in history-related files. The files specified by 'eshell-history-file-name' and 'eshell-last-dir-ring-file-name' can include symlinks; these are now @@ -2079,16 +1744,13 @@ followed when Emacs writes the relevant history variables to the disk. ** Shell ---- *** Program name completion inside remote shells works now as expected. -+++ *** The user option 'shell-file-name' can be set now as connection-local variable for remote shells. It still defaults to "/bin/sh". ** Single shell commands -+++ *** New values of 'shell-command-dont-erase-buffer'. This user option can now have the value 'erase' to force to erase the output buffer before execution of the command, even if the output goes @@ -2096,42 +1758,34 @@ to the current buffer. Additional values 'beg-last-out', 'end-last-out', and 'save-point' control where to put point in the output buffer after inserting the 'shell-command' output. ---- *** The new functions 'shell-command-save-pos-or-erase' and 'shell-command-set-point-after-cmd' control how point is handled between two consecutive shell commands in the same output buffer. -+++ *** 'async-shell-command-width' defines the number of display columns available for output of asynchronous shell commands. -+++ *** Prompt for shell commands can now show the current directory. Customize the new user option 'shell-command-prompt-show-cwd' to enable it. ** Pcomplete ---- *** The 'pcomplete' command is now obsolete. The Pcomplete functionality can be obtained via 'completion-at-point' instead, by adding 'pcomplete-completions-at-point' to 'completion-at-point-functions'. ---- *** The function 'pcomplete-uniquify-list' has been renamed from 'pcomplete-uniqify-list'. ---- *** 'pcomplete/make' now completes on targets in included files, recursively. To recover the previous behavior, set new user option 'pcmpl-gnu-makefile-includes' to nil. ** Auth-source ---- *** The Secret Service backend supports the ':create' key now. ---- *** ".authinfo" and ".netrc" files now use a new mode: 'authinfo-mode'. This is just like 'fundamental-mode', except that it hides passwords under a "****" display property. When the cursor moves to this text, @@ -2140,110 +1794,89 @@ the real password is revealed (via 'reveal-mode'). The new ** Tramp -+++ *** New connection method "nextcloud", which allows accessing OwnCloud or NextCloud hosted files and directories. -+++ *** New connection method "rclone", which allows accessing system storages via the 'rclone' program. This feature is experimental. -+++ *** New connection method "sudoedit", which allows editing local files with different user credentials. Contrary to the "sudo" method, no session is run permanently in the background. This is for security reasons. -+++ *** Connection methods "obex" and "synce" have been removed, because they are obsoleted in GVFS. -+++ *** Validated passwords are saved by auth-source backends which support this. -+++ *** During user and host name completion in the minibuffer, results from auth-source search are taken into account. This can be disabled by setting the user option 'tramp-completion-use-auth-sources' to nil. -+++ *** The user option 'tramp-ignored-file-name-regexp' allows disabling Tramp for some look-alike remote file names. -+++ *** For some connection methods, like "su" or "sudo", the host name in multi-hop file names must match the previous hop. Default host names are adjusted to the host name from the previous hop. -+++ *** A timeout has been added for the connection methods "sudo" and "doas". The underlying session is disabled when the timeout expires. This is for security reasons. -+++ *** For some connection methods, like "sshx" or "plink", it is possible to configure the remote login shell. This avoids problems with remote hosts, where "/bin/sh" is a link to a shell which cooperates badly with Tramp. -+++ *** New commands 'tramp-rename-files' and 'tramp-rename-these-files'. They allow saving remote files somewhere else when the corresponding host is not reachable anymore. ** Rcirc ---- *** New user option 'rcirc-url-max-length'. Setting this option to an integer causes URLs displayed in Rcirc buffers to be truncated to that many characters. ---- *** The default '/quit' and '/part' reasons are now configurable. Two new user options are provided for this: 'rcirc-default-part-reason' and 'rcirc-default-quit-reason'. ** Register ---- *** The return value of method 'register-val-describe' includes the names of buffers shown by the windows of a window configuration. ** Message ---- *** Completion of email addresses can use the standard completion UI. This is controlled by 'message-expand-name-standard-ui'. With the standard UI the different sources (ecomplete, bbdb, and eudc) are matched together and try to obey 'completion-styles'. It should work for other completion front ends like Company. ---- *** 'message-mode' now supports highlighting citations of different depths. This can be customized via the new user option 'message-cite-level-function' and the new 'message-cited-text-*' faces. -+++ *** Messages can now be systematically encrypted when the PGP keyring contains a public key for every recipient. To achieve this, add 'message-sign-encrypt-if-all-keys-available' to 'message-send-hook'. ---- *** When replying a message that have addresses on the form '"foo@bar.com" ', Message will elide the repeated "name" from the address field in the response. ---- *** The default of 'message-forward-as-mime' has changed from t to nil as it has been reported that many recipients can't read forwards that are formatted as MIME digests. -+++ *** 'message-forward-included-headers' has changed its default to exclude most headers when forwarding. ---- *** 'mml-secure-openpgp-sign-with-sender' sets also "gpg --sender". When 'mml-secure-openpgp-sign-with-sender' is non-nil, message sender's email address (in addition to its old behavior) will also be used to @@ -2259,61 +1892,48 @@ The option is useful for two reasons when verifying the signature: 2.2.17 to fully benefit from this feature. See gpg(1) man page for "--auto-key-retrieve". -+++ *** The 'mail-from-style' variable is now obsolete. According to RFC 5322, only the 'angles' value is valid. ---- ** EasyPG ---- *** 'epa-pinentry-mode' is renamed to 'epg-pinentry-mode'. It now applies to epg functions as well as epa functions. ---- *** The alias functions 'epa--encode-coding-string', 'epa--decode-coding-string', and 'epa--select-safe-coding-system' have been removed. Use 'encode-coding-string', 'decode-coding-string', and 'select-safe-coding-system' instead. ---- *** 'epg-context' structure supports now 'sender' slot. The value of the new 'sender' slot (if a string) is used to set gpg's "--sender" option. This feature is used by 'mml-secure-openpgp-sign-with-sender'. See gpg(1) manual page about "--sender" for more information. ---- ** Rmail -+++ *** New user option 'rmail-output-reset-deleted-flag'. If this option is non-nil, messages appended to an output file by the 'rmail-output' command have their Deleted flag reset. ---- *** The command 'rmail-summary-by-senders' with an empty argument selects the messages to summarize with a regexp that matches the sender of the current message. ** Threads -+++ *** New variable 'main-thread' holds Emacs's main thread. This is handy in Lisp programs that run on a non-main thread and want to signal the main thread, e.g., when they encounter an error. -+++ *** 'thread-join' now returns the result of the finished thread. -+++ *** 'thread-signal' does not propagate errors to the main thread. Instead, error messages are just printed in the main thread. ---- *** 'thread-alive-p' is now obsolete, use 'thread-live-p' instead. -+++ *** New command 'list-threads' shows Lisp threads. See the current list of live threads in a tabulated-list buffer which automatically updates. In the buffer, you can use 's q' or 's e' to @@ -2322,42 +1942,35 @@ backtrace with 'b'. ** thingatpt.el ---- *** 'thing-at-point' supports a new "thing" called 'uuid'. A symbol 'uuid' can be passed to 'thing-at-point' and it returns the UUID at point. ---- *** 'number-at-point' will now recognize hex numbers like 0xAb09 and #xAb09 and return them as numbers. ---- *** 'word-at-point' and 'sentence-at-point' accept NO-PROPERTIES. Just like 'thing-at-point' itself. ** Interactive automatic highlighting -+++ *** 'highlight-regexp' can now highlight subexpressions. The new command accepts a prefix numeric argument to choose the subexpression. ** Mouse display of minor mode menu ---- *** 'minor-mode-menu-from-indicator' now displays full minor mode name. When there is no menu for a mode, display the mode name after the indicator instead of just the indicator (which is sometimes cryptic). ** rx ---- *** rx now handles raw bytes in character alternatives correctly, when given in a string. Previously, '(any "\x80-\xff")' would match characters U+0080...U+00FF. Now the expression matches raw bytes in the 128...255 range, as expected. ---- *** The rx 'or' and 'seq' forms no longer require any arguments. '(or)' produces a regexp that never matches anything, while '(seq)' matches the empty string, each being an identity for the operation. @@ -2365,31 +1978,25 @@ This also works for their aliases: '|' for 'or'; ':', 'and' and 'sequence' for 'seq'. The symbol 'unmatchable' can be used as an alternative to '(or)'. ---- *** 'regexp' and new 'literal' accept arbitrary lisp as arguments. In this case, 'rx' will generate code which produces a regexp string at run time, instead of a constant string. ---- *** New rx extension mechanism: 'rx-define', 'rx-let', 'rx-let-eval'. These macros add new forms to the rx notation. -+++ *** 'anychar' is now an alias for 'anything'. Both match any single character; 'anychar' is more descriptive. -+++ *** New 'intersection' form for character sets. With 'or' and 'not', it can be used to compose character-matching expressions from simpler parts. -+++ *** 'not' now accepts more argument types. The argument can now also be a character, a single-character string, an 'intersection' form, or an 'or' form whose arguments each match a single character. -+++ *** Nested 'or' forms of strings guarantee a longest match. For example, '(or (or "IN" "OUT") (or "INPUT" "OUTPUT"))' now matches the whole string "INPUT" if present, not just "IN". Previously, this @@ -2397,15 +2004,12 @@ was only guaranteed inside a single 'or' form of string literals. ** Frames -+++ *** New command 'make-frame-on-monitor' makes a frame on the specified monitor. -+++ *** New value of 'minibuffer' frame parameter 'child-frame'. This allows creating and immediately parenting a minibuffer-only child frame when making a frame. ---- *** New predicates 'display-blink-cursor-p' and 'display-symbol-keys-p'. These predicates are to be preferred over 'display-graphic-p' when testing for blinking cursor capability and the capability to have @@ -2413,7 +2017,6 @@ symbols (e.g., '[return]', '[tab]', '[backspace]') as keys respectively. ** Tabulated List mode -+++ *** New user options for tabulated list sort indicators. You can now customize which sorting indicator character to display near the current column in Tabulated Lists (see user options @@ -2422,52 +2025,42 @@ near the current column in Tabulated Lists (see user options 'tabulated-list-tty-sort-indicator-asc', and 'tabulated-list-tty-sort-indicator-desc'). -+++ *** Two new commands and keystrokes have been added to the tabulated list mode: 'w' (which widens the current column) and 'c' which makes the current column contract. -+++ *** New function 'tabulated-list-clear-all-tags'. This function clears all tags from the padding area in the current buffer. Tags are typically added by calling 'tabulated-list-put-tag'. ** Text mode -+++ *** 'text-mode-variant' is now obsolete, use 'derived-mode-p' instead. ** CUA mode ---- *** New user option 'cua-rectangle-terminal-modifier-key'. This user option allows for the customization of the modifier key used in a terminal frame. ** JS mode ---- *** JSX syntax is now automatically detected and enabled. If a file imports Facebook's 'React' library, or if the file uses the extension ".jsx", then various features supporting XML-like syntax will be supported in 'js-mode' and derivative modes. ('js-jsx-mode' no longer needs to be enabled.) ---- *** New user option 'js-jsx-detect-syntax' disables automatic detection. This is turned on by default. ---- *** New user option 'js-jsx-syntax' enables JSX syntax unconditionally. This is off by default. ---- *** New variable 'js-jsx-regexps' controls JSX detection. ---- *** JSX syntax is now highlighted like SGML. ---- *** JSX code is properly indented in many more scenarios. Previously, JSX indentation usually only worked when an element was wrapped in parenthesis (e.g. in a 'return' statement or a function @@ -2477,7 +2070,6 @@ supported; and, indentation conventions align more closely with those of the React developer community (see 'js-jsx-align->-with-<'), otherwise still adhering to SGML conventions. ---- *** New user option 'js-jsx-align->-with-<' controls '>' indents. Commonly in JSX code, a '>' on its own line is indented at the same level as its opening '<'. This is the new default for JSX. This @@ -2489,7 +2081,6 @@ This is turned on by default. To get back the old default indentation behavior of aligning '>' with attributes, set 'js-jsx-align->-with-<' to nil. ---- *** Indentation uses 'js-indent-level' instead of 'sgml-basic-offset'. Since JSX is a syntax extension of JavaScript, it makes the most sense for JSX expressions to be indented the same number of spaces as other @@ -2500,21 +2091,17 @@ be indented like JS, you won't need to change your config. The old behavior can be emulated by controlling JSX indentation independently of JS, by setting 'js-jsx-indent-level'. ---- *** New user option 'js-jsx-indent-level' for different JSX indentation. If you wish to indent JSX by a different number of spaces than JS, set this user option to the desired number. ---- *** New user option 'js-jsx-attribute-offset' for JSX attribute indents. ---- *** New variable 'js-syntactic-mode-name' controls mode name display. Previously, the mode name was simply 'JavaScript'. Now, when a syntax extension like JSX is enabled, the mode name is 'JavaScript[JSX]'. Set this variable to nil to disable the new behavior. ---- *** New function 'js-use-syntactic-mode-name' for deriving modes. Packages deriving from 'js-mode' with 'define-derived-mode' should call this function to add enabled syntax extensions to their mode @@ -2522,7 +2109,6 @@ name, too. ** Autorevert -+++ *** New user option 'auto-revert-avoid-polling' for saving power. When set to a non-nil value, buffers in Auto Revert mode are no longer polled for changes periodically. This reduces the power consumption @@ -2530,7 +2116,6 @@ of an idle Emacs, but may fail on some network file systems; set 'auto-revert-notify-exclude-dir-regexp' to match files where notification is not supported. The default value is nil. -+++ *** New variable 'buffer-auto-revert-by-notification'. A major mode can declare that notification on the buffer's default directory is sufficient to know when updates are required, by setting @@ -2538,41 +2123,33 @@ the new variable 'buffer-auto-revert-by-notification' to a non-nil value. Auto Revert mode can use this information to avoid polling the buffer periodically when 'auto-revert-avoid-polling' is non-nil. ---- *** 'global-auto-revert-ignore-buffer' can now also be a predicate function that can be used for more fine-grained control of which buffers to auto-revert. ** auth-source-pass -+++ *** New user option 'auth-source-pass-filename'. Allows setting the path to the password-store, defaults to "~/.password-store". -+++ *** New user option 'auth-source-pass-port-separator'. Specifies separator between host and port, defaults to colon ":". ---- *** Minimize the number of decryptions during password lookup. This makes the package usable with physical tokens requiring touching a sensor for every decryption. ---- *** 'auth-source-pass-get' is now autoloaded. ** Bookmarks ---- *** 'bookmark-file' and 'bookmark-old-default-file' are now obsolete aliases of 'bookmark-default-file'. ---- *** New user option 'bookmark-watch-bookmark-file'. When non-nil, watch whether the bookmark file has changed on disk. ---- *** The old bookmark file format is no longer supported. This bookmark file format has not been used in Emacs since at least version 19.34, released in 1996, and will no longer be automatically @@ -2584,14 +2161,12 @@ The following functions are now declared obsolete: 'bookmark-upgrade-file-format-from-0', and 'bookmark-upgrade-version-0-alist'. ---- ** The mantemp.el library is now marked obsolete. This library generates manual C++ template instantiations. It should no longer be useful on modern compilers, which do this automatically. ** Ispell ---- *** New hook 'ispell-change-dictionary-hook'. This runs after changing the dictionary and could be used to automatically spellcheck a buffer when changing language without @@ -2599,43 +2174,36 @@ needing to advice 'ispell-change-dictionary'. ** scroll-lock ---- *** New command 'scroll-lock-next-line-always-scroll'. This command is bound to 'S-down' and scrolls the buffer up in particular when the end of the buffer is visible in the window. ** mwheel.el ---- *** 'mwheel-install' is now obsolete. Use 'mouse-wheel-mode' instead. Note that 'mouse-wheel-mode' is already enabled by default on most graphical displays. ** Gravatar -+++ *** 'gravatar-cache-ttl' is now a number of seconds. The previously used timestamp format of a list of integers is still supported, but is deprecated. The default value has not changed. -+++ *** 'gravatar-size' can now be nil. This results in the use of Gravatar's default size of 80 pixels. -+++ *** The default fallback gravatar is now configurable. This is possible using the new user options 'gravatar-default-image' and 'gravatar-force-default'. ** ada-mode ---- *** The built-in ada-mode is now deleted. The GNU ELPA package is a good replacement, even in very large source files. ** time-stamp ---- *** New '%5z' conversion for 'time-stamp-format' gives time zone offset. Specifying '%5z' in 'time-stamp-format' or 'time-stamp-pattern' expands to the time zone offset, e.g., '+0100'. The time zone used is @@ -2645,7 +2213,6 @@ Because this feature is new in Emacs 27.1, do not use it in the local variables section of any file that might be edited by an older version of Emacs. ---- *** Some conversions recommended for 'time-stamp-format' have changed. The new documented/recommended %-conversions are closer to those used by 'format-time-string' and are compatible at least as far back @@ -2669,15 +2236,12 @@ file-local variable, you may need to update the value. ** mode-local ---- *** Declare 'define-overload' and 'define-child-mode' as obsolete. ---- *** Rename several internal functions to use a 'mode-local-' prefix. ** CC Mode -+++ *** You can now flag "wrong style" comments with 'font-lock-warning-face'. To do this, use 'c-toggle-comment-style', if needed, to set the desired default comment style (block or line); then set the user option @@ -2685,12 +2249,10 @@ default comment style (block or line); then set the user option ** Mailcap ---- *** The new function 'mailcap-file-name-to-mime-type' has been added. It's a simple convenience function for looking up MIME types based on file name extensions. ---- *** The default way the list of possible external viewers for MIME types is sorted and chosen has changed. Earlier, the most specific viewer was chosen, even if there was a general override in "~/.mailcap". @@ -2702,7 +2264,6 @@ method back, set 'mailcap-prefer-mailcap-viewers' to nil. ** MH-E -+++ *** The hook 'mh-show-mode-hook' is now called before the message is inserted. Functions that want to affect the message text (for example, to change highlighting) can no longer use 'mh-show-mode-hook', because the @@ -2711,7 +2272,6 @@ called. Such functions should now be attached to 'mh-show-hook'. ** URL ---- *** The 'file:' handler no longer looks for "index.html" in directories if you ask it for a "file:///dir" URL. Since this is a low-level library, such decisions (if they are to be made at all) are @@ -2722,7 +2282,6 @@ left to higher-level functions. ** Tab Bars -+++ *** Tab Bar mode The new command 'tab-bar-mode' enables the tab bar at the top of each frame (including TTY frames), where you can use tabs to switch between @@ -2751,7 +2310,6 @@ using completion on tab names, or using 'tab-switcher'. Read the new Info node "(emacs) Tab Bars" for full description of all related features. -+++ *** Tab Line mode The new command 'global-tab-line-mode' enables the tab line above each window, which you can use to switch buffers in the window. Selecting @@ -2765,16 +2323,13 @@ line scrolls tabs. Read the new Info node "(emacs) Tab Line" for full description of all related features. -+++ ** fileloop.el lets one setup multifile operations like search&replace. -+++ ** Emacs can now visit files in archives as if they were directories. This feature uses Tramp and works only on systems which support GVFS, i.e. GNU/Linux, roughly spoken. See the node "(tramp) Archive file names" in the Tramp manual for full documentation of these facilities. -+++ ** New library for writing JSONRPC applications (https://jsonrpc.org). The 'jsonrpc' library enables writing Emacs Lisp applications that rely on this protocol. Since the protocol is designed to be @@ -2783,14 +2338,12 @@ transport strategies as well as a separate API to use them. A transport implementation for process-based communication, such as is used by the Language Server Protocol (LSP), is readily available. -+++ ** Backtrace mode improves viewing of Elisp backtraces. Backtrace mode adds pretty printing, fontification and ellipsis expansion to backtrace buffers produced by the Lisp debugger, Edebug and ERT. See the node "(elisp) Backtraces" in the Elisp manual for documentation of the new mode and its commands. -+++ ** so-long.el helps to mitigate performance problems with long lines. When 'global-so-long-mode' has been enabled, visiting a file with very long lines will (subject to configuration) cause the user's preferred @@ -2802,7 +2355,6 @@ immediately. Type 'M-x so-long-commentary' for full documentation. * Incompatible Lisp Changes in Emacs 27.1 ---- ** Incomplete destructive splicing support has been removed. Support for Common Lisp style destructive splicing (",.") was incomplete and broken for a long time. It has now been removed. @@ -2815,11 +2367,9 @@ starting with a period ("."). Consider the following example: In the past, this would have incorrectly evaluated to '(\,\. foo)', but will now instead evaluate to '42'. ---- ** The REGEXP in 'magic-mode-alist' is now matched case-sensitively. Likewise for 'magic-fallback-mode-alist'. -+++ ** 'add-hook' does not always add to the front or the end any more. The replacement of 'append' with 'depth' implies that the function is not always added to the very front (when append/depth is nil) or the @@ -2828,15 +2378,12 @@ the hook may have specified higher/lower depths. This makes it possible to control the ordering of functions more precisely, as was already possible in 'add-function' and 'advice-add'. ---- ** In 'compilation-error-regexp-alist' the old undocumented feature where 'line' could be a function of 2 arguments has been dropped. ---- ** 'define-fringe-bitmap' is always defined, even when Emacs is built without any GUI support. ---- ** Just loading a theme's file no longer activates the theme's settings. Loading a theme with 'M-x load-theme' still activates the theme, as it did before. However, loading the theme's file with 'M-x load-file', @@ -2852,10 +2399,8 @@ default applied immediately. The variable 'custom--inhibit-theme-enable' controls this behavior; its default value changed in Emacs 27.1. ---- ** The REPETITIONS argument of 'benchmark-run' can now also be a variable. ---- ** Interpretation of relative 'HOME' directory has changed. If "$HOME" is set to a relative file name, 'expand-file-name' now interprets it relative to the directory where Emacs was started, not @@ -2863,15 +2408,12 @@ relative to the 'default-directory' of the current buffer. We recommend always setting "$HOME" to an absolute file name, so that its meaning is independent of where Emacs was started. ---- ** 'file-name-absolute-p' no longer considers "~foo" to be an absolute file name if there is no user named "foo". -+++ ** The FILENAME argument to 'file-name-base' is now mandatory and no longer defaults to 'buffer-file-name'. -+++ ** File metadata primitives now signal an error if I/O, access, or other serious errors prevent them from determining the result. Formerly, these functions often (though not always) silently returned @@ -2884,35 +2426,29 @@ file does not exist. The affected primitives are 'file-modes', 'file-newer-than-file-p', 'file-selinux-context', 'file-system-info', and 'set-visited-file-modtime'. ---- ** The function 'eldoc-message' now accepts a single argument. Programs that called it with multiple arguments before should pass them through 'format' first. Even that is discouraged: for ElDoc support, you should set 'eldoc-documentation-function' instead of calling 'eldoc-message' directly. ---- ** Old-style backquotes now generate an error. They have been generating warnings for a decade. To interpret old-style backquotes as new-style, bind the new variable 'force-new-style-backquotes' to t. ---- ** Defining a Common Lisp structure using 'cl-defstruct' or 'cl-struct-define' whose name clashes with a builtin type (e.g., 'integer' or 'hash-table') now signals an error. ---- ** When formatting a floating-point number as an octal or hexadecimal integer, Emacs now signals an error if the number is too large for the implementation to format. -+++ ** 'logb' now returns infinity when given an infinite or zero argument, and returns a NaN when given a NaN. Formerly, it returned an extreme fixnum for such arguments. ---- ** Some functions and variables obsolete since Emacs 22 have been removed: 'archive-mouse-extract', 'assoc-ignore-case', 'assoc-ignore-representation', 'backward-text-line', 'blink-cursor', 'bookmark-exit-hooks', @@ -2950,28 +2486,24 @@ fixnum for such arguments. 'vc-previous-comment', 'view-todo', 'x-lost-selection-hooks', 'x-sent-selection-hooks'. ---- ** Further functions and variables obsolete since Emacs 24 have been removed: 'default-directory-alist', 'dired-default-directory', 'dired-default-directory-alist', 'dired-enable-local-variables', 'dired-hack-local-variables', 'dired-local-variables-file', 'dired-omit-here-always'. -+++ ** Garbage collection no longer treats miscellaneous objects specially; they are now allocated like any other pseudovector. As a result, the 'garbage-collect' and 'memory-use-count' functions no longer return a 'misc' component, and the 'misc-objects-consed' variable has been removed. -+++ ** Reversed character ranges are no longer permitted in 'rx'. Previously, ranges where the starting character is greater than the ending character were silently omitted. For example, '(rx (any "@z-a" (?9 . ?0)))' would match '@' only. Now, such 'rx' expressions generate an error. ---- ** Internal 'rx' functions and variables have been removed, as a consequence of an improved implementation. Packages using these should use the public 'rx' and 'rx-to-string' instead. @@ -2979,7 +2511,6 @@ these should use the public 'rx' and 'rx-to-string' instead. extension mechanism is preferred: 'rx-define', 'rx-let' and 'rx-let-eval'. -+++ ** 'text-mode' no longer sets the value of 'indent-line-function'. The global value of 'indent-line-function', which defaults to 'indent-relative', will no longer be reset locally when turning on @@ -2988,28 +2519,22 @@ The global value of 'indent-line-function', which defaults to To get back the old behavior, add a function to 'text-mode-hook' which performs '(setq-local indent-line-function #'indent-relative)'. ---- ** 'make-process' no longer accepts a non-nil ':stop' key. This has never worked reliably, and now causes an error. -+++ ** 'eventp' no longer returns non-nil for lists whose car is nil. This is consistent with the fact that nil, though a symbol, is not a valid event type. ---- ** The obsolete package xesam.el (since Emacs 24) has been removed. -+++ ** The XBM image handler now accepts a ':stride' argument, which should be specified in image specs representing the entire bitmap as a single bool vector. -+++ ** 'regexp-quote' may return its argument string. If the argument needs no quoting, it can be returned instead of a copy. -+++ ** Mouse scroll up and down with control key modifier changes font size. Previously, the control key modifier was used to scroll up or down by an amount which was close to near a full screen. This is now instead @@ -3026,24 +2551,19 @@ pointer is over. To change this behavior, you can customize the user option 'mouse-wheel-follow-mouse'. Note that this will also affect scrolling. -+++ ** Mouse scroll up and down with control key modifier also works on images where it scales the image under the mouse pointer. ---- ** 'help-follow-symbol' now signals 'user-error' if point (or the position pointed to by the argument POS) is not in a symbol. ---- ** The options.el library has been removed. It was obsolete since Emacs 22.1, replaced by customize. ---- ** The tls.el and starttls.el libraries are now marked obsolete. Use of built-in libgnutls based functionality (described in the Emacs GnuTLS manual) is recommended instead. ---- ** The url-ns.el library is now marked obsolete. This library is used to open configuration files for the long defunct web browser Netscape, and is no longer relevant. @@ -3051,7 +2571,6 @@ web browser Netscape, and is no longer relevant. * Lisp Changes in Emacs 27.1 -+++ ** Emacs Lisp integers can now be of arbitrary size. Emacs uses the GNU Multiple Precision (GMP) library to support integers whose size is too large to support natively. The integers @@ -3079,20 +2598,17 @@ like 'file-attributes' that compute file sizes and other attributes, functions like 'process-id' that compute process IDs, and functions like 'user-uid' and 'group-gid' that compute user and group IDs. -+++ ** 'overflow-error' is now documented as a subcategory of 'range-error'. Formerly it was undocumented, and was (incorrectly) a subcategory of 'domain-error'. ** Time values -+++ *** New function 'time-convert' converts Lisp time values to Lisp timestamps of various forms, including a new timestamp form '(TICKS . HZ)' where TICKS is an integer and HZ a positive integer denoting a clock frequency. -+++ *** Although the default timestamp format is still '(HI LO US PS)', it is planned to change in a future Emacs version, to exploit bignums. The documentation has been updated to mention that the timestamp @@ -3101,7 +2617,6 @@ format may change and that programs should use functions like probing the innards of a timestamp directly, or creating a timestamp by hand. -+++ *** Decoded (calendrical) timestamps now have subsecond resolution. This affects 'decode-time', which generates these timestamps, as well as functions like 'encode-time' that accept them. The subsecond info @@ -3118,11 +2633,9 @@ traditional behavior, this default may change in future Emacs versions, so callers requiring an integer should specify FORM explicitly. -+++ *** 'encode-time' supports a new API '(encode-time TIME)'. The old 'encode-time' API is still supported. -+++ *** A new package to parse ISO 8601 time, date, durations and intervals has been added. The main function to use is 'iso8601-parse', but there's also 'iso8601-parse-date', @@ -3131,30 +2644,25 @@ intervals has been added. The main function to use is structures, except the final one, which returns three of them (start, end and duration). -+++ *** 'time-add', 'time-subtract', and 'time-less-p' now accept infinities and NaNs too, and propagate them or return nil like floating-point operators do. If both arguments are finite, these functions now return exact results instead of rounding in some cases, and they also avoid excess precision when that is easy. -+++ *** New function 'time-equal-p' compares time values for equality. -+++ *** 'format-time-string' supports a new conversion specifier flag '+' that acts like the '0' flag but also puts a '+' before nonnegative years containing more than four digits. This is for compatibility with POSIX.1-2017. -+++ *** To access (or alter) the elements of a decoded time value, the 'decoded-time-second', 'decoded-time-minute', 'decoded-time-hour', 'decoded-time-day', 'decoded-time-month', 'decoded-time-year', 'decoded-time-weekday', 'decoded-time-dst' and 'decoded-time-zone' accessors can be used. -+++ *** The new functions 'date-days-in-month' (which will say how many days there are in a month in a specific year), 'date-ordinal-to-time' (that computes the date of an ordinal day), 'decoded-time-add' (for @@ -3163,7 +2671,6 @@ doing computations on a decoded time structure), 'make-decoded-time' filled out), and 'encoded-time-set-defaults' (which fills in nil elements as if it's midnight January 1st, 1970) have been added. -+++ *** In the DST slot, 'encode-time' and 'parse-time-string' now return -1 if it is not known whether daylight saving time is in effect. Formerly they were inconsistent: 'encode-time' returned t in this @@ -3171,38 +2678,31 @@ situation, whereas 'parse-time-string' returned nil. Now they consistently use nil to mean that DST is not in effect, and use -1 to mean that it is not known whether DST is in effect. -+++ ** New macro 'benchmark-progn'. This macro works like 'progn', but messages how long it takes to evaluate the body forms. The value of the last form is the return value. -+++ ** New function 'read-char-from-minibuffer'. This function works like 'read-char', but uses 'read-from-minibuffer' to read a character, so it maintains a history that can be navigated via usual minibuffer keystrokes 'M-p'/'M-n'. ---- ** New variables 'set-message-function' and 'clear-message-function' can be used to specify functions to show and clear messages that normally are displayed in the echo area. -+++ ** 'setq-local' can now set an arbitrary number of variables, which makes the syntax more like 'setq'. ---- ** 'reveal-mode' can now also be used for more than to toggle between invisible and visible: It can also toggle 'display' properties in overlays. This is only done on 'display' properties that have the 'reveal-toggle-invisible' property set. -+++ ** 'process-contact' now takes an optional NO-BLOCK argument to allow not waiting for a process to be set up. ---- ** New variable 'read-process-output-max' controls sub-process throughput. This variable determines how many bytes can be read from a sub-process in one read operation. The default, 4096 bytes, was previously a @@ -3210,118 +2710,94 @@ hard-coded constant. Setting it to a larger value might enhance throughput of reading from sub-processes that produces vast (megabytes) amounts of data in one go. -+++ ** The new user option 'quit-window-hook' is now run first when executing the 'quit-window' command. -+++ ** The user options 'help-enable-completion-auto-load', 'help-enable-auto-load' and 'vhdl-project-auto-load', as well as the function 'vhdl-auto-load-project' have been renamed to have "autoload" without the hyphen in their names. Obsolete aliases from the old names have been added. -+++ ** Buttons (created with 'make-button' and related functions) can now use the 'button-data' property. If present, the data in this property will be passed on to the 'action' function instead of the button itself in 'button-activate'. -+++ ** 'defcustom' now takes a ':local' keyword that can be either t or 'permanent', which mean that the variable should be automatically buffer-local. 'permanent' also sets the variable's 'permanent-local' property. -+++ ** The new macro 'with-suppressed-warnings' can be used to suppress specific byte-compile warnings. -+++ ** The new macro 'ignore-error' is like 'ignore-errors', but takes a specific error condition, and will only ignore that condition. (This can also be a list of conditions.) ---- ** The new function 'byte-compile-info-message' can be used to output informational messages that look pleasing during the Emacs build. ---- ** New 'help-fns-describe-variable-functions' hook. It makes it possible to add metadata information to 'describe-variable'. ** i18n (internationalization) ---- *** 'ngettext' can be used now to return the right plural form according to the given numeric value. -+++ ** 'inhibit-null-byte-detection' is renamed to 'inhibit-nul-byte-detection'. -+++ ** 'self-insert-command' takes the char to insert as (optional) argument. -+++ ** 'lookup-key' can take a list of keymaps as argument. -+++ ** 'condition-case' now accepts t to match any error symbol. -+++ ** New function 'proper-list-p'. Given a proper list as argument, this predicate returns its length; otherwise, it returns nil. 'format-proper-list-p' is now an obsolete alias for the new function. ---- ** 'define-minor-mode' automatically documents the meaning of ARG. -+++ ** The function 'recenter' now accepts an additional optional argument. By default, calling 'recenter' will not redraw the frame even if 'recenter-redisplay' is non-nil. Call 'recenter' with the new second argument non-nil to force redisplay per 'recenter-redisplay's value. -+++ ** New functions 'major-mode-suspend' and 'major-mode-restore'. Use them when switching temporarily to another major mode, e.g. for 'hexl-mode', or to switch between 'c-mode' and 'image-mode' in XPM. -+++ ** New macro 'dolist-with-progress-reporter'. This works like 'dolist', but reports progress similar to 'dotimes-with-progress-reporter'. -+++ ** New hook 'after-delete-frame-functions'. This works like 'delete-frame-functions', but runs after the frame to be deleted has been made dead and removed from the frame list. ---- ** The function 'provided-mode-derived-p' was extended to support aliases. The function now returns non-nil when the argument MODE is derived from any alias of any of MODES. -+++ ** New frame focus state inspection interface. The hooks 'focus-in-hook' and 'focus-out-hook' are now obsolete. Instead, attach to 'after-focus-change-function' using 'add-function' and inspect the focus state of each frame using 'frame-focus-state'. -+++ ** Emacs now requests and recognizes focus-change notifications from TTYs. On terminal emulators that support the feature, Emacs can now support 'focus-in-hook' and 'focus-out-hook' for TTY frames. -+++ ** Window-specific face remapping. Face specifications (of the kind used in 'face-remapping-alist') now support filters, allowing faces to vary between different windows displaying the same buffer. See the node "(elisp) Face Remapping" of the Emacs Lisp Reference manual for more detail. -+++ ** Window change functions have been redesigned. Hooks reacting to window changes run now only when redisplay detects that a change has actually occurred. Six hooks are now provided: @@ -3351,55 +2827,44 @@ Also 'run-window-configuration-change-hook' is declared obsolete. See the section "(elisp) Window Hooks" in the Elisp manual for a detailed explanation of the new behavior. -+++ ** Scroll bar and fringe settings can now be made persistent for windows. The functions 'set-window-scroll-bars' and 'set-window-fringes' now have a new optional argument that makes the settings they produce reliably survive subsequent invocations of 'set-window-buffer'. -+++ ** New user option 'resize-mini-frames'. This option allows automatically resizing minibuffer-only frames similarly to how minibuffer windows are resized on "normal" frames. -+++ ** New buffer display action function 'display-buffer-in-direction'. This function allows specifying the location of the window chosen by 'display-buffer' in various ways. -+++ ** New buffer display action alist entry 'dedicated'. Such an entry allows specifying the dedicated status of a window created by 'display-buffer'. -+++ ** New buffer display action alist entry 'window-min-height'. Such an entry allows specifying a minimum height of the window used for displaying a buffer. 'display-buffer-below-selected' is the only action function to respect it at the moment. -+++ ** New buffer display action alist entry 'direction'. This entry is used to specify the location of the window chosen by 'display-buffer-in-direction'. -+++ ** Additional meaning of display action alist entry 'window'. A 'window' entry can now also specify a reference window for 'display-buffer-in-direction'. -+++ ** The function 'assoc-delete-all' now takes an optional predicate argument. -+++ ** New function 'string-distance' to calculate the Levenshtein distance between two strings. -+++ ** 'print-quoted' now defaults to t, so if you want to see '(quote x)' instead of 'x you will have to bind it to nil where applicable. -+++ ** Numbers formatted via '%o' or '%x' are now formatted as signed integers. This avoids problems in calls like '(read (format "#x%x" -1))', and is more compatible with bignums. To get the traditional machine-dependent @@ -3408,12 +2873,10 @@ and if the new behavior breaks your code please email <32252@debbugs.gnu.org>. Because '%o' and '%x' can now format signed integers, they now support the '+' and space flags. -+++ ** In Emacs Lisp mode, symbols with confusable quotes are highlighted. For example, the first character in '‘foo' would be highlighted in 'font-lock-warning-face'. -+++ ** Omitting variables after '&optional' and '&rest' is now allowed. For example '(defun foo (&optional))' is no longer an error. This is sometimes convenient when writing macros. See the ChangeLog entry @@ -3421,7 +2884,6 @@ titled "Allow '&rest' or '&optional' without following variable (Bug#29165)" for a full listing of which arglists are accepted across versions. ---- ** Internal parsing commands now use 'syntax-ppss' and disregard 'open-paren-in-column-0-is-defun-start'. This affects mostly things like 'forward-comment', 'scan-sexps', and 'forward-sexp' when parsing backward. @@ -3432,7 +2894,6 @@ brackets at the start of a line inside documentation strings with a backslash, although there is no harm in doing so to make the code easier to edit with an older Emacs version. ---- ** New symbolic accessor functions for a parse state list. The new accessor functions 'ppss-depth', 'ppss-list-start', 'ppss-last-sexp-start', 'ppss-string-terminator', 'comment-depth', @@ -3440,37 +2901,30 @@ The new accessor functions 'ppss-depth', 'ppss-list-start', and 'two-character-syntax' can be used on the list value returned by 'parse-partial-sexp' and 'syntax-ppss'. ---- ** The 'server-name' and 'server-socket-dir' variables are set when a socket has been passed to Emacs. ---- ** The 'file-system-info' function is now available on all platforms. instead of just Microsoft platforms. This fixes a 'get-free-disk-space' bug on OS X 10.8 and later. ---- ** The function 'get-free-disk-space' returns now a non-nil value for remote systems, which support this check. -+++ ** 'memory-limit' now returns a better estimate of memory consumption. -+++ ** When interpreting 'gc-cons-percentage', Emacs now estimates the heap size more often and (we hope) more accurately. E.g., formerly '(progn (let ((gc-cons-percentage 0.8)) BODY1) BODY2)' continued to use the 0.8 value during BODY2 until the next garbage collection, but that is no longer true. Applications may need to re-tune their GC tricks. -+++ ** New macro 'combine-change-calls' arranges to call the change hooks ('before-change-functions' and 'after-change-functions') just once each around a sequence of lisp forms, given a region. This is useful when a function makes a possibly large number of repetitive changes and the change hooks are time consuming. -+++ ** 'eql', 'make-hash-table', etc. now treat NaNs consistently. Formerly, some of these functions ignored signs and significands of NaNs. Now, all these functions treat NaN signs and significands as @@ -3480,36 +2934,29 @@ Also, Emacs now reads and prints NaN significands; e.g., if X is a NaN, '(format "%s" X)' now returns "0.0e+NaN", "1.0e+NaN", etc., depending on X's significand. -+++ ** The function 'make-string' accepts an additional optional argument. If the optional third argument is non-nil, 'make-string' will produce a multibyte string even if its second argument is an ASCII character. ---- ** '(format "%d" X)' no longer mishandles a floating-point number X that does not fit in a machine integer. ---- ** New coding-system 'ibm038'. This is the International EBCDIC encoding, also available as aliases 'ebcdic-int' and 'cp038'. ---- ** New JSON parsing and serialization functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer'. These are implemented in C using the Jansson library. -+++ ** New function 'ring-resize'. 'ring-resize' can be used to grow or shrink a ring. -+++ ** New function 'flatten-tree'. 'flatten-list' is provided as an alias. These functions take a tree and 'flatten' it such that the result is a list of all the terminal nodes. -+++ ** 'zlib-decompress-region' can partially decompress corrupted data. If the new optional ALLOW-PARTIAL argument is passed, then the data that was decompressed successfully before failing will be inserted @@ -3517,23 +2964,19 @@ into the buffer. ** Image mode ---- *** New library Exif. An Exif library has been added that can parse JPEG files and output data about creation times and orientation and the like. 'exif-parse-file' and 'exif-parse-buffer' are the main interface functions. ---- *** 'image-mode' now uses this library to automatically rotate images according to the orientation in the Exif data, if any. -+++ *** The command 'image-rotate' now accepts a prefix argument. With a prefix argument, 'image-rotate' now rotates the image at point 90 degrees counter-clockwise, instead of the default clockwise. -+++ *** In 'image-mode' the image is resized automatically to fit in window. By default, the image will resize upon first display and whenever the window's dimensions change. Two user options 'image-auto-resize' and @@ -3542,20 +2985,17 @@ window's dimensions change. Two user options 'image-auto-resize' and key 's' contains the commands that can be used to fit the image to the window manually. ---- *** Some 'image-mode' variables are now buffer-local. The image parameters 'image-transform-rotation', 'image-transform-scale' and 'image-transform-resize' are now declared buffer-local, so each buffer could have its own values for these parameters. -+++ *** Three new 'image-mode' commands have been added: 'm', which marks the file in the dired buffer(s) for the directory the file is in; 'u', which unmarks the file; and 'w', which pushes the current buffer's file name to the kill ring. ---- *** New library image-converter. If you need to view exotic image formats for which Emacs doesn't have native support, customize the new user option @@ -3563,12 +3003,10 @@ native support, customize the new user option GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be used to convert images automatically before displaying them. ---- *** 'auto-mode-alist' now includes many of the types typically supported by the external image converters, like WEPB, BMP and ICO. These now default to using 'image-mode'. ---- *** 'imagemagick-types-inhibit' disables using ImageMagick by default. 'image-mode' started using ImageMagick by default for all images some years back. It now respects 'imagemagick-types-inhibit' as a way @@ -3576,66 +3014,53 @@ to disable that. ** Modules ---- *** The function 'load' now behaves correctly when loading modules. Specifically, it puts the module name into 'load-history', prints loading messages if requested, and protects against recursive loads. -+++ *** New module environment function 'process_input' to process user input while module code is running. -+++ *** New module environment functions 'make_time' and 'extract_time' to convert between timespec structures and Emacs Lisp time values. -+++ *** New module environment functions 'make_big_integer' and 'extract_big_integer' to create and extract arbitrary-size integer values. -+++ *** emacs-module.h now defines a macro 'EMACS_MAJOR_VERSION' that expands to the major version of the latest Emacs supported by the header. -+++ ** The function 'read-variable' now uses its own history list. The history of variable names read by 'read-variable' is recorded in the new variable 'custom-variable-history'. ---- ** The functions 'string-to-unibyte' and 'string-to-multibyte' are no longer declared obsolete. We have found that there are legitimate use cases for these functions, where there's no better alternative. We believe that the incorrect uses of these functions all but disappeared by now, so we are un-obsoleting them. -+++ ** New function 'group-name' returns a group name corresponding to GID. -+++ ** 'make-process' now takes a keyword argument ':file-handler'; if that is non-nil, it will look for a file name handler for the current buffer's 'default-directory' and invoke that file name handler to make the process. That way 'make-process' can start remote processes. -+++ ** '(locale-info 'paper)' now returns the paper size on systems that support it. This is currently supported on GNUish hosts and on modern versions of MS-Windows. -+++ ** The function 'regexp-opt', when given an empty list of strings, now returns a regexp that never matches anything, which is an identity for this operation. Previously, the empty string was returned in this case. -+++ ** New constant 'regexp-unmatchable' contains a never-matching regexp. It is a convenient and readable way to specify a regexp that should not match anything, and is as fast as any such regexp can be. -+++ ** New functions to handle the URL variant of base-64 encoding. New functions 'base64url-encode-string' and 'base64url-encode-region' implement the url-variant of base-64 encoding as defined in RFC4648. @@ -3644,7 +3069,6 @@ The functions 'base64-decode-string' and 'base64-decode-region' now accept an optional argument to decode the URL variant of base-64 encoding. -+++ ** The function 'file-size-human-readable' accepts more optional arguments. The new third argument is a string put between the number and unit; it defaults to the empty string. The new fourth argument is a string @@ -3653,82 +3077,68 @@ argument is 'iec' and the empty string otherwise. We recommend a space or non-breaking space as third argument, and "B" as fourth argument, circumstances allowing. -+++ ** 'format-spec' has been expanded with several modifiers to allow greater flexibility when customizing variables. The modifiers include zero-padding, upper- and lower-casing, and limiting the length of the interpolated strings. The function has now also been documented in the Emacs Lisp manual. -+++ ** 'directory-files-recursively' can now take an optional PREDICATE parameter to control descending into subdirectories, and a FOLLOW-SYMLINK parameter to say that symbolic links that point to other directories should be followed. -+++ ** New function 'xor' returns the boolean exclusive-or of its args. The function was previously defined in array.el, but has been moved to subr.el so that it is available by default. It now always returns the non-nil argument when the other is nil. Several duplicates of 'xor' in other packages are now obsolete aliases of 'xor'. -+++ ** 'define-globalized-minor-mode' now takes BODY forms. -+++ ** New text property 'help-echo-inhibit-substitution'. Setting this on the first character of a help string disables conversions via 'substitute-command-keys'. -+++ ** New text property 'minibuffer-message'. Setting this on a character of the minibuffer text will display the temporary echo messages before that character, when messages need to be displayed while minibuffer is active. -+++ ** 'undo' can be made to ignore the active region for a command by setting 'undo-inhibit-region' symbol property of that command to non-nil. This is used by 'mouse-drag-region' to make the effect easier to undo immediately afterwards. ---- ** When called interactively, 'next-buffer' and 'previous-buffer' now signal 'user-error' if there is no buffer to switch to. * Changes in Emacs 27.1 on Non-Free Operating Systems ---- ** Battery status is now supported in all Cygwin builds. Previously it was supported only in the Cygwin-w32 build. ---- ** Emacs now handles key combinations involving the macOS "command" and "option" modifier keys more correctly. -+++ ** MacOS modifier key behavior is now more adjustable. The behavior of the macOS "Option", "Command", "Control" and "Function" keys can now be specified separately for use with ordinary keys, function keys and mouse clicks. This allows using them in their standard macOS way for composing characters. -+++ ** The special handling of 'frame-title-format' on NS where setting it to t would enable the macOS proxy icon has been replaced with a separate variable, 'ns-use-proxy-icon'. 'frame-title-format' will now work as on other platforms. ---- ** New primitive 'w32-read-registry'. This primitive lets Lisp programs access the MS-Windows Registry by retrieving values stored under a given key. It is intended to be used for supporting features such as XDG-like location of important files and directories. -+++ ** The default value of 'w32-pipe-read-delay' is now zero. This speeds up reading output from sub-processes that produce a lot of data. @@ -3739,7 +3149,6 @@ versions of MS-Windows. Set this variable to 50 if for some reason you need the old behavior (and please report such situations to Emacs developers). ---- ** New variable 'w32-multibyte-code-page'. This variable holds the value of the multibyte code page used by the system. It is usually zero, which indicates that 'w32-ansi-code-page' @@ -3747,12 +3156,10 @@ is being used, except in Far Eastern locales. When this variable is non-zero, Emacs at startup sets 'locale-coding-system' to the corresponding encoding, instead of using 'w32-ansi-code-page'. ---- ** The default value of 'inhibit-compacting-font-caches' is t on MS-Windows. Experience shows that compacting font caches causes more trouble on MS-Windows than it helps. -+++ ** Font lookup on MS-Windows was improved to support rare scripts. To activate the improvement, run the new function 'w32-find-non-USB-fonts' once per Emacs session, or assign to the new @@ -3760,13 +3167,11 @@ variable 'w32-non-USB-fonts' the list of scripts and the corresponding fonts. See the documentation of this function and variable in the Emacs manual for more details. -+++ ** On NS the behavior of drag and drop can now be modified by use of modifier keys in line with Apples guidelines. This makes the drag and drop behavior more consistent, as previously the sending application was able to 'set' modifiers without the knowledge of the user. ---- ** On NS multicolor font display is enabled again since it is also implemented in Emacs on free operating systems via Cairo drawing. -- cgit v1.2.3 From bc486d1e20cd4b7c61dfefb4cda4720628666fe6 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 21:58:50 +0200 Subject: Revert "* etc/NEWS.27: Remove temporary markup." This reverts commit c270104e503cf0435a5ae40c5d0e430f4ef4bfb0. --- etc/NEWS.27 | 597 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 596 insertions(+), 1 deletion(-) diff --git a/etc/NEWS.27 b/etc/NEWS.27 index 7eebb89abf8..2c8fa9dd397 100644 --- a/etc/NEWS.27 +++ b/etc/NEWS.27 @@ -15,15 +15,23 @@ in older Emacs versions. You can narrow news to a specific version by calling 'view-emacs-news' with a prefix argument or by typing 'C-u C-h C-n'. +Temporary note: ++++ indicates that all relevant manuals in doc/ have been updated. +--- means no change in the manuals is needed. +When you add a new item, use the appropriate mark if you are sure it +applies, and please also update docstrings as needed. + * Installation Changes in Emacs 27.1 +--- ** Emacs now uses GMP, the GNU Multiple Precision library. By default, if 'configure' does not find a suitable libgmp, it arranges for the included mini-gmp library to be built and used. The new configure option '--without-libgmp' uses mini-gmp even if a suitable libgmp is available. +--- ** Emacs can now use HarfBuzz as its shaping engine. The new configure option '--with-harfbuzz' adds support for the HarfBuzz text shaping engine. It is on by default; use './configure @@ -36,6 +44,7 @@ supported ones, so the font backends that use older shaping engines enabled by default; they can be enabled via the 'font-backend' frame parameter or via X resources. +--- ** The new configure option '--with-json' adds native support for JSON. This uses the Jansson library. The option is on by default; use './configure --with-json=no' to build without Jansson support. The @@ -43,6 +52,7 @@ new JSON functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer' are typically much faster than their Lisp counterparts from json.el. +--- ** The configure option '--with-cairo' is no longer experimental. This builds Emacs with Cairo drawing, and supports built-in printing when Emacs is built with GTK+. Some severe bugs in this build were @@ -51,6 +61,7 @@ that building with Cairo enabled results in using Pango instead of libXft for font support, and that Pango 1.44 has removed support for bitmapped fonts. ++++ ** Emacs now uses a "portable dumper" instead of unexec. This improves compatibility with memory allocation on modern systems, and in particular better supports the Address Space Layout @@ -74,10 +85,12 @@ use the configure-time option '--with-dumping=unexec'; however, please file a bug report describing the situation, as unexec dumping is deprecated, and we plan on removing it in some future release. +--- ** The new configure option '--enable-checking=structs' attempts to check that the portable dumper code has been updated to match the last change to one of the data structures that it relies on. +--- ** The configure options '--enable-checking=conslist' and '--enable-checking=xmallocoverrun' have been withdrawn. The former made Emacs irredeemably slow, and the latter made it crash. Neither @@ -85,16 +98,19 @@ option was useful with modern debugging tools such as AddressSanitizer. (See "etc/DEBUG" for the details of using the modern replacements of the removed configure options.) +--- ** Emacs no longer defaults to using ImageMagick to display images. This is due to security and stability concerns with ImageMagick. To override the default, use 'configure --with-imagemagick'. +--- ** Several configure options now accept an option-argument 'ifavailable'. For example, './configure --with-xpm=ifavailable' now configures Emacs to attempt to use libxpm but to continue building even if libxpm is absent. The other affected options are '--with-gif', '--with-gnutls', '--with-jpeg', '--with-png', and '--with-tiff'. +--- ** The 'etags' program now uses the C library's regular expression matcher. If it's possible, 'etags' will use the regexp matcher from the system's standard C library, otherwise it will be linked with a @@ -104,6 +120,7 @@ configure option '--without-included-regex' forces 'etags' to use the C library's regex matcher even if the regex substitute ordinarily would be used to work around compatibility problems. +--- ** Emacs has been ported to the '-fcheck-pointer-bounds' option of GCC. This causes Emacs to check bounds of some arrays addressed by its internal pointers, which can be helpful when debugging the Emacs @@ -111,6 +128,7 @@ interpreter or modules that it uses. If your platform supports it you can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2 -mmpx -fcheck-pointer-bounds"' on Intel MPX platforms. +--- ** Emacs now normally uses a C pointer type instead of a C integer type to implement Lisp_Object, which is the fundamental machine word type internal to the Emacs Lisp interpreter. This change aims to @@ -119,24 +137,30 @@ option '--enable-check-lisp-object-type' is therefore no longer as useful and so is no longer enabled by default in developer builds, to reduce differences between developer and production builds. +--- ** The distribution tarball now has test cases; 'make check' runs them. This is intended mostly to help developers. +--- ** Emacs now requires GTK 2.24 and GTK 3.10 for the GTK 2 and GTK 3 builds respectively. +--- ** New make target 'help' shows a summary of common make targets. +--- ** Emacs now builds with dynamic module support by default. Pass '--without-modules' to 'configure' to disable dynamic module support. +--- ** The ftx font backend driver is now obsolete and will be removed in Emacs 28. * Startup Changes in Emacs 27.1 ++++ ** Emacs can now use the XDG convention for init files. The 'XDG_CONFIG_HOME' environment variable (which defaults to "~/.config") specifies the XDG configuration parent directory. Emacs @@ -156,6 +180,7 @@ Emacs will never create "$XDG_CONFIG_HOME/emacs". Whichever directory Emacs decides to use, it will set 'user-emacs-directory' to point to it. ++++ ** Emacs can now be configured using an early init file. The file is called "early-init.el", in 'user-emacs-directory'. It is loaded very early in the startup process: before graphical elements @@ -171,6 +196,7 @@ process, and some important parts of the Emacs session, such as 'window-system' and other GUI features, are not yet set up, which could make some customization fail to work. ++++ ** Installed packages are now activated *before* loading the init file. As a result of this change, it is no longer necessary to call 'package-initialize' in your init file. @@ -192,6 +218,7 @@ it won't work right without some adjustment: does not need to pay attention to 'package-load-list' or 'package-user-dir' any more. +--- ** Emacs now notifies systemd when startup finishes or shutdown begins. Units that are ordered after 'emacs.service' will only be started after Emacs has finished initialization and is ready for use. @@ -202,8 +229,10 @@ the new version of the file again.) * Changes in Emacs 27.1 +--- ** Emacs now supports Unicode Standard version 13.0. ++++ ** Emacs now supports resizing and rotating images without ImageMagick. All modern systems support this feature. (On GNU and Unix systems, Cairo drawing or the XRender extension to X11 is required for this to @@ -213,10 +242,12 @@ enable scaling.) The new function 'image-transforms-p' can be used to test whether any given frame supports these capabilities. ++++ ** The Network Security Manager now allows more fine-grained control of what checks to run via the 'network-security-protocol-checks' user option. ++++ ** TLS connections have their security tightened by default. Most of the checks for outdated, believed-to-be-weak TLS algorithms and ciphers are now switched on by default. (In addition, several new @@ -228,6 +259,7 @@ issued), you can either set 'network-security-protocol-checks' to nil, or adjust the elements in that user option to only happen on the 'high' security level (assuming you use the 'medium' level). +--- ** New user option 'nsm-trust-local-network'. Allows skipping Network Security Manager checks for hosts on your local subnet(s). It defaults to nil. Usually, there should be no @@ -235,18 +267,21 @@ need to set this non-nil, and doing that risks opening your local network connections to attacks. So be sure you know what you are doing before changing the value. ++++ ** Native GnuTLS connections can now use client certificates. Previously, this support was only available when using the external 'gnutls-cli' or 'starttls' command. Call 'open-network-stream' with ':client-certificate t' to trigger looking up of per-server certificates via 'auth-source'. ++++ ** New user option 'network-stream-use-client-certificates'. When non-nil, 'open-network-stream' performs lookups of client certificates using 'auth-source' as if ':client-certificate t' were specified if there is no explicit ':client-certificate' parameter. Defaults to nil. ++++ ** 'next/previous-multiframe-window' have been renamed. The new names are as follows: @@ -257,11 +292,12 @@ The old function names are maintained as aliases for backward compatibility. ** emacsclient - ++++ *** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable. The command-line argument '--socket-name' overrides it. (The same behavior as for the pre-existing 'EMACS_SERVER_FILE' variable.) ++++ *** Emacs and emacsclient now default to "$XDG_RUNTIME_DIR/emacs". This is used as the directory for client/server sockets, if Emacs is running on a platform or environment that sets the 'XDG_RUNTIME_DIR' @@ -269,9 +305,11 @@ environment variable to indicate where session sockets should go. To get the old, less-secure behavior, you can set the 'EMACS_SOCKET_NAME' environment variable to an appropriate value. +--- *** When run by root, emacsclient no longer connects to non-root sockets. (Instead you can use Tramp methods to run root commands in a non-root Emacs.) +--- ** 'xft-ignore-color-fonts' now ignores even more color fonts. There are color fonts that managed to bypass the existing checks, causing XFT crashes, they are now filtered out. Setting @@ -279,36 +317,45 @@ causing XFT crashes, they are now filtered out. Setting require setting 'face-ignored-fonts' to filter out problematic fonts. Known problematic fonts are "Noto Color Emoji" and "Emoji One". +--- ** The GTK+ font chooser now respects 'face-ignored-fonts'. When using 'menu-set-font' under GTK3, the available fonts are now matched against 'face-ignored-fonts'. +--- ** The GTK+ font chooser now remembers the previously selected settings. It now remembers the name, size, style, etc. ++++ ** New user option 'what-cursor-show-names'. When non-nil, 'what-cursor-position' will show the name of the character in addition to the decimal/hex/octal representation. Default nil. ++++ ** New function 'network-lookup-address-info'. This does IPv4 and/or IPv6 address lookups on hostnames. ++++ ** 'network-interface-list' can now return IPv4 and IPv6 addresses. IPv4 and IPv6 addresses are now returned by default if available, optionally including netmask/broadcast address information. +--- ** Control of the threshold for using the 'distant-foreground' color. The threshold for color distance below which the 'distant-foreground' color of the face will be used instead of the foreground color can now be controlled via the new variable 'face-near-same-color-threshold'. The default value is 30000, as the previously hard-coded threshold. ++++ ** The function 'read-passwd' uses "*" as default character to hide passwords. ++++ ** The function 'read-answer' now accepts not only single character answers, but also function keys like 'F1', character events such as 'C-M-h', and control characters like 'C-h'. ++++ ** Lexical binding is now used by default when evaluating interactive Elisp. More specifically, 'lexical-binding' is now used by default for 'M-:' and '--eval' (including in evaluations invoked from 'emacsclient' via @@ -324,16 +371,19 @@ to work with lexical binding, or wrap it in an extra level of 'eval'. For example, --eval "FORM" becomes --eval "(eval 'FORM)" (note the extra quote in 'FORM). +--- ** The new user option 'tooltip-resize-echo-area' avoids truncating tooltip text on GUI frames when tooltips are displayed in the echo area. Instead, it resizes the echo area as needed to accommodate the full tool-tip text. +--- ** Show mode line tooltips only if the corresponding action applies. Customize the user option 'mode-line-default-help-echo' to restore the old behavior where the tooltip text is also shown when the corresponding action does not apply. ++++ ** New hook 'server-after-make-frame-hook'. This hook is a convenient place to perform initializations in daemon mode which require GUI features to be available. One example is @@ -342,12 +392,15 @@ the call to 'desktop-read' in this hook, if you want the GUI settings to be restored, or if desktop.el needs to interact with you during restoration of the session. ++++ ** The functions 'set-frame-height' and 'set-frame-width' are now commands, and will set the currently selected frame to the height/ width specified by the numeric prefix. ++++ ** New function 'logcount' calculates an integer's Hamming weight. ++++ ** New function 'libxml-available-p'. This function returns non-nil if libxml support is both compiled in and available at run time. Lisp programs should use this function to @@ -355,6 +408,7 @@ detect built-in libxml support, instead of testing for that indirectly, e.g., by checking that functions like 'libxml-parse-html-region' return nil. ++++ ** 'libxml-parse-xml-region' and 'libxml-parse-html-region' take a parameter that's called DISCARD-COMMENTS, but it really only discards the top-level comment. Therefore this parameter is now @@ -362,67 +416,83 @@ obsolete, and the new utility function 'xml-remove-comments' can be used to remove comments before calling the libxml functions to parse the data. ++++ ** A new DOM (the XML/HTML document structure returned by functions such as 'libxml-parse-html-region') traversal function has been added: 'dom-search', which takes a DOM and a predicate and returns all nodes that match. ++++ ** New function 'fill-polish-nobreak-p', to be used in 'fill-nobreak-predicate'. It blocks line breaking after a one-letter word, also in the case when this word is preceded by a non-space, but non-alphanumeric character. ++++ ** The limit on repetitions in regexps has been raised to 2^16-1. It was previously limited to 2^15-1. For example, the following regular expression was previously invalid, but is now accepted: x\{32768\} +--- ** The German prefix and postfix input methods now support Capital sharp S. +--- ** New input methods 'hawaiian-postfix' and 'hawaiian-prefix'. +--- ** New input methods 'georgian-qwerty' and 'georgian-nuskhuri'. +--- ** New input methods for several variants of the Sami language. The Sami input methods include: 'norwegian-sami-prefix', 'bergsland-hasselbrink-sami-prefix', 'southern-sami-prefix', 'ume-sami-prefix', 'northern-sami-prefix', 'inari-sami-prefix', 'skolt-sami-prefix', and 'kildin-sami-prefix'. ++++ ** Japanese environments use UTF-8 by default. In Japanese environments that do not specify encodings and are not based on MS-Windows, the default encoding is now utf-8 instead of japanese-iso-8bit. ++++ ** New function 'exec-path'. This function by default returns the value of the corresponding user option, but can optionally return the equivalent of 'exec-path' from a remote host. ++++ ** The function 'executable-find' supports an optional argument REMOTE. This triggers searching for the program on the remote host as indicated by 'default-directory'. ++++ ** New user option 'auto-save-no-message'. When set to t, no message will be shown when auto-saving (default value: nil). +--- ** The value of 'make-cursor-line-fully-visible' can now be a function. In addition to nil or non-nil, the value can now be a predicate function. Follow mode uses this to control scrolling of its windows when the last screen line in a window is not fully visible. ++++ ** New variable 'emacs-repository-branch'. It reports the git branch from which Emacs was built. ++++ ** New user option 'switch-to-buffer-obey-display-actions'. When non-nil, 'switch-to-buffer' uses 'pop-to-buffer-same-window' that respects display actions specified by 'display-buffer-alist' and 'display-buffer-overriding-action'. ++++ ** The user option 'switch-to-visible-buffer' is now obsolete. Customize 'switch-to-prev-buffer-skip' instead. ++++ ** New user option 'switch-to-prev-buffer-skip'. This user option allows specifying the set of buffers that may be shown by 'switch-to-prev-buffer' and 'switch-to-next-buffer' more @@ -434,8 +504,10 @@ matches strings where the pattern appears as a subsequence. Put simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex' to 'completion-styles' or 'completion-category-overrides' to use it. +--- ** The 'completion-common-part' face is now visible by default. ++++ ** New face attribute ':extend' to control face extension at EOL. The new face attribute ':extend' controls whether to use the face for displaying the empty space beyond end of line (EOL) till the edge of @@ -452,25 +524,32 @@ Consequently, a theme generally shouldn't specify this attribute unless it has a good reason to do so. ** Connection-local variables ++++ *** Connection-local variables are applied by default like file-local and directory-local variables. ++++ *** The macro 'with-connection-local-variables' has been renamed from 'with-connection-local-profiles'. No argument PROFILES needed any longer. +--- ** New user option 'next-error-verbose' controls when 'next-error' outputs a message about the error locus. +--- ** New user option 'grep-search-path' defines the directories searched for grep hits (this used to be controlled by 'compilation-search-path'). +--- ** New user option 'emacs-lisp-compilation-search-path' defines the directories searched for byte-compiler error messages (this used to be controlled by 'compilation-search-path'). +--- ** Multicolor fonts such as "Noto Color Emoji" can be displayed on Emacs configured with Cairo drawing and linked with cairo >= 1.16.0. ++++ ** Emacs now optionally displays a fill column indicator. This is similar to what 'fill-column-indicator' package provides, but much faster and compatible with 'show-trailing-whitespace'. @@ -485,36 +564,46 @@ in tooltips, as it is not useful there. There are 2 new buffer local variables and 1 face to customize this mode, they are described in the manual "(emacs) Display". ++++ ** 'progress-reporter-update' now accepts an optional suffix string to display. +--- ** New user option 'xref-file-name-display' controls the display of file names in xref buffers. +--- ** New user option 'byte-count-to-string-function'. It is used for displaying file sizes and disk space in some cases. ++++ ** Emacs now interprets RGB triplets like HTML, SVG, and CSS do. The X convention previously used differed slightly, particularly for RGB triplets with a single hexadecimal digit per component. +--- ** The toolbar now shows the equivalent key binding in its tooltips. +--- ** The File menu-bar menu was re-arranged. Print menu items moved to submenu, and also added the new entries for tabs. +--- ** 'scroll-lock-mode' is now bound to the 'Scroll_Lock' key globally. Note that this key binding will not work on MS-Windows systems if 'w32-scroll-lock-modifier' is non-nil. +--- ** 'global-set-key', called interactively, now no longer downcases a key binding with an upper case letter - if you can type it, you can bind it. ++++ ** 'read-from-minibuffer' now works with buffer-local history variables. The HIST argument of 'read-from-minibuffer' now works correctly with buffer-local variables. This means that different buffers can have their own separated input history list if desired. ++++ ** 'backup-by-copying-when-privileged-mismatch' applies to file gid, too. In addition to checking the file owner uid, Emacs also checks that the group gid is not greater than 'backup-by-copying-when-privileged-mismatch'; @@ -523,39 +612,48 @@ if so, 'backup-by-copying-when-mismatch' will be forced on. * Editing Changes in Emacs 27.1 ++++ ** When asked to visit a large file, Emacs now offers to visit it literally. Previously, Emacs would only ask for confirmation before visiting large files. Now it also offers a third alternative: to visit the file literally, as in 'find-file-literally', which speeds up navigation and editing of large files. ++++ ** 'zap-to-char' now uses the history of characters you used to zap to. 'zap-to-char' uses the new 'read-char-from-minibuffer' function to allow navigating through the history of characters that have been input. This is mostly useful for characters that have complex input methods where inputting the character again may involve many keystrokes. ++++ ** 'save-some-buffers' now has a new action in the prompt: 'C-f' will exit the command and switch to the buffer currently being asked about. +--- ** More commands support noncontiguous rectangular regions, namely 'upcase-dwim', 'downcase-dwim', 'capitalize-dwim', 'capitalize-region', 'upcase-initials-region', 'replace-string', 'replace-regexp', and 'delimit-columns-region'. ++++ ** The new 'amalgamating-undo-limit' variable can be used to control how many changes should be amalgamated when using the 'undo' command. +--- ** The 'newline-and-indent' command (commonly bound to 'RET' in many modes) now takes an optional numeric argument to specify how many times is should insert newlines (and indent). ++++ ** New command 'make-empty-file'. +--- ** New variable 'x-wait-for-event-timeout'. This controls how long Emacs will wait for updates to the graphical state to take effect (making a frame visible, for example). ++++ ** New user option 'electric-quote-replace-double'. This option controls whether '"' is replaced in 'electric-quote-mode', in addition to other quote characters. If non-nil, ASCII double-quote @@ -563,48 +661,59 @@ characters that quote text "like this" are replaced by double typographic quotes, “like this”, in text modes, and in comments in non-text modes. +--- ** New user option 'flyspell-case-fold-duplications'. This option controls whether Flyspell mode considers consecutive words to be duplicates if they are not in the same case. If non-nil, the default, words are considered to be duplicates even if their letters' case does not match. +--- ** 'write-abbrev-file' now includes special properties. 'write-abbrev-file' now writes special properties like ':case-fixed' for abbrevs that have them. ++++ ** 'write-abbrev-file' skips empty tables. 'write-abbrev-file' now skips inserting a 'define-abbrev-table' form for tables which do not have any non-system abbrevs to save. ++++ ** The new functions and commands 'text-property-search-forward' and 'text-property-search-backward' have been added. These provide an interface that's more like functions like 'search-forward'. +--- ** 'add-dir-local-variable' now uses dotted pair notation syntax to write alists of variables to ".dir-locals.el". This is the same syntax that you can see in the example of a ".dir-locals.el" file in the node "(emacs) Directory Variables" of the user manual. ++++ ** Network connections using 'local' can now use IPv6. 'make-network-process' now uses the correct loopback address when asked to use ':host 'local' and ':family 'ipv6'. ++++ ** The new function 'replace-region-contents' replaces the current region using a given replacement-function in a non-destructive manner (in terms of 'replace-buffer-contents'). ++++ ** The command 'replace-buffer-contents' now has two optional arguments mitigating performance issues when operating on huge buffers. ++++ ** Dragging 'C-M-mouse-1' now marks rectangular regions. ++++ ** The command 'delete-indentation' now operates on the active region. If the region is active, the command joins all the lines in the region. When there's no active region, the command works on the current and the previous or the next line, as before. ++++ ** You can now change the font size with the mouse wheel. Scrolling the mouse wheel with the Ctrl key pressed will now act the same as the 'C-x C-+' and 'C-x C--' commands. @@ -612,15 +721,18 @@ same as the 'C-x C-+' and 'C-x C--' commands. * Changes in Specialized Modes and Packages in Emacs 27.1 +--- ** New HTML mode skeleton 'html-id-anchor'. This new command (which inserts an _ skeleton) is bound to 'C-c C-c #'. ++++ ** New command 'font-lock-refontify'. This is an interactive convenience function to be used when developing font locking for a mode. It recomputes the font locking data and then re-fontifies the buffer. +--- ** Font Lock is smarter about fontifying unterminated strings and comments. When you type a quote that starts a string, or a comment delimiter that starts a comment, font-lock will not immediately refontify the @@ -631,22 +743,28 @@ comment. This is controlled by the new user option 'jit-lock-antiblink-grace', which specifies the delay in seconds. The default is 2 seconds; set to nil to get back the old behavior. +--- ** The 'C' command in 'tar-mode' will now preserve the timestamp of the extracted file if the new user option 'tar-copy-preserve-time' is non-nil. +--- ** 'autoconf-mode' is now used instead of 'm4-mode' for the "acinclude.m4" / "aclocal.m4" / "acsite.m4" files. +--- ** On GNU/Linux, 'M-x battery' will now list all batteries, no matter what they're named, and the 'battery-linux-sysfs-regexp' variable has been removed. +--- ** The 'list-processes' command now includes port numbers in the network connection information (in addition to the host name). +--- ** The 'cl' package is now officially deprecated in favor of 'cl-lib'. +--- ** desktop *** When called interactively with a prefix arg 'C-u', 'desktop-read' @@ -654,94 +772,115 @@ now prompts the user for the directory containing the desktop file. ** display-line-numbers-mode ++++ *** New faces 'line-number-major-tick' and 'line-number-minor-tick', and user options 'display-line-numbers-major-tick' and 'display-line-numbers-minor-tick' can be used to highlight the line numbers of lines multiple of certain numbers. ++++ *** New variable 'display-line-numbers-offset', when non-zero, adds an offset to absolute line numbers. ** winner ++++ *** A new user option, 'winner-boring-buffers-regexp', has been added. ** table ++++ *** 'table-generate-source' now supports wiki and mediawiki. This command can now output wiki and mediawiki format tables. ** telnet-mode +--- *** Reverting a buffer in 'telnet-mode' will restart a closed connection. ** goto-addr +--- *** A way to more conveniently specify what URI address schemes should be ignored has been added via the 'goto-address-uri-schemes-ignored' variable. ** tex-mode ++++ *** 'latex-noindent-commands' controls indentation of certain commands. You can use this new user option to control indentation of arguments of \emph, \footnote, and similar commands. ** byte compiler ++++ *** 'byte-compile-dynamic' is now obsolete. This is because on the one hand it suffers from misbehavior in corner cases that have plagued it for years, and on the other hand experience indicates that it doesn't bring any measurable benefit. +--- *** The 'g' keystroke in "*Compile-Log*" buffers has been bound to a new command that will recompile the file previously compiled with 'M-x byte-compile-file' and the like. ** compile.el +--- *** In 'compilation-error-regexp-alist', 'line' (and 'end-line') can be functions. ++++ *** 'compilation-context-lines' can now take the value t; this is like nil, but instead of scrolling the current line to the top of the screen when there is no left fringe, it inserts a visible arrow before column zero. +--- *** The new 'compilation-transform-file-match-alist' user option can be used to transform file name matches compilation output, and remove known false positives being recognized as warnings/errors. ** cl-lib.el ++++ *** 'cl-defstruct' has a new ':noinline' argument to prevent inlining its functions. ++++ *** 'cl-defstruct' slots accept a ':documentation' property. +--- *** 'cl-values-list' will now signal an error if its argument isn't a list. ** doc-view.el +--- *** New commands 'doc-view-presentation' and 'doc-view-fit-window-to-page'. +--- *** Added support for password-protected PDF files. +--- *** A new user option 'doc-view-pdftotext-program-args' has been added to allow controlling how the conversion to text is done. ++++ *** The prefix key 's' was changed to 'c' for slicing commands to avoid conflicts with 'image-mode' key 's'. The new key 'c' still has good mnemonics of "cut", "clip", "crop". ** Ido +--- *** New user option 'ido-big-directories' to mark directories whose names match certain regular expressions as big. Ido won't attempt to list the contents of such directories when completing file names. ** Minibuffer ++++ *** New user option 'minibuffer-beginning-of-buffer-movement'. This option allows control of how the 'M-<' command works in the minibuffer. If non-nil, point will move to the end of the prompt @@ -749,6 +888,7 @@ the minibuffer. If non-nil, point will move to the end of the prompt preserves the original behavior of 'M-<' moving to the beginning of the prompt. ++++ *** When the minibuffer is active, echo-area messages are displayed at the end of the minibuffer instead of hiding the minibuffer by the echo area display. The new user option 'minibuffer-message-clear-timeout' @@ -758,15 +898,19 @@ temporarily overwrote the minibuffer contents until the user typed something, set 'set-message-function' and 'clear-message-function' to nil. +--- *** Minibuffer now uses 'minibuffer-message' to display error messages at the end of the active minibuffer. To disable this, remove 'minibuffer-error-initialize' from 'minibuffer-setup-hook'. ++++ *** 'y-or-n-p' now uses the minibuffer to read 'y' or 'n' answer. +--- *** Some commands that previously used 'read-char-choice' now read a character using the minibuffer by 'read-char-from-minibuffer'. +--- ** map.el *** Now also understands plists. @@ -775,8 +919,10 @@ a character using the minibuffer by 'read-char-from-minibuffer'. *** 'map-contains-key' now returns a boolean rather than the key. *** Deprecate the 'testfn' args of 'map-elt' and 'map-contains-key'. *** New generic function 'map-insert'. ++++ *** The 'type' arg can be a list '(hash-table :key1 VAL1 :key2 VAL2 ...)'. +--- ** seq.el New convenience functions 'seq-first' and 'seq-rest' give easy access to respectively the first and all but the first elements of sequences. @@ -784,18 +930,22 @@ to respectively the first and all but the first elements of sequences. The new predicate function 'seq-contains-p' should be used instead of the now obsolete 'seq-contains'. +--- ** Follow mode In the current follow group of windows, "ghost" cursors are no longer displayed in the non-selected follow windows. To get the old behavior back, customize 'follow-hide-ghost-cursors' to nil. ++++ ** New variable 'warning-fill-column' for 'display-warning'. ** Windmove +--- *** 'windmove-create-window' when non-nil makes a new window. This happens upon moving off the edge of the frame. ++++ *** Windmove supports directional window display and selection. The new command 'windmove-display-default-keybindings' binds default keys with provided modifiers (by default, Shift-Meta) to the commands @@ -809,6 +959,7 @@ display the buffer in the same window, for example, 'S-M-0 C-h e' displays the "*Messages*" buffer in the same window. 'S-M-t C-h r' displays the Emacs manual in a new tab. ++++ *** Windmove also supports directional window deletion. The new command 'windmove-delete-default-keybindings' binds default keys with provided prefix (by default, 'C-x') and modifiers (by default, @@ -818,10 +969,12 @@ With a prefix arg 'C-u', also kills the buffer in that window. With 'M-0', deletes the selected window and selects the window that was in the specified direction. ++++ *** New command 'windmove-swap-states-in-direction' binds default keys to the commands that swap the states of the selected window with the window in the specified direction. +--- *** Windmove code no longer used is now obsolete. That includes the user option 'windmove-window-distance-delta' and the functions 'windmove-coord-add', 'windmove-constrain-to-range', @@ -829,82 +982,104 @@ functions 'windmove-coord-add', 'windmove-constrain-to-range', 'windmove-constrain-loc-for-movement', 'windmove-wrap-loc-for-movement', 'windmove-reference-loc' and 'windmove-other-window-loc'. +--- ** Octave mode The mode is automatically enabled in files that start with the 'function' keyword. ** project.el ++++ *** New commands 'project-search' and 'project-query-replace-regexp'. +--- *** New user option 'project-read-file-name-function'. ** Etags ++++ *** 'next-file' is now an obsolete alias of 'tags-next-file'. +--- *** 'tags-loop-revert-buffers' is an obsolete alias of 'fileloop-revert-buffers'. ++++ *** The 'tags-loop-continue' function along with the 'tags-loop-operate' and 'tags-loop-scan' variables are now obsolete; use the new 'fileloop-initialize' and 'fileloop-continue' functions instead. ++++ *** etags is now able to read Zstandard-compressed files. ** bibtex +--- *** New commands 'bibtex-next-entry' and 'bibtex-previous-entry'. In 'bibtex-mode-map', 'forward-paragraph' and 'backward-paragraph' are remapped to these, respectively. ** Dired ++++ *** New command 'dired-create-empty-file'. ++++ *** New command 'dired-number-of-marked-files'. It is by default bound to '* N'. +--- *** The marking commands now report how many files were marked by the command itself, not how many files are marked in total. ++++ *** The new user option 'dired-create-destination-dirs' controls whether 'dired-do-copy' and 'dired-rename-file' should create non-existent directories in the destination. ++++ *** 'dired-dwim-target' can be customized to prefer either the next window, or one of the most recently visited windows with a Dired buffer. ++++ *** When the new user option 'dired-vc-rename-file' is non-nil, Dired performs file renaming using underlying version control system. +--- *** Zstandard compression is now supported for 'dired-do-compress' and 'dired-do-compress-to'. +--- *** On systems that support suid/guid files, Dired now fontifies the permissions of such files with a special face 'dired-set-id'. +--- *** A new face, 'dired-special', is used to highlight sockets, named pipes, block devices and character devices. ** Find-Dired +--- *** New user option 'find-dired-refine-function'. The default value is 'find-dired-sort-by-filename'. +--- *** New sorting options for the user option 'find-ls-option'. ** Change Logs and VC +--- *** New user option 'vc-tor'. When non-nil, this user option causes the VC commands to communicate with the repository via Tor's proxy, using the 'torsocks' wrapper script. The default is nil. ++++ *** New command 'log-edit-generate-changelog-from-diff', bound to 'C-c C-w'. This generates ChangeLog entries from the VC fileset diff. ++++ *** Recording ChangeLog entries doesn't require an actual file. If a ChangeLog file doesn't exist, and if the new user option 'add-log-dont-create-changelog-file' is non-nil (which is the @@ -914,26 +1089,32 @@ still be used if it exists.) Set the user option to nil to get the previous behavior of always creating a buffer that visits a ChangeLog file. ++++ *** The new 'd' command ('vc-dir-clean-files') in 'vc-dir-mode' buffers will delete the marked files (or if no files are marked, the file under point). This command does not notify the VC backend, and is mostly useful for unregistered files. +--- *** 'vc-dir-ignore' now takes a prefix argument to ignore all marked files. +--- *** New user option 'vc-git-grep-template'. This new user option allows customizing the default arguments passed to 'git-grep' when 'vc-git-grep' is used. +--- *** Command 'vc-git-stash' now respects marks in the "*vc-dir*" buffer. When some files are marked, only those are stashed. When no files are marked, all modified files are stashed, as before. +--- *** 'vc-dir' now shows a button allowing you to hide the stash list. Controlled by user option 'vc-git-show-stash'. Default t means show the entire list as before. An integer value limits the list length (but still allows you to show the entire list via the button). +--- *** 'vc-git-stash' is now bound to 'C' in the stash headers. -- @@ -941,35 +1122,44 @@ the entire list as before. An integer value limits the list length 'vc-git-stash' and 'vc-git-stash-snapshot' can now be run using 'C' and 'S' respectively, including when there are no stashes. +--- *** The new hook 'vc-retrieve-tag-hook' runs after retrieving a tag. +--- *** 'vc-hg' now invokes 'smerge-mode' when visiting files. Code that attempted to invoke 'smerge-mode' when visiting an Hg file with conflicts existed in earlier versions of Emacs, but incorrectly never detected a conflict due to invalid assumptions about cached values. ++++ *** The Hg (Mercurial) back-end now supports 'vc-region-history'. The 'C-x v h' command now works in buffers that visit files controlled by Hg. ++++ *** The Hg (Mercurial) back-end now prompts for revision to merge when you invoke 'C-x v m' ('vc-merge'). +--- *** The Hg (Mercurial) back-end now uses tags, branches and bookmarks instead of revision numbers as completion candidates when it prompts for a revision. +--- *** New user option 'vc-hg-revert-switches'. It specifies switches to pass to Hg's 'revert' command. ++++ *** 'C-u C-x v D' ('vc-root-version-diff') prompts for two revisions and compares their entire trees. +--- *** 'C-x v M D' ('vc-diff-mergebase') and 'C-x v M L' ('vc-log-mergebase') print diffs and logs between the merge base (common ancestor) of two given revisions. ++++ *** New command 'vc-log-search' asks for a pattern, searches it in the revision log, and displays matched log entries in the log buffer. For example, 'M-x vc-log-search RET bug#36644 RET' @@ -978,6 +1168,7 @@ With a prefix argument asks for a command, so for example, 'C-u M-x vc-log-search RET git log -1 f302475 RET' will display just one log entry found by its revision number. ++++ *** It is now possible to display a specific revision given by its ID. If you invoke 'C-x v L' ('vc-print-root-log') with a numeric argument of 1, as in 'C-1 C-x v L' or 'C-u 1 C-x v L', it asks for a revision @@ -985,46 +1176,56 @@ ID, and shows its log entry together with the diffs introduced by the revision's commit. (For some less capable VCSes, only the log entry is shown.) +--- *** New user option 'vc-find-revision-no-save'. With non-nil, 'vc-find-revision' doesn't write the created buffer to file. +--- *** 'C-x v =' can now mimic Magit's diff format. Set the new user option 'diff-font-lock-prettify' to t for that, see below under "Diff mode". +--- *** The 'diff' function arguments OLD and NEW may each be a buffer rather than a file, in non-interactive calls. This change was made in Emacs 24.1, but wasn't documented until now. ++++ *** New command 'diff-buffers' interactively diffs two buffers. ** Diff mode ++++ *** Hunks are now automatically refined by font-lock. To disable refinement, set the new user option 'diff-refine' to nil. To get back the old behavior where hunks are refined as you navigate through a diff, set 'diff-refine' to the symbol 'navigate'. ++++ *** 'diff-auto-refine-mode' is deprecated in favor of 'diff-refine'. It is no longer enabled by default and binding it no longer has any effect. ++++ *** Better syntax highlighting of Diff hunks. Fragments of source in Diff hunks are now by default highlighted according to the appropriate major mode. Customize the new user option 'diff-font-lock-syntax' to nil to disable this. +--- *** File headers can be shortened, mimicking Magit's diff format. To enable it, set the new user option 'diff-font-lock-prettify' to t. On GUI frames, this option also displays the insertion and deletion indicators on the left fringe. ++++ *** Prefix arg of 'diff-goto-source' means jump to the old revision of the file under version control if point is on an old changed line, or to the new revision of the file otherwise. ** Texinfo ++++ *** New function for inserting '@pxref', '@xref', or '@ref' commands. The function 'texinfo-insert-dwim-@ref', bound to 'C-c C-c r' by default, inserts one of three types of references based on the text @@ -1033,29 +1234,35 @@ start of a sentence or at '(point-min)', else '@ref'. ** Browse-url +--- *** The function 'browse-url-emacs' can now visit a URL in selected window. It now treats the optional 2nd argument to mean that the URL should be shown in the currently selected window. +--- *** A new function, 'browse-url-add-buttons' can be used to add clickable links to most ordinary special-mode buffers that display text that have URLs embedded. 'browse-url-button-regexp' controls what's considered a button. +--- *** New user option 'browse-url-secondary-browser-function'. It can be set to a function that invokes an alternative browser. ** Comint ++++ *** 'send-invisible' is now an obsolete alias for 'comint-send-invisible'. Also, 'shell-strip-ctrl-m' is declared obsolete. ++++ *** 'C-c .' ('comint-insert-previous-argument') no longer interprets '&'. This feature caused problems when '&&' was present in the previous command. Since this command emulates 'M-.' in Bash and zsh, neither of which treats '&' specially, the feature was removed for compatibility with these shells. ++++ *** 'comint-insert-previous-argument' can now count arguments from the end. By default, invoking 'C-c .' with a numeric argument N would copy the Nth argument, counting from the first one. But if the new user option @@ -1065,9 +1272,11 @@ better emulate 'M-.' in both Bash and zsh, since the former counts from the beginning of the arguments, while the latter counts from the end. ++++ *** 'comint-run' can now accept a list of switches to pass to the program. 'C-u M-x comint-run' will prompt for the switches interactively. ++++ *** Abnormal hook 'comint-password-function' has been added. This hook permits a derived mode to supply a password for the underlying command interpreter without prompting the user. For @@ -1083,6 +1292,7 @@ if it had been supplied on the command line. ** SQL +--- *** SQL Indent Minor Mode SQL Mode now supports the ELPA 'sql-indent' package for assisting sophisticated SQL indenting rules. Note, however, that SQL is not @@ -1095,16 +1305,19 @@ prefer to rely upon existing Emacs facilities for formatting code but the 'sql-indent' package provides facilities to aid more casual SQL developers layout queries and complex expressions. +--- **** 'sql-use-indent-support' (default t) enables SQL indention support. The 'sql-indent' package from ELPA must be installed to get the indentation support in 'sql-mode' and 'sql-interactive-mode'. +--- **** 'sql-mode-hook' and 'sql-interactive-mode-hook' changed. Both hook variables have had 'sql-indent-enable' added to their default values. If you have existing customizations to these variables, you should make sure that the new default entry is included. +--- *** Connection Wallet Database passwords can now by stored in NETRC or JSON data files that may optionally be encrypted. When establishing an interactive session @@ -1123,39 +1336,48 @@ be encrypted with GPG by adding an additional ".gpg" suffix. ** Term +--- *** 'term-read-noecho' is now obsolete, use 'read-passwd' instead. ++++ *** 'serial-term' now takes an optional parameter to leave the emulator in line mode. ** Flymake ++++ *** The variable 'flymake-diagnostic-types-alist' is obsolete. You should instead set properties on known diagnostic symbols, like ':error' and ':warning', as demonstrated in the Flymake manual. ++++ *** New user option 'flymake-start-on-save-buffer'. Control whether Flymake starts checking the buffer on save. +--- *** Flymake and backend functions may exchange hints about buffer changes. This enables more efficient backends. See the docstring of 'flymake-diagnostic-functions' or the Flymake manual for details. ++++ *** 'flymake-start-syntax-check-on-newline' is now obsolete, use 'post-self-insert-hook' to check on newline. ** Ruby +--- *** The Rubocop Flymake diagnostic function will only run Lint cops if it can't find the config file. --- *** Rubocop is called with 'bundle exec' if Gemfile mentions it. +--- *** New command 'ruby-find-library-file' bound to 'C-c C-f'. ** Package +--- *** Warn if "footer line" is missing, but still install package. package.el used to refuse to install a package without the so-called "footer line", which appears at the very end of the file: @@ -1170,20 +1392,24 @@ Note that versions of Emacs older than 27.1 will not only refuse to install packages without such a line -- they will be unable to parse package data. It is therefore recommended to keep this line. ++++ *** Change of 'package-check-signature' for packages with multiple sigs. In previous Emacsen, t checked that all signatures are valid. Now t only checks that at least one signature is valid and the new 'all' value needs to be used if you want to enforce that all signatures are valid. This only affects packages with multiple signatures. ++++ *** The meaning of 'allow-unsigned' in 'package-check-signature' has changed slightly: If a usable OpenPGP configuration can't be found (for instance, if gpg isn't installed), it now has the same meaning as nil. +--- *** New function 'package-get-version' lets packages query their own version. Example use in auctex.el: '(defconst auctex-version (package-get-version))' +--- *** New 'package-quickstart' feature. When 'package-quickstart' is non-nil, package.el precomputes a big autoloads file so that activation of packages can be done much faster, @@ -1193,8 +1419,10 @@ It also causes user options like 'package-user-dir' and is run rather than at startup so you don't need to set them in your early init file. +--- *** New function 'package-activate-all'. ++++ *** New functions for filtering packages list. A new function has been added which allows users to filter the packages list by name: 'package-menu-filter-by-name'. By default, it @@ -1204,10 +1432,13 @@ is bound to '/ n'. Additionally, the function (from 'f'). To clear any of the two filters, the user can now call the 'package-menu-clear-filter' function, bound to '/ /' by default. +--- *** Imenu support has been added to 'package-menu-mode'. +--- *** The package list can now be sorted by version or description. ++++ *** In Package Menu, 'g' now updates package data from archives. Previously, 'g' invoked 'tabulated-list-revert' which did not update the cached archive data. It is now bound to 'revert-buffer', which @@ -1217,16 +1448,19 @@ will update the data. ** Info ++++ *** Clicking on the left/right arrow icon in the Info tool-bar while holding down the Ctrl key pops up a menu of previously visited Info nodes where you can select a node to go back (like in browsers). +--- *** Info can now follow 'file://' protocol URLs. The 'file://' URLs in Info documents can now be followed by passing them to the 'browse-url' function, like the other protocols: 'ftp', 'http', and 'https'. This allows having references to local HTML files, for example. +--- ** Display of man pages now limits the width for formatting pages. The new user option 'Man-width-max' (80 by default) limits the number of columns passed to the 'man' program for formatting man pages. This @@ -1235,32 +1469,40 @@ windows (which are customary with today's large displays). ** Xref ++++ *** New command 'xref-find-definitions-at-mouse'. This command finds definitions of the identifier at the place of a mouse click event, and is intended to be bound to a mouse event. ++++ *** Changing 'xref-marker-ring-length' works after xref.el is loaded. Previously, setting 'xref-marker-ring-length' would only take effect if set before xref.el was loaded. +--- *** 'xref-find-definitions' now sets the mark at the buffer position where it was invoked. +--- *** New xref faces 'xref-file-header', 'xref-line-number', 'xref-match'. +--- *** New user option 'xref-show-definitions-function'. It encapsulates the logic pertinent to showing the result of 'xref-find-definitions'. The user can change it to customize its behavior and the display of results. +--- *** Search results show the buffer even for one hit. The search-type Xref commands (e.g. 'xref-find-references' or 'project-find-regexp') now show the results buffer even when there is only one hit. This can be altered by changing 'xref-show-xrefs-function'. ++++ *** Xref buffers support refreshing the search results. A new command 'xref-revert-buffer' is bound to 'g'. +--- *** Imenu support has been added to 'xref--xref-buffer-mode'. *** New generic method 'xref-backend-identifier-completion-ignore-case'. @@ -1269,6 +1511,7 @@ identifier completion. ** Checkdoc +--- *** Checkdoc can now optionally spell-check doc strings. Invoking 'checkdoc-buffer' with a non-nil TAKE-NOTES argument (interactively, with a prefix arg) will now spell-check the doc @@ -1276,6 +1519,7 @@ strings and report all the spelling mistakes. ** Icomplete ++++ *** New minor mode Fido mode. This mode is based on Icomplete, and its name stands for "Fake Ido". The point of this mode is to be an 'ido-mode' workalike, providing @@ -1285,24 +1529,29 @@ completion facilities. ** Ecomplete +--- *** The Ecomplete sorting has changed to a decay-based algorithm. This can be controlled by the new 'ecomplete-sort-predicate' user option. +--- *** The 'ecomplete-database-file' file is now placed in "~/.emacs.d/ecompleterc" by default. Of course it will still find it if you have it in "~/.ecompleterc". ** Gnus +--- *** 'mm-uu-diff-groups-regexp' now defaults to matching all groups, which means that "git am" diffs are recognized everywhere. ++++ *** Two new Gnus summary mode navigation commands have been added, bound to the '[' and ']' keys: 'gnus-summary-prev-unseen-article' and 'gnus-summary-next-unseen-article'. These take you (respectively) to the previous unseen or next unseen article. (These are the ones that are marked with "." in the summary mode lines.) ++++ *** The Gnus user variable 'nnimap-expunge' supports three new values: 'never' for never expunging messages, 'immediately' for immediately expunging deleted messages, and 'on-exit' to expunge deleted articles @@ -1312,53 +1561,67 @@ result in Gnus expunging all messages that have been flagged as deleted by any IMAP client (rather than just those that have been deleted by Gnus). ++++ *** New user option 'gnus-use-atomic-windows' makes Gnus window layouts atomic. See the "(elisp) Atomic Windows" node of the Elisp manual for details. ++++ *** There's a new value for 'gnus-article-date-headers', 'combined-local-lapsed', which will show both the time (in the local timezone) and the lapsed time. +--- *** Gnus now maps imaps to 993 only on old MS-Windows versions. The nnimap backend used to do this unconditionally to work around problems on old versions of MS-Windows. This is now done only for Windows XP and older. ++++ *** The nnimap backend now has support for IMAP namespaces. This feature can be enabled by setting the new 'nnimap-use-namespaces' server variable to non-nil. ++++ *** A prefix argument to 'gnus-summary-limit-to-score' will limit in reverse. Limit to articles with score "at or below" the SCORE argument rather than "at or above". +--- *** The function 'gnus-score-find-favorite-words' has been renamed from 'gnus-score-find-favourite-words'. +--- *** Gmane has been removed as an nnir backend, since Gmane no longer has a search engine. ++++ *** Splitting mail on common mailing list headers has been added. See the concept index in the Gnus manual for the 'match-list' entry. ++++ *** nil is no longer an allowed value for 'mm-text-html-renderer'. ++++ *** The default value of 'mm-inline-large-images' has changed from nil to 'resize', which means that large images will be resized instead of displayed with an external program by default. ++++ *** A new Gnus summary mode command, 'S A' ('gnus-summary-attach-article') can be used to attach the current article(s) to a pre-existing Message buffer, or create a new Message buffer with the article(s) attached. ++++ *** A new Gnus summary mode command, 'w' ('gnus-summary-browse-url') scans the article buffer for URLs, and offers them to the user to open with 'browse-url'. +--- *** New user option 'nnir-notmuch-filter-group-names-function'. This option controls whether and how to use Gnus search groups as 'path:' search terms to 'notmuch'. +--- *** The buttons in the Gnus article buffer were formerly widgets (i.e., buttons from widget.el). This has now changed, and they are now buttons (from button.el), and commands like 'TAB' now search for @@ -1368,18 +1631,22 @@ fail. ** erc +--- *** New hook 'erc-insert-done-hook'. This hook is called after strings have been inserted into the buffer, and is free to alter point and window configurations, as it's not called from inside a 'save-excursion', as opposed to 'erc-insert-post-hook'. +--- *** 'erc-button-google-url' has been renamed to 'erc-button-search-url' and its value has been changed to Duck Duck Go. +--- *** 'erc-send-pre-hook' and 'erc-send-this' have been obsoleted. The user option to use instead to alter text to be sent is now 'erc-pre-send-functions'. +--- *** Improve matching/highlighting of nicknames. Open and close parenthesis and apostrophe are not considered valid nick characters anymore, matching the given grammar in RFC 2812 @@ -1387,35 +1654,43 @@ section 2.3.1. This enables correct matching and highlighting of nicks when they are surrounded by parentheses, like "(nick)", and when adjacent to an apostrophe, like "nick's". +--- *** Set 'erc-button-url-regexp' to 'browse-url-button-regexp' which better handles surrounding pair of parentheses. +--- *** New function 'erc-switch-to-buffer-other-window' which is like 'erc-switch-to-buffer', but opens the buffer in another window. +--- *** New function 'erc-track-switch-buffer-other-window' which is like 'erc-track-switch-buffer', but opens the buffer in another window. ** EUDC +--- *** XEmacs support has been removed. ** eww/shr ++++ *** The new user option 'shr-cookie-policy' can be used to control when to use cookies when fetching embedded images. The default is to use them when the images are from the same domain as the main HTML document. ++++ *** The 'eww' command can now create a new EWW buffer. Invoking the command with a prefix argument will cause it to create a new EWW buffer for the URL instead of reusing the default one. ++++ *** Clicking with the Ctrl key or 'C-u RET' on a link opens a new tab when tab-bar-mode is enabled. ++++ *** The 'd' ('eww-download') command now falls back to current page's URL. If this command is invoked with no URL at point, it now downloads the current page instead of signaling an error. @@ -1425,24 +1700,30 @@ current page instead of signaling an error. 'shr-selected-link' face to give the user feedback that the command has been executed. ++++ *** New user option 'shr-discard-aria-hidden'. If set, shr will not render tags with attribute 'aria-hidden="true"'. This attribute is meant to tell screen readers to ignore a tag. ++++ *** 'shr-external-browser' has been made into an obsolete alias of 'browse-url-secondary-browser-function'. +--- *** 'shr-tag-ol' now respects the ordered list 'start' attribute. +--- *** The following tags are now handled: '', '', and ''. ** Htmlfontify ++++ *** The functions 'hfy-color', 'hfy-color-vals' and 'hfy-fallback-color-values' and the variables 'hfy-fallback-color-map' and 'hfy-rgb-txt-color-map' have been renamed from names that used 'colour' instead of 'color'. ++++ ** Enriched mode supports the 'charset' text property. You can add or modify the 'charset' text properties of text using the 'Edit->Text Properties->Special Properties' menu, or by invoking the @@ -1452,57 +1733,70 @@ restored when the file is visited. ** Smtpmail +--- *** Authentication mechanisms can be added via external packages, by defining new 'cl-defmethod' of 'smtpmail-try-auth-method'. ++++ *** To always force smtpmail to send credentials over on the first attempt when communicating with the SMTP server(s), the 'smtpmail-servers-requiring-authorization' user option can be used. ++++ *** smtpmail will now try resending mail when getting a transient "4xx" error message from the SMTP server. The new 'smtpmail-retries' user option says how many times to retry. ** Footnote mode +--- *** Support Hebrew-style footnotes. +--- *** Footnote text lines are now aligned. Can be controlled via the new user option 'footnote-align-to-fn-text'. ** CSS mode +--- *** A new command 'css-cycle-color-format' for cycling between color formats (e.g. "black" => "#000000" => "rgb(0, 0, 0)") has been added, bound to 'C-c C-f'. +--- *** CSS mode, SCSS mode, and Less CSS mode now have support for Imenu. ** SGML mode +--- *** 'sgml-quote' now handles double quotes and apostrophes when escaping text and in addition all numeric entities when unescaping text. ** Python mode +--- *** Python mode supports three different font lock decoration levels. The maximum level is used by default; customize 'font-lock-maximum-decoration' to tone down the decoration. +--- *** New user option 'python-pdbtrack-kill-buffers'. If non-nil, the default, buffers opened during pdbtracking session are killed when pdbtracking session is finished. +--- *** New function 'python-shell-send-statement. It sends the statement delimited by 'python-nav-beginning-of-statement' and 'python-nav-end-of-statement' to the inferior Python process. ** Help +--- *** Descriptions of variables and functions give an estimated first release where the variable or function appeared in Emacs. +--- *** Output format of 'C-h l' ('view-lossage') has changed. For convenience, 'view-lossage' now displays the last keystrokes and commands in the same format as the edit buffer of @@ -1510,19 +1804,23 @@ and commands in the same format as the edit buffer of the buffer generated by 'view-lossage' to the "*Edit Macro*" buffer created by 'edit-last-kbd-macro', and to save the macro by 'C-c C-c'. +--- *** The list of help commands produced by 'C-h C-h' ('help-for-help') can now be searched via 'C-s'. ** Ibuffer +--- *** New filter 'ibuffer-filter-by-process'; bound to '/ E'. +--- *** All mode filters can now accept a list of symbols. This means you can now easily filter several major modes, as well as a single mode. ** Search and Replace ++++ *** Isearch supports a prefix argument for 'C-s' ('isearch-repeat-forward') and 'C-r' ('isearch-repeat-backward'). With a prefix argument, these commands repeat the search for the specified occurrence of the search string. @@ -1532,6 +1830,7 @@ This makes possible also to use a prefix argument for 'M-s .' Also a prefix argument is supported for 'isearch-yank-until-char', 'isearch-yank-word-or-char', 'isearch-yank-symbol-or-char'. ++++ *** To go to the first/last occurrence of the current search string is possible now with new commands 'isearch-beginning-of-buffer' and 'isearch-end-of-buffer' bound to 'M-s M-<' and 'M-s M->' in Isearch. @@ -1540,12 +1839,14 @@ counting from the beginning/end of the buffer. This complements 'C-s'/'C-r' that searches for the next Nth relative occurrence with a numeric argument. ++++ *** 'isearch-lazy-count' shows the current match number and total number of matches in the Isearch prompt. User options 'lazy-count-prefix-format' and 'lazy-count-suffix-format' define the format of the current and the total number of matches in the prompt's prefix and suffix, respectively. +--- *** 'lazy-highlight-buffer' highlights matches in the full buffer. It is useful in combination with 'lazy-highlight-cleanup' customized to nil to leave matches highlighted in the whole buffer after exiting isearch. @@ -1554,6 +1855,7 @@ navigation through the matches without flickering is more smooth. 'lazy-highlight-buffer-max-at-a-time' controls the number of matches to highlight in one iteration while processing the full buffer. ++++ *** New isearch bindings. 'C-M-z' invokes new function 'isearch-yank-until-char', which yanks everything from point up to but not including the specified @@ -1569,21 +1871,27 @@ string to highlight lines matching the search string. This is similar to the existing binding 'M-s h r' ('highlight-regexp') that highlights JUST the search string. ++++ *** New user option 'isearch-yank-on-move' provides options t and 'shift' to extend the search string by yanking text that ends at the new position after moving point in the current buffer. 'shift' extends the search string by motion commands while holding down the shift key. ++++ *** 'isearch-allow-scroll' provides a new option 'unlimited' to allow scrolling any distance off screen. +--- *** Isearch now remembers the regexp-based search mode for words/symbols and case-sensitivity together with search strings in the search ring. +--- *** Isearch now has its own tool-bar and menu-bar menu. ++++ *** 'flush-lines' prints and returns the number of deleted matching lines. +--- *** 'char-fold-to-regexp' now matches more variants of a base character. The table used to check for equivalence of characters is now built using the complete chain of unicode decompositions of a character, @@ -1591,6 +1899,7 @@ rather than stopping after one level, such that searching for e.g. "GREEK SMALL LETTER IOTA" will now also find "GREEK SMALL LETTER IOTA WITH OXIA". ++++ *** New char-folding options: 'char-fold-include' lets you add ad hoc foldings, 'char-fold-exclude' to remove foldings from default decomposition, and 'char-fold-symmetric' to search for any of an equivalence class of @@ -1601,6 +1910,7 @@ to find "e". ** Debugger ++++ *** The Lisp Debugger is now based on 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1608,37 +1918,45 @@ the Elisp manual for documentation of the new mode and its commands. ** Edebug ++++ *** 'edebug-eval-last-sexp' and 'edebug-eval-print-last-sexp' interactively now take a zero prefix analogously to the non-Edebug counterparts. ++++ *** New faces 'edebug-enabled-breakpoint' and 'edebug-disabled-breakpoint'. When setting breakpoints in Edebug, an overlay with these faces are placed over the point in question, depending on whether they are enabled or not. ++++ *** New command 'edebug-toggle-disable-breakpoint'. This command allows you to disable a breakpoint temporarily. This is mainly useful with breakpoints that are conditional and would take some time to recreate. ++++ *** New command 'edebug-unset-breakpoints'. To clear all breakpoints in the current form, the 'U' command in 'edebug-mode', or 'M-x edebug-unset-breakpoints' can be used. +--- *** Re-instrumenting a function with Edebug will now try to preserve previously-set breakpoints. However, if the code has changed substantially, this may not be possible. ++++ *** New command 'edebug-remove-instrumentation'. This command removes Edebug instrumentation from all functions that have been instrumented. ++++ *** The runtime behavior of Edebug's instrumentation can be changed using the new variables 'edebug-behavior-alist', 'edebug-after-instrumentation-function' and 'edebug-new-definition-function'. Edebug's behavior can be changed globally or for individual definitions. ++++ *** Edebug's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification, links and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1655,12 +1973,14 @@ been instrumented by Edebug. ** Enhanced xterm support +--- *** New user option 'xterm-set-window-title' controls whether Emacs sets the XTerm window title. This feature is experimental and is disabled by default. ** Grep ++++ *** 'rgrep', 'lgrep' and 'zrgrep' now hide part of the command line that contains a list of ignored directories and files. Clicking on the button with ellipsis unhides it. @@ -1668,13 +1988,16 @@ The abbreviation can be disabled by the new user option 'grep-find-abbreviate'. The new command 'grep-find-toggle-abbreviation' toggles it interactively. +--- *** 'grep-find-use-xargs' is now customizable with sorting options. ** ERT ++++ *** New variable 'ert-quiet' allows making ERT output in batch mode less verbose by removing non-essential information. ++++ *** ERT's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1682,61 +2005,73 @@ the Elisp manual for documentation of the new mode and its commands. ** Gamegrid +--- *** Gamegrid now determines its default glyph size based on display dimensions, instead of always using 16 pixels. As a result, Tetris, Snake and Pong are better playable on HiDPI displays. +--- *** 'gamegrid-add-score' can now sort scores from lower to higher. This is useful for games where lower scores are better, like time-based games. ** Filecache +--- *** Completing file names in the minibuffer via 'C-TAB' now uses the styles as configured by the user option 'completion-styles'. ++++ ** New macros 'thunk-let' and 'thunk-let*'. These macros are analogue to 'let' and 'let*', but create bindings that are evaluated lazily. ** next-error ++++ *** New user option 'next-error-find-buffer-function'. The value should be a function that determines how to find the next buffer to be used by 'next-error' and 'previous-error'. The default is to use the last buffer that navigated to the current error. ++++ *** New command 'next-error-select-buffer'. It can be used to set any buffer as the next one to be used by 'next-error' and 'previous-error'. ** nxml-mode +--- *** The default value of 'nxml-sexp-element-flag' is now t. This means that pressing 'C-M-SPACE' now selects the entire tree by default, and not just the opening element. ** Eshell +--- *** TAB completion uses the standard 'completion-at-point' rather than 'pcomplete'. Its UI is slightly different but can be customized to behave similarly, e.g. Pcomplete's default cycling can be obtained with '(setq completion-cycle-threshold 5)'. ++++ *** Expansion of history event designators is disabled by default. To restore the old behavior, use (add-hook 'eshell-expand-input-functions #'eshell-expand-history-references) +--- *** The function 'eshell-uniquify-list' has been renamed from 'eshell-uniqify-list'. +--- *** The function 'eshell/kill' is now able to handle signal switches. Previously 'eshell/kill' would fail if provided a kill signal to send to the process. It now accepts signals specified either by name or by its number. +--- *** Emacs now follows symlinks in history-related files. The files specified by 'eshell-history-file-name' and 'eshell-last-dir-ring-file-name' can include symlinks; these are now @@ -1744,13 +2079,16 @@ followed when Emacs writes the relevant history variables to the disk. ** Shell +--- *** Program name completion inside remote shells works now as expected. ++++ *** The user option 'shell-file-name' can be set now as connection-local variable for remote shells. It still defaults to "/bin/sh". ** Single shell commands ++++ *** New values of 'shell-command-dont-erase-buffer'. This user option can now have the value 'erase' to force to erase the output buffer before execution of the command, even if the output goes @@ -1758,34 +2096,42 @@ to the current buffer. Additional values 'beg-last-out', 'end-last-out', and 'save-point' control where to put point in the output buffer after inserting the 'shell-command' output. +--- *** The new functions 'shell-command-save-pos-or-erase' and 'shell-command-set-point-after-cmd' control how point is handled between two consecutive shell commands in the same output buffer. ++++ *** 'async-shell-command-width' defines the number of display columns available for output of asynchronous shell commands. ++++ *** Prompt for shell commands can now show the current directory. Customize the new user option 'shell-command-prompt-show-cwd' to enable it. ** Pcomplete +--- *** The 'pcomplete' command is now obsolete. The Pcomplete functionality can be obtained via 'completion-at-point' instead, by adding 'pcomplete-completions-at-point' to 'completion-at-point-functions'. +--- *** The function 'pcomplete-uniquify-list' has been renamed from 'pcomplete-uniqify-list'. +--- *** 'pcomplete/make' now completes on targets in included files, recursively. To recover the previous behavior, set new user option 'pcmpl-gnu-makefile-includes' to nil. ** Auth-source +--- *** The Secret Service backend supports the ':create' key now. +--- *** ".authinfo" and ".netrc" files now use a new mode: 'authinfo-mode'. This is just like 'fundamental-mode', except that it hides passwords under a "****" display property. When the cursor moves to this text, @@ -1794,89 +2140,110 @@ the real password is revealed (via 'reveal-mode'). The new ** Tramp ++++ *** New connection method "nextcloud", which allows accessing OwnCloud or NextCloud hosted files and directories. ++++ *** New connection method "rclone", which allows accessing system storages via the 'rclone' program. This feature is experimental. ++++ *** New connection method "sudoedit", which allows editing local files with different user credentials. Contrary to the "sudo" method, no session is run permanently in the background. This is for security reasons. ++++ *** Connection methods "obex" and "synce" have been removed, because they are obsoleted in GVFS. ++++ *** Validated passwords are saved by auth-source backends which support this. ++++ *** During user and host name completion in the minibuffer, results from auth-source search are taken into account. This can be disabled by setting the user option 'tramp-completion-use-auth-sources' to nil. ++++ *** The user option 'tramp-ignored-file-name-regexp' allows disabling Tramp for some look-alike remote file names. ++++ *** For some connection methods, like "su" or "sudo", the host name in multi-hop file names must match the previous hop. Default host names are adjusted to the host name from the previous hop. ++++ *** A timeout has been added for the connection methods "sudo" and "doas". The underlying session is disabled when the timeout expires. This is for security reasons. ++++ *** For some connection methods, like "sshx" or "plink", it is possible to configure the remote login shell. This avoids problems with remote hosts, where "/bin/sh" is a link to a shell which cooperates badly with Tramp. ++++ *** New commands 'tramp-rename-files' and 'tramp-rename-these-files'. They allow saving remote files somewhere else when the corresponding host is not reachable anymore. ** Rcirc +--- *** New user option 'rcirc-url-max-length'. Setting this option to an integer causes URLs displayed in Rcirc buffers to be truncated to that many characters. +--- *** The default '/quit' and '/part' reasons are now configurable. Two new user options are provided for this: 'rcirc-default-part-reason' and 'rcirc-default-quit-reason'. ** Register +--- *** The return value of method 'register-val-describe' includes the names of buffers shown by the windows of a window configuration. ** Message +--- *** Completion of email addresses can use the standard completion UI. This is controlled by 'message-expand-name-standard-ui'. With the standard UI the different sources (ecomplete, bbdb, and eudc) are matched together and try to obey 'completion-styles'. It should work for other completion front ends like Company. +--- *** 'message-mode' now supports highlighting citations of different depths. This can be customized via the new user option 'message-cite-level-function' and the new 'message-cited-text-*' faces. ++++ *** Messages can now be systematically encrypted when the PGP keyring contains a public key for every recipient. To achieve this, add 'message-sign-encrypt-if-all-keys-available' to 'message-send-hook'. +--- *** When replying a message that have addresses on the form '"foo@bar.com" ', Message will elide the repeated "name" from the address field in the response. +--- *** The default of 'message-forward-as-mime' has changed from t to nil as it has been reported that many recipients can't read forwards that are formatted as MIME digests. ++++ *** 'message-forward-included-headers' has changed its default to exclude most headers when forwarding. +--- *** 'mml-secure-openpgp-sign-with-sender' sets also "gpg --sender". When 'mml-secure-openpgp-sign-with-sender' is non-nil, message sender's email address (in addition to its old behavior) will also be used to @@ -1892,48 +2259,61 @@ The option is useful for two reasons when verifying the signature: 2.2.17 to fully benefit from this feature. See gpg(1) man page for "--auto-key-retrieve". ++++ *** The 'mail-from-style' variable is now obsolete. According to RFC 5322, only the 'angles' value is valid. +--- ** EasyPG +--- *** 'epa-pinentry-mode' is renamed to 'epg-pinentry-mode'. It now applies to epg functions as well as epa functions. +--- *** The alias functions 'epa--encode-coding-string', 'epa--decode-coding-string', and 'epa--select-safe-coding-system' have been removed. Use 'encode-coding-string', 'decode-coding-string', and 'select-safe-coding-system' instead. +--- *** 'epg-context' structure supports now 'sender' slot. The value of the new 'sender' slot (if a string) is used to set gpg's "--sender" option. This feature is used by 'mml-secure-openpgp-sign-with-sender'. See gpg(1) manual page about "--sender" for more information. +--- ** Rmail ++++ *** New user option 'rmail-output-reset-deleted-flag'. If this option is non-nil, messages appended to an output file by the 'rmail-output' command have their Deleted flag reset. +--- *** The command 'rmail-summary-by-senders' with an empty argument selects the messages to summarize with a regexp that matches the sender of the current message. ** Threads ++++ *** New variable 'main-thread' holds Emacs's main thread. This is handy in Lisp programs that run on a non-main thread and want to signal the main thread, e.g., when they encounter an error. ++++ *** 'thread-join' now returns the result of the finished thread. ++++ *** 'thread-signal' does not propagate errors to the main thread. Instead, error messages are just printed in the main thread. +--- *** 'thread-alive-p' is now obsolete, use 'thread-live-p' instead. ++++ *** New command 'list-threads' shows Lisp threads. See the current list of live threads in a tabulated-list buffer which automatically updates. In the buffer, you can use 's q' or 's e' to @@ -1942,35 +2322,42 @@ backtrace with 'b'. ** thingatpt.el +--- *** 'thing-at-point' supports a new "thing" called 'uuid'. A symbol 'uuid' can be passed to 'thing-at-point' and it returns the UUID at point. +--- *** 'number-at-point' will now recognize hex numbers like 0xAb09 and #xAb09 and return them as numbers. +--- *** 'word-at-point' and 'sentence-at-point' accept NO-PROPERTIES. Just like 'thing-at-point' itself. ** Interactive automatic highlighting ++++ *** 'highlight-regexp' can now highlight subexpressions. The new command accepts a prefix numeric argument to choose the subexpression. ** Mouse display of minor mode menu +--- *** 'minor-mode-menu-from-indicator' now displays full minor mode name. When there is no menu for a mode, display the mode name after the indicator instead of just the indicator (which is sometimes cryptic). ** rx +--- *** rx now handles raw bytes in character alternatives correctly, when given in a string. Previously, '(any "\x80-\xff")' would match characters U+0080...U+00FF. Now the expression matches raw bytes in the 128...255 range, as expected. +--- *** The rx 'or' and 'seq' forms no longer require any arguments. '(or)' produces a regexp that never matches anything, while '(seq)' matches the empty string, each being an identity for the operation. @@ -1978,25 +2365,31 @@ This also works for their aliases: '|' for 'or'; ':', 'and' and 'sequence' for 'seq'. The symbol 'unmatchable' can be used as an alternative to '(or)'. +--- *** 'regexp' and new 'literal' accept arbitrary lisp as arguments. In this case, 'rx' will generate code which produces a regexp string at run time, instead of a constant string. +--- *** New rx extension mechanism: 'rx-define', 'rx-let', 'rx-let-eval'. These macros add new forms to the rx notation. ++++ *** 'anychar' is now an alias for 'anything'. Both match any single character; 'anychar' is more descriptive. ++++ *** New 'intersection' form for character sets. With 'or' and 'not', it can be used to compose character-matching expressions from simpler parts. ++++ *** 'not' now accepts more argument types. The argument can now also be a character, a single-character string, an 'intersection' form, or an 'or' form whose arguments each match a single character. ++++ *** Nested 'or' forms of strings guarantee a longest match. For example, '(or (or "IN" "OUT") (or "INPUT" "OUTPUT"))' now matches the whole string "INPUT" if present, not just "IN". Previously, this @@ -2004,12 +2397,15 @@ was only guaranteed inside a single 'or' form of string literals. ** Frames ++++ *** New command 'make-frame-on-monitor' makes a frame on the specified monitor. ++++ *** New value of 'minibuffer' frame parameter 'child-frame'. This allows creating and immediately parenting a minibuffer-only child frame when making a frame. +--- *** New predicates 'display-blink-cursor-p' and 'display-symbol-keys-p'. These predicates are to be preferred over 'display-graphic-p' when testing for blinking cursor capability and the capability to have @@ -2017,6 +2413,7 @@ symbols (e.g., '[return]', '[tab]', '[backspace]') as keys respectively. ** Tabulated List mode ++++ *** New user options for tabulated list sort indicators. You can now customize which sorting indicator character to display near the current column in Tabulated Lists (see user options @@ -2025,42 +2422,52 @@ near the current column in Tabulated Lists (see user options 'tabulated-list-tty-sort-indicator-asc', and 'tabulated-list-tty-sort-indicator-desc'). ++++ *** Two new commands and keystrokes have been added to the tabulated list mode: 'w' (which widens the current column) and 'c' which makes the current column contract. ++++ *** New function 'tabulated-list-clear-all-tags'. This function clears all tags from the padding area in the current buffer. Tags are typically added by calling 'tabulated-list-put-tag'. ** Text mode ++++ *** 'text-mode-variant' is now obsolete, use 'derived-mode-p' instead. ** CUA mode +--- *** New user option 'cua-rectangle-terminal-modifier-key'. This user option allows for the customization of the modifier key used in a terminal frame. ** JS mode +--- *** JSX syntax is now automatically detected and enabled. If a file imports Facebook's 'React' library, or if the file uses the extension ".jsx", then various features supporting XML-like syntax will be supported in 'js-mode' and derivative modes. ('js-jsx-mode' no longer needs to be enabled.) +--- *** New user option 'js-jsx-detect-syntax' disables automatic detection. This is turned on by default. +--- *** New user option 'js-jsx-syntax' enables JSX syntax unconditionally. This is off by default. +--- *** New variable 'js-jsx-regexps' controls JSX detection. +--- *** JSX syntax is now highlighted like SGML. +--- *** JSX code is properly indented in many more scenarios. Previously, JSX indentation usually only worked when an element was wrapped in parenthesis (e.g. in a 'return' statement or a function @@ -2070,6 +2477,7 @@ supported; and, indentation conventions align more closely with those of the React developer community (see 'js-jsx-align->-with-<'), otherwise still adhering to SGML conventions. +--- *** New user option 'js-jsx-align->-with-<' controls '>' indents. Commonly in JSX code, a '>' on its own line is indented at the same level as its opening '<'. This is the new default for JSX. This @@ -2081,6 +2489,7 @@ This is turned on by default. To get back the old default indentation behavior of aligning '>' with attributes, set 'js-jsx-align->-with-<' to nil. +--- *** Indentation uses 'js-indent-level' instead of 'sgml-basic-offset'. Since JSX is a syntax extension of JavaScript, it makes the most sense for JSX expressions to be indented the same number of spaces as other @@ -2091,17 +2500,21 @@ be indented like JS, you won't need to change your config. The old behavior can be emulated by controlling JSX indentation independently of JS, by setting 'js-jsx-indent-level'. +--- *** New user option 'js-jsx-indent-level' for different JSX indentation. If you wish to indent JSX by a different number of spaces than JS, set this user option to the desired number. +--- *** New user option 'js-jsx-attribute-offset' for JSX attribute indents. +--- *** New variable 'js-syntactic-mode-name' controls mode name display. Previously, the mode name was simply 'JavaScript'. Now, when a syntax extension like JSX is enabled, the mode name is 'JavaScript[JSX]'. Set this variable to nil to disable the new behavior. +--- *** New function 'js-use-syntactic-mode-name' for deriving modes. Packages deriving from 'js-mode' with 'define-derived-mode' should call this function to add enabled syntax extensions to their mode @@ -2109,6 +2522,7 @@ name, too. ** Autorevert ++++ *** New user option 'auto-revert-avoid-polling' for saving power. When set to a non-nil value, buffers in Auto Revert mode are no longer polled for changes periodically. This reduces the power consumption @@ -2116,6 +2530,7 @@ of an idle Emacs, but may fail on some network file systems; set 'auto-revert-notify-exclude-dir-regexp' to match files where notification is not supported. The default value is nil. ++++ *** New variable 'buffer-auto-revert-by-notification'. A major mode can declare that notification on the buffer's default directory is sufficient to know when updates are required, by setting @@ -2123,33 +2538,41 @@ the new variable 'buffer-auto-revert-by-notification' to a non-nil value. Auto Revert mode can use this information to avoid polling the buffer periodically when 'auto-revert-avoid-polling' is non-nil. +--- *** 'global-auto-revert-ignore-buffer' can now also be a predicate function that can be used for more fine-grained control of which buffers to auto-revert. ** auth-source-pass ++++ *** New user option 'auth-source-pass-filename'. Allows setting the path to the password-store, defaults to "~/.password-store". ++++ *** New user option 'auth-source-pass-port-separator'. Specifies separator between host and port, defaults to colon ":". +--- *** Minimize the number of decryptions during password lookup. This makes the package usable with physical tokens requiring touching a sensor for every decryption. +--- *** 'auth-source-pass-get' is now autoloaded. ** Bookmarks +--- *** 'bookmark-file' and 'bookmark-old-default-file' are now obsolete aliases of 'bookmark-default-file'. +--- *** New user option 'bookmark-watch-bookmark-file'. When non-nil, watch whether the bookmark file has changed on disk. +--- *** The old bookmark file format is no longer supported. This bookmark file format has not been used in Emacs since at least version 19.34, released in 1996, and will no longer be automatically @@ -2161,12 +2584,14 @@ The following functions are now declared obsolete: 'bookmark-upgrade-file-format-from-0', and 'bookmark-upgrade-version-0-alist'. +--- ** The mantemp.el library is now marked obsolete. This library generates manual C++ template instantiations. It should no longer be useful on modern compilers, which do this automatically. ** Ispell +--- *** New hook 'ispell-change-dictionary-hook'. This runs after changing the dictionary and could be used to automatically spellcheck a buffer when changing language without @@ -2174,36 +2599,43 @@ needing to advice 'ispell-change-dictionary'. ** scroll-lock +--- *** New command 'scroll-lock-next-line-always-scroll'. This command is bound to 'S-down' and scrolls the buffer up in particular when the end of the buffer is visible in the window. ** mwheel.el +--- *** 'mwheel-install' is now obsolete. Use 'mouse-wheel-mode' instead. Note that 'mouse-wheel-mode' is already enabled by default on most graphical displays. ** Gravatar ++++ *** 'gravatar-cache-ttl' is now a number of seconds. The previously used timestamp format of a list of integers is still supported, but is deprecated. The default value has not changed. ++++ *** 'gravatar-size' can now be nil. This results in the use of Gravatar's default size of 80 pixels. ++++ *** The default fallback gravatar is now configurable. This is possible using the new user options 'gravatar-default-image' and 'gravatar-force-default'. ** ada-mode +--- *** The built-in ada-mode is now deleted. The GNU ELPA package is a good replacement, even in very large source files. ** time-stamp +--- *** New '%5z' conversion for 'time-stamp-format' gives time zone offset. Specifying '%5z' in 'time-stamp-format' or 'time-stamp-pattern' expands to the time zone offset, e.g., '+0100'. The time zone used is @@ -2213,6 +2645,7 @@ Because this feature is new in Emacs 27.1, do not use it in the local variables section of any file that might be edited by an older version of Emacs. +--- *** Some conversions recommended for 'time-stamp-format' have changed. The new documented/recommended %-conversions are closer to those used by 'format-time-string' and are compatible at least as far back @@ -2236,12 +2669,15 @@ file-local variable, you may need to update the value. ** mode-local +--- *** Declare 'define-overload' and 'define-child-mode' as obsolete. +--- *** Rename several internal functions to use a 'mode-local-' prefix. ** CC Mode ++++ *** You can now flag "wrong style" comments with 'font-lock-warning-face'. To do this, use 'c-toggle-comment-style', if needed, to set the desired default comment style (block or line); then set the user option @@ -2249,10 +2685,12 @@ default comment style (block or line); then set the user option ** Mailcap +--- *** The new function 'mailcap-file-name-to-mime-type' has been added. It's a simple convenience function for looking up MIME types based on file name extensions. +--- *** The default way the list of possible external viewers for MIME types is sorted and chosen has changed. Earlier, the most specific viewer was chosen, even if there was a general override in "~/.mailcap". @@ -2264,6 +2702,7 @@ method back, set 'mailcap-prefer-mailcap-viewers' to nil. ** MH-E ++++ *** The hook 'mh-show-mode-hook' is now called before the message is inserted. Functions that want to affect the message text (for example, to change highlighting) can no longer use 'mh-show-mode-hook', because the @@ -2272,6 +2711,7 @@ called. Such functions should now be attached to 'mh-show-hook'. ** URL +--- *** The 'file:' handler no longer looks for "index.html" in directories if you ask it for a "file:///dir" URL. Since this is a low-level library, such decisions (if they are to be made at all) are @@ -2282,6 +2722,7 @@ left to higher-level functions. ** Tab Bars ++++ *** Tab Bar mode The new command 'tab-bar-mode' enables the tab bar at the top of each frame (including TTY frames), where you can use tabs to switch between @@ -2310,6 +2751,7 @@ using completion on tab names, or using 'tab-switcher'. Read the new Info node "(emacs) Tab Bars" for full description of all related features. ++++ *** Tab Line mode The new command 'global-tab-line-mode' enables the tab line above each window, which you can use to switch buffers in the window. Selecting @@ -2323,13 +2765,16 @@ line scrolls tabs. Read the new Info node "(emacs) Tab Line" for full description of all related features. ++++ ** fileloop.el lets one setup multifile operations like search&replace. ++++ ** Emacs can now visit files in archives as if they were directories. This feature uses Tramp and works only on systems which support GVFS, i.e. GNU/Linux, roughly spoken. See the node "(tramp) Archive file names" in the Tramp manual for full documentation of these facilities. ++++ ** New library for writing JSONRPC applications (https://jsonrpc.org). The 'jsonrpc' library enables writing Emacs Lisp applications that rely on this protocol. Since the protocol is designed to be @@ -2338,12 +2783,14 @@ transport strategies as well as a separate API to use them. A transport implementation for process-based communication, such as is used by the Language Server Protocol (LSP), is readily available. ++++ ** Backtrace mode improves viewing of Elisp backtraces. Backtrace mode adds pretty printing, fontification and ellipsis expansion to backtrace buffers produced by the Lisp debugger, Edebug and ERT. See the node "(elisp) Backtraces" in the Elisp manual for documentation of the new mode and its commands. ++++ ** so-long.el helps to mitigate performance problems with long lines. When 'global-so-long-mode' has been enabled, visiting a file with very long lines will (subject to configuration) cause the user's preferred @@ -2355,6 +2802,7 @@ immediately. Type 'M-x so-long-commentary' for full documentation. * Incompatible Lisp Changes in Emacs 27.1 +--- ** Incomplete destructive splicing support has been removed. Support for Common Lisp style destructive splicing (",.") was incomplete and broken for a long time. It has now been removed. @@ -2367,9 +2815,11 @@ starting with a period ("."). Consider the following example: In the past, this would have incorrectly evaluated to '(\,\. foo)', but will now instead evaluate to '42'. +--- ** The REGEXP in 'magic-mode-alist' is now matched case-sensitively. Likewise for 'magic-fallback-mode-alist'. ++++ ** 'add-hook' does not always add to the front or the end any more. The replacement of 'append' with 'depth' implies that the function is not always added to the very front (when append/depth is nil) or the @@ -2378,12 +2828,15 @@ the hook may have specified higher/lower depths. This makes it possible to control the ordering of functions more precisely, as was already possible in 'add-function' and 'advice-add'. +--- ** In 'compilation-error-regexp-alist' the old undocumented feature where 'line' could be a function of 2 arguments has been dropped. +--- ** 'define-fringe-bitmap' is always defined, even when Emacs is built without any GUI support. +--- ** Just loading a theme's file no longer activates the theme's settings. Loading a theme with 'M-x load-theme' still activates the theme, as it did before. However, loading the theme's file with 'M-x load-file', @@ -2399,8 +2852,10 @@ default applied immediately. The variable 'custom--inhibit-theme-enable' controls this behavior; its default value changed in Emacs 27.1. +--- ** The REPETITIONS argument of 'benchmark-run' can now also be a variable. +--- ** Interpretation of relative 'HOME' directory has changed. If "$HOME" is set to a relative file name, 'expand-file-name' now interprets it relative to the directory where Emacs was started, not @@ -2408,12 +2863,15 @@ relative to the 'default-directory' of the current buffer. We recommend always setting "$HOME" to an absolute file name, so that its meaning is independent of where Emacs was started. +--- ** 'file-name-absolute-p' no longer considers "~foo" to be an absolute file name if there is no user named "foo". ++++ ** The FILENAME argument to 'file-name-base' is now mandatory and no longer defaults to 'buffer-file-name'. ++++ ** File metadata primitives now signal an error if I/O, access, or other serious errors prevent them from determining the result. Formerly, these functions often (though not always) silently returned @@ -2426,29 +2884,35 @@ file does not exist. The affected primitives are 'file-modes', 'file-newer-than-file-p', 'file-selinux-context', 'file-system-info', and 'set-visited-file-modtime'. +--- ** The function 'eldoc-message' now accepts a single argument. Programs that called it with multiple arguments before should pass them through 'format' first. Even that is discouraged: for ElDoc support, you should set 'eldoc-documentation-function' instead of calling 'eldoc-message' directly. +--- ** Old-style backquotes now generate an error. They have been generating warnings for a decade. To interpret old-style backquotes as new-style, bind the new variable 'force-new-style-backquotes' to t. +--- ** Defining a Common Lisp structure using 'cl-defstruct' or 'cl-struct-define' whose name clashes with a builtin type (e.g., 'integer' or 'hash-table') now signals an error. +--- ** When formatting a floating-point number as an octal or hexadecimal integer, Emacs now signals an error if the number is too large for the implementation to format. ++++ ** 'logb' now returns infinity when given an infinite or zero argument, and returns a NaN when given a NaN. Formerly, it returned an extreme fixnum for such arguments. +--- ** Some functions and variables obsolete since Emacs 22 have been removed: 'archive-mouse-extract', 'assoc-ignore-case', 'assoc-ignore-representation', 'backward-text-line', 'blink-cursor', 'bookmark-exit-hooks', @@ -2486,24 +2950,28 @@ fixnum for such arguments. 'vc-previous-comment', 'view-todo', 'x-lost-selection-hooks', 'x-sent-selection-hooks'. +--- ** Further functions and variables obsolete since Emacs 24 have been removed: 'default-directory-alist', 'dired-default-directory', 'dired-default-directory-alist', 'dired-enable-local-variables', 'dired-hack-local-variables', 'dired-local-variables-file', 'dired-omit-here-always'. ++++ ** Garbage collection no longer treats miscellaneous objects specially; they are now allocated like any other pseudovector. As a result, the 'garbage-collect' and 'memory-use-count' functions no longer return a 'misc' component, and the 'misc-objects-consed' variable has been removed. ++++ ** Reversed character ranges are no longer permitted in 'rx'. Previously, ranges where the starting character is greater than the ending character were silently omitted. For example, '(rx (any "@z-a" (?9 . ?0)))' would match '@' only. Now, such 'rx' expressions generate an error. +--- ** Internal 'rx' functions and variables have been removed, as a consequence of an improved implementation. Packages using these should use the public 'rx' and 'rx-to-string' instead. @@ -2511,6 +2979,7 @@ these should use the public 'rx' and 'rx-to-string' instead. extension mechanism is preferred: 'rx-define', 'rx-let' and 'rx-let-eval'. ++++ ** 'text-mode' no longer sets the value of 'indent-line-function'. The global value of 'indent-line-function', which defaults to 'indent-relative', will no longer be reset locally when turning on @@ -2519,22 +2988,28 @@ The global value of 'indent-line-function', which defaults to To get back the old behavior, add a function to 'text-mode-hook' which performs '(setq-local indent-line-function #'indent-relative)'. +--- ** 'make-process' no longer accepts a non-nil ':stop' key. This has never worked reliably, and now causes an error. ++++ ** 'eventp' no longer returns non-nil for lists whose car is nil. This is consistent with the fact that nil, though a symbol, is not a valid event type. +--- ** The obsolete package xesam.el (since Emacs 24) has been removed. ++++ ** The XBM image handler now accepts a ':stride' argument, which should be specified in image specs representing the entire bitmap as a single bool vector. ++++ ** 'regexp-quote' may return its argument string. If the argument needs no quoting, it can be returned instead of a copy. ++++ ** Mouse scroll up and down with control key modifier changes font size. Previously, the control key modifier was used to scroll up or down by an amount which was close to near a full screen. This is now instead @@ -2551,19 +3026,24 @@ pointer is over. To change this behavior, you can customize the user option 'mouse-wheel-follow-mouse'. Note that this will also affect scrolling. ++++ ** Mouse scroll up and down with control key modifier also works on images where it scales the image under the mouse pointer. +--- ** 'help-follow-symbol' now signals 'user-error' if point (or the position pointed to by the argument POS) is not in a symbol. +--- ** The options.el library has been removed. It was obsolete since Emacs 22.1, replaced by customize. +--- ** The tls.el and starttls.el libraries are now marked obsolete. Use of built-in libgnutls based functionality (described in the Emacs GnuTLS manual) is recommended instead. +--- ** The url-ns.el library is now marked obsolete. This library is used to open configuration files for the long defunct web browser Netscape, and is no longer relevant. @@ -2571,6 +3051,7 @@ web browser Netscape, and is no longer relevant. * Lisp Changes in Emacs 27.1 ++++ ** Emacs Lisp integers can now be of arbitrary size. Emacs uses the GNU Multiple Precision (GMP) library to support integers whose size is too large to support natively. The integers @@ -2598,17 +3079,20 @@ like 'file-attributes' that compute file sizes and other attributes, functions like 'process-id' that compute process IDs, and functions like 'user-uid' and 'group-gid' that compute user and group IDs. ++++ ** 'overflow-error' is now documented as a subcategory of 'range-error'. Formerly it was undocumented, and was (incorrectly) a subcategory of 'domain-error'. ** Time values ++++ *** New function 'time-convert' converts Lisp time values to Lisp timestamps of various forms, including a new timestamp form '(TICKS . HZ)' where TICKS is an integer and HZ a positive integer denoting a clock frequency. ++++ *** Although the default timestamp format is still '(HI LO US PS)', it is planned to change in a future Emacs version, to exploit bignums. The documentation has been updated to mention that the timestamp @@ -2617,6 +3101,7 @@ format may change and that programs should use functions like probing the innards of a timestamp directly, or creating a timestamp by hand. ++++ *** Decoded (calendrical) timestamps now have subsecond resolution. This affects 'decode-time', which generates these timestamps, as well as functions like 'encode-time' that accept them. The subsecond info @@ -2633,9 +3118,11 @@ traditional behavior, this default may change in future Emacs versions, so callers requiring an integer should specify FORM explicitly. ++++ *** 'encode-time' supports a new API '(encode-time TIME)'. The old 'encode-time' API is still supported. ++++ *** A new package to parse ISO 8601 time, date, durations and intervals has been added. The main function to use is 'iso8601-parse', but there's also 'iso8601-parse-date', @@ -2644,25 +3131,30 @@ intervals has been added. The main function to use is structures, except the final one, which returns three of them (start, end and duration). ++++ *** 'time-add', 'time-subtract', and 'time-less-p' now accept infinities and NaNs too, and propagate them or return nil like floating-point operators do. If both arguments are finite, these functions now return exact results instead of rounding in some cases, and they also avoid excess precision when that is easy. ++++ *** New function 'time-equal-p' compares time values for equality. ++++ *** 'format-time-string' supports a new conversion specifier flag '+' that acts like the '0' flag but also puts a '+' before nonnegative years containing more than four digits. This is for compatibility with POSIX.1-2017. ++++ *** To access (or alter) the elements of a decoded time value, the 'decoded-time-second', 'decoded-time-minute', 'decoded-time-hour', 'decoded-time-day', 'decoded-time-month', 'decoded-time-year', 'decoded-time-weekday', 'decoded-time-dst' and 'decoded-time-zone' accessors can be used. ++++ *** The new functions 'date-days-in-month' (which will say how many days there are in a month in a specific year), 'date-ordinal-to-time' (that computes the date of an ordinal day), 'decoded-time-add' (for @@ -2671,6 +3163,7 @@ doing computations on a decoded time structure), 'make-decoded-time' filled out), and 'encoded-time-set-defaults' (which fills in nil elements as if it's midnight January 1st, 1970) have been added. ++++ *** In the DST slot, 'encode-time' and 'parse-time-string' now return -1 if it is not known whether daylight saving time is in effect. Formerly they were inconsistent: 'encode-time' returned t in this @@ -2678,31 +3171,38 @@ situation, whereas 'parse-time-string' returned nil. Now they consistently use nil to mean that DST is not in effect, and use -1 to mean that it is not known whether DST is in effect. ++++ ** New macro 'benchmark-progn'. This macro works like 'progn', but messages how long it takes to evaluate the body forms. The value of the last form is the return value. ++++ ** New function 'read-char-from-minibuffer'. This function works like 'read-char', but uses 'read-from-minibuffer' to read a character, so it maintains a history that can be navigated via usual minibuffer keystrokes 'M-p'/'M-n'. +--- ** New variables 'set-message-function' and 'clear-message-function' can be used to specify functions to show and clear messages that normally are displayed in the echo area. ++++ ** 'setq-local' can now set an arbitrary number of variables, which makes the syntax more like 'setq'. +--- ** 'reveal-mode' can now also be used for more than to toggle between invisible and visible: It can also toggle 'display' properties in overlays. This is only done on 'display' properties that have the 'reveal-toggle-invisible' property set. ++++ ** 'process-contact' now takes an optional NO-BLOCK argument to allow not waiting for a process to be set up. +--- ** New variable 'read-process-output-max' controls sub-process throughput. This variable determines how many bytes can be read from a sub-process in one read operation. The default, 4096 bytes, was previously a @@ -2710,94 +3210,118 @@ hard-coded constant. Setting it to a larger value might enhance throughput of reading from sub-processes that produces vast (megabytes) amounts of data in one go. ++++ ** The new user option 'quit-window-hook' is now run first when executing the 'quit-window' command. ++++ ** The user options 'help-enable-completion-auto-load', 'help-enable-auto-load' and 'vhdl-project-auto-load', as well as the function 'vhdl-auto-load-project' have been renamed to have "autoload" without the hyphen in their names. Obsolete aliases from the old names have been added. ++++ ** Buttons (created with 'make-button' and related functions) can now use the 'button-data' property. If present, the data in this property will be passed on to the 'action' function instead of the button itself in 'button-activate'. ++++ ** 'defcustom' now takes a ':local' keyword that can be either t or 'permanent', which mean that the variable should be automatically buffer-local. 'permanent' also sets the variable's 'permanent-local' property. ++++ ** The new macro 'with-suppressed-warnings' can be used to suppress specific byte-compile warnings. ++++ ** The new macro 'ignore-error' is like 'ignore-errors', but takes a specific error condition, and will only ignore that condition. (This can also be a list of conditions.) +--- ** The new function 'byte-compile-info-message' can be used to output informational messages that look pleasing during the Emacs build. +--- ** New 'help-fns-describe-variable-functions' hook. It makes it possible to add metadata information to 'describe-variable'. ** i18n (internationalization) +--- *** 'ngettext' can be used now to return the right plural form according to the given numeric value. ++++ ** 'inhibit-null-byte-detection' is renamed to 'inhibit-nul-byte-detection'. ++++ ** 'self-insert-command' takes the char to insert as (optional) argument. ++++ ** 'lookup-key' can take a list of keymaps as argument. ++++ ** 'condition-case' now accepts t to match any error symbol. ++++ ** New function 'proper-list-p'. Given a proper list as argument, this predicate returns its length; otherwise, it returns nil. 'format-proper-list-p' is now an obsolete alias for the new function. +--- ** 'define-minor-mode' automatically documents the meaning of ARG. ++++ ** The function 'recenter' now accepts an additional optional argument. By default, calling 'recenter' will not redraw the frame even if 'recenter-redisplay' is non-nil. Call 'recenter' with the new second argument non-nil to force redisplay per 'recenter-redisplay's value. ++++ ** New functions 'major-mode-suspend' and 'major-mode-restore'. Use them when switching temporarily to another major mode, e.g. for 'hexl-mode', or to switch between 'c-mode' and 'image-mode' in XPM. ++++ ** New macro 'dolist-with-progress-reporter'. This works like 'dolist', but reports progress similar to 'dotimes-with-progress-reporter'. ++++ ** New hook 'after-delete-frame-functions'. This works like 'delete-frame-functions', but runs after the frame to be deleted has been made dead and removed from the frame list. +--- ** The function 'provided-mode-derived-p' was extended to support aliases. The function now returns non-nil when the argument MODE is derived from any alias of any of MODES. ++++ ** New frame focus state inspection interface. The hooks 'focus-in-hook' and 'focus-out-hook' are now obsolete. Instead, attach to 'after-focus-change-function' using 'add-function' and inspect the focus state of each frame using 'frame-focus-state'. ++++ ** Emacs now requests and recognizes focus-change notifications from TTYs. On terminal emulators that support the feature, Emacs can now support 'focus-in-hook' and 'focus-out-hook' for TTY frames. ++++ ** Window-specific face remapping. Face specifications (of the kind used in 'face-remapping-alist') now support filters, allowing faces to vary between different windows displaying the same buffer. See the node "(elisp) Face Remapping" of the Emacs Lisp Reference manual for more detail. ++++ ** Window change functions have been redesigned. Hooks reacting to window changes run now only when redisplay detects that a change has actually occurred. Six hooks are now provided: @@ -2827,44 +3351,55 @@ Also 'run-window-configuration-change-hook' is declared obsolete. See the section "(elisp) Window Hooks" in the Elisp manual for a detailed explanation of the new behavior. ++++ ** Scroll bar and fringe settings can now be made persistent for windows. The functions 'set-window-scroll-bars' and 'set-window-fringes' now have a new optional argument that makes the settings they produce reliably survive subsequent invocations of 'set-window-buffer'. ++++ ** New user option 'resize-mini-frames'. This option allows automatically resizing minibuffer-only frames similarly to how minibuffer windows are resized on "normal" frames. ++++ ** New buffer display action function 'display-buffer-in-direction'. This function allows specifying the location of the window chosen by 'display-buffer' in various ways. ++++ ** New buffer display action alist entry 'dedicated'. Such an entry allows specifying the dedicated status of a window created by 'display-buffer'. ++++ ** New buffer display action alist entry 'window-min-height'. Such an entry allows specifying a minimum height of the window used for displaying a buffer. 'display-buffer-below-selected' is the only action function to respect it at the moment. ++++ ** New buffer display action alist entry 'direction'. This entry is used to specify the location of the window chosen by 'display-buffer-in-direction'. ++++ ** Additional meaning of display action alist entry 'window'. A 'window' entry can now also specify a reference window for 'display-buffer-in-direction'. ++++ ** The function 'assoc-delete-all' now takes an optional predicate argument. ++++ ** New function 'string-distance' to calculate the Levenshtein distance between two strings. ++++ ** 'print-quoted' now defaults to t, so if you want to see '(quote x)' instead of 'x you will have to bind it to nil where applicable. ++++ ** Numbers formatted via '%o' or '%x' are now formatted as signed integers. This avoids problems in calls like '(read (format "#x%x" -1))', and is more compatible with bignums. To get the traditional machine-dependent @@ -2873,10 +3408,12 @@ and if the new behavior breaks your code please email <32252@debbugs.gnu.org>. Because '%o' and '%x' can now format signed integers, they now support the '+' and space flags. ++++ ** In Emacs Lisp mode, symbols with confusable quotes are highlighted. For example, the first character in '‘foo' would be highlighted in 'font-lock-warning-face'. ++++ ** Omitting variables after '&optional' and '&rest' is now allowed. For example '(defun foo (&optional))' is no longer an error. This is sometimes convenient when writing macros. See the ChangeLog entry @@ -2884,6 +3421,7 @@ titled "Allow '&rest' or '&optional' without following variable (Bug#29165)" for a full listing of which arglists are accepted across versions. +--- ** Internal parsing commands now use 'syntax-ppss' and disregard 'open-paren-in-column-0-is-defun-start'. This affects mostly things like 'forward-comment', 'scan-sexps', and 'forward-sexp' when parsing backward. @@ -2894,6 +3432,7 @@ brackets at the start of a line inside documentation strings with a backslash, although there is no harm in doing so to make the code easier to edit with an older Emacs version. +--- ** New symbolic accessor functions for a parse state list. The new accessor functions 'ppss-depth', 'ppss-list-start', 'ppss-last-sexp-start', 'ppss-string-terminator', 'comment-depth', @@ -2901,30 +3440,37 @@ The new accessor functions 'ppss-depth', 'ppss-list-start', and 'two-character-syntax' can be used on the list value returned by 'parse-partial-sexp' and 'syntax-ppss'. +--- ** The 'server-name' and 'server-socket-dir' variables are set when a socket has been passed to Emacs. +--- ** The 'file-system-info' function is now available on all platforms. instead of just Microsoft platforms. This fixes a 'get-free-disk-space' bug on OS X 10.8 and later. +--- ** The function 'get-free-disk-space' returns now a non-nil value for remote systems, which support this check. ++++ ** 'memory-limit' now returns a better estimate of memory consumption. ++++ ** When interpreting 'gc-cons-percentage', Emacs now estimates the heap size more often and (we hope) more accurately. E.g., formerly '(progn (let ((gc-cons-percentage 0.8)) BODY1) BODY2)' continued to use the 0.8 value during BODY2 until the next garbage collection, but that is no longer true. Applications may need to re-tune their GC tricks. ++++ ** New macro 'combine-change-calls' arranges to call the change hooks ('before-change-functions' and 'after-change-functions') just once each around a sequence of lisp forms, given a region. This is useful when a function makes a possibly large number of repetitive changes and the change hooks are time consuming. ++++ ** 'eql', 'make-hash-table', etc. now treat NaNs consistently. Formerly, some of these functions ignored signs and significands of NaNs. Now, all these functions treat NaN signs and significands as @@ -2934,29 +3480,36 @@ Also, Emacs now reads and prints NaN significands; e.g., if X is a NaN, '(format "%s" X)' now returns "0.0e+NaN", "1.0e+NaN", etc., depending on X's significand. ++++ ** The function 'make-string' accepts an additional optional argument. If the optional third argument is non-nil, 'make-string' will produce a multibyte string even if its second argument is an ASCII character. +--- ** '(format "%d" X)' no longer mishandles a floating-point number X that does not fit in a machine integer. +--- ** New coding-system 'ibm038'. This is the International EBCDIC encoding, also available as aliases 'ebcdic-int' and 'cp038'. +--- ** New JSON parsing and serialization functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer'. These are implemented in C using the Jansson library. ++++ ** New function 'ring-resize'. 'ring-resize' can be used to grow or shrink a ring. ++++ ** New function 'flatten-tree'. 'flatten-list' is provided as an alias. These functions take a tree and 'flatten' it such that the result is a list of all the terminal nodes. ++++ ** 'zlib-decompress-region' can partially decompress corrupted data. If the new optional ALLOW-PARTIAL argument is passed, then the data that was decompressed successfully before failing will be inserted @@ -2964,19 +3517,23 @@ into the buffer. ** Image mode +--- *** New library Exif. An Exif library has been added that can parse JPEG files and output data about creation times and orientation and the like. 'exif-parse-file' and 'exif-parse-buffer' are the main interface functions. +--- *** 'image-mode' now uses this library to automatically rotate images according to the orientation in the Exif data, if any. ++++ *** The command 'image-rotate' now accepts a prefix argument. With a prefix argument, 'image-rotate' now rotates the image at point 90 degrees counter-clockwise, instead of the default clockwise. ++++ *** In 'image-mode' the image is resized automatically to fit in window. By default, the image will resize upon first display and whenever the window's dimensions change. Two user options 'image-auto-resize' and @@ -2985,17 +3542,20 @@ window's dimensions change. Two user options 'image-auto-resize' and key 's' contains the commands that can be used to fit the image to the window manually. +--- *** Some 'image-mode' variables are now buffer-local. The image parameters 'image-transform-rotation', 'image-transform-scale' and 'image-transform-resize' are now declared buffer-local, so each buffer could have its own values for these parameters. ++++ *** Three new 'image-mode' commands have been added: 'm', which marks the file in the dired buffer(s) for the directory the file is in; 'u', which unmarks the file; and 'w', which pushes the current buffer's file name to the kill ring. +--- *** New library image-converter. If you need to view exotic image formats for which Emacs doesn't have native support, customize the new user option @@ -3003,10 +3563,12 @@ native support, customize the new user option GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be used to convert images automatically before displaying them. +--- *** 'auto-mode-alist' now includes many of the types typically supported by the external image converters, like WEPB, BMP and ICO. These now default to using 'image-mode'. +--- *** 'imagemagick-types-inhibit' disables using ImageMagick by default. 'image-mode' started using ImageMagick by default for all images some years back. It now respects 'imagemagick-types-inhibit' as a way @@ -3014,53 +3576,66 @@ to disable that. ** Modules +--- *** The function 'load' now behaves correctly when loading modules. Specifically, it puts the module name into 'load-history', prints loading messages if requested, and protects against recursive loads. ++++ *** New module environment function 'process_input' to process user input while module code is running. ++++ *** New module environment functions 'make_time' and 'extract_time' to convert between timespec structures and Emacs Lisp time values. ++++ *** New module environment functions 'make_big_integer' and 'extract_big_integer' to create and extract arbitrary-size integer values. ++++ *** emacs-module.h now defines a macro 'EMACS_MAJOR_VERSION' that expands to the major version of the latest Emacs supported by the header. ++++ ** The function 'read-variable' now uses its own history list. The history of variable names read by 'read-variable' is recorded in the new variable 'custom-variable-history'. +--- ** The functions 'string-to-unibyte' and 'string-to-multibyte' are no longer declared obsolete. We have found that there are legitimate use cases for these functions, where there's no better alternative. We believe that the incorrect uses of these functions all but disappeared by now, so we are un-obsoleting them. ++++ ** New function 'group-name' returns a group name corresponding to GID. ++++ ** 'make-process' now takes a keyword argument ':file-handler'; if that is non-nil, it will look for a file name handler for the current buffer's 'default-directory' and invoke that file name handler to make the process. That way 'make-process' can start remote processes. ++++ ** '(locale-info 'paper)' now returns the paper size on systems that support it. This is currently supported on GNUish hosts and on modern versions of MS-Windows. ++++ ** The function 'regexp-opt', when given an empty list of strings, now returns a regexp that never matches anything, which is an identity for this operation. Previously, the empty string was returned in this case. ++++ ** New constant 'regexp-unmatchable' contains a never-matching regexp. It is a convenient and readable way to specify a regexp that should not match anything, and is as fast as any such regexp can be. ++++ ** New functions to handle the URL variant of base-64 encoding. New functions 'base64url-encode-string' and 'base64url-encode-region' implement the url-variant of base-64 encoding as defined in RFC4648. @@ -3069,6 +3644,7 @@ The functions 'base64-decode-string' and 'base64-decode-region' now accept an optional argument to decode the URL variant of base-64 encoding. ++++ ** The function 'file-size-human-readable' accepts more optional arguments. The new third argument is a string put between the number and unit; it defaults to the empty string. The new fourth argument is a string @@ -3077,68 +3653,82 @@ argument is 'iec' and the empty string otherwise. We recommend a space or non-breaking space as third argument, and "B" as fourth argument, circumstances allowing. ++++ ** 'format-spec' has been expanded with several modifiers to allow greater flexibility when customizing variables. The modifiers include zero-padding, upper- and lower-casing, and limiting the length of the interpolated strings. The function has now also been documented in the Emacs Lisp manual. ++++ ** 'directory-files-recursively' can now take an optional PREDICATE parameter to control descending into subdirectories, and a FOLLOW-SYMLINK parameter to say that symbolic links that point to other directories should be followed. ++++ ** New function 'xor' returns the boolean exclusive-or of its args. The function was previously defined in array.el, but has been moved to subr.el so that it is available by default. It now always returns the non-nil argument when the other is nil. Several duplicates of 'xor' in other packages are now obsolete aliases of 'xor'. ++++ ** 'define-globalized-minor-mode' now takes BODY forms. ++++ ** New text property 'help-echo-inhibit-substitution'. Setting this on the first character of a help string disables conversions via 'substitute-command-keys'. ++++ ** New text property 'minibuffer-message'. Setting this on a character of the minibuffer text will display the temporary echo messages before that character, when messages need to be displayed while minibuffer is active. ++++ ** 'undo' can be made to ignore the active region for a command by setting 'undo-inhibit-region' symbol property of that command to non-nil. This is used by 'mouse-drag-region' to make the effect easier to undo immediately afterwards. +--- ** When called interactively, 'next-buffer' and 'previous-buffer' now signal 'user-error' if there is no buffer to switch to. * Changes in Emacs 27.1 on Non-Free Operating Systems +--- ** Battery status is now supported in all Cygwin builds. Previously it was supported only in the Cygwin-w32 build. +--- ** Emacs now handles key combinations involving the macOS "command" and "option" modifier keys more correctly. ++++ ** MacOS modifier key behavior is now more adjustable. The behavior of the macOS "Option", "Command", "Control" and "Function" keys can now be specified separately for use with ordinary keys, function keys and mouse clicks. This allows using them in their standard macOS way for composing characters. ++++ ** The special handling of 'frame-title-format' on NS where setting it to t would enable the macOS proxy icon has been replaced with a separate variable, 'ns-use-proxy-icon'. 'frame-title-format' will now work as on other platforms. +--- ** New primitive 'w32-read-registry'. This primitive lets Lisp programs access the MS-Windows Registry by retrieving values stored under a given key. It is intended to be used for supporting features such as XDG-like location of important files and directories. ++++ ** The default value of 'w32-pipe-read-delay' is now zero. This speeds up reading output from sub-processes that produce a lot of data. @@ -3149,6 +3739,7 @@ versions of MS-Windows. Set this variable to 50 if for some reason you need the old behavior (and please report such situations to Emacs developers). +--- ** New variable 'w32-multibyte-code-page'. This variable holds the value of the multibyte code page used by the system. It is usually zero, which indicates that 'w32-ansi-code-page' @@ -3156,10 +3747,12 @@ is being used, except in Far Eastern locales. When this variable is non-zero, Emacs at startup sets 'locale-coding-system' to the corresponding encoding, instead of using 'w32-ansi-code-page'. +--- ** The default value of 'inhibit-compacting-font-caches' is t on MS-Windows. Experience shows that compacting font caches causes more trouble on MS-Windows than it helps. ++++ ** Font lookup on MS-Windows was improved to support rare scripts. To activate the improvement, run the new function 'w32-find-non-USB-fonts' once per Emacs session, or assign to the new @@ -3167,11 +3760,13 @@ variable 'w32-non-USB-fonts' the list of scripts and the corresponding fonts. See the documentation of this function and variable in the Emacs manual for more details. ++++ ** On NS the behavior of drag and drop can now be modified by use of modifier keys in line with Apples guidelines. This makes the drag and drop behavior more consistent, as previously the sending application was able to 'set' modifiers without the knowledge of the user. +--- ** On NS multicolor font display is enabled again since it is also implemented in Emacs on free operating systems via Cairo drawing. -- cgit v1.2.3 From 56f958807c0b8ea8f45e3c088157ca144a1b1fac Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:02:53 +0200 Subject: * etc/NEWS: Remove temporary markup. --- etc/NEWS | 589 --------------------------------------------------------------- 1 file changed, 589 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 2c8fa9dd397..a056f5c1e82 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -31,7 +31,6 @@ arranges for the included mini-gmp library to be built and used. The new configure option '--without-libgmp' uses mini-gmp even if a suitable libgmp is available. ---- ** Emacs can now use HarfBuzz as its shaping engine. The new configure option '--with-harfbuzz' adds support for the HarfBuzz text shaping engine. It is on by default; use './configure @@ -44,7 +43,6 @@ supported ones, so the font backends that use older shaping engines enabled by default; they can be enabled via the 'font-backend' frame parameter or via X resources. ---- ** The new configure option '--with-json' adds native support for JSON. This uses the Jansson library. The option is on by default; use './configure --with-json=no' to build without Jansson support. The @@ -52,7 +50,6 @@ new JSON functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer' are typically much faster than their Lisp counterparts from json.el. ---- ** The configure option '--with-cairo' is no longer experimental. This builds Emacs with Cairo drawing, and supports built-in printing when Emacs is built with GTK+. Some severe bugs in this build were @@ -85,12 +82,10 @@ use the configure-time option '--with-dumping=unexec'; however, please file a bug report describing the situation, as unexec dumping is deprecated, and we plan on removing it in some future release. ---- ** The new configure option '--enable-checking=structs' attempts to check that the portable dumper code has been updated to match the last change to one of the data structures that it relies on. ---- ** The configure options '--enable-checking=conslist' and '--enable-checking=xmallocoverrun' have been withdrawn. The former made Emacs irredeemably slow, and the latter made it crash. Neither @@ -98,19 +93,16 @@ option was useful with modern debugging tools such as AddressSanitizer. (See "etc/DEBUG" for the details of using the modern replacements of the removed configure options.) ---- ** Emacs no longer defaults to using ImageMagick to display images. This is due to security and stability concerns with ImageMagick. To override the default, use 'configure --with-imagemagick'. ---- ** Several configure options now accept an option-argument 'ifavailable'. For example, './configure --with-xpm=ifavailable' now configures Emacs to attempt to use libxpm but to continue building even if libxpm is absent. The other affected options are '--with-gif', '--with-gnutls', '--with-jpeg', '--with-png', and '--with-tiff'. ---- ** The 'etags' program now uses the C library's regular expression matcher. If it's possible, 'etags' will use the regexp matcher from the system's standard C library, otherwise it will be linked with a @@ -120,7 +112,6 @@ configure option '--without-included-regex' forces 'etags' to use the C library's regex matcher even if the regex substitute ordinarily would be used to work around compatibility problems. ---- ** Emacs has been ported to the '-fcheck-pointer-bounds' option of GCC. This causes Emacs to check bounds of some arrays addressed by its internal pointers, which can be helpful when debugging the Emacs @@ -128,7 +119,6 @@ interpreter or modules that it uses. If your platform supports it you can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2 -mmpx -fcheck-pointer-bounds"' on Intel MPX platforms. ---- ** Emacs now normally uses a C pointer type instead of a C integer type to implement Lisp_Object, which is the fundamental machine word type internal to the Emacs Lisp interpreter. This change aims to @@ -137,30 +127,24 @@ option '--enable-check-lisp-object-type' is therefore no longer as useful and so is no longer enabled by default in developer builds, to reduce differences between developer and production builds. ---- ** The distribution tarball now has test cases; 'make check' runs them. This is intended mostly to help developers. ---- ** Emacs now requires GTK 2.24 and GTK 3.10 for the GTK 2 and GTK 3 builds respectively. ---- ** New make target 'help' shows a summary of common make targets. ---- ** Emacs now builds with dynamic module support by default. Pass '--without-modules' to 'configure' to disable dynamic module support. ---- ** The ftx font backend driver is now obsolete and will be removed in Emacs 28. * Startup Changes in Emacs 27.1 -+++ ** Emacs can now use the XDG convention for init files. The 'XDG_CONFIG_HOME' environment variable (which defaults to "~/.config") specifies the XDG configuration parent directory. Emacs @@ -180,7 +164,6 @@ Emacs will never create "$XDG_CONFIG_HOME/emacs". Whichever directory Emacs decides to use, it will set 'user-emacs-directory' to point to it. -+++ ** Emacs can now be configured using an early init file. The file is called "early-init.el", in 'user-emacs-directory'. It is loaded very early in the startup process: before graphical elements @@ -196,7 +179,6 @@ process, and some important parts of the Emacs session, such as 'window-system' and other GUI features, are not yet set up, which could make some customization fail to work. -+++ ** Installed packages are now activated *before* loading the init file. As a result of this change, it is no longer necessary to call 'package-initialize' in your init file. @@ -218,7 +200,6 @@ it won't work right without some adjustment: does not need to pay attention to 'package-load-list' or 'package-user-dir' any more. ---- ** Emacs now notifies systemd when startup finishes or shutdown begins. Units that are ordered after 'emacs.service' will only be started after Emacs has finished initialization and is ready for use. @@ -229,10 +210,8 @@ the new version of the file again.) * Changes in Emacs 27.1 ---- ** Emacs now supports Unicode Standard version 13.0. -+++ ** Emacs now supports resizing and rotating images without ImageMagick. All modern systems support this feature. (On GNU and Unix systems, Cairo drawing or the XRender extension to X11 is required for this to @@ -242,12 +221,10 @@ enable scaling.) The new function 'image-transforms-p' can be used to test whether any given frame supports these capabilities. -+++ ** The Network Security Manager now allows more fine-grained control of what checks to run via the 'network-security-protocol-checks' user option. -+++ ** TLS connections have their security tightened by default. Most of the checks for outdated, believed-to-be-weak TLS algorithms and ciphers are now switched on by default. (In addition, several new @@ -259,7 +236,6 @@ issued), you can either set 'network-security-protocol-checks' to nil, or adjust the elements in that user option to only happen on the 'high' security level (assuming you use the 'medium' level). ---- ** New user option 'nsm-trust-local-network'. Allows skipping Network Security Manager checks for hosts on your local subnet(s). It defaults to nil. Usually, there should be no @@ -267,21 +243,18 @@ need to set this non-nil, and doing that risks opening your local network connections to attacks. So be sure you know what you are doing before changing the value. -+++ ** Native GnuTLS connections can now use client certificates. Previously, this support was only available when using the external 'gnutls-cli' or 'starttls' command. Call 'open-network-stream' with ':client-certificate t' to trigger looking up of per-server certificates via 'auth-source'. -+++ ** New user option 'network-stream-use-client-certificates'. When non-nil, 'open-network-stream' performs lookups of client certificates using 'auth-source' as if ':client-certificate t' were specified if there is no explicit ':client-certificate' parameter. Defaults to nil. -+++ ** 'next/previous-multiframe-window' have been renamed. The new names are as follows: @@ -292,12 +265,10 @@ The old function names are maintained as aliases for backward compatibility. ** emacsclient -+++ *** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable. The command-line argument '--socket-name' overrides it. (The same behavior as for the pre-existing 'EMACS_SERVER_FILE' variable.) -+++ *** Emacs and emacsclient now default to "$XDG_RUNTIME_DIR/emacs". This is used as the directory for client/server sockets, if Emacs is running on a platform or environment that sets the 'XDG_RUNTIME_DIR' @@ -305,11 +276,9 @@ environment variable to indicate where session sockets should go. To get the old, less-secure behavior, you can set the 'EMACS_SOCKET_NAME' environment variable to an appropriate value. ---- *** When run by root, emacsclient no longer connects to non-root sockets. (Instead you can use Tramp methods to run root commands in a non-root Emacs.) ---- ** 'xft-ignore-color-fonts' now ignores even more color fonts. There are color fonts that managed to bypass the existing checks, causing XFT crashes, they are now filtered out. Setting @@ -317,45 +286,36 @@ causing XFT crashes, they are now filtered out. Setting require setting 'face-ignored-fonts' to filter out problematic fonts. Known problematic fonts are "Noto Color Emoji" and "Emoji One". ---- ** The GTK+ font chooser now respects 'face-ignored-fonts'. When using 'menu-set-font' under GTK3, the available fonts are now matched against 'face-ignored-fonts'. ---- ** The GTK+ font chooser now remembers the previously selected settings. It now remembers the name, size, style, etc. -+++ ** New user option 'what-cursor-show-names'. When non-nil, 'what-cursor-position' will show the name of the character in addition to the decimal/hex/octal representation. Default nil. -+++ ** New function 'network-lookup-address-info'. This does IPv4 and/or IPv6 address lookups on hostnames. -+++ ** 'network-interface-list' can now return IPv4 and IPv6 addresses. IPv4 and IPv6 addresses are now returned by default if available, optionally including netmask/broadcast address information. ---- ** Control of the threshold for using the 'distant-foreground' color. The threshold for color distance below which the 'distant-foreground' color of the face will be used instead of the foreground color can now be controlled via the new variable 'face-near-same-color-threshold'. The default value is 30000, as the previously hard-coded threshold. -+++ ** The function 'read-passwd' uses "*" as default character to hide passwords. -+++ ** The function 'read-answer' now accepts not only single character answers, but also function keys like 'F1', character events such as 'C-M-h', and control characters like 'C-h'. -+++ ** Lexical binding is now used by default when evaluating interactive Elisp. More specifically, 'lexical-binding' is now used by default for 'M-:' and '--eval' (including in evaluations invoked from 'emacsclient' via @@ -371,19 +331,16 @@ to work with lexical binding, or wrap it in an extra level of 'eval'. For example, --eval "FORM" becomes --eval "(eval 'FORM)" (note the extra quote in 'FORM). ---- ** The new user option 'tooltip-resize-echo-area' avoids truncating tooltip text on GUI frames when tooltips are displayed in the echo area. Instead, it resizes the echo area as needed to accommodate the full tool-tip text. ---- ** Show mode line tooltips only if the corresponding action applies. Customize the user option 'mode-line-default-help-echo' to restore the old behavior where the tooltip text is also shown when the corresponding action does not apply. -+++ ** New hook 'server-after-make-frame-hook'. This hook is a convenient place to perform initializations in daemon mode which require GUI features to be available. One example is @@ -392,15 +349,12 @@ the call to 'desktop-read' in this hook, if you want the GUI settings to be restored, or if desktop.el needs to interact with you during restoration of the session. -+++ ** The functions 'set-frame-height' and 'set-frame-width' are now commands, and will set the currently selected frame to the height/ width specified by the numeric prefix. -+++ ** New function 'logcount' calculates an integer's Hamming weight. -+++ ** New function 'libxml-available-p'. This function returns non-nil if libxml support is both compiled in and available at run time. Lisp programs should use this function to @@ -408,7 +362,6 @@ detect built-in libxml support, instead of testing for that indirectly, e.g., by checking that functions like 'libxml-parse-html-region' return nil. -+++ ** 'libxml-parse-xml-region' and 'libxml-parse-html-region' take a parameter that's called DISCARD-COMMENTS, but it really only discards the top-level comment. Therefore this parameter is now @@ -416,83 +369,67 @@ obsolete, and the new utility function 'xml-remove-comments' can be used to remove comments before calling the libxml functions to parse the data. -+++ ** A new DOM (the XML/HTML document structure returned by functions such as 'libxml-parse-html-region') traversal function has been added: 'dom-search', which takes a DOM and a predicate and returns all nodes that match. -+++ ** New function 'fill-polish-nobreak-p', to be used in 'fill-nobreak-predicate'. It blocks line breaking after a one-letter word, also in the case when this word is preceded by a non-space, but non-alphanumeric character. -+++ ** The limit on repetitions in regexps has been raised to 2^16-1. It was previously limited to 2^15-1. For example, the following regular expression was previously invalid, but is now accepted: x\{32768\} ---- ** The German prefix and postfix input methods now support Capital sharp S. ---- ** New input methods 'hawaiian-postfix' and 'hawaiian-prefix'. ---- ** New input methods 'georgian-qwerty' and 'georgian-nuskhuri'. ---- ** New input methods for several variants of the Sami language. The Sami input methods include: 'norwegian-sami-prefix', 'bergsland-hasselbrink-sami-prefix', 'southern-sami-prefix', 'ume-sami-prefix', 'northern-sami-prefix', 'inari-sami-prefix', 'skolt-sami-prefix', and 'kildin-sami-prefix'. -+++ ** Japanese environments use UTF-8 by default. In Japanese environments that do not specify encodings and are not based on MS-Windows, the default encoding is now utf-8 instead of japanese-iso-8bit. -+++ ** New function 'exec-path'. This function by default returns the value of the corresponding user option, but can optionally return the equivalent of 'exec-path' from a remote host. -+++ ** The function 'executable-find' supports an optional argument REMOTE. This triggers searching for the program on the remote host as indicated by 'default-directory'. -+++ ** New user option 'auto-save-no-message'. When set to t, no message will be shown when auto-saving (default value: nil). ---- ** The value of 'make-cursor-line-fully-visible' can now be a function. In addition to nil or non-nil, the value can now be a predicate function. Follow mode uses this to control scrolling of its windows when the last screen line in a window is not fully visible. -+++ ** New variable 'emacs-repository-branch'. It reports the git branch from which Emacs was built. -+++ ** New user option 'switch-to-buffer-obey-display-actions'. When non-nil, 'switch-to-buffer' uses 'pop-to-buffer-same-window' that respects display actions specified by 'display-buffer-alist' and 'display-buffer-overriding-action'. -+++ ** The user option 'switch-to-visible-buffer' is now obsolete. Customize 'switch-to-prev-buffer-skip' instead. -+++ ** New user option 'switch-to-prev-buffer-skip'. This user option allows specifying the set of buffers that may be shown by 'switch-to-prev-buffer' and 'switch-to-next-buffer' more @@ -504,10 +441,8 @@ matches strings where the pattern appears as a subsequence. Put simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex' to 'completion-styles' or 'completion-category-overrides' to use it. ---- ** The 'completion-common-part' face is now visible by default. -+++ ** New face attribute ':extend' to control face extension at EOL. The new face attribute ':extend' controls whether to use the face for displaying the empty space beyond end of line (EOL) till the edge of @@ -524,32 +459,25 @@ Consequently, a theme generally shouldn't specify this attribute unless it has a good reason to do so. ** Connection-local variables -+++ *** Connection-local variables are applied by default like file-local and directory-local variables. -+++ *** The macro 'with-connection-local-variables' has been renamed from 'with-connection-local-profiles'. No argument PROFILES needed any longer. ---- ** New user option 'next-error-verbose' controls when 'next-error' outputs a message about the error locus. ---- ** New user option 'grep-search-path' defines the directories searched for grep hits (this used to be controlled by 'compilation-search-path'). ---- ** New user option 'emacs-lisp-compilation-search-path' defines the directories searched for byte-compiler error messages (this used to be controlled by 'compilation-search-path'). ---- ** Multicolor fonts such as "Noto Color Emoji" can be displayed on Emacs configured with Cairo drawing and linked with cairo >= 1.16.0. -+++ ** Emacs now optionally displays a fill column indicator. This is similar to what 'fill-column-indicator' package provides, but much faster and compatible with 'show-trailing-whitespace'. @@ -564,46 +492,36 @@ in tooltips, as it is not useful there. There are 2 new buffer local variables and 1 face to customize this mode, they are described in the manual "(emacs) Display". -+++ ** 'progress-reporter-update' now accepts an optional suffix string to display. ---- ** New user option 'xref-file-name-display' controls the display of file names in xref buffers. ---- ** New user option 'byte-count-to-string-function'. It is used for displaying file sizes and disk space in some cases. -+++ ** Emacs now interprets RGB triplets like HTML, SVG, and CSS do. The X convention previously used differed slightly, particularly for RGB triplets with a single hexadecimal digit per component. ---- ** The toolbar now shows the equivalent key binding in its tooltips. ---- ** The File menu-bar menu was re-arranged. Print menu items moved to submenu, and also added the new entries for tabs. ---- ** 'scroll-lock-mode' is now bound to the 'Scroll_Lock' key globally. Note that this key binding will not work on MS-Windows systems if 'w32-scroll-lock-modifier' is non-nil. ---- ** 'global-set-key', called interactively, now no longer downcases a key binding with an upper case letter - if you can type it, you can bind it. -+++ ** 'read-from-minibuffer' now works with buffer-local history variables. The HIST argument of 'read-from-minibuffer' now works correctly with buffer-local variables. This means that different buffers can have their own separated input history list if desired. -+++ ** 'backup-by-copying-when-privileged-mismatch' applies to file gid, too. In addition to checking the file owner uid, Emacs also checks that the group gid is not greater than 'backup-by-copying-when-privileged-mismatch'; @@ -612,48 +530,39 @@ if so, 'backup-by-copying-when-mismatch' will be forced on. * Editing Changes in Emacs 27.1 -+++ ** When asked to visit a large file, Emacs now offers to visit it literally. Previously, Emacs would only ask for confirmation before visiting large files. Now it also offers a third alternative: to visit the file literally, as in 'find-file-literally', which speeds up navigation and editing of large files. -+++ ** 'zap-to-char' now uses the history of characters you used to zap to. 'zap-to-char' uses the new 'read-char-from-minibuffer' function to allow navigating through the history of characters that have been input. This is mostly useful for characters that have complex input methods where inputting the character again may involve many keystrokes. -+++ ** 'save-some-buffers' now has a new action in the prompt: 'C-f' will exit the command and switch to the buffer currently being asked about. ---- ** More commands support noncontiguous rectangular regions, namely 'upcase-dwim', 'downcase-dwim', 'capitalize-dwim', 'capitalize-region', 'upcase-initials-region', 'replace-string', 'replace-regexp', and 'delimit-columns-region'. -+++ ** The new 'amalgamating-undo-limit' variable can be used to control how many changes should be amalgamated when using the 'undo' command. ---- ** The 'newline-and-indent' command (commonly bound to 'RET' in many modes) now takes an optional numeric argument to specify how many times is should insert newlines (and indent). -+++ ** New command 'make-empty-file'. ---- ** New variable 'x-wait-for-event-timeout'. This controls how long Emacs will wait for updates to the graphical state to take effect (making a frame visible, for example). -+++ ** New user option 'electric-quote-replace-double'. This option controls whether '"' is replaced in 'electric-quote-mode', in addition to other quote characters. If non-nil, ASCII double-quote @@ -661,59 +570,48 @@ characters that quote text "like this" are replaced by double typographic quotes, “like this”, in text modes, and in comments in non-text modes. ---- ** New user option 'flyspell-case-fold-duplications'. This option controls whether Flyspell mode considers consecutive words to be duplicates if they are not in the same case. If non-nil, the default, words are considered to be duplicates even if their letters' case does not match. ---- ** 'write-abbrev-file' now includes special properties. 'write-abbrev-file' now writes special properties like ':case-fixed' for abbrevs that have them. -+++ ** 'write-abbrev-file' skips empty tables. 'write-abbrev-file' now skips inserting a 'define-abbrev-table' form for tables which do not have any non-system abbrevs to save. -+++ ** The new functions and commands 'text-property-search-forward' and 'text-property-search-backward' have been added. These provide an interface that's more like functions like 'search-forward'. ---- ** 'add-dir-local-variable' now uses dotted pair notation syntax to write alists of variables to ".dir-locals.el". This is the same syntax that you can see in the example of a ".dir-locals.el" file in the node "(emacs) Directory Variables" of the user manual. -+++ ** Network connections using 'local' can now use IPv6. 'make-network-process' now uses the correct loopback address when asked to use ':host 'local' and ':family 'ipv6'. -+++ ** The new function 'replace-region-contents' replaces the current region using a given replacement-function in a non-destructive manner (in terms of 'replace-buffer-contents'). -+++ ** The command 'replace-buffer-contents' now has two optional arguments mitigating performance issues when operating on huge buffers. -+++ ** Dragging 'C-M-mouse-1' now marks rectangular regions. -+++ ** The command 'delete-indentation' now operates on the active region. If the region is active, the command joins all the lines in the region. When there's no active region, the command works on the current and the previous or the next line, as before. -+++ ** You can now change the font size with the mouse wheel. Scrolling the mouse wheel with the Ctrl key pressed will now act the same as the 'C-x C-+' and 'C-x C--' commands. @@ -721,18 +619,15 @@ same as the 'C-x C-+' and 'C-x C--' commands. * Changes in Specialized Modes and Packages in Emacs 27.1 ---- ** New HTML mode skeleton 'html-id-anchor'. This new command (which inserts an _ skeleton) is bound to 'C-c C-c #'. -+++ ** New command 'font-lock-refontify'. This is an interactive convenience function to be used when developing font locking for a mode. It recomputes the font locking data and then re-fontifies the buffer. ---- ** Font Lock is smarter about fontifying unterminated strings and comments. When you type a quote that starts a string, or a comment delimiter that starts a comment, font-lock will not immediately refontify the @@ -743,28 +638,22 @@ comment. This is controlled by the new user option 'jit-lock-antiblink-grace', which specifies the delay in seconds. The default is 2 seconds; set to nil to get back the old behavior. ---- ** The 'C' command in 'tar-mode' will now preserve the timestamp of the extracted file if the new user option 'tar-copy-preserve-time' is non-nil. ---- ** 'autoconf-mode' is now used instead of 'm4-mode' for the "acinclude.m4" / "aclocal.m4" / "acsite.m4" files. ---- ** On GNU/Linux, 'M-x battery' will now list all batteries, no matter what they're named, and the 'battery-linux-sysfs-regexp' variable has been removed. ---- ** The 'list-processes' command now includes port numbers in the network connection information (in addition to the host name). ---- ** The 'cl' package is now officially deprecated in favor of 'cl-lib'. ---- ** desktop *** When called interactively with a prefix arg 'C-u', 'desktop-read' @@ -772,115 +661,94 @@ now prompts the user for the directory containing the desktop file. ** display-line-numbers-mode -+++ *** New faces 'line-number-major-tick' and 'line-number-minor-tick', and user options 'display-line-numbers-major-tick' and 'display-line-numbers-minor-tick' can be used to highlight the line numbers of lines multiple of certain numbers. -+++ *** New variable 'display-line-numbers-offset', when non-zero, adds an offset to absolute line numbers. ** winner -+++ *** A new user option, 'winner-boring-buffers-regexp', has been added. ** table -+++ *** 'table-generate-source' now supports wiki and mediawiki. This command can now output wiki and mediawiki format tables. ** telnet-mode ---- *** Reverting a buffer in 'telnet-mode' will restart a closed connection. ** goto-addr ---- *** A way to more conveniently specify what URI address schemes should be ignored has been added via the 'goto-address-uri-schemes-ignored' variable. ** tex-mode -+++ *** 'latex-noindent-commands' controls indentation of certain commands. You can use this new user option to control indentation of arguments of \emph, \footnote, and similar commands. ** byte compiler -+++ *** 'byte-compile-dynamic' is now obsolete. This is because on the one hand it suffers from misbehavior in corner cases that have plagued it for years, and on the other hand experience indicates that it doesn't bring any measurable benefit. ---- *** The 'g' keystroke in "*Compile-Log*" buffers has been bound to a new command that will recompile the file previously compiled with 'M-x byte-compile-file' and the like. ** compile.el ---- *** In 'compilation-error-regexp-alist', 'line' (and 'end-line') can be functions. -+++ *** 'compilation-context-lines' can now take the value t; this is like nil, but instead of scrolling the current line to the top of the screen when there is no left fringe, it inserts a visible arrow before column zero. ---- *** The new 'compilation-transform-file-match-alist' user option can be used to transform file name matches compilation output, and remove known false positives being recognized as warnings/errors. ** cl-lib.el -+++ *** 'cl-defstruct' has a new ':noinline' argument to prevent inlining its functions. -+++ *** 'cl-defstruct' slots accept a ':documentation' property. ---- *** 'cl-values-list' will now signal an error if its argument isn't a list. ** doc-view.el ---- *** New commands 'doc-view-presentation' and 'doc-view-fit-window-to-page'. ---- *** Added support for password-protected PDF files. ---- *** A new user option 'doc-view-pdftotext-program-args' has been added to allow controlling how the conversion to text is done. -+++ *** The prefix key 's' was changed to 'c' for slicing commands to avoid conflicts with 'image-mode' key 's'. The new key 'c' still has good mnemonics of "cut", "clip", "crop". ** Ido ---- *** New user option 'ido-big-directories' to mark directories whose names match certain regular expressions as big. Ido won't attempt to list the contents of such directories when completing file names. ** Minibuffer -+++ *** New user option 'minibuffer-beginning-of-buffer-movement'. This option allows control of how the 'M-<' command works in the minibuffer. If non-nil, point will move to the end of the prompt @@ -888,7 +756,6 @@ the minibuffer. If non-nil, point will move to the end of the prompt preserves the original behavior of 'M-<' moving to the beginning of the prompt. -+++ *** When the minibuffer is active, echo-area messages are displayed at the end of the minibuffer instead of hiding the minibuffer by the echo area display. The new user option 'minibuffer-message-clear-timeout' @@ -898,19 +765,15 @@ temporarily overwrote the minibuffer contents until the user typed something, set 'set-message-function' and 'clear-message-function' to nil. ---- *** Minibuffer now uses 'minibuffer-message' to display error messages at the end of the active minibuffer. To disable this, remove 'minibuffer-error-initialize' from 'minibuffer-setup-hook'. -+++ *** 'y-or-n-p' now uses the minibuffer to read 'y' or 'n' answer. ---- *** Some commands that previously used 'read-char-choice' now read a character using the minibuffer by 'read-char-from-minibuffer'. ---- ** map.el *** Now also understands plists. @@ -919,10 +782,8 @@ a character using the minibuffer by 'read-char-from-minibuffer'. *** 'map-contains-key' now returns a boolean rather than the key. *** Deprecate the 'testfn' args of 'map-elt' and 'map-contains-key'. *** New generic function 'map-insert'. -+++ *** The 'type' arg can be a list '(hash-table :key1 VAL1 :key2 VAL2 ...)'. ---- ** seq.el New convenience functions 'seq-first' and 'seq-rest' give easy access to respectively the first and all but the first elements of sequences. @@ -930,22 +791,18 @@ to respectively the first and all but the first elements of sequences. The new predicate function 'seq-contains-p' should be used instead of the now obsolete 'seq-contains'. ---- ** Follow mode In the current follow group of windows, "ghost" cursors are no longer displayed in the non-selected follow windows. To get the old behavior back, customize 'follow-hide-ghost-cursors' to nil. -+++ ** New variable 'warning-fill-column' for 'display-warning'. ** Windmove ---- *** 'windmove-create-window' when non-nil makes a new window. This happens upon moving off the edge of the frame. -+++ *** Windmove supports directional window display and selection. The new command 'windmove-display-default-keybindings' binds default keys with provided modifiers (by default, Shift-Meta) to the commands @@ -959,7 +816,6 @@ display the buffer in the same window, for example, 'S-M-0 C-h e' displays the "*Messages*" buffer in the same window. 'S-M-t C-h r' displays the Emacs manual in a new tab. -+++ *** Windmove also supports directional window deletion. The new command 'windmove-delete-default-keybindings' binds default keys with provided prefix (by default, 'C-x') and modifiers (by default, @@ -969,12 +825,10 @@ With a prefix arg 'C-u', also kills the buffer in that window. With 'M-0', deletes the selected window and selects the window that was in the specified direction. -+++ *** New command 'windmove-swap-states-in-direction' binds default keys to the commands that swap the states of the selected window with the window in the specified direction. ---- *** Windmove code no longer used is now obsolete. That includes the user option 'windmove-window-distance-delta' and the functions 'windmove-coord-add', 'windmove-constrain-to-range', @@ -982,104 +836,82 @@ functions 'windmove-coord-add', 'windmove-constrain-to-range', 'windmove-constrain-loc-for-movement', 'windmove-wrap-loc-for-movement', 'windmove-reference-loc' and 'windmove-other-window-loc'. ---- ** Octave mode The mode is automatically enabled in files that start with the 'function' keyword. ** project.el -+++ *** New commands 'project-search' and 'project-query-replace-regexp'. ---- *** New user option 'project-read-file-name-function'. ** Etags -+++ *** 'next-file' is now an obsolete alias of 'tags-next-file'. ---- *** 'tags-loop-revert-buffers' is an obsolete alias of 'fileloop-revert-buffers'. -+++ *** The 'tags-loop-continue' function along with the 'tags-loop-operate' and 'tags-loop-scan' variables are now obsolete; use the new 'fileloop-initialize' and 'fileloop-continue' functions instead. -+++ *** etags is now able to read Zstandard-compressed files. ** bibtex ---- *** New commands 'bibtex-next-entry' and 'bibtex-previous-entry'. In 'bibtex-mode-map', 'forward-paragraph' and 'backward-paragraph' are remapped to these, respectively. ** Dired -+++ *** New command 'dired-create-empty-file'. -+++ *** New command 'dired-number-of-marked-files'. It is by default bound to '* N'. ---- *** The marking commands now report how many files were marked by the command itself, not how many files are marked in total. -+++ *** The new user option 'dired-create-destination-dirs' controls whether 'dired-do-copy' and 'dired-rename-file' should create non-existent directories in the destination. -+++ *** 'dired-dwim-target' can be customized to prefer either the next window, or one of the most recently visited windows with a Dired buffer. -+++ *** When the new user option 'dired-vc-rename-file' is non-nil, Dired performs file renaming using underlying version control system. ---- *** Zstandard compression is now supported for 'dired-do-compress' and 'dired-do-compress-to'. ---- *** On systems that support suid/guid files, Dired now fontifies the permissions of such files with a special face 'dired-set-id'. ---- *** A new face, 'dired-special', is used to highlight sockets, named pipes, block devices and character devices. ** Find-Dired ---- *** New user option 'find-dired-refine-function'. The default value is 'find-dired-sort-by-filename'. ---- *** New sorting options for the user option 'find-ls-option'. ** Change Logs and VC ---- *** New user option 'vc-tor'. When non-nil, this user option causes the VC commands to communicate with the repository via Tor's proxy, using the 'torsocks' wrapper script. The default is nil. -+++ *** New command 'log-edit-generate-changelog-from-diff', bound to 'C-c C-w'. This generates ChangeLog entries from the VC fileset diff. -+++ *** Recording ChangeLog entries doesn't require an actual file. If a ChangeLog file doesn't exist, and if the new user option 'add-log-dont-create-changelog-file' is non-nil (which is the @@ -1089,32 +921,26 @@ still be used if it exists.) Set the user option to nil to get the previous behavior of always creating a buffer that visits a ChangeLog file. -+++ *** The new 'd' command ('vc-dir-clean-files') in 'vc-dir-mode' buffers will delete the marked files (or if no files are marked, the file under point). This command does not notify the VC backend, and is mostly useful for unregistered files. ---- *** 'vc-dir-ignore' now takes a prefix argument to ignore all marked files. ---- *** New user option 'vc-git-grep-template'. This new user option allows customizing the default arguments passed to 'git-grep' when 'vc-git-grep' is used. ---- *** Command 'vc-git-stash' now respects marks in the "*vc-dir*" buffer. When some files are marked, only those are stashed. When no files are marked, all modified files are stashed, as before. ---- *** 'vc-dir' now shows a button allowing you to hide the stash list. Controlled by user option 'vc-git-show-stash'. Default t means show the entire list as before. An integer value limits the list length (but still allows you to show the entire list via the button). ---- *** 'vc-git-stash' is now bound to 'C' in the stash headers. -- @@ -1122,44 +948,35 @@ the entire list as before. An integer value limits the list length 'vc-git-stash' and 'vc-git-stash-snapshot' can now be run using 'C' and 'S' respectively, including when there are no stashes. ---- *** The new hook 'vc-retrieve-tag-hook' runs after retrieving a tag. ---- *** 'vc-hg' now invokes 'smerge-mode' when visiting files. Code that attempted to invoke 'smerge-mode' when visiting an Hg file with conflicts existed in earlier versions of Emacs, but incorrectly never detected a conflict due to invalid assumptions about cached values. -+++ *** The Hg (Mercurial) back-end now supports 'vc-region-history'. The 'C-x v h' command now works in buffers that visit files controlled by Hg. -+++ *** The Hg (Mercurial) back-end now prompts for revision to merge when you invoke 'C-x v m' ('vc-merge'). ---- *** The Hg (Mercurial) back-end now uses tags, branches and bookmarks instead of revision numbers as completion candidates when it prompts for a revision. ---- *** New user option 'vc-hg-revert-switches'. It specifies switches to pass to Hg's 'revert' command. -+++ *** 'C-u C-x v D' ('vc-root-version-diff') prompts for two revisions and compares their entire trees. ---- *** 'C-x v M D' ('vc-diff-mergebase') and 'C-x v M L' ('vc-log-mergebase') print diffs and logs between the merge base (common ancestor) of two given revisions. -+++ *** New command 'vc-log-search' asks for a pattern, searches it in the revision log, and displays matched log entries in the log buffer. For example, 'M-x vc-log-search RET bug#36644 RET' @@ -1168,7 +985,6 @@ With a prefix argument asks for a command, so for example, 'C-u M-x vc-log-search RET git log -1 f302475 RET' will display just one log entry found by its revision number. -+++ *** It is now possible to display a specific revision given by its ID. If you invoke 'C-x v L' ('vc-print-root-log') with a numeric argument of 1, as in 'C-1 C-x v L' or 'C-u 1 C-x v L', it asks for a revision @@ -1176,56 +992,46 @@ ID, and shows its log entry together with the diffs introduced by the revision's commit. (For some less capable VCSes, only the log entry is shown.) ---- *** New user option 'vc-find-revision-no-save'. With non-nil, 'vc-find-revision' doesn't write the created buffer to file. ---- *** 'C-x v =' can now mimic Magit's diff format. Set the new user option 'diff-font-lock-prettify' to t for that, see below under "Diff mode". ---- *** The 'diff' function arguments OLD and NEW may each be a buffer rather than a file, in non-interactive calls. This change was made in Emacs 24.1, but wasn't documented until now. -+++ *** New command 'diff-buffers' interactively diffs two buffers. ** Diff mode -+++ *** Hunks are now automatically refined by font-lock. To disable refinement, set the new user option 'diff-refine' to nil. To get back the old behavior where hunks are refined as you navigate through a diff, set 'diff-refine' to the symbol 'navigate'. -+++ *** 'diff-auto-refine-mode' is deprecated in favor of 'diff-refine'. It is no longer enabled by default and binding it no longer has any effect. -+++ *** Better syntax highlighting of Diff hunks. Fragments of source in Diff hunks are now by default highlighted according to the appropriate major mode. Customize the new user option 'diff-font-lock-syntax' to nil to disable this. ---- *** File headers can be shortened, mimicking Magit's diff format. To enable it, set the new user option 'diff-font-lock-prettify' to t. On GUI frames, this option also displays the insertion and deletion indicators on the left fringe. -+++ *** Prefix arg of 'diff-goto-source' means jump to the old revision of the file under version control if point is on an old changed line, or to the new revision of the file otherwise. ** Texinfo -+++ *** New function for inserting '@pxref', '@xref', or '@ref' commands. The function 'texinfo-insert-dwim-@ref', bound to 'C-c C-c r' by default, inserts one of three types of references based on the text @@ -1234,35 +1040,29 @@ start of a sentence or at '(point-min)', else '@ref'. ** Browse-url ---- *** The function 'browse-url-emacs' can now visit a URL in selected window. It now treats the optional 2nd argument to mean that the URL should be shown in the currently selected window. ---- *** A new function, 'browse-url-add-buttons' can be used to add clickable links to most ordinary special-mode buffers that display text that have URLs embedded. 'browse-url-button-regexp' controls what's considered a button. ---- *** New user option 'browse-url-secondary-browser-function'. It can be set to a function that invokes an alternative browser. ** Comint -+++ *** 'send-invisible' is now an obsolete alias for 'comint-send-invisible'. Also, 'shell-strip-ctrl-m' is declared obsolete. -+++ *** 'C-c .' ('comint-insert-previous-argument') no longer interprets '&'. This feature caused problems when '&&' was present in the previous command. Since this command emulates 'M-.' in Bash and zsh, neither of which treats '&' specially, the feature was removed for compatibility with these shells. -+++ *** 'comint-insert-previous-argument' can now count arguments from the end. By default, invoking 'C-c .' with a numeric argument N would copy the Nth argument, counting from the first one. But if the new user option @@ -1272,11 +1072,9 @@ better emulate 'M-.' in both Bash and zsh, since the former counts from the beginning of the arguments, while the latter counts from the end. -+++ *** 'comint-run' can now accept a list of switches to pass to the program. 'C-u M-x comint-run' will prompt for the switches interactively. -+++ *** Abnormal hook 'comint-password-function' has been added. This hook permits a derived mode to supply a password for the underlying command interpreter without prompting the user. For @@ -1292,7 +1090,6 @@ if it had been supplied on the command line. ** SQL ---- *** SQL Indent Minor Mode SQL Mode now supports the ELPA 'sql-indent' package for assisting sophisticated SQL indenting rules. Note, however, that SQL is not @@ -1305,19 +1102,16 @@ prefer to rely upon existing Emacs facilities for formatting code but the 'sql-indent' package provides facilities to aid more casual SQL developers layout queries and complex expressions. ---- **** 'sql-use-indent-support' (default t) enables SQL indention support. The 'sql-indent' package from ELPA must be installed to get the indentation support in 'sql-mode' and 'sql-interactive-mode'. ---- **** 'sql-mode-hook' and 'sql-interactive-mode-hook' changed. Both hook variables have had 'sql-indent-enable' added to their default values. If you have existing customizations to these variables, you should make sure that the new default entry is included. ---- *** Connection Wallet Database passwords can now by stored in NETRC or JSON data files that may optionally be encrypted. When establishing an interactive session @@ -1336,48 +1130,38 @@ be encrypted with GPG by adding an additional ".gpg" suffix. ** Term ---- *** 'term-read-noecho' is now obsolete, use 'read-passwd' instead. -+++ *** 'serial-term' now takes an optional parameter to leave the emulator in line mode. ** Flymake -+++ *** The variable 'flymake-diagnostic-types-alist' is obsolete. You should instead set properties on known diagnostic symbols, like ':error' and ':warning', as demonstrated in the Flymake manual. -+++ *** New user option 'flymake-start-on-save-buffer'. Control whether Flymake starts checking the buffer on save. ---- *** Flymake and backend functions may exchange hints about buffer changes. This enables more efficient backends. See the docstring of 'flymake-diagnostic-functions' or the Flymake manual for details. -+++ *** 'flymake-start-syntax-check-on-newline' is now obsolete, use 'post-self-insert-hook' to check on newline. ** Ruby ---- *** The Rubocop Flymake diagnostic function will only run Lint cops if it can't find the config file. ---- *** Rubocop is called with 'bundle exec' if Gemfile mentions it. ---- *** New command 'ruby-find-library-file' bound to 'C-c C-f'. ** Package ---- *** Warn if "footer line" is missing, but still install package. package.el used to refuse to install a package without the so-called "footer line", which appears at the very end of the file: @@ -1392,24 +1176,20 @@ Note that versions of Emacs older than 27.1 will not only refuse to install packages without such a line -- they will be unable to parse package data. It is therefore recommended to keep this line. -+++ *** Change of 'package-check-signature' for packages with multiple sigs. In previous Emacsen, t checked that all signatures are valid. Now t only checks that at least one signature is valid and the new 'all' value needs to be used if you want to enforce that all signatures are valid. This only affects packages with multiple signatures. -+++ *** The meaning of 'allow-unsigned' in 'package-check-signature' has changed slightly: If a usable OpenPGP configuration can't be found (for instance, if gpg isn't installed), it now has the same meaning as nil. ---- *** New function 'package-get-version' lets packages query their own version. Example use in auctex.el: '(defconst auctex-version (package-get-version))' ---- *** New 'package-quickstart' feature. When 'package-quickstart' is non-nil, package.el precomputes a big autoloads file so that activation of packages can be done much faster, @@ -1419,10 +1199,8 @@ It also causes user options like 'package-user-dir' and is run rather than at startup so you don't need to set them in your early init file. ---- *** New function 'package-activate-all'. -+++ *** New functions for filtering packages list. A new function has been added which allows users to filter the packages list by name: 'package-menu-filter-by-name'. By default, it @@ -1432,13 +1210,10 @@ is bound to '/ n'. Additionally, the function (from 'f'). To clear any of the two filters, the user can now call the 'package-menu-clear-filter' function, bound to '/ /' by default. ---- *** Imenu support has been added to 'package-menu-mode'. ---- *** The package list can now be sorted by version or description. -+++ *** In Package Menu, 'g' now updates package data from archives. Previously, 'g' invoked 'tabulated-list-revert' which did not update the cached archive data. It is now bound to 'revert-buffer', which @@ -1448,19 +1223,16 @@ will update the data. ** Info -+++ *** Clicking on the left/right arrow icon in the Info tool-bar while holding down the Ctrl key pops up a menu of previously visited Info nodes where you can select a node to go back (like in browsers). ---- *** Info can now follow 'file://' protocol URLs. The 'file://' URLs in Info documents can now be followed by passing them to the 'browse-url' function, like the other protocols: 'ftp', 'http', and 'https'. This allows having references to local HTML files, for example. ---- ** Display of man pages now limits the width for formatting pages. The new user option 'Man-width-max' (80 by default) limits the number of columns passed to the 'man' program for formatting man pages. This @@ -1469,40 +1241,32 @@ windows (which are customary with today's large displays). ** Xref -+++ *** New command 'xref-find-definitions-at-mouse'. This command finds definitions of the identifier at the place of a mouse click event, and is intended to be bound to a mouse event. -+++ *** Changing 'xref-marker-ring-length' works after xref.el is loaded. Previously, setting 'xref-marker-ring-length' would only take effect if set before xref.el was loaded. ---- *** 'xref-find-definitions' now sets the mark at the buffer position where it was invoked. ---- *** New xref faces 'xref-file-header', 'xref-line-number', 'xref-match'. ---- *** New user option 'xref-show-definitions-function'. It encapsulates the logic pertinent to showing the result of 'xref-find-definitions'. The user can change it to customize its behavior and the display of results. ---- *** Search results show the buffer even for one hit. The search-type Xref commands (e.g. 'xref-find-references' or 'project-find-regexp') now show the results buffer even when there is only one hit. This can be altered by changing 'xref-show-xrefs-function'. -+++ *** Xref buffers support refreshing the search results. A new command 'xref-revert-buffer' is bound to 'g'. ---- *** Imenu support has been added to 'xref--xref-buffer-mode'. *** New generic method 'xref-backend-identifier-completion-ignore-case'. @@ -1511,7 +1275,6 @@ identifier completion. ** Checkdoc ---- *** Checkdoc can now optionally spell-check doc strings. Invoking 'checkdoc-buffer' with a non-nil TAKE-NOTES argument (interactively, with a prefix arg) will now spell-check the doc @@ -1519,7 +1282,6 @@ strings and report all the spelling mistakes. ** Icomplete -+++ *** New minor mode Fido mode. This mode is based on Icomplete, and its name stands for "Fake Ido". The point of this mode is to be an 'ido-mode' workalike, providing @@ -1529,29 +1291,24 @@ completion facilities. ** Ecomplete ---- *** The Ecomplete sorting has changed to a decay-based algorithm. This can be controlled by the new 'ecomplete-sort-predicate' user option. ---- *** The 'ecomplete-database-file' file is now placed in "~/.emacs.d/ecompleterc" by default. Of course it will still find it if you have it in "~/.ecompleterc". ** Gnus ---- *** 'mm-uu-diff-groups-regexp' now defaults to matching all groups, which means that "git am" diffs are recognized everywhere. -+++ *** Two new Gnus summary mode navigation commands have been added, bound to the '[' and ']' keys: 'gnus-summary-prev-unseen-article' and 'gnus-summary-next-unseen-article'. These take you (respectively) to the previous unseen or next unseen article. (These are the ones that are marked with "." in the summary mode lines.) -+++ *** The Gnus user variable 'nnimap-expunge' supports three new values: 'never' for never expunging messages, 'immediately' for immediately expunging deleted messages, and 'on-exit' to expunge deleted articles @@ -1561,67 +1318,53 @@ result in Gnus expunging all messages that have been flagged as deleted by any IMAP client (rather than just those that have been deleted by Gnus). -+++ *** New user option 'gnus-use-atomic-windows' makes Gnus window layouts atomic. See the "(elisp) Atomic Windows" node of the Elisp manual for details. -+++ *** There's a new value for 'gnus-article-date-headers', 'combined-local-lapsed', which will show both the time (in the local timezone) and the lapsed time. ---- *** Gnus now maps imaps to 993 only on old MS-Windows versions. The nnimap backend used to do this unconditionally to work around problems on old versions of MS-Windows. This is now done only for Windows XP and older. -+++ *** The nnimap backend now has support for IMAP namespaces. This feature can be enabled by setting the new 'nnimap-use-namespaces' server variable to non-nil. -+++ *** A prefix argument to 'gnus-summary-limit-to-score' will limit in reverse. Limit to articles with score "at or below" the SCORE argument rather than "at or above". ---- *** The function 'gnus-score-find-favorite-words' has been renamed from 'gnus-score-find-favourite-words'. ---- *** Gmane has been removed as an nnir backend, since Gmane no longer has a search engine. -+++ *** Splitting mail on common mailing list headers has been added. See the concept index in the Gnus manual for the 'match-list' entry. -+++ *** nil is no longer an allowed value for 'mm-text-html-renderer'. -+++ *** The default value of 'mm-inline-large-images' has changed from nil to 'resize', which means that large images will be resized instead of displayed with an external program by default. -+++ *** A new Gnus summary mode command, 'S A' ('gnus-summary-attach-article') can be used to attach the current article(s) to a pre-existing Message buffer, or create a new Message buffer with the article(s) attached. -+++ *** A new Gnus summary mode command, 'w' ('gnus-summary-browse-url') scans the article buffer for URLs, and offers them to the user to open with 'browse-url'. ---- *** New user option 'nnir-notmuch-filter-group-names-function'. This option controls whether and how to use Gnus search groups as 'path:' search terms to 'notmuch'. ---- *** The buttons in the Gnus article buffer were formerly widgets (i.e., buttons from widget.el). This has now changed, and they are now buttons (from button.el), and commands like 'TAB' now search for @@ -1631,22 +1374,18 @@ fail. ** erc ---- *** New hook 'erc-insert-done-hook'. This hook is called after strings have been inserted into the buffer, and is free to alter point and window configurations, as it's not called from inside a 'save-excursion', as opposed to 'erc-insert-post-hook'. ---- *** 'erc-button-google-url' has been renamed to 'erc-button-search-url' and its value has been changed to Duck Duck Go. ---- *** 'erc-send-pre-hook' and 'erc-send-this' have been obsoleted. The user option to use instead to alter text to be sent is now 'erc-pre-send-functions'. ---- *** Improve matching/highlighting of nicknames. Open and close parenthesis and apostrophe are not considered valid nick characters anymore, matching the given grammar in RFC 2812 @@ -1654,43 +1393,35 @@ section 2.3.1. This enables correct matching and highlighting of nicks when they are surrounded by parentheses, like "(nick)", and when adjacent to an apostrophe, like "nick's". ---- *** Set 'erc-button-url-regexp' to 'browse-url-button-regexp' which better handles surrounding pair of parentheses. ---- *** New function 'erc-switch-to-buffer-other-window' which is like 'erc-switch-to-buffer', but opens the buffer in another window. ---- *** New function 'erc-track-switch-buffer-other-window' which is like 'erc-track-switch-buffer', but opens the buffer in another window. ** EUDC ---- *** XEmacs support has been removed. ** eww/shr -+++ *** The new user option 'shr-cookie-policy' can be used to control when to use cookies when fetching embedded images. The default is to use them when the images are from the same domain as the main HTML document. -+++ *** The 'eww' command can now create a new EWW buffer. Invoking the command with a prefix argument will cause it to create a new EWW buffer for the URL instead of reusing the default one. -+++ *** Clicking with the Ctrl key or 'C-u RET' on a link opens a new tab when tab-bar-mode is enabled. -+++ *** The 'd' ('eww-download') command now falls back to current page's URL. If this command is invoked with no URL at point, it now downloads the current page instead of signaling an error. @@ -1700,30 +1431,24 @@ current page instead of signaling an error. 'shr-selected-link' face to give the user feedback that the command has been executed. -+++ *** New user option 'shr-discard-aria-hidden'. If set, shr will not render tags with attribute 'aria-hidden="true"'. This attribute is meant to tell screen readers to ignore a tag. -+++ *** 'shr-external-browser' has been made into an obsolete alias of 'browse-url-secondary-browser-function'. ---- *** 'shr-tag-ol' now respects the ordered list 'start' attribute. ---- *** The following tags are now handled: '', '', and ''. ** Htmlfontify -+++ *** The functions 'hfy-color', 'hfy-color-vals' and 'hfy-fallback-color-values' and the variables 'hfy-fallback-color-map' and 'hfy-rgb-txt-color-map' have been renamed from names that used 'colour' instead of 'color'. -+++ ** Enriched mode supports the 'charset' text property. You can add or modify the 'charset' text properties of text using the 'Edit->Text Properties->Special Properties' menu, or by invoking the @@ -1733,70 +1458,57 @@ restored when the file is visited. ** Smtpmail ---- *** Authentication mechanisms can be added via external packages, by defining new 'cl-defmethod' of 'smtpmail-try-auth-method'. -+++ *** To always force smtpmail to send credentials over on the first attempt when communicating with the SMTP server(s), the 'smtpmail-servers-requiring-authorization' user option can be used. -+++ *** smtpmail will now try resending mail when getting a transient "4xx" error message from the SMTP server. The new 'smtpmail-retries' user option says how many times to retry. ** Footnote mode ---- *** Support Hebrew-style footnotes. ---- *** Footnote text lines are now aligned. Can be controlled via the new user option 'footnote-align-to-fn-text'. ** CSS mode ---- *** A new command 'css-cycle-color-format' for cycling between color formats (e.g. "black" => "#000000" => "rgb(0, 0, 0)") has been added, bound to 'C-c C-f'. ---- *** CSS mode, SCSS mode, and Less CSS mode now have support for Imenu. ** SGML mode ---- *** 'sgml-quote' now handles double quotes and apostrophes when escaping text and in addition all numeric entities when unescaping text. ** Python mode ---- *** Python mode supports three different font lock decoration levels. The maximum level is used by default; customize 'font-lock-maximum-decoration' to tone down the decoration. ---- *** New user option 'python-pdbtrack-kill-buffers'. If non-nil, the default, buffers opened during pdbtracking session are killed when pdbtracking session is finished. ---- *** New function 'python-shell-send-statement. It sends the statement delimited by 'python-nav-beginning-of-statement' and 'python-nav-end-of-statement' to the inferior Python process. ** Help ---- *** Descriptions of variables and functions give an estimated first release where the variable or function appeared in Emacs. ---- *** Output format of 'C-h l' ('view-lossage') has changed. For convenience, 'view-lossage' now displays the last keystrokes and commands in the same format as the edit buffer of @@ -1804,23 +1516,19 @@ and commands in the same format as the edit buffer of the buffer generated by 'view-lossage' to the "*Edit Macro*" buffer created by 'edit-last-kbd-macro', and to save the macro by 'C-c C-c'. ---- *** The list of help commands produced by 'C-h C-h' ('help-for-help') can now be searched via 'C-s'. ** Ibuffer ---- *** New filter 'ibuffer-filter-by-process'; bound to '/ E'. ---- *** All mode filters can now accept a list of symbols. This means you can now easily filter several major modes, as well as a single mode. ** Search and Replace -+++ *** Isearch supports a prefix argument for 'C-s' ('isearch-repeat-forward') and 'C-r' ('isearch-repeat-backward'). With a prefix argument, these commands repeat the search for the specified occurrence of the search string. @@ -1830,7 +1538,6 @@ This makes possible also to use a prefix argument for 'M-s .' Also a prefix argument is supported for 'isearch-yank-until-char', 'isearch-yank-word-or-char', 'isearch-yank-symbol-or-char'. -+++ *** To go to the first/last occurrence of the current search string is possible now with new commands 'isearch-beginning-of-buffer' and 'isearch-end-of-buffer' bound to 'M-s M-<' and 'M-s M->' in Isearch. @@ -1839,14 +1546,12 @@ counting from the beginning/end of the buffer. This complements 'C-s'/'C-r' that searches for the next Nth relative occurrence with a numeric argument. -+++ *** 'isearch-lazy-count' shows the current match number and total number of matches in the Isearch prompt. User options 'lazy-count-prefix-format' and 'lazy-count-suffix-format' define the format of the current and the total number of matches in the prompt's prefix and suffix, respectively. ---- *** 'lazy-highlight-buffer' highlights matches in the full buffer. It is useful in combination with 'lazy-highlight-cleanup' customized to nil to leave matches highlighted in the whole buffer after exiting isearch. @@ -1855,7 +1560,6 @@ navigation through the matches without flickering is more smooth. 'lazy-highlight-buffer-max-at-a-time' controls the number of matches to highlight in one iteration while processing the full buffer. -+++ *** New isearch bindings. 'C-M-z' invokes new function 'isearch-yank-until-char', which yanks everything from point up to but not including the specified @@ -1871,27 +1575,21 @@ string to highlight lines matching the search string. This is similar to the existing binding 'M-s h r' ('highlight-regexp') that highlights JUST the search string. -+++ *** New user option 'isearch-yank-on-move' provides options t and 'shift' to extend the search string by yanking text that ends at the new position after moving point in the current buffer. 'shift' extends the search string by motion commands while holding down the shift key. -+++ *** 'isearch-allow-scroll' provides a new option 'unlimited' to allow scrolling any distance off screen. ---- *** Isearch now remembers the regexp-based search mode for words/symbols and case-sensitivity together with search strings in the search ring. ---- *** Isearch now has its own tool-bar and menu-bar menu. -+++ *** 'flush-lines' prints and returns the number of deleted matching lines. ---- *** 'char-fold-to-regexp' now matches more variants of a base character. The table used to check for equivalence of characters is now built using the complete chain of unicode decompositions of a character, @@ -1899,7 +1597,6 @@ rather than stopping after one level, such that searching for e.g. "GREEK SMALL LETTER IOTA" will now also find "GREEK SMALL LETTER IOTA WITH OXIA". -+++ *** New char-folding options: 'char-fold-include' lets you add ad hoc foldings, 'char-fold-exclude' to remove foldings from default decomposition, and 'char-fold-symmetric' to search for any of an equivalence class of @@ -1910,7 +1607,6 @@ to find "e". ** Debugger -+++ *** The Lisp Debugger is now based on 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1918,45 +1614,37 @@ the Elisp manual for documentation of the new mode and its commands. ** Edebug -+++ *** 'edebug-eval-last-sexp' and 'edebug-eval-print-last-sexp' interactively now take a zero prefix analogously to the non-Edebug counterparts. -+++ *** New faces 'edebug-enabled-breakpoint' and 'edebug-disabled-breakpoint'. When setting breakpoints in Edebug, an overlay with these faces are placed over the point in question, depending on whether they are enabled or not. -+++ *** New command 'edebug-toggle-disable-breakpoint'. This command allows you to disable a breakpoint temporarily. This is mainly useful with breakpoints that are conditional and would take some time to recreate. -+++ *** New command 'edebug-unset-breakpoints'. To clear all breakpoints in the current form, the 'U' command in 'edebug-mode', or 'M-x edebug-unset-breakpoints' can be used. ---- *** Re-instrumenting a function with Edebug will now try to preserve previously-set breakpoints. However, if the code has changed substantially, this may not be possible. -+++ *** New command 'edebug-remove-instrumentation'. This command removes Edebug instrumentation from all functions that have been instrumented. -+++ *** The runtime behavior of Edebug's instrumentation can be changed using the new variables 'edebug-behavior-alist', 'edebug-after-instrumentation-function' and 'edebug-new-definition-function'. Edebug's behavior can be changed globally or for individual definitions. -+++ *** Edebug's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification, links and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -1973,14 +1661,12 @@ been instrumented by Edebug. ** Enhanced xterm support ---- *** New user option 'xterm-set-window-title' controls whether Emacs sets the XTerm window title. This feature is experimental and is disabled by default. ** Grep -+++ *** 'rgrep', 'lgrep' and 'zrgrep' now hide part of the command line that contains a list of ignored directories and files. Clicking on the button with ellipsis unhides it. @@ -1988,16 +1674,13 @@ The abbreviation can be disabled by the new user option 'grep-find-abbreviate'. The new command 'grep-find-toggle-abbreviation' toggles it interactively. ---- *** 'grep-find-use-xargs' is now customizable with sorting options. ** ERT -+++ *** New variable 'ert-quiet' allows making ERT output in batch mode less verbose by removing non-essential information. -+++ *** ERT's backtrace buffer now uses 'backtrace-mode'. Backtrace mode adds fontification and commands for changing the appearance of backtrace frames. See the node "(elisp) Backtraces" in @@ -2005,73 +1688,61 @@ the Elisp manual for documentation of the new mode and its commands. ** Gamegrid ---- *** Gamegrid now determines its default glyph size based on display dimensions, instead of always using 16 pixels. As a result, Tetris, Snake and Pong are better playable on HiDPI displays. ---- *** 'gamegrid-add-score' can now sort scores from lower to higher. This is useful for games where lower scores are better, like time-based games. ** Filecache ---- *** Completing file names in the minibuffer via 'C-TAB' now uses the styles as configured by the user option 'completion-styles'. -+++ ** New macros 'thunk-let' and 'thunk-let*'. These macros are analogue to 'let' and 'let*', but create bindings that are evaluated lazily. ** next-error -+++ *** New user option 'next-error-find-buffer-function'. The value should be a function that determines how to find the next buffer to be used by 'next-error' and 'previous-error'. The default is to use the last buffer that navigated to the current error. -+++ *** New command 'next-error-select-buffer'. It can be used to set any buffer as the next one to be used by 'next-error' and 'previous-error'. ** nxml-mode ---- *** The default value of 'nxml-sexp-element-flag' is now t. This means that pressing 'C-M-SPACE' now selects the entire tree by default, and not just the opening element. ** Eshell ---- *** TAB completion uses the standard 'completion-at-point' rather than 'pcomplete'. Its UI is slightly different but can be customized to behave similarly, e.g. Pcomplete's default cycling can be obtained with '(setq completion-cycle-threshold 5)'. -+++ *** Expansion of history event designators is disabled by default. To restore the old behavior, use (add-hook 'eshell-expand-input-functions #'eshell-expand-history-references) ---- *** The function 'eshell-uniquify-list' has been renamed from 'eshell-uniqify-list'. ---- *** The function 'eshell/kill' is now able to handle signal switches. Previously 'eshell/kill' would fail if provided a kill signal to send to the process. It now accepts signals specified either by name or by its number. ---- *** Emacs now follows symlinks in history-related files. The files specified by 'eshell-history-file-name' and 'eshell-last-dir-ring-file-name' can include symlinks; these are now @@ -2079,16 +1750,13 @@ followed when Emacs writes the relevant history variables to the disk. ** Shell ---- *** Program name completion inside remote shells works now as expected. -+++ *** The user option 'shell-file-name' can be set now as connection-local variable for remote shells. It still defaults to "/bin/sh". ** Single shell commands -+++ *** New values of 'shell-command-dont-erase-buffer'. This user option can now have the value 'erase' to force to erase the output buffer before execution of the command, even if the output goes @@ -2096,42 +1764,34 @@ to the current buffer. Additional values 'beg-last-out', 'end-last-out', and 'save-point' control where to put point in the output buffer after inserting the 'shell-command' output. ---- *** The new functions 'shell-command-save-pos-or-erase' and 'shell-command-set-point-after-cmd' control how point is handled between two consecutive shell commands in the same output buffer. -+++ *** 'async-shell-command-width' defines the number of display columns available for output of asynchronous shell commands. -+++ *** Prompt for shell commands can now show the current directory. Customize the new user option 'shell-command-prompt-show-cwd' to enable it. ** Pcomplete ---- *** The 'pcomplete' command is now obsolete. The Pcomplete functionality can be obtained via 'completion-at-point' instead, by adding 'pcomplete-completions-at-point' to 'completion-at-point-functions'. ---- *** The function 'pcomplete-uniquify-list' has been renamed from 'pcomplete-uniqify-list'. ---- *** 'pcomplete/make' now completes on targets in included files, recursively. To recover the previous behavior, set new user option 'pcmpl-gnu-makefile-includes' to nil. ** Auth-source ---- *** The Secret Service backend supports the ':create' key now. ---- *** ".authinfo" and ".netrc" files now use a new mode: 'authinfo-mode'. This is just like 'fundamental-mode', except that it hides passwords under a "****" display property. When the cursor moves to this text, @@ -2140,110 +1800,89 @@ the real password is revealed (via 'reveal-mode'). The new ** Tramp -+++ *** New connection method "nextcloud", which allows accessing OwnCloud or NextCloud hosted files and directories. -+++ *** New connection method "rclone", which allows accessing system storages via the 'rclone' program. This feature is experimental. -+++ *** New connection method "sudoedit", which allows editing local files with different user credentials. Contrary to the "sudo" method, no session is run permanently in the background. This is for security reasons. -+++ *** Connection methods "obex" and "synce" have been removed, because they are obsoleted in GVFS. -+++ *** Validated passwords are saved by auth-source backends which support this. -+++ *** During user and host name completion in the minibuffer, results from auth-source search are taken into account. This can be disabled by setting the user option 'tramp-completion-use-auth-sources' to nil. -+++ *** The user option 'tramp-ignored-file-name-regexp' allows disabling Tramp for some look-alike remote file names. -+++ *** For some connection methods, like "su" or "sudo", the host name in multi-hop file names must match the previous hop. Default host names are adjusted to the host name from the previous hop. -+++ *** A timeout has been added for the connection methods "sudo" and "doas". The underlying session is disabled when the timeout expires. This is for security reasons. -+++ *** For some connection methods, like "sshx" or "plink", it is possible to configure the remote login shell. This avoids problems with remote hosts, where "/bin/sh" is a link to a shell which cooperates badly with Tramp. -+++ *** New commands 'tramp-rename-files' and 'tramp-rename-these-files'. They allow saving remote files somewhere else when the corresponding host is not reachable anymore. ** Rcirc ---- *** New user option 'rcirc-url-max-length'. Setting this option to an integer causes URLs displayed in Rcirc buffers to be truncated to that many characters. ---- *** The default '/quit' and '/part' reasons are now configurable. Two new user options are provided for this: 'rcirc-default-part-reason' and 'rcirc-default-quit-reason'. ** Register ---- *** The return value of method 'register-val-describe' includes the names of buffers shown by the windows of a window configuration. ** Message ---- *** Completion of email addresses can use the standard completion UI. This is controlled by 'message-expand-name-standard-ui'. With the standard UI the different sources (ecomplete, bbdb, and eudc) are matched together and try to obey 'completion-styles'. It should work for other completion front ends like Company. ---- *** 'message-mode' now supports highlighting citations of different depths. This can be customized via the new user option 'message-cite-level-function' and the new 'message-cited-text-*' faces. -+++ *** Messages can now be systematically encrypted when the PGP keyring contains a public key for every recipient. To achieve this, add 'message-sign-encrypt-if-all-keys-available' to 'message-send-hook'. ---- *** When replying a message that have addresses on the form '"foo@bar.com" ', Message will elide the repeated "name" from the address field in the response. ---- *** The default of 'message-forward-as-mime' has changed from t to nil as it has been reported that many recipients can't read forwards that are formatted as MIME digests. -+++ *** 'message-forward-included-headers' has changed its default to exclude most headers when forwarding. ---- *** 'mml-secure-openpgp-sign-with-sender' sets also "gpg --sender". When 'mml-secure-openpgp-sign-with-sender' is non-nil, message sender's email address (in addition to its old behavior) will also be used to @@ -2259,61 +1898,48 @@ The option is useful for two reasons when verifying the signature: 2.2.17 to fully benefit from this feature. See gpg(1) man page for "--auto-key-retrieve". -+++ *** The 'mail-from-style' variable is now obsolete. According to RFC 5322, only the 'angles' value is valid. ---- ** EasyPG ---- *** 'epa-pinentry-mode' is renamed to 'epg-pinentry-mode'. It now applies to epg functions as well as epa functions. ---- *** The alias functions 'epa--encode-coding-string', 'epa--decode-coding-string', and 'epa--select-safe-coding-system' have been removed. Use 'encode-coding-string', 'decode-coding-string', and 'select-safe-coding-system' instead. ---- *** 'epg-context' structure supports now 'sender' slot. The value of the new 'sender' slot (if a string) is used to set gpg's "--sender" option. This feature is used by 'mml-secure-openpgp-sign-with-sender'. See gpg(1) manual page about "--sender" for more information. ---- ** Rmail -+++ *** New user option 'rmail-output-reset-deleted-flag'. If this option is non-nil, messages appended to an output file by the 'rmail-output' command have their Deleted flag reset. ---- *** The command 'rmail-summary-by-senders' with an empty argument selects the messages to summarize with a regexp that matches the sender of the current message. ** Threads -+++ *** New variable 'main-thread' holds Emacs's main thread. This is handy in Lisp programs that run on a non-main thread and want to signal the main thread, e.g., when they encounter an error. -+++ *** 'thread-join' now returns the result of the finished thread. -+++ *** 'thread-signal' does not propagate errors to the main thread. Instead, error messages are just printed in the main thread. ---- *** 'thread-alive-p' is now obsolete, use 'thread-live-p' instead. -+++ *** New command 'list-threads' shows Lisp threads. See the current list of live threads in a tabulated-list buffer which automatically updates. In the buffer, you can use 's q' or 's e' to @@ -2322,42 +1948,35 @@ backtrace with 'b'. ** thingatpt.el ---- *** 'thing-at-point' supports a new "thing" called 'uuid'. A symbol 'uuid' can be passed to 'thing-at-point' and it returns the UUID at point. ---- *** 'number-at-point' will now recognize hex numbers like 0xAb09 and #xAb09 and return them as numbers. ---- *** 'word-at-point' and 'sentence-at-point' accept NO-PROPERTIES. Just like 'thing-at-point' itself. ** Interactive automatic highlighting -+++ *** 'highlight-regexp' can now highlight subexpressions. The new command accepts a prefix numeric argument to choose the subexpression. ** Mouse display of minor mode menu ---- *** 'minor-mode-menu-from-indicator' now displays full minor mode name. When there is no menu for a mode, display the mode name after the indicator instead of just the indicator (which is sometimes cryptic). ** rx ---- *** rx now handles raw bytes in character alternatives correctly, when given in a string. Previously, '(any "\x80-\xff")' would match characters U+0080...U+00FF. Now the expression matches raw bytes in the 128...255 range, as expected. ---- *** The rx 'or' and 'seq' forms no longer require any arguments. '(or)' produces a regexp that never matches anything, while '(seq)' matches the empty string, each being an identity for the operation. @@ -2365,31 +1984,25 @@ This also works for their aliases: '|' for 'or'; ':', 'and' and 'sequence' for 'seq'. The symbol 'unmatchable' can be used as an alternative to '(or)'. ---- *** 'regexp' and new 'literal' accept arbitrary lisp as arguments. In this case, 'rx' will generate code which produces a regexp string at run time, instead of a constant string. ---- *** New rx extension mechanism: 'rx-define', 'rx-let', 'rx-let-eval'. These macros add new forms to the rx notation. -+++ *** 'anychar' is now an alias for 'anything'. Both match any single character; 'anychar' is more descriptive. -+++ *** New 'intersection' form for character sets. With 'or' and 'not', it can be used to compose character-matching expressions from simpler parts. -+++ *** 'not' now accepts more argument types. The argument can now also be a character, a single-character string, an 'intersection' form, or an 'or' form whose arguments each match a single character. -+++ *** Nested 'or' forms of strings guarantee a longest match. For example, '(or (or "IN" "OUT") (or "INPUT" "OUTPUT"))' now matches the whole string "INPUT" if present, not just "IN". Previously, this @@ -2397,15 +2010,12 @@ was only guaranteed inside a single 'or' form of string literals. ** Frames -+++ *** New command 'make-frame-on-monitor' makes a frame on the specified monitor. -+++ *** New value of 'minibuffer' frame parameter 'child-frame'. This allows creating and immediately parenting a minibuffer-only child frame when making a frame. ---- *** New predicates 'display-blink-cursor-p' and 'display-symbol-keys-p'. These predicates are to be preferred over 'display-graphic-p' when testing for blinking cursor capability and the capability to have @@ -2413,7 +2023,6 @@ symbols (e.g., '[return]', '[tab]', '[backspace]') as keys respectively. ** Tabulated List mode -+++ *** New user options for tabulated list sort indicators. You can now customize which sorting indicator character to display near the current column in Tabulated Lists (see user options @@ -2422,52 +2031,42 @@ near the current column in Tabulated Lists (see user options 'tabulated-list-tty-sort-indicator-asc', and 'tabulated-list-tty-sort-indicator-desc'). -+++ *** Two new commands and keystrokes have been added to the tabulated list mode: 'w' (which widens the current column) and 'c' which makes the current column contract. -+++ *** New function 'tabulated-list-clear-all-tags'. This function clears all tags from the padding area in the current buffer. Tags are typically added by calling 'tabulated-list-put-tag'. ** Text mode -+++ *** 'text-mode-variant' is now obsolete, use 'derived-mode-p' instead. ** CUA mode ---- *** New user option 'cua-rectangle-terminal-modifier-key'. This user option allows for the customization of the modifier key used in a terminal frame. ** JS mode ---- *** JSX syntax is now automatically detected and enabled. If a file imports Facebook's 'React' library, or if the file uses the extension ".jsx", then various features supporting XML-like syntax will be supported in 'js-mode' and derivative modes. ('js-jsx-mode' no longer needs to be enabled.) ---- *** New user option 'js-jsx-detect-syntax' disables automatic detection. This is turned on by default. ---- *** New user option 'js-jsx-syntax' enables JSX syntax unconditionally. This is off by default. ---- *** New variable 'js-jsx-regexps' controls JSX detection. ---- *** JSX syntax is now highlighted like SGML. ---- *** JSX code is properly indented in many more scenarios. Previously, JSX indentation usually only worked when an element was wrapped in parenthesis (e.g. in a 'return' statement or a function @@ -2477,7 +2076,6 @@ supported; and, indentation conventions align more closely with those of the React developer community (see 'js-jsx-align->-with-<'), otherwise still adhering to SGML conventions. ---- *** New user option 'js-jsx-align->-with-<' controls '>' indents. Commonly in JSX code, a '>' on its own line is indented at the same level as its opening '<'. This is the new default for JSX. This @@ -2489,7 +2087,6 @@ This is turned on by default. To get back the old default indentation behavior of aligning '>' with attributes, set 'js-jsx-align->-with-<' to nil. ---- *** Indentation uses 'js-indent-level' instead of 'sgml-basic-offset'. Since JSX is a syntax extension of JavaScript, it makes the most sense for JSX expressions to be indented the same number of spaces as other @@ -2500,21 +2097,17 @@ be indented like JS, you won't need to change your config. The old behavior can be emulated by controlling JSX indentation independently of JS, by setting 'js-jsx-indent-level'. ---- *** New user option 'js-jsx-indent-level' for different JSX indentation. If you wish to indent JSX by a different number of spaces than JS, set this user option to the desired number. ---- *** New user option 'js-jsx-attribute-offset' for JSX attribute indents. ---- *** New variable 'js-syntactic-mode-name' controls mode name display. Previously, the mode name was simply 'JavaScript'. Now, when a syntax extension like JSX is enabled, the mode name is 'JavaScript[JSX]'. Set this variable to nil to disable the new behavior. ---- *** New function 'js-use-syntactic-mode-name' for deriving modes. Packages deriving from 'js-mode' with 'define-derived-mode' should call this function to add enabled syntax extensions to their mode @@ -2522,7 +2115,6 @@ name, too. ** Autorevert -+++ *** New user option 'auto-revert-avoid-polling' for saving power. When set to a non-nil value, buffers in Auto Revert mode are no longer polled for changes periodically. This reduces the power consumption @@ -2530,7 +2122,6 @@ of an idle Emacs, but may fail on some network file systems; set 'auto-revert-notify-exclude-dir-regexp' to match files where notification is not supported. The default value is nil. -+++ *** New variable 'buffer-auto-revert-by-notification'. A major mode can declare that notification on the buffer's default directory is sufficient to know when updates are required, by setting @@ -2538,41 +2129,33 @@ the new variable 'buffer-auto-revert-by-notification' to a non-nil value. Auto Revert mode can use this information to avoid polling the buffer periodically when 'auto-revert-avoid-polling' is non-nil. ---- *** 'global-auto-revert-ignore-buffer' can now also be a predicate function that can be used for more fine-grained control of which buffers to auto-revert. ** auth-source-pass -+++ *** New user option 'auth-source-pass-filename'. Allows setting the path to the password-store, defaults to "~/.password-store". -+++ *** New user option 'auth-source-pass-port-separator'. Specifies separator between host and port, defaults to colon ":". ---- *** Minimize the number of decryptions during password lookup. This makes the package usable with physical tokens requiring touching a sensor for every decryption. ---- *** 'auth-source-pass-get' is now autoloaded. ** Bookmarks ---- *** 'bookmark-file' and 'bookmark-old-default-file' are now obsolete aliases of 'bookmark-default-file'. ---- *** New user option 'bookmark-watch-bookmark-file'. When non-nil, watch whether the bookmark file has changed on disk. ---- *** The old bookmark file format is no longer supported. This bookmark file format has not been used in Emacs since at least version 19.34, released in 1996, and will no longer be automatically @@ -2584,14 +2167,12 @@ The following functions are now declared obsolete: 'bookmark-upgrade-file-format-from-0', and 'bookmark-upgrade-version-0-alist'. ---- ** The mantemp.el library is now marked obsolete. This library generates manual C++ template instantiations. It should no longer be useful on modern compilers, which do this automatically. ** Ispell ---- *** New hook 'ispell-change-dictionary-hook'. This runs after changing the dictionary and could be used to automatically spellcheck a buffer when changing language without @@ -2599,43 +2180,36 @@ needing to advice 'ispell-change-dictionary'. ** scroll-lock ---- *** New command 'scroll-lock-next-line-always-scroll'. This command is bound to 'S-down' and scrolls the buffer up in particular when the end of the buffer is visible in the window. ** mwheel.el ---- *** 'mwheel-install' is now obsolete. Use 'mouse-wheel-mode' instead. Note that 'mouse-wheel-mode' is already enabled by default on most graphical displays. ** Gravatar -+++ *** 'gravatar-cache-ttl' is now a number of seconds. The previously used timestamp format of a list of integers is still supported, but is deprecated. The default value has not changed. -+++ *** 'gravatar-size' can now be nil. This results in the use of Gravatar's default size of 80 pixels. -+++ *** The default fallback gravatar is now configurable. This is possible using the new user options 'gravatar-default-image' and 'gravatar-force-default'. ** ada-mode ---- *** The built-in ada-mode is now deleted. The GNU ELPA package is a good replacement, even in very large source files. ** time-stamp ---- *** New '%5z' conversion for 'time-stamp-format' gives time zone offset. Specifying '%5z' in 'time-stamp-format' or 'time-stamp-pattern' expands to the time zone offset, e.g., '+0100'. The time zone used is @@ -2645,7 +2219,6 @@ Because this feature is new in Emacs 27.1, do not use it in the local variables section of any file that might be edited by an older version of Emacs. ---- *** Some conversions recommended for 'time-stamp-format' have changed. The new documented/recommended %-conversions are closer to those used by 'format-time-string' and are compatible at least as far back @@ -2669,15 +2242,12 @@ file-local variable, you may need to update the value. ** mode-local ---- *** Declare 'define-overload' and 'define-child-mode' as obsolete. ---- *** Rename several internal functions to use a 'mode-local-' prefix. ** CC Mode -+++ *** You can now flag "wrong style" comments with 'font-lock-warning-face'. To do this, use 'c-toggle-comment-style', if needed, to set the desired default comment style (block or line); then set the user option @@ -2685,12 +2255,10 @@ default comment style (block or line); then set the user option ** Mailcap ---- *** The new function 'mailcap-file-name-to-mime-type' has been added. It's a simple convenience function for looking up MIME types based on file name extensions. ---- *** The default way the list of possible external viewers for MIME types is sorted and chosen has changed. Earlier, the most specific viewer was chosen, even if there was a general override in "~/.mailcap". @@ -2702,7 +2270,6 @@ method back, set 'mailcap-prefer-mailcap-viewers' to nil. ** MH-E -+++ *** The hook 'mh-show-mode-hook' is now called before the message is inserted. Functions that want to affect the message text (for example, to change highlighting) can no longer use 'mh-show-mode-hook', because the @@ -2711,7 +2278,6 @@ called. Such functions should now be attached to 'mh-show-hook'. ** URL ---- *** The 'file:' handler no longer looks for "index.html" in directories if you ask it for a "file:///dir" URL. Since this is a low-level library, such decisions (if they are to be made at all) are @@ -2722,7 +2288,6 @@ left to higher-level functions. ** Tab Bars -+++ *** Tab Bar mode The new command 'tab-bar-mode' enables the tab bar at the top of each frame (including TTY frames), where you can use tabs to switch between @@ -2751,7 +2316,6 @@ using completion on tab names, or using 'tab-switcher'. Read the new Info node "(emacs) Tab Bars" for full description of all related features. -+++ *** Tab Line mode The new command 'global-tab-line-mode' enables the tab line above each window, which you can use to switch buffers in the window. Selecting @@ -2765,16 +2329,13 @@ line scrolls tabs. Read the new Info node "(emacs) Tab Line" for full description of all related features. -+++ ** fileloop.el lets one setup multifile operations like search&replace. -+++ ** Emacs can now visit files in archives as if they were directories. This feature uses Tramp and works only on systems which support GVFS, i.e. GNU/Linux, roughly spoken. See the node "(tramp) Archive file names" in the Tramp manual for full documentation of these facilities. -+++ ** New library for writing JSONRPC applications (https://jsonrpc.org). The 'jsonrpc' library enables writing Emacs Lisp applications that rely on this protocol. Since the protocol is designed to be @@ -2783,14 +2344,12 @@ transport strategies as well as a separate API to use them. A transport implementation for process-based communication, such as is used by the Language Server Protocol (LSP), is readily available. -+++ ** Backtrace mode improves viewing of Elisp backtraces. Backtrace mode adds pretty printing, fontification and ellipsis expansion to backtrace buffers produced by the Lisp debugger, Edebug and ERT. See the node "(elisp) Backtraces" in the Elisp manual for documentation of the new mode and its commands. -+++ ** so-long.el helps to mitigate performance problems with long lines. When 'global-so-long-mode' has been enabled, visiting a file with very long lines will (subject to configuration) cause the user's preferred @@ -2802,7 +2361,6 @@ immediately. Type 'M-x so-long-commentary' for full documentation. * Incompatible Lisp Changes in Emacs 27.1 ---- ** Incomplete destructive splicing support has been removed. Support for Common Lisp style destructive splicing (",.") was incomplete and broken for a long time. It has now been removed. @@ -2815,11 +2373,9 @@ starting with a period ("."). Consider the following example: In the past, this would have incorrectly evaluated to '(\,\. foo)', but will now instead evaluate to '42'. ---- ** The REGEXP in 'magic-mode-alist' is now matched case-sensitively. Likewise for 'magic-fallback-mode-alist'. -+++ ** 'add-hook' does not always add to the front or the end any more. The replacement of 'append' with 'depth' implies that the function is not always added to the very front (when append/depth is nil) or the @@ -2828,15 +2384,12 @@ the hook may have specified higher/lower depths. This makes it possible to control the ordering of functions more precisely, as was already possible in 'add-function' and 'advice-add'. ---- ** In 'compilation-error-regexp-alist' the old undocumented feature where 'line' could be a function of 2 arguments has been dropped. ---- ** 'define-fringe-bitmap' is always defined, even when Emacs is built without any GUI support. ---- ** Just loading a theme's file no longer activates the theme's settings. Loading a theme with 'M-x load-theme' still activates the theme, as it did before. However, loading the theme's file with 'M-x load-file', @@ -2852,10 +2405,8 @@ default applied immediately. The variable 'custom--inhibit-theme-enable' controls this behavior; its default value changed in Emacs 27.1. ---- ** The REPETITIONS argument of 'benchmark-run' can now also be a variable. ---- ** Interpretation of relative 'HOME' directory has changed. If "$HOME" is set to a relative file name, 'expand-file-name' now interprets it relative to the directory where Emacs was started, not @@ -2863,15 +2414,12 @@ relative to the 'default-directory' of the current buffer. We recommend always setting "$HOME" to an absolute file name, so that its meaning is independent of where Emacs was started. ---- ** 'file-name-absolute-p' no longer considers "~foo" to be an absolute file name if there is no user named "foo". -+++ ** The FILENAME argument to 'file-name-base' is now mandatory and no longer defaults to 'buffer-file-name'. -+++ ** File metadata primitives now signal an error if I/O, access, or other serious errors prevent them from determining the result. Formerly, these functions often (though not always) silently returned @@ -2884,35 +2432,29 @@ file does not exist. The affected primitives are 'file-modes', 'file-newer-than-file-p', 'file-selinux-context', 'file-system-info', and 'set-visited-file-modtime'. ---- ** The function 'eldoc-message' now accepts a single argument. Programs that called it with multiple arguments before should pass them through 'format' first. Even that is discouraged: for ElDoc support, you should set 'eldoc-documentation-function' instead of calling 'eldoc-message' directly. ---- ** Old-style backquotes now generate an error. They have been generating warnings for a decade. To interpret old-style backquotes as new-style, bind the new variable 'force-new-style-backquotes' to t. ---- ** Defining a Common Lisp structure using 'cl-defstruct' or 'cl-struct-define' whose name clashes with a builtin type (e.g., 'integer' or 'hash-table') now signals an error. ---- ** When formatting a floating-point number as an octal or hexadecimal integer, Emacs now signals an error if the number is too large for the implementation to format. -+++ ** 'logb' now returns infinity when given an infinite or zero argument, and returns a NaN when given a NaN. Formerly, it returned an extreme fixnum for such arguments. ---- ** Some functions and variables obsolete since Emacs 22 have been removed: 'archive-mouse-extract', 'assoc-ignore-case', 'assoc-ignore-representation', 'backward-text-line', 'blink-cursor', 'bookmark-exit-hooks', @@ -2950,28 +2492,24 @@ fixnum for such arguments. 'vc-previous-comment', 'view-todo', 'x-lost-selection-hooks', 'x-sent-selection-hooks'. ---- ** Further functions and variables obsolete since Emacs 24 have been removed: 'default-directory-alist', 'dired-default-directory', 'dired-default-directory-alist', 'dired-enable-local-variables', 'dired-hack-local-variables', 'dired-local-variables-file', 'dired-omit-here-always'. -+++ ** Garbage collection no longer treats miscellaneous objects specially; they are now allocated like any other pseudovector. As a result, the 'garbage-collect' and 'memory-use-count' functions no longer return a 'misc' component, and the 'misc-objects-consed' variable has been removed. -+++ ** Reversed character ranges are no longer permitted in 'rx'. Previously, ranges where the starting character is greater than the ending character were silently omitted. For example, '(rx (any "@z-a" (?9 . ?0)))' would match '@' only. Now, such 'rx' expressions generate an error. ---- ** Internal 'rx' functions and variables have been removed, as a consequence of an improved implementation. Packages using these should use the public 'rx' and 'rx-to-string' instead. @@ -2979,7 +2517,6 @@ these should use the public 'rx' and 'rx-to-string' instead. extension mechanism is preferred: 'rx-define', 'rx-let' and 'rx-let-eval'. -+++ ** 'text-mode' no longer sets the value of 'indent-line-function'. The global value of 'indent-line-function', which defaults to 'indent-relative', will no longer be reset locally when turning on @@ -2988,28 +2525,22 @@ The global value of 'indent-line-function', which defaults to To get back the old behavior, add a function to 'text-mode-hook' which performs '(setq-local indent-line-function #'indent-relative)'. ---- ** 'make-process' no longer accepts a non-nil ':stop' key. This has never worked reliably, and now causes an error. -+++ ** 'eventp' no longer returns non-nil for lists whose car is nil. This is consistent with the fact that nil, though a symbol, is not a valid event type. ---- ** The obsolete package xesam.el (since Emacs 24) has been removed. -+++ ** The XBM image handler now accepts a ':stride' argument, which should be specified in image specs representing the entire bitmap as a single bool vector. -+++ ** 'regexp-quote' may return its argument string. If the argument needs no quoting, it can be returned instead of a copy. -+++ ** Mouse scroll up and down with control key modifier changes font size. Previously, the control key modifier was used to scroll up or down by an amount which was close to near a full screen. This is now instead @@ -3026,24 +2557,19 @@ pointer is over. To change this behavior, you can customize the user option 'mouse-wheel-follow-mouse'. Note that this will also affect scrolling. -+++ ** Mouse scroll up and down with control key modifier also works on images where it scales the image under the mouse pointer. ---- ** 'help-follow-symbol' now signals 'user-error' if point (or the position pointed to by the argument POS) is not in a symbol. ---- ** The options.el library has been removed. It was obsolete since Emacs 22.1, replaced by customize. ---- ** The tls.el and starttls.el libraries are now marked obsolete. Use of built-in libgnutls based functionality (described in the Emacs GnuTLS manual) is recommended instead. ---- ** The url-ns.el library is now marked obsolete. This library is used to open configuration files for the long defunct web browser Netscape, and is no longer relevant. @@ -3051,7 +2577,6 @@ web browser Netscape, and is no longer relevant. * Lisp Changes in Emacs 27.1 -+++ ** Emacs Lisp integers can now be of arbitrary size. Emacs uses the GNU Multiple Precision (GMP) library to support integers whose size is too large to support natively. The integers @@ -3079,20 +2604,17 @@ like 'file-attributes' that compute file sizes and other attributes, functions like 'process-id' that compute process IDs, and functions like 'user-uid' and 'group-gid' that compute user and group IDs. -+++ ** 'overflow-error' is now documented as a subcategory of 'range-error'. Formerly it was undocumented, and was (incorrectly) a subcategory of 'domain-error'. ** Time values -+++ *** New function 'time-convert' converts Lisp time values to Lisp timestamps of various forms, including a new timestamp form '(TICKS . HZ)' where TICKS is an integer and HZ a positive integer denoting a clock frequency. -+++ *** Although the default timestamp format is still '(HI LO US PS)', it is planned to change in a future Emacs version, to exploit bignums. The documentation has been updated to mention that the timestamp @@ -3101,7 +2623,6 @@ format may change and that programs should use functions like probing the innards of a timestamp directly, or creating a timestamp by hand. -+++ *** Decoded (calendrical) timestamps now have subsecond resolution. This affects 'decode-time', which generates these timestamps, as well as functions like 'encode-time' that accept them. The subsecond info @@ -3118,11 +2639,9 @@ traditional behavior, this default may change in future Emacs versions, so callers requiring an integer should specify FORM explicitly. -+++ *** 'encode-time' supports a new API '(encode-time TIME)'. The old 'encode-time' API is still supported. -+++ *** A new package to parse ISO 8601 time, date, durations and intervals has been added. The main function to use is 'iso8601-parse', but there's also 'iso8601-parse-date', @@ -3131,30 +2650,25 @@ intervals has been added. The main function to use is structures, except the final one, which returns three of them (start, end and duration). -+++ *** 'time-add', 'time-subtract', and 'time-less-p' now accept infinities and NaNs too, and propagate them or return nil like floating-point operators do. If both arguments are finite, these functions now return exact results instead of rounding in some cases, and they also avoid excess precision when that is easy. -+++ *** New function 'time-equal-p' compares time values for equality. -+++ *** 'format-time-string' supports a new conversion specifier flag '+' that acts like the '0' flag but also puts a '+' before nonnegative years containing more than four digits. This is for compatibility with POSIX.1-2017. -+++ *** To access (or alter) the elements of a decoded time value, the 'decoded-time-second', 'decoded-time-minute', 'decoded-time-hour', 'decoded-time-day', 'decoded-time-month', 'decoded-time-year', 'decoded-time-weekday', 'decoded-time-dst' and 'decoded-time-zone' accessors can be used. -+++ *** The new functions 'date-days-in-month' (which will say how many days there are in a month in a specific year), 'date-ordinal-to-time' (that computes the date of an ordinal day), 'decoded-time-add' (for @@ -3163,7 +2677,6 @@ doing computations on a decoded time structure), 'make-decoded-time' filled out), and 'encoded-time-set-defaults' (which fills in nil elements as if it's midnight January 1st, 1970) have been added. -+++ *** In the DST slot, 'encode-time' and 'parse-time-string' now return -1 if it is not known whether daylight saving time is in effect. Formerly they were inconsistent: 'encode-time' returned t in this @@ -3171,38 +2684,31 @@ situation, whereas 'parse-time-string' returned nil. Now they consistently use nil to mean that DST is not in effect, and use -1 to mean that it is not known whether DST is in effect. -+++ ** New macro 'benchmark-progn'. This macro works like 'progn', but messages how long it takes to evaluate the body forms. The value of the last form is the return value. -+++ ** New function 'read-char-from-minibuffer'. This function works like 'read-char', but uses 'read-from-minibuffer' to read a character, so it maintains a history that can be navigated via usual minibuffer keystrokes 'M-p'/'M-n'. ---- ** New variables 'set-message-function' and 'clear-message-function' can be used to specify functions to show and clear messages that normally are displayed in the echo area. -+++ ** 'setq-local' can now set an arbitrary number of variables, which makes the syntax more like 'setq'. ---- ** 'reveal-mode' can now also be used for more than to toggle between invisible and visible: It can also toggle 'display' properties in overlays. This is only done on 'display' properties that have the 'reveal-toggle-invisible' property set. -+++ ** 'process-contact' now takes an optional NO-BLOCK argument to allow not waiting for a process to be set up. ---- ** New variable 'read-process-output-max' controls sub-process throughput. This variable determines how many bytes can be read from a sub-process in one read operation. The default, 4096 bytes, was previously a @@ -3210,118 +2716,94 @@ hard-coded constant. Setting it to a larger value might enhance throughput of reading from sub-processes that produces vast (megabytes) amounts of data in one go. -+++ ** The new user option 'quit-window-hook' is now run first when executing the 'quit-window' command. -+++ ** The user options 'help-enable-completion-auto-load', 'help-enable-auto-load' and 'vhdl-project-auto-load', as well as the function 'vhdl-auto-load-project' have been renamed to have "autoload" without the hyphen in their names. Obsolete aliases from the old names have been added. -+++ ** Buttons (created with 'make-button' and related functions) can now use the 'button-data' property. If present, the data in this property will be passed on to the 'action' function instead of the button itself in 'button-activate'. -+++ ** 'defcustom' now takes a ':local' keyword that can be either t or 'permanent', which mean that the variable should be automatically buffer-local. 'permanent' also sets the variable's 'permanent-local' property. -+++ ** The new macro 'with-suppressed-warnings' can be used to suppress specific byte-compile warnings. -+++ ** The new macro 'ignore-error' is like 'ignore-errors', but takes a specific error condition, and will only ignore that condition. (This can also be a list of conditions.) ---- ** The new function 'byte-compile-info-message' can be used to output informational messages that look pleasing during the Emacs build. ---- ** New 'help-fns-describe-variable-functions' hook. It makes it possible to add metadata information to 'describe-variable'. ** i18n (internationalization) ---- *** 'ngettext' can be used now to return the right plural form according to the given numeric value. -+++ ** 'inhibit-null-byte-detection' is renamed to 'inhibit-nul-byte-detection'. -+++ ** 'self-insert-command' takes the char to insert as (optional) argument. -+++ ** 'lookup-key' can take a list of keymaps as argument. -+++ ** 'condition-case' now accepts t to match any error symbol. -+++ ** New function 'proper-list-p'. Given a proper list as argument, this predicate returns its length; otherwise, it returns nil. 'format-proper-list-p' is now an obsolete alias for the new function. ---- ** 'define-minor-mode' automatically documents the meaning of ARG. -+++ ** The function 'recenter' now accepts an additional optional argument. By default, calling 'recenter' will not redraw the frame even if 'recenter-redisplay' is non-nil. Call 'recenter' with the new second argument non-nil to force redisplay per 'recenter-redisplay's value. -+++ ** New functions 'major-mode-suspend' and 'major-mode-restore'. Use them when switching temporarily to another major mode, e.g. for 'hexl-mode', or to switch between 'c-mode' and 'image-mode' in XPM. -+++ ** New macro 'dolist-with-progress-reporter'. This works like 'dolist', but reports progress similar to 'dotimes-with-progress-reporter'. -+++ ** New hook 'after-delete-frame-functions'. This works like 'delete-frame-functions', but runs after the frame to be deleted has been made dead and removed from the frame list. ---- ** The function 'provided-mode-derived-p' was extended to support aliases. The function now returns non-nil when the argument MODE is derived from any alias of any of MODES. -+++ ** New frame focus state inspection interface. The hooks 'focus-in-hook' and 'focus-out-hook' are now obsolete. Instead, attach to 'after-focus-change-function' using 'add-function' and inspect the focus state of each frame using 'frame-focus-state'. -+++ ** Emacs now requests and recognizes focus-change notifications from TTYs. On terminal emulators that support the feature, Emacs can now support 'focus-in-hook' and 'focus-out-hook' for TTY frames. -+++ ** Window-specific face remapping. Face specifications (of the kind used in 'face-remapping-alist') now support filters, allowing faces to vary between different windows displaying the same buffer. See the node "(elisp) Face Remapping" of the Emacs Lisp Reference manual for more detail. -+++ ** Window change functions have been redesigned. Hooks reacting to window changes run now only when redisplay detects that a change has actually occurred. Six hooks are now provided: @@ -3351,55 +2833,44 @@ Also 'run-window-configuration-change-hook' is declared obsolete. See the section "(elisp) Window Hooks" in the Elisp manual for a detailed explanation of the new behavior. -+++ ** Scroll bar and fringe settings can now be made persistent for windows. The functions 'set-window-scroll-bars' and 'set-window-fringes' now have a new optional argument that makes the settings they produce reliably survive subsequent invocations of 'set-window-buffer'. -+++ ** New user option 'resize-mini-frames'. This option allows automatically resizing minibuffer-only frames similarly to how minibuffer windows are resized on "normal" frames. -+++ ** New buffer display action function 'display-buffer-in-direction'. This function allows specifying the location of the window chosen by 'display-buffer' in various ways. -+++ ** New buffer display action alist entry 'dedicated'. Such an entry allows specifying the dedicated status of a window created by 'display-buffer'. -+++ ** New buffer display action alist entry 'window-min-height'. Such an entry allows specifying a minimum height of the window used for displaying a buffer. 'display-buffer-below-selected' is the only action function to respect it at the moment. -+++ ** New buffer display action alist entry 'direction'. This entry is used to specify the location of the window chosen by 'display-buffer-in-direction'. -+++ ** Additional meaning of display action alist entry 'window'. A 'window' entry can now also specify a reference window for 'display-buffer-in-direction'. -+++ ** The function 'assoc-delete-all' now takes an optional predicate argument. -+++ ** New function 'string-distance' to calculate the Levenshtein distance between two strings. -+++ ** 'print-quoted' now defaults to t, so if you want to see '(quote x)' instead of 'x you will have to bind it to nil where applicable. -+++ ** Numbers formatted via '%o' or '%x' are now formatted as signed integers. This avoids problems in calls like '(read (format "#x%x" -1))', and is more compatible with bignums. To get the traditional machine-dependent @@ -3408,12 +2879,10 @@ and if the new behavior breaks your code please email <32252@debbugs.gnu.org>. Because '%o' and '%x' can now format signed integers, they now support the '+' and space flags. -+++ ** In Emacs Lisp mode, symbols with confusable quotes are highlighted. For example, the first character in '‘foo' would be highlighted in 'font-lock-warning-face'. -+++ ** Omitting variables after '&optional' and '&rest' is now allowed. For example '(defun foo (&optional))' is no longer an error. This is sometimes convenient when writing macros. See the ChangeLog entry @@ -3421,7 +2890,6 @@ titled "Allow '&rest' or '&optional' without following variable (Bug#29165)" for a full listing of which arglists are accepted across versions. ---- ** Internal parsing commands now use 'syntax-ppss' and disregard 'open-paren-in-column-0-is-defun-start'. This affects mostly things like 'forward-comment', 'scan-sexps', and 'forward-sexp' when parsing backward. @@ -3432,7 +2900,6 @@ brackets at the start of a line inside documentation strings with a backslash, although there is no harm in doing so to make the code easier to edit with an older Emacs version. ---- ** New symbolic accessor functions for a parse state list. The new accessor functions 'ppss-depth', 'ppss-list-start', 'ppss-last-sexp-start', 'ppss-string-terminator', 'comment-depth', @@ -3440,37 +2907,30 @@ The new accessor functions 'ppss-depth', 'ppss-list-start', and 'two-character-syntax' can be used on the list value returned by 'parse-partial-sexp' and 'syntax-ppss'. ---- ** The 'server-name' and 'server-socket-dir' variables are set when a socket has been passed to Emacs. ---- ** The 'file-system-info' function is now available on all platforms. instead of just Microsoft platforms. This fixes a 'get-free-disk-space' bug on OS X 10.8 and later. ---- ** The function 'get-free-disk-space' returns now a non-nil value for remote systems, which support this check. -+++ ** 'memory-limit' now returns a better estimate of memory consumption. -+++ ** When interpreting 'gc-cons-percentage', Emacs now estimates the heap size more often and (we hope) more accurately. E.g., formerly '(progn (let ((gc-cons-percentage 0.8)) BODY1) BODY2)' continued to use the 0.8 value during BODY2 until the next garbage collection, but that is no longer true. Applications may need to re-tune their GC tricks. -+++ ** New macro 'combine-change-calls' arranges to call the change hooks ('before-change-functions' and 'after-change-functions') just once each around a sequence of lisp forms, given a region. This is useful when a function makes a possibly large number of repetitive changes and the change hooks are time consuming. -+++ ** 'eql', 'make-hash-table', etc. now treat NaNs consistently. Formerly, some of these functions ignored signs and significands of NaNs. Now, all these functions treat NaN signs and significands as @@ -3480,36 +2940,29 @@ Also, Emacs now reads and prints NaN significands; e.g., if X is a NaN, '(format "%s" X)' now returns "0.0e+NaN", "1.0e+NaN", etc., depending on X's significand. -+++ ** The function 'make-string' accepts an additional optional argument. If the optional third argument is non-nil, 'make-string' will produce a multibyte string even if its second argument is an ASCII character. ---- ** '(format "%d" X)' no longer mishandles a floating-point number X that does not fit in a machine integer. ---- ** New coding-system 'ibm038'. This is the International EBCDIC encoding, also available as aliases 'ebcdic-int' and 'cp038'. ---- ** New JSON parsing and serialization functions 'json-serialize', 'json-insert', 'json-parse-string', and 'json-parse-buffer'. These are implemented in C using the Jansson library. -+++ ** New function 'ring-resize'. 'ring-resize' can be used to grow or shrink a ring. -+++ ** New function 'flatten-tree'. 'flatten-list' is provided as an alias. These functions take a tree and 'flatten' it such that the result is a list of all the terminal nodes. -+++ ** 'zlib-decompress-region' can partially decompress corrupted data. If the new optional ALLOW-PARTIAL argument is passed, then the data that was decompressed successfully before failing will be inserted @@ -3517,23 +2970,19 @@ into the buffer. ** Image mode ---- *** New library Exif. An Exif library has been added that can parse JPEG files and output data about creation times and orientation and the like. 'exif-parse-file' and 'exif-parse-buffer' are the main interface functions. ---- *** 'image-mode' now uses this library to automatically rotate images according to the orientation in the Exif data, if any. -+++ *** The command 'image-rotate' now accepts a prefix argument. With a prefix argument, 'image-rotate' now rotates the image at point 90 degrees counter-clockwise, instead of the default clockwise. -+++ *** In 'image-mode' the image is resized automatically to fit in window. By default, the image will resize upon first display and whenever the window's dimensions change. Two user options 'image-auto-resize' and @@ -3542,20 +2991,17 @@ window's dimensions change. Two user options 'image-auto-resize' and key 's' contains the commands that can be used to fit the image to the window manually. ---- *** Some 'image-mode' variables are now buffer-local. The image parameters 'image-transform-rotation', 'image-transform-scale' and 'image-transform-resize' are now declared buffer-local, so each buffer could have its own values for these parameters. -+++ *** Three new 'image-mode' commands have been added: 'm', which marks the file in the dired buffer(s) for the directory the file is in; 'u', which unmarks the file; and 'w', which pushes the current buffer's file name to the kill ring. ---- *** New library image-converter. If you need to view exotic image formats for which Emacs doesn't have native support, customize the new user option @@ -3563,12 +3009,10 @@ native support, customize the new user option GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be used to convert images automatically before displaying them. ---- *** 'auto-mode-alist' now includes many of the types typically supported by the external image converters, like WEPB, BMP and ICO. These now default to using 'image-mode'. ---- *** 'imagemagick-types-inhibit' disables using ImageMagick by default. 'image-mode' started using ImageMagick by default for all images some years back. It now respects 'imagemagick-types-inhibit' as a way @@ -3576,66 +3020,53 @@ to disable that. ** Modules ---- *** The function 'load' now behaves correctly when loading modules. Specifically, it puts the module name into 'load-history', prints loading messages if requested, and protects against recursive loads. -+++ *** New module environment function 'process_input' to process user input while module code is running. -+++ *** New module environment functions 'make_time' and 'extract_time' to convert between timespec structures and Emacs Lisp time values. -+++ *** New module environment functions 'make_big_integer' and 'extract_big_integer' to create and extract arbitrary-size integer values. -+++ *** emacs-module.h now defines a macro 'EMACS_MAJOR_VERSION' that expands to the major version of the latest Emacs supported by the header. -+++ ** The function 'read-variable' now uses its own history list. The history of variable names read by 'read-variable' is recorded in the new variable 'custom-variable-history'. ---- ** The functions 'string-to-unibyte' and 'string-to-multibyte' are no longer declared obsolete. We have found that there are legitimate use cases for these functions, where there's no better alternative. We believe that the incorrect uses of these functions all but disappeared by now, so we are un-obsoleting them. -+++ ** New function 'group-name' returns a group name corresponding to GID. -+++ ** 'make-process' now takes a keyword argument ':file-handler'; if that is non-nil, it will look for a file name handler for the current buffer's 'default-directory' and invoke that file name handler to make the process. That way 'make-process' can start remote processes. -+++ ** '(locale-info 'paper)' now returns the paper size on systems that support it. This is currently supported on GNUish hosts and on modern versions of MS-Windows. -+++ ** The function 'regexp-opt', when given an empty list of strings, now returns a regexp that never matches anything, which is an identity for this operation. Previously, the empty string was returned in this case. -+++ ** New constant 'regexp-unmatchable' contains a never-matching regexp. It is a convenient and readable way to specify a regexp that should not match anything, and is as fast as any such regexp can be. -+++ ** New functions to handle the URL variant of base-64 encoding. New functions 'base64url-encode-string' and 'base64url-encode-region' implement the url-variant of base-64 encoding as defined in RFC4648. @@ -3644,7 +3075,6 @@ The functions 'base64-decode-string' and 'base64-decode-region' now accept an optional argument to decode the URL variant of base-64 encoding. -+++ ** The function 'file-size-human-readable' accepts more optional arguments. The new third argument is a string put between the number and unit; it defaults to the empty string. The new fourth argument is a string @@ -3653,82 +3083,68 @@ argument is 'iec' and the empty string otherwise. We recommend a space or non-breaking space as third argument, and "B" as fourth argument, circumstances allowing. -+++ ** 'format-spec' has been expanded with several modifiers to allow greater flexibility when customizing variables. The modifiers include zero-padding, upper- and lower-casing, and limiting the length of the interpolated strings. The function has now also been documented in the Emacs Lisp manual. -+++ ** 'directory-files-recursively' can now take an optional PREDICATE parameter to control descending into subdirectories, and a FOLLOW-SYMLINK parameter to say that symbolic links that point to other directories should be followed. -+++ ** New function 'xor' returns the boolean exclusive-or of its args. The function was previously defined in array.el, but has been moved to subr.el so that it is available by default. It now always returns the non-nil argument when the other is nil. Several duplicates of 'xor' in other packages are now obsolete aliases of 'xor'. -+++ ** 'define-globalized-minor-mode' now takes BODY forms. -+++ ** New text property 'help-echo-inhibit-substitution'. Setting this on the first character of a help string disables conversions via 'substitute-command-keys'. -+++ ** New text property 'minibuffer-message'. Setting this on a character of the minibuffer text will display the temporary echo messages before that character, when messages need to be displayed while minibuffer is active. -+++ ** 'undo' can be made to ignore the active region for a command by setting 'undo-inhibit-region' symbol property of that command to non-nil. This is used by 'mouse-drag-region' to make the effect easier to undo immediately afterwards. ---- ** When called interactively, 'next-buffer' and 'previous-buffer' now signal 'user-error' if there is no buffer to switch to. * Changes in Emacs 27.1 on Non-Free Operating Systems ---- ** Battery status is now supported in all Cygwin builds. Previously it was supported only in the Cygwin-w32 build. ---- ** Emacs now handles key combinations involving the macOS "command" and "option" modifier keys more correctly. -+++ ** MacOS modifier key behavior is now more adjustable. The behavior of the macOS "Option", "Command", "Control" and "Function" keys can now be specified separately for use with ordinary keys, function keys and mouse clicks. This allows using them in their standard macOS way for composing characters. -+++ ** The special handling of 'frame-title-format' on NS where setting it to t would enable the macOS proxy icon has been replaced with a separate variable, 'ns-use-proxy-icon'. 'frame-title-format' will now work as on other platforms. ---- ** New primitive 'w32-read-registry'. This primitive lets Lisp programs access the MS-Windows Registry by retrieving values stored under a given key. It is intended to be used for supporting features such as XDG-like location of important files and directories. -+++ ** The default value of 'w32-pipe-read-delay' is now zero. This speeds up reading output from sub-processes that produce a lot of data. @@ -3739,7 +3155,6 @@ versions of MS-Windows. Set this variable to 50 if for some reason you need the old behavior (and please report such situations to Emacs developers). ---- ** New variable 'w32-multibyte-code-page'. This variable holds the value of the multibyte code page used by the system. It is usually zero, which indicates that 'w32-ansi-code-page' @@ -3747,12 +3162,10 @@ is being used, except in Far Eastern locales. When this variable is non-zero, Emacs at startup sets 'locale-coding-system' to the corresponding encoding, instead of using 'w32-ansi-code-page'. ---- ** The default value of 'inhibit-compacting-font-caches' is t on MS-Windows. Experience shows that compacting font caches causes more trouble on MS-Windows than it helps. -+++ ** Font lookup on MS-Windows was improved to support rare scripts. To activate the improvement, run the new function 'w32-find-non-USB-fonts' once per Emacs session, or assign to the new @@ -3760,13 +3173,11 @@ variable 'w32-non-USB-fonts' the list of scripts and the corresponding fonts. See the documentation of this function and variable in the Emacs manual for more details. -+++ ** On NS the behavior of drag and drop can now be modified by use of modifier keys in line with Apples guidelines. This makes the drag and drop behavior more consistent, as previously the sending application was able to 'set' modifiers without the knowledge of the user. ---- ** On NS multicolor font display is enabled again since it is also implemented in Emacs on free operating systems via Cairo drawing. -- cgit v1.2.3 From 24391f517a28c6166c4037b2efa666293f2045f7 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:22:53 +0200 Subject: Update authors.el * admin/authors.el (authors-aliases): Add author aliases. --- admin/authors.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/admin/authors.el b/admin/authors.el index fd17a3394d8..acaa7dfaa77 100644 --- a/admin/authors.el +++ b/admin/authors.el @@ -212,6 +212,8 @@ files.") ("Carlos Pita" "memeplex") ("Vinicius Jose Latorre" "viniciusjl") ("Gaby Launay" "galaunay") + ("Alex Gramiak" "alex") + ("Dick R. Chiang" "dickmao") ) "Alist of author aliases. -- cgit v1.2.3 From 4c7f6217daf2ff1075b287e905d0a8883a186019 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:25:32 +0200 Subject: * etc/AUTHORS: Update. --- etc/AUTHORS | 191 ++++++++++++++++++++---------------------------------------- 1 file changed, 64 insertions(+), 127 deletions(-) diff --git a/etc/AUTHORS b/etc/AUTHORS index aff24a8d8d3..2d4e0731202 100644 --- a/etc/AUTHORS +++ b/etc/AUTHORS @@ -127,84 +127,18 @@ Albert L. Ting: changed gnus-group.el mail-hist.el Aleksei Gusev: changed progmodes/compile.el -Alexander Becher: changed vc-annotate.el +Alexandru Harsanyi: changed soap-client.el soap-inspect.el emacs3.py + vc-hooks.el vc.el xml.el -Alexander Gramiak: changed w32term.c xterm.c nsterm.m dispextern.h - xdisp.c frame.c image.c nsgui.h w32gui.h xfns.c frame.el termhooks.h - w32fns.c w32term.h faces.el nsterm.h xfaces.c xterm.h frame.h xfont.c - configure.ac and 64 other files - -Alexander Haeckel: changed getset.el - -Alexander Klimov: changed files.el calc-graph.el files.texi man.el rx.el - sendmail.el - -Alexander Kreuzer: changed nnrss.el - -Alexander Kuleshov: changed dns-mode.el files.texi image-mode.el - keyboard.c ld-script.el xdisp.c - -Alexander L. Belikoff: wrote erc.el - -Alexander Pohoyda: co-wrote mail/rmailmm.el -and changed rmailsum.el man.el rmail.el sendmail.el - -Alexander Shopov: changed code-pages.el - -Alexander Vorobiev: changed org-compat.el - -Alexander Zhuckov: changed ebrowse.c - -Alexandre Garreau: changed message.el - -Alexandre Julliard: wrote vc-git.el -and changed vc.el ewoc.el - -Alexandre Oliva: wrote gnus-mlspl.el -and changed unexelf.c format.el iris4d.h iris5d.h regex.c unexsgi.c - -Alexandre Veyrenc: changed fr-refcard.tex - -Alexandru Harsanyi: wrote soap-client.el soap-inspect.el -and changed emacs3.py vc-hooks.el vc.el xml.el - -Alex Branham: changed checkdoc.el bibtex.el em-rebind.el esh-util.el - indent.el js.el lpr.el message.el subr.el text.texi .dir-locals.el - auth-source-pass.el bug-reference.el comint.el conf-mode-tests.el - conf-mode.el dired-x.el dired.el ediff-diff.el ediff-help.el - ediff-hook.el and 41 other files - -Alex Coventry: changed files.el - -Alex Dunn: changed subr-tests.el subr.el - -Alexei Khlebnikov: changed autorevert.el vc-git.el - -Alex Gramiak: changed prolog.el terminal.c - -Alex Kosorukoff: changed org-capture.el - -Alex Murray: changed erc-desktop-notifications.el network-stream.el - -Alex Ott: changed TUTORIAL.ru ede/files.el ru-refcard.tex base.el - cedet-files.el cpp-root.el ede.el ede/generic.el idle.el ispell.el - semantic/format.el - -Alex Reed: changed verilog-mode.el - -Alex Rezinsky: wrote which-func.el - -Alex Schroeder: wrote ansi-color.el cus-theme.el erc-compat.el - erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el master.el - spam-stat.el sql.el +Alex Gramiak: wrote ansi-color.el conf-mode-tests.el cus-theme.el + erc-compat.el erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el + erc.el gnus-mlspl.el master.el soap-client.el soap-inspect.el + spam-stat.el sql.el vc-git.el which-func.el and co-wrote longlines.el mail/rmailmm.el -and changed erc.el erc-track.el erc-button.el erc-stamp.el erc-match.el - erc-autoaway.el erc-nickserv.el rcirc.texi Makefile erc-autojoin.el - erc-fill.el erc-pcomplete.el erc-complete.el erc-ibuffer.el - erc-members.el rmail.el comint.el custom.el erc-bbdb.el erc-chess.el - erc-ezbounce.el and 35 other files - -Alex Shinn: changed files.el +and changed erc-track.el erc-button.el w32term.c xterm.c erc-stamp.el + nsterm.m xdisp.c dispextern.h frame.c image.c nsgui.h w32gui.h xfns.c + erc-match.el frame.el termhooks.h w32fns.c Makefile TUTORIAL.ru + erc-autoaway.el erc-nickserv.el and 215 other files Alfred Correira: changed generic-x.el @@ -254,7 +188,7 @@ and changed nsterm.m nsfns.m nsmenu.m nsterm.h font-lock.el nsimage.m Anders Waldenborg: changed emacsclient.c -Andrea Corallo: changed map-tests.el map.el +Andrea Corallo: changed flymake.texi map-tests.el map.el Andrea Rossetti: changed ruler-mode.el @@ -366,7 +300,7 @@ Andrey Slusar: changed gnus-async.el gnus.el Andrey Zhdanov: changed gud.el Andrii Kolomoiets: changed vc-hg.el progmodes/python.el vc-git.el vc.el - maintaining.texi vc-svn.el + cyril-util.el maintaining.texi vc-svn.el Andrzej Lichnerowicz: wrote ob-io.el @@ -487,11 +421,11 @@ Bartosz Duszel: changed allout.el bib-mode.el cc-cmds.el hexl.el icon.el sendmail.el ses.el simple.el verilog-mode.el vi.el vip.el viper-cmd.el xscheme.el -Basil L. Contovounesios: changed simple.el message.el subr.el gravatar.el - custom.el gnus-group.el gnus-sum.el gnus-win.el internals.texi - modes.texi text.texi window.c bibtex.el button.el customize.texi - display.texi eww.el gnus-art.el gnus-msg.el gnus.texi lists.texi - and 150 other files +Basil L. Contovounesios: changed simple.el message.el subr.el text.texi + gravatar.el modes.texi custom.el customize.texi display.texi eww.el + files.texi gnus-group.el gnus-sum.el gnus-win.el internals.texi + window.c bibtex.el button.el gnus-art.el gnus-msg.el gnus.texi + and 182 other files Bastian Beischer: changed semantic/complete.el include.el mru-bookmark.el refs.el senator.el @@ -577,6 +511,8 @@ and changed mh-customize.el mh-search.el mh-alias.el mh-e.texi Makefile Bjarte Johansen: wrote ob-sed.el +Björn Holby: changed vhdl-mode.el + Björn Lindström: changed rcirc.texi Bjørn Mork: changed nnimap.el gnus-agent.el message.el mml2015.el @@ -901,7 +837,7 @@ Claudio Fontana: changed Makefile.in leim/Makefile.in lib-src/Makefile.in Clément Pit--Claudel: changed debugging.texi emacs-lisp/debug.el eval.c progmodes/python.el subr-tests.el subr.el url-http.el url-vars.el -Clément Pit-Claudel: changed keyboard.c text.texi +Clément Pit-Claudel: changed display.texi keyboard.c text.texi xdisp.c Colin Marquardt: changed gnus.el message.el @@ -1309,7 +1245,7 @@ Diane Murray: changed erc.el erc-backend.el erc-menu.el erc-button.el erc-goodies.el erc-ibuffer.el erc-log.el erc-nicklist.el url-http.el Makefile erc-dcc.el and 36 other files -Dick R. Chiang: changed checkdoc.el +Dick R. Chiang: changed checkdoc.el cl-macs-tests.el cl-macs.el Didier Verna: wrote gnus-diary.el nndiary.el and co-wrote nnml.el @@ -1355,9 +1291,9 @@ Dmitry Gutov: wrote elisp-mode-tests.el jit-lock-tests.el json-tests.el vc-hg-tests.el xref-tests.el and changed ruby-mode.el xref.el project.el vc-git.el elisp-mode.el etags.el ruby-mode-tests.el js.el package.el vc-hg.el vc.el - symref/grep.el log-edit.el dired-aux.el simple.el minibuffer.el + symref/grep.el log-edit.el simple.el dired-aux.el minibuffer.el menu-bar.el package-test.el progmodes/grep.el vc-svn.el eldoc.el - and 111 other files + and 112 other files Dmitry Kurochkin: changed isearch.el @@ -1443,9 +1379,9 @@ Eli Zaretskii: wrote [bidirectional display in xdisp.c] chartab-tests.el coding-tests.el doc-tests.el etags-tests.el rxvt.el tty-colors.el and changed xdisp.c msdos.c w32.c display.texi w32fns.c simple.el - files.el fileio.c keyboard.c w32term.c w32proc.c emacs.c files.texi + files.el fileio.c keyboard.c w32term.c emacs.c w32proc.c files.texi text.texi dispnew.c frames.texi lisp.h dispextern.h window.c process.c - term.c and 1187 other files + term.c and 1191 other files Emanuele Giaquinta: changed configure.ac rxvt.el charset.c etags.c fontset.c frame.el gnus-faq.texi loadup.el lread.c sh-script.el @@ -1767,6 +1703,8 @@ Fujii Hironori: changed w32fns.c Gábor Vida: changed gnus-demon.el auth-source.el ido.el +Gaby Launay: changed auth-source-pass.el + Gareth Jones: changed fns.c gnus-score.el Gareth Rees: changed NEWS.24 @@ -2145,7 +2083,7 @@ Jaesup Kwak: changed xwidget.c Jaeyoun Chung: changed hangul3.el hanja3.el gnus-mule.el hangul.el -J. Alexander Branham: wrote conf-mode-tests.el +Jakub-W: changed calculator.el Jambunathan K: wrote ox-odt.el and co-wrote ox-html.el @@ -2433,8 +2371,8 @@ João Távora: wrote elec-pair.el electric-tests.el flymake-cc.el and changed flymake.el flymake-proc.el icomplete.el minibuffer.el flymake-tests.el flymake.texi elisp-mode.el flymake-elisp.el electric.el flymake-ui.el text.texi json-tests.el tex-mode.el - errors-and-warnings.c json.c xref.el auth-source-pass.el linum.el - maintaining.texi message.el progmodes/python.el and 30 other files + errors-and-warnings.c json.c xref.el auth-source-pass.el buffers.texi + linum.el maintaining.texi message.el and 30 other files Jochen Hein: changed gnus-art.el @@ -2712,8 +2650,8 @@ and changed tramp-gvfs.el tramp-sh.el comint.el em-unix.el esh-util.el Juri Linkov: wrote files-x.el misearch.el replace-tests.el tab-bar.el tab-line.el and changed isearch.el info.el simple.el replace.el dired.el dired-aux.el - progmodes/grep.el progmodes/compile.el startup.el subr.el diff-mode.el - files.el menu-bar.el faces.el bindings.el display.texi image-mode.el + progmodes/grep.el image-mode.el progmodes/compile.el startup.el subr.el + diff-mode.el files.el menu-bar.el faces.el display.texi bindings.el desktop.el comint.el minibuffer.el search.texi and 419 other files Jussi Lahdenniemi: changed w32fns.c ms-w32.h msdos.texi w32.c w32.h @@ -3110,6 +3048,8 @@ Leonard Randall: changed org-bibtex.el reftex-parse.el Leo P. White: changed eieio-custom.el +Leo Vivier: changed dired-aux.el + Levin Du: changed parse-time.el org-clock.el Le Wang: changed org-src.el comint.el hilit-chg.el misc.el @@ -3435,7 +3375,7 @@ Matthias Dahl: changed faces.el process.c process.h Matthias Förste: changed files.el Matthias Meulien: changed bookmark.el progmodes/python.el buff-menu.el - prog-mode.el simple.el tabify.el vc-dir.el vc-git.el + prog-mode.el simple.el tab-bar.el tabify.el vc-dir.el vc-git.el Matthias Wiehl: changed gnus.el @@ -3454,7 +3394,7 @@ Mattias Engdegård: changed rx.el searching.texi rx-tests.el autorevert.el calc-tests.el regexp-opt.el filenotify.el subr.el files.el progmodes/compile.el mouse.el bytecomp.el compile-tests.el autorevert-tests.el byte-opt.el bytecomp-tests.el calc-alg.el - compilation.txt dired.el font.c regex-emacs.c and 161 other files + compilation.txt dired.el font.c regex-emacs.c and 170 other files Matt Lundin: changed org-agenda.el org.el org-bibtex.el org-footnote.el ox-publish.el org-bbdb.el org-datetree.el org-gnus.el @@ -3492,7 +3432,7 @@ and co-wrote tramp-cache.el tramp-sh.el tramp.el and changed tramp.texi tramp-adb.el trampver.el trampver.texi dbusbind.c file-notify-tests.el files.el ange-ftp.el files.texi dbus.texi autorevert.el tramp-fish.el kqueue.c tramp-gw.el tramp-imap.el os.texi - xesam.el configure.ac lisp.h shell.el gfilenotify.c and 253 other files + xesam.el configure.ac lisp.h shell.el gfilenotify.c and 254 other files Michael Ben-Gershon: changed acorn.h configure.ac riscix1-1.h riscix1-2.h unexec.c @@ -3874,7 +3814,7 @@ Noam Postavsky: changed progmodes/python.el lisp-mode.el bytecomp.el lisp-mode-tests.el term.el xdisp.c eval.c cl-macs.el data.c emacs-lisp/debug.el simple.el help-fns.el modes.texi subr.el elisp-mode.el ert.el isearch.el processes.texi cl-print.el diff-mode.el - ffap.el and 359 other files + ffap.el and 360 other files Nobuyoshi Nakada: co-wrote ruby-mode.el and changed ruby-mode-tests.el @@ -3982,9 +3922,9 @@ and changed imenu.el make-mode.el Paul Eggert: wrote rcs2log and co-wrote cal-dst.el and changed lisp.h configure.ac alloc.c process.c fileio.c editfns.c - xdisp.c sysdep.c image.c keyboard.c data.c emacs.c fns.c lread.c + xdisp.c sysdep.c image.c keyboard.c emacs.c data.c fns.c lread.c xterm.c eval.c callproc.c Makefile.in frame.c buffer.c gnulib-comp.m4 - and 1821 other files + and 1822 other files Paul Fisher: changed fns.c @@ -4166,15 +4106,15 @@ Philipp Rumpf: changed electric.el Philipp Stephani: wrote callint-tests.el checkdoc-tests.el cl-preloaded-tests.el ediff-diff-tests.el eval-tests.el ido-tests.el - lread-tests.el mouse-tests.el xt-mouse-tests.el + lread-tests.el mouse-tests.el startup-tests.el xt-mouse-tests.el and changed emacs-module.c emacs-module-tests.el json.c json-tests.el - eval.c mod-test.c lisp.h lread.c nsterm.m configure.ac bytecomp.el - internals.texi gtkutil.c emacs-module.h.in files.el alloc.c - electric-tests.el electric.el test/Makefile.in editfns.c emacs.c - and 127 other files + mod-test.c eval.c lisp.h lread.c nsterm.m configure.ac bytecomp.el + internals.texi gtkutil.c emacs-module.h.in files.el alloc.c editfns.c + electric-tests.el electric.el test/Makefile.in emacs.c + and 129 other files Phillip Lord: wrote ps-print-tests.el -and changed build-zips.sh lisp/Makefile.in undo.c build-dep-zips.py +and changed build-zips.sh lisp/Makefile.in build-dep-zips.py undo.c simple.el test/Makefile.in Makefile Makefile.in emacs.nsi keyboard.c viper-cmd.el README-windows-binaries README.W32 elisp-mode-tests.el ldefs-clean.el loadup.el README-scripts autoload.el @@ -4214,10 +4154,10 @@ Piotr Trojanek: changed gnutls.c process.c Piotr Zieliński: wrote org-mouse.el -Pip Cet: changed fns.c display.texi xdisp.c xterm.c dispextern.h frame.el - gtkutil.c image.c json-tests.el json.c mail-utils.el nsterm.m simple.el - subr.el text.texi textprop.c timer-list.el tty-colors-tests.el - tty-colors.el url-http.el xfaces.c xterm.h +Pip Cet: changed fns.c display.texi xdisp.c xterm.c composite.c + dispextern.h frame.el gtkutil.c image.c indent.c json-tests.el json.c + mail-utils.el nsterm.m simple.el subr.el text.texi textprop.c + timer-list.el tty-colors-tests.el tty-colors.el and 4 other files Pontus Michael: changed simple.el @@ -4329,7 +4269,7 @@ Ricardo Wurmus: changed xwidget.el xwidget.c configure.ac xwidget.h Riccardo Murri: changed vc-bzr.el tls.el -Richard Copley: changed Makefile.in epaths.in epaths.nt gdb-mi.el +Richard Copley: changed Makefile.in epaths.in epaths.nt gdb-mi.el sort.el text.texi Richard Dawe: changed config.in src/Makefile.in @@ -4339,7 +4279,7 @@ Richard G. Bielawski: changed modes.texi paren.el Richard Hoskins: changed message.el Richard Kim: wrote wisent/python.el -and changed bovine.texi db-global.el loading.texi python-wy.el +and changed bovine.texi db-global.el gud.el loading.texi python-wy.el texnfo-upd.el wisent.texi Richard King: wrote filelock.c uniquify.el userlock.el @@ -4415,9 +4355,9 @@ Robert P. Goldman: changed org.texi ob-exp.el org.el ox-latex.el Robert Pluim: wrote nsm-tests.el and changed process.c ftfont.c gtkutil.c processes.texi vc-git.el configure.ac font.c network-stream.el nsm.el process-tests.el xfns.c - dispextern.h files.texi ftcrfont.c gnus-icalendar.el gnutls.el - gtkutil.h network-stream-tests.el nsterm.m text.texi w32.c - and 90 other files + custom.texi dispextern.h files.texi ftcrfont.c gnus-icalendar.el + gnutls.el gtkutil.h network-stream-tests.el nsterm.m text.texi + and 92 other files Robert Thorpe: changed cus-start.el indent.el @@ -4730,6 +4670,8 @@ and changed message.el gnus-sum.el gnus-art.el smtpmail.el pgg-gpg.el gnus-int.el gnus.el hashcash.el mm-view.el password.el and 101 other files +Simon Lang: changed misterioso-theme.el + Simon Law: changed delsel.el electric.el Simon Leinen: changed Makefile.in smtpmail.el Makefile cm.c cm.h hpux9.h @@ -4774,8 +4716,8 @@ Stefan Kangas: wrote bookmark-tests.el delim-col-tests.el morse-tests.el tabify-tests.el timezone-tests.el underline-tests.el uudecode-tests.el and changed bookmark.el package.el efaq.texi package.texi ibuffer.el mwheel.el cperl-mode.el fns.c gud.el simple.el subr.el autoinsert.el - comint-tests.el cus-edit.el delim-col.el dired-aux.el dired-x.el - em-term.el ert.texi flow-fill.el frames.texi and 147 other files + comint-tests.el control.texi cus-edit.el delim-col.el dired-aux.el + dired-x.el em-term.el ert.texi flow-fill.el and 152 other files Stefan Merten: co-wrote rst.el @@ -4791,7 +4733,7 @@ and co-wrote font-lock.el gitmerge.el pcvs.el and changed subr.el simple.el keyboard.c bytecomp.el files.el lisp.h cl-macs.el vc.el xdisp.c alloc.c eval.c sh-script.el progmodes/compile.el keymap.c tex-mode.el buffer.c newcomment.el - window.c lread.c fileio.c help-fns.el and 1372 other files + window.c lread.c fileio.c help-fns.el and 1373 other files Stefano Facchini: changed gtkutil.c @@ -4810,10 +4752,9 @@ Stefan Wiens: changed gnus-sum.el Steinar Bang: changed gnus-setup.el imap.el Štěpán Němec: changed INSTALL calc-ext.el checkdoc.el cl.texi comint.el - edebug.texi font-lock.el functions.texi gnus-sum.el insdel.c + edebug.texi font-lock.el functions.texi gnus-sum.el gnus.texi insdel.c leim-ext.el loading.texi maps.texi mark.texi message.texi mini.texi - minibuf.texi misc.texi programs.texi subr.el text.texi - and 7 other files + minibuf.texi misc.texi programs.texi subr.el and 8 other files Stephan Stahl: changed which-func.el buff-menu.el buffer.c dired-x.texi ediff-mult.el @@ -4826,7 +4767,7 @@ and changed wdired.el todo-mode.texi diary-lib.el wdired-tests.el dired-tests.el doc-view.el files.el minibuffer.el dired.el frames.texi hl-line.el info.el menu-bar.el mouse.el otodo-mode.el subr.el .gitattributes TUTORIAL allout.el artist.el compile.texi - and 43 other files + and 44 other files Stephen C. Gilardi: changed configure.ac @@ -4978,7 +4919,7 @@ and changed reftex-vars.el tex-mode.el gnus.texi reftex-cite.el tsdh-dark-theme.el tsdh-light-theme.el gnus-sum.el file-notify-tests.el reftex.el misc.texi org-gnus.el prog-mode.el subword.el image-mode.el json.el lisp-mode.el cc-cmds.el display.texi em-term.el emacsbug.el - files.el and 82 other files + files.el and 83 other files Tatsuya Ichikawa: changed gnus-agent.el gnus-cache.el @@ -5298,8 +5239,6 @@ Valentin Gatien-Baron: changed emacs-module.c Valentin Wüstholz: changed org.el -Valery Alexeev: changed cyril-util.el cyrillic.el - Van L: changed subr.el Vasilij Schneidermann: changed cus-start.el eww.el cc-mode.el @@ -5359,8 +5298,6 @@ and changed erc-backend.el erc.el erc-services.el hexl.el emacs.c erc-button.el erc-capab.el erc-join.el htmlfontify.texi sh-script.el xterm.c xterm.h -Vladimir Alexiev: changed arc-mode.el nnvirtual.el tmm.el - Vladimir Kazanov: changed java.srt Vladimir Lomov: changed ox-html.el -- cgit v1.2.3 From 1fc742b63ebfa548dd3ff6e99b530480e8c0b12c Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:26:42 +0200 Subject: ; Update ChangeLog.3 --- ChangeLog.3 | 1846 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1845 insertions(+), 1 deletion(-) diff --git a/ChangeLog.3 b/ChangeLog.3 index 7f6000fc556..4aa52a762fc 100644 --- a/ChangeLog.3 +++ b/ChangeLog.3 @@ -1,3 +1,1847 @@ +2020-07-28 Nicolas Petton + + * etc/NEWS: Remove temporary markup. + +2020-07-26 Philipp Stephani + + Add another test for global module references + + * test/src/emacs-module-tests.el (mod-test-globref-reordered): New + unit test. + + * test/data/emacs-module/mod-test.c (Fmod_test_globref_reordered): New + test module function. + (emacs_module_init): Export it. + +2020-07-26 Philipp Stephani + + Backport: add another test case for module assertions. + + This backports commit 9f01ce6327 from master. Since the bug isn’t + present on emacs-27, just backport the new test case. + + * test/data/emacs-module/mod-test.c (Fmod_test_globref_invalid_free): + New test module function. + (emacs_module_init): Export it. + + * test/src/emacs-module-tests.el + (module--test-assertions--globref-invalid-free): New unit test. + +2020-07-26 Philipp Stephani + + Backport: Add module test for edge case. + + This backports commit 6355a3ec62 from master. Since the bug isn’t + present in emacs-27, just backport the test case. + + * test/data/emacs-module/mod-test.c + (Fmod_test_invalid_store_copy): New test module function. + (emacs_module_init): Export it. + + * test/src/emacs-module-tests.el + (module--test-assertions--load-non-live-object-with-global-copy): + New unit test. + +2020-07-25 Eli Zaretskii + + Fix last change + + * src/composite.c (composition_reseat_it): Fix of the commentary, + and a minor change of the last fix. + +2020-07-25 Pip Cet + + Fix Arabic shaping when column-number-mode is in effect + + * src/indent.c (scan_for_column, compute_motion): Pass -1, + instead of NEUTRAL_DIR, to 'composition_reseat_it'. + * src/composite.c (composition_reseat_it): Interpret negative + value of BIDI_LEVEL to mean the caller doesn't know what is the + bidi direction of the text. (Bug#41005) + +2020-07-24 Eli Zaretskii + + Fix description of kmacro-* commands in the user manual + + * doc/emacs/kmacro.texi (Basic Keyboard Macro): Separate old-style + macro definition commands from the new style in the summary + table. (Bug#42492) + +2020-07-24 Lars Ingebrigtsen + + Fix viewing of encrypted S/MIME messages + + * lisp/gnus/mm-decode.el (mm-possibly-verify-or-decrypt): Don't + add a content-type header if there already is one (bug#41659). + +2020-07-21 Ken Manheimer + + Revert "Rectify allout-widgets region undecoration so item at start is not missed." + + This reverts commit 33d85cb768b40794bffcd9ab22fbdec1211a74e5. + + Backporting it to emacs-27 was not appropriate. + +2020-07-21 Ken Manheimer + + Revert "Resolve missing button-region keymap bindings." + + This reverts commit dd7c191291c8eb1afeac0f1512745491c5c7a317. + + Backporting it to emacs-27 was not appropriate. + +2020-07-21 Ken Manheimer + + Revert "Provide missing let definition to prevent background void-variable error." + + This reverts commit 3c410b6b4753e02269bb36914e7534eb124150dd. + + Backporting it to emacs-27 was not appropriate. + +2020-07-21 Ken Manheimer + + Revert "Don't let item decoration be disrupted by too-shallow items." + + This reverts commit 8684216542889fa57daa32072104afc69785907f. + + Backporting it to emacs-27 was not appropriate. + +2020-07-21 Ken Manheimer + + Revert "Fix allout-widgets-mode handling of edits to item cue, fixing (bug#11312)" + + This reverts commit 8e13d332481551e4c8c1c66dd0c69dd09256dffc. + + Backporting it to emacs-27 was not appropriate. + +2020-07-21 Robert Pluim + + Run custom-magic-reset in the customize buffer + + If the user has navigated away from the customize buffer, then + clicking on a widget in the customize buffer applies changes in the + selected buffer rather than in the customize buffer. Pass the + customize buffer to 'custom-magic-reset' to avoid this. + + * lisp/cus-edit.el (custom-magic-reset): Add optional buffer argument, + apply changes in that buffer. + (custom-notify): Pass the buffer containing the widget to + 'custom-magic-reset'. (Bug#40788) + +2020-07-20 Ken Manheimer + + Backport: Rectify allout-widgets region undecoration so item at start is not missed. + + * lisp/allout-widgets.el (allout-widgets-undecorate-region): + Reorganize the loop so an item at the start is not skipped. + + (cherry picked from commit 33d85cb768b40794bffcd9ab22fbdec1211a74e5) + +2020-07-20 Ken Manheimer + + Backport: Resolve missing button-region keymap bindings. + + * lisp/allout-widgets.el (allout-item-icon-keymap, + allout-item-body-keymap, allout-cue-span-keymap, allout-widgets-mode): + Inherit from both (current-local-map) and (current-global-map). This + provides for missing global bindings when inheriting from + just (current-local-map), eg Esc-<. + + (cherry picked from commit dd7c191291c8eb1afeac0f1512745491c5c7a317) + +2020-07-20 Ken Manheimer + + Backport: Provide missing let definition to prevent background void-variable error. + + * lisp/allout-widgets.el (allout-widgets-exposure-change-processor) + Let-declare handled-conceal, for reference through `(symbol-value)' + within the let body. (Because the error happens in an + after-change-functions hook, so it is caught and reported as a message + by allout-widgets-hook-error-handler.) + + (cherry picked from commit 3c410b6b4753e02269bb36914e7534eb124150dd) + +2020-07-20 Ken Manheimer + + Backport: Don't let item decoration be disrupted by too-shallow items. + + * lisp/allout-widgets.el (allout-decorate-item-and-context): Check for + parent-position having value before using it. + + Also, shift local emacs vars topic deeper so it doesn't constitute + an instance of that particular aberrant case. + + (cherry picked from commit 8684216542889fa57daa32072104afc69785907f) + +2020-07-20 Ken Manheimer + + Backport: Fix allout-widgets-mode handling of edits to item cue, fixing (bug#11312) + + * lisp/allout-widgets.el (allout-decorate-item-cue): Properly decorate + item cue span. + (allout-setup-text-properties): use allout-graphics-modification-handler + as allout-cue-span-category modification hook. + + (cherry picked from commit 8e13d332481551e4c8c1c66dd0c69dd09256dffc) + +2020-07-20 Robert Pluim + + Document prefix arg effects for 'epa-mail-{sign,encrypt}' + + * doc/misc/epa.texi (Mail-mode integration): Describe effect of + prefix arg to 'epa-mail-encrypt' and 'epa-mail-sign'. + + * lisp/epa-mail.el (epa-mail-sign): Describe effect of prefix arg. + +2020-07-20 Robert Pluim + + * etc/NEWS: Correct description of :client-certificate change + +2020-07-18 Eli Zaretskii + + Revert "Fix filename completion in shell mode buffers" + + This reverts commit e4d17d8cb479ffeeb7dfb7320a1432722ac8df75. + Per bug#42383 discussions, the fix for bug#34330 probably + just works around the real issue, which is in pcomplete.el. + +2020-07-18 Eli Zaretskii + + Improve documentation of 'bookmark-bmenu-mode' + + * lisp/bookmark.el (bookmark-bmenu-mode): Add + `bookmark-bmenu-search' to the doc string. (Bug#42325) + +2020-07-18 Eli Zaretskii + + Update systems using GnuTLS certificate files + + * lisp/net/gnutls.el (gnutls-trustfiles): Update the names of the + systems in the comments. Reported by Richard Stallman + in + https://lists.gnu.org/archive/html/emacs-devel/2020-07/msg00455.html. + +2020-07-17 Eli Zaretskii + + Improve documentation of 'kill-emacs' + + * doc/lispref/os.texi (Killing Emacs): + * src/emacs.c (Fkill_emacs): Document what non-integer, non-string + argument to 'kill-emacs' means. (Bug#42400) + +2020-07-17 Eli Zaretskii + + Improve documentation of 'display-raw-bytes-as-hex' + + * doc/emacs/display.texi (Text Display): Mention + 'display-raw-bytes-as-hex'. (Bug#42384) + +2020-07-17 Robert Pluim + + Correct descriptions of init file + + These still referred to XDG as being preferred. + + * doc/emacs/custom.texi (Init File): Correct description of init + file preference order (Bug#42388). + + * doc/emacs/custom.texi (Find Init): Correct description of + default init-file. + +2020-07-16 Eli Zaretskii + + Fix interrupt-process on MS-Windows + + * src/w32proc.c (sys_kill): Test the status of the left Ctrl key + for the purpose of restoring it after simulating Ctrl-C. This + avoids leaving the left Ctrl key status in depressed state when + the user actually pressed the right Ctrl key. (Bug#42350) + +2020-07-11 Andrea Corallo + + Revert "* doc/misc/flymake.texi (An annotated example backend): Typo fix." + + This reverts commit b1ad0380d2372b8df35ff603b8918d22c27ad964. + +2020-07-11 Mattias Engdegård + + Correct 'concat' manual entry (bug#42296) + + * doc/lispref/strings.texi (Creating Strings): 'concat' does not + necessarily return a newly allocated string. This has been the case + at least since 1997 (Emacs 20.3). + +2020-07-11 Andrea Corallo + + * doc/misc/flymake.texi (An annotated example backend): Typo fix. + +2020-07-11 Eli Zaretskii + + Add commentary in gtkutil.c + + * src/gtkutil.c: Add a comment regarding the incompatibilities + vis-a-vis GTK. Suggested by Richard Stallman . + +2020-07-10 Basil L. Contovounesios + + Consistently stylize eldoc as ElDoc in prose + + * doc/emacs/custom.texi (Specifying File Variables): + * doc/emacs/modes.texi (Major Modes): + * doc/emacs/programs.texi (Lisp Doc): + * etc/NEWS.22: + * etc/NEWS.23: + * lisp/progmodes/python.el: + (python-eldoc-function): + * test/lisp/progmodes/python-tests.el: Consistently capitalize eldoc + as ElDoc rather than Eldoc. + +2020-07-09 Eli Zaretskii + + Improve documentation of "C-u C-x =" + + * doc/emacs/mule.texi (International Chars): Mention the + composition information displayed by "C-u C-x =". (Bug#42256) + +2020-07-09 Paul Eggert + + Mention floating rounding issues + + * doc/lispref/numbers.texi (Float Basics): Mention floating-point + rounding issues uncovered by the discussion in Bug#42417. + +2020-07-09 Mattias Engdegård + + Repair global-auto-revert-ignore-modes (bug#42271) + + Reported by Gustavo Tavares Cabral. + + * lisp/autorevert.el (auto-revert--global-add-current-buffer): Fix typo. + +2020-07-08 Eli Zaretskii + + One more improvement of left/right-fringe display spec docs + + * doc/lispref/display.texi (Fringe Bitmaps): Yet another + clarification of how to use FACE in left/right-fringe display + spec. + +2020-07-07 Eli Zaretskii + + Another clarification of left/right-fringe display spec + + * doc/lispref/display.texi (Fringe Bitmaps): More accurate + description of what FACE means in the left/right-fringe display + spec. + +2020-07-07 Eli Zaretskii + + Avoid infloop in 'format-mode-line' + + * src/xdisp.c (decode_mode_spec): Don't use W->start if it is + outside of the buffer's accessible region. (Bug#42220) + +2020-07-05 Eli Zaretskii + + Clarify the documentation of 'left/right-fringe' display spec + + * doc/lispref/display.texi (Other Display Specs, Fringe Bitmaps): + Clarify how the optional FACE parameter of the left-fringe and + right-fringe display spec is used. Reported by Gregory Heytings + . + +2020-07-04 Eli Zaretskii + + Minor improvement in ELisp manual + + * doc/lispref/frames.texi (Position Parameters): Clarify the + description of the 'above' frame parameter. (Bug#42154) + +2020-07-02 Michael Albinus + + * doc/misc/tramp.texi (Customizing Methods): Fix typo. + +2020-06-29 Philipp Stephani + + Fix undefined behavior in json.c (Bug#42113) + + * src/json.c (lisp_to_json_toplevel_1, Fjson_parse_string): Check + whether input strings are actually strings. + + * test/src/json-tests.el (json-parse-string/wrong-type) + (json-serialize/wrong-hash-key-type): New regression tests. + +2020-06-28 Richard Kim + + Fix ACTION argument of 'display-buffer' call in gud.el + + * lisp/progmodes/gud.el (gud-common-init): The ACTION argument of + 'display-buffer' should be a list of list of functions. (Bug#41888) + +2020-06-27 Eli Zaretskii + + * src/keyboard.c (Fclear_this_command_keys): Doc fix. + +2020-06-27 Eli Zaretskii + + Improve do string of 'man' + + * lisp/man.el (man): Mention the need to use C-q for quoting the + SPC character in the man-page input. (Bug#41859) + +2020-06-26 Eli Zaretskii + + Fix posn-at-point at beginning of a display string + + * src/xdisp.c (pos_visible_p): Account for the line-number width + when the display string at CHARPOS ends in a newline. (Bug#42039) + +2020-06-26 Eli Zaretskii + + Improve documentation of Info node movement commands + + * lisp/info.el (Info-next, Info-prev, Info-forward-node) + (Info-backward-node): More detailed descriptions of what each + commands does with respect to child and parent nodes. (Bug#42050) + +2020-06-22 Phillip Lord + + Add Jansson dependency to Windows Build + + * admin/nt/dist-build/build-dep-zips.py: Add dependency + +2020-06-22 Richard Copley (tiny change) + + Unbreak 'reverse-region' + + * lisp/sort.el (reverse-region): Unbreak the function. It was + broken by a fix for bug#39376. + +2020-06-22 Basil L. Contovounesios + + Fix typos and markup in fill column indicator docs + + * doc/emacs/display.texi (Displaying Boundaries): Fix typos and + Texinfo markup. + +2020-06-20 Stephen Berman + + Avoid crashes in 'defconst' + + * src/eval.c (Fdefconst): Verify that SYMBOL is a known symbol. + (Bug#41817) + +2020-06-20 Richard Stallman + + Fix text about Lisp archives in the Emacs FQ + + * doc/misc/efaq.texi (Packages that do not come with Emacs): Warn + about using Lisp archives other than GNU ELPA. + +2020-06-20 Eli Zaretskii + + Don't use 'cl' functions in ELisp manual's examples + + * doc/lispref/control.texi (pcase Macro): Use 'cl-evenp' instead + of 'evenp'. (Bug#41947) + +2020-06-17 Basil L. Contovounesios + + Fix some Texinfo markup + + * doc/misc/gnus-faq.texi (FAQ 3-11): + * doc/emacs/frames.texi (Tab Bars): Consistently use @var with + lower-case metasyntactic variables and @minus instead of a dash. + (Text-Only Mouse): + * doc/emacs/files.texi (Auto Revert): + * doc/emacs/misc.texi (emacsclient Options) + (Embedded WebKit Widgets): + * doc/lispref/control.texi (pcase Macro): + * doc/lispref/debugging.texi (Backtraces): + * doc/lispref/files.texi (Truenames): + * doc/lispref/frames.texi (Management Parameters): + * doc/lispref/os.texi (Time Calculations): + * doc/lispref/text.texi (Parsing JSON): + * doc/misc/efaq-w32.texi (Other versions of Emacs, Debugging) + (Swap Caps NT, Printing, Bash, Developing with Emacs): + * doc/misc/efaq.texi (New in Emacs 25): + * doc/misc/emacs-gnutls.texi (Help For Users): + * doc/misc/message.texi (Using S/MIME, Passphrase caching): + * test/manual/etags/tex-src/gzip.texi (Overview): Use @. when a + sentence in the middle of a paragraph ends with an upper-case letter + as per "(texinfo) Ending a Sentence". + +2020-06-17 Basil L. Contovounesios + + Fix recentf typo in Emacs manual + + * doc/emacs/files.texi (File Conveniences): Fix misspelling of + recentf-list. + +2020-06-17 Juri Linkov + + Rename default function to next-error-buffer-unnavigated-current (bug#40919) + + * lisp/simple.el (next-error-find-buffer-function): Rename default function + from next-error-no-navigation-try-current + to next-error-buffer-unnavigated-current. + +2020-06-17 Juri Linkov + + * lisp/image-mode.el (image-toggle-display-image): Fix fit of rotated images. + + When fitting rotated image to width and height, swap width and height + when changing orientation between portrait and landscape (bug#41886). + +2020-06-16 Michael Albinus + + * doc/misc/tramp.texi (Predefined connection information): Add "tmpdir". + +2020-06-13 João Távora + + Delete, don't kill, dir dir fragments in icomplete-fido-backward-updir + + Reported by: Andrew Schwartzmeyer + + * lisp/icomplete.el (icomplete-fido-backward-updir): Don't save + dir fragments to kill ring. + +2020-06-13 Basil L. Contovounesios + + Revert markup change in with-coding-priority docs + + This partially reverts commit fc759eb9b3 + "Fix with-coding-priority markup in Elisp manual" + of 2019-10-13T15:36:02Z!contovob@tcd.ie. + + For discussion, see the following thread: + https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00550.html + https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00473.html + + * doc/lispref/nonascii.texi (Specifying Coding Systems): Use more + specific cross-reference to progn even if info.el displays it + suboptimally. + +2020-06-10 Juri Linkov + + * lisp/emulation/cua-rect.el (cua--rectangle-region-insert): New function. + + Add cua--insert-rectangle around region-insert-function (bug#41440). + +2020-06-09 Juri Linkov + + * lisp/simple.el (shell-command-on-region): Fix docstring. + + * lisp/simple.el (shell-command-on-region): Mention REGION-NONCONTIGUOUS-P + in docstring (bug#41440) + + * etc/NEWS: Better example for 'windmove-display-default-keybindings'. + +2020-06-08 Basil L. Contovounesios + + Clean up D-Bus documentation (bug#41744) + + * doc/lispref/errors.texi (Standard Errors): The error symbol + dbus-error is defined even when Emacs is built without D-Bus. + + * doc/misc/dbus.texi (Bus Names, Introspection) + (Nodes and Interfaces, Methods and Signal) + (Properties and Annotations, Arguments and Signatures) + (Synchronous Methods, Receiving Method Calls, Signals) + (Alternative Buses, Errors and Events): Clarify wording. Fix + indentation of and simplify examples where possible. Improve + Texinfo markup and cross-referencing where possible. + (Type Conversion): Ditto. Remove mentions of Emacs' fixnum range + now that we have bignums. + + * lisp/net/dbus.el (dbus-return-values-table) + (dbus-call-method-asynchronously, dbus-send-signal) + (dbus-register-signal, dbus-register-method) + (dbus-string-to-byte-array, dbus-byte-array-to-string) + (dbus-escape-as-identifier, dbus-check-event, dbus-event-bus-name) + (dbus-event-message-type, dbus-event-serial-number) + (dbus-event-service-name, dbus-event-path-name) + (dbus-event-interface-name, dbus-event-member-name) + (dbus-list-activatable-names, dbus-list-queued-owners, dbus-ping) + (dbus-introspect-get-interface-names, dbus-introspect-get-interface) + (dbus-introspect-get-method, dbus-introspect-get-signal) + (dbus-introspect-get-property, dbus-introspect-get-annotation-names) + (dbus-introspect-get-annotation, dbus-introspect-get-argument-names) + (dbus-introspect-get-argument, dbus-introspect-get-signature) + (dbus-set-property, dbus-register-property) + (dbus-get-all-managed-objects, dbus-init-bus): Clarify docstring and + improve formatting where possible. + (dbus-call-method): Ditto. Remove mentions of Emacs' fixnum range + now that we have bignums. + +2020-06-08 Juri Linkov + + * lisp/image-mode.el (image-transform-original): New command (bug#41222). + + (image-mode-map): Bind it to "so" and add to menu. + +2020-06-08 Juri Linkov + + Move tab-bar and tab-line faces to faces.el (part of bug#41200) + + These are basic faces, so they need to be defined in + faces.el, otherwise (get 'tab-line 'face) returns 0. + + * lisp/faces.el (tab-bar, tab-line): Move faces here + from tab-bar.el and tab-line.el. + + * lisp/tab-bar.el (tab-bar): Move face to faces.el. + (tab-bar-faces): Add '((tab-bar custom-face)) + to the second arg MEMBERS of 'defgroup'. + + * lisp/tab-line.el (tab-line): Move face to faces.el. + (tab-line-faces): Add '((tab-line custom-face)) + to the second arg MEMBERS of 'defgroup'. + +2020-06-07 Basil L. Contovounesios + + Fix typo in "(elisp) Type Keywords" + + * doc/lispref/customize.texi (Type Keywords): Fix typo of 'choice' + composite type. (Bug#41749) + +2020-06-07 Tassilo Horn + + Gnus nnir-summary-line-format has no effect + + * lisp/gnus/nnir.el (nnir-mode): Update summary format specs if + nnir-summary-line-format is set and different from + gnus-summary-line-format. + (nnir-open-server): Run nnir-mode in gnus-summary-generate-hook + instead of gnus-summary-prepared-hook. + +2020-06-06 Eli Zaretskii + + Improve documentation of 'window-text-pixel-size' + + * doc/lispref/display.texi (Size of Displayed Text): Clarify the + description of 'window-text-pixel-size'. + +2020-06-06 Eli Zaretskii + + * src/xdisp.c (Fwindow_text_pixel_size): Doc fix. (Bug#41737) + +2020-06-06 Basil L. Contovounesios + + Minor improvements to EDE and EIEIO manuals + + For discussion, see the following threads: + https://lists.gnu.org/archive/html/emacs-devel/2020-05/msg00630.html + https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00099.html + + * doc/misc/ede.texi (ede-generic-project): Clean up example. + * doc/misc/eieio.texi (Accessing Slots): Document slot-value as a + generalized variable and set-slot-value as obsolete. + (Predicates): Fix typo. + (Introspection): Document eieio-class-slots in place of the obsolete + object-slots. + +2020-06-06 João Távora + + Have Fido mode also imitate Ido mode in ignore-case options + + Suggested by Sean Whitton . + + * lisp/icomplete.el (icomplete--fido-mode-setup): Set ignore-case + options. + +2020-06-05 Basil L. Contovounesios + + Update package-menu-quick-help + + * lisp/emacs-lisp/package.el (package--quick-help-keys): Filtering + is now bound to the prefix '/', not the key 'f' (bug#41721). + Advertise only the standard 'g' binding now that both it and 'r' are + bound to revert-buffer (bug#35504). + (package--prettify-quick-help-key): Avoid modifying string literals. + (package-menu-filter): Reintroduce as obsolete alias of + package-menu-filter-by-keyword for backward + compatibility (bug#36981). + +2020-06-05 Eli Zaretskii + + Improve documentation of 'sort-subr' + + * doc/lispref/text.texi (Sorting): Clarify the meaning and use of + PREDICATE argument to 'sort-subr'. (Bug#41706) + +2020-06-05 Andrii Kolomoiets + + Update Ukrainian transliteration + + * lisp/language/cyril-util.el (standard-display-cyrillic-translit): + Add missing letter "ґ"; tweak letter "г". (Bug#41683) + +2020-06-05 Eli Zaretskii + + Fix Arabic shaping when eww/shr fill the text to be rendered + + * src/hbfont.c (hbfont_shape): Don't use DIRECTION if the current + buffer has bidi reordering disabled. (Bug#41005) + +2020-06-03 Basil L. Contovounesios + + Silence some byte-compiler warnings in tests + + * test/lisp/emacs-lisp/cl-generic-tests.el: + * test/lisp/progmodes/elisp-mode-tests.el: Declare functions + referred to within macroexpansions. + (xref-elisp-overloadable-no-default) + (xref-elisp-overloadable-co-located-default) + (xref-elisp-overloadable-separate-default): Prefix unused arguments + with underscore. + + * test/lisp/international/ccl-tests.el: + * test/lisp/wdired-tests.el: + * test/lisp/emacs-lisp/package-tests.el: Declare functions used. + (package-test-update-archives, package-test-signed): Use + revert-buffer in place of its obsolete alias package-menu-refresh. + + * test/lisp/eshell/eshell-tests.el: + * test/lisp/mail/footnote-tests.el: + * test/src/buffer-tests.el: Require dependencies used. + + * test/lisp/image/exif-tests.el: Remove unneeded (require 'seq). + (test-exit-direct-ascii-value): Actually perform the test. + * test/lisp/progmodes/sql-tests.el (sql-test-add-existing-product): + Fix typo. + + * test/lisp/simple-tests.el (with-shell-command-dont-erase-buffer): + * test/src/data-tests.el (test-bool-vector-bv-from-hex-string) + (test-bool-vector-apply-mock-op): Remove unused local variables. + +2020-06-03 Basil L. Contovounesios + + * test/lisp/battery-tests.el: New file. + +2020-06-02 Basil L. Contovounesios + + Improve format-spec documentation (bug#41571) + + * doc/lispref/text.texi (Interpolated Strings): Move from here... + * doc/lispref/strings.texi (Custom Format Strings): ...to here, + renaming the node and clarifying the documentation. + (Formatting Strings): End node with sentence referring to the next + one. + * lisp/format-spec.el (format-spec): Clarify docstring. + +2020-06-01 Eli Zaretskii + + Don't call 'mbrtowc' on WINDOWSNT + + * src/emacs.c (using_utf8): Don't call 'mbrtowc' on WINDOWSNT + systems, as it's not available on Windows 9X. + +2020-06-01 João Távora + + * doc/emacs/buffers.texi (Icomplete): Mention icomplete-minibuffer-setup-hook. + +2020-06-01 Paul Eggert + + Be more aggressive in marking objects during GC + + Simplified version of a patch from Pip Cet (Bug#41321#299). + * src/alloc.c (maybe_lisp_pointer): Remove. All uses removed. + (mark_memory): Also look at the pointer offset by ‘lispsym’, + for symbols. + +2020-05-31 Alan Mackenzie + + Fix bug #41618 "(byte-compile 'foo) errors when foo is a macro." + + * lisp/emacs-lisp/bytecomp.el (byte-compile): Disentangle the eval of the + final form from the pushing of 'macro onto it, doing the former first. + +2020-05-31 Eli Zaretskii + + Avoid crashes due to bidi cache being reset during redisplay + + If automatic character composition triggers GC, and + 'garbage-collection-messages' are turned on, we could have the + bidi cache reset while processing RTL text, which would then + consistently crash. + * src/xdisp.c (display_echo_area_1): Protect the bidi cache + against changes inside 'try_window'. + +2020-05-31 Juri Linkov + + * lisp/tab-bar.el (switch-to-buffer-other-tab): Normalize buffer. + + * lisp/tab-bar.el (switch-to-buffer-other-tab): Use + 'window-normalize-buffer-to-switch-to' on 'buffer-or-name', + like does 'pop-to-buffer' used by 'switch-to-buffer-other-frame', + instead of raising the error "Invalid buffer" on a non-existent buffer name. + +2020-05-30 Eli Zaretskii + + Fix mingw.org's MinGW GCC 9 warning about 'execve' + + * nt/inc/ms-w32.h (execve) [__GNUC__ > 9]: Provide a different + prototype for mingw.org's MinGW as well, to match the GCC builtin. + +2020-05-28 Glenn Morris + + Tiny texinfo markup fixes + + * doc/lispref/edebug.texi (Edebug Views): + * doc/lispref/loading.texi (Library Search): + * doc/lispref/os.texi (User Identification): Markup fixes. + +2020-05-27 Dmitry Gutov + + Make next-error behavior a bit more flexible + + * lisp/simple.el (next-error-no-navigation-try-current): + Extract from the case #2 in next-error-find-buffer (bug#40919). + (next-error-find-buffer-function): Use it as the default. + +2020-05-27 Noam Postavsky + + * etc/NEWS.25: Belatedly announce upcase-dwim and downcase-dwim. + +2020-05-25 Eli Zaretskii + + Fix access to single-byte characters in buffer text + + * src/xdisp.c (get_visually_first_element) + (Fbidi_find_overridden_directionality): + * src/cmds.c (Fend_of_line): Use FETCH_BYTE instead of FETCH_CHAR, + and byte position instead of character position, to access + individual bytes of buffer text. This avoids producing invalid + characters and accessing wrong buffer positions. (Bug#41520) + +2020-05-25 Noam Postavsky + + Revert "Fix eshell-mode-map initialization" + + It makes eshell-return-exits-minibuffer permanently affect the + eshell-mode-map (Bug#41370). + + Do not merge to master, we will fix it properly there. + +2020-05-25 Matthias Meulien + + Fix tab-bar-tab-name-ellipsis initialization + + * lisp/tab-bar.el (tab-bar-tab-name-truncated): Evaluate displayable + character when generating tab name. + +2020-05-24 Basil L. Contovounesios + + Fix Elisp manual entry for format-spec + + * doc/lispref/text.texi (Interpolated Strings): Fix typos. Don't + document modifier for default space padding as it's redundant and + inconsistent with the docstring and implementation of format-spec. + +2020-05-24 Eli Zaretskii + + Fix rare assertion violations in 'etags' + + * lib-src/etags.c (pfnote): Instead of raising an assertion when + we get an empty tag name, return immediately. (Bug#41465) + + * test/manual/etags/ETAGS.good_1: + * test/manual/etags/ETAGS.good_2: + * test/manual/etags/ETAGS.good_3: + * test/manual/etags/ETAGS.good_4: + * test/manual/etags/ETAGS.good_5: + * test/manual/etags/ETAGS.good_6: Adapt to latest changes in + etags. + +2020-05-23 Stefan Monnier + + * lisp/subr.el (save-match-data): Clarify use in docstring + +2020-05-23 Eli Zaretskii + + Improve the documentation of setting up fontsets + + * doc/lispref/display.texi (Fontsets): Improve the accuracy of a + cross-reference to "Character Properties". + + * doc/emacs/mule.texi (Fontsets, Modifying Fontsets): Improve the + documentation of fontsets and how to modify them. + +2020-05-23 Eli Zaretskii + + * doc/emacs/killing.texi (Rectangles): Improve indexing. + +2020-05-23 Eli Zaretskii + + Fix accessing files on networked drives on MS-Windows + + * src/w32.c (acl_get_file): Set errno to ENOTSUP if + get_file_security returns ERROR_NOT_SUPPORTED. (Bug#41463) + +2020-05-22 Alan Mackenzie + + CC Mode: Fix bug #39972, by fixing c-display-defun-name for nested defuns + + * lisp/progmodes/cc-mode.el (c-common-init): Build + add-log-current-defun-function out of c-defun-name-and-limits instead of the + former c-defun-name. + +2020-05-21 Paul Eggert + + Redo RCS Id for pdumper + + * lisp/version.el: Don’t put an RCS Id style string into the + executable via purecopy, as this does not work with the pdumper. + * src/emacs.c (RCS_Id): New constant, for 'ident'. + + (cherry picked from commit 3d1bcfba5e21b29be8669aa2a8f27b344c9e02fd) + +2020-05-21 Stefan Kangas + + Second attempt at improving indexing in control.texi + + * doc/lispref/control.texi (Processing of Errors): Improve indexing by + adding the word form "handle" in addition to "handling". With thanks + to Eli Zaretskii. + +2020-05-19 Stefan Kangas + + * doc/lispref/control.texi (Processing of Errors): Improve indexing. + +2020-05-17 Paul Eggert + + Minor fixups for mutability doc + + * doc/lispref/objects.texi (Mutability): Minor fixups in + response to a comment by Dmitry Gutov (Bug#40671#477). + +2020-05-17 Paul Eggert + + Don’t use “constant” for values you shouldn’t change + + Inspired by patch proposed by Dmitry Gutov (Bug#40671#393) + and by further comments by him and by Michael Heerdegen + in the same bug report. + * doc/lispintro/emacs-lisp-intro.texi (setcar): + Don’t push mutability here. + * doc/lispref/eval.texi (Self-Evaluating Forms, Quoting) + (Backquote): + * doc/lispref/lists.texi (Modifying Lists): + * doc/lispref/objects.texi (Lisp Data Types, Mutability): + * doc/lispref/sequences.texi (Array Functions, Vectors): + * doc/lispref/strings.texi (String Basics, Modifying Strings): + Don’t use the word “constant” to describe all values that + a program should not change. + * doc/lispref/objects.texi (Mutability): + Rename from “Constants and Mutability”. All uses changed. + In a footnote, contrast the Emacs behavior with that of Common + Lisp, Python, etc. for clarity, and say the goal is to be nicer. + +2020-05-16 Eli Zaretskii + + Improve documentation of manually installing Lisp packages + + * doc/emacs/building.texi (Lisp Libraries): Describe how to + manually load packages in the init file. Mention the 'site-lisp' + subdirectory of the default 'load-path'. + + * doc/emacs/package.texi (Packages): Describe manual installation + of ELisp packages. Suggested by Jean-Christophe Helary + . + +2020-05-16 Eli Zaretskii + + Reflect the emacs-devel ELPA/MELPA dispute in FAQ + + * doc/misc/efaq.texi (Packages that do not come with Emacs): Warn + that some MELPA packages may require non-free software. + +2020-05-15 Tassilo Horn + + Consider face inheritance when checking region face background. + + Some themes (like dracula) make the region face inherit from some + other face. If the background color of the region was inherited, + `indicate-copied-region' did the switch-point-and-mark-twice dance + which is not visible in case the region is highlighted. It just + looked like Emacs would hang for a second after M-w. + + * lisp/simple.el (indicate-copied-region): Consider face inheritance + when checking region face background. + +2020-05-15 Leo Vivier + + Fix dired default file operation (bug#41261) + + * lisp/dired-aux.el (dired-dwim-target-directories): Restore + pre-emacs-27 behavior of 'dired-dwim-target'. + +2020-05-14 Philipp Stephani + + Fix documentation related to 'command-switch-alist'. + + While there, add a unit test to verify the behavior. + + * doc/lispref/os.texi (Command-Line Arguments): Fix documentation: the + option string in 'command-switch-alist' does include leading hyphens. + Also mention that 'command-switch-alist' parsing ignores equals signs + in options. + + * test/lisp/startup-tests.el + (startup-tests/command-switch-alist): New unit test. + +2020-05-13 Simon Lang (tiny change) + + Improve ediff readability in misterioso theme (Bug#41221) + + * etc/themes/misterioso-theme.el: Add ediff faces. + +2020-05-13 Clément Pit-Claudel + + Fix a crash in handle_display_spec + + * src/xdisp.c (handle_display_spec): Check that the cdr of the + disable-eval spec is a cons before taking its car. (Bug#41232) + +2020-05-13 Martin Rudalics + + In x_hide_tip reset tip_last_frame for GTK+ tooltips only (Bug#41200) + + * src/xfns.c (x_hide_tip): Reset tip_last_frame only when + using GTK+ system tooltips (Bug#41200). + +2020-05-12 João Távora + + Fix docstring of flymake-make-diagnostic (bug#40351) + + * lisp/progmodes/flymake.el (flymake-make-diagnostic): Fix docstring + +2020-05-10 Paul Eggert + + Go back to “Bahá’í” + + * doc/emacs/calendar.texi (Holidays): Revert previous change, as + bahai.org spells it “Bahá’í” (with U+2019 RIGHT SINGLE QUOTATION + MARK) and that’s good enough for us. + +2020-05-10 Eli Zaretskii + + * lisp/dired.el (dired-toggle-marks): Doc fix. (Bug#41097) + +2020-05-09 Philipp Stephani + + Small fix for type of 'display-fill-column-indicator-character' + + * lisp/cus-start.el (standard): Don't mark t as safe file-local value + for 'display-fill-column-indicator-character', as that value isn't + allowed. + +2020-05-09 Eli Zaretskii + + Fix customization of 'display-fill-column-indicator-character' + + * lisp/cus-start.el (display-fill-column-indicator-character): Fix + the customization form. (Bug#41145) + +2020-05-09 Philipp Stephani + + Refer to fill column indicator Info node in some places. + + * src/xdisp.c (syms_of_xdisp): Add reference to manual in + documentation strings for variables related to fill column indicators. + + * lisp/display-fill-column-indicator.el (display-fill-column-indicator) + (display-fill-column-indicator-mode): Add reference to manual. + +2020-05-09 Martin Rudalics + + Fix GTK's Tool Bar menu radio buttons + + * lisp/menu-bar.el (menu-bar-showhide-tool-bar-menu): Fix typo + that makes the radio buttons pretend that the tool bar is always + shown on the left side of the frame. + +2020-05-09 Eli Zaretskii + + Minor clarifications in NEWS + + * etc/NEWS: Tell how to revert to previous behaviors regarding + displaying messages when the minibuffer is active. (Bug#41087) + +2020-05-08 Philipp Stephani + + Improve documentation of 'with-suppressed-warnings'. + + * lisp/emacs-lisp/byte-run.el (with-suppressed-warnings): Refer to + 'byte-compile-warnings' instead of 'byte-compile-warning-types', as + only the former variable documents the available warning types. + +2020-05-08 Eli Zaretskii + + Fix a typo in a comment + + * lisp/display-fill-column-indicator.el: Fix a typo in a comment. + Suggested by david s . + +2020-05-08 Eli Zaretskii + + Improve documentation of Hi Lock mode + + * lisp/hi-lock.el (hi-lock-mode, hi-lock-face-buffer) + (hi-lock-face-phrase-buffer, hi-lock-face-symbol-at-point): + Clarify when 'hi-lock-mode' will use Font Lock and when it will + use overlays. (Bug#41124) + +2020-05-08 Eli Zaretskii + + Fix typos in the Emacs user manual + + * doc/emacs/calendar.texi (Holidays): Fix usage of non-ASCII + accents. + * doc/emacs/custom.texi (Init Rebinding): Fix a cross-reference. + * doc/emacs/dired.texi (Operating on Files): Make the + cross-reference to "VC Delete/Rename" be to a different manual in + the printed version. (Bug#41100) + +2020-05-08 Björn Holby (tiny change) + + Fix references to Speedbar in VHDL mode + + * lisp/progmodes/vhdl-mode.el (vhdl-speedbar-initialize): Update + references to Speedbar variables. (Bug#41084) + +2020-05-08 Eli Zaretskii + + Fix handling of FROM = t and TO = t by 'window-text-pixel-size' + + * src/xdisp.c (Fwindow_text_pixel_size): Use byte position for + accessing buffer text, not character positions. (Bug#41125) + +2020-05-06 Eli Zaretskii + + * doc/emacs/modes.texi (Major Modes): Fix quoting. (Bug#41110) + +2020-05-06 Noam Postavsky + + Fix docstring quoting + + * lisp/gnus/message.el (message-sendmail-extra-arguments): Fix + escaping of quotes in docstring. + +2020-05-06 Noam Postavsky + + Revert "cl-loop: Calculate the array length just once" + + Don't merge to master. This is a safe-for-release fix for Bug#40727. + +2020-05-06 Noam Postavsky + + Revert "cl-loop: Add missing guard condition" + + Don't merge to master. This is a safe-for-release fix for Bug#40727. + +2020-05-06 Noam Postavsky + + Revert "Refix conditional step clauses in cl-loop" + + Don't merge to master. This is a safe-for-release fix for Bug#40727. + +2020-05-05 Eli Zaretskii + + Improve "Help Summary" section in user manual + + * doc/emacs/help.texi (Help Summary): Add cross-references to + sections with details of each Help command. + +2020-05-05 Stefan Kangas + + Clarify message-sendmail-extra-arguments docstring + + * lisp/gnus/message.el (message-sendmail-extra-arguments): Clarify + docstring. + +2020-05-05 Philipp Stephani + + * src/editfns.c (Fformat): Small documentation fix. + +2020-05-04 Alan Mackenzie + + Remove calls to non-existent functions from edebug.el. + + Do not merge to master. + + *lisp/emacs-lisp/edebug.el (edebug--display-1) + (edebug-toggle-disable-breakpoint): Remove calls to + edebug--overlay-breakpoints and edebug--overlay-breakpoints-removed which had + been overlooked in a recent changed to edebug. + +2020-05-04 Dmitry Gutov + + Honor search-upper-case + + * lisp/fileloop.el (fileloop--case-fold): + Extract from existing code. Honor search-upper-case (bug#40940). + (fileloop-initialize-replace, fileloop-initialize-search): Use it. + Update the docstring. + +2020-05-04 Basil L. Contovounesios + + Fix eww-follow-link on URLs with #target + + * lisp/net/eww.el (eww-display-html): Ensure shr-target-id is set as + callers depend on this (bug#28441, bug#40532). + +2020-05-04 Juri Linkov + + Revert part of recent commit 85544f8ef5 (bug#40808) + + * lisp/isearch.el (isearch-lazy-highlight-search): Remove recent fix of + lazy-highlighting of hidden matches. In emacs-27 leave only the fix for + lazy-counting of hidden matches when isearch-lazy-count is non-nil. + +2020-05-03 Stefan Kangas + + Improve doc strings of makunbound and fmakunbound + + * src/data.c (Fmakunbound, Ffmakunbound): Improve doc + strings. (Bug#41026) + +2020-05-03 Alan Mackenzie + + Revert "Mark breakpoints in edebug with highlights". This fixes bug #40992 + + Do not merge to master. + + This reverts commit e8b3a15cb6ff187ce08afcb43bd9a0b7907268ca. + +2020-05-02 Paul Eggert + + Make memq etc. examples more like they were + + Problem reported by Štěpán Němec in: + https://lists.gnu.org/r/emacs-devel/2020-05/msg00130.html + * doc/lispref/lists.texi (Sets And Lists, Association Lists): + Revert examples to be more like the way they were, using + self-evaluating expressions. Be more consistent about listing + unspecified results. + +2020-05-02 Eli Zaretskii + + Document effect of 'search-upper-case' on replacement commands + + * doc/emacs/search.texi (Replacement and Lax Matches): Document + the role of 'search-upper-case' in replacement commands. + (Lax Search): Document the value 'not-yanks' of + 'search-upper-case' where the variable itself is documented. + + * lisp/replace.el (query-replace-regexp, query-replace): Mention + 'search-upper-case' and its effect in doc strings. (Bug#40940) + +2020-05-01 Eli Zaretskii + + * lisp/desktop.el (desktop-save): Doc fix. (Bug#41007) + +2020-04-30 Stefan Kangas + + Recommend to avoid unnecessary abbreviations in doc + + * doc/lispref/tips.texi (Documentation Tips): Recommend to avoid + unnecessary abbreviations. (Bug#40011) + +2020-04-30 Eli Zaretskii + + Revert "Fix calculator division truncation (bug#40892)" + + This reverts commit 82140c510c4d27e639b4bca1e9bf158f0f66c375. + (Bug#40892) + +2020-04-30 Mattias Engdegård + + Fix calculator division truncation (bug#40892) + + * lisp/calculator.el (calculator-string-to-number): Convert decimal + numbers input to float, fixing a regression introduced in f248292ede. + Reported by Aitor Soroa. + +2020-04-29 Dmitry Gutov + + Expand file name for remote dirs as well + + * lisp/progmodes/project.el (project--files-in-directory): + Expand file name for remote dirs as well (bug#40940). + +2020-04-29 Eli Zaretskii + + Fix project.el commands in "transient" projects + + * lisp/progmodes/project.el (project--files-in-directory): Run + local DIR directory names through 'expand-file-name', so that "~/" + is expanded, in case the shell doesn't or the shell's notion of + the home directory is different from that of Emacs. (Bug#40940) + +2020-04-29 Eli Zaretskii + + Make sure alist-related functions say so in their doc + + * src/fns.c (Fassq, assq_no_quit, Fassoc, assoc_no_quit, Frassq) + (Frassoc): Rename argument LIST to ALIST. Doc strings updated. + +2020-04-29 Eli Zaretskii + + * lisp/env.el (substitute-env-vars): Doc fix. (Bug#40948) + +2020-04-29 Juri Linkov + + * lisp/isearch.el: Fix lazy-highlighting and lazy-counting of hidden matches + + * lisp/isearch.el (isearch-lazy-highlight-search): Let-bind + search-invisible to t when search-invisible is 'open' or when both + isearch-lazy-count and search-invisible are non-nil. (Bug#40808) + +2020-04-28 Eli Zaretskii + + Fix error in ERC when 'erc-server-coding-system' is customized + + * lisp/erc/erc-backend.el (erc-split-line): Handle the case where + 'erc-coding-system-for-target' returns a coding-system's symbol. + (Bug#40914) + +2020-04-28 Eli Zaretskii + + Avoid crashes on TTY frames with over-long compositions + + * src/term.c (encode_terminal_code): Each character from an + automatic composition is a multibyte character, so its multibyte + representation can take up to MAX_MULTIBYTE_LENGTH bytes. + Account for that when allocating storage for characters to be + encoded. (Bug#40913) + +2020-04-27 Stefan Kangas + + Fix typo in custom.texi + + * doc/emacs/custom.texi (Variables): Fix typo. Pointed out by + ej32u@protonmail.com. (Bug#40890) + +2020-04-27 Michael Albinus + + * test/lisp/simple-tests.el (with-shell-command-dont-erase-buffer): + + Use `shell-quote-argument' instead of quoting 'like this'. + +2020-04-27 Juri Linkov + + * lisp/image-mode.el (image-mode-map): Update menu items. + + * lisp/image-mode.el (image-mode-map): Move "Fit Image to Window (Best Fit)" + higher. Add "Zoom In" (image-increase-size), "Zoom Out" (image-decrease-size) + and "Rotate Clockwise" (image-rotate). Use name "Set Rotation..." + for image-transform-set-rotation. Swap "Next Image" and "Previous Image". + Swap "Next Frame" and "Previous Frame". + +2020-04-27 Juri Linkov + + Fix bugs in tab-bar and tab-line and mention remaining features in manual. + + * doc/emacs/frames.texi (Tab Bars): Mention tab-bar-new-tab-to, + tab-bar-close-last-tab-choice, tab-bar-close-tab-select, tab-undo, + tab-select, tab-bar-history-mode. + + * doc/emacs/windows.texi (Tab Line): Mention tab-line-tabs-function. + + * lisp/tab-bar.el (tab-bar-select-tab-modifiers): Mention + tab-bar-tab-hints in docstring. + (tab-bar-tab-hints): Mention tab-bar-select-tab-modifiers + in docstring. + (tab-bar-select-tab): Mention tab-bar-select-tab-modifiers + in docstring. + (tab-bar-switch-to-tab): Expand the docstring. + (tab-bar-new-tab-to): Fix bug in handling 'left' value. + (tab-bar-close-tab): Fix bug in handling 'left' value. + (tab-bar-undo-close-tab): Use funcall tab-bar-tabs-function + instead of direct call to tab-bar-tabs. + (tab-bar-history-back, tab-bar-history-forward): Add docstrings. + (tab-bar-history-mode): Expand docstring. + + * lisp/tab-line.el (tab-line-format): Fix bug for handling window + switching that should set face 'tab-line-tab-current'. + +2020-04-26 Michael Albinus + + Make shell-command tests fit for tcsh. + + * test/lisp/simple-tests.el (with-shell-command-dont-erase-buffer): + Fix debug spec. Format command to run also under tcsh. + (simple-tests-shell-command-39067) + (simple-tests-shell-command-dont-erase-buffer): Quote newline in string. + +2020-04-25 Paul Eggert + + Remove doc duplication + + * doc/lispref/objects.texi (Constants and Mutability): Remove + duplication. From a suggestion by Andreas Schwab (Bug#40671#150). + +2020-04-25 Michael Albinus + + * etc/NEWS: Fix inconsistencies. + +2020-04-25 Noam Postavsky + + Clarify semantics of trace-function CONTEXT argument + + * lisp/emacs-lisp/trace.el (trace-function-foreground): Explain that + CONTEXT should be a function, when called from Lisp. + +2020-04-25 Noam Postavsky + + Don't let a code literal get modified in mml parsing (Bug#39884) + + * lisp/gnus/mml.el (mml-parse-1): Make a fresh cons for the tag type, + because 'mml-generate-mime' destructively modifies it. + +2020-04-25 Eli Zaretskii + + * lisp/simple.el (kill-ring-save): Doc fix. (Bug#40797) + +2020-04-25 Clément Pit-Claudel + + Minor doc clarification regarding fringe bitmaps + + * doc/lispref/display.texi (Customizing Bitmaps): Add a note + regarding the order of bits being the opposite of that in + XBM images. (Bug#40784) + +2020-04-25 Eli Zaretskii + + Fix documentation of fringe bitmaps + + * doc/lispref/display.texi (Fringe Bitmaps): The 'empty-line' + fringe indicator _is_ used. (Bug#40799) + +2020-04-25 Paul Eggert + + Tweak mutability doc a bit more + + Inspired by a comment from Michael Heerdegen (Bug#40671#114). + * doc/lispref/objects.texi (Constants and Mutability): Tweak further. + +2020-04-24 Mattias Engdegård + + Calc: fix autoload errors (bug#40800) + + Reported by Hugo Daschbach. + + * lisp/calc/calc-ext.el (calc-init-extensions): + Remove calc-kbd-report key binding and autoload; it was removed in 2005. + calc-keypad-x-{left,right,middle}-click were renamed to + calc-keypad-{left,right,middle}-click in 2001; fix the autoloads. + calc-twos-complement-mode is a variable, not a function; remove the + autoload. + * lisp/calc/calc-prog.el: Remove commented-out calc-kbd-report. + +2020-04-24 Stefan Kangas + + Improve indexing of ELisp manual + + * doc/lispref/tips.texi (Tips): Add index entry 'best practices'. + +2020-04-24 Juri Linkov + + * lisp/image-mode.el (image-transform-resize): Remove FIXME comment. + + The user customizable variable 'image-auto-resize' is documented now + in the manual. + +2020-04-23 Tassilo Horn + + Improve the default value of 'doc-view-ghostscript-program'. + + * lisp/doc-view.el (doc-view-ghostscript-program): Use plain command + name instead of qualified name returned by executable-find (as + suggested by Stefan Monnier). (Bug#36357) + +2020-04-23 Juri Linkov + + Change doc-view-mode-map prefix key 's' to 'c'. + + * doc/emacs/misc.texi (DocView Slicing): Change prefix key 's' to 'c'. + + * lisp/doc-view.el (doc-view-mode-map): Change prefix key 's' to 'c'. + + * lisp/image-mode.el (image-mode-map): Add image-transform-set-scale to menu. + + * doc/emacs/files.texi (Image Mode): Describe commands + image-transform-fit-both, image-transform-set-scale, image-transform-reset. + + * etc/NEWS: Rearrange image sections. + + https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg01315.html + +2020-04-22 Paul Eggert + + Improve wording about constants + + Thanks to Štěpán Němec and Drew Adams for reviews of recent changes. + * doc/lispref/eval.texi (Quoting): Give an example. + * doc/lispref/lists.texi (Association Lists): Simplify example code. + * doc/lispref/objects.texi (Lisp Data Types) + (Constants and Mutability): Clarify wording. + +2020-04-22 Tassilo Horn + + Improve the default value of 'doc-view-ghostscript-program'. + + * lisp/doc-view.el (doc-view-ghostscript-program): On Windows, try + gswin64c, gswin32c, rungs, and mgs. (Bug#36357) + +2020-04-21 Eli Zaretskii + + Minor improvements in documentation of the last change + + * etc/NEWS: + * doc/emacs/files.texi (Image Mode): Minor copyedits of last change. + +2020-04-21 Juri Linkov + + Add image-auto-resize defcustoms to image-mode.el + + * lisp/image-mode.el (image-auto-resize) + (image-auto-resize-on-window-resize): New defcustoms. + (image-mode-map): Bind "sb" to image-transform-fit-both. + (image-mode): Set image-transform-resize to image-auto-resize initially. + (image-mode--setup-mode): Add hook on image-auto-resize-on-window-resize. + (image-toggle-display-image): Check if image-transform-resize is t. + (image-transform-properties): Check image-transform-resize for nil and t. + (image-transform-fit-both): New command. + (image-transform-reset): Reset image-transform-resize to image-auto-resize. + + * doc/emacs/files.texi (Image Mode): Mention image-auto-resize and + image-auto-resize-on-window-resize. + + https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg01160.html + +2020-04-21 Juri Linkov + + Improve the documentation of tab-bar and tab-line + + * doc/emacs/frames.texi (Tab Bars): Add xref to "Tab Line". + Document more commands. + + * doc/emacs/windows.texi (Windows): + * doc/emacs/emacs.texi (Top): Add "Tab Line" menu. + + * doc/emacs/windows.texi (Window Convenience): + Move tab-line documentation to new node "Tab Line". + (Tab Line): New node. + + * doc/emacs/glossary.texi (Glossary): + * doc/emacs/modes.texi (Minor Modes): + * doc/emacs/display.texi (Standard Faces): Add xref to "Tab Line". + +2020-04-20 Paul Eggert + + Tweak wording re constant variables + + * doc/lispref/objects.texi (Constants and Mutability): Tweak. + Problem reported by Michael Heerdegen (Bug#40693#44). + +2020-04-20 Paul Eggert + + Tweak setcar-related wording + + * doc/lispref/eval.texi (Self-Evaluating Forms): + Change “primitives” to “operations”. + Problem reported by Štěpán Němec in: + https://lists.gnu.org/r/emacs-devel/2020-04/msg01146.html + +2020-04-20 Juri Linkov + + * lisp/image-mode.el: Add prefix key 's' and reduce dependency on ImageMagick. + + * lisp/image-mode.el (image-mode-map): Regroup existing keybindings and + add new ones with the prefix key 's'. + Remove condition ":visible (eq image-type 'imagemagick)" from menu. + (image-toggle-display-image): Don't rotate again after user rotated manually. + (image-transform-check-size): Remove check for imagemagick. + (image-transform-properties, image-transform-set-scale) + (image-transform-fit-to-height, image-transform-fit-to-width) + (image-transform-set-rotation, image-transform-reset): + Remove mentions of ImageMagick from docstrings since these commands + now work without ImageMagick. + +2020-04-20 Juri Linkov + + * doc/emacs/windows.texi (Window Convenience): Decribe more windmove features. + + * doc/emacs/windows.texi (Window Convenience): Add descriptions of + windmove-display-default-keybindings, + windmove-delete-default-keybindings, + windmove-swap-states-in-direction. + + * etc/NEWS: Regroup to move some parts closer to related sections. + +2020-04-20 Paul Eggert + + Fix mutability glitches reported by Drew Adams + + See Bug#40693#32. + * doc/lispref/eval.texi (Self-Evaluating Forms, Backquote): + Say that these yield constant conses, vectors and strings, + not constant symbols. + * doc/lispref/objects.texi (Constants and Mutability): Say that an + attempt to modify a constant variable signals an error, instead of + saying that it has undefined behavior. + +2020-04-19 Paul Eggert + + Improve mutability doc + + See Eli Zaretskii’s suggestions (Bug#40671#33). + * doc/lispref/lists.texi (Setcar, Setcdr, Rearrangement): + * doc/lispref/sequences.texi (Sequence Functions) + (Array Functions): + Add commentary to examples. + * doc/lispref/lists.texi (Sets And Lists): + Revert change to delq example. + +2020-04-19 Paul Eggert + + Improve mutability documentation + + This change was inspired by comments from Štěpán Němec in: + https://lists.gnu.org/r/emacs-devel/2020-04/msg01063.html + * doc/lispref/objects.texi (Lisp Data Types): Mention mutability. + (Constants and mutability): New section. + * doc/lispintro/emacs-lisp-intro.texi (Lists diagrammed) + (Indent Tabs Mode): Improve wording. + * doc/lispref/eval.texi (Self-Evaluating Forms): + Say that they return constants. + * doc/lispref/lists.texi (Sets And Lists): + Fix memql mistake/confusion that I recently introduced. + +2020-04-19 Paul Eggert + + Document that quoting yields constants + + * doc/lispref/eval.texi (Quoting, Backquote): + Mention that quoted expressions yield a constant (Bug#40693). + +2020-04-19 Stefan Monnier + + * doc/lispref/keymaps.texi (Extended Menu Items, Easy Menu) <:key-sequence>: + + Clarify the documentation further + +2020-04-19 Mattias Engdegård + + Remove #' and function quoting from lambda forms in manual + + * doc/lispref/abbrevs.texi (Abbrev Expansion): + * doc/lispref/backups.texi (Reverting): + * doc/lispref/functions.texi (Mapping Functions): + * doc/lispref/help.texi (Accessing Documentation): + * doc/lispref/sequences.texi (Char-Tables): + * doc/lispref/syntax.texi (Categories): + * doc/lispref/text.texi (Sorting): + Remove function quoting from lambda in examples where it still occurs, + since examples should follow our best style and be consistent. + +2020-04-19 Stefan Monnier + + * src/regex-emacs.c (re_match_2_internal): Rework comment in last change + + Explain why we don't need to worry about Lisp modifying the buffer. + + * src/syntax.c (parse_sexp_propertize): Fix name in error message. + +2020-04-19 Juri Linkov + + Add new node "Image Mode" to Emacs Manual. + + * doc/emacs/dired.texi (Image-Dired): Add xref to "Image Mode". + + * doc/emacs/emacs.texi (Top): Add new node "Image Mode" to menu. + + * doc/emacs/files.texi (Files): Add new node "Image Mode" to menu. + (File Conveniences): Split part of node to new node "Image Mode". + + * doc/emacs/frames.texi (Mouse Commands): Add xref to "Image Mode". + + * doc/emacs/misc.texi (Embedded WebKit Widgets): Rename xref from + "File Conveniences" to "Image Mode". + +2020-04-18 Paul Eggert + + * doc/lispref/display.texi (Customizing Bitmaps): Fix typo. + +2020-04-18 Paul Eggert + + Document constant vs mutable objects better + + This patch builds on a suggested patch by Mattias Engdegård + and on further comments by Eli Zaretskii. + Original bug report by Kevin Vigouroux (Bug#40671). + * doc/lispintro/emacs-lisp-intro.texi (set & setq, Review) + (setcar, Lists diagrammed, Mail Aliases, Indent Tabs Mode): + setq is a special form, not a function or command. + * doc/lispintro/emacs-lisp-intro.texi (setcar): + * doc/lispref/lists.texi (Modifying Lists, Rearrangement): + * doc/lispref/sequences.texi (Sequence Functions) + (Array Functions, Vectors): + * doc/lispref/strings.texi (String Basics, Modifying Strings): + Mention mutable vs constant objects. + * doc/lispintro/emacs-lisp-intro.texi (setcar, setcdr) + (kill-new function, cons & search-fwd Review): + * doc/lispref/edebug.texi (Printing in Edebug): + * doc/lispref/keymaps.texi (Changing Key Bindings): + * doc/lispref/lists.texi (Setcar, Setcdr, Rearrangement) + (Sets And Lists, Association Lists, Plist Access): + * doc/lispref/sequences.texi (Sequence Functions) + (Array Functions): + * doc/lispref/strings.texi (Text Comparison): + Fix examples so that they do not try to change constants. + +2020-04-18 Eli Zaretskii + + Improve documentation of 'sort-lines' + + * lisp/sort.el (sort-lines): Clarify the interactive invocation. + (Bug#40697) + +2020-04-18 Štěpán Němec + + Mention 'spam-stat-process-directory-age' in the documentation + + I was at a loss as to why my attempt to set up spam-stat seemed to + have no effect, only to find (digging in the code) that it was + ignoring most of the sample files due to this undocumented variable. + + * doc/misc/gnus.texi (Creating a spam-stat dictionary): Document + the variable 'spam-stat-process-directory-age'. (bug#39780) + +2020-04-18 Eli Zaretskii + + Avoid crashes in regex-emacs.c due to GC + + * src/regex-emacs.c (re_match_2_internal): Prevent GC from + invalidating C pointers to buffer text. (Bug#40661) + +2020-04-18 Eli Zaretskii + + Fix "C-u M-!" when 'shell-command-dont-erase-buffer' is non-nil + + * lisp/simple.el (shell-command-dont-erase-buffer): Clarify the + effect of the various values in the doc string. + (shell-command-save-pos-or-erase, shell-command): Don't move or + push point if the output will go to the current buffer. + (Bug#40690) + (shell-command): Mention 'shell-command-dont-erase-buffer' in the + doc string. + + * test/lisp/simple-tests.el + (with-shell-command-dont-erase-buffer): Don't is shell quoting + 'like this', as it doesn't work on MS-Windows; quote "like this" + instead. + (simple-tests-shell-command-dont-erase-buffer): Adapt the test to + the new modus operandi. + + * doc/emacs/misc.texi (Single Shell): Document the effect of the + various values of 'shell-command-dont-erase-buffer'. + + * etc/NEWS: Expand and reword the entry regarding changes in + 'shell-command-dont-erase-buffer'. + +2020-04-17 Paul Eggert + + Fix cl-most-positive-float doc typo + + * doc/misc/cl.texi (Implementation Parameters): + Fix typo in documentation of cl-most-positive-float. + +2020-04-16 jakub-w (tiny change) + + Fix a typo in calculator.el + + * lisp/calculator.el (calculator-expt): Overflowing exponentiation + caused the function to return -1.0e+INF if the base was an odd, + negative number, no matter what the exponent was. + +2020-04-16 Amin Bandali + + * lisp/erc/erc.el: Add URL to the new ERC page on the Emacs site + +2020-04-16 Nicolas Petton + + Bump Emacs version to 27.0.91 + + * README: + * configure.ac: + * msdos/sed2v2.inp: + * nt/README.W32: Bump Emacs version. + +2020-04-16 João Távora + + Correct Fido-mode's backspacing of directories with spaces + + (Bug#40625) + + * lisp/icomplete.el (icomplete-fido-backward-updir): Use + zap-up-to-char. + +2020-04-15 João Távora + + Default completion-flex-nospace to nil + + By default, the flex completion style _does_ match spaces. + + (Bug#40625) + + * lisp/icomplete.el (icomplete--fido-mode-setup): Force + completion-flex-nospace to nil. + + * lisp/minibuffer.el (completion-flex-nospace): Default to nil. + +2020-04-15 Eli Zaretskii + + Improve an example in w32 FAQ + + * doc/misc/efaq-w32.texi (Font names): Modify the expression to + insert a lits of all installed fonts so as to avoid producing too + long lines. Suggested by ndame . + +2020-04-15 Stefan Monnier + + * lisp/htmlfontify.el (hfy-force-fontification): Fix bug#40642 + + Don't presume that `jit-lock-mode` is enabled. + Do not merge to `master`. + +2020-04-15 Nicolas Petton + + * admin/authors.el: Add an author alias. + +2020-04-15 YAMAMOTO Mitsuharu + + Limit RLIMIT_NOFILE to FD_SETSIZE on macOS + + * src/nsterm.m ([EmacsApp applicationDidFinishLaunching:]): Call + CoreFoundation functions that increase RLIMIT_NOFILE behind our back + during startup, and then set RLIMIT_NOFILE back to FD_SETSIZE to avoid + crashes in setup_process_coding_system (Bug#39164). + +2020-04-15 Martin Rudalics + + Fix Elisp manual entry on 'set-window-configuration' + + * doc/lispref/windows.texi (Window Configurations): Fix + description of 'set-window-configuration'. + +2020-04-14 Nicolas Petton + + * admin/authors.el: Add missing author aliases. + 2020-04-14 Mattias Engdegård Fix edge case errors in filename-matching regexps @@ -140538,7 +142382,7 @@ This file records repository revisions from commit 9d56a21e6a696ad19ac65c4b405aeca44785884a (exclusive) to -commit 4acdd7fe58ae9f94102afeca67b0383141d597da (inclusive). +commit 56f958807c0b8ea8f45e3c088157ca144a1b1fac (inclusive). See ChangeLog.2 for earlier changes. ;; Local Variables: -- cgit v1.2.3 From 44888c95b0944ae45942ccfb32e78ffb51a60b2b Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:27:07 +0200 Subject: Bump Emacs version to 27.1 * README: * configure.ac: * msdos/sed2v2.inp: * nt/README.W32: Bump Emacs version. --- README | 2 +- configure.ac | 2 +- msdos/sed2v2.inp | 2 +- nt/README.W32 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README b/README index 9e4906c7347..5482f719c3d 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ Copyright (C) 2001-2020 Free Software Foundation, Inc. See the end of the file for license conditions. -This directory tree holds version 27.0.91 of GNU Emacs, the extensible, +This directory tree holds version 27.1 of GNU Emacs, the extensible, customizable, self-documenting real-time display editor. The file INSTALL in this directory says how to build and install GNU diff --git a/configure.ac b/configure.ac index 76f42ae9e20..40bc610f9bf 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ dnl along with GNU Emacs. If not, see . AC_PREREQ(2.65) dnl Note this is parsed by (at least) make-dist and lisp/cedet/ede/emacs.el. -AC_INIT(GNU Emacs, 27.0.91, bug-gnu-emacs@gnu.org, , https://www.gnu.org/software/emacs/) +AC_INIT(GNU Emacs, 27.1, bug-gnu-emacs@gnu.org, , https://www.gnu.org/software/emacs/) dnl Set emacs_config_options to the options of 'configure', quoted for the shell, dnl and then quoted again for a C string. Separate options with spaces. diff --git a/msdos/sed2v2.inp b/msdos/sed2v2.inp index 3fbfe942e7b..c1ec9ff0cac 100644 --- a/msdos/sed2v2.inp +++ b/msdos/sed2v2.inp @@ -66,7 +66,7 @@ /^#undef PACKAGE_NAME/s/^.*$/#define PACKAGE_NAME ""/ /^#undef PACKAGE_STRING/s/^.*$/#define PACKAGE_STRING ""/ /^#undef PACKAGE_TARNAME/s/^.*$/#define PACKAGE_TARNAME ""/ -/^#undef PACKAGE_VERSION/s/^.*$/#define PACKAGE_VERSION "27.0.91"/ +/^#undef PACKAGE_VERSION/s/^.*$/#define PACKAGE_VERSION "27.1"/ /^#undef SYSTEM_TYPE/s/^.*$/#define SYSTEM_TYPE "ms-dos"/ /^#undef HAVE_DECL_GETENV/s/^.*$/#define HAVE_DECL_GETENV 1/ /^#undef SYS_SIGLIST_DECLARED/s/^.*$/#define SYS_SIGLIST_DECLARED 1/ diff --git a/nt/README.W32 b/nt/README.W32 index 53b3c6b762c..8f2e277ecac 100644 --- a/nt/README.W32 +++ b/nt/README.W32 @@ -1,7 +1,7 @@ Copyright (C) 2001-2020 Free Software Foundation, Inc. See the end of the file for license conditions. - Emacs version 27.0.91 for MS-Windows + Emacs version 27.1 for MS-Windows This README file describes how to set up and run a precompiled distribution of the latest version of GNU Emacs for MS-Windows. You -- cgit v1.2.3 From 27877e7bcfa37b2c97a3dde170f870d4729ff807 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 22:30:24 +0200 Subject: * etc/HISTORY: Add Emacs 27.1 release date. --- etc/HISTORY | 2 ++ 1 file changed, 2 insertions(+) diff --git a/etc/HISTORY b/etc/HISTORY index 6cda28d15a6..f0fd7d6f218 100644 --- a/etc/HISTORY +++ b/etc/HISTORY @@ -220,6 +220,8 @@ GNU Emacs 26.2 (2019-04-12) emacs-26.2 GNU Emacs 26.3 (2019-08-28) emacs-26.3 +GNU Emacs 27.1 (2020-08-06) emacs-27.1 + ---------------------------------------------------------------------- This file is part of GNU Emacs. -- cgit v1.2.3 From d78e0f3cd55689ad1608aeb05b0de1dfb914a63a Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Tue, 28 Jul 2020 23:04:11 +0200 Subject: ; lisp/ldefs-boot.el: Update. --- lisp/ldefs-boot.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index a8e1ed8f8d1..18935f80aa5 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -10544,7 +10544,10 @@ The buffer is expected to contain a mail message." t nil) (autoload 'epa-mail-sign "epa-mail" "\ Sign the current buffer. -The buffer is expected to contain a mail message. +The buffer is expected to contain a mail message, and signing is +performed with your default key. +With prefix argument, asks you to select interactively the key to +use from your key ring. \(fn START END SIGNERS MODE)" t nil) -- cgit v1.2.3 From 2ab66c9f9be923350f123fdea05b5b3ce8283d8a Mon Sep 17 00:00:00 2001 From: Philip K Date: Wed, 29 Jul 2020 01:21:56 +0300 Subject: Replace project-kill-buffers-ignores with project-kill-buffer-conditions * lisp/progmodes/project.el (project-kill-buffer-conditions): Replace the project-kill-buffers-ignores user option. (project--kill-buffer-check): New function. (project--buffers-to-kill): New function. (project-kill-buffers): Use them. Add the NO-CONFIRM argument. --- lisp/progmodes/project.el | 129 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 27 deletions(-) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index da4a589c21a..51b9347bb93 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -1001,16 +1001,51 @@ displayed." (interactive (list (project--read-project-buffer))) (display-buffer-other-frame buffer-or-name)) -(defcustom project-kill-buffers-ignores - '("\\*Help\\*") - "Conditions for buffers `project-kill-buffers' should not kill. -Each condition is either a regular expression matching a buffer -name, or a predicate function that takes a buffer object as -argument and returns non-nil if it matches. Buffers that match -any of the conditions will not be killed." - :type '(repeat (choice regexp function)) +(defcustom project-kill-buffer-conditions + '(buffer-file-name ; All file-visiting buffers are included. + ;; Most of the temp buffers in the background: + (major-mode . fundamental-mode) + ;; non-text buffer such as xref, occur, vc, log, ... + (and (derived-mode . special-mode) + (not (major-mode . help-mode))) + (derived-mode . compilation-mode) + (derived-mode . dired-mode) + (derived-mode . diff-mode)) + "List of conditions to kill buffers related to a project. +This list is used by `project-kill-buffers'. +Each condition is either: +- a regular expression, to match a buffer name, +- a predicate function that takes a buffer object as argument + and returns non-nil if the buffer should be killed, +- a cons-cell, where the car describes how to interpret the cdr. + The car can be one of the following: + * `major-mode': the buffer is killed if the buffer's major + mode is eq to the cons-cell's cdr + * `defived-mode': the buffer is killed if the buffer's major + mode is derived from the major mode denoted by the cons-cell's + cdr + * `not': the cdr is interpreted as a negation of a condition. + * `and': the cdr is a list of recursive conditions, that all have + to be met. + * `or': the cdr is a list of recursive conditions, of which at + least one has to be met. + +If any of these conditions are satified for a buffer in the +current project, it will be killed." + :type '(repeat (choice regexp function symbol + (cons :tag "Major mode" + (const major-mode) symbol) + (cons :tag "Derived mode" + (const derived-mode) symbol) + (cons :tag "Negation" + (const not) sexp) + (cons :tag "Conjunction" + (const and) sexp) + (cons :tag "Disjunction" + (const or) sexp))) :version "28.1" - :package-version '(project . "0.5.0")) + :group 'project + :package-version '(project . "0.6.0")) (defun project--buffer-list (pr) "Return the list of all buffers in project PR." @@ -1022,26 +1057,66 @@ any of the conditions will not be killed." (push buf bufs))) (nreverse bufs))) -;;;###autoload -(defun project-kill-buffers () - "Kill all live buffers belonging to the current project. -Two buffers belong to the same project if their project instances, -as reported by `project-current' in each buffer, are identical. -Certain buffers may be \"spared\", see `project-kill-buffers-ignores'." - (interactive) - (let ((pr (project-current t)) bufs) +(defun project--kill-buffer-check (buf conditions) + "Check if buffer BUF matches any element of the list CONDITIONS. +See `project-kill-buffer-conditions' for more details on the form +of CONDITIONS." + (catch 'kill + (dolist (c conditions) + (when (cond + ((stringp c) + (string-match-p c (buffer-name buf))) + ((symbolp c) + (funcall c buf)) + ((eq (car-safe c) 'major-mode) + (eq (buffer-local-value 'major-mode buf) + (cdr c))) + ((eq (car-safe c) 'derived-mode) + (provided-mode-derived-p + (buffer-local-value 'major-mode buf) + (cdr c))) + ((eq (car-safe c) 'not) + (not (project--kill-buffer-check buf (cdr c)))) + ((eq (car-safe c) 'or) + (project--kill-buffer-check buf (cdr c))) + ((eq (car-safe c) 'and) + (seq-every-p + (apply-partially #'project--kill-buffer-check + buf) + (mapcar #'list (cdr c))))) + (throw 'kill t))))) + +(defun project--buffers-to-kill (pr) + "Return list of buffers in project PR to kill. +What buffers should or should not be killed is described +in `project-kill-buffer-conditions'." + (let (bufs) (dolist (buf (project--buffer-list pr)) - (unless (seq-some - (lambda (c) - (cond ((stringp c) - (string-match-p c (buffer-name buf))) - ((functionp c) - (funcall c buf)))) - project-kill-buffers-ignores) + (when (project--kill-buffer-check buf project-kill-buffer-conditions) (push buf bufs))) - (when (yes-or-no-p (format "Kill %d buffers in %s? " - (length bufs) (project-root pr))) - (mapc #'kill-buffer bufs)))) + bufs)) + +;;;###autoload +(defun project-kill-buffers (&optional no-confirm) + "Kill the buffers belonging to the current project. +Two buffers belong to the same project if their project +instances, as reported by `project-current' in each buffer, are +identical. Only the buffers that match a condition in +`project-kill-buffer-conditions' will be killed. If NO-CONFIRM +is non-nil, the command will not ask the user for confirmation. +NO-CONFIRM is always nil when the command is invoked +interactivly." + (interactive) + (let* ((pr (project-current t)) + (bufs (project--buffers-to-kill pr))) + (cond (no-confirm + (mapc #'kill-buffer bufs)) + ((null bufs) + (message "No buffers to kill")) + ((yes-or-no-p (format "Kill %d buffers in %s? " + (length bufs) + (project-root pr))) + (mapc #'kill-buffer bufs))))) ;;; Project list -- cgit v1.2.3 From eb9e065c00c5590967255fa3abf51db966a5df72 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 29 Jul 2020 03:47:29 +0300 Subject: * lisp/vc/vc-git.el (vc-git-log-view-mode): Font-lock AuthorDate (bug#40248) Highlight "AuthorDate" in log-view-font-lock-keywords when [format] pretty = fuller. --- lisp/vc/vc-git.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 7f6e1db1ed7..e0cf9e79595 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1266,7 +1266,7 @@ log entries." ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)" (1 'change-log-acknowledgment) (2 'change-log-acknowledgment)) - ("^Date: \\(.+\\)" (1 'change-log-date)) + ("^\\(?:Date: \\|AuthorDate: \\)\\(.+\\)" (1 'change-log-date)) ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))) -- cgit v1.2.3 From bcf486c6043ba5f862c164f618f5b1017a1e0637 Mon Sep 17 00:00:00 2001 From: Philip K Date: Wed, 29 Jul 2020 06:54:05 +0200 Subject: Make the erc-header-line default to header-line * lisp/erc/erc.el (erc-header-line): Inherit from header-line (the old values were very similar in light mode, but very different in dark mode) (bug#41095). --- lisp/erc/erc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 38807787945..bfe8a2b42eb 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1212,7 +1212,7 @@ which the local user typed." :group 'erc-faces) (defface erc-header-line - '((t :foreground "grey20" :background "grey90")) + '((t :inherit header-line)) "ERC face used for the header line. This will only be used if `erc-header-line-face-method' is non-nil." -- cgit v1.2.3 From 76f71e39f583b7f8bb47a47b315f49af6f23886e Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 29 Jul 2020 07:13:56 +0200 Subject: Make eww use the XDG download directory * lisp/net/eww.el (erc--download-directory): New function (bug#41030). (eww-download-directory): Use it. (eww-download): Use it. (eww-download-callback): Adjust parameters. --- doc/misc/eww.texi | 4 +++- etc/NEWS | 5 +++++ lisp/net/eww.el | 43 ++++++++++++++++++++++++++++++------------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi index 9bca0faa854..f9901b6fd78 100644 --- a/doc/misc/eww.texi +++ b/doc/misc/eww.texi @@ -135,7 +135,9 @@ HTML-specified colors or not. This sets the @code{shr-use-colors} variable. A URL can be downloaded with @kbd{d} (@code{eww-download}). This will download the link under point if there is one, or else the URL of the current page. The file will be written to the directory specified -in @code{eww-download-directory} (default: @file{~/Downloads/}). +by @code{eww-download-directory} (default: @file{~/Downloads/}, if it +exists; otherwise as specified by the @samp{DOWNLOAD} @acronym{XDG} +directory)). @findex eww-back-url @findex eww-forward-url diff --git a/etc/NEWS b/etc/NEWS index 650b95867fb..4c77162a256 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -492,6 +492,11 @@ behavior of rendering as wide as the window-width allows. If ** EWW ++++ +*** 'eww-download-directory' will now use the XDG location, if defined. +However, if ~/Downloads/ already exists, that will continue to be +used. + --- *** The command 'eww-follow-link' now supports custom mailto handlers. The function that is invoked when clicking on or otherwise following a diff --git a/lisp/net/eww.el b/lisp/net/eww.el index f4e3aa36c55..edb2f729c8b 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -32,6 +32,7 @@ (require 'thingatpt) (require 'url) (require 'url-queue) +(require 'xdg) (eval-when-compile (require 'subr-x)) (defgroup eww nil @@ -55,11 +56,24 @@ :group 'eww :type 'string) -(defcustom eww-download-directory "~/Downloads/" - "Directory where files will downloaded." - :version "24.4" +(defun erc--download-directory () + "Return the name of the download directory. +If ~/Downloads/ exists, that will be used, and if not, the +DOWNLOAD XDG user directory will be returned. If that's +undefined, ~/Downloads/ is returned anyway." + (or (and (file-exists-p "~/Downloads/") + "~/Downloads/") + (when-let ((dir (xdg-user-dir "DOWNLOAD"))) + (file-name-as-directory dir)) + "~/Downloads/")) + +(defcustom eww-download-directory 'erc--download-directory + "Directory where files will downloaded. +This should either be a directory name or a function (called with +no parameters) that returns a directory name." + :version "28.1" :group 'eww - :type 'directory) + :type '(choice directory function)) ;;;###autoload (defcustom eww-suggest-uris @@ -1632,20 +1646,23 @@ Differences in #targets are ignored." "Download URL to `eww-download-directory'. Use link at point if there is one, else the current page's URL." (interactive) - (access-file eww-download-directory "Download failed") - (let ((url (or (get-text-property (point) 'shr-url) - (eww-current-url)))) - (if (not url) - (message "No URL under point") - (url-retrieve url #'eww-download-callback (list url))))) - -(defun eww-download-callback (status url) + (let ((dir (if (stringp eww-download-directory) + eww-download-directory + (funcall eww-download-directory)))) + (access-file dir "Download failed") + (let ((url (or (get-text-property (point) 'shr-url) + (eww-current-url)))) + (if (not url) + (message "No URL under point") + (url-retrieve url #'eww-download-callback (list url dir)))))) + +(defun eww-download-callback (status url dir) (unless (plist-get status :error) (let* ((obj (url-generic-parse-url url)) (path (directory-file-name (car (url-path-and-query obj)))) (file (eww-make-unique-file-name (eww-decode-url-file-name (file-name-nondirectory path)) - eww-download-directory))) + dir))) (goto-char (point-min)) (re-search-forward "\r?\n\r?\n") (let ((coding-system-for-write 'no-conversion)) -- cgit v1.2.3 From db1b1f09b820efeefa60a49684c06d511b70eecb Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 29 Jul 2020 08:38:52 +0200 Subject: Use a new method to determine when to auto-stop image animations * lisp/image.el (image-animate-timeout): Make the animation auto-stop use a decaying average to determine when to stop (bug#40685). The default stop condition will probably require some tweaking -- the current default may be too aggressive. --- etc/NEWS | 9 +++++++++ lisp/image.el | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 4c77162a256..e4d9887480b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -490,6 +490,15 @@ more readable text. Set this variable to nil to get the previous behavior of rendering as wide as the window-width allows. If 'shr-width' is non-nil, it overrides this variable. +** Images + +--- +*** Animated images stop automatically under high CPU pressure sooner. +Previously, an animated image would stop animating if any single image +took more than two seconds to display. The new algorithm maintains a +decaying average of delays, and if this number gets too high, the +animation is stopped. + ** EWW +++ diff --git a/lisp/image.el b/lisp/image.el index 4ea8594a974..4b2faa992fc 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -784,6 +784,7 @@ number, play until that number of seconds has elapsed." (if (setq timer (image-animate-timer image)) (cancel-timer timer)) (plist-put (cdr image) :animate-buffer (current-buffer)) + (plist-put (cdr image) :animate-tardiness 0) (run-with-timer 0.2 nil #'image-animate-timeout image (or index 0) (car animation) 0 limit (+ (float-time) 0.2))))) @@ -848,9 +849,14 @@ The minimum delay between successive frames is `image-minimum-frame-delay'. If the image has a non-nil :speed property, it acts as a multiplier for the animation speed. A negative value means to animate in reverse." + ;; We keep track of "how late" image frames arrive. We decay the + ;; previous cumulative value by 10% and then add the current delay. + (plist-put (cdr image) :animate-tardiness + (+ (* (plist-get (cdr image) :animate-tardiness) 0.9) + (float-time (time-since target-time)))) (when (and (buffer-live-p (plist-get (cdr image) :animate-buffer)) - ;; Delayed more than two seconds more than expected. - (or (time-less-p (time-since target-time) 2) + ;; Cumulatively delayed two seconds more than expected. + (or (< (plist-get (cdr image) :animate-tardiness) 2) (progn (message "Stopping animation; animation possibly too big") nil))) -- cgit v1.2.3 From 28bf56b8718fc545ed94e3fdb09a3cfa446ca61e Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 29 Jul 2020 08:47:29 +0200 Subject: Don't default to librgravatar, since there are security implications * lisp/image/gravatar.el (gravatar-service): Change the default from libravatar, since that has privacy concerns (bug#40676). --- lisp/image/gravatar.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lisp/image/gravatar.el b/lisp/image/gravatar.el index ff59a72ac87..5b5c27dbe17 100644 --- a/lisp/image/gravatar.el +++ b/lisp/image/gravatar.el @@ -125,11 +125,14 @@ a gravatar for a given email address." (libravatar . ,#'gravatar--service-libravatar)) "Alist of supported gravatar services.") -(defcustom gravatar-service 'libravatar +(defcustom gravatar-service 'gravatar "Symbol denoting gravatar-like service to use. Note that certain services might ignore other options, such as `gravatar-default-image' or certain values as with -`gravatar-rating'." +`gravatar-rating'. + +Note that `'libravatar' has security implications: It can be used +to track whether you're reading a specific mail." :type `(choice ,@(mapcar (lambda (s) `(const ,(car s))) gravatar-service-alist)) :version "28.1" -- cgit v1.2.3 From d024fc141bab0b8d3400dc6b53eac1ed199ddb1f Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Wed, 29 Jul 2020 12:34:31 +0200 Subject: * doc/lispref/symbols.texi (Definitions): Fix typo. --- doc/lispref/symbols.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi index dad29554562..d6b0494d1ad 100644 --- a/doc/lispref/symbols.texi +++ b/doc/lispref/symbols.texi @@ -132,7 +132,7 @@ variables. To define a customizable variable, use the (@pxref{Customization}). In principle, you can assign a variable value to any symbol with -@code{setq}, whether not it has first been defined as a variable. +@code{setq}, whether or not it has first been defined as a variable. However, you ought to write a variable definition for each global variable that you want to use; otherwise, your Lisp program may not act correctly if it is evaluated with lexical scoping enabled -- cgit v1.2.3 From 4a07d3c7d40c00d8b6d5ca1daaf6a8c6513a1ff9 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 29 Jul 2020 16:41:18 +0200 Subject: Tramp doc edit * doc/misc/tramp.texi: Use it. * doc/misc/trampver.texi: Declare @trampurl. --- doc/misc/tramp.texi | 2 +- doc/misc/trampver.texi | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index c018033cdab..b4195111d4a 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -59,7 +59,7 @@ local and the remote host, whereas @value{tramp} uses a combination of @command{ssh}/@command{scp}. You can find the latest version of this document on the web at -@uref{https://www.gnu.org/software/tramp/}. +@uref{@value{trampurl}}. @ifhtml The latest release of @value{tramp} is available for diff --git a/doc/misc/trampver.texi b/doc/misc/trampver.texi index aabb2f8acc3..dbebbc36812 100644 --- a/doc/misc/trampver.texi +++ b/doc/misc/trampver.texi @@ -9,6 +9,7 @@ @c tramp.el, and the bug report address is auto-frobbed from @c configure.ac. @set trampver 2.5.0-pre +@set trampurl https://www.gnu.org/software/tramp/ @set tramp-bug-report-address tramp-devel@@gnu.org @set emacsver 25.1 -- cgit v1.2.3 From 9d011397abae131ff6c40ba625e670d5a51674e9 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 29 Jul 2020 16:41:30 +0200 Subject: * etc/NEWS: Fix typos. --- etc/NEWS | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index e4d9887480b..8f5864961d2 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -156,7 +156,7 @@ value of 'tab-bar-show'. It is now defined as a generalized variable that can be used with 'setf' to modify the value stored in a given class slot. -** New minor mode 'cl-font-lock-built-in-mode' for `lisp-mode'. +** New minor mode 'cl-font-lock-built-in-mode' for 'lisp-mode'. The mode provides refined highlighting of built-in functions, types, and variables. @@ -261,8 +261,8 @@ supplied error message. This hook is intended to be used for registering doc string functions. These functions don't need to produce the doc string right away, they may arrange for it to be produced asynchronously. The results of all -doc string functions are accessible to the user through the existing -variable 'eldoc-documentation-strategy'. +doc string functions are accessible to the user through the user +option 'eldoc-documentation-strategy'. *** New user option 'eldoc-documentation-strategy'. The built-in choices available for this user option let users compose @@ -481,14 +481,14 @@ This is still the case by default, but if you customize other function, it will now be called instead of the default. +++ -*** New variable 'shr-max-width'. -If this variable is non-nil, and 'shr-width' is nil, then SHR will use -the value of 'shr-max-width' to limit the width of the rendered HTML. -The default is 120 characters, so even if you have very wide frames, -HTML text will be rendered more narrowly, which usually leads to a -more readable text. Set this variable to nil to get the previous -behavior of rendering as wide as the window-width allows. If -'shr-width' is non-nil, it overrides this variable. +*** New user option 'shr-max-width'. +If this user option is non-nil, and 'shr-width' is nil, then SHR will +use the value of 'shr-max-width' to limit the width of the rendered +HTML. The default is 120 characters, so even if you have very wide +frames, HTML text will be rendered more narrowly, which usually leads +to a more readable text. Set this user option to nil to get the +previous behavior of rendering as wide as the 'window-width' allows. +If 'shr-width' is non-nil, it overrides this variable. ** Images @@ -503,7 +503,7 @@ animation is stopped. +++ *** 'eww-download-directory' will now use the XDG location, if defined. -However, if ~/Downloads/ already exists, that will continue to be +However, if "~/Downloads/" already exists, that will continue to be used. --- @@ -715,7 +715,7 @@ for encoding and decoding without having to bind 'coding-system-for-{read,write}' or call 'set-process-coding-system'. +++ -** 'open-network-stream' can now take a :capability-command that's a function. +** 'open-network-stream' can now take a ':capability-command' that's a function. The function is called with the greeting from the server as its only parameter, and allows sending different TLS capability commands to the server based on that greeting. @@ -733,7 +733,7 @@ process is interrupted by a signal. In order for the two functions to behave more consistently, 'format-spec' now pads and truncates based on string width rather than length, and also supports format specifications that include a -truncating precision field, such as '%.2a'. +truncating precision field, such as "%.2a". --- ** New function 'color-values-from-color-spec'. -- cgit v1.2.3 From c48bb7deb88317b6beda4c5944aca7998ff8c37a Mon Sep 17 00:00:00 2001 From: Mattias Engdegård Date: Wed, 29 Jul 2020 17:47:32 +0200 Subject: Preserve match data in 'kbd' * lisp/subr.el (kbd): Preserve match data since this function is declared pure (see discussion in bug#42147). --- lisp/subr.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index 10c37e94134..3c8dbd16146 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -893,8 +893,9 @@ This is the same format used for saving keyboard macros (see For an approximate inverse of this, see `key-description'." ;; Don't use a defalias, since the `pure' property is true only for ;; the calling convention of `kbd'. - (read-kbd-macro keys)) -(put 'kbd 'pure t) + (declare (pure t)) + ;; A pure function is expected to preserve the match data. + (save-match-data (read-kbd-macro keys))) (defun undefined () "Beep to tell the user this binding is undefined." -- cgit v1.2.3 From 653a81bf8ce41725d12b20f6de3d1877d190f269 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Wed, 29 Jul 2020 08:52:42 -0700 Subject: Update a gravatar test * test/lisp/image/gravatar-tests.el (gravatar-build-url): Update for recent change in default gravatar-service. --- test/lisp/image/gravatar-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lisp/image/gravatar-tests.el b/test/lisp/image/gravatar-tests.el index 66098fa0116..e66b5c6803d 100644 --- a/test/lisp/image/gravatar-tests.el +++ b/test/lisp/image/gravatar-tests.el @@ -67,6 +67,6 @@ (gravatar-force-default nil) (gravatar-size nil)) (should (equal (gravatar-build-url "foo") "\ -https://seccdn.libravatar.org/avatar/acbd18db4cc2f85cedef654fccc4a4d8?r=g")))) +https://www.gravatar.com/avatar/acbd18db4cc2f85cedef654fccc4a4d8?r=g")))) ;;; gravatar-tests.el ends here -- cgit v1.2.3 From 55806ee46b047c03698340ce8a6397de6355c56a Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Wed, 29 Jul 2020 15:15:15 -0700 Subject: * admin/gitmerge.el (gitmerge-resolve): Discard AUTHORS conflicts. --- admin/gitmerge.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/gitmerge.el b/admin/gitmerge.el index 922ddef6bbd..18da466aaa1 100644 --- a/admin/gitmerge.el +++ b/admin/gitmerge.el @@ -354,7 +354,7 @@ Returns non-nil if conflicts remain." ;; The conflict markers remain so we return non-nil. (message "Failed to fix NEWS conflict")))) ;; Generated files. - ((member file '("lisp/ldefs-boot.el")) + ((member file '("lisp/ldefs-boot.el" "etc/AUTHORS")) ;; We are in the file's buffer, so names are relative. (call-process "git" nil t nil "reset" "--" (file-name-nondirectory file)) -- cgit v1.2.3 From 18a5e52eed67700b65681ce5007f121f9700f241 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 30 Jul 2020 02:38:00 +0200 Subject: Small dns.el code cleanup * lisp/net/dns.el (dns-query): Clean up code slightly by removing a macro and moving the code into the function itself. --- lisp/net/dns.el | 60 ++++++++++++++++++++++++++------------------------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/lisp/net/dns.el b/lisp/net/dns.el index 53ea0b19b52..e02c99ea0c3 100644 --- a/lisp/net/dns.el +++ b/lisp/net/dns.el @@ -355,25 +355,6 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"." result)) ;;; Interface functions. -(defmacro dns-make-network-process (server) - `(let ((server ,server) - (coding-system-for-read 'binary) - (coding-system-for-write 'binary)) - (if (and - (fboundp 'make-network-process) - (featurep 'make-network-process '(:type datagram))) - (make-network-process - :name "dns" - :coding 'binary - :buffer (current-buffer) - :host server - :service "domain" - :type 'datagram) - ;; Older versions of Emacs do not have `make-network-process', - ;; and on MS-Windows datagram sockets are not supported, so we - ;; fall back on opening a TCP connection to the DNS server. - (open-network-stream "dns" (current-buffer) server "domain")))) - (defvar dns-cache (make-vector 4096 0)) (defun dns-query-cached (name &optional type fullp reversep) @@ -386,9 +367,6 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"." (set (intern key dns-cache) result) result)))) -;; The old names `query-dns' and `query-dns-cached' weren't used in Emacs 23 -;; yet, so no alias are provided. --rsteib - (defun dns-query (name &optional type fullp reversep) "Query a DNS server for NAME of TYPE. If FULLP, return the entire record returned. @@ -409,17 +387,33 @@ If REVERSEP, look up an IP address." nil) (with-temp-buffer (set-buffer-multibyte nil) - (let* ((process (condition-case () - (dns-make-network-process (car dns-servers)) - (error - (message - "dns: Got an error while trying to talk to %s" - (car dns-servers)) - nil))) - (step 100) - (times (* dns-timeout 1000)) - (id (random 65000)) - (tcp-p (and process (not (process-contact process :type))))) + (let* ((process + (condition-case () + (let ((server (car dns-servers)) + (coding-system-for-read 'binary) + (coding-system-for-write 'binary)) + (if (featurep 'make-network-process '(:type datagram)) + (make-network-process + :name "dns" + :coding 'binary + :buffer (current-buffer) + :host server + :service "domain" + :type 'datagram) + ;; On MS-Windows datagram sockets are not + ;; supported, so we fall back on opening a TCP + ;; connection to the DNS server. + (open-network-stream "dns" (current-buffer) + server "domain"))) + (error + (message + "dns: Got an error while trying to talk to %s" + (car dns-servers)) + nil))) + (step 100) + (times (* dns-timeout 1000)) + (id (random 65000)) + (tcp-p (and process (not (process-contact process :type))))) (when process (process-send-string process -- cgit v1.2.3 From 789197049ca13a1434afccd6614134cc276a5074 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 30 Jul 2020 02:47:59 +0200 Subject: Use lexical binding in dns.el * lisp/net/dns.el: Use lexical-binding. (dns-write-bytes, dns-read): Adjust for lexical-binding. --- lisp/net/dns.el | 59 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/lisp/net/dns.el b/lisp/net/dns.el index e02c99ea0c3..1c46102554e 100644 --- a/lisp/net/dns.el +++ b/lisp/net/dns.el @@ -1,4 +1,4 @@ -;;; dns.el --- Domain Name Service lookups +;;; dns.el --- Domain Name Service lookups -*- lexical-binding:t -*- ;; Copyright (C) 2002-2020 Free Software Foundation, Inc. @@ -24,6 +24,8 @@ ;;; Code: +(require 'cl-lib) + (defvar dns-timeout 5 "How many seconds to wait when doing DNS queries.") @@ -73,7 +75,7 @@ updated. Set this variable to t to disable the check.") (defun dns-write-bytes (value &optional length) (let (bytes) - (dotimes (i (or length 1)) + (dotimes (_ (or length 1)) (push (% value 256) bytes) (setq value (/ value 256))) (dolist (byte bytes) @@ -81,7 +83,7 @@ updated. Set this variable to t to disable the check.") (defun dns-read-bytes (length) (let ((value 0)) - (dotimes (i length) + (dotimes (_ length) (setq value (logior (* value 256) (following-char))) (forward-char 1)) value)) @@ -229,7 +231,7 @@ If TCP-P, the first two bytes of the packet will be the length field." (setq authorities (dns-read-bytes 2)) (setq additionals (dns-read-bytes 2)) (let ((qs nil)) - (dotimes (i queries) + (dotimes (_ queries) (push (list (dns-read-name) (list 'type (dns-inverse-get (dns-read-bytes 2) dns-query-types)) @@ -237,26 +239,31 @@ If TCP-P, the first two bytes of the packet will be the length field." dns-classes))) qs)) (push (list 'queries qs) spec)) - (dolist (slot '(answers authorities additionals)) - (let ((qs nil) - type) - (dotimes (i (symbol-value slot)) - (push (list (dns-read-name) - (list 'type - (setq type (dns-inverse-get (dns-read-bytes 2) - dns-query-types))) - (list 'class (dns-inverse-get (dns-read-bytes 2) - dns-classes)) - (list 'ttl (dns-read-bytes 4)) - (let ((length (dns-read-bytes 2))) - (list 'data - (dns-read-type - (buffer-substring - (point) - (progn (forward-char length) (point))) - type)))) - qs)) - (push (list slot qs) spec))) + (cl-loop for (slot length) in `((answers ,answers) + (authorities ,authorities) + (additionals ,additionals)) + do (let ((qs nil) + type) + (dotimes (_ length) + (push (list (dns-read-name) + (list 'type + (setq type (dns-inverse-get + (dns-read-bytes 2) + dns-query-types))) + (list 'class (dns-inverse-get + (dns-read-bytes 2) + dns-classes)) + (list 'ttl (dns-read-bytes 4)) + (let ((length (dns-read-bytes 2))) + (list 'data + (dns-read-type + (buffer-substring + (point) + (progn (forward-char length) + (point))) + type)))) + qs)) + (push (list slot qs) spec))) (nreverse spec)))) (defun dns-read-int32 () @@ -274,12 +281,12 @@ If TCP-P, the first two bytes of the packet will be the length field." (cond ((eq type 'A) (let ((bytes nil)) - (dotimes (i 4) + (dotimes (_ 4) (push (dns-read-bytes 1) bytes)) (mapconcat 'number-to-string (nreverse bytes) "."))) ((eq type 'AAAA) (let (hextets) - (dotimes (i 8) + (dotimes (_ 8) (push (dns-read-bytes 2) hextets)) (mapconcat (lambda (n) (format "%x" n)) (nreverse hextets) ":"))) -- cgit v1.2.3 From ef7f569cbd3a69a77c09bc214baacd47737f7e01 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 30 Jul 2020 03:44:45 +0200 Subject: Add the new function dns-query-asynchronous * lisp/net/dns.el (dns-query-asynchronous): New function. (dns--lookup, dns--filter): New internal functions. (dns-query): Reimplement on top of dns-query-asynchronous. --- etc/NEWS | 5 ++ lisp/net/dns.el | 176 +++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 123 insertions(+), 58 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 8f5864961d2..fab2d85e8da 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -637,6 +637,11 @@ Formerly it made an exception for integer components of SOA records, because SOA serial numbers can exceed fixnum ranges on 32-bit platforms. Emacs now supports bignums so this old glitch is no longer needed. +--- +** The new function 'dns-query-asynchronous' has been added. +It takes the same parameters as 'dns-query', but adds a callback +parameter. + ** The Lisp variables 'previous-system-messages-locale' and 'previous-system-time-locale' have been removed, as they were created by mistake and were not useful to Lisp code. diff --git a/lisp/net/dns.el b/lisp/net/dns.el index 1c46102554e..ef250f067ea 100644 --- a/lisp/net/dns.el +++ b/lisp/net/dns.el @@ -374,9 +374,14 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"." (set (intern key dns-cache) result) result)))) -(defun dns-query (name &optional type fullp reversep) +(defun dns-query-asynchronous (name callback &optional type fullp reversep) "Query a DNS server for NAME of TYPE. -If FULLP, return the entire record returned. +CALLBACK will be called with a single parameter: The result. + +If there's no result, or `dns-timeout' has passed, CALLBACK will +be called with nil as the parameter. + +If FULLP, return the entire record. If REVERSEP, look up an IP address." (setq type (or type 'A)) (unless (dns-servers-up-to-date-p) @@ -392,63 +397,118 @@ If REVERSEP, look up an IP address." (progn (message "No DNS server configuration found") nil) - (with-temp-buffer - (set-buffer-multibyte nil) - (let* ((process - (condition-case () - (let ((server (car dns-servers)) - (coding-system-for-read 'binary) - (coding-system-for-write 'binary)) - (if (featurep 'make-network-process '(:type datagram)) - (make-network-process - :name "dns" - :coding 'binary - :buffer (current-buffer) - :host server - :service "domain" - :type 'datagram) - ;; On MS-Windows datagram sockets are not - ;; supported, so we fall back on opening a TCP - ;; connection to the DNS server. + (dns--lookup name callback type fullp))) + +(defun dns--lookup (name callback type full) + (with-current-buffer (generate-new-buffer " *dns*") + (set-buffer-multibyte nil) + (let* ((tcp nil) + (process + (condition-case () + (let ((server (car dns-servers)) + (coding-system-for-read 'binary) + (coding-system-for-write 'binary)) + (if (featurep 'make-network-process '(:type datagram)) + (make-network-process + :name "dns" + :coding 'binary + :buffer (current-buffer) + :host server + :service "domain" + :type 'datagram) + ;; On MS-Windows datagram sockets are not + ;; supported, so we fall back on opening a TCP + ;; connection to the DNS server. + (progn + (setq tcp t) (open-network-stream "dns" (current-buffer) - server "domain"))) - (error - (message - "dns: Got an error while trying to talk to %s" - (car dns-servers)) - nil))) - (step 100) - (times (* dns-timeout 1000)) - (id (random 65000)) - (tcp-p (and process (not (process-contact process :type))))) - (when process - (process-send-string - process - (dns-write `((id ,id) - (opcode query) - (queries ((,name (type ,type)))) - (recursion-desired-p t)) - tcp-p)) - (while (and (zerop (buffer-size)) - (> times 0)) - (let ((step-sec (/ step 1000.0))) - (sit-for step-sec) - (accept-process-output process step-sec)) - (setq times (- times step))) - (condition-case nil - (delete-process process) - (error nil)) - (when (and (>= (buffer-size) 2) - ;; We had a time-out. - (> times 0)) - (let ((result (dns-read (buffer-string) tcp-p))) - (if fullp - result - (let ((answer (car (dns-get 'answers result)))) - (when (eq type (dns-get 'type answer)) - (if (eq type 'TXT) - (dns-get-txt-answer (dns-get 'answers result)) - (dns-get 'data answer)))))))))))) + server "domain")))) + (error + (message + "dns: Got an error while trying to talk to %s" + (car dns-servers)) + nil))) + (triggered nil) + (buffer (current-buffer)) + timer) + (if (not process) + (progn + (kill-buffer buffer) + (funcall callback nil)) + ;; Call the callback if we don't get any response at all. + (setq timer (run-at-time dns-timeout nil + (lambda () + (unless triggered + (setq triggered t) + (delete-process process) + (kill-buffer buffer) + (funcall callback nil))))) + (process-send-string + process + (dns-write `((id ,(random 65000)) + (opcode query) + (queries ((,name (type ,type)))) + (recursion-desired-p t)) + tcp)) + (set-process-filter + process + (lambda (process string) + (with-current-buffer (process-buffer process) + (goto-char (point-max)) + (insert string) + (goto-char (point-min)) + ;; If this is DNS, then we always get the full data in + ;; one packet. If it's TCP, we may only get part of the + ;; data, but the first two bytes says how long the data + ;; is supposed to be. + (when (or (not tcp) + (>= (buffer-size) (dns-read-bytes 2))) + (setq triggered t) + (cancel-timer timer) + (dns--filter process callback type full tcp))))) + ;; In case we the process is deleted for some reason, then do + ;; a failure callback. + (set-process-sentinel + process + (lambda (_ state) + (when (and (eq state 'deleted) + ;; Ensure we don't trigger this callback twice. + (not triggered)) + (setq triggered t) + (cancel-timer timer) + (kill-buffer buffer) + (funcall callback nil)))))))) + +(defun dns--filter (process callback type full tcp) + (let ((message (buffer-string))) + (when (process-live-p process) + (delete-process process)) + (kill-buffer (current-buffer)) + (when (>= (length message) 2) + (let ((result (dns-read message tcp))) + (funcall callback + (if full + result + (let ((answer (car (dns-get 'answers result)))) + (when (eq type (dns-get 'type answer)) + (if (eq type 'TXT) + (dns-get-txt-answer (dns-get 'answers result)) + (dns-get 'data answer)))))))))) + +(defun dns-query (name &optional type fullp reversep) + "Query a DNS server for NAME of TYPE. +If FULLP, return the entire record returned. +If REVERSEP, look up an IP address." + (let ((result nil)) + (dns-query-asynchronous + name + (lambda (response) + (setq result (list response))) + type fullp reversep) + ;; Loop until we get the callback. + (while (not result) + (sleep-for 0.01)) + (car result))) (provide 'dns) -- cgit v1.2.3 From a0b18d3cc22331a7c30520d654a85330a9557e6e Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 30 Jul 2020 05:29:42 +0200 Subject: Make libravatar lookups asynchronous * lisp/gnus/gnus-gravatar.el (gnus-gravatar-insert): Fix check for repeated gravatars, which is now easier to trigger now that things are more asynchronous. * lisp/image/gravatar.el (gravatar--service-libravatar): Fetch the data asynchronously (bug#40676). (gravatar-service-alist): Adjust all providers so they are asynchronous. (gravatar-build-url): Adjust caller to be asynchronous. (gravatar-retrieve): Ditto. (gravatar-retrieve-synchronously): Ditto. --- lisp/gnus/gnus-gravatar.el | 14 +++++---- lisp/image/gravatar.el | 74 ++++++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/lisp/gnus/gnus-gravatar.el b/lisp/gnus/gnus-gravatar.el index e2bd4ed860c..9c24de44cd6 100644 --- a/lisp/gnus/gnus-gravatar.el +++ b/lisp/gnus/gnus-gravatar.el @@ -109,14 +109,16 @@ callback for `gravatar-retrieve'." ;; If we're on the " quoting the name, go backward. (when (looking-at-p "[\"<]") (goto-char (1- (point)))) - ;; Do not do anything if there's already a gravatar. This can - ;; happen if the buffer has been regenerated in the mean time, for - ;; example we were fetching someaddress, and then we change to - ;; another mail with the same someaddress. - (unless (get-text-property (point) 'gnus-gravatar) + ;; Do not do anything if there's already a gravatar. + ;; This can happen if the buffer has been regenerated in + ;; the mean time, for example we were fetching + ;; someaddress, and then we change to another mail with + ;; the same someaddress. + (unless (get-text-property (1- (point)) 'gnus-gravatar) (let ((pos (point))) (setq gravatar (append gravatar gnus-gravatar-properties)) - (gnus-put-image gravatar (buffer-substring pos (1+ pos)) category) + (gnus-put-image gravatar (buffer-substring pos (1+ pos)) + category) (put-text-property pos (point) 'gnus-gravatar address) (gnus-add-wash-type category) (gnus-add-image category gravatar))))) diff --git a/lisp/image/gravatar.el b/lisp/image/gravatar.el index 5b5c27dbe17..ff612d2e9f3 100644 --- a/lisp/image/gravatar.el +++ b/lisp/image/gravatar.el @@ -120,8 +120,10 @@ a gravatar for a given email address." :group 'gravatar) (defconst gravatar-service-alist - `((gravatar . ,(lambda (_addr) "https://www.gravatar.com/avatar")) - (unicornify . ,(lambda (_addr) "https://unicornify.pictures/avatar/")) + `((gravatar . ,(lambda (_addr callback) + (funcall callback "https://www.gravatar.com/avatar"))) + (unicornify . ,(lambda (_addr callback) + (funcall callback "https://unicornify.pictures/avatar/"))) (libravatar . ,#'gravatar--service-libravatar)) "Alist of supported gravatar services.") @@ -141,23 +143,31 @@ to track whether you're reading a specific mail." :link '(url-link "https://gravatar.com/") :group 'gravatar) -(defun gravatar--service-libravatar (addr) +(defun gravatar--service-libravatar (addr callback) "Find domain that hosts avatars for email address ADDR." ;; implements https://wiki.libravatar.org/api/ (save-match-data (if (not (string-match ".+@\\(.+\\)" addr)) - "https://seccdn.libravatar.org/avatar" - (let ((domain (match-string 1 addr))) - (catch 'found - (dolist (record '(("_avatars-sec" . "https") - ("_avatars" . "http"))) - (let* ((query (concat (car record) "._tcp." domain)) - (result (dns-query query 'SRV))) - (when result - (throw 'found (format "%s://%s/avatar" - (cdr record) - result))))) - "https://seccdn.libravatar.org/avatar"))))) + (funcall callback "https://seccdn.libravatar.org/avatar") + (let ((domain (match-string 1 addr)) + (records '(("_avatars-sec" . "https") + ("_avatars" . "http"))) + func) + (setq func + (lambda (result) + (cond + (result + (funcall callback (format "%s://%s/avatar" + (cdar records) result))) + ((> (length records) 1) + (pop records) + (dns-query-asynchronous + (concat (caar records) "._tcp." domain) + func 'SRV)) + (t + (funcall callback "https://seccdn.libravatar.org/avatar"))))) + (dns-query-asynchronous + (concat (caar records) "._tcp." domain) func 'SRV))))) (defun gravatar-hash (mail-address) "Return the Gravatar hash for MAIL-ADDRESS." @@ -175,14 +185,17 @@ to track whether you're reading a specific mail." ,@(and gravatar-size `((s ,gravatar-size)))))) -(defun gravatar-build-url (mail-address) - "Return the URL of a gravatar for MAIL-ADDRESS." +(defun gravatar-build-url (mail-address callback) + "Find the URL of a gravatar for MAIL-ADDRESS and call CALLBACK with it." ;; https://gravatar.com/site/implement/images/ - (format "%s/%s?%s" - (funcall (alist-get gravatar-service gravatar-service-alist) - mail-address) - (gravatar-hash mail-address) - (gravatar--query-string))) + (funcall (alist-get gravatar-service gravatar-service-alist) + mail-address + (lambda (url) + (funcall callback + (format "%s/%s?%s" + url + (gravatar-hash mail-address) + (gravatar--query-string)))))) (defun gravatar-get-data () "Return body of current URL buffer, or nil on failure." @@ -198,18 +211,23 @@ to track whether you're reading a specific mail." When finished, call CALLBACK as (apply CALLBACK GRAVATAR CBARGS), where GRAVATAR is either an image descriptor, or the symbol `error' if the retrieval failed." - (let ((url (gravatar-build-url mail-address))) - (if (url-cache-expired url gravatar-cache-ttl) - (url-retrieve url #'gravatar-retrieved (list callback cbargs) t) - (with-current-buffer (url-fetch-from-cache url) - (gravatar-retrieved () callback cbargs))))) + (gravatar-build-url + mail-address + (lambda (url) + (if (url-cache-expired url gravatar-cache-ttl) + (url-retrieve url #'gravatar-retrieved (list callback cbargs) t) + (with-current-buffer (url-fetch-from-cache url) + (gravatar-retrieved () callback cbargs)))))) ;;;###autoload (defun gravatar-retrieve-synchronously (mail-address) "Synchronously retrieve a gravatar for MAIL-ADDRESS. Value is either an image descriptor, or the symbol `error' if the retrieval failed." - (let ((url (gravatar-build-url mail-address))) + (let ((url nil)) + (gravatar-build-url mail-address (lambda (u) (setq url u))) + (while (not url) + (sleep-for 0.01)) (with-current-buffer (if (url-cache-expired url gravatar-cache-ttl) (url-retrieve-synchronously url t) (url-fetch-from-cache url)) -- cgit v1.2.3 From 50ea5b871dd264e3a7fd6c3977e021f1a365cb5f Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Thu, 30 Jul 2020 13:46:22 +0200 Subject: Fix Tramp bug#42538 * lisp/net/tramp-sh.el (tramp-set-remote-path): Send the command in several chunks if it is too large. (Bug#42538) --- lisp/net/tramp-sh.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 4dc95b1bb05..1a867c30feb 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -4004,22 +4004,28 @@ whether it exists and if so, it is added to the environment variable PATH." (let ((command (format - "PATH=%s; export PATH" (string-join (tramp-get-remote-path vec) ":"))) + "PATH=%s && export PATH" (string-join (tramp-get-remote-path vec) ":"))) (pipe-buf (with-tramp-connection-property vec "pipe-buf" (tramp-send-command-and-read vec "getconf PIPE_BUF / 2>/dev/null || echo 4096" 'noerror))) - tmpfile) + tmpfile chunk chunksize) (tramp-message vec 5 "Setting $PATH environment variable") (if (< (length command) pipe-buf) (tramp-send-command vec command) - ;; Use a temporary file. - (setq tmpfile (tramp-make-tramp-temp-file vec)) - (tramp-send-command vec (format - "cat >%s <<'%s'\n%s\n%s" - (tramp-shell-quote-argument tmpfile) - tramp-end-of-heredoc - command tramp-end-of-heredoc)) + ;; Use a temporary file. We cannot use `write-region' because + ;; setting the remote path happens in the early connection + ;; handshake, and not all external tools are determined yet. + (setq command (concat command "\n") + tmpfile (tramp-make-tramp-temp-file vec)) + (while (not (string-empty-p command)) + (setq chunksize (min (length command) (/ pipe-buf 2)) + chunk (substring command 0 chunksize) + command (substring command chunksize)) + (tramp-send-command vec (format + "echo -n %s >>%s" + (tramp-shell-quote-argument chunk) + (tramp-shell-quote-argument tmpfile)))) (tramp-send-command vec (format ". %s" tmpfile)) (tramp-send-command vec (format "rm -f %s" tmpfile))))) -- cgit v1.2.3 From 35564bea4d73bc266743216599d01d644aed6fd8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 30 Jul 2020 16:56:36 +0300 Subject: Fix face extension past EOL in overlay strings * src/xdisp.c (face_at_pos): Pass ATTR_FILTER to face_for_overlay_string. * src/xfaces.c (face_for_overlay_string): Accept an additional argument ATTR_INDEX and pass it to merge_face_ref for merging the face at POS. This ensures a face from buffer text will not be merged unless it specifies the :extend attribute. (Bug#42552) * src/dispextern.h (face_for_overlay_string): Adjust prototype. --- src/dispextern.h | 2 +- src/xdisp.c | 2 +- src/xfaces.c | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/dispextern.h b/src/dispextern.h index e1d6eddc419..311867a0c8c 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3538,7 +3538,7 @@ void recompute_basic_faces (struct frame *); int face_at_buffer_position (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, bool, int, enum lface_attribute_index); int face_for_overlay_string (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, - bool, Lisp_Object); + bool, Lisp_Object, enum lface_attribute_index); int face_at_string_position (struct window *, Lisp_Object, ptrdiff_t, ptrdiff_t, ptrdiff_t *, enum face_id, bool, enum lface_attribute_index); diff --git a/src/xdisp.c b/src/xdisp.c index eb7f3e7baa1..fc17014c029 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -4339,7 +4339,7 @@ face_at_pos (const struct it *it, enum lface_attribute_index attr_filter) (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT), false, - from_overlay); + from_overlay, attr_filter); } else { diff --git a/src/xfaces.c b/src/xfaces.c index c4a4e1c94f3..585cfa1cf4a 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -6475,7 +6475,8 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, int face_for_overlay_string (struct window *w, ptrdiff_t pos, ptrdiff_t *endptr, ptrdiff_t limit, - bool mouse, Lisp_Object overlay) + bool mouse, Lisp_Object overlay, + enum lface_attribute_index attr_filter) { struct frame *f = XFRAME (w->frame); Lisp_Object attrs[LFACE_VECTOR_SIZE]; @@ -6514,7 +6515,7 @@ face_for_overlay_string (struct window *w, ptrdiff_t pos, /* Merge in attributes specified via text properties. */ if (!NILP (prop)) - merge_face_ref (w, f, prop, attrs, true, NULL, 0); + merge_face_ref (w, f, prop, attrs, true, NULL, attr_filter); *endptr = endpos; -- cgit v1.2.3 From 88b4516cf8c3ff39803430452b8adbb86a73642a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 30 Jul 2020 09:22:01 -0700 Subject: Port to Oracle Studio 12.6 (sparc) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * src/alloc.c (__builtin_unwind_init) [!HAVE___BUILTIN_UNWIND_INIT]: Move from here ... * src/lisp.h: ... to here, since flush_stack_call_func uses it. * src/pdumper.c (dump_off_from_lisp): Avoid ‘return n;;’ to pacify Oracle Studio. --- src/alloc.c | 31 ++++--------------------------- src/lisp.h | 19 +++++++++++++++++++ src/pdumper.c | 3 ++- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index ed30c449785..76bb20876b0 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4966,27 +4966,6 @@ typedef union #endif } stacktop_sentry; -/* Force callee-saved registers and register windows onto the stack. - Use the platform-defined __builtin_unwind_init if available, - obviating the need for machine dependent methods. */ -#ifndef HAVE___BUILTIN_UNWIND_INIT -# ifdef __sparc__ - /* This trick flushes the register windows so that all the state of - the process is contained in the stack. - FreeBSD does not have a ta 3 handler, so handle it specially. - FIXME: Code in the Boehm GC suggests flushing (with 'flushrs') is - needed on ia64 too. See mach_dep.c, where it also says inline - assembler doesn't work with relevant proprietary compilers. */ -# if defined __sparc64__ && defined __FreeBSD__ -# define __builtin_unwind_init() asm ("flushw") -# else -# define __builtin_unwind_init() asm ("ta 3") -# endif -# else -# define __builtin_unwind_init() ((void) 0) -# endif -#endif - /* Yield an address close enough to the top of the stack that the garbage collector need not scan above it. Callers should be declared NO_INLINE. */ @@ -5022,16 +5001,14 @@ typedef union We have to mark Lisp objects in CPU registers that can hold local variables or are used to pass parameters. - This code assumes that calling setjmp saves registers we need + If __builtin_unwind_init is available, it should suffice to save + registers. + + Otherwise, assume that calling setjmp saves registers we need to see in a jmp_buf which itself lies on the stack. This doesn't have to be true! It must be verified for each system, possibly by taking a look at the source code of setjmp. - If __builtin_unwind_init is available (defined by GCC >= 2.8) we - can use it as a machine independent method to store all registers - to the stack. In this case the macros described in the previous - two paragraphs are not used. - Stack Layout Architectures differ in the way their processor stack is organized. diff --git a/src/lisp.h b/src/lisp.h index 7b4f484b9b7..fdf69ab7368 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3811,6 +3811,25 @@ extern void mark_maybe_objects (Lisp_Object const *, ptrdiff_t); extern void mark_stack (char const *, char const *); extern void flush_stack_call_func1 (void (*func) (void *arg), void *arg); +/* Force callee-saved registers and register windows onto the stack, + so that conservative garbage collection can see their values. */ +#ifndef HAVE___BUILTIN_UNWIND_INIT +# ifdef __sparc__ + /* This trick flushes the register windows so that all the state of + the process is contained in the stack. + FreeBSD does not have a ta 3 handler, so handle it specially. + FIXME: Code in the Boehm GC suggests flushing (with 'flushrs') is + needed on ia64 too. See mach_dep.c, where it also says inline + assembler doesn't work with relevant proprietary compilers. */ +# if defined __sparc64__ && defined __FreeBSD__ +# define __builtin_unwind_init() asm ("flushw") +# else +# define __builtin_unwind_init() asm ("ta 3") +# endif +# else +# define __builtin_unwind_init() ((void) 0) +# endif +#endif INLINE void flush_stack_call_func (void (*func) (void *arg), void *arg) { diff --git a/src/pdumper.c b/src/pdumper.c index 7f6876666be..865ceff6fff 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -747,8 +747,9 @@ dump_off_from_lisp (Lisp_Object value) intmax_t n = intmax_t_from_lisp (value); eassert (DUMP_OFF_MIN <= n && n <= DUMP_OFF_MAX); ALLOW_IMPLICIT_CONVERSION; - return n; + dump_off converted = n; DISALLOW_IMPLICIT_CONVERSION; + return converted; } static Lisp_Object -- cgit v1.2.3 From 748f0d4bc65b601dd05077d26361eda35289778f Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Wed, 29 Jul 2020 22:48:14 +0200 Subject: * admin/authors.el (authors-aliases): Remove a faulty regexp. --- admin/authors.el | 1 - 1 file changed, 1 deletion(-) diff --git a/admin/authors.el b/admin/authors.el index acaa7dfaa77..a418efea44f 100644 --- a/admin/authors.el +++ b/admin/authors.el @@ -212,7 +212,6 @@ files.") ("Carlos Pita" "memeplex") ("Vinicius Jose Latorre" "viniciusjl") ("Gaby Launay" "galaunay") - ("Alex Gramiak" "alex") ("Dick R. Chiang" "dickmao") ) "Alist of author aliases. -- cgit v1.2.3 From e12d1fbc1568cc90b3b99bb6b9f244e5d10e97a4 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Wed, 29 Jul 2020 22:50:01 +0200 Subject: ; ChangeLog.3 and etc/AUTHORS fixes --- ChangeLog.3 | 2 +- etc/AUTHORS | 136 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 105 insertions(+), 33 deletions(-) diff --git a/ChangeLog.3 b/ChangeLog.3 index 4aa52a762fc..c8dd40b5eb6 100644 --- a/ChangeLog.3 +++ b/ChangeLog.3 @@ -58779,7 +58779,7 @@ * lisp/net/soap-client.el (soap-type-of): Optimize for Emacs≥26 -2018-07-17 Alex +2018-07-17 Alexander Gramiak Remove menu name from emacs-lisp-mode-map (Bug#27114) diff --git a/etc/AUTHORS b/etc/AUTHORS index 2d4e0731202..848d9e07f9d 100644 --- a/etc/AUTHORS +++ b/etc/AUTHORS @@ -127,18 +127,84 @@ Albert L. Ting: changed gnus-group.el mail-hist.el Aleksei Gusev: changed progmodes/compile.el -Alexandru Harsanyi: changed soap-client.el soap-inspect.el emacs3.py - vc-hooks.el vc.el xml.el +Alexander Becher: changed vc-annotate.el -Alex Gramiak: wrote ansi-color.el conf-mode-tests.el cus-theme.el - erc-compat.el erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el - erc.el gnus-mlspl.el master.el soap-client.el soap-inspect.el - spam-stat.el sql.el vc-git.el which-func.el +Alexander Gramiak: changed w32term.c xterm.c nsterm.m dispextern.h + xdisp.c frame.c image.c nsgui.h w32gui.h xfns.c frame.el termhooks.h + w32fns.c w32term.h faces.el nsterm.h xfaces.c xterm.h frame.h xfont.c + configure.ac and 65 other files + +Alexander Haeckel: changed getset.el + +Alexander Klimov: changed files.el calc-graph.el files.texi man.el rx.el + sendmail.el + +Alexander Kreuzer: changed nnrss.el + +Alexander Kuleshov: changed dns-mode.el files.texi image-mode.el + keyboard.c ld-script.el xdisp.c + +Alexander L. Belikoff: wrote erc.el + +Alexander Pohoyda: co-wrote mail/rmailmm.el +and changed rmailsum.el man.el rmail.el sendmail.el + +Alexander Shopov: changed code-pages.el + +Alexander Vorobiev: changed org-compat.el + +Alexander Zhuckov: changed ebrowse.c + +Alexandre Garreau: changed message.el + +Alexandre Julliard: wrote vc-git.el +and changed vc.el ewoc.el + +Alexandre Oliva: wrote gnus-mlspl.el +and changed unexelf.c format.el iris4d.h iris5d.h regex.c unexsgi.c + +Alexandre Veyrenc: changed fr-refcard.tex + +Alexandru Harsanyi: wrote soap-client.el soap-inspect.el +and changed emacs3.py vc-hooks.el vc.el xml.el + +Alex Branham: changed checkdoc.el bibtex.el em-rebind.el esh-util.el + indent.el js.el lpr.el message.el subr.el text.texi .dir-locals.el + auth-source-pass.el bug-reference.el comint.el conf-mode-tests.el + conf-mode.el dired-x.el dired.el ediff-diff.el ediff-help.el + ediff-hook.el and 41 other files + +Alex Coventry: changed files.el + +Alex Dunn: changed subr-tests.el subr.el + +Alexei Khlebnikov: changed autorevert.el vc-git.el + +Alex Gramiak: changed prolog.el terminal.c + +Alex Kosorukoff: changed org-capture.el + +Alex Murray: changed erc-desktop-notifications.el network-stream.el + +Alex Ott: changed TUTORIAL.ru ede/files.el ru-refcard.tex base.el + cedet-files.el cpp-root.el ede.el ede/generic.el idle.el ispell.el + semantic/format.el + +Alex Reed: changed verilog-mode.el + +Alex Rezinsky: wrote which-func.el + +Alex Schroeder: wrote ansi-color.el cus-theme.el erc-compat.el + erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el master.el + spam-stat.el sql.el and co-wrote longlines.el mail/rmailmm.el -and changed erc-track.el erc-button.el w32term.c xterm.c erc-stamp.el - nsterm.m xdisp.c dispextern.h frame.c image.c nsgui.h w32gui.h xfns.c - erc-match.el frame.el termhooks.h w32fns.c Makefile TUTORIAL.ru - erc-autoaway.el erc-nickserv.el and 215 other files +and changed erc.el erc-track.el erc-button.el erc-stamp.el erc-match.el + erc-autoaway.el erc-nickserv.el rcirc.texi Makefile erc-autojoin.el + erc-fill.el erc-pcomplete.el erc-complete.el erc-ibuffer.el + erc-members.el rmail.el comint.el custom.el erc-bbdb.el erc-chess.el + erc-ezbounce.el and 35 other files + +Alex Shinn: changed files.el Alfred Correira: changed generic-x.el @@ -700,7 +766,7 @@ and co-wrote longlines.el tango-dark-theme.el tango-theme.el and changed simple.el display.texi xdisp.c files.el frames.texi cus-edit.el files.texi custom.el subr.el text.texi faces.el keyboard.c startup.el package.el misc.texi emacs.texi modes.texi mouse.el - custom.texi image.c window.el and 933 other files + custom.texi image.c window.el and 934 other files Chris Chase: co-wrote idlw-shell.el idlwave.el @@ -1381,7 +1447,7 @@ Eli Zaretskii: wrote [bidirectional display in xdisp.c] and changed xdisp.c msdos.c w32.c display.texi w32fns.c simple.el files.el fileio.c keyboard.c w32term.c emacs.c w32proc.c files.texi text.texi dispnew.c frames.texi lisp.h dispextern.h window.c process.c - term.c and 1191 other files + term.c and 1192 other files Emanuele Giaquinta: changed configure.ac rxvt.el charset.c etags.c fontset.c frame.el gnus-faq.texi loadup.el lread.c sh-script.el @@ -1466,7 +1532,7 @@ and changed c.srt ede.texi info.el rmail.el speedbspec.el cedet.el ede-autoconf.srt ede-make.srt eieio.texi gud.el sb-dir-minus.xpm sb-dir-plus.xpm sb-dir.xpm sb-mail.xpm sb-pg-minus.xpm sb-pg-plus.xpm sb-pg.xpm sb-tag-gt.xpm sb-tag-minus.xpm sb-tag-plus.xpm - and 50 other files + and 51 other files Eric Schulte: wrote ob-asymptote.el ob-awk.el ob-calc.el ob-comint.el ob-coq.el ob-css.el ob-ditaa.el ob-dot.el ob-emacs-lisp.el ob-eval.el @@ -1793,7 +1859,7 @@ and changed configure.ac Makefile.in src/Makefile.in calendar.el diary-lib.el lisp/Makefile.in files.el make-dist rmail.el progmodes/f90.el bytecomp.el simple.el authors.el admin.el startup.el emacs.texi misc/Makefile.in display.texi lib-src/Makefile.in ack.texi - subr.el and 1760 other files + subr.el and 1761 other files Glynn Clements: wrote gamegrid.el snake.el tetris.el @@ -1925,7 +1991,7 @@ Hideki Iwamoto: changed etags.c Hiroshi Fujishima: changed efaq.texi gnus-score.el mail-source.el spam-stat.el -Hiroshi Nakano: changed ralloc.c unexelf.c +Hiroshi Nakano: changed unexelf.c ralloc.c Hiroshi Oota: changed coding.c @@ -2085,6 +2151,8 @@ Jaeyoun Chung: changed hangul3.el hanja3.el gnus-mule.el hangul.el Jakub-W: changed calculator.el +J. Alexander Branham: wrote conf-mode-tests.el + Jambunathan K: wrote ox-odt.el and co-wrote ox-html.el and changed org-lparse.el org.el org.texi ox.el icomplete.el @@ -2121,7 +2189,7 @@ James Wright: changed em-unix.el Jamie Zawinski: wrote mailabbrev.el tar-mode.el and co-wrote byte-opt.el byte-run.el bytecomp.el disass.el font-lock.el -and changed bytecode.c mail-extr.el subr.el +and changed mail-extr.el subr.el bytecode.c Jan Beich: changed configure.ac mml-smime.el @@ -2578,7 +2646,7 @@ and changed xterm.c xfns.c keyboard.c screen.c dispnew.c xdisp.c window.c process.c alloc.c buffer.h files.el screen.el insdel.c emacs.c and 106 other files -Joseph M. Kelsey: changed fileio.c skeleton.el +Joseph M. Kelsey: changed skeleton.el fileio.c Josh Elsasser: changed configure.ac @@ -2652,7 +2720,7 @@ Juri Linkov: wrote files-x.el misearch.el replace-tests.el tab-bar.el and changed isearch.el info.el simple.el replace.el dired.el dired-aux.el progmodes/grep.el image-mode.el progmodes/compile.el startup.el subr.el diff-mode.el files.el menu-bar.el faces.el display.texi bindings.el - desktop.el comint.el minibuffer.el search.texi and 419 other files + desktop.el comint.el minibuffer.el search.texi and 420 other files Jussi Lahdenniemi: changed w32fns.c ms-w32.h msdos.texi w32.c w32.h w32console.c w32heap.c w32inevt.c w32term.h @@ -2676,7 +2744,7 @@ and co-wrote longlines.el tramp-sh.el tramp.el and changed message.el gnus-agent.el gnus-sum.el files.el nnmail.el tramp.texi nntp.el gnus.el simple.el ange-ftp.el dired.el paragraphs.el bindings.el files.texi gnus-art.el gnus-group.el man.el INSTALL - Makefile.in crisp.el fileio.c and 44 other files + Makefile.in crisp.el fileio.c and 45 other files Kailash C. Chowksey: changed HELLO ind-util.el kannada.el knd-util.el lisp/Makefile.in loadup.el @@ -3080,7 +3148,7 @@ Luc Teirlinck: wrote help-at-pt.el and changed files.el autorevert.el cus-edit.el subr.el simple.el frames.texi startup.el display.texi files.texi dired.el comint.el modes.texi custom.texi emacs.texi fns.c frame.el ielm.el minibuf.texi - variables.texi buffers.texi commands.texi and 211 other files + variables.texi buffers.texi commands.texi and 212 other files Ludovic Courtès: wrote nnregistry.el and changed configure.ac gnus.texi loadup.el @@ -3505,7 +3573,7 @@ Michael Olson: changed erc.el erc-backend.el Makefile erc-track.el erc-log.el erc-stamp.el erc-autoaway.el erc-dcc.el erc-goodies.el erc-list.el erc-compat.el erc-identd.el erc.texi ERC-NEWS erc-bbdb.el erc-match.el erc-notify.el erc-ibuffer.el erc-services.el remember.el - erc-button.el and 54 other files + erc-button.el and 55 other files Michael Orlitzky: changed tex-mode.el @@ -3924,7 +3992,7 @@ and co-wrote cal-dst.el and changed lisp.h configure.ac alloc.c process.c fileio.c editfns.c xdisp.c sysdep.c image.c keyboard.c emacs.c data.c fns.c lread.c xterm.c eval.c callproc.c Makefile.in frame.c buffer.c gnulib-comp.m4 - and 1822 other files + and 1824 other files Paul Fisher: changed fns.c @@ -4357,7 +4425,7 @@ and changed process.c ftfont.c gtkutil.c processes.texi vc-git.el configure.ac font.c network-stream.el nsm.el process-tests.el xfns.c custom.texi dispextern.h files.texi ftcrfont.c gnus-icalendar.el gnutls.el gtkutil.h network-stream-tests.el nsterm.m text.texi - and 92 other files + and 93 other files Robert Thorpe: changed cus-start.el indent.el @@ -4379,8 +4447,8 @@ Rodrigo Real: changed pt-br-refcard.tex Roger Breitenstein: changed smtpmail.el -Roland B. Roberts: changed buffer.h callproc.c dired.c files.el - gnus-group.el gnus-sum.el process.c sort.el sysdep.c systty.h +Roland B. Roberts: changed gnus-group.el gnus-sum.el buffer.h callproc.c + dired.c files.el process.c sort.el sysdep.c systty.h Roland Kaufmann: changed ox.el @@ -4644,7 +4712,7 @@ Shun-ichi Goto: changed url-http.el Shyam Karanatt: changed image-mode.el -Sidney Markowitz: changed doctor.el nsmenu.m +Sidney Markowitz: changed nsmenu.m doctor.el Sigbjorn Finne: changed gnus-srvr.el @@ -4767,7 +4835,7 @@ and changed wdired.el todo-mode.texi diary-lib.el wdired-tests.el dired-tests.el doc-view.el files.el minibuffer.el dired.el frames.texi hl-line.el info.el menu-bar.el mouse.el otodo-mode.el subr.el .gitattributes TUTORIAL allout.el artist.el compile.texi - and 44 other files + and 45 other files Stephen C. Gilardi: changed configure.ac @@ -4939,7 +5007,7 @@ Teodor Zlatanov: wrote auth-source.el gnus-registry.el gnus-tests.el and changed spam.el gnus.el nnimap.el gnus.texi gnutls.c gnus-sum.el auth.texi cfengine.el gnus-sync.el gnus-util.el gnus-start.el netrc.el gnutls.h message.el spam-stat.el encrypt.el mail-source.el nnir.el - nnmail.el auth-source-tests.el configure.ac and 119 other files + nnmail.el auth-source-tests.el configure.ac and 120 other files Terje Rosten: changed xfns.c version.el xterm.c xterm.h @@ -5140,7 +5208,7 @@ and co-wrote package.el tcl.el and changed data.c lisp.h js.el buffer.c data-tests.el alloc.c css-mode.el js-tests.el mhtml-mode.el process.c window.c editfns.c fns.c keyboard.c keymap.c lread.c makefile.el xfns.c bytecode.c cmds.c - configure.ac and 206 other files + configure.ac and 208 other files Tom Willemse: changed elec-pair.el package.el perl-mode.el prog-mode.el progmodes/python.el simple.el @@ -5239,6 +5307,8 @@ Valentin Gatien-Baron: changed emacs-module.c Valentin Wüstholz: changed org.el +Valery Alexeev: changed cyril-util.el cyrillic.el + Van L: changed subr.el Vasilij Schneidermann: changed cus-start.el eww.el cc-mode.el @@ -5298,6 +5368,8 @@ and changed erc-backend.el erc.el erc-services.el hexl.el emacs.c erc-button.el erc-capab.el erc-join.el htmlfontify.texi sh-script.el xterm.c xterm.h +Vladimir Alexiev: changed arc-mode.el nnvirtual.el tmm.el + Vladimir Kazanov: changed java.srt Vladimir Lomov: changed ox-html.el @@ -5402,9 +5474,9 @@ and changed configure.ac gmalloc.c gnus-agent.el image-mode.el man.el Wolfgang Lux: changed nsterm.m keyboard.c Wolfgang Rupprecht: wrote float-sup.el floatfns.c sup-mouse.el -and changed process.c alloc.c callint.c config.in configure.ac data.c - fns.c lisp-mode.el lisp.h loadup.el lread.c net-utils.el nntp.el - print.c sort.el +and changed process.c config.in configure.ac net-utils.el nntp.el alloc.c + callint.c data.c fns.c lisp-mode.el lisp.h loadup.el lread.c print.c + sort.el Wolfgang Scherer: changed vc-cvs.el vc-dir.el vc-svn.el vc.el pcvs.el -- cgit v1.2.3 From 5d89a9c2846d32b4726faaf5c8652f3f23dc7d73 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 30 Jul 2020 13:58:58 -0700 Subject: Update from Gnulib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This incorporates: 2020-07-30 work around some Oracle Studio attribute bugs 2020-07-29 fsusage, regex, stat-size: remove Cray support 2020-07-26 inttypes: remove support for AIX 4 2020-07-26 gettimeofday: remove workaround for Mac OS X 10.0 2020-07-26 don't require gl_LOCALTIME_BUFFER_DEFAULTS 2020-07-26 alloca: remove Cray-2 and Cray Y-MP support 2020-07-26 libgmp: remove dependency on havelib 2020-07-26 libgmp: remove HAVE_GMP, LIB_GMP 2020-07-25 multiarch: prepare for x86_64+arm64 universal in macOS 11 2020-07-25 sigprocmask: small autoconf macro improvement 2020-07-25 small autoconf macro improvements 2020-07-24 timespec: remove dependence on ‘verify’ 2020-07-24 optimize a few more three-valued comparisons 2020-07-24 fix _GL_CMP parenthesization typo 2020-07-23 optimize three-valued comparison between integers 2020-07-24 doc: update for Mac OS X 10.13 2020-07-23 fchmodat, lchmod: use /proc on Cygwin 2020-07-21 inttypes: fix PRI*PTR and SCN*PTR on 64-bit native Windows 2020-07-12 libgmp: avoid warning when --without-libgmp is used 2020-07-12 libgmp: link to the correct shared library * lib/mini-gmp-gnulib.c: Ignore -Wsuggest-attribute=malloc only for * build-aux/config.guess, build-aux/config.sub: * build-aux/install-sh, doc/misc/texinfo.tex, lib/c-strcasecmp.c: * lib/c-strncasecmp.c, lib/fchmodat.c, lib/fsusage.c: * lib/gettimeofday.c, lib/inttypes.in.h, lib/lchmod.c: * lib/mini-gmp-gnulib.c, lib/nstrftime.c, lib/regex.h, lib/timespec.h: * m4/alloca.m4, m4/getgroups.m4, m4/gettimeofday.m4: * m4/gnulib-common.m4, m4/inttypes.m4, m4/libgmp.m4, m4/mktime.m4: * m4/multiarch.m4: Copy from Gnulib. * lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate. * src/Makefile.in, test/Makefile.in (LIBGMP): Rename from LIB_GMP for compatibility with Gnulib. All uses changed. --- build-aux/config.guess | 5 +- build-aux/config.sub | 7 +- build-aux/install-sh | 115 ++++++------ doc/misc/texinfo.tex | 36 +++- lib/c-strcasecmp.c | 2 +- lib/c-strncasecmp.c | 2 +- lib/fchmodat.c | 2 +- lib/fsusage.c | 4 - lib/gettimeofday.c | 11 -- lib/gnulib.mk.in | 19 +- lib/inttypes.in.h | 462 +++++++++++++++++-------------------------------- lib/lchmod.c | 2 +- lib/mini-gmp-gnulib.c | 6 +- lib/nstrftime.c | 9 - lib/regex.h | 2 - lib/timespec.h | 41 +---- m4/alloca.m4 | 32 +--- m4/getgroups.m4 | 5 +- m4/gettimeofday.m4 | 61 +------ m4/gnulib-common.m4 | 37 +++- m4/gnulib-comp.m4 | 17 -- m4/inttypes.m4 | 18 +- m4/libgmp.m4 | 65 ++++--- m4/mktime.m4 | 35 ++-- m4/multiarch.m4 | 67 +++---- src/Makefile.in | 4 +- test/Makefile.in | 4 +- 27 files changed, 412 insertions(+), 658 deletions(-) diff --git a/build-aux/config.guess b/build-aux/config.guess index 92bfc33e296..e94095c5fbe 100755 --- a/build-aux/config.guess +++ b/build-aux/config.guess @@ -2,7 +2,7 @@ # Attempt to guess a canonical system name. # Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2020-04-26' +timestamp='2020-07-12' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -1342,6 +1342,9 @@ EOF *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in diff --git a/build-aux/config.sub b/build-aux/config.sub index ce89d5c546c..3d9a8dc3d5a 100755 --- a/build-aux/config.sub +++ b/build-aux/config.sub @@ -2,7 +2,7 @@ # Configuration validation subroutine script. # Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2020-06-28' +timestamp='2020-07-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -1104,6 +1104,9 @@ case $cpu-$vendor in xscale-* | xscalee[bl]-*) cpu=`echo "$cpu" | sed 's/^xscale/arm/'` ;; + arm64-*) + cpu=aarch64 + ;; # Recognize the canonical CPU Types that limit and/or modify the # company names they are paired with. @@ -1163,7 +1166,7 @@ case $cpu-$vendor in | am33_2.0 \ | amdgcn \ | arc | arceb \ - | arm | arm[lb]e | arme[lb] | armv* \ + | arm | arm[lb]e | arme[lb] | armv* \ | avr | avr32 \ | asmjs \ | ba \ diff --git a/build-aux/install-sh b/build-aux/install-sh index 20d8b2eaea9..b34a8fc5ab9 100755 --- a/build-aux/install-sh +++ b/build-aux/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-07-26.22; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,10 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -301,22 +305,6 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -326,52 +314,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # Note that $RANDOM variable is not portable (e.g. dash); Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p' feature. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -382,7 +367,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -411,7 +396,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex index d3136db38aa..0d2a1fdbc8f 100644 --- a/doc/misc/texinfo.tex +++ b/doc/misc/texinfo.tex @@ -3,7 +3,7 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2020-05-22.11} +\def\texinfoversion{2020-06-25.17} % % Copyright 1985, 1986, 1988, 1990-2020 Free Software Foundation, Inc. % @@ -4922,7 +4922,7 @@ end % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} -\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}} +\def\docodeindexxxx #1{\docind{\indexname}{#1}} % Used for the aux, toc and index files to prevent expansion of Texinfo @@ -5294,6 +5294,20 @@ end \fi } +% Same as \doind, but for code indices +\def\docind#1#2{% + \iflinks + {% + % + \requireopenindexfile{#1}% + \edef\writeto{\csname#1indfile\endcsname}% + % + \def\indextext{#2}% + \safewhatsit\docindwrite + }% + \fi +} + % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 @@ -5360,6 +5374,9 @@ end % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% + \ifincodeindex + \edef\trimmed{\noexpand\code{\trimmed}}% + \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % @@ -5425,7 +5442,12 @@ end % Write the entry in \indextext to the index file. % -\def\doindwrite{% + +\newif\ifincodeindex +\def\doindwrite{\incodeindexfalse\doindwritex} +\def\docindwrite{\incodeindextrue\doindwritex} + +\def\doindwritex{% \maybemarginindex % \atdummies @@ -5645,7 +5667,11 @@ might help (with 'rm \jobname.?? \jobname.??s')% \else \begindoublecolumns \catcode`\\=0\relax - \catcode`\@=12\relax + % + % Make @ an escape character to give macros a chance to work. This + % should work because we (hopefully) don't otherwise use @ in index files. + %\catcode`\@=12\relax + \catcode`\@=0\relax \input \jobname.\indexname s \enddoublecolumns \fi @@ -7562,7 +7588,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim - \def\par{\egroup\box\verbbox\endgraf\starttabbox}% + \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, diff --git a/lib/c-strcasecmp.c b/lib/c-strcasecmp.c index 951220f3e29..f1a4b98fa55 100644 --- a/lib/c-strcasecmp.c +++ b/lib/c-strcasecmp.c @@ -52,5 +52,5 @@ c_strcasecmp (const char *s1, const char *s2) /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ - return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); + return _GL_CMP (c1, c2); } diff --git a/lib/c-strncasecmp.c b/lib/c-strncasecmp.c index 9ad49191b7f..1d6e1411a67 100644 --- a/lib/c-strncasecmp.c +++ b/lib/c-strncasecmp.c @@ -52,5 +52,5 @@ c_strncasecmp (const char *s1, const char *s2, size_t n) /* On machines where 'char' and 'int' are types of the same size, the difference of two 'unsigned char' values - including the sign bit - doesn't fit in an 'int'. */ - return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); + return _GL_CMP (c1, c2); } diff --git a/lib/fchmodat.c b/lib/fchmodat.c index 8950168608f..eee0a1c56e4 100644 --- a/lib/fchmodat.c +++ b/lib/fchmodat.c @@ -98,7 +98,7 @@ fchmodat (int dir, char const *file, mode_t mode, int flags) return -1; } -# if defined __linux__ || defined __ANDROID__ +# if defined __linux__ || defined __ANDROID__ || defined __CYGWIN__ static char const fmt[] = "/proc/self/fd/%d"; char buf[sizeof fmt - sizeof "%d" + INT_BUFSIZE_BOUND (int)]; sprintf (buf, fmt, fd); diff --git a/lib/fsusage.c b/lib/fsusage.c index 81960152d41..85bfe0e2837 100644 --- a/lib/fsusage.c +++ b/lib/fsusage.c @@ -211,11 +211,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) /* Empirically, the block counts on most SVR3 and SVR3-derived systems seem to always be in terms of 512-byte blocks, no matter what value f_bsize has. */ -# if defined _CRAY - fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize); -# else fsp->fsu_blocksize = 512; -# endif #endif diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c index 057cebdb163..5301e7c144a 100644 --- a/lib/gettimeofday.c +++ b/lib/gettimeofday.c @@ -29,8 +29,6 @@ # include #endif -#include "localtime-buffer.h" - #ifdef WINDOWS_NATIVE /* Don't assume that UNICODE is not defined. */ @@ -123,11 +121,6 @@ gettimeofday (struct timeval *restrict tv, void *restrict tz) #else # if HAVE_GETTIMEOFDAY -# if GETTIMEOFDAY_CLOBBERS_LOCALTIME - /* Save and restore the contents of the buffer used for localtime's - result around the call to gettimeofday. */ - struct tm save = *localtime_buffer_addr; -# endif # if defined timeval /* 'struct timeval' overridden by gnulib? */ # undef timeval @@ -142,10 +135,6 @@ gettimeofday (struct timeval *restrict tv, void *restrict tz) int result = gettimeofday (tv, (struct timezone *) tz); # endif -# if GETTIMEOFDAY_CLOBBERS_LOCALTIME - *localtime_buffer_addr = save; -# endif - return result; # else diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in index 68cae8faf74..4dc180d2e33 100644 --- a/lib/gnulib.mk.in +++ b/lib/gnulib.mk.in @@ -587,6 +587,7 @@ HAVE_INITSTATE = @HAVE_INITSTATE@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ +HAVE_LIBGMP = @HAVE_LIBGMP@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LSTAT = @HAVE_LSTAT@ @@ -721,6 +722,7 @@ LD_SWITCH_SYSTEM_TEMACS = @LD_SWITCH_SYSTEM_TEMACS@ LD_SWITCH_X_SITE = @LD_SWITCH_X_SITE@ LD_SWITCH_X_SITE_RPATH = @LD_SWITCH_X_SITE_RPATH@ LIBGIF = @LIBGIF@ +LIBGMP = @LIBGMP@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ @@ -761,7 +763,6 @@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_EACCESS = @LIB_EACCESS@ LIB_EXECINFO = @LIB_EXECINFO@ LIB_GETRANDOM = @LIB_GETRANDOM@ -LIB_GMP = @LIB_GMP@ LIB_MATH = @LIB_MATH@ LIB_PTHREAD = @LIB_PTHREAD@ LIB_PTHREAD_SIGMASK = @LIB_PTHREAD_SIGMASK@ @@ -769,6 +770,7 @@ LIB_TIMER_TIME = @LIB_TIMER_TIME@ LIB_WSOCK32 = @LIB_WSOCK32@ LIMITS_H = @LIMITS_H@ LN_S_FILEONLY = @LN_S_FILEONLY@ +LTLIBGMP = @LTLIBGMP@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ M17N_FLT_CFLAGS = @M17N_FLT_CFLAGS@ @@ -848,7 +850,6 @@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PRE_ALLOC_OBJ = @PRE_ALLOC_OBJ@ PRIPTR_PREFIX = @PRIPTR_PREFIX@ -PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ PROFILING_CFLAGS = @PROFILING_CFLAGS@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ @@ -1963,7 +1964,6 @@ inttypes.h: inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_U -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \ - -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \ @@ -2069,19 +2069,6 @@ EXTRA_DIST += limits.in.h endif ## end gnulib module limits-h -## begin gnulib module localtime-buffer -ifeq (,$(OMIT_GNULIB_MODULE_localtime-buffer)) - -ifneq (,$(gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9)) - -endif -EXTRA_DIST += localtime-buffer.c localtime-buffer.h - -EXTRA_libgnu_a_SOURCES += localtime-buffer.c - -endif -## end gnulib module localtime-buffer - ## begin gnulib module lstat ifeq (,$(OMIT_GNULIB_MODULE_lstat)) diff --git a/lib/inttypes.in.h b/lib/inttypes.in.h index 9f04a6ced4a..596a050458b 100644 --- a/lib/inttypes.in.h +++ b/lib/inttypes.in.h @@ -78,110 +78,92 @@ # define _LONG_LONG_FORMAT_PREFIX "ll" #endif -#if !defined PRId8 || @PRI_MACROS_BROKEN@ -# undef PRId8 +#if !defined PRId8 # ifdef INT8_MAX # define PRId8 "d" # endif #endif -#if !defined PRIi8 || @PRI_MACROS_BROKEN@ -# undef PRIi8 +#if !defined PRIi8 # ifdef INT8_MAX # define PRIi8 "i" # endif #endif -#if !defined PRIo8 || @PRI_MACROS_BROKEN@ -# undef PRIo8 +#if !defined PRIo8 # ifdef UINT8_MAX # define PRIo8 "o" # endif #endif -#if !defined PRIu8 || @PRI_MACROS_BROKEN@ -# undef PRIu8 +#if !defined PRIu8 # ifdef UINT8_MAX # define PRIu8 "u" # endif #endif -#if !defined PRIx8 || @PRI_MACROS_BROKEN@ -# undef PRIx8 +#if !defined PRIx8 # ifdef UINT8_MAX # define PRIx8 "x" # endif #endif -#if !defined PRIX8 || @PRI_MACROS_BROKEN@ -# undef PRIX8 +#if !defined PRIX8 # ifdef UINT8_MAX # define PRIX8 "X" # endif #endif -#if !defined PRId16 || @PRI_MACROS_BROKEN@ -# undef PRId16 +#if !defined PRId16 # ifdef INT16_MAX # define PRId16 "d" # endif #endif -#if !defined PRIi16 || @PRI_MACROS_BROKEN@ -# undef PRIi16 +#if !defined PRIi16 # ifdef INT16_MAX # define PRIi16 "i" # endif #endif -#if !defined PRIo16 || @PRI_MACROS_BROKEN@ -# undef PRIo16 +#if !defined PRIo16 # ifdef UINT16_MAX # define PRIo16 "o" # endif #endif -#if !defined PRIu16 || @PRI_MACROS_BROKEN@ -# undef PRIu16 +#if !defined PRIu16 # ifdef UINT16_MAX # define PRIu16 "u" # endif #endif -#if !defined PRIx16 || @PRI_MACROS_BROKEN@ -# undef PRIx16 +#if !defined PRIx16 # ifdef UINT16_MAX # define PRIx16 "x" # endif #endif -#if !defined PRIX16 || @PRI_MACROS_BROKEN@ -# undef PRIX16 +#if !defined PRIX16 # ifdef UINT16_MAX # define PRIX16 "X" # endif #endif -#if !defined PRId32 || @PRI_MACROS_BROKEN@ -# undef PRId32 +#if !defined PRId32 # ifdef INT32_MAX # define PRId32 "d" # endif #endif -#if !defined PRIi32 || @PRI_MACROS_BROKEN@ -# undef PRIi32 +#if !defined PRIi32 # ifdef INT32_MAX # define PRIi32 "i" # endif #endif -#if !defined PRIo32 || @PRI_MACROS_BROKEN@ -# undef PRIo32 +#if !defined PRIo32 # ifdef UINT32_MAX # define PRIo32 "o" # endif #endif -#if !defined PRIu32 || @PRI_MACROS_BROKEN@ -# undef PRIu32 +#if !defined PRIu32 # ifdef UINT32_MAX # define PRIu32 "u" # endif #endif -#if !defined PRIx32 || @PRI_MACROS_BROKEN@ -# undef PRIx32 +#if !defined PRIx32 # ifdef UINT32_MAX # define PRIx32 "x" # endif #endif -#if !defined PRIX32 || @PRI_MACROS_BROKEN@ -# undef PRIX32 +#if !defined PRIX32 # ifdef UINT32_MAX # define PRIX32 "X" # endif @@ -194,12 +176,10 @@ # elif LONG_MAX >> 30 == 1 # define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif -# if !defined PRId64 || @PRI_MACROS_BROKEN@ -# undef PRId64 +# if !defined PRId64 # define PRId64 _PRI64_PREFIX "d" # endif -# if !defined PRIi64 || @PRI_MACROS_BROKEN@ -# undef PRIi64 +# if !defined PRIi64 # define PRIi64 _PRI64_PREFIX "i" # endif #endif @@ -211,263 +191,217 @@ # elif ULONG_MAX >> 31 == 1 # define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif -# if !defined PRIo64 || @PRI_MACROS_BROKEN@ -# undef PRIo64 +# if !defined PRIo64 # define PRIo64 _PRIu64_PREFIX "o" # endif -# if !defined PRIu64 || @PRI_MACROS_BROKEN@ -# undef PRIu64 +# if !defined PRIu64 # define PRIu64 _PRIu64_PREFIX "u" # endif -# if !defined PRIx64 || @PRI_MACROS_BROKEN@ -# undef PRIx64 +# if !defined PRIx64 # define PRIx64 _PRIu64_PREFIX "x" # endif -# if !defined PRIX64 || @PRI_MACROS_BROKEN@ -# undef PRIX64 +# if !defined PRIX64 # define PRIX64 _PRIu64_PREFIX "X" # endif #endif -#if !defined PRIdLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIdLEAST8 +#if !defined PRIdLEAST8 # define PRIdLEAST8 "d" #endif -#if !defined PRIiLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIiLEAST8 +#if !defined PRIiLEAST8 # define PRIiLEAST8 "i" #endif -#if !defined PRIoLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIoLEAST8 +#if !defined PRIoLEAST8 # define PRIoLEAST8 "o" #endif -#if !defined PRIuLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIuLEAST8 +#if !defined PRIuLEAST8 # define PRIuLEAST8 "u" #endif -#if !defined PRIxLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIxLEAST8 +#if !defined PRIxLEAST8 # define PRIxLEAST8 "x" #endif -#if !defined PRIXLEAST8 || @PRI_MACROS_BROKEN@ -# undef PRIXLEAST8 +#if !defined PRIXLEAST8 # define PRIXLEAST8 "X" #endif -#if !defined PRIdLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIdLEAST16 +#if !defined PRIdLEAST16 # define PRIdLEAST16 "d" #endif -#if !defined PRIiLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIiLEAST16 +#if !defined PRIiLEAST16 # define PRIiLEAST16 "i" #endif -#if !defined PRIoLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIoLEAST16 +#if !defined PRIoLEAST16 # define PRIoLEAST16 "o" #endif -#if !defined PRIuLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIuLEAST16 +#if !defined PRIuLEAST16 # define PRIuLEAST16 "u" #endif -#if !defined PRIxLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIxLEAST16 +#if !defined PRIxLEAST16 # define PRIxLEAST16 "x" #endif -#if !defined PRIXLEAST16 || @PRI_MACROS_BROKEN@ -# undef PRIXLEAST16 +#if !defined PRIXLEAST16 # define PRIXLEAST16 "X" #endif -#if !defined PRIdLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIdLEAST32 +#if !defined PRIdLEAST32 # define PRIdLEAST32 "d" #endif -#if !defined PRIiLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIiLEAST32 +#if !defined PRIiLEAST32 # define PRIiLEAST32 "i" #endif -#if !defined PRIoLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIoLEAST32 +#if !defined PRIoLEAST32 # define PRIoLEAST32 "o" #endif -#if !defined PRIuLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIuLEAST32 +#if !defined PRIuLEAST32 # define PRIuLEAST32 "u" #endif -#if !defined PRIxLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIxLEAST32 +#if !defined PRIxLEAST32 # define PRIxLEAST32 "x" #endif -#if !defined PRIXLEAST32 || @PRI_MACROS_BROKEN@ -# undef PRIXLEAST32 +#if !defined PRIXLEAST32 # define PRIXLEAST32 "X" #endif #ifdef INT64_MAX -# if !defined PRIdLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIdLEAST64 +# if !defined PRIdLEAST64 # define PRIdLEAST64 PRId64 # endif -# if !defined PRIiLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIiLEAST64 +# if !defined PRIiLEAST64 # define PRIiLEAST64 PRIi64 # endif #endif #ifdef UINT64_MAX -# if !defined PRIoLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIoLEAST64 +# if !defined PRIoLEAST64 # define PRIoLEAST64 PRIo64 # endif -# if !defined PRIuLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIuLEAST64 +# if !defined PRIuLEAST64 # define PRIuLEAST64 PRIu64 # endif -# if !defined PRIxLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIxLEAST64 +# if !defined PRIxLEAST64 # define PRIxLEAST64 PRIx64 # endif -# if !defined PRIXLEAST64 || @PRI_MACROS_BROKEN@ -# undef PRIXLEAST64 +# if !defined PRIXLEAST64 # define PRIXLEAST64 PRIX64 # endif #endif -#if !defined PRIdFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIdFAST8 +#if !defined PRIdFAST8 # if INT_FAST8_MAX > INT32_MAX # define PRIdFAST8 PRId64 # else # define PRIdFAST8 "d" # endif #endif -#if !defined PRIiFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIiFAST8 +#if !defined PRIiFAST8 # if INT_FAST8_MAX > INT32_MAX # define PRIiFAST8 PRIi64 # else # define PRIiFAST8 "i" # endif #endif -#if !defined PRIoFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIoFAST8 +#if !defined PRIoFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIoFAST8 PRIo64 # else # define PRIoFAST8 "o" # endif #endif -#if !defined PRIuFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIuFAST8 +#if !defined PRIuFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIuFAST8 PRIu64 # else # define PRIuFAST8 "u" # endif #endif -#if !defined PRIxFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIxFAST8 +#if !defined PRIxFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIxFAST8 PRIx64 # else # define PRIxFAST8 "x" # endif #endif -#if !defined PRIXFAST8 || @PRI_MACROS_BROKEN@ -# undef PRIXFAST8 +#if !defined PRIXFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define PRIXFAST8 PRIX64 # else # define PRIXFAST8 "X" # endif #endif -#if !defined PRIdFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIdFAST16 +#if !defined PRIdFAST16 # if INT_FAST16_MAX > INT32_MAX # define PRIdFAST16 PRId64 # else # define PRIdFAST16 "d" # endif #endif -#if !defined PRIiFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIiFAST16 +#if !defined PRIiFAST16 # if INT_FAST16_MAX > INT32_MAX # define PRIiFAST16 PRIi64 # else # define PRIiFAST16 "i" # endif #endif -#if !defined PRIoFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIoFAST16 +#if !defined PRIoFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIoFAST16 PRIo64 # else # define PRIoFAST16 "o" # endif #endif -#if !defined PRIuFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIuFAST16 +#if !defined PRIuFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIuFAST16 PRIu64 # else # define PRIuFAST16 "u" # endif #endif -#if !defined PRIxFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIxFAST16 +#if !defined PRIxFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIxFAST16 PRIx64 # else # define PRIxFAST16 "x" # endif #endif -#if !defined PRIXFAST16 || @PRI_MACROS_BROKEN@ -# undef PRIXFAST16 +#if !defined PRIXFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define PRIXFAST16 PRIX64 # else # define PRIXFAST16 "X" # endif #endif -#if !defined PRIdFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIdFAST32 +#if !defined PRIdFAST32 # if INT_FAST32_MAX > INT32_MAX # define PRIdFAST32 PRId64 # else # define PRIdFAST32 "d" # endif #endif -#if !defined PRIiFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIiFAST32 +#if !defined PRIiFAST32 # if INT_FAST32_MAX > INT32_MAX # define PRIiFAST32 PRIi64 # else # define PRIiFAST32 "i" # endif #endif -#if !defined PRIoFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIoFAST32 +#if !defined PRIoFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIoFAST32 PRIo64 # else # define PRIoFAST32 "o" # endif #endif -#if !defined PRIuFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIuFAST32 +#if !defined PRIuFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIuFAST32 PRIu64 # else # define PRIuFAST32 "u" # endif #endif -#if !defined PRIxFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIxFAST32 +#if !defined PRIxFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIxFAST32 PRIx64 # else # define PRIxFAST32 "x" # endif #endif -#if !defined PRIXFAST32 || @PRI_MACROS_BROKEN@ -# undef PRIXFAST32 +#if !defined PRIXFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define PRIXFAST32 PRIX64 # else @@ -475,76 +409,64 @@ # endif #endif #ifdef INT64_MAX -# if !defined PRIdFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIdFAST64 +# if !defined PRIdFAST64 # define PRIdFAST64 PRId64 # endif -# if !defined PRIiFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIiFAST64 +# if !defined PRIiFAST64 # define PRIiFAST64 PRIi64 # endif #endif #ifdef UINT64_MAX -# if !defined PRIoFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIoFAST64 +# if !defined PRIoFAST64 # define PRIoFAST64 PRIo64 # endif -# if !defined PRIuFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIuFAST64 +# if !defined PRIuFAST64 # define PRIuFAST64 PRIu64 # endif -# if !defined PRIxFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIxFAST64 +# if !defined PRIxFAST64 # define PRIxFAST64 PRIx64 # endif -# if !defined PRIXFAST64 || @PRI_MACROS_BROKEN@ -# undef PRIXFAST64 +# if !defined PRIXFAST64 # define PRIXFAST64 PRIX64 # endif #endif -#if !defined PRIdMAX || @PRI_MACROS_BROKEN@ -# undef PRIdMAX +#if !defined PRIdMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define PRIdMAX PRId64 # else # define PRIdMAX "ld" # endif #endif -#if !defined PRIiMAX || @PRI_MACROS_BROKEN@ -# undef PRIiMAX +#if !defined PRIiMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define PRIiMAX PRIi64 # else # define PRIiMAX "li" # endif #endif -#if !defined PRIoMAX || @PRI_MACROS_BROKEN@ -# undef PRIoMAX +#if !defined PRIoMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIoMAX PRIo64 # else # define PRIoMAX "lo" # endif #endif -#if !defined PRIuMAX || @PRI_MACROS_BROKEN@ -# undef PRIuMAX +#if !defined PRIuMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIuMAX PRIu64 # else # define PRIuMAX "lu" # endif #endif -#if !defined PRIxMAX || @PRI_MACROS_BROKEN@ -# undef PRIxMAX +#if !defined PRIxMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIxMAX PRIx64 # else # define PRIxMAX "lx" # endif #endif -#if !defined PRIXMAX || @PRI_MACROS_BROKEN@ -# undef PRIXMAX +#if !defined PRIXMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define PRIXMAX PRIX64 # else @@ -552,129 +474,108 @@ # endif #endif -#if !defined PRIdPTR || @PRI_MACROS_BROKEN@ -# undef PRIdPTR +#if !defined PRIdPTR # ifdef INTPTR_MAX # define PRIdPTR @PRIPTR_PREFIX@ "d" # endif #endif -#if !defined PRIiPTR || @PRI_MACROS_BROKEN@ -# undef PRIiPTR +#if !defined PRIiPTR # ifdef INTPTR_MAX # define PRIiPTR @PRIPTR_PREFIX@ "i" # endif #endif -#if !defined PRIoPTR || @PRI_MACROS_BROKEN@ -# undef PRIoPTR +#if !defined PRIoPTR # ifdef UINTPTR_MAX # define PRIoPTR @PRIPTR_PREFIX@ "o" # endif #endif -#if !defined PRIuPTR || @PRI_MACROS_BROKEN@ -# undef PRIuPTR +#if !defined PRIuPTR # ifdef UINTPTR_MAX # define PRIuPTR @PRIPTR_PREFIX@ "u" # endif #endif -#if !defined PRIxPTR || @PRI_MACROS_BROKEN@ -# undef PRIxPTR +#if !defined PRIxPTR # ifdef UINTPTR_MAX # define PRIxPTR @PRIPTR_PREFIX@ "x" # endif #endif -#if !defined PRIXPTR || @PRI_MACROS_BROKEN@ -# undef PRIXPTR +#if !defined PRIXPTR # ifdef UINTPTR_MAX # define PRIXPTR @PRIPTR_PREFIX@ "X" # endif #endif -#if !defined SCNd8 || @PRI_MACROS_BROKEN@ -# undef SCNd8 +#if !defined SCNd8 # ifdef INT8_MAX # define SCNd8 "hhd" # endif #endif -#if !defined SCNi8 || @PRI_MACROS_BROKEN@ -# undef SCNi8 +#if !defined SCNi8 # ifdef INT8_MAX # define SCNi8 "hhi" # endif #endif -#if !defined SCNo8 || @PRI_MACROS_BROKEN@ -# undef SCNo8 +#if !defined SCNo8 # ifdef UINT8_MAX # define SCNo8 "hho" # endif #endif -#if !defined SCNu8 || @PRI_MACROS_BROKEN@ -# undef SCNu8 +#if !defined SCNu8 # ifdef UINT8_MAX # define SCNu8 "hhu" # endif #endif -#if !defined SCNx8 || @PRI_MACROS_BROKEN@ -# undef SCNx8 +#if !defined SCNx8 # ifdef UINT8_MAX # define SCNx8 "hhx" # endif #endif -#if !defined SCNd16 || @PRI_MACROS_BROKEN@ -# undef SCNd16 +#if !defined SCNd16 # ifdef INT16_MAX # define SCNd16 "hd" # endif #endif -#if !defined SCNi16 || @PRI_MACROS_BROKEN@ -# undef SCNi16 +#if !defined SCNi16 # ifdef INT16_MAX # define SCNi16 "hi" # endif #endif -#if !defined SCNo16 || @PRI_MACROS_BROKEN@ -# undef SCNo16 +#if !defined SCNo16 # ifdef UINT16_MAX # define SCNo16 "ho" # endif #endif -#if !defined SCNu16 || @PRI_MACROS_BROKEN@ -# undef SCNu16 +#if !defined SCNu16 # ifdef UINT16_MAX # define SCNu16 "hu" # endif #endif -#if !defined SCNx16 || @PRI_MACROS_BROKEN@ -# undef SCNx16 +#if !defined SCNx16 # ifdef UINT16_MAX # define SCNx16 "hx" # endif #endif -#if !defined SCNd32 || @PRI_MACROS_BROKEN@ -# undef SCNd32 +#if !defined SCNd32 # ifdef INT32_MAX # define SCNd32 "d" # endif #endif -#if !defined SCNi32 || @PRI_MACROS_BROKEN@ -# undef SCNi32 +#if !defined SCNi32 # ifdef INT32_MAX # define SCNi32 "i" # endif #endif -#if !defined SCNo32 || @PRI_MACROS_BROKEN@ -# undef SCNo32 +#if !defined SCNo32 # ifdef UINT32_MAX # define SCNo32 "o" # endif #endif -#if !defined SCNu32 || @PRI_MACROS_BROKEN@ -# undef SCNu32 +#if !defined SCNu32 # ifdef UINT32_MAX # define SCNu32 "u" # endif #endif -#if !defined SCNx32 || @PRI_MACROS_BROKEN@ -# undef SCNx32 +#if !defined SCNx32 # ifdef UINT32_MAX # define SCNx32 "x" # endif @@ -687,12 +588,10 @@ # elif LONG_MAX >> 30 == 1 # define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif -# if !defined SCNd64 || @PRI_MACROS_BROKEN@ -# undef SCNd64 +# if !defined SCNd64 # define SCNd64 _SCN64_PREFIX "d" # endif -# if !defined SCNi64 || @PRI_MACROS_BROKEN@ -# undef SCNi64 +# if !defined SCNi64 # define SCNi64 _SCN64_PREFIX "i" # endif #endif @@ -704,107 +603,83 @@ # elif ULONG_MAX >> 31 == 1 # define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX # endif -# if !defined SCNo64 || @PRI_MACROS_BROKEN@ -# undef SCNo64 +# if !defined SCNo64 # define SCNo64 _SCNu64_PREFIX "o" # endif -# if !defined SCNu64 || @PRI_MACROS_BROKEN@ -# undef SCNu64 +# if !defined SCNu64 # define SCNu64 _SCNu64_PREFIX "u" # endif -# if !defined SCNx64 || @PRI_MACROS_BROKEN@ -# undef SCNx64 +# if !defined SCNx64 # define SCNx64 _SCNu64_PREFIX "x" # endif #endif -#if !defined SCNdLEAST8 || @PRI_MACROS_BROKEN@ -# undef SCNdLEAST8 +#if !defined SCNdLEAST8 # define SCNdLEAST8 "hhd" #endif -#if !defined SCNiLEAST8 || @PRI_MACROS_BROKEN@ -# undef SCNiLEAST8 +#if !defined SCNiLEAST8 # define SCNiLEAST8 "hhi" #endif -#if !defined SCNoLEAST8 || @PRI_MACROS_BROKEN@ -# undef SCNoLEAST8 +#if !defined SCNoLEAST8 # define SCNoLEAST8 "hho" #endif -#if !defined SCNuLEAST8 || @PRI_MACROS_BROKEN@ -# undef SCNuLEAST8 +#if !defined SCNuLEAST8 # define SCNuLEAST8 "hhu" #endif -#if !defined SCNxLEAST8 || @PRI_MACROS_BROKEN@ -# undef SCNxLEAST8 +#if !defined SCNxLEAST8 # define SCNxLEAST8 "hhx" #endif -#if !defined SCNdLEAST16 || @PRI_MACROS_BROKEN@ -# undef SCNdLEAST16 +#if !defined SCNdLEAST16 # define SCNdLEAST16 "hd" #endif -#if !defined SCNiLEAST16 || @PRI_MACROS_BROKEN@ -# undef SCNiLEAST16 +#if !defined SCNiLEAST16 # define SCNiLEAST16 "hi" #endif -#if !defined SCNoLEAST16 || @PRI_MACROS_BROKEN@ -# undef SCNoLEAST16 +#if !defined SCNoLEAST16 # define SCNoLEAST16 "ho" #endif -#if !defined SCNuLEAST16 || @PRI_MACROS_BROKEN@ -# undef SCNuLEAST16 +#if !defined SCNuLEAST16 # define SCNuLEAST16 "hu" #endif -#if !defined SCNxLEAST16 || @PRI_MACROS_BROKEN@ -# undef SCNxLEAST16 +#if !defined SCNxLEAST16 # define SCNxLEAST16 "hx" #endif -#if !defined SCNdLEAST32 || @PRI_MACROS_BROKEN@ -# undef SCNdLEAST32 +#if !defined SCNdLEAST32 # define SCNdLEAST32 "d" #endif -#if !defined SCNiLEAST32 || @PRI_MACROS_BROKEN@ -# undef SCNiLEAST32 +#if !defined SCNiLEAST32 # define SCNiLEAST32 "i" #endif -#if !defined SCNoLEAST32 || @PRI_MACROS_BROKEN@ -# undef SCNoLEAST32 +#if !defined SCNoLEAST32 # define SCNoLEAST32 "o" #endif -#if !defined SCNuLEAST32 || @PRI_MACROS_BROKEN@ -# undef SCNuLEAST32 +#if !defined SCNuLEAST32 # define SCNuLEAST32 "u" #endif -#if !defined SCNxLEAST32 || @PRI_MACROS_BROKEN@ -# undef SCNxLEAST32 +#if !defined SCNxLEAST32 # define SCNxLEAST32 "x" #endif #ifdef INT64_MAX -# if !defined SCNdLEAST64 || @PRI_MACROS_BROKEN@ -# undef SCNdLEAST64 +# if !defined SCNdLEAST64 # define SCNdLEAST64 SCNd64 # endif -# if !defined SCNiLEAST64 || @PRI_MACROS_BROKEN@ -# undef SCNiLEAST64 +# if !defined SCNiLEAST64 # define SCNiLEAST64 SCNi64 # endif #endif #ifdef UINT64_MAX -# if !defined SCNoLEAST64 || @PRI_MACROS_BROKEN@ -# undef SCNoLEAST64 +# if !defined SCNoLEAST64 # define SCNoLEAST64 SCNo64 # endif -# if !defined SCNuLEAST64 || @PRI_MACROS_BROKEN@ -# undef SCNuLEAST64 +# if !defined SCNuLEAST64 # define SCNuLEAST64 SCNu64 # endif -# if !defined SCNxLEAST64 || @PRI_MACROS_BROKEN@ -# undef SCNxLEAST64 +# if !defined SCNxLEAST64 # define SCNxLEAST64 SCNx64 # endif #endif -#if !defined SCNdFAST8 || @PRI_MACROS_BROKEN@ -# undef SCNdFAST8 +#if !defined SCNdFAST8 # if INT_FAST8_MAX > INT32_MAX # define SCNdFAST8 SCNd64 # elif INT_FAST8_MAX == 0x7fff @@ -815,8 +690,7 @@ # define SCNdFAST8 "d" # endif #endif -#if !defined SCNiFAST8 || @PRI_MACROS_BROKEN@ -# undef SCNiFAST8 +#if !defined SCNiFAST8 # if INT_FAST8_MAX > INT32_MAX # define SCNiFAST8 SCNi64 # elif INT_FAST8_MAX == 0x7fff @@ -827,8 +701,7 @@ # define SCNiFAST8 "i" # endif #endif -#if !defined SCNoFAST8 || @PRI_MACROS_BROKEN@ -# undef SCNoFAST8 +#if !defined SCNoFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNoFAST8 SCNo64 # elif UINT_FAST8_MAX == 0xffff @@ -839,8 +712,7 @@ # define SCNoFAST8 "o" # endif #endif -#if !defined SCNuFAST8 || @PRI_MACROS_BROKEN@ -# undef SCNuFAST8 +#if !defined SCNuFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNuFAST8 SCNu64 # elif UINT_FAST8_MAX == 0xffff @@ -851,8 +723,7 @@ # define SCNuFAST8 "u" # endif #endif -#if !defined SCNxFAST8 || @PRI_MACROS_BROKEN@ -# undef SCNxFAST8 +#if !defined SCNxFAST8 # if UINT_FAST8_MAX > UINT32_MAX # define SCNxFAST8 SCNx64 # elif UINT_FAST8_MAX == 0xffff @@ -863,8 +734,7 @@ # define SCNxFAST8 "x" # endif #endif -#if !defined SCNdFAST16 || @PRI_MACROS_BROKEN@ -# undef SCNdFAST16 +#if !defined SCNdFAST16 # if INT_FAST16_MAX > INT32_MAX # define SCNdFAST16 SCNd64 # elif INT_FAST16_MAX == 0x7fff @@ -873,8 +743,7 @@ # define SCNdFAST16 "d" # endif #endif -#if !defined SCNiFAST16 || @PRI_MACROS_BROKEN@ -# undef SCNiFAST16 +#if !defined SCNiFAST16 # if INT_FAST16_MAX > INT32_MAX # define SCNiFAST16 SCNi64 # elif INT_FAST16_MAX == 0x7fff @@ -883,8 +752,7 @@ # define SCNiFAST16 "i" # endif #endif -#if !defined SCNoFAST16 || @PRI_MACROS_BROKEN@ -# undef SCNoFAST16 +#if !defined SCNoFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNoFAST16 SCNo64 # elif UINT_FAST16_MAX == 0xffff @@ -893,8 +761,7 @@ # define SCNoFAST16 "o" # endif #endif -#if !defined SCNuFAST16 || @PRI_MACROS_BROKEN@ -# undef SCNuFAST16 +#if !defined SCNuFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNuFAST16 SCNu64 # elif UINT_FAST16_MAX == 0xffff @@ -903,8 +770,7 @@ # define SCNuFAST16 "u" # endif #endif -#if !defined SCNxFAST16 || @PRI_MACROS_BROKEN@ -# undef SCNxFAST16 +#if !defined SCNxFAST16 # if UINT_FAST16_MAX > UINT32_MAX # define SCNxFAST16 SCNx64 # elif UINT_FAST16_MAX == 0xffff @@ -913,40 +779,35 @@ # define SCNxFAST16 "x" # endif #endif -#if !defined SCNdFAST32 || @PRI_MACROS_BROKEN@ -# undef SCNdFAST32 +#if !defined SCNdFAST32 # if INT_FAST32_MAX > INT32_MAX # define SCNdFAST32 SCNd64 # else # define SCNdFAST32 "d" # endif #endif -#if !defined SCNiFAST32 || @PRI_MACROS_BROKEN@ -# undef SCNiFAST32 +#if !defined SCNiFAST32 # if INT_FAST32_MAX > INT32_MAX # define SCNiFAST32 SCNi64 # else # define SCNiFAST32 "i" # endif #endif -#if !defined SCNoFAST32 || @PRI_MACROS_BROKEN@ -# undef SCNoFAST32 +#if !defined SCNoFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNoFAST32 SCNo64 # else # define SCNoFAST32 "o" # endif #endif -#if !defined SCNuFAST32 || @PRI_MACROS_BROKEN@ -# undef SCNuFAST32 +#if !defined SCNuFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNuFAST32 SCNu64 # else # define SCNuFAST32 "u" # endif #endif -#if !defined SCNxFAST32 || @PRI_MACROS_BROKEN@ -# undef SCNxFAST32 +#if !defined SCNxFAST32 # if UINT_FAST32_MAX > UINT32_MAX # define SCNxFAST32 SCNx64 # else @@ -954,64 +815,54 @@ # endif #endif #ifdef INT64_MAX -# if !defined SCNdFAST64 || @PRI_MACROS_BROKEN@ -# undef SCNdFAST64 +# if !defined SCNdFAST64 # define SCNdFAST64 SCNd64 # endif -# if !defined SCNiFAST64 || @PRI_MACROS_BROKEN@ -# undef SCNiFAST64 +# if !defined SCNiFAST64 # define SCNiFAST64 SCNi64 # endif #endif #ifdef UINT64_MAX -# if !defined SCNoFAST64 || @PRI_MACROS_BROKEN@ -# undef SCNoFAST64 +# if !defined SCNoFAST64 # define SCNoFAST64 SCNo64 # endif -# if !defined SCNuFAST64 || @PRI_MACROS_BROKEN@ -# undef SCNuFAST64 +# if !defined SCNuFAST64 # define SCNuFAST64 SCNu64 # endif -# if !defined SCNxFAST64 || @PRI_MACROS_BROKEN@ -# undef SCNxFAST64 +# if !defined SCNxFAST64 # define SCNxFAST64 SCNx64 # endif #endif -#if !defined SCNdMAX || @PRI_MACROS_BROKEN@ -# undef SCNdMAX +#if !defined SCNdMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define SCNdMAX SCNd64 # else # define SCNdMAX "ld" # endif #endif -#if !defined SCNiMAX || @PRI_MACROS_BROKEN@ -# undef SCNiMAX +#if !defined SCNiMAX # if @INT32_MAX_LT_INTMAX_MAX@ # define SCNiMAX SCNi64 # else # define SCNiMAX "li" # endif #endif -#if !defined SCNoMAX || @PRI_MACROS_BROKEN@ -# undef SCNoMAX +#if !defined SCNoMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNoMAX SCNo64 # else # define SCNoMAX "lo" # endif #endif -#if !defined SCNuMAX || @PRI_MACROS_BROKEN@ -# undef SCNuMAX +#if !defined SCNuMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNuMAX SCNu64 # else # define SCNuMAX "lu" # endif #endif -#if !defined SCNxMAX || @PRI_MACROS_BROKEN@ -# undef SCNxMAX +#if !defined SCNxMAX # if @UINT32_MAX_LT_UINTMAX_MAX@ # define SCNxMAX SCNx64 # else @@ -1019,32 +870,27 @@ # endif #endif -#if !defined SCNdPTR || @PRI_MACROS_BROKEN@ -# undef SCNdPTR +#if !defined SCNdPTR # ifdef INTPTR_MAX # define SCNdPTR @PRIPTR_PREFIX@ "d" # endif #endif -#if !defined SCNiPTR || @PRI_MACROS_BROKEN@ -# undef SCNiPTR +#if !defined SCNiPTR # ifdef INTPTR_MAX # define SCNiPTR @PRIPTR_PREFIX@ "i" # endif #endif -#if !defined SCNoPTR || @PRI_MACROS_BROKEN@ -# undef SCNoPTR +#if !defined SCNoPTR # ifdef UINTPTR_MAX # define SCNoPTR @PRIPTR_PREFIX@ "o" # endif #endif -#if !defined SCNuPTR || @PRI_MACROS_BROKEN@ -# undef SCNuPTR +#if !defined SCNuPTR # ifdef UINTPTR_MAX # define SCNuPTR @PRIPTR_PREFIX@ "u" # endif #endif -#if !defined SCNxPTR || @PRI_MACROS_BROKEN@ -# undef SCNxPTR +#if !defined SCNxPTR # ifdef UINTPTR_MAX # define SCNxPTR @PRIPTR_PREFIX@ "x" # endif diff --git a/lib/lchmod.c b/lib/lchmod.c index e1132116234..77a00609552 100644 --- a/lib/lchmod.c +++ b/lib/lchmod.c @@ -76,7 +76,7 @@ lchmod (char const *file, mode_t mode) return -1; } -# if defined __linux__ || defined __ANDROID__ +# if defined __linux__ || defined __ANDROID__ || defined __CYGWIN__ static char const fmt[] = "/proc/self/fd/%d"; char buf[sizeof fmt - sizeof "%d" + INT_BUFSIZE_BOUND (int)]; sprintf (buf, fmt, fd); diff --git a/lib/mini-gmp-gnulib.c b/lib/mini-gmp-gnulib.c index 5019be5d52a..e9e8a174c03 100644 --- a/lib/mini-gmp-gnulib.c +++ b/lib/mini-gmp-gnulib.c @@ -22,12 +22,14 @@ #include "mini-gmp.h" -/* Pacify GCC -Wsuggest-attribute=const, malloc, pure. */ +/* Pacify GCC -Wsuggest-attribute=const, pure, malloc. */ #if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) # pragma GCC diagnostic ignored "-Wsuggest-attribute=const" -# pragma GCC diagnostic ignored "-Wsuggest-attribute=malloc" # pragma GCC diagnostic ignored "-Wsuggest-attribute=pure" #endif +#if 8 <= __GNUC__ +# pragma GCC diagnostic ignored "-Wsuggest-attribute=malloc" +#endif /* Pacify GCC -Wunused-variable for variables used only in 'assert' calls. */ #if defined NDEBUG && 4 < __GNUC__ + (6 <= __GNUC_MINOR__) diff --git a/lib/nstrftime.c b/lib/nstrftime.c index 28b539dc2f2..2816cf4d58b 100644 --- a/lib/nstrftime.c +++ b/lib/nstrftime.c @@ -495,15 +495,6 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) const char *format_end = NULL; #endif -#if ! defined _LIBC && ! HAVE_RUN_TZSET_TEST - /* Solaris 2.5.x and 2.6 tzset sometimes modify the storage returned - by localtime. On such systems, we must either use the tzset and - localtime wrappers to work around the bug (which sets - HAVE_RUN_TZSET_TEST) or make a copy of the structure. */ - struct tm copy = *tp; - tp = © -#endif - zone = NULL; #if HAVE_TM_ZONE /* The POSIX test suite assumes that setting diff --git a/lib/regex.h b/lib/regex.h index 76ff4e342fe..610f139eb39 100644 --- a/lib/regex.h +++ b/lib/regex.h @@ -600,11 +600,9 @@ extern void re_set_registers (struct re_pattern_buffer *__buffer, #endif /* Use GNU */ #if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC) -# ifndef _CRAY /* 4.2 bsd compatibility. */ extern char *re_comp (const char *); extern int re_exec (const char *); -# endif #endif /* For plain 'restrict', use glibc's __restrict if defined. diff --git a/lib/timespec.h b/lib/timespec.h index 02684ce6eac..dc999f944b2 100644 --- a/lib/timespec.h +++ b/lib/timespec.h @@ -34,7 +34,6 @@ extern "C" { #endif #include "arg-nonnull.h" -#include "verify.h" /* Inverse resolution of timespec timestamps (in units per second), and log base 10 of the inverse resolution. */ @@ -59,46 +58,12 @@ make_timespec (time_t s, long int ns) return r; } -/* Return negative, zero, positive if A < B, A == B, A > B, respectively. - - For each timestamp T, this code assumes that either: - - * T.tv_nsec is in the range 0..999999999; or - * T.tv_sec corresponds to a valid leap second on a host that supports - leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or - * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or - T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000. - This allows for special struct timespec values that are less or - greater than all possible valid timestamps. - - In all these cases, it is safe to subtract two tv_nsec values and - convert the result to integer without worrying about overflow on - any platform of interest to the GNU project, since all such - platforms have 32-bit int or wider. - - Replacing "a.tv_nsec - b.tv_nsec" with something like - "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause - this function to work in some cases where the above assumption is - violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2, - b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the - extra instructions. Using a subtraction has the advantage of - detecting some invalid cases on platforms that detect integer - overflow. */ +/* Return negative, zero, positive if A < B, A == B, A > B, respectively. */ _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE timespec_cmp (struct timespec a, struct timespec b) { - if (a.tv_sec < b.tv_sec) - return -1; - if (a.tv_sec > b.tv_sec) - return 1; - - /* Pacify gcc -Wstrict-overflow (bleeding-edge circa 2017-10-02). See: - https://lists.gnu.org/r/bug-gnulib/2017-10/msg00006.html */ - assume (-1 <= a.tv_nsec && a.tv_nsec <= 2 * TIMESPEC_HZ); - assume (-1 <= b.tv_nsec && b.tv_nsec <= 2 * TIMESPEC_HZ); - - return a.tv_nsec - b.tv_nsec; + return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec); } /* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be @@ -106,7 +71,7 @@ timespec_cmp (struct timespec a, struct timespec b) _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE timespec_sign (struct timespec a) { - return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec; + return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec); } struct timespec timespec_add (struct timespec, struct timespec) diff --git a/m4/alloca.m4 b/m4/alloca.m4 index 59225245b91..d3e98c51bf4 100644 --- a/m4/alloca.m4 +++ b/m4/alloca.m4 @@ -1,4 +1,4 @@ -# alloca.m4 serial 15 +# alloca.m4 serial 16 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation @@ -51,12 +51,9 @@ AC_DEFUN([gl_FUNC_ALLOCA], AC_DEFUN([gl_PREREQ_ALLOCA], [:]) # This works around a bug in autoconf <= 2.68. -# See . - -m4_version_prereq([2.69], [] ,[ - -# This is taken from the following Autoconf patch: -# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=6cd9f12520b0d6f76d3230d7565feba1ecf29497 +# See and +# . +# Also it has a simplification that is not yet in Autoconf. # _AC_LIBOBJ_ALLOCA # ----------------- @@ -72,26 +69,6 @@ AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) -AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray, -[AC_EGREP_CPP(webecray, -[#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif -], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - AC_CHECK_FUNC($ac_func, - [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, - [Define to one of '_getb67', 'GETB67', - 'getb67' for Cray-2 and Cray-YMP - systems. This function is required for - 'alloca.c' support on those systems.]) - break]) - done -fi - AC_CACHE_CHECK([stack direction for C alloca], [ac_cv_c_stack_direction], [AC_RUN_IFELSE([AC_LANG_SOURCE( @@ -124,5 +101,4 @@ AH_VERBATIM([STACK_DIRECTION], STACK_DIRECTION = 0 => direction of growth unknown */ @%:@undef STACK_DIRECTION])dnl AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) -])# _AC_LIBOBJ_ALLOCA ]) diff --git a/m4/getgroups.m4 b/m4/getgroups.m4 index 3e7e46f8672..e3441621b25 100644 --- a/m4/getgroups.m4 +++ b/m4/getgroups.m4 @@ -1,4 +1,4 @@ -# serial 23 +# serial 24 dnl From Jim Meyering. dnl A wrapper around AC_FUNC_GETGROUPS. @@ -79,7 +79,8 @@ AC_DEFUN([gl_FUNC_GETGROUPS], AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if getgroups(0,NULL) does not return the number of groups.]) else - dnl Detect FreeBSD bug; POSIX requires getgroups(-1,ptr) to fail. + dnl Detect Mac OS X and FreeBSD bug; POSIX requires getgroups(-1,ptr) + dnl to fail. AC_CACHE_CHECK([whether getgroups handles negative values], [gl_cv_func_getgroups_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4 index c72b3eacc63..578ed49b077 100644 --- a/m4/gettimeofday.m4 +++ b/m4/gettimeofday.m4 @@ -1,4 +1,4 @@ -# serial 27 +# serial 28 # Copyright (C) 2001-2003, 2005, 2007, 2009-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -19,7 +19,6 @@ AC_DEFUN([gl_FUNC_GETTIMEOFDAY], if test $ac_cv_func_gettimeofday != yes; then HAVE_GETTIMEOFDAY=0 else - gl_FUNC_GETTIMEOFDAY_CLOBBER AC_CACHE_CHECK([for gettimeofday with POSIX signature], [gl_cv_func_gettimeofday_posix_signature], [AC_COMPILE_IFELSE( @@ -66,63 +65,5 @@ int gettimeofday (struct timeval *restrict, struct timezone *restrict); declaration of the second argument to gettimeofday.]) ]) - -dnl See if gettimeofday clobbers the static buffer that localtime uses -dnl for its return value. The gettimeofday function from Mac OS X 10.0.4 -dnl (i.e., Darwin 1.3.7) has this problem. -dnl -dnl If it does, then arrange to use gettimeofday and localtime only via -dnl the wrapper functions that work around the problem. - -AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER], -[ - AC_REQUIRE([gl_HEADER_SYS_TIME_H]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS]) - - AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], - [gl_cv_func_gettimeofday_clobber], - [AC_RUN_IFELSE( - [AC_LANG_PROGRAM( - [[#include - #include - #include - #include - ]], - [[ - time_t t = 0; - struct tm *lt; - struct tm saved_lt; - struct timeval tv; - lt = localtime (&t); - saved_lt = *lt; - gettimeofday (&tv, NULL); - return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0; - ]])], - [gl_cv_func_gettimeofday_clobber=no], - [gl_cv_func_gettimeofday_clobber=yes], - [# When cross-compiling: - case "$host_os" in - # Guess all is fine on glibc systems. - *-gnu* | gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; - # Guess all is fine on musl systems. - *-musl*) gl_cv_func_gettimeofday_clobber="guessing no" ;; - # Guess no on native Windows. - mingw*) gl_cv_func_gettimeofday_clobber="guessing no" ;; - # If we don't know, obey --enable-cross-guesses. - *) gl_cv_func_gettimeofday_clobber="$gl_cross_guess_inverted" ;; - esac - ])]) - - case "$gl_cv_func_gettimeofday_clobber" in - *yes) - REPLACE_GETTIMEOFDAY=1 - AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1], - [Define if gettimeofday clobbers the localtime buffer.]) - gl_LOCALTIME_BUFFER_NEEDED - ;; - esac -]) - # Prerequisites of lib/gettimeofday.c. AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [:]) diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 index f4ba5e3a00d..57f3a780118 100644 --- a/m4/gnulib-common.m4 +++ b/m4/gnulib-common.m4 @@ -1,4 +1,4 @@ -# gnulib-common.m4 serial 50 +# gnulib-common.m4 serial 52 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -120,9 +120,14 @@ AC_DEFUN([gl_COMMON_BODY], [ #endif /* Avoid __attribute__ ((cold)) on MinGW; see thread starting at - . */ + . + Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */ #if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__ -# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__)) +# ifndef __SUNPRO_C +# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__)) +# else +# define _GL_ATTRIBUTE_COLD __attribute__ ((cold)) +# endif #else # define _GL_ATTRIBUTE_COLD #endif @@ -176,7 +181,8 @@ AC_DEFUN([gl_COMMON_BODY], [ # define _GL_ATTRIBUTE_LEAF #endif -#if _GL_HAS_ATTRIBUTE (may_alias) +/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */ +#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C # define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__)) #else # define _GL_ATTRIBUTE_MAY_ALIAS @@ -292,6 +298,20 @@ AC_DEFUN([gl_COMMON_BODY], [ that may clobber errno, it needs to save and restore the value of errno. */ #define _GL_ASYNC_SAFE +]) + AH_VERBATIM([micro_optimizations], +[/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2. + It returns + 1 if n1 > n2 + 0 if n1 == n2 + -1 if n1 < n2 + The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional + jump with nearly all GCC versions up to GCC 10. + This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many + GCC versions up to GCC 9. + The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9 + avoids conditional jumps in all GCC versions >= 3.4. */ +#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2))) ]) dnl Hint which direction to take regarding cross-compilation guesses: dnl When a user installs a program on a platform they are not intimately @@ -612,6 +632,15 @@ AC_DEFUN([gl_BIGENDIAN], AC_C_BIGENDIAN ]) +# gl_SILENT(command) +# executes command, but without the normal configure output. +AC_DEFUN([gl_SILENT], +[ + { + $1 + } AS_MESSAGE_FD>/dev/null +]) + # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it) # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not # output a spurious "(cached)" mark in the midst of other configure output. diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 index f577a6fa741..4472af81b70 100644 --- a/m4/gnulib-comp.m4 +++ b/m4/gnulib-comp.m4 @@ -120,7 +120,6 @@ AC_DEFUN([gl_EARLY], # Code from module libc-config: # Code from module libgmp: # Code from module limits-h: - # Code from module localtime-buffer: # Code from module lstat: # Code from module malloca: # Code from module manywarnings: @@ -508,7 +507,6 @@ AC_DEFUN([gl_INIT], gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=false gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1=false gl_gnulib_enabled_lchmod=false - gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=false gl_gnulib_enabled_malloca=false gl_gnulib_enabled_5264294aa0a5557541b53c8c741f7f31=false gl_gnulib_enabled_open=false @@ -624,14 +622,6 @@ AC_DEFUN([gl_INIT], gl_gnulib_enabled_lchmod=true fi } - func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9 () - { - if ! $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then - AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS]) - AC_LIBOBJ([localtime-buffer]) - gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=true - fi - } func_gl_gnulib_m4code_malloca () { if ! $gl_gnulib_enabled_malloca; then @@ -751,9 +741,6 @@ AC_DEFUN([gl_INIT], if case $host_os in mingw*) false;; *) test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1;; esac; then func_gl_gnulib_m4code_open fi - if test $NEED_LOCALTIME_BUFFER = 1; then - func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9 - fi if test $HAVE_READLINKAT = 0; then func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b fi @@ -785,7 +772,6 @@ AC_DEFUN([gl_INIT], AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36]) AM_CONDITIONAL([gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1], [$gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1]) AM_CONDITIONAL([gl_GNULIB_ENABLED_lchmod], [$gl_gnulib_enabled_lchmod]) - AM_CONDITIONAL([gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9], [$gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9]) AM_CONDITIONAL([gl_GNULIB_ENABLED_malloca], [$gl_gnulib_enabled_malloca]) AM_CONDITIONAL([gl_GNULIB_ENABLED_5264294aa0a5557541b53c8c741f7f31], [$gl_gnulib_enabled_5264294aa0a5557541b53c8c741f7f31]) AM_CONDITIONAL([gl_GNULIB_ENABLED_open], [$gl_gnulib_enabled_open]) @@ -1030,8 +1016,6 @@ AC_DEFUN([gl_FILE_LIST], [ lib/lchmod.c lib/libc-config.h lib/limits.in.h - lib/localtime-buffer.c - lib/localtime-buffer.h lib/lstat.c lib/malloca.c lib/malloca.h @@ -1176,7 +1160,6 @@ AC_DEFUN([gl_FILE_LIST], [ m4/lchmod.m4 m4/libgmp.m4 m4/limits-h.m4 - m4/localtime-buffer.m4 m4/lstat.m4 m4/malloca.m4 m4/manywarnings-c++.m4 diff --git a/m4/inttypes.m4 b/m4/inttypes.m4 index 224d0cdd8e2..28bac816b69 100644 --- a/m4/inttypes.m4 +++ b/m4/inttypes.m4 @@ -1,4 +1,4 @@ -# inttypes.m4 serial 29 +# inttypes.m4 serial 31 dnl Copyright (C) 2006-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -35,12 +35,19 @@ AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE], # Ensure that the PRI* and SCN* macros are defined appropriately. AC_DEFUN([gl_INTTYPES_PRI_SCN], [ - AC_REQUIRE([gt_INTTYPES_PRI]) - PRIPTR_PREFIX= if test -n "$STDINT_H"; then - dnl Using the gnulib . It always defines intptr_t to 'long'. - PRIPTR_PREFIX='"l"' + dnl Using the gnulib . It defines intptr_t to 'long' or + dnl 'long long', depending on _WIN64. + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ + #ifdef _WIN64 + LLP64 + #endif + ]]), + ], + [PRIPTR_PREFIX='"l"'], + [PRIPTR_PREFIX='"ll"']) else dnl Using the system's . for glpfx in '' l ll I64; do @@ -152,7 +159,6 @@ AC_DEFUN([gl_INTTYPES_H_DEFAULTS], REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX]) INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX]) INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX]) - PRI_MACROS_BROKEN=0; AC_SUBST([PRI_MACROS_BROKEN]) PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX]) UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX]) UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX]) diff --git a/m4/libgmp.m4 b/m4/libgmp.m4 index b569bb73462..82c065e2c2c 100644 --- a/m4/libgmp.m4 +++ b/m4/libgmp.m4 @@ -1,44 +1,67 @@ +# libgmp.m4 serial 4 # Configure the GMP library or a replacement. - dnl Copyright 2020 Free Software Foundation, Inc. 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 gl_LIBGMP +dnl Search for an installed libgmp. +dnl If found, set and AC_SUBST HAVE_LIBGMP=yes and the LIBGMP and LTLIBGMP +dnl variables, and augment the CPPFLAGS variable, and #define HAVE_LIBGMP to 1. +dnl Otherwise, set and AC_SUBST HAVE_LIBGMP=no and LIBGMP and LTLIBGMP to +dnl empty. + AC_DEFUN([gl_LIBGMP], [ AC_ARG_WITH([libgmp], [AS_HELP_STRING([--without-libgmp], [do not use the GNU Multiple Precision (GMP) library; this is the default on systems lacking libgmp.])]) - - AC_CHECK_HEADERS_ONCE([gmp.h]) - GMP_H=gmp.h - LIB_GMP= - - case $with_libgmp in - no) ;; - yes) GMP_H= LIB_GMP=-lgmp;; - *) if test "$ac_cv_header_gmp_h" = yes; then - gl_saved_LIBS=$LIBS + case "$with_libgmp" in + no) + HAVE_LIBGMP=no + LIBGMP= + LTLIBGMP= + ;; + *) + dnl Prefer AC_LIB_HAVE_LINKFLAGS if the havelib module is also in use. + m4_ifdef([gl_HAVE_MODULE_HAVELIB], + [AC_LIB_HAVE_LINKFLAGS([gmp], [], + [#include ], + [static const mp_limb_t x[2] = { 0x73, 0x55 }; + mpz_t tmp; + mpz_roinit_n (tmp, x, 2); + ], + [no])], + [gl_saved_LIBS=$LIBS AC_SEARCH_LIBS([__gmpz_roinit_n], [gmp]) LIBS=$gl_saved_LIBS case $ac_cv_search___gmpz_roinit_n in 'none needed') - GMP_H=;; + HAVE_LIBGMP=yes LIBGMP=;; -*) - GMP_H= LIB_GMP=$ac_cv_search___gmpz_roinit_n;; + HAVE_LIBGMP=yes LIBGMP=$ac_cv_search___gmpz_roinit_n;; + *) + HAVE_LIBGMP=no LIBGMP=;; esac - fi;; + LTLIBGMP=$LIBGMP + AC_SUBST([HAVE_LIBGMP]) + AC_SUBST([LIBGMP]) + AC_SUBST([LTLIBGMP])]) + if test "$with_libgmp,$HAVE_LIBGMP" = yes,no; then + AC_MSG_ERROR( + [GMP not found, although --with-libgmp was specified.m4_ifdef( + [AC_LIB_HAVE_LINKFLAGS], + [ Try specifying --with-libgmp-prefix=DIR.])]) + fi + ;; esac - - if test -z "$GMP_H"; then - AC_DEFINE([HAVE_GMP], 1, - [Define to 1 if you have the GMP library instead of just the - mini-gmp replacement.]) + if test $HAVE_LIBGMP = yes; then + GMP_H= + else + GMP_H=gmp.h fi - - AC_SUBST([LIB_GMP]) AC_SUBST([GMP_H]) AM_CONDITIONAL([GL_GENERATE_GMP_H], [test -n "$GMP_H"]) ]) diff --git a/m4/mktime.m4 b/m4/mktime.m4 index c00843f0f40..8d9b827fe21 100644 --- a/m4/mktime.m4 +++ b/m4/mktime.m4 @@ -1,4 +1,4 @@ -# serial 31 +# serial 32 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation @@ -33,15 +33,15 @@ AC_DEFUN([gl_FUNC_MKTIME_WORKS], AC_CHECK_DECLS_ONCE([alarm]) AC_CHECK_FUNCS_ONCE([tzset]) AC_REQUIRE([gl_MULTIARCH]) - if test $APPLE_UNIVERSAL_BUILD = 1; then - # A universal build on Apple Mac OS X platforms. - # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. - # But we need a configuration result that is valid in both modes. - gl_cv_func_working_mktime=no - fi AC_CACHE_CHECK([for working mktime], [gl_cv_func_working_mktime], - [AC_RUN_IFELSE( - [AC_LANG_SOURCE( + [if test $APPLE_UNIVERSAL_BUILD = 1; then + # A universal build on Apple Mac OS X platforms. + # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode. + # But we need a configuration result that is valid in both modes. + gl_cv_func_working_mktime="guessing no" + else + AC_RUN_IFELSE( + [AC_LANG_SOURCE( [[/* Test program from Paul Eggert and Tony Leneis. */ #include #include @@ -242,14 +242,15 @@ main () result |= 64; return result; }]])], - [gl_cv_func_working_mktime=yes], - [gl_cv_func_working_mktime=no], - [case "$host_os" in - # Guess no on native Windows. - mingw*) gl_cv_func_working_mktime="guessing no" ;; - *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;; - esac - ]) + [gl_cv_func_working_mktime=yes], + [gl_cv_func_working_mktime=no], + [case "$host_os" in + # Guess no on native Windows. + mingw*) gl_cv_func_working_mktime="guessing no" ;; + *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;; + esac + ]) + fi ]) ]) diff --git a/m4/multiarch.m4 b/m4/multiarch.m4 index 3c2034c5e00..2c61afbd76e 100644 --- a/m4/multiarch.m4 +++ b/m4/multiarch.m4 @@ -1,4 +1,4 @@ -# multiarch.m4 serial 7 +# multiarch.m4 serial 9 dnl Copyright (C) 2008-2020 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -21,37 +21,40 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_MULTIARCH], [ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN. - gl_cv_c_multiarch=no - AC_COMPILE_IFELSE( - [AC_LANG_SOURCE( - [[#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; - ]])], - [ - dnl Check for potential -arch flags. It is not universal unless - dnl there are at least two -arch flags with different values. - arch= - prev= - for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do - if test -n "$prev"; then - case $word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$arch" || test "$arch" = "$word"; then - arch="$word" - else - gl_cv_c_multiarch=yes - fi - ;; - esac - prev= - else - if test "x$word" = "x-arch"; then - prev=arch - fi - fi - done + AC_CACHE_CHECK([whether the compiler produces multi-arch binaries], + [gl_cv_c_multiarch], + [gl_cv_c_multiarch=no + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE( + [[#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + ]])], + [ + dnl Check for potential -arch flags. It is not universal unless + dnl there are at least two -arch flags with different values. + arch= + prev= + for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do + if test -n "$prev"; then + case $word in + i?86 | x86_64 | ppc | ppc64 | arm | arm64) + if test -z "$arch" || test "$arch" = "$word"; then + arch="$word" + else + gl_cv_c_multiarch=yes + fi + ;; + esac + prev= + else + if test "x$word" = "x-arch"; then + prev=arch + fi + fi + done + ]) ]) if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 diff --git a/src/Makefile.in b/src/Makefile.in index 72d69fb7a3e..7141f16ec25 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -323,7 +323,7 @@ INTERVALS_H = dispextern.h intervals.h composite.h GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ -LIB_GMP = @LIB_GMP@ +LIBGMP = @LIBGMP@ RUN_TEMACS = ./temacs @@ -530,7 +530,7 @@ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \ $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(HARFBUZZ_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \ $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(GETADDRINFO_A_LIBS) $(LCMS2_LIBS) \ $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) $(LIBSYSTEMD_LIBS) \ - $(JSON_LIBS) $(LIB_GMP) + $(JSON_LIBS) $(LIBGMP) ## FORCE it so that admin/unidata can decide whether this file is ## up-to-date. Although since charprop depends on bootstrap-emacs, diff --git a/test/Makefile.in b/test/Makefile.in index c4840670e61..d1da02e582c 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -256,7 +256,7 @@ FPIC_CFLAGS = -fPIC endif GMP_H = @GMP_H@ -LIB_GMP = @LIB_GMP@ +LIBGMP = @LIBGMP@ MODULE_CFLAGS = -I../src -I$(srcdir)/../src -I../lib -I$(srcdir)/../lib \ $(FPIC_CFLAGS) $(PROFILING_CFLAGS) \ @@ -271,7 +271,7 @@ src/emacs-module-tests.log src/emacs-module-tests.elc: $(test_module) $(test_module): $(test_module:${SO}=.c) ../src/emacs-module.h $(AM_V_at)${MKDIR_P} $(dir $@) $(AM_V_CCLD)$(CC) -shared $(CPPFLAGS) $(MODULE_CFLAGS) $(LDFLAGS) \ - -o $@ $< $(LIB_GMP) \ + -o $@ $< $(LIBGMP) \ $(and $(GMP_H),$(srcdir)/../lib/mini-gmp-gnulib.c) \ $(srcdir)/../lib/timespec.c $(srcdir)/../lib/gettime.c endif -- cgit v1.2.3 From 5c631309686ae6c04e89a3aeb3a0273cdcf57057 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 30 Jul 2020 14:30:56 -0700 Subject: ; Remove */localtime-buffer.* (omitted from previous commit by accident). --- lib/localtime-buffer.c | 60 -------------------------------------------------- lib/localtime-buffer.h | 27 ----------------------- m4/localtime-buffer.m4 | 21 ------------------ 3 files changed, 108 deletions(-) delete mode 100644 lib/localtime-buffer.c delete mode 100644 lib/localtime-buffer.h delete mode 100644 m4/localtime-buffer.m4 diff --git a/lib/localtime-buffer.c b/lib/localtime-buffer.c deleted file mode 100644 index 141849c5461..00000000000 --- a/lib/localtime-buffer.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Provide access to the last buffer returned by localtime() or gmtime(). - - Copyright (C) 2001-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. - - 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, 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 . */ - -/* written by Jim Meyering */ - -#include - -/* Specification. */ -#include "localtime-buffer.h" - -#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME - -static struct tm tm_zero_buffer; -struct tm *localtime_buffer_addr = &tm_zero_buffer; - -/* This is a wrapper for localtime. - - On the first call, record the address of the static buffer that - localtime uses for its result. */ - -struct tm * -rpl_localtime (time_t const *timep) -#undef localtime -{ - struct tm *tm = localtime (timep); - - if (localtime_buffer_addr == &tm_zero_buffer) - localtime_buffer_addr = tm; - - return tm; -} - -/* Same as above, since gmtime and localtime use the same buffer. */ -struct tm * -rpl_gmtime (time_t const *timep) -#undef gmtime -{ - struct tm *tm = gmtime (timep); - - if (localtime_buffer_addr == &tm_zero_buffer) - localtime_buffer_addr = tm; - - return tm; -} - -#endif diff --git a/lib/localtime-buffer.h b/lib/localtime-buffer.h deleted file mode 100644 index 3801742f7ba..00000000000 --- a/lib/localtime-buffer.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Provide access to the last buffer returned by localtime() or gmtime(). - - Copyright (C) 2001-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc. - - 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, 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 . */ - -/* written by Jim Meyering */ - -#include - -#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME - -/* The address of the last buffer returned by localtime() or gmtime(). */ -extern struct tm *localtime_buffer_addr; - -#endif diff --git a/m4/localtime-buffer.m4 b/m4/localtime-buffer.m4 deleted file mode 100644 index 09df3c97f25..00000000000 --- a/m4/localtime-buffer.m4 +++ /dev/null @@ -1,21 +0,0 @@ -# localtime-buffer.m4 serial 1 -dnl Copyright (C) 2017-2020 Free Software Foundation, Inc. -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. - -AC_DEFUN([gl_LOCALTIME_BUFFER_DEFAULTS], -[ - NEED_LOCALTIME_BUFFER=0 -]) - -dnl Macro invoked from other modules, to signal that the compilation of -dnl module 'localtime-buffer' is needed. -AC_DEFUN([gl_LOCALTIME_BUFFER_NEEDED], -[ - AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS]) - AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) - NEED_LOCALTIME_BUFFER=1 - REPLACE_GMTIME=1 - REPLACE_LOCALTIME=1 -]) -- cgit v1.2.3 From 50a12de877b752a4830b55beb196a7c3c1b7f715 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 31 Jul 2020 04:19:03 +0200 Subject: Make gravatar-build-url respect dynamically bound variables again * lisp/image/gravatar.el (gravatar-build-url): Compute query-string first, so that dynamically bound values of `gravatar-rating' (etc.) are respected, instead of computing it when the callback happens. --- lisp/image/gravatar.el | 17 +++++++++-------- test/lisp/image/gravatar-tests.el | 9 +++++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lisp/image/gravatar.el b/lisp/image/gravatar.el index ff612d2e9f3..d1091e57cb5 100644 --- a/lisp/image/gravatar.el +++ b/lisp/image/gravatar.el @@ -188,14 +188,15 @@ to track whether you're reading a specific mail." (defun gravatar-build-url (mail-address callback) "Find the URL of a gravatar for MAIL-ADDRESS and call CALLBACK with it." ;; https://gravatar.com/site/implement/images/ - (funcall (alist-get gravatar-service gravatar-service-alist) - mail-address - (lambda (url) - (funcall callback - (format "%s/%s?%s" - url - (gravatar-hash mail-address) - (gravatar--query-string)))))) + (let ((query-string (gravatar--query-string))) + (funcall (alist-get gravatar-service gravatar-service-alist) + mail-address + (lambda (url) + (funcall callback + (format "%s/%s?%s" + url + (gravatar-hash mail-address) + query-string)))))) (defun gravatar-get-data () "Return body of current URL buffer, or nil on failure." diff --git a/test/lisp/image/gravatar-tests.el b/test/lisp/image/gravatar-tests.el index e66b5c6803d..43c3024721e 100644 --- a/test/lisp/image/gravatar-tests.el +++ b/test/lisp/image/gravatar-tests.el @@ -65,8 +65,13 @@ "Test `gravatar-build-url'." (let ((gravatar-default-image nil) (gravatar-force-default nil) - (gravatar-size nil)) - (should (equal (gravatar-build-url "foo") "\ + (gravatar-size nil) + (gravatar-service 'gravatar) + url) + (gravatar-build-url "foo" (lambda (u) (setq url u))) + (while (not url) + (sleep-for 0.01)) + (should (equal url "\ https://www.gravatar.com/avatar/acbd18db4cc2f85cedef654fccc4a4d8?r=g")))) ;;; gravatar-tests.el ends here -- cgit v1.2.3 From f7a916a618955d38b1ee08a78b309fb97f5250cc Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 31 Jul 2020 04:24:49 +0200 Subject: Minor dns.el clean up * lisp/net/dns.el (dns-query-asynchronous, dns-query): Adjust some parameter names to not end with "p", as these are not predicates. --- lisp/net/dns.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lisp/net/dns.el b/lisp/net/dns.el index ef250f067ea..c3c294395cb 100644 --- a/lisp/net/dns.el +++ b/lisp/net/dns.el @@ -374,20 +374,20 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"." (set (intern key dns-cache) result) result)))) -(defun dns-query-asynchronous (name callback &optional type fullp reversep) +(defun dns-query-asynchronous (name callback &optional type full reverse) "Query a DNS server for NAME of TYPE. CALLBACK will be called with a single parameter: The result. If there's no result, or `dns-timeout' has passed, CALLBACK will be called with nil as the parameter. -If FULLP, return the entire record. -If REVERSEP, look up an IP address." +If FULL, return the entire record. +If REVERSE, look up an IP address." (setq type (or type 'A)) (unless (dns-servers-up-to-date-p) (dns-set-servers)) - (when reversep + (when reverse (setq name (concat (mapconcat 'identity (nreverse (split-string name "\\.")) ".") ".in-addr.arpa") @@ -397,7 +397,7 @@ If REVERSEP, look up an IP address." (progn (message "No DNS server configuration found") nil) - (dns--lookup name callback type fullp))) + (dns--lookup name callback type full))) (defun dns--lookup (name callback type full) (with-current-buffer (generate-new-buffer " *dns*") @@ -495,16 +495,16 @@ If REVERSEP, look up an IP address." (dns-get-txt-answer (dns-get 'answers result)) (dns-get 'data answer)))))))))) -(defun dns-query (name &optional type fullp reversep) +(defun dns-query (name &optional type full reverse) "Query a DNS server for NAME of TYPE. -If FULLP, return the entire record returned. -If REVERSEP, look up an IP address." +If FULL, return the entire record returned. +If REVERSE, look up an IP address." (let ((result nil)) (dns-query-asynchronous name (lambda (response) (setq result (list response))) - type fullp reversep) + type full reverse) ;; Loop until we get the callback. (while (not result) (sleep-for 0.01)) -- cgit v1.2.3 From 7899fa43095f63845d471398c5229147d6f6c100 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 31 Jul 2020 06:02:30 +0200 Subject: Declare some ancient compat aliases obsolete (Bug#41328) * lisp/comint.el (comint-read-noecho): * lisp/emacs-lisp/edebug.el (edebug-all-defuns): * lisp/man.el (manual-entry): * lisp/vc/log-edit.el (vc-log-mode-map, vc-log-entry-mode): Declare ancient backwards-compatibility aliases and functions obsolete. The oldest in this list was added in 1992, and the most recent in 2004. * lisp/net/telnet.el (telnet-initial-filter): Don't use `comint-read-noecho'. --- lisp/comint.el | 1 + lisp/emacs-lisp/edebug.el | 2 +- lisp/man.el | 2 +- lisp/net/telnet.el | 2 +- lisp/vc/log-edit.el | 7 +++---- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lisp/comint.el b/lisp/comint.el index ea06f8af87d..4b3b5838560 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -2350,6 +2350,7 @@ a buffer local variable." ;; For compatibility. (defun comint-read-noecho (prompt &optional _ignore) + (declare (obsolete read-passwd "28.1")) (read-passwd prompt)) ;; These three functions are for entering text you don't want echoed or diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 78461185d3a..a565e8f6dcb 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -555,7 +555,7 @@ already is one.)" ;; Compatibility with old versions. -(defalias 'edebug-all-defuns 'edebug-all-defs) +(define-obsolete-function-alias 'edebug-all-defuns #'edebug-all-defs "28.1") ;;;###autoload (defun edebug-all-defs () diff --git a/lisp/man.el b/lisp/man.el index 3121334c6f9..e1dd5037c46 100644 --- a/lisp/man.el +++ b/lisp/man.el @@ -838,7 +838,7 @@ POS defaults to `point'." ;; For compatibility with older versions. ;;;###autoload -(defalias 'manual-entry 'man) +(define-obsolete-function-alias 'manual-entry 'man "28.1") (defvar Man-completion-cache nil ;; On my machine, "man -k" is so fast that a cache makes no sense, diff --git a/lisp/net/telnet.el b/lisp/net/telnet.el index e8c0c1bbdf4..29c415e6a65 100644 --- a/lisp/net/telnet.el +++ b/lisp/net/telnet.el @@ -149,7 +149,7 @@ rejecting one login and prompting again for a username and password.") ((string-match "passw" string) (telnet-filter proc string) (setq telnet-count 0) - (process-send-string proc (concat (comint-read-noecho "Password: " t) + (process-send-string proc (concat (read-passwd "Password: ") telnet-new-line)) (clear-this-command-keys)) (t (telnet-check-software-type-initialize string) diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el index 906f9a94205..cd19b4e065b 100644 --- a/lisp/vc/log-edit.el +++ b/lisp/vc/log-edit.el @@ -51,6 +51,9 @@ ;; The main keymap +(define-obsolete-variable-alias 'vc-log-mode-map 'log-edit-mode-map "28.1") +(define-obsolete-variable-alias 'vc-log-entry-mode 'log-edit-mode-map "28.1") + (easy-mmode-defmap log-edit-mode-map '(("\C-c\C-c" . log-edit-done) ("\C-c\C-a" . log-edit-insert-changelog) @@ -67,10 +70,6 @@ "Keymap for the `log-edit-mode' (to edit version control log messages)." :group 'log-edit) -;; Compatibility with old names. Should we bother ? -(defvar vc-log-mode-map log-edit-mode-map) -(defvar vc-log-entry-mode vc-log-mode-map) - (easy-menu-define log-edit-menu log-edit-mode-map "Menu used for `log-edit-mode'." '("Log-Edit" -- cgit v1.2.3 From 450b50df11b2d0839cec36a445b1580ae1a27257 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 31 Jul 2020 11:58:13 -0400 Subject: * lisp/emacs-lisp/byte-opt.el: Minor simplifications (byte-optimize-form-code-walker): Use `byte-optimize-form` after inlining, so optimizations are also applied to the top level call. Simplify the code for `pure` functions using `byte-optimize-constant-args`. (byte-optimize-all-constp): Remove, not used any more. (byte-optimize-1+, byte-optimize-1-): Remove, they are redundant with the `pure` annotation. --- lisp/emacs-lisp/byte-opt.el | 122 ++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 77 deletions(-) diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 48efff911f7..0d9c449b3b4 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -227,7 +227,7 @@ ;;; byte-compile optimizers to support inlining -(put 'inline 'byte-optimizer 'byte-optimize-inline-handler) +(put 'inline 'byte-optimizer #'byte-optimize-inline-handler) (defun byte-optimize-inline-handler (form) "byte-optimize-handler for the `inline' special-form." @@ -521,7 +521,7 @@ (if (eq newform form) ;; Some error occurred, avoid infinite recursion form - (byte-optimize-form-code-walker newform for-effect)))) + (byte-optimize-form newform for-effect)))) ((eq (car-safe fn) 'closure) form) @@ -549,23 +549,10 @@ ;; Otherwise, no args can be considered to be for-effect, ;; even if the called function is for-effect, because we ;; don't know anything about that function. - (let ((args (mapcar #'byte-optimize-form (cdr form)))) - (if (and (get fn 'pure) - (byte-optimize-all-constp args)) - (let ((arg-values (mapcar #'eval args))) - (condition-case nil - (list 'quote (apply fn arg-values)) - (error (cons fn args)))) - (cons fn args))))))) - -(defun byte-optimize-all-constp (list) - "Non-nil if all elements of LIST satisfy `macroexp-const-p'." - (let ((constant t)) - (while (and list constant) - (unless (macroexp-const-p (car list)) - (setq constant nil)) - (setq list (cdr list))) - constant)) + (let ((form (cons fn (mapcar #'byte-optimize-form (cdr form))))) + (if (get fn 'pure) + (byte-optimize-constant-args form) + form)))))) (defun byte-optimize-form (form &optional for-effect) "The source-level pass of the optimizer." @@ -742,22 +729,6 @@ ((equal args (cdr form)) form) (t (cons '- args)))))) -(defun byte-optimize-1+ (form) - (let ((args (cdr form))) - (when (null (cdr args)) - (let ((n (car args))) - (when (numberp n) - (setq form (1+ n)))))) - form) - -(defun byte-optimize-1- (form) - (let ((args (cdr form))) - (when (null (cdr args)) - (let ((n (car args))) - (when (numberp n) - (setq form (1- n)))))) - form) - (defun byte-optimize-multiply (form) (let* ((args (remq 1 (byte-opt--arith-reduce #'* 1 (cdr form))))) (cond @@ -797,7 +768,7 @@ (condition-case () (list 'quote (eval form)) (error form))) - (t ;; This can enable some lapcode optimizations. + (t ;; Moving the constant to the end can enable some lapcode optimizations. (list (car form) (nth 2 form) (nth 1 form))))) (defun byte-optimize-constant-args (form) @@ -896,37 +867,34 @@ form ; No improvement. (cons 'concat (nreverse newargs))))) -(put 'identity 'byte-optimizer 'byte-optimize-identity) -(put 'memq 'byte-optimizer 'byte-optimize-memq) -(put 'memql 'byte-optimizer 'byte-optimize-member) -(put 'member 'byte-optimizer 'byte-optimize-member) -(put 'assoc 'byte-optimizer 'byte-optimize-assoc) -(put 'rassoc 'byte-optimizer 'byte-optimize-assoc) - -(put '+ 'byte-optimizer 'byte-optimize-plus) -(put '* 'byte-optimizer 'byte-optimize-multiply) -(put '- 'byte-optimizer 'byte-optimize-minus) -(put '/ 'byte-optimizer 'byte-optimize-divide) -(put 'max 'byte-optimizer 'byte-optimize-associative-math) -(put 'min 'byte-optimizer 'byte-optimize-associative-math) - -(put '= 'byte-optimizer 'byte-optimize-binary-predicate) -(put 'eq 'byte-optimizer 'byte-optimize-binary-predicate) -(put 'eql 'byte-optimizer 'byte-optimize-equal) -(put 'equal 'byte-optimizer 'byte-optimize-equal) -(put 'string= 'byte-optimizer 'byte-optimize-binary-predicate) -(put 'string-equal 'byte-optimizer 'byte-optimize-binary-predicate) - -(put '1+ 'byte-optimizer 'byte-optimize-1+) -(put '1- 'byte-optimizer 'byte-optimize-1-) - -(put 'concat 'byte-optimizer 'byte-optimize-concat) +(put 'identity 'byte-optimizer #'byte-optimize-identity) +(put 'memq 'byte-optimizer #'byte-optimize-memq) +(put 'memql 'byte-optimizer #'byte-optimize-member) +(put 'member 'byte-optimizer #'byte-optimize-member) +(put 'assoc 'byte-optimizer #'byte-optimize-assoc) +(put 'rassoc 'byte-optimizer #'byte-optimize-assoc) + +(put '+ 'byte-optimizer #'byte-optimize-plus) +(put '* 'byte-optimizer #'byte-optimize-multiply) +(put '- 'byte-optimizer #'byte-optimize-minus) +(put '/ 'byte-optimizer #'byte-optimize-divide) +(put 'max 'byte-optimizer #'byte-optimize-associative-math) +(put 'min 'byte-optimizer #'byte-optimize-associative-math) + +(put '= 'byte-optimizer #'byte-optimize-binary-predicate) +(put 'eq 'byte-optimizer #'byte-optimize-binary-predicate) +(put 'eql 'byte-optimizer #'byte-optimize-equal) +(put 'equal 'byte-optimizer #'byte-optimize-equal) +(put 'string= 'byte-optimizer #'byte-optimize-binary-predicate) +(put 'string-equal 'byte-optimizer #'byte-optimize-binary-predicate) + +(put 'concat 'byte-optimizer #'byte-optimize-concat) ;; I'm not convinced that this is necessary. Doesn't the optimizer loop ;; take care of this? - Jamie ;; I think this may some times be necessary to reduce ie (quote 5) to 5, ;; so arithmetic optimizers recognize the numeric constant. - Hallvard -(put 'quote 'byte-optimizer 'byte-optimize-quote) +(put 'quote 'byte-optimizer #'byte-optimize-quote) (defun byte-optimize-quote (form) (if (or (consp (nth 1 form)) (and (symbolp (nth 1 form)) @@ -1044,16 +1012,16 @@ (if (nth 1 form) form)) -(put 'and 'byte-optimizer 'byte-optimize-and) -(put 'or 'byte-optimizer 'byte-optimize-or) -(put 'cond 'byte-optimizer 'byte-optimize-cond) -(put 'if 'byte-optimizer 'byte-optimize-if) -(put 'while 'byte-optimizer 'byte-optimize-while) +(put 'and 'byte-optimizer #'byte-optimize-and) +(put 'or 'byte-optimizer #'byte-optimize-or) +(put 'cond 'byte-optimizer #'byte-optimize-cond) +(put 'if 'byte-optimizer #'byte-optimize-if) +(put 'while 'byte-optimizer #'byte-optimize-while) ;; byte-compile-negation-optimizer lives in bytecomp.el -(put '/= 'byte-optimizer 'byte-compile-negation-optimizer) -(put 'atom 'byte-optimizer 'byte-compile-negation-optimizer) -(put 'nlistp 'byte-optimizer 'byte-compile-negation-optimizer) +(put '/= 'byte-optimizer #'byte-compile-negation-optimizer) +(put 'atom 'byte-optimizer #'byte-compile-negation-optimizer) +(put 'nlistp 'byte-optimizer #'byte-compile-negation-optimizer) (defun byte-optimize-funcall (form) @@ -1081,12 +1049,12 @@ nil)) form))) -(put 'funcall 'byte-optimizer 'byte-optimize-funcall) -(put 'apply 'byte-optimizer 'byte-optimize-apply) +(put 'funcall 'byte-optimizer #'byte-optimize-funcall) +(put 'apply 'byte-optimizer #'byte-optimize-apply) -(put 'let 'byte-optimizer 'byte-optimize-letX) -(put 'let* 'byte-optimizer 'byte-optimize-letX) +(put 'let 'byte-optimizer #'byte-optimize-letX) +(put 'let* 'byte-optimizer #'byte-optimize-letX) (defun byte-optimize-letX (form) (cond ((null (nth 1 form)) ;; No bindings @@ -1102,7 +1070,7 @@ (list 'let* (reverse (cdr binds)) (nth 1 (car binds)) nil))))) -(put 'nth 'byte-optimizer 'byte-optimize-nth) +(put 'nth 'byte-optimizer #'byte-optimize-nth) (defun byte-optimize-nth (form) (if (= (safe-length form) 3) (if (memq (nth 1 form) '(0 1)) @@ -1112,7 +1080,7 @@ form) form)) -(put 'nthcdr 'byte-optimizer 'byte-optimize-nthcdr) +(put 'nthcdr 'byte-optimizer #'byte-optimize-nthcdr) (defun byte-optimize-nthcdr (form) (if (= (safe-length form) 3) (if (memq (nth 1 form) '(0 1 2)) @@ -1128,7 +1096,7 @@ ;; optimize string-as-unibyte, string-as-multibyte, string-make-unibyte, ;; string-make-multibyte for constant args. -(put 'set 'byte-optimizer 'byte-optimize-set) +(put 'set 'byte-optimizer #'byte-optimize-set) (defun byte-optimize-set (form) (let ((var (car-safe (cdr-safe form)))) (cond -- cgit v1.2.3 From 8ecca2f09f6bc387412f258c4fc4e3ddf807b2b3 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Thu, 23 Jul 2020 13:48:43 +0200 Subject: Backport: Fix memory leak for global module objects (Bug#42482). Instead of storing the global values in a global 'emacs_value_storage' object, store them as hash values alongside the reference counts. That way the garbage collector takes care of cleaning them up. * src/emacs-module.c (global_storage): Remove. (struct module_global_reference): New pseudovector type. (XMODULE_GLOBAL_REFERENCE): New helper function. (module_make_global_ref, module_free_global_ref): Use 'module_global_reference' struct for global reference values. (value_to_lisp, module_handle_nonlocal_exit): Adapt to deletion of 'global_storage'. (cherry picked from commit 5c5eb9790898e4ab10bcbbdb6871947ed3018569) --- src/emacs-module.c | 82 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/src/emacs-module.c b/src/emacs-module.c index 911b82b8a1a..4269b0ba2ac 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -159,11 +159,11 @@ struct emacs_value_frame /* A structure that holds an initial frame (so that the first local values require no dynamic allocation) and keeps track of the current frame. */ -static struct emacs_value_storage +struct emacs_value_storage { struct emacs_value_frame initial; struct emacs_value_frame *current; -} global_storage; +}; /* Private runtime and environment members. */ @@ -351,10 +351,35 @@ module_get_environment (struct emacs_runtime *ert) } /* To make global refs (GC-protected global values) keep a hash that - maps global Lisp objects to reference counts. */ + maps global Lisp objects to 'struct module_global_reference' + objects. We store the 'emacs_value' in the hash table so that it + is automatically garbage-collected (Bug#42482). */ static Lisp_Object Vmodule_refs_hash; +/* Pseudovector type for global references. The pseudovector tag is + PVEC_OTHER since these values are never printed and don't need to + be special-cased for garbage collection. */ + +struct module_global_reference { + /* Pseudovector header, must come first. */ + union vectorlike_header header; + + /* Holds the emacs_value for the object. The Lisp_Object stored + therein must be the same as the hash key. */ + struct emacs_value_tag value; + + /* Reference count, always positive. */ + ptrdiff_t refcount; +}; + +static struct module_global_reference * +XMODULE_GLOBAL_REFERENCE (Lisp_Object o) +{ + eassert (PSEUDOVECTORP (o, PVEC_OTHER)); + return XUNTAG (o, Lisp_Vectorlike, struct module_global_reference); +} + static emacs_value module_make_global_ref (emacs_env *env, emacs_value ref) { @@ -363,21 +388,30 @@ module_make_global_ref (emacs_env *env, emacs_value ref) Lisp_Object new_obj = value_to_lisp (ref), hashcode; ptrdiff_t i = hash_lookup (h, new_obj, &hashcode); + /* Note: This approach requires the garbage collector to never move + objects. */ + if (i >= 0) { Lisp_Object value = HASH_VALUE (h, i); - EMACS_INT refcount = XFIXNAT (value) + 1; - if (MOST_POSITIVE_FIXNUM < refcount) + struct module_global_reference *ref = XMODULE_GLOBAL_REFERENCE (value); + bool overflow = INT_ADD_WRAPV (ref->refcount, 1, &ref->refcount); + if (overflow) overflow_error (); - value = make_fixed_natnum (refcount); - set_hash_value_slot (h, i, value); + return &ref->value; } else { - hash_put (h, new_obj, make_fixed_natnum (1), hashcode); + struct module_global_reference *ref + = ALLOCATE_PLAIN_PSEUDOVECTOR (struct module_global_reference, + PVEC_OTHER); + ref->value.v = new_obj; + ref->refcount = 1; + Lisp_Object value; + XSETPSEUDOVECTOR (value, ref, PVEC_OTHER); + hash_put (h, new_obj, value, hashcode); + return &ref->value; } - - return allocate_emacs_value (env, &global_storage, new_obj); } static void @@ -393,23 +427,16 @@ module_free_global_ref (emacs_env *env, emacs_value ref) if (i >= 0) { - EMACS_INT refcount = XFIXNAT (HASH_VALUE (h, i)) - 1; - if (refcount > 0) - set_hash_value_slot (h, i, make_fixed_natnum (refcount)); - else - { - eassert (refcount == 0); - hash_remove_from_table (h, obj); - } + Lisp_Object value = HASH_VALUE (h, i); + struct module_global_reference *ref = XMODULE_GLOBAL_REFERENCE (value); + eassert (0 < ref->refcount); + if (--ref->refcount == 0) + hash_remove_from_table (h, obj); } - - if (module_assertions) + else if (module_assertions) { - ptrdiff_t count = 0; - if (value_storage_contains_p (&global_storage, ref, &count)) - return; module_abort ("Global value was not found in list of %"pD"d globals", - count); + h->count); } } @@ -1190,8 +1217,10 @@ value_to_lisp (emacs_value v) ++num_environments; } /* Also check global values. */ - if (value_storage_contains_p (&global_storage, v, &num_values)) + struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash); + if (hash_lookup (h, v->v, NULL) != -1) goto ok; + INT_ADD_WRAPV (num_values, h->count, &num_values); module_abort (("Emacs value not found in %"pD"d values " "of %"pD"d environments"), num_values, num_environments); @@ -1404,10 +1433,7 @@ module_handle_nonlocal_exit (emacs_env *env, enum nonlocal_exit type, void init_module_assertions (bool enable) { - /* If enabling module assertions, use a hidden environment for - storing the globals. This environment is never freed. */ module_assertions = enable; - initialize_storage (&global_storage); } /* Return whether STORAGE contains VALUE. Used to check module -- cgit v1.2.3 From fbe363f5e18fb4975de168191f1ee9b686e48d9f Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 31 Jul 2020 09:09:39 -0700 Subject: ; Maintainer header updates --- admin/automerge | 1 + admin/make-manuals | 1 + admin/unidata/blocks.awk | 1 + admin/update_autogen | 1 + admin/upload-manuals | 1 + lisp/emacs-lisp/check-declare.el | 1 + test/lisp/progmodes/f90-tests.el | 1 + 7 files changed, 7 insertions(+) diff --git a/admin/automerge b/admin/automerge index f7717026b15..cd0f22c3f25 100755 --- a/admin/automerge +++ b/admin/automerge @@ -4,6 +4,7 @@ ## Copyright (C) 2018-2020 Free Software Foundation, Inc. ## Author: Glenn Morris +## Maintainer: emacs-devel@gnu.org ## This file is part of GNU Emacs. diff --git a/admin/make-manuals b/admin/make-manuals index 1cb1c514331..13a8148bb3c 100755 --- a/admin/make-manuals +++ b/admin/make-manuals @@ -4,6 +4,7 @@ ## Copyright 2018-2020 Free Software Foundation, Inc. ## Author: Glenn Morris +## Maintainer: emacs-devel@gnu.org ## This file is part of GNU Emacs. diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk index 1e85eecb68f..70e96ed802d 100755 --- a/admin/unidata/blocks.awk +++ b/admin/unidata/blocks.awk @@ -3,6 +3,7 @@ ## Copyright (C) 2015-2020 Free Software Foundation, Inc. ## Author: Glenn Morris +## Maintainer: emacs-devel@gnu.org ## This file is part of GNU Emacs. diff --git a/admin/update_autogen b/admin/update_autogen index af339a9e7ec..d60984e13f6 100755 --- a/admin/update_autogen +++ b/admin/update_autogen @@ -4,6 +4,7 @@ ## Copyright (C) 2011-2020 Free Software Foundation, Inc. ## Author: Glenn Morris +## Maintainer: emacs-devel@gnu.org ## This file is part of GNU Emacs. diff --git a/admin/upload-manuals b/admin/upload-manuals index af1c8c18704..b7187971df0 100755 --- a/admin/upload-manuals +++ b/admin/upload-manuals @@ -5,6 +5,7 @@ ## Copyright 2018-2020 Free Software Foundation, Inc. ## Author: Glenn Morris +## Maintainer: emacs-devel@gnu.org ## This file is part of GNU Emacs. diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el index 52cda95f4c1..208214f2e6e 100644 --- a/lisp/emacs-lisp/check-declare.el +++ b/lisp/emacs-lisp/check-declare.el @@ -3,6 +3,7 @@ ;; Copyright (C) 2007-2020 Free Software Foundation, Inc. ;; Author: Glenn Morris +;; Maintainer: emacs-devel@gnu.org ;; Keywords: lisp, tools, maint ;; This file is part of GNU Emacs. diff --git a/test/lisp/progmodes/f90-tests.el b/test/lisp/progmodes/f90-tests.el index 5115f8ef67e..b8a3f7e8401 100644 --- a/test/lisp/progmodes/f90-tests.el +++ b/test/lisp/progmodes/f90-tests.el @@ -3,6 +3,7 @@ ;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; Author: Glenn Morris +;; Maintainer: emacs-devel@gnu.org ;; This file is part of GNU Emacs. -- cgit v1.2.3 From 8c94ca94dc2772e5c651de6cf46bfffc388234d5 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 25 Jul 2020 23:04:05 +0200 Subject: Backport: Fix subtle bug when checking liveness of module values. We can't simply look up the Lisp object in the global reference table because an invalid local and a valid global reference might refer to the same object. Instead, we have to test the address of the global reference against the stored references. * src/emacs-module.c (module_global_reference_p): New helper function. (value_to_lisp): Use it. (cherry picked from commit 6355a3ec62f43c9b99d483982ff851d32dd78891) --- src/emacs-module.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/emacs-module.c b/src/emacs-module.c index 4269b0ba2ac..099a6a3cf25 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -78,6 +78,7 @@ To add a new module function, proceed as follows: #include "emacs-module.h" #include +#include #include #include #include @@ -380,6 +381,28 @@ XMODULE_GLOBAL_REFERENCE (Lisp_Object o) return XUNTAG (o, Lisp_Vectorlike, struct module_global_reference); } +/* Returns whether V is a global reference. Only used to check module + assertions. If V is not a global reference, increment *N by the + number of global references (for debugging output). */ + +static bool +module_global_reference_p (emacs_value v, ptrdiff_t *n) +{ + struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash); + /* Note that we can't use `hash_lookup' because V might be a local + reference that's identical to some global reference. */ + for (ptrdiff_t i = 0; i < HASH_TABLE_SIZE (h); ++i) + { + if (!EQ (HASH_KEY (h, i), Qunbound) + && &XMODULE_GLOBAL_REFERENCE (HASH_VALUE (h, i))->value == v) + return true; + } + /* Only used for debugging, so we don't care about overflow, just + make sure the operation is defined. */ + INT_ADD_WRAPV (*n, h->count, n); + return false; +} + static emacs_value module_make_global_ref (emacs_env *env, emacs_value ref) { @@ -1217,10 +1240,8 @@ value_to_lisp (emacs_value v) ++num_environments; } /* Also check global values. */ - struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash); - if (hash_lookup (h, v->v, NULL) != -1) + if (module_global_reference_p (v, &num_values)) goto ok; - INT_ADD_WRAPV (num_values, h->count, &num_values); module_abort (("Emacs value not found in %"pD"d values " "of %"pD"d environments"), num_values, num_environments); -- cgit v1.2.3 From d767418b76818e4e83bf19cc08307c1329144c13 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 25 Jul 2020 23:23:19 +0200 Subject: Backport: Make checking for liveness of global values more precise. We can't just use a hash lookup because a global and a local reference might refer to the same Lisp object. * src/emacs-module.c (module_free_global_ref): More precise check for global liveness. (cherry picked from commit 9f01ce6327af886f26399924a9aadf16cdd4fd9f) --- src/emacs-module.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/emacs-module.c b/src/emacs-module.c index 099a6a3cf25..a90a9765dbf 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -448,6 +448,14 @@ module_free_global_ref (emacs_env *env, emacs_value ref) Lisp_Object obj = value_to_lisp (ref); ptrdiff_t i = hash_lookup (h, obj, NULL); + if (module_assertions) + { + ptrdiff_t n = 0; + if (! module_global_reference_p (ref, &n)) + module_abort ("Global value was not found in list of %"pD"d globals", + n); + } + if (i >= 0) { Lisp_Object value = HASH_VALUE (h, i); @@ -456,11 +464,6 @@ module_free_global_ref (emacs_env *env, emacs_value ref) if (--ref->refcount == 0) hash_remove_from_table (h, obj); } - else if (module_assertions) - { - module_abort ("Global value was not found in list of %"pD"d globals", - h->count); - } } static enum emacs_funcall_exit -- cgit v1.2.3 From f54ddb0198640e38c1d34bf6031ff5117c117c85 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Fri, 31 Jul 2020 23:50:04 +0200 Subject: ; * test/lisp/emacs-lisp/generator-tests.el: Style fixes. --- test/lisp/emacs-lisp/generator-tests.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/lisp/emacs-lisp/generator-tests.el b/test/lisp/emacs-lisp/generator-tests.el index 0d325f1485a..e0d9167118e 100644 --- a/test/lisp/emacs-lisp/generator-tests.el +++ b/test/lisp/emacs-lisp/generator-tests.el @@ -22,6 +22,10 @@ ;;; Commentary: +;; Unit tests for generator.el. + +;;; Code: + (require 'generator) (require 'ert) (require 'cl-lib) @@ -38,8 +42,7 @@ `cps-testcase' defines an ERT testcase called NAME that evaluates BODY twice: once using ordinary `eval' and once using lambda-generators. The test ensures that the two forms produce -identical output. -" +identical output." `(progn (ert-deftest ,name () (should @@ -302,3 +305,5 @@ identical output. (lambda (it) (- it)) (1+ it))))))) -2))) + +;;; generator-tests.el ends here -- cgit v1.2.3 From 89127266c93083521d71d8f2314ac88905163fd8 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 14:10:33 +0200 Subject: * test/data/emacs-module/mod-test.c (Fmod_test_string_a_to_b): Fix leak --- test/data/emacs-module/mod-test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c index f72b85a5d8e..37186fcc4d1 100644 --- a/test/data/emacs-module/mod-test.c +++ b/test/data/emacs-module/mod-test.c @@ -262,7 +262,9 @@ Fmod_test_string_a_to_b (emacs_env *env, ptrdiff_t nargs, emacs_value args[], if (buf[i] == 'a') buf[i] = 'b'; - return env->make_string (env, buf, size - 1); + emacs_value ret = env->make_string (env, buf, size - 1); + free (buf); + return ret; } -- cgit v1.2.3 From c3b53559965a4c6f48274c3cbcb43eb6ef23ae14 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 14:13:55 +0200 Subject: Suppress leak detector in some cases We intentionally leak some objects. Prevent the ASan leak detector from raising false alarms in these cases. * configure.ac: Search for lsan_interface.h header. * src/data.c (make_blv): Allow leaking of buffer-local values. * src/buffer.c (enlarge_buffer_text): Allow leaking of buffer text. * src/emacs-module.c (Fmodule_load, initialize_environment): Allow intentional leak of runtime and environment objects if module assertions are enabled. --- configure.ac | 3 ++- src/buffer.c | 7 +++++++ src/data.c | 7 +++++++ src/emacs-module.c | 18 +++++++++++++++++- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 148c50e0b39..b4674e3204b 100644 --- a/configure.ac +++ b/configure.ac @@ -1740,7 +1740,8 @@ AC_CHECK_HEADERS_ONCE( sys/sysinfo.h coff.h pty.h sys/resource.h - sys/utsname.h pwd.h utmp.h util.h) + sys/utsname.h pwd.h utmp.h util.h + sanitizer/lsan_interface.h) AC_CACHE_CHECK([for ADDR_NO_RANDOMIZE], [emacs_cv_personality_addr_no_randomize], diff --git a/src/buffer.c b/src/buffer.c index f1cb4d50414..3456a46be3e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -28,6 +28,10 @@ along with GNU Emacs. If not, see . */ #include #include +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#include +#endif + #include #include "lisp.h" @@ -5083,6 +5087,9 @@ enlarge_buffer_text (struct buffer *b, ptrdiff_t delta) #else p = xrealloc (b->text->beg, new_nbytes); #endif +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H + __lsan_ignore_object (p); +#endif if (p == NULL) { diff --git a/src/data.c b/src/data.c index 1db0a983b49..c261e8e90dd 100644 --- a/src/data.c +++ b/src/data.c @@ -23,6 +23,10 @@ along with GNU Emacs. If not, see . */ #include #include +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#include +#endif + #include #include #include @@ -1784,6 +1788,9 @@ make_blv (struct Lisp_Symbol *sym, bool forwarded, set_blv_defcell (blv, tem); set_blv_valcell (blv, tem); set_blv_found (blv, false); +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H + __lsan_ignore_object (blv); +#endif return blv; } diff --git a/src/emacs-module.c b/src/emacs-module.c index ac9ac824b7b..8d06a24210b 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -84,6 +84,10 @@ To add a new module function, proceed as follows: #include #include +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#include +#endif + #include "lisp.h" #include "bignum.h" #include "dynlib.h" @@ -1095,7 +1099,16 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0, for two different runtime objects are guaranteed to be distinct, which we can use for checking the liveness of runtime pointers. */ - struct emacs_runtime *rt = module_assertions ? xmalloc (sizeof *rt) : &rt_pub; + struct emacs_runtime *rt; + if (module_assertions) + { + rt = xmalloc (sizeof *rt); +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H + __lsan_ignore_object (rt); +#endif + } + else + rt = &rt_pub; rt->size = sizeof *rt; rt->private_members = &rt_priv; rt->get_environment = module_get_environment; @@ -1411,7 +1424,10 @@ static emacs_env * initialize_environment (emacs_env *env, struct emacs_env_private *priv) { if (module_assertions) + { env = xmalloc (sizeof *env); + __lsan_ignore_object (env); + } priv->pending_non_local_exit = emacs_funcall_exit_return; initialize_storage (&priv->storage); -- cgit v1.2.3 From 4ea90a711d11b14be728241a4454f8c5ee7b6478 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 1 Aug 2020 15:55:01 +0300 Subject: Fix last change * src/emacs-module.c (initialize_environment): Call __lsan_ignore_object only if HAVE_SANITIZER_LSAN_INTERFACE_H is undefined. This fixes compilation on systems that don't have __lsan_* functions. --- src/emacs-module.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/emacs-module.c b/src/emacs-module.c index 8d06a24210b..4374bf4b1c4 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -1426,7 +1426,9 @@ initialize_environment (emacs_env *env, struct emacs_env_private *priv) if (module_assertions) { env = xmalloc (sizeof *env); +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H __lsan_ignore_object (env); +#endif } priv->pending_non_local_exit = emacs_funcall_exit_return; -- cgit v1.2.3 From 91d539b0772d4b2a6bdc3fbccf92dc1fcc7f747a Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 16:55:45 +0200 Subject: Suppress leak sanitizer in a few more places * src/regex-emacs.c (regex_compile): src/search.c (newline_cache_on_off): Suppress leak sanitizer. --- src/regex-emacs.c | 7 +++++++ src/search.c | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/regex-emacs.c b/src/regex-emacs.c index ba7f3cef64b..5c08c81c0b5 100644 --- a/src/regex-emacs.c +++ b/src/regex-emacs.c @@ -29,6 +29,10 @@ #include +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#include +#endif + #include "character.h" #include "buffer.h" #include "syntax.h" @@ -1757,6 +1761,9 @@ regex_compile (re_char *pattern, ptrdiff_t size, /* Initialize the compile stack. */ compile_stack.stack = xmalloc (INIT_COMPILE_STACK_SIZE * sizeof *compile_stack.stack); +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H + __lsan_ignore_object (compile_stack.stack); +#endif compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; diff --git a/src/search.c b/src/search.c index ec076c18035..ad5d0302932 100644 --- a/src/search.c +++ b/src/search.c @@ -21,6 +21,10 @@ along with GNU Emacs. If not, see . */ #include +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#include +#endif + #include "lisp.h" #include "character.h" #include "buffer.h" @@ -613,7 +617,12 @@ newline_cache_on_off (struct buffer *buf) { /* It should be on. */ if (base_buf->newline_cache == 0) - base_buf->newline_cache = new_region_cache (); + { + base_buf->newline_cache = new_region_cache (); +#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H + __lsan_ignore_object (base_buf->newline_cache); +#endif + } } return base_buf->newline_cache; } -- cgit v1.2.3 From a2323c7ccb0eab1b6395d5d1d7e18db617354e13 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 16:58:06 +0200 Subject: Suppress sanitizer errors about pointer arithmetic in a few places We perform weird pointer arithmetic due to the layout of Lisp_Objects holding symbols. ASan/UBSan warns about that (Bug#42530). Suppress the warnings by performing the arithmetic on integer types and casting back to pointers. * src/alloc.c (mark_maybe_object, mark_memory): Temporarily cast pointer to 'intptr_t'. --- src/alloc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 76bb20876b0..5b9c6e4eb1f 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4638,7 +4638,8 @@ mark_maybe_object (Lisp_Object obj) break; } - void *po = (char *) XLP (obj) + (offset - LISP_WORD_TAG (type_tag)); + void *po = (char *) ((intptr_t) (char *) XLP (obj) + + (offset - LISP_WORD_TAG (type_tag))); /* If the pointer is in the dump image and the dump has a record of the object starting at the place where the pointer points, we @@ -4849,7 +4850,7 @@ mark_memory (void const *start, void const *end) On a host with 32-bit pointers and 64-bit Lisp_Objects, a Lisp_Object might be split into registers saved into non-adjacent words and P might be the low-order word's value. */ - p += (intptr_t) lispsym; + p = (char *) ((intptr_t) p + (intptr_t) lispsym); mark_maybe_pointer (p); verify (alignof (Lisp_Object) % GC_POINTER_ALIGNMENT == 0); -- cgit v1.2.3 From 06310cf9122500faa96ad200888cfbb1dda56563 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 17:12:30 +0200 Subject: Use a more precise check for '__lsan_ignore_object' * configure.ac: Add check for __lsan_ignore_object. * src/buffer.c (enlarge_buffer_text): * src/data.c (make_blv): * src/emacs-module.c (Fmodule_load, initialize_environment): * src/regex-emacs.c (regex_compile): * src/search.c (newline_cache_on_off): Use new configuration macro. --- configure.ac | 2 +- src/buffer.c | 2 +- src/data.c | 2 +- src/emacs-module.c | 4 ++-- src/regex-emacs.c | 2 +- src/search.c | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index b4674e3204b..93463e344ab 100644 --- a/configure.ac +++ b/configure.ac @@ -4516,7 +4516,7 @@ AC_CHECK_FUNCS_ONCE([sbrk]) AC_FUNC_FORK -AC_CHECK_FUNCS(snprintf) +AC_CHECK_FUNCS(snprintf __lsan_ignore_object) dnl Check for glib. This differs from other library checks in that dnl Emacs need not link to glib unless some other library is already diff --git a/src/buffer.c b/src/buffer.c index 3456a46be3e..e441499aeb0 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -5087,7 +5087,7 @@ enlarge_buffer_text (struct buffer *b, ptrdiff_t delta) #else p = xrealloc (b->text->beg, new_nbytes); #endif -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (p); #endif diff --git a/src/data.c b/src/data.c index c261e8e90dd..5fff52d24c2 100644 --- a/src/data.c +++ b/src/data.c @@ -1788,7 +1788,7 @@ make_blv (struct Lisp_Symbol *sym, bool forwarded, set_blv_defcell (blv, tem); set_blv_valcell (blv, tem); set_blv_found (blv, false); -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (blv); #endif return blv; diff --git a/src/emacs-module.c b/src/emacs-module.c index 4374bf4b1c4..f57101946b3 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -1103,7 +1103,7 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0, if (module_assertions) { rt = xmalloc (sizeof *rt); -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (rt); #endif } @@ -1426,7 +1426,7 @@ initialize_environment (emacs_env *env, struct emacs_env_private *priv) if (module_assertions) { env = xmalloc (sizeof *env); -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (env); #endif } diff --git a/src/regex-emacs.c b/src/regex-emacs.c index 5c08c81c0b5..1ecbc74b96c 100644 --- a/src/regex-emacs.c +++ b/src/regex-emacs.c @@ -1761,7 +1761,7 @@ regex_compile (re_char *pattern, ptrdiff_t size, /* Initialize the compile stack. */ compile_stack.stack = xmalloc (INIT_COMPILE_STACK_SIZE * sizeof *compile_stack.stack); -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (compile_stack.stack); #endif compile_stack.size = INIT_COMPILE_STACK_SIZE; diff --git a/src/search.c b/src/search.c index ad5d0302932..7b74ff91480 100644 --- a/src/search.c +++ b/src/search.c @@ -619,7 +619,7 @@ newline_cache_on_off (struct buffer *buf) if (base_buf->newline_cache == 0) { base_buf->newline_cache = new_region_cache (); -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H +#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (base_buf->newline_cache); #endif } -- cgit v1.2.3 From f1097d7af89c530327b92af2269fc1818559cb0f Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Sat, 1 Aug 2020 09:42:44 -0700 Subject: ; Auto-commit of loaddefs files. --- lisp/ldefs-boot.el | 173 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 147 insertions(+), 26 deletions(-) diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el index dd363b690f2..ae58bfc566b 100644 --- a/lisp/ldefs-boot.el +++ b/lisp/ldefs-boot.el @@ -7126,8 +7126,10 @@ Otherwise return a description formatted by of `eldoc-echo-area-use-multiline-p' variable and width of minibuffer window for width limit. -This function is meant to be used as a value of -`eldoc-documentation-function' variable." nil nil) +This function can be used as a value of +`eldoc-documentation-functions' variable. + +\(fn CALLBACK &rest _)" nil nil) (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "descr-text" '("describe-"))) @@ -9949,7 +9951,7 @@ It creates an autoload function for CNAME's constructor. ;;;### (autoloads nil "eldoc" "emacs-lisp/eldoc.el" (0 0 0 0)) ;;; Generated autoloads from emacs-lisp/eldoc.el -(push (purecopy '(eldoc 1 0 0)) package--builtin-versions) +(push (purecopy '(eldoc 1 8 0)) package--builtin-versions) ;;;*** @@ -10256,6 +10258,10 @@ some major modes from being locked under some circumstances. Report a bug in GNU Emacs. Prompts for bug subject. Leaves you in a mail buffer. +Already submitted bugs can be found in the Emacs bug tracker: + + https://debbugs.gnu.org/cgi/pkgreport.cgi?package=emacs;max-bugs=100;base-order=1;bug-rev=1 + \(fn TOPIC &optional UNUSED)" t nil) (set-advertised-calling-convention 'report-emacs-bug '(topic) '"24.5") @@ -11860,6 +11866,14 @@ Edit the hotlist of directory servers in a specialized buffer." t nil) (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "eudcb-mab" '("eudc-"))) +;;;*** + +;;;### (autoloads nil "eudcb-macos-contacts" "net/eudcb-macos-contacts.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from net/eudcb-macos-contacts.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "eudcb-macos-contacts" '("eudc-macos-contacts-"))) + ;;;*** ;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (0 0 0 0)) @@ -11909,7 +11923,11 @@ word(s) will be searched for via `eww-search-prefix'. If called with a prefix ARG, use a new buffer instead of reusing the default EWW buffer. -\(fn URL &optional ARG)" t nil) +If BUFFER, the data to be rendered is in that buffer. In that +case, this function doesn't actually fetch URL. BUFFER will be +killed after rendering. + +\(fn URL &optional ARG BUFFER)" t nil) (defalias 'browse-web 'eww) (autoload 'eww-open-file "eww" "\ @@ -11949,7 +11967,7 @@ instead of `browse-url-new-window-flag'. (autoload 'eww-list-bookmarks "eww" "\ Display the bookmarks." t nil) -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "eww" '("eww-"))) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "eww" '("erc--download-directory" "eww-"))) ;;;*** @@ -13100,7 +13118,7 @@ lines. ;;;### (autoloads nil "flymake" "progmodes/flymake.el" (0 0 0 0)) ;;; Generated autoloads from progmodes/flymake.el -(push (purecopy '(flymake 1 0 8)) package--builtin-versions) +(push (purecopy '(flymake 1 0 9)) package--builtin-versions) (autoload 'flymake-log "flymake" "\ Log, at level LEVEL, the message MSG formatted with ARGS. @@ -14140,8 +14158,13 @@ DEFAULT-MAP specifies the default key map for ICON-LIST. (when (fboundp 'custom-autoload) (custom-autoload 'gnus-select-method "gnus")) +(autoload 'gnus-child-no-server "gnus" "\ +Read network news as a child, without connecting to the local server. + +\(fn &optional ARG)" t nil) + (autoload 'gnus-slave-no-server "gnus" "\ -Read network news as a slave, without connecting to the local server. +Read network news as a child, without connecting to the local server. \(fn &optional ARG)" t nil) @@ -14154,10 +14177,15 @@ an NNTP server to use. As opposed to `gnus', this command will not connect to the local server. -\(fn &optional ARG SLAVE)" t nil) +\(fn &optional ARG CHILD)" t nil) + +(autoload 'gnus-child "gnus" "\ +Read news as a child. + +\(fn &optional ARG)" t nil) (autoload 'gnus-slave "gnus" "\ -Read news as a slave. +Read news as a child. \(fn &optional ARG)" t nil) @@ -14180,7 +14208,7 @@ If ARG is non-nil and a positive number, Gnus will use that as the startup level. If ARG is non-nil and not a positive number, Gnus will prompt the user for the name of an NNTP server to use. -\(fn &optional ARG DONT-CONNECT SLAVE)" t nil) +\(fn &optional ARG DONT-CONNECT CHILD)" t nil) (if (fboundp 'register-definition-prefixes) (register-definition-prefixes "gnus" '("gnus-"))) @@ -14195,8 +14223,13 @@ Start Gnus unplugged." t nil) (autoload 'gnus-plugged "gnus-agent" "\ Start Gnus plugged." t nil) +(autoload 'gnus-child-unplugged "gnus-agent" "\ +Read news as a child unplugged. + +\(fn &optional ARG)" t nil) + (autoload 'gnus-slave-unplugged "gnus-agent" "\ -Read news as a slave unplugged. +Read news as a child unplugged. \(fn &optional ARG)" t nil) @@ -19868,7 +19901,7 @@ done. Otherwise, it uses the current buffer. \(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil) -(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "log-edit" '("log-edit-" "vc-log-"))) +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "log-edit" '("log-edit-"))) ;;;*** @@ -20543,7 +20576,7 @@ Previous contents of that buffer are killed first." t nil) ;;;### (autoloads nil "man" "man.el" (0 0 0 0)) ;;; Generated autoloads from man.el -(defalias 'manual-entry 'man) +(define-obsolete-function-alias 'manual-entry 'man "28.1") (autoload 'man "man" "\ Get a Un*x manual page and put it in a buffer. @@ -20582,6 +20615,10 @@ names or descriptions. The pattern argument is usually an -k pattern +Note that in some cases you will need to use \\[quoted-insert] to quote the +SPC character in the above examples, because this command attempts +to auto-complete your input based on the installed manual pages. + \(fn MAN-ARGS)" t nil) (autoload 'man-follow "man" "\ @@ -22313,7 +22350,10 @@ writes. See `make-network-process' for details. :capability-command specifies a command used to query the HOST for its capabilities. For instance, for IMAP this should be - \"1 CAPABILITY\\r\\n\". + \"1 CAPABILITY\\r\\n\". This can either be a string (which will + then be sent verbatim to the server), or a function (called with + a single parameter; the \"greeting\" from the server when connecting), + and should return a string to send to the server. :starttls-function specifies a function for handling STARTTLS. This function should take one parameter, the response to the @@ -26254,19 +26294,57 @@ Open profile FILENAME. ;;;### (autoloads nil "project" "progmodes/project.el" (0 0 0 0)) ;;; Generated autoloads from progmodes/project.el -(push (purecopy '(project 0 4 0)) package--builtin-versions) +(push (purecopy '(project 0 5 0)) package--builtin-versions) (autoload 'project-current "project" "\ -Return the project instance in DIR or `default-directory'. -When no project found in DIR, and MAYBE-PROMPT is non-nil, ask -the user for a different project to look in. +Return the project instance in DIRECTORY, defaulting to `default-directory'. + +When no project is found in that directory, the result depends on +the value of MAYBE-PROMPT: if it is nil or omitted, return nil, +else ask the user for a directory in which to look for the +project, and if no project is found there, return a \"transient\" +project instance. -\(fn &optional MAYBE-PROMPT DIR)" nil nil) +The \"transient\" project instance is a special kind of value +which denotes a project rooted in that directory and includes all +the files under the directory except for those that should be +ignored (per `project-ignores'). -(defvar project-prefix-map (let ((map (make-sparse-keymap))) (define-key map "f" 'project-find-file) (define-key map "b" 'project-switch-to-buffer) (define-key map "s" 'project-shell) (define-key map "d" 'project-dired) (define-key map "v" 'project-vc-dir) (define-key map "c" 'project-compile) (define-key map "e" 'project-eshell) (define-key map "k" 'project-kill-buffers) (define-key map "p" 'project-switch-project) (define-key map "g" 'project-find-regexp) (define-key map "r" 'project-query-replace-regexp) map) "\ +See the doc string of `project-find-functions' for the general form +of the project instance object. + +\(fn &optional MAYBE-PROMPT DIRECTORY)" nil nil) + +(defvar project-prefix-map (let ((map (make-sparse-keymap))) (define-key map "f" 'project-find-file) (define-key map "F" 'project-or-external-find-file) (define-key map "b" 'project-switch-to-buffer) (define-key map "s" 'project-shell) (define-key map "d" 'project-dired) (define-key map "v" 'project-vc-dir) (define-key map "c" 'project-compile) (define-key map "e" 'project-eshell) (define-key map "k" 'project-kill-buffers) (define-key map "p" 'project-switch-project) (define-key map "g" 'project-find-regexp) (define-key map "G" 'project-or-external-find-regexp) (define-key map "r" 'project-query-replace-regexp) map) "\ Keymap for project commands.") (define-key ctl-x-map "p" project-prefix-map) +(autoload 'project-other-window-command "project" "\ +Run project command, displaying resultant buffer in another window. + +The following commands are available: + +\\{project-prefix-map} +\\{project-other-window-map}" t nil) + (define-key ctl-x-4-map "p" #'project-other-window-command) + +(autoload 'project-other-frame-command "project" "\ +Run project command, displaying resultant buffer in another frame. + +The following commands are available: + +\\{project-prefix-map} +\\{project-other-frame-map}" t nil) + (define-key ctl-x-5-map "p" #'project-other-frame-command) + +(autoload 'project-other-tab-command "project" "\ +Run project command, displaying resultant buffer in a new tab. + +The following commands are available: + +\\{project-prefix-map}" t nil) + (define-key tab-prefix-map "p" #'project-other-tab-command) + (autoload 'project-find-regexp "project" "\ Find all matches for REGEXP in the current project's roots. With \\[universal-argument] prefix, you can specify the directory @@ -26338,13 +26416,56 @@ Arguments the same as in `compile'. \(fn COMMAND &optional COMINT)" t nil) (autoload 'project-switch-to-buffer "project" "\ -Switch to another buffer that is related to the current project. -A buffer is related to a project if its `default-directory' -is inside the directory hierarchy of the project's root." t nil) +Display buffer BUFFER-OR-NAME in the selected window. +When called interactively, prompts for a buffer belonging to the +current project. Two buffers belong to the same project if their +project instances, as reported by `project-current' in each +buffer, are identical. + +\(fn BUFFER-OR-NAME)" t nil) + +(autoload 'project-display-buffer "project" "\ +Display BUFFER-OR-NAME in some window, without selecting it. +When called interactively, prompts for a buffer belonging to the +current project. Two buffers belong to the same project if their +project instances, as reported by `project-current' in each +buffer, are identical. + +This function uses `display-buffer' as a subroutine, which see +for how it is determined where the buffer will be displayed. + +\(fn BUFFER-OR-NAME)" t nil) + +(autoload 'project-display-buffer-other-frame "project" "\ +Display BUFFER-OR-NAME preferably in another frame. +When called interactively, prompts for a buffer belonging to the +current project. Two buffers belong to the same project if their +project instances, as reported by `project-current' in each +buffer, are identical. + +This function uses `display-buffer-other-frame' as a subroutine, +which see for how it is determined where the buffer will be +displayed. + +\(fn BUFFER-OR-NAME)" t nil) (autoload 'project-kill-buffers "project" "\ -Kill all live buffers belonging to the current project. -Certain buffers may be \"spared\", see `project-kill-buffers-ignores'." t nil) +Kill the buffers belonging to the current project. +Two buffers belong to the same project if their project +instances, as reported by `project-current' in each buffer, are +identical. Only the buffers that match a condition in +`project-kill-buffer-conditions' will be killed. If NO-CONFIRM +is non-nil, the command will not ask the user for confirmation. +NO-CONFIRM is always nil when the command is invoked +interactivly. + +\(fn &optional NO-CONFIRM)" t nil) + +(autoload 'project-remember-project "project" "\ +Add project PR to the front of the project list. +Save the result in `project-list-file' if the list of projects has changed. + +\(fn PR)" nil nil) (autoload 'project-known-project-roots "project" "\ Return the list of root directories of all known projects." nil nil) @@ -36792,7 +36913,7 @@ Key bindings: ;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el" ;;;;;; (0 0 0 0)) ;;; Generated autoloads from progmodes/verilog-mode.el -(push (purecopy '(verilog-mode 2020 2 23 232634261)) package--builtin-versions) +(push (purecopy '(verilog-mode 2020 6 27 14326051)) package--builtin-versions) (autoload 'verilog-mode "verilog-mode" "\ Major mode for editing Verilog code. -- cgit v1.2.3 From b04d391d796281faf0f824ed398b26a9a1758f8d Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sat, 1 Aug 2020 20:08:44 +0200 Subject: Implement alternative for Tramp's signal return string * lisp/net/tramp-adb.el (process-file-return-signal-string): Declare. (tramp-adb-get-signal-strings): New defun. (tramp-adb-handle-process-file): Use it. * lisp/net/tramp-sh.el (process-file-return-signal-string): Declare. (tramp-sh-get-signal-strings): New defun. (tramp-sh-handle-process-file): Use it. * lisp/net/tramp.el (tramp-get-signal-strings): Remove function. * test/lisp/net/tramp-tests.el (tramp-test28-process-file): Accept alternative signal return string. --- lisp/net/tramp-adb.el | 31 ++++++++++++++++++++++- lisp/net/tramp-sh.el | 58 +++++++++++++++++++++++++++++++++++++++++++- lisp/net/tramp.el | 17 ------------- test/lisp/net/tramp-tests.el | 4 +-- 4 files changed, 89 insertions(+), 21 deletions(-) diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index c1eb36e3405..7e5af6910bb 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -35,6 +35,8 @@ (require 'tramp) +(defvar process-file-return-signal-string) + ;;;###tramp-autoload (defcustom tramp-adb-program "adb" "Name of the Android Debug Bridge program." @@ -741,6 +743,33 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." filename newname ok-if-already-exists 'keep-time 'preserve-uid-gid) (delete-file filename))))))) +(defun tramp-adb-get-signal-strings (vec) + "Strings to return by `process-file' in case of signals." + (with-tramp-connection-property vec "signal-strings" + (let ((default-directory (tramp-make-tramp-file-name vec 'localname)) + ;; `shell-file-name' and `shell-command-switch' are needed + ;; for Emacs < 27.1, which doesn't support connection-local + ;; variables in `shell-command'. + (shell-file-name "/system/bin/sh") + (shell-command-switch "-c") + process-file-return-signal-string signals result) + (dotimes (i 128) (push (format "Signal %d" i) result)) + (setq result (reverse result) + signals (split-string + (shell-command-to-string "COLUMNS=40 kill -l") "\n" 'omit)) + (setcar result 0) + (dolist (line signals) + (when (string-match + (concat + "^[[:space:]]*\\([[:digit:]]+\\)" + "[[:space:]]+\\S-+[[:space:]]+" + "\\([[:alpha:]].*\\)$") + line) + (setcar + (nthcdr (string-to-number (match-string 1 line)) result) + (match-string 2 line)))) + result))) + (defun tramp-adb-handle-process-file (program &optional infile destination display &rest args) "Like `process-file' for Tramp files." @@ -833,7 +862,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." ;; since Emacs 28.1. (when (and (bound-and-true-p process-file-return-signal-string) (natnump ret) (> ret 128)) - (setq ret (nth (- ret 128) (tramp-get-signal-strings)))) + (setq ret (nth (- ret 128) (tramp-adb-get-signal-strings v)))) ;; Provide error file. (when tmpstderr (rename-file tmpstderr (cadr destination) t)) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 1a867c30feb..9f37207def1 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -36,6 +36,7 @@ (declare-function dired-remove-file "dired-aux") (defvar dired-compress-file-suffixes) +(defvar process-file-return-signal-string) (defvar vc-handled-backends) (defvar vc-bzr-program) (defvar vc-git-program) @@ -3009,6 +3010,61 @@ STDERR can also be a file name." (tramp-flush-connection-property v "process-name") (tramp-flush-connection-property v "process-buffer")))))))) +(defun tramp-sh-get-signal-strings (vec) + "Strings to return by `process-file' in case of signals." + (with-tramp-connection-property + vec + (concat + "signal-strings-" (tramp-get-method-parameter vec 'tramp-remote-shell)) + (let ((default-directory (tramp-make-tramp-file-name vec 'localname)) + process-file-return-signal-string signals res result) + (setq signals + (append + '(0) (split-string (shell-command-to-string "kill -l") nil 'omit))) + ;; Sanity check. "kill -l" shall have returned just the signal + ;; names. Some shells don't, like the one in "docker alpine". + (let (signal-hook-function) + (condition-case nil + (dolist (sig (cdr signals)) + (unless (string-match-p "^[[:alnum:]+-]+$" sig) + (error nil))) + (error (setq signals '(0))))) + (dotimes (i 128) + (push + (cond + ;; Some predefined values, which aren't reported sometimes, + ;; or would raise problems (all Stopped signals). + ((= i 0) 0) + ((string-equal (nth i signals) "HUP") "Hangup") + ((string-equal (nth i signals) "INT") "Interrupt") + ((string-equal (nth i signals) "QUIT") "Quit") + ((string-equal (nth i signals) "STOP") "Stopped (signal)") + ((string-equal (nth i signals) "TSTP") "Stopped") + ((string-equal (nth i signals) "TTIN") "Stopped (tty input)") + ((string-equal (nth i signals) "TTOU") "Stopped (tty output)") + (t (setq res + (if (null (nth i signals)) + "" + (tramp-send-command + vec + (format + "%s %s %s" + (tramp-get-method-parameter vec 'tramp-remote-shell) + (mapconcat + #'identity + (tramp-get-method-parameter vec 'tramp-remote-shell-args) + " ") + (tramp-shell-quote-argument (format "kill -%d $$" i)))) + (with-current-buffer (tramp-get-connection-buffer vec) + (goto-char (point-min)) + (buffer-substring (point-at-bol) (point-at-eol))))) + (if (string-equal res "") + (format "Signal %d" i) + res))) + result)) + ;; Due to Bug#41287, we cannot add this to the `dotimes' clause. + (reverse result)))) + (defun tramp-sh-handle-process-file (program &optional infile destination display &rest args) "Like `process-file' for Tramp files." @@ -3126,7 +3182,7 @@ STDERR can also be a file name." ;; since Emacs 28.1. (when (and (bound-and-true-p process-file-return-signal-string) (natnump ret) (>= ret 128)) - (setq ret (nth (- ret 128) (tramp-get-signal-strings)))) + (setq ret (nth (- ret 128) (tramp-sh-get-signal-strings v)))) ;; Provide error file. (when tmpstderr (rename-file tmpstderr (cadr destination) t)) diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index 19cf3334502..c169a86f915 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -5108,23 +5108,6 @@ name of a process or buffer, or nil to default to the current buffer." (lambda () (remove-hook 'interrupt-process-functions #'tramp-interrupt-process)))) -(defun tramp-get-signal-strings () - "Strings to return by `process-file' in case of signals." - ;; We use key nil for local connection properties. - (with-tramp-connection-property nil "signal-strings" - (let (result) - (if (and (stringp shell-file-name) (executable-find shell-file-name)) - (dotimes (i 128) - (push - (if (= i 19) 1 ;; SIGSTOP - (call-process - shell-file-name nil nil nil "-c" (format "kill -%d $$" i))) - result)) - (dotimes (i 128) - (push (format "Signal %d" i) result))) - ;; Due to Bug#41287, we cannot add this to the `dotimes' clause. - (reverse result)))) - ;; Checklist for `tramp-unload-hook' ;; - Unload all `tramp-*' packages ;; - Reset `file-name-handler-alist' diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 34782e7f151..19da15acafa 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -4256,8 +4256,8 @@ This tests also `make-symbolic-link', `file-truename' and `add-name-to-file'." ;; there's an indication for a signal describing string. (let ((process-file-return-signal-string t)) (should - (string-equal - "Interrupt" + (string-match + "Interrupt\\|Signal 2" (process-file (if (tramp--test-adb-p) "/system/bin/sh" "/bin/sh") nil nil nil "-c" "kill -2 $$")))) -- cgit v1.2.3 From a8f99d113c0556fd2860304ac7d7ff1c8f7c3ad4 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Wed, 20 May 2020 21:28:25 +0100 Subject: Recreate macOS color list if it is corrupt * src/nsterm.m (ns_term_init): Generate the color list if there are less colors in the existing file than in rgb.txt. --- src/nsterm.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/nsterm.m b/src/nsterm.m index 0e405fc0175..df7f716f51e 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -5476,7 +5476,8 @@ ns_term_init (Lisp_Object display_name) { NSColorList *cl = [NSColorList colorListNamed: @"Emacs"]; - if ( cl == nil ) + /* There are 752 colors defined in rgb.txt. */ + if ( cl == nil || [[cl allKeys] count] < 752) { Lisp_Object color_file, color_map, color; unsigned long c; -- cgit v1.2.3 From 1d70fbe4c83d6439716a054f6c074202c534a425 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 20:59:09 +0200 Subject: * src/alloc.c (resize_string_data): Adjust string bytes (Bug#42540) --- src/alloc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/alloc.c b/src/alloc.c index 5b9c6e4eb1f..f203061161b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1947,6 +1947,9 @@ resize_string_data (Lisp_Object string, ptrdiff_t cidx_byte, /* No need to reallocate, as the size change falls within the alignment slop. */ XSTRING (string)->u.s.size_byte = new_nbytes; +#ifdef GC_CHECK_STRING_BYTES + SDATA_NBYTES (old_sdata) = new_nbytes; +#endif new_charaddr = data + cidx_byte; memmove (new_charaddr + new_clen, new_charaddr + clen, nbytes - (cidx_byte + (clen - 1))); -- cgit v1.2.3 From fce47c93252fe0be14e8c169f6bab8b0fd512cab Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 21:01:24 +0200 Subject: Improve offset calculation in wide int builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * src/alloc.c (mark_maybe_object): Make sure that OFFSET isn’t widened during subtraction. --- src/alloc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index f203061161b..e556fc86a3b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4641,8 +4641,10 @@ mark_maybe_object (Lisp_Object obj) break; } - void *po = (char *) ((intptr_t) (char *) XLP (obj) - + (offset - LISP_WORD_TAG (type_tag))); + bool overflow + = INT_SUBTRACT_WRAPV (offset, LISP_WORD_TAG (type_tag), &offset); + eassert (!overflow); + void *po = (char *) ((intptr_t) (char *) XLP (obj) + offset); /* If the pointer is in the dump image and the dump has a record of the object starting at the place where the pointer points, we -- cgit v1.2.3 From 6ec71e829a272e562c541ef5c93213d2fac3d3d7 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sat, 1 Aug 2020 21:34:46 +0200 Subject: * src/alloc.c (mark_maybe_object): Make overflow check conditional. --- src/alloc.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/alloc.c b/src/alloc.c index e556fc86a3b..e139d8cf262 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4643,7 +4643,13 @@ mark_maybe_object (Lisp_Object obj) bool overflow = INT_SUBTRACT_WRAPV (offset, LISP_WORD_TAG (type_tag), &offset); +#if !defined WIDE_EMACS_INT || USE_LSB_TAG + /* If we don't use wide integers, then `intptr_t' should always be + large enough to not overflow. Furthermore, when using the least + significant bits as tag bits, the tag is small enough to not + overflow either. */ eassert (!overflow); +#endif void *po = (char *) ((intptr_t) (char *) XLP (obj) + offset); /* If the pointer is in the dump image and the dump has a record -- cgit v1.2.3 From 882448746778f3d63e7e793f1d5866014ad2f005 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 07:48:30 +0200 Subject: Fix race condition in erc-server-send-queue vs quitting erc * lisp/erc/erc-backend.el (erc-server-send-queue): Check that the buffer is live before using it (bug#40418). This fixes a rare problem when the queue is non-empty when `erc-quit-server' is run. --- lisp/erc/erc-backend.el | 71 +++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 1e2526f35ce..654fc23ae7d 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -864,41 +864,42 @@ Additionally, detect whether the IRC process has hung." "Send messages in `erc-server-flood-queue'. See `erc-server-flood-margin' for an explanation of the flood protection algorithm." - (with-current-buffer buffer - (let ((now (current-time))) - (when erc-server-flood-timer - (erc-cancel-timer erc-server-flood-timer) - (setq erc-server-flood-timer nil)) - (when (time-less-p erc-server-flood-last-message now) - (setq erc-server-flood-last-message (erc-emacs-time-to-erc-time now))) - (while (and erc-server-flood-queue - (time-less-p erc-server-flood-last-message - (time-add now erc-server-flood-margin))) - (let ((msg (caar erc-server-flood-queue)) - (encoding (cdar erc-server-flood-queue))) - (setq erc-server-flood-queue (cdr erc-server-flood-queue) - erc-server-flood-last-message - (+ erc-server-flood-last-message - erc-server-flood-penalty)) - (erc-log-irc-protocol msg 'outbound) - (erc-log (concat "erc-server-send-queue: " - msg "(" (buffer-name buffer) ")")) - (when (erc-server-process-alive) - (condition-case nil - ;; Set encoding just before sending the string - (progn - (when (fboundp 'set-process-coding-system) - (set-process-coding-system erc-server-process - 'raw-text encoding)) - (process-send-string erc-server-process msg)) - ;; Sometimes the send can occur while the process is - ;; being killed, which results in a weird SIGPIPE error. - ;; Catch this and ignore it. - (error nil))))) - (when erc-server-flood-queue - (setq erc-server-flood-timer - (run-at-time (+ 0.2 erc-server-flood-penalty) - nil #'erc-server-send-queue buffer)))))) + (when (buffer-live-p buffer) + (with-current-buffer buffer + (let ((now (current-time))) + (when erc-server-flood-timer + (erc-cancel-timer erc-server-flood-timer) + (setq erc-server-flood-timer nil)) + (when (time-less-p erc-server-flood-last-message now) + (setq erc-server-flood-last-message (erc-emacs-time-to-erc-time now))) + (while (and erc-server-flood-queue + (time-less-p erc-server-flood-last-message + (time-add now erc-server-flood-margin))) + (let ((msg (caar erc-server-flood-queue)) + (encoding (cdar erc-server-flood-queue))) + (setq erc-server-flood-queue (cdr erc-server-flood-queue) + erc-server-flood-last-message + (+ erc-server-flood-last-message + erc-server-flood-penalty)) + (erc-log-irc-protocol msg 'outbound) + (erc-log (concat "erc-server-send-queue: " + msg "(" (buffer-name buffer) ")")) + (when (erc-server-process-alive) + (condition-case nil + ;; Set encoding just before sending the string + (progn + (when (fboundp 'set-process-coding-system) + (set-process-coding-system erc-server-process + 'raw-text encoding)) + (process-send-string erc-server-process msg)) + ;; Sometimes the send can occur while the process is + ;; being killed, which results in a weird SIGPIPE error. + ;; Catch this and ignore it. + (error nil))))) + (when erc-server-flood-queue + (setq erc-server-flood-timer + (run-at-time (+ 0.2 erc-server-flood-penalty) + nil #'erc-server-send-queue buffer))))))) (defun erc-message (message-command line &optional force) "Send LINE to the server as a privmsg or a notice. -- cgit v1.2.3 From 8f181124dfc84b9a7fcadb895af6ce2978d8a40e Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 07:55:02 +0200 Subject: Make some erc function aliases obsolete * lisp/erc/erc-networks.el (erc-current-network): * lisp/erc/erc-join.el (erc-autojoin-channels-delayed): * lisp/erc/erc-backend.el (erc-server-setup-periodical-ping) (erc-server-send-ping, erc-server-send-queue): * lisp/erc/erc-autoaway.el (erc-autoaway-reestablish-idletimer) (autoaway): Adjust callers. * lisp/erc/erc-compat.el (erc-with-selected-window) (erc-cancel-timer, erc-make-obsolete) (erc-make-obsolete-variable): Make these aliases obsolete. --- lisp/erc/erc-autoaway.el | 4 ++-- lisp/erc/erc-backend.el | 11 ++++++----- lisp/erc/erc-compat.el | 10 ++++++---- lisp/erc/erc-join.el | 4 ++-- lisp/erc/erc-networks.el | 4 ++-- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lisp/erc/erc-autoaway.el b/lisp/erc/erc-autoaway.el index 0950cec4f7f..0923ed6e735 100644 --- a/lisp/erc/erc-autoaway.el +++ b/lisp/erc/erc-autoaway.el @@ -54,7 +54,7 @@ If `erc-autoaway-idle-method' is `emacs', you must call this function each time you change `erc-autoaway-idle-seconds'." (interactive) (when erc-autoaway-idletimer - (erc-cancel-timer erc-autoaway-idletimer)) + (cancel-timer erc-autoaway-idletimer)) (setq erc-autoaway-idletimer (run-with-idle-timer erc-autoaway-idle-seconds t @@ -133,7 +133,7 @@ Related variables: `erc-public-away-p' and `erc-away-nickname'." (remove-hook 'erc-after-connect 'erc-autoaway-insinuate-maybe) (remove-hook 'erc-disconnected-hook 'erc-autoaway-remove-maybe)) ((eq erc-autoaway-idle-method 'emacs) - (erc-cancel-timer erc-autoaway-idletimer) + (cancel-timer erc-autoaway-idletimer) (setq erc-autoaway-idletimer nil))) (remove-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away) (remove-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators)))) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 654fc23ae7d..4f3d85ba3c8 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -520,7 +520,8 @@ If no subword-mode is active, then this is "Set up a timer to periodically ping the current server. The current buffer is given by BUFFER." (with-current-buffer buffer - (and erc-server-ping-handler (erc-cancel-timer erc-server-ping-handler)) + (when erc-server-ping-handler + (cancel-timer erc-server-ping-handler)) (when erc-server-send-ping-interval (setq erc-server-ping-handler (run-with-timer 4 erc-server-send-ping-interval @@ -533,7 +534,7 @@ The current buffer is given by BUFFER." (if timer-tuple ;; this buffer already has a timer. Cancel it and set the new one (progn - (erc-cancel-timer (cdr timer-tuple)) + (cancel-timer (cdr timer-tuple)) (setf (cdr (assq buffer erc-server-ping-timer-alist)) erc-server-ping-handler)) ;; no existing timer for this buffer. Add new one @@ -731,7 +732,7 @@ Conditionally try to reconnect and take appropriate action." (erc-with-all-buffers-of-server cproc nil (setq erc-server-connected nil)) (when erc-server-ping-handler - (progn (erc-cancel-timer erc-server-ping-handler) + (progn (cancel-timer erc-server-ping-handler) (setq erc-server-ping-handler nil))) (run-hook-with-args 'erc-disconnected-hook (erc-current-nick) (system-name) "") @@ -856,7 +857,7 @@ Additionally, detect whether the IRC process has hung." ;; remove timer if the server buffer has been killed (let ((timer (assq buf erc-server-ping-timer-alist))) (when timer - (erc-cancel-timer (cdr timer)) + (cancel-timer (cdr timer)) (setcdr timer nil))))) ;; From Circe @@ -868,7 +869,7 @@ protection algorithm." (with-current-buffer buffer (let ((now (current-time))) (when erc-server-flood-timer - (erc-cancel-timer erc-server-flood-timer) + (cancel-timer erc-server-flood-timer) (setq erc-server-flood-timer nil)) (when (time-less-p erc-server-flood-last-message now) (setq erc-server-flood-last-message (erc-emacs-time-to-erc-time now))) diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el index c77d5abf2e4..388728b04a0 100644 --- a/lisp/erc/erc-compat.el +++ b/lisp/erc/erc-compat.el @@ -79,10 +79,12 @@ START is the beginning position of the last match (see `match-beginning'). See `replace-match' for explanations of FIXEDCASE and LITERAL." (replace-match newtext fixedcase literal string subexp)) -(defalias 'erc-with-selected-window 'with-selected-window) -(defalias 'erc-cancel-timer 'cancel-timer) -(defalias 'erc-make-obsolete 'make-obsolete) -(defalias 'erc-make-obsolete-variable 'make-obsolete-variable) +(define-obsolete-function-alias 'erc-with-selected-window + #'with-selected-window "28.1") +(define-obsolete-function-alias 'erc-cancel-timer #'cancel-timer "28.1") +(define-obsolete-function-alias 'erc-make-obsolete #'make-obsolete "28.1") +(define-obsolete-function-alias 'erc-make-obsolete-variable + #'make-obsolete-variable "28.1") ;; Provide a simpler replacement for `member-if' (defun erc-member-if (predicate list) diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el index 280d6bfe0f1..e4faf6bd797 100644 --- a/lisp/erc/erc-join.el +++ b/lisp/erc/erc-join.el @@ -113,7 +113,7 @@ servers, presumably in the same domain." This is called from a timer set up by `erc-autojoin-channels'." (if erc--autojoin-timer (setq erc--autojoin-timer - (erc-cancel-timer erc--autojoin-timer))) + (cancel-timer erc--autojoin-timer))) (with-current-buffer buffer ;; Don't kick of another delayed autojoin or try to wait for ;; another ident response: @@ -127,7 +127,7 @@ This is called from a timer set up by `erc-autojoin-channels'." This function is run from `erc-nickserv-identified-hook'." (if erc--autojoin-timer (setq erc--autojoin-timer - (erc-cancel-timer erc--autojoin-timer))) + (cancel-timer erc--autojoin-timer))) (when (eq erc-autojoin-timing 'ident) (let ((server (or erc-session-server erc-server-announced-name)) (joined (mapcar (lambda (buf) diff --git a/lisp/erc/erc-networks.el b/lisp/erc/erc-networks.el index 1234962c51c..415fb53fee0 100644 --- a/lisp/erc/erc-networks.el +++ b/lisp/erc/erc-networks.el @@ -756,8 +756,8 @@ Return the name of this server's network as a symbol." (erc-with-server-buffer (intern (downcase (symbol-name erc-network))))) -(erc-make-obsolete 'erc-current-network 'erc-network - "Obsolete since erc-networks 1.5") +(make-obsolete 'erc-current-network 'erc-network + "Obsolete since erc-networks 1.5") (defun erc-network-name () "Return the name of the current network as a string." -- cgit v1.2.3 From eab636c7eb25c4e1cbfeb0fc48cc1274e1c55222 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 09:04:31 +0200 Subject: Try to fix mailcap parsing again to respect Emacs defaults * lisp/net/mailcap.el (mailcap--computed-mime-data): New variable. (mailcap-parse-mailcaps): Don't delete Emacs-distributed fallback values (bug#40247). (mailcap-add-mailcap-entry): Extend to allow working on different variables. (mailcap-add): Store data in mailcap-user-mime-data, since it should be heeded first. --- lisp/net/mailcap.el | 60 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el index 5fe5b4d3a54..86f9d2bf07c 100644 --- a/lisp/net/mailcap.el +++ b/lisp/net/mailcap.el @@ -29,6 +29,7 @@ ;;; Code: +(require 'cl-lib) (autoload 'mail-header-parse-content-type "mail-parse") (defgroup mailcap nil @@ -337,6 +338,10 @@ is a string or list of strings, it represents a shell command to run to return a true or false shell value for the validity.") (put 'mailcap-mime-data 'risky-local-variable t) +(defvar mailcap--computed-mime-data nil + "Computed version of the mailcap data incorporating all sources. +Same format as `mailcap-mime-data'.") + (defcustom mailcap-download-directory nil "Directory to which `mailcap-save-binary-file' downloads files by default. nil means your home directory." @@ -422,7 +427,13 @@ MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus (when (or (not mailcap-parsed-p) force) ;; Clear out all old data. - (setq mailcap-mime-data nil) + (setq mailcap--computed-mime-data nil) + ;; Add the Emacs-distributed defaults (which will be used as + ;; fallbacks). Do it this way instead of just copying the list, + ;; since entries are destructively modified. + (cl-loop for (major . minors) in mailcap-mime-data + do (cl-loop for (minor . entry) in minors + do (mailcap-add-mailcap-entry major minor entry))) (cond (path nil) ((getenv "MAILCAPS") @@ -709,10 +720,13 @@ to supply to the test." (push (list otest result) mailcap-viewer-test-cache) result)))) -(defun mailcap-add-mailcap-entry (major minor info) - (let ((old-major (assoc major mailcap-mime-data))) +(defun mailcap-add-mailcap-entry (major minor info &optional storage) + (let* ((storage (or storage 'mailcap--computed-mime-data)) + (old-major (assoc major (symbol-value storage)))) (if (null old-major) ; New major area - (push (cons major (list (cons minor info))) mailcap-mime-data) + (set storage + (cons (cons major (list (cons minor info))) + (symbol-value storage))) (let ((cur-minor (assoc minor old-major))) (cond ((or (null cur-minor) ; New minor area, or @@ -736,11 +750,15 @@ If TEST is not given, it defaults to t." (when (or (not (car tl)) (not (cadr tl))) (error "%s is not a valid MIME type" type)) - (mailcap-add-mailcap-entry - (car tl) (cadr tl) - `((viewer . ,viewer) - (test . ,(if test test t)) - (type . ,type))))) + (let ((entry + `((viewer . ,viewer) + (test . ,(if test test t)) + (type . ,type)))) + ;; Store it. + (mailcap-add-mailcap-entry (car tl) (cadr tl) entry + 'mailcap-user-mime-data) + ;; Make it available for usage. + (mailcap-add-mailcap-entry (car tl) (cadr tl) entry)))) ;;; ;;; The main whabbo @@ -791,13 +809,13 @@ If NO-DECODE is non-nil, don't decode STRING." ;; NO-DECODE avoids calling `mail-header-parse-content-type' from ;; `mail-parse.el' (let ( - major ; Major encoding (text, etc) - minor ; Minor encoding (html, etc) - info ; Other info - major-info ; (assoc major mailcap-mime-data) - viewers ; Possible viewers - passed ; Viewers that passed the test - viewer ; The one and only viewer + major ; Major encoding (text, etc) + minor ; Minor encoding (html, etc) + info ; Other info + major-info ; (assoc major mailcap--computed-mime-data) + viewers ; Possible viewers + passed ; Viewers that passed the test + viewer ; The one and only viewer ctl) (save-excursion (setq ctl @@ -809,12 +827,12 @@ If NO-DECODE is non-nil, don't decode STRING." (if viewer (setq passed (list viewer)) ;; None found, so heuristically select some applicable viewer - ;; from `mailcap-mime-data'. + ;; from `mailcap--computed-mime-data'. (mailcap-parse-mailcaps nil t) (setq major (split-string (car ctl) "/")) (setq minor (cadr major) major (car major)) - (when (setq major-info (cdr (assoc major mailcap-mime-data))) + (when (setq major-info (cdr (assoc major mailcap--computed-mime-data))) (when (setq viewers (mailcap-possible-viewers major-info minor)) (setq info (mapcar (lambda (a) (cons (symbol-name (car a)) (cdr a))) @@ -847,7 +865,7 @@ If NO-DECODE is non-nil, don't decode STRING." ((eq request 'all) passed) (t - ;; MUST make a copy *sigh*, else we modify mailcap-mime-data + ;; MUST make a copy *sigh*, else we modify mailcap--computed-mime-data (setq viewer (copy-sequence viewer)) (let ((view (assq 'viewer viewer)) (test (assq 'test viewer))) @@ -1057,7 +1075,7 @@ For instance, \"foo.png\" will result in \"image/png\"." (nconc (mapcar 'cdr mailcap-mime-extensions) (let (res type) - (dolist (data mailcap-mime-data) + (dolist (data mailcap--computed-mime-data) (dolist (info (cdr data)) (setq type (cdr (assq 'type (cdr info)))) (unless (string-match-p "\\*" type) @@ -1117,7 +1135,7 @@ For instance, \"foo.png\" will result in \"image/png\"." (defun mailcap-view-mime (type) "View the data in the current buffer that has MIME type TYPE. -`mailcap-mime-data' determines the method to use." +`mailcap--computed-mime-data' determines the method to use." (let ((method (mailcap-mime-info type))) (if (stringp method) (shell-command-on-region (point-min) (point-max) -- cgit v1.2.3 From 6f94c2405f4c82b63da19de89549aff1fad7e594 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 09:43:41 +0200 Subject: Fix erc bug when there's two channels with the same name * lisp/erc/erc.el (erc-generate-new-buffer-name): Fix logic when there's two channels with the same name from two different servers (bug#40121). --- lisp/erc/erc.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index bfe8a2b42eb..8830dd4c45e 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1622,10 +1622,12 @@ symbol, it may have these values: (if (and (not buffer-name) erc-reuse-buffers (or (not (get-buffer candidate)) - (or target - (with-current-buffer (get-buffer candidate) - (and (erc-server-buffer-p) - (not (erc-server-process-alive))))) + ;; Looking for a server buffer, so there's no target. + (and (not target) + (with-current-buffer (get-buffer candidate) + (and (erc-server-buffer-p) + (not (erc-server-process-alive))))) + ;; Channel buffer; check that it's from the right server. (with-current-buffer (get-buffer candidate) (and (string= erc-session-server server) (erc-port-equal erc-session-port port))))) -- cgit v1.2.3 From 929e7e141c5780e51173fda7d7fc5b73411e4465 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 11:32:35 +0200 Subject: Signal an error in the user clicks "cancel" when signing in epg * lisp/epg.el (epg-sign-string): If the user clicks "cancel" on the pinentry, then we don't have an error from gpg(sm), but instead nothing (bug#39058). Signal an error in that case. --- lisp/epg.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/epg.el b/lisp/epg.el index 222fd913e17..5b90bc290ab 100644 --- a/lisp/epg.el +++ b/lisp/epg.el @@ -1683,7 +1683,8 @@ Otherwise, it makes a cleartext signature." (if (epg-context-result-for context 'error) (let ((errors (epg-context-result-for context 'error))) (signal 'epg-error - (list "Sign failed" (epg-errors-to-string errors)))))) + (list "Sign failed" (epg-errors-to-string errors)))) + (signal 'epg-error '("Signing failed (unknown reason)")))) (epg-read-output context)) (epg-delete-output-file context) (if input-file -- cgit v1.2.3 From 069b58b7c852b59f8ef7642e21db339626045671 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 12:58:44 +0200 Subject: * src/alloc.c (mark_memory): Avoid signed integer overflow --- src/alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/alloc.c b/src/alloc.c index e139d8cf262..be293cca54a 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4861,7 +4861,7 @@ mark_memory (void const *start, void const *end) On a host with 32-bit pointers and 64-bit Lisp_Objects, a Lisp_Object might be split into registers saved into non-adjacent words and P might be the low-order word's value. */ - p = (char *) ((intptr_t) p + (intptr_t) lispsym); + p = (char *) ((uintptr_t) p + (uintptr_t) lispsym); mark_maybe_pointer (p); verify (alignof (Lisp_Object) % GC_POINTER_ALIGNMENT == 0); -- cgit v1.2.3 From dc8aa15472dc5df5f903e6a3b150e2f03eeb2dd1 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Sun, 2 Aug 2020 13:26:00 +0200 Subject: Fix Tramp portability issues * lisp/net/tramp-sh.el (tramp-set-remote-path): Replace "echo -n" by "printf", it isn't portable. * test/lisp/net/tramp-tests.el (tramp-test33-environment-variables) (tramp-test33-environment-variables-and-port-numbers): Do not use "echo -n", it isn't portable. (tramp--test-utf8): Filter out not displayable characters. --- lisp/net/tramp-sh.el | 2 +- test/lisp/net/tramp-tests.el | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 9f37207def1..f9f0cbcc023 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -4079,7 +4079,7 @@ variable PATH." chunk (substring command 0 chunksize) command (substring command chunksize)) (tramp-send-command vec (format - "echo -n %s >>%s" + "printf \"%%b\" \"$*\" %s >>%s" (tramp-shell-quote-argument chunk) (tramp-shell-quote-argument tmpfile)))) (tramp-send-command vec (format ". %s" tmpfile)) diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index 19da15acafa..ac24fcf280a 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -4933,16 +4933,16 @@ INPUT, if non-nil, is a string sent to the process." (setenv "INSIDE_EMACS") (should (string-equal - (format "%s,tramp:%s" emacs-version tramp-version) - (funcall this-shell-command-to-string "echo -n ${INSIDE_EMACS:-bla}"))) + (format "%s,tramp:%s\n" emacs-version tramp-version) + (funcall this-shell-command-to-string "echo ${INSIDE_EMACS:-bla}"))) (let ((process-environment (cons (format "INSIDE_EMACS=%s,foo" emacs-version) process-environment))) (should (string-equal - (format "%s,foo,tramp:%s" emacs-version tramp-version) + (format "%s,foo,tramp:%s\n" emacs-version tramp-version) (funcall - this-shell-command-to-string "echo -n ${INSIDE_EMACS:-bla}")))) + this-shell-command-to-string "echo ${INSIDE_EMACS:-bla}")))) ;; Set a value. (let ((process-environment @@ -4952,7 +4952,7 @@ INPUT, if non-nil, is a string sent to the process." (string-match "foo" (funcall - this-shell-command-to-string (format "echo -n ${%s:-bla}" envvar))))) + this-shell-command-to-string (format "echo ${%s:-bla}" envvar))))) ;; Set the empty value. (let ((process-environment @@ -4962,7 +4962,7 @@ INPUT, if non-nil, is a string sent to the process." (string-match "bla" (funcall - this-shell-command-to-string (format "echo -n ${%s:-bla}" envvar)))) + this-shell-command-to-string (format "echo ${%s:-bla}" envvar)))) ;; Variable is set. (should (string-match @@ -4979,15 +4979,14 @@ INPUT, if non-nil, is a string sent to the process." (string-match "foo" (funcall - this-shell-command-to-string (format "echo -n ${%s:-bla}" envvar)))) + this-shell-command-to-string (format "echo ${%s:-bla}" envvar)))) (let ((process-environment (cons envvar process-environment))) ;; Variable is unset. (should (string-match "bla" (funcall - this-shell-command-to-string - (format "echo -n ${%s:-bla}" envvar)))) + this-shell-command-to-string (format "echo ${%s:-bla}" envvar)))) ;; Variable is unset. (should-not (string-match @@ -5026,7 +5025,7 @@ INPUT, if non-nil, is a string sent to the process." (should (string-match (number-to-string port) - (shell-command-to-string (format "echo -n $%s" envvar)))))) + (shell-command-to-string (format "echo $%s" envvar)))))) ;; Cleanup. (dolist (dir '("/mock:localhost#11111:" "/mock:localhost#22222:")) @@ -6051,6 +6050,12 @@ Use the `ls' command." (not (and (or (tramp--test-gvfs-p) (tramp--test-smb-p)) (unencodable-char-position 0 (length x) file-name-coding-system nil x))) + ;; Filter out not displayable characters. + (setq x (mapconcat + (lambda (y) + (and (char-displayable-p y) (char-to-string y))) + x "")) + (not (string-empty-p x)) ;; ?\n and ?/ shouldn't be part of any file name. ?\t, ;; ?. and ?? do not work for "smb" method. (replace-regexp-in-string "[\t\n/.?]" "" x))) -- cgit v1.2.3 From 99d1a66646b7450ad0be3e4471341b50fee7bdb5 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 14:32:19 +0200 Subject: Make the "All" setting for large-newsgroup-initial in Gnus work * lisp/gnus/gnus-sum.el (gnus-articles-to-read): Use it. (gnus-summary-insert-old-articles): Ditto. * lisp/gnus/gnus.el (large-newsgroup-initial): Make the "All" setting work by using a special symbol, instead of nil which is indistinguishable from not being present (bug#38466). --- etc/NEWS | 6 ++++++ lisp/gnus/gnus-sum.el | 17 +++++++++++------ lisp/gnus/gnus.el | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index fab2d85e8da..492d01feed0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -207,6 +207,12 @@ Bookmark locations can refer to VC directory buffers. ** Gnus +--- +*** The value of "all" in the 'large-newsgroup-initial' group parameter changes. +It was previously nil, which didn't work, because nil is +indistinguishable from not being present. The new value for "all" is +the symbol 'all'. + +++ *** The name of dependent Gnus sessions has changed from "slave" to "child". The names of the commands 'gnus-slave', 'gnus-slave-no-server' and diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index c1216a0cc24..719498a0337 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -5938,7 +5938,9 @@ If SELECT-ARTICLES, only select those articles from GROUP." (initial (gnus-parameter-large-newsgroup-initial gnus-newsgroup-name)) (default (if only-read-p - (or initial gnus-large-newsgroup) + (if (eq initial 'all) + nil + (or initial gnus-large-newsgroup)) number)) (input (read-string @@ -13165,10 +13167,13 @@ If ALL is a number, fetch this number of articles." (t (when (and (numberp gnus-large-newsgroup) (> len gnus-large-newsgroup)) - (let* ((cursor-in-echo-area nil) - (initial (gnus-parameter-large-newsgroup-initial - gnus-newsgroup-name)) - (input + (let ((cursor-in-echo-area nil) + (initial (gnus-parameter-large-newsgroup-initial + gnus-newsgroup-name)) + input) + (when (eq initial 'all) + (setq initial len)) + (setq input (read-string (format "How many articles from %s (%s %d): " @@ -13177,7 +13182,7 @@ If ALL is a number, fetch this number of articles." len) nil nil (and initial - (number-to-string initial))))) + (number-to-string initial)))) (unless (string-match "^[ \t]*$" input) (setq all (string-to-number input)) (if (< all len) diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index 69f2bb27993..68e2ce772c2 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -1591,7 +1591,7 @@ posting an article." "Alist of group regexps and its initial input of the number of articles." :variable-group gnus-group-parameter :parameter-type '(choice :tag "Initial Input for Large Newsgroup" - (const :tag "All" nil) + (const :tag "All" 'all) (integer)) :parameter-document "\ -- cgit v1.2.3 From 418ea25bbf306c448516ea79c9eaf25b904e62e4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 2 Aug 2020 17:05:00 +0300 Subject: Fix last change in alloc.c. * src/alloc.c (mark_maybe_object) [WIDE_EMACS_INT]: Avoid compiler warning about 'overflow' being unused. --- src/alloc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/alloc.c b/src/alloc.c index be293cca54a..da11426075b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4649,6 +4649,8 @@ mark_maybe_object (Lisp_Object obj) significant bits as tag bits, the tag is small enough to not overflow either. */ eassert (!overflow); +#else + (void) overflow; #endif void *po = (char *) ((intptr_t) (char *) XLP (obj) + offset); -- cgit v1.2.3 From e6eb554b95327549992c3684910921db9181ffb6 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 16:01:47 +0200 Subject: Don’t generate duplicate symbols for secondary CL methods (Bug#42671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/emacs-lisp/edebug.el (edebug-match-cl-generic-method-qualifier): Add matcher for ‘cl-defmethod’ qualifier. * lisp/emacs-lisp/cl-generic.el (cl-defmethod): Use it. * test/lisp/emacs-lisp/edebug-tests.el (edebug-cl-defmethod-qualifier): New unit test. --- lisp/emacs-lisp/cl-generic.el | 5 ++--- lisp/emacs-lisp/edebug.el | 12 ++++++++++++ test/lisp/emacs-lisp/edebug-tests.el | 22 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 4e8423eb5b1..c67681b0960 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -432,9 +432,8 @@ The set of acceptable TYPEs (also called \"specializers\") is defined (&define ; this means we are defining something [&or name ("setf" name :name setf)] ;; ^^ This is the methods symbol - [ &rest atom ] ; Multiple qualifiers are allowed. - ; Like in CLOS spec, we support - ; any non-list values. + [ &rest cl-generic-method-qualifier ] + ;; Multiple qualifiers are allowed. cl-generic-method-args ; arguments lambda-doc ; documentation string def-body))) ; part to be debugged diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index a565e8f6dcb..7627829e034 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -1731,6 +1731,8 @@ contains a circular object." ;; Less frequently used: ;; (function . edebug-match-function) (lambda-expr . edebug-match-lambda-expr) + (cl-generic-method-qualifier + . edebug-match-cl-generic-method-qualifier) (cl-generic-method-args . edebug-match-cl-generic-method-args) (cl-macrolet-expr . edebug-match-cl-macrolet-expr) (cl-macrolet-name . edebug-match-cl-macrolet-name) @@ -2035,6 +2037,16 @@ contains a circular object." spec)) nil) +(defun edebug-match-cl-generic-method-qualifier (cursor) + "Match a QUALIFIER for `cl-defmethod' at CURSOR." + (let ((args (edebug-top-element-required cursor "Expected qualifier"))) + ;; Like in CLOS spec, we support any non-list values. + (unless (atom args) (edebug-no-match cursor "Atom expected")) + ;; Append the arguments to `edebug-def-name' (Bug#42671). + (setq edebug-def-name (intern (format "%s %s" edebug-def-name args))) + (edebug-move-cursor cursor) + (list args))) + (defun edebug-match-cl-generic-method-args (cursor) (let ((args (edebug-top-element-required cursor "Expected arguments"))) (if (not (consp args)) diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el index 41811c9dc07..89b1f293743 100644 --- a/test/lisp/emacs-lisp/edebug-tests.el +++ b/test/lisp/emacs-lisp/edebug-tests.el @@ -938,5 +938,27 @@ test and possibly others should be updated." "g" (should (equal edebug-tests-@-result '(0 1)))))) +(ert-deftest edebug-cl-defmethod-qualifier () + "Check that secondary `cl-defmethod' forms don't stomp over +primary ones (Bug#42671)." + (with-temp-buffer + (let* ((edebug-all-defs t) + (edebug-initial-mode 'Go-nonstop) + (defined-symbols ()) + (edebug-new-definition-function + (lambda (def-name) + (push def-name defined-symbols) + (edebug-new-definition def-name)))) + (dolist (form '((cl-defmethod edebug-cl-defmethod-qualifier ((_ number))) + (cl-defmethod edebug-cl-defmethod-qualifier + :around ((_ number))))) + (print form (current-buffer))) + (eval-buffer) + (should + (equal + defined-symbols + (list (intern "edebug-cl-defmethod-qualifier :around ((_ number))") + (intern "edebug-cl-defmethod-qualifier ((_ number))"))))))) + (provide 'edebug-tests) ;;; edebug-tests.el ends here -- cgit v1.2.3 From 2e9d1f4d44036e7c0605cfeac091368e013e3ed9 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 16:05:44 +0200 Subject: * src/alloc.c (mark_maybe_object): Avoid signed integer overflow --- src/alloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/alloc.c b/src/alloc.c index da11426075b..5220ef84783 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4652,7 +4652,8 @@ mark_maybe_object (Lisp_Object obj) #else (void) overflow; #endif - void *po = (char *) ((intptr_t) (char *) XLP (obj) + offset); + INT_ADD_WRAPV (offset, (intptr_t) (char *) XLP (obj), &offset); + void *po = (char *) offset; /* If the pointer is in the dump image and the dump has a record of the object starting at the place where the pointer points, we -- cgit v1.2.3 From a07ec21bf24b8d1dc41808f997dd0fb78cad3870 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 2 Aug 2020 18:27:33 +0300 Subject: Re-enable scroll-margin when cursor-motion optimization is disabled * src/xdisp.c (try_window): Fix logic of disabling margins when cursor is close to BOB or EOB. Account for header-line, if any, when computing the scroll margin in pixels. (Bug#42653) --- src/xdisp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index fc17014c029..a8cd4dc853c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -19223,18 +19223,20 @@ try_window (Lisp_Object window, struct text_pos pos, int flags) && !MINI_WINDOW_P (w)) { int this_scroll_margin = window_scroll_margin (w, MARGIN_IN_PIXELS); + if (window_wants_header_line (w)) + this_scroll_margin += CURRENT_HEADER_LINE_HEIGHT (w); start_display (&it, w, pos); if ((w->cursor.y >= 0 /* not vscrolled */ && w->cursor.y < this_scroll_margin - && CHARPOS (pos) > BEGV - && it_charpos < ZV) + && CHARPOS (pos) > BEGV) /* rms: considering make_cursor_line_fully_visible_p here seems to give wrong results. We don't want to recenter when the last line is partly visible, we want to allow that case to be handled in the usual way. */ - || w->cursor.y > (it.last_visible_y - partial_line_height (&it) - - this_scroll_margin - 1)) + || (it_charpos < ZV /* if EOB is visible, disable bottom margin */ + && w->cursor.y > (it.last_visible_y - partial_line_height (&it) + - this_scroll_margin - 1))) { w->cursor.vpos = -1; clear_glyph_matrix (w->desired_matrix); -- cgit v1.2.3 From d8ab98843edccd233c2354d3c518c7a4b18023bd Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 17:17:00 +0200 Subject: Avoid duplicate Edebug symbols when using ‘cl-flet’ (Bug#41989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/emacs-lisp/edebug.el (edebug-match-:unique): Add a new ‘:unique’ specifier to generate unique names. * lisp/emacs-lisp/cl-macs.el (cl-flet): Use it. This requires inlining the ‘cl-defun’ specification. * test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-cl-flet): New unit test. * doc/lispref/edebug.texi (Specification List): Document new ‘:unique’ construct. --- doc/lispref/edebug.texi | 10 +++++++++ etc/NEWS | 4 ++++ lisp/emacs-lisp/cl-macs.el | 7 ++++++- lisp/emacs-lisp/edebug.el | 12 +++++++++++ test/lisp/emacs-lisp/edebug-tests.el | 40 ++++++++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/doc/lispref/edebug.texi b/doc/lispref/edebug.texi index d879f3dcadf..6404e068dae 100644 --- a/doc/lispref/edebug.texi +++ b/doc/lispref/edebug.texi @@ -1438,6 +1438,16 @@ name component for the definition. You can use this to add a unique, static component to the name of the definition. It may be used more than once. +@item :unique +This construct is like @code{:name}, but generates unique names. It +does not match an argument. The element following @code{:unique} +should be a string; it is used as the prefix for an additional name +component for the definition. You can use this to add a unique, +dynamic component to the name of the definition. This is useful for +macros that can define the same symbol multiple times in different +scopes, such as @code{cl-flet}; @ref{Function Bindings,,,cl}. It may +be used more than once. + @item arg The argument, a symbol, is the name of an argument of the defining form. However, lambda-list keywords (symbols starting with @samp{&}) diff --git a/etc/NEWS b/etc/NEWS index 492d01feed0..aeba96e3811 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -260,6 +260,10 @@ To revert to the previous behaviour, unconditionally aborts the current edebug instrumentation with the supplied error message. +*** Edebug specification lists can use the new keyword ':unique', +which appends a unique suffix to the Edebug name of the current +definition. + +++ ** ElDoc diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index 6c1426ce5cb..c38019d4a73 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -2016,7 +2016,12 @@ info node `(cl) Function Bindings' for details. \(fn ((FUNC ARGLIST BODY...) ...) FORM...)" (declare (indent 1) - (debug ((&rest [&or (&define name function-form) (cl-defun)]) + (debug ((&rest [&or (&define name :unique "cl-flet@" function-form) + (&define name :unique "cl-flet@" + cl-lambda-list + cl-declarations-or-string + [&optional ("interactive" interactive)] + def-body)]) cl-declarations body))) (let ((binds ()) (newenv macroexpand-all-environment)) (dolist (binding bindings) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index 7627829e034..cef97e0fb45 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -1725,6 +1725,7 @@ contains a circular object." (&define . edebug-match-&define) (name . edebug-match-name) (:name . edebug-match-colon-name) + (:unique . edebug-match-:unique) (arg . edebug-match-arg) (def-body . edebug-match-def-body) (def-form . edebug-match-def-form) @@ -2037,6 +2038,17 @@ contains a circular object." spec)) nil) +(defun edebug-match-:unique (_cursor spec) + "Match a `:unique PREFIX' specifier. +SPEC is the symbol name prefix for `gensym'." + (let ((suffix (gensym spec))) + (setq edebug-def-name + (if edebug-def-name + ;; Construct a new name by appending to previous name. + (intern (format "%s@%s" edebug-def-name suffix)) + suffix))) + nil) + (defun edebug-match-cl-generic-method-qualifier (cursor) "Match a QUALIFIER for `cl-defmethod' at CURSOR." (let ((args (edebug-top-element-required cursor "Expected qualifier"))) diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el index 89b1f293743..be9f1503795 100644 --- a/test/lisp/emacs-lisp/edebug-tests.el +++ b/test/lisp/emacs-lisp/edebug-tests.el @@ -960,5 +960,45 @@ primary ones (Bug#42671)." (list (intern "edebug-cl-defmethod-qualifier :around ((_ number))") (intern "edebug-cl-defmethod-qualifier ((_ number))"))))))) +(ert-deftest edebug-tests-cl-flet () + "Check what Edebug can instrument `cl-flet' forms without name +clashes (Bug#41853)." + (with-temp-buffer + (dolist (form '((defun edebug-tests-cl-flet-1 () + (cl-flet ((inner () 0)) (message "Hi")) + (cl-flet ((inner () 1)) (inner))) + (defun edebug-tests-cl-flet-2 () + (cl-flet ((inner () 2)) (inner))))) + (print form (current-buffer))) + (let* ((edebug-all-defs t) + (edebug-initial-mode 'Go-nonstop) + (instrumented-names ()) + (edebug-new-definition-function + (lambda (name) + (when (memq name instrumented-names) + (error "Duplicate definition of `%s'" name)) + (push name instrumented-names) + (edebug-new-definition name))) + ;; Make generated symbols reproducible. + (gensym-counter 10000)) + (eval-buffer) + (should (equal (reverse instrumented-names) + ;; The outer definitions come after the inner + ;; ones because their body ends later. + ;; FIXME: There are twice as many inner + ;; definitions as expected due to Bug#41988. + ;; Once that bug is fixed, remove the duplicates. + ;; FIXME: We'd rather have names such as + ;; `edebug-tests-cl-flet-1@inner@cl-flet@10000', + ;; but that requires further changes to Edebug. + '(inner@cl-flet@10000 + inner@cl-flet@10001 + inner@cl-flet@10002 + inner@cl-flet@10003 + edebug-tests-cl-flet-1 + inner@cl-flet@10004 + inner@cl-flet@10005 + edebug-tests-cl-flet-2)))))) + (provide 'edebug-tests) ;;; edebug-tests.el ends here -- cgit v1.2.3 From 0a65e060207def5d31fb7d96b8d3bb1441fd13c9 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 18:04:18 +0200 Subject: ; * test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-cl-flet): Fix typo. --- test/lisp/emacs-lisp/edebug-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el index be9f1503795..1be68f6ff46 100644 --- a/test/lisp/emacs-lisp/edebug-tests.el +++ b/test/lisp/emacs-lisp/edebug-tests.el @@ -961,7 +961,7 @@ primary ones (Bug#42671)." (intern "edebug-cl-defmethod-qualifier ((_ number))"))))))) (ert-deftest edebug-tests-cl-flet () - "Check what Edebug can instrument `cl-flet' forms without name + "Check that Edebug can instrument `cl-flet' forms without name clashes (Bug#41853)." (with-temp-buffer (dolist (form '((defun edebug-tests-cl-flet-1 () -- cgit v1.2.3 From 3e0c3479b24e1978d30bbcc00faac7bdd6bdd170 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 18:05:36 +0200 Subject: Add a workaround for Bug#42672 * lisp/emacs-lisp/cl-generic.el (cl-defgeneric): Work around Bug#42672 by uniquifying inline method names. * test/lisp/emacs-lisp/cl-generic-tests.el (cl-defgeneric/edebug/method): New regression test. --- lisp/emacs-lisp/cl-generic.el | 11 +++++++++- test/lisp/emacs-lisp/cl-generic-tests.el | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index c67681b0960..640eb6b06d4 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -211,7 +211,16 @@ DEFAULT-BODY, if present, is used as the body of a default method. [&rest [&or ("declare" &rest sexp) (":argument-precedence-order" &rest sexp) - (&define ":method" [&rest atom] + (&define ":method" + ;; FIXME: The `:unique' + ;; construct works around + ;; Bug#42672. We'd rather want + ;; names like those generated by + ;; `cl-defmethod', but that + ;; requires larger changes to + ;; Edebug. + :unique "cl-generic-:method@" + [&rest atom] cl-generic-method-args lambda-doc def-body)]] def-body))) diff --git a/test/lisp/emacs-lisp/cl-generic-tests.el b/test/lisp/emacs-lisp/cl-generic-tests.el index 51c9884ddc8..fc39e349523 100644 --- a/test/lisp/emacs-lisp/cl-generic-tests.el +++ b/test/lisp/emacs-lisp/cl-generic-tests.el @@ -24,6 +24,7 @@ ;;; Code: (require 'cl-generic) +(require 'edebug) ;; Don't indirectly require `cl-lib' at run-time. (eval-when-compile (require 'ert)) @@ -249,5 +250,40 @@ (should-not (cl--generic-method-files 'cl-generic-tests--undefined-generic)) (should-not (cl--generic-method-files 'cl-generic-tests--generic-without-methods))) +(ert-deftest cl-defgeneric/edebug/method () + "Check that `:method' forms in `cl-defgeneric' create unique +Edebug symbols (Bug#42672)." + (with-temp-buffer + (dolist (form '((cl-defgeneric cl-defgeneric/edebug/method/1 (_) + (:method ((_ number)) 1) + (:method ((_ string)) 2)) + (cl-defgeneric cl-defgeneric/edebug/method/2 (_) + (:method ((_ number)) 3)))) + (print form (current-buffer))) + (let* ((edebug-all-defs t) + (edebug-initial-mode 'Go-nonstop) + (instrumented-names ()) + (edebug-new-definition-function + (lambda (name) + (when (memq name instrumented-names) + (error "Duplicate definition of `%s'" name)) + (push name instrumented-names) + (edebug-new-definition name))) + ;; Make generated symbols reproducible. + (gensym-counter 10000)) + (eval-buffer) + (should (equal (reverse instrumented-names) + ;; The generic function definitions come after + ;; the method definitions because their body ends + ;; later. + ;; FIXME: We'd rather have names such as + ;; `cl-defgeneric/edebug/method/1 ((_ number))', + ;; but that requires further changes to Edebug. + (list (intern "cl-generic-:method@10000 ((_ number))") + (intern "cl-generic-:method@10001 ((_ string))") + 'cl-defgeneric/edebug/method/1 + (intern "cl-generic-:method@10002 ((_ number))") + 'cl-defgeneric/edebug/method/2)))))) + (provide 'cl-generic-tests) ;;; cl-generic-tests.el ends here -- cgit v1.2.3 From 94b6eb807c8991897796fd18ccd414c7d9b9ad3b Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 19:03:07 +0200 Subject: Document that :width/:height in XBM images are peculiar * doc/lispref/display.texi (XBM Images): Note the peculiarities of :width/:height in XBM images (bug#39735). --- doc/lispref/display.texi | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index 25eabd6c3fc..d3adb62c1bd 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -5572,6 +5572,15 @@ The value, @var{width}, specifies the width of the image, in pixels. @item :height @var{height} The value, @var{height}, specifies the height of the image, in pixels. +Note that @code{:width} and @code{:height} can only be used if passing +in data that doesn't specify the width and height (e.g., a string or a +vector containing the bits of the image). @acronym{XBM} files usually +specify this themselves, and it's an error to use these two properties +on these files. Also note that @code{:width} and @code{:height} are +used by most other image formats to specify what the displayed image +is supposed to be, which usually means performing some sort of +scaling. This isn't supported for @acronym{XBM} images. + @item :stride @var{stride} The number of bool vector entries stored for each row; the smallest multiple of 8 greater than or equal to @var{width}. -- cgit v1.2.3 From 72c5f71cd45c860299950cd058d8e13b87375741 Mon Sep 17 00:00:00 2001 From: Grégory Mounié Date: Sun, 2 Aug 2020 15:56:33 +0200 Subject: Avoid segfaults if XIM is set but not xim_styles Emacs segfaults at the X11 initialization if XIM is set and xim_styles is NULL. This patch avoids the crash. * src/xfns.c: Check also if FRAME_X_XIM_STYLES(f) is NULL. (Bug#42676) (Bug#42673) (Bug#42677) Copyright-paperwork-exempt: yes --- src/xfns.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xfns.c b/src/xfns.c index b89fac1cdac..f9a00a6dafd 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -2658,7 +2658,7 @@ create_frame_xic (struct frame *f) goto out; xim = FRAME_X_XIM (f); - if (!xim) + if (!xim || ! FRAME_X_XIM_STYLES(f)) goto out; /* Determine XIC style. */ -- cgit v1.2.3 From 2ad38b4745bf0203ca9ca0fe2eeb376943d384c6 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Sun, 2 Aug 2020 19:44:30 +0200 Subject: If gnus-visual is nil, don't fontify patches and the like * doc/misc/emacs-mime.texi (Display Customization): Document it. * lisp/gnus/gnus-art.el (gnus-mime-display-single): Bind it. * lisp/gnus/mm-view.el (mm-inline-font-lock): New variable (bug#38421). (mm-display-inline-fontify): Use it. --- doc/misc/emacs-mime.texi | 7 +++++++ etc/NEWS | 6 ++++++ lisp/gnus/gnus-art.el | 1 + lisp/gnus/mm-view.el | 10 ++++++++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi index 2f38dcd4956..974cc10458d 100644 --- a/doc/misc/emacs-mime.texi +++ b/doc/misc/emacs-mime.texi @@ -472,6 +472,13 @@ the case if you save it to disk and launch it in a different way to launch any external programs, set this variable to @code{nil} or @code{ask}. +@item mm-inline-font-lock +@vindex mm-inline-font-lock +If non-@code{nil}, inlined parts that support font locking (for +instance, patches or code snippets) will be font-locked. This may be +overriden by callers that have their own ways of enabling/inhibiting +font locking. + @end table @node Files and Directories diff --git a/etc/NEWS b/etc/NEWS index aeba96e3811..7221c9cf9e6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -231,6 +231,12 @@ was sent. To restore the original behavior of dating a message from when it is first saved or delayed, add the symbol 'Date' back to this user option. ++++ +*** New variable 'mm-inline-font-lock'. +This variable is supposed to be bound by callers to determine whether +inline MIME parts (that support it) are supposed to be font-locked or +not. + ** Help +++ diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index cb20d7102bd..d33539bc7f7 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -6018,6 +6018,7 @@ If nil, don't show those extra buttons." (defun gnus-mime-display-single (handle) (let ((type (mm-handle-media-type handle)) (ignored gnus-ignored-mime-types) + (mm-inline-font-lock (gnus-visual-p 'article-highlight 'highlight)) (not-attachment t) display text) (catch 'ignored diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el index 828ac633dc5..bd5960c18b2 100644 --- a/lisp/gnus/mm-view.el +++ b/lisp/gnus/mm-view.el @@ -59,11 +59,16 @@ "The attributes of renderer types for text/html.") (defcustom mm-fill-flowed t - "If non-nil a format=flowed article will be displayed flowed." + "If non-nil, format=flowed articles will be displayed flowed." :type 'boolean :version "22.1" :group 'mime-display) +;; Not a defcustom, since it's usually overridden by the callers of +;; the mm functions. +(defvar mm-inline-font-lock t + "If non-nil, do font locking of inline media types that support it.") + (defcustom mm-inline-large-images-proportion 0.9 "Maximum proportion large images can occupy in the buffer. This is only used if `mm-inline-large-images' is set to @@ -502,7 +507,8 @@ If MODE is not set, try to find mode automatically." (delay-mode-hooks (set-auto-mode)) (setq mode major-mode))) ;; Do not fontify if the guess mode is fundamental. - (unless (eq major-mode 'fundamental-mode) + (when (and (not (eq major-mode 'fundamental-mode)) + mm-inline-font-lock) (font-lock-ensure)))) (setq text (buffer-string)) (when (eq mode 'diff-mode) -- cgit v1.2.3 From a325584281c4d8552917fcb97caed449acb7ee65 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Sun, 2 Aug 2020 22:07:27 +0200 Subject: Improve Edebug symbols for inlined secondary methods (Bug#42671) * lisp/emacs-lisp/cl-generic.el (cl-defgeneric): Include qualifiers in Edebug symbol name. * test/lisp/emacs-lisp/cl-generic-tests.el (cl-defgeneric/edebug/method): Adapt unit test. --- lisp/emacs-lisp/cl-generic.el | 2 +- test/lisp/emacs-lisp/cl-generic-tests.el | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 640eb6b06d4..02da07daaf4 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -220,7 +220,7 @@ DEFAULT-BODY, if present, is used as the body of a default method. ;; requires larger changes to ;; Edebug. :unique "cl-generic-:method@" - [&rest atom] + [&rest cl-generic-method-qualifier] cl-generic-method-args lambda-doc def-body)]] def-body))) diff --git a/test/lisp/emacs-lisp/cl-generic-tests.el b/test/lisp/emacs-lisp/cl-generic-tests.el index fc39e349523..5aa58782f36 100644 --- a/test/lisp/emacs-lisp/cl-generic-tests.el +++ b/test/lisp/emacs-lisp/cl-generic-tests.el @@ -256,7 +256,8 @@ Edebug symbols (Bug#42672)." (with-temp-buffer (dolist (form '((cl-defgeneric cl-defgeneric/edebug/method/1 (_) (:method ((_ number)) 1) - (:method ((_ string)) 2)) + (:method ((_ string)) 2) + (:method :around ((_ number)) 3)) (cl-defgeneric cl-defgeneric/edebug/method/2 (_) (:method ((_ number)) 3)))) (print form (current-buffer))) @@ -272,18 +273,19 @@ Edebug symbols (Bug#42672)." ;; Make generated symbols reproducible. (gensym-counter 10000)) (eval-buffer) - (should (equal (reverse instrumented-names) - ;; The generic function definitions come after - ;; the method definitions because their body ends - ;; later. - ;; FIXME: We'd rather have names such as - ;; `cl-defgeneric/edebug/method/1 ((_ number))', - ;; but that requires further changes to Edebug. - (list (intern "cl-generic-:method@10000 ((_ number))") - (intern "cl-generic-:method@10001 ((_ string))") - 'cl-defgeneric/edebug/method/1 - (intern "cl-generic-:method@10002 ((_ number))") - 'cl-defgeneric/edebug/method/2)))))) + (should (equal + (reverse instrumented-names) + ;; The generic function definitions come after the + ;; method definitions because their body ends later. + ;; FIXME: We'd rather have names such as + ;; `cl-defgeneric/edebug/method/1 ((_ number))', but + ;; that requires further changes to Edebug. + (list (intern "cl-generic-:method@10000 ((_ number))") + (intern "cl-generic-:method@10001 ((_ string))") + (intern "cl-generic-:method@10002 :around ((_ number))") + 'cl-defgeneric/edebug/method/1 + (intern "cl-generic-:method@10003 ((_ number))") + 'cl-defgeneric/edebug/method/2)))))) (provide 'cl-generic-tests) ;;; cl-generic-tests.el ends here -- cgit v1.2.3 From f921feceb8cd8c52f281447c984d0b67a738a33c Mon Sep 17 00:00:00 2001 From: Derek Zhou Date: Mon, 3 Aug 2020 07:56:22 +0200 Subject: Fix problem where TLS connections would sometimes hang * src/process.c (wait_reading_process_output): Before the select, check every interesting gnutls stream for available data in the buffer. If some of them hit, and either there is no wait_proc or the wait_proc is one of the gnutls streams with new data, set the select timeout to 0 after the select, and merge the gnutls buffer status into the select returns (bug#40665). This fixes a problem where TLS connections would sometimes hang. --- src/process.c | 97 ++++++++++++++++++++++++++++------------------------------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/src/process.c b/src/process.c index 6e5bcf307ab..15634e4a8b0 100644 --- a/src/process.c +++ b/src/process.c @@ -5491,6 +5491,10 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, } else { +#ifdef HAVE_GNUTLS + int tls_nfds; + fd_set tls_available; +#endif /* Set the timeout for adaptive read buffering if any process has non-zero read_output_skip and non-zero read_output_delay, and we are not reading output for a @@ -5560,7 +5564,36 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, } #endif -/* Non-macOS HAVE_GLIB builds call thread_select in xgselect.c. */ +#ifdef HAVE_GNUTLS + /* GnuTLS buffers data internally. We need to check if some + data is available in the buffers manually before the select. + And if so, we need to skip the select which could block. */ + FD_ZERO (&tls_available); + tls_nfds = 0; + for (channel = 0; channel < FD_SETSIZE; ++channel) + if (! NILP (chan_process[channel]) + && FD_ISSET (channel, &Available)) + { + struct Lisp_Process *p = XPROCESS (chan_process[channel]); + if (p + && p->gnutls_p && p->gnutls_state + && emacs_gnutls_record_check_pending (p->gnutls_state) > 0) + { + tls_nfds++; + eassert (p->infd == channel); + FD_SET (p->infd, &tls_available); + } + } + /* If wait_proc is somebody else, we have to wait in select + as usual. Otherwise, clobber the timeout. */ + if (tls_nfds > 0 + && (!wait_proc || + (wait_proc->infd >= 0 + && FD_ISSET (wait_proc->infd, &tls_available)))) + timeout = make_timespec (0, 0); +#endif + + /* Non-macOS HAVE_GLIB builds call thread_select in xgselect.c. */ #if defined HAVE_GLIB && !defined HAVE_NS nfds = xg_select (max_desc + 1, &Available, (check_write ? &Writeok : 0), @@ -5578,59 +5611,21 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd, #endif /* !HAVE_GLIB */ #ifdef HAVE_GNUTLS - /* GnuTLS buffers data internally. In lowat mode it leaves - some data in the TCP buffers so that select works, but - with custom pull/push functions we need to check if some - data is available in the buffers manually. */ - if (nfds == 0) + /* Merge tls_available into Available. */ + if (tls_nfds > 0) { - fd_set tls_available; - int set = 0; - - FD_ZERO (&tls_available); - if (! wait_proc) + if (nfds == 0 || (nfds < 0 && errno == EINTR)) { - /* We're not waiting on a specific process, so loop - through all the channels and check for data. - This is a workaround needed for some versions of - the gnutls library -- 2.12.14 has been confirmed - to need it. */ - for (channel = 0; channel < FD_SETSIZE; ++channel) - if (! NILP (chan_process[channel])) - { - struct Lisp_Process *p = - XPROCESS (chan_process[channel]); - if (p && p->gnutls_p && p->gnutls_state - && ((emacs_gnutls_record_check_pending - (p->gnutls_state)) - > 0)) - { - nfds++; - eassert (p->infd == channel); - FD_SET (p->infd, &tls_available); - set++; - } - } - } - else - { - /* Check this specific channel. */ - if (wait_proc->gnutls_p /* Check for valid process. */ - && wait_proc->gnutls_state - /* Do we have pending data? */ - && ((emacs_gnutls_record_check_pending - (wait_proc->gnutls_state)) - > 0)) - { - nfds = 1; - eassert (0 <= wait_proc->infd); - /* Set to Available. */ - FD_SET (wait_proc->infd, &tls_available); - set++; - } + /* Fast path, just copy. */ + nfds = tls_nfds; + Available = tls_available; } - if (set) - Available = tls_available; + else if (nfds > 0) + /* Slow path, merge one by one. Note: nfds does not need + to be accurate, just positive is enough. */ + for (channel = 0; channel < FD_SETSIZE; ++channel) + if (FD_ISSET(channel, &tls_available)) + FD_SET(channel, &Available); } #endif } -- cgit v1.2.3 From 26b9a1da63bab8c8ee00a484df46db6ed57e2317 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 3 Aug 2020 08:18:39 +0200 Subject: Adjust error message in image-mode * lisp/image-mode.el (image-mode): Even when `image-user-external-converter' is on, we may get `unknown-image-type' (bug#39994). Adjust the error message in that case. --- lisp/image-mode.el | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lisp/image-mode.el b/lisp/image-mode.el index 1bb213c2489..129529542ae 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -614,21 +614,23 @@ Key bindings: (if (not (image-get-display-property)) (progn (when (condition-case err - (progn - (image-toggle-display-image) - t) - (unknown-image-type - (image-mode-as-text) - (funcall - (if (called-interactively-p 'any) 'error 'message) - "Unknown image type; consider switching `image-use-external-converter' on") - nil) - (error - (image-mode-as-text) - (funcall - (if (called-interactively-p 'any) 'error 'message) - "Cannot display image: %s" (cdr err)) - nil)) + (progn + (image-toggle-display-image) + t) + (unknown-image-type + (image-mode-as-text) + (funcall + (if (called-interactively-p 'any) 'error 'message) + (if image-use-external-converter + "Unknown image type" + "Unknown image type; consider switching `image-use-external-converter' on")) + nil) + (error + (image-mode-as-text) + (funcall + (if (called-interactively-p 'any) 'error 'message) + "Cannot display image: %s" (cdr err)) + nil)) ;; If attempt to display the image fails. (if (not (image-get-display-property)) (error "Invalid image")) -- cgit v1.2.3 From 79527cd56e9e3f8b5b1630fe18b92f7ea95e87fd Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 3 Aug 2020 09:00:53 +0200 Subject: Fix problem with viewing .webp files from .zip buffers * lisp/image-mode.el (image-toggle-display-image): Make it possible to view images (via external formatters, like webp) from zip files (and other archive modes) (bug#39994). --- lisp/image-mode.el | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lisp/image-mode.el b/lisp/image-mode.el index 129529542ae..c417be43da5 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -818,13 +818,21 @@ was inserted." (- (nth 2 edges) (nth 0 edges)))) (max-height (when edges (- (nth 3 edges) (nth 1 edges)))) - (type (if (image--imagemagick-wanted-p filename) - 'imagemagick - (image-type file-or-data nil data-p))) (inhibit-read-only t) (buffer-undo-list t) (modified (buffer-modified-p)) - props image) + props image type) + + ;; If the data in the current buffer isn't from an existing file, + ;; but we have a file name (this happens when visiting images from + ;; a zip file, for instance), provide a type hint based on the + ;; suffix. + (when (and data-p filename) + (setq data-p (intern (format "image/%s" + (file-name-extension filename))))) + (setq type (if (image--imagemagick-wanted-p filename) + 'imagemagick + (image-type file-or-data nil data-p))) ;; Get the rotation data from the file, if any. (when (zerop image-transform-rotation) ; don't reset modified value @@ -841,10 +849,13 @@ was inserted." ;; :scale 1: If we do not set this, create-image will apply ;; default scaling based on font size. (setq image (if (not edges) - (create-image file-or-data type data-p :scale 1) + (create-image file-or-data type data-p :scale 1 + :format (and filename data-p)) (create-image file-or-data type data-p :scale 1 :max-width max-width - :max-height max-height))) + :max-height max-height + ;; Type hint. + :format (and filename data-p)))) ;; Discard any stale image data before looking it up again. (image-flush image) -- cgit v1.2.3 From e1f09607e02eb507b229285ed48b85a3c6a50259 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 3 Aug 2020 09:14:52 +0200 Subject: Make `n'/`p' in image-mode also find externally converted images * lisp/image-file.el (image-file-name-regexp): Use it to make `n'/`p' in image mode work (bug#39994). * lisp/image/image-converter.el (image-converter-file-name-extensions): New variable to keep track of all suffixes. (image-convert-p): Update. (image-converter--find-converter): Set. --- lisp/image-file.el | 12 ++++++++---- lisp/image/image-converter.el | 14 ++++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lisp/image-file.el b/lisp/image-file.el index 89cd75d50dd..22366c89e6a 100644 --- a/lisp/image-file.el +++ b/lisp/image-file.el @@ -32,6 +32,7 @@ ;;; Code: (require 'image) +(require 'image-converter) ;;;###autoload @@ -80,10 +81,13 @@ the variable is set using \\[customize]." (let ((exts-regexp (and image-file-name-extensions (concat "\\." - (regexp-opt (nconc (mapcar #'upcase - image-file-name-extensions) - image-file-name-extensions) - t) + (regexp-opt + (append (mapcar #'upcase image-file-name-extensions) + image-file-name-extensions + (mapcar #'upcase + image-converter-file-name-extensions) + image-converter-file-name-extensions) + t) "\\'")))) (mapconcat 'identity diff --git a/lisp/image/image-converter.el b/lisp/image/image-converter.el index b694052f5b9..ee1dc845fb5 100644 --- a/lisp/image/image-converter.el +++ b/lisp/image/image-converter.el @@ -42,6 +42,9 @@ installed on the system." (defvar image-converter-regexp nil "A regexp that matches the file name suffixes that can be converted.") +(defvar image-converter-file-name-extensions nil + "A list of file name suffixes that can be converted.") + (defvar image-converter--converters '((graphicsmagick :command ("gm" "convert") :probe ("-list" "format")) (ffmpeg :command "ffmpeg" :probe "-decoders") @@ -58,9 +61,11 @@ is a string, it should be a MIME format string like (unless image-converter (image-converter--find-converter)) ;; When image-converter was customized - (if (and image-converter (not image-converter-regexp)) - (when-let ((formats (image-converter--probe image-converter))) - (setq image-converter-regexp (concat "\\." (regexp-opt formats) "\\'")))) + (when (and image-converter (not image-converter-regexp)) + (when-let ((formats (image-converter--probe image-converter))) + (setq image-converter-regexp + (concat "\\." (regexp-opt formats) "\\'")) + (setq image-converter-file-name-extensions formats))) (and image-converter (or (and (not data-p) (string-match image-converter-regexp source)) @@ -183,7 +188,8 @@ data is returned as a string." (dolist (elem image-converter--converters) (when-let ((formats (image-converter--probe (car elem)))) (setq image-converter (car elem) - image-converter-regexp (concat "\\." (regexp-opt formats) "\\'")) + image-converter-regexp (concat "\\." (regexp-opt formats) "\\'") + image-converter-file-name-extensions formats) (throw 'done image-converter))))) (cl-defmethod image-converter--convert ((type (eql graphicsmagick)) source -- cgit v1.2.3 From 83bc4ad369b3c31abafb7f939711da1ba13416ba Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Sun, 15 Dec 2019 02:00:05 +1300 Subject: ; * so-long.el: Documentation and spelling Reverting certain changes from commits b0f20651e3 and d1a791f8ed. Please refer to the comments on spelling at the end of the library. M-x ispell-buffer should find no misspellings in the documentation. See also test/lisp/so-long-tests/spelling-tests.el (The current spelling will persist while so-long.el is maintained in its own Savannah repository, to avoid unnecessary conflicts between the two versions. If in the future it is maintained solely in the Emacs repository, changing the spelling would become an option.) Note that "mitigations" (plural) is intentional -- this library identifies a collection of different performance mitigations, multiple of which will typically be in effect together. --- lisp/so-long.el | 66 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/lisp/so-long.el b/lisp/so-long.el index dcf7e62ca74..68614ca0023 100644 --- a/lisp/so-long.el +++ b/lisp/so-long.el @@ -38,7 +38,7 @@ ;; compacted into the smallest file size possible, which often entails removing ;; newlines should they not be strictly necessary). This can result in lines ;; which are many thousands of characters long, and most programming modes -;; simply aren't optimized (remotely) for this scenario, so performance can +;; simply aren't optimised (remotely) for this scenario, so performance can ;; suffer significantly. ;; ;; When such files are detected, the command `so-long' is automatically called, @@ -69,7 +69,7 @@ ;; the long lines. In such circumstances you may find that `longlines-mode' is ;; the most helpful facility. ;; -;; Note also that the mitigation is automatically triggered when visiting a +;; Note also that the mitigations are automatically triggered when visiting a ;; file. The library does not automatically detect if long lines are inserted ;; into an existing buffer (although the `so-long' command can be invoked ;; manually in such situations). @@ -90,7 +90,7 @@ ;; * Overview of modes and commands ;; -------------------------------- ;; - `global-so-long-mode' - A global minor mode which enables the automated -;; behavior, causing the user's preferred action to be invoked whenever a +;; behaviour, causing the user's preferred action to be invoked whenever a ;; newly-visited file contains excessively long lines. ;; - `so-long-mode' - A major mode, and the default action. ;; - `so-long-minor-mode' - A minor mode version of the major mode, and an @@ -111,7 +111,7 @@ ;; ;; On rare occasions you may choose to manually invoke the `so-long' command, ;; which invokes your preferred `so-long-action' (exactly as the automatic -;; behavior would do if it had detected long lines). You might use this if a +;; behaviour would do if it had detected long lines). You might use this if a ;; problematic file did not meet your configured criteria, and you wished to ;; trigger the performance improvements manually. ;; @@ -120,7 +120,7 @@ ;; available to `so-long' but, like any other mode, they can be invoked directly ;; if you have a need to do that (see also "Other ways of using so-long" below). ;; -;; If the behavior ever triggers when you did not want it to, you can use the +;; If the behaviour ever triggers when you did not want it to, you can use the ;; `so-long-revert' command to restore the buffer to its original state. ;; * Basic configuration @@ -199,7 +199,7 @@ ;; ;; Note that `so-long-minor-modes' is not useful for other global minor modes ;; (as distinguished from globalized minor modes), but in some cases it will be -;; possible to inhibit or otherwise counter-act the behavior of a global mode +;; possible to inhibit or otherwise counter-act the behaviour of a global mode ;; by overriding variables, or by employing hooks (see below). You would need ;; to inspect the code for a given global mode (on a case by case basis) to ;; determine whether it's possible to inhibit it for a single buffer -- and if @@ -211,7 +211,7 @@ ;; If `so-long-action' is set to either `so-long-mode' or `so-long-minor-mode', ;; the buffer-local value for each variable in the list is set to the associated ;; value in the alist. Use this to enforce values which will improve -;; performance or otherwise avoid undesirable behaviors. If `so-long-revert' +;; performance or otherwise avoid undesirable behaviours. If `so-long-revert' ;; is called, then the original values are restored. ;; * Hooks @@ -325,7 +325,7 @@ ;; meaning you would need to add to `safe-local-variable-values' in order to ;; avoid being queried about them. ;; -;; Finally, the `so-long-predicate' user option enables the automated behavior +;; Finally, the `so-long-predicate' user option enables the automated behaviour ;; to be determined by a custom function, if greater control is needed. ;; * Implementation notes @@ -342,7 +342,7 @@ ;; * Caveats ;; --------- -;; The variables affecting the automated behavior of this library (such as +;; The variables affecting the automated behaviour of this library (such as ;; `so-long-action') can be used as file- or dir-local values in Emacs 26+, but ;; not in previous versions of Emacs. This is on account of improvements made ;; to `normal-mode' in 26.1, which altered the execution order with respect to @@ -386,7 +386,7 @@ ;; - Added sgml-mode and nxml-mode to `so-long-target-modes'. ;; 0.7.4 - Refactored the handling of `whitespace-mode'. ;; 0.7.3 - Added customize group `so-long' with user options. -;; - Added `so-long-original-values' to generalize the storage and +;; - Added `so-long-original-values' to generalise the storage and ;; restoration of values from the original mode upon `so-long-revert'. ;; - Added `so-long-revert-hook'. ;; 0.7.2 - Remember the original major mode even with M-x `so-long-mode'. @@ -399,7 +399,7 @@ ;; 0.6 - Added `so-long-minor-modes' and `so-long-hook'. ;; 0.5 - Renamed library to "so-long.el". ;; - Added explicit `so-long-enable' command to activate our advice. -;; 0.4 - Amended/documented behavior with file-local 'mode' variables. +;; 0.4 - Amended/documented behaviour with file-local 'mode' variables. ;; 0.3 - Defer to a file-local 'mode' variable. ;; 0.2 - Initial release to EmacsWiki. ;; 0.1 - Experimental. @@ -421,7 +421,7 @@ Has no effect if `global-so-long-mode' is not enabled.") (defvar-local so-long--active nil ; internal use - "Non-nil when `so-long' mitigation is in effect.") + "Non-nil when `so-long' mitigations are in effect.") (defvar so-long--set-auto-mode nil ; internal use "Non-nil while `set-auto-mode' is executing.") @@ -500,7 +500,7 @@ files would prevent Emacs from handling them correctly." (defcustom so-long-invisible-buffer-function #'so-long-deferred "Function called in place of `so-long' when the buffer is not displayed. -This affects the behavior of `global-so-long-mode'. +This affects the behaviour of `global-so-long-mode'. We treat invisible buffers differently from displayed buffers because, in cases where a library is using a buffer for behind-the-scenes processing, @@ -548,7 +548,7 @@ Defaults to `so-long-detected-long-line-p'." (defun so-long--action-type () "Generate a :type for `so-long-action' based on `so-long-action-alist'." ;; :type seemingly cannot be a form to be evaluated on demand, so we - ;; endeavor to keep it up-to-date with `so-long-action-alist' by + ;; endeavour to keep it up-to-date with `so-long-action-alist' by ;; calling this from `so-long--action-alist-setter'. `(radio ,@(mapcar (lambda (x) (list 'const :tag (cadr x) (car x))) (assq-delete-all nil so-long-action-alist)) @@ -609,7 +609,7 @@ will be automatically processed; but custom actions can also do these things. The value `longlines-mode' causes that minor mode to be enabled. See longlines.el for more details. -Each action likewise determines the behavior of `so-long-revert'. +Each action likewise determines the behaviour of `so-long-revert'. If the value is nil, or not defined in `so-long-action-alist', then no action will be taken." @@ -740,7 +740,7 @@ was established." ) ;; It's not clear to me whether all of these would be problematic, but they ;; seemed like reasonable targets. Some are certainly excessive in smaller - ;; buffers of minified code, but we should be aiming to maximize performance + ;; buffers of minified code, but we should be aiming to maximise performance ;; by default, so that Emacs is as responsive as we can manage in even very ;; large buffers of minified code. "List of buffer-local minor modes to explicitly disable. @@ -756,7 +756,7 @@ By default this happens if `so-long-action' is set to either `so-long-mode' or `so-long-minor-mode'. If `so-long-revert' is subsequently invoked, then the disabled modes are re-enabled by calling them with the numeric argument 1. -`so-long-hook' can be used where more custom behavior is desired. +`so-long-hook' can be used where more custom behaviour is desired. Please submit bug reports to recommend additional modes for this list, whether they are in Emacs core, GNU ELPA, or elsewhere." @@ -781,7 +781,7 @@ If `so-long-revert' is subsequently invoked, then the variables are restored to their original states. The combination of `line-move-visual' (enabled) and `truncate-lines' (disabled) -is important for maximizing responsiveness when moving vertically within an +is important for maximising responsiveness when moving vertically within an extremely long line, as otherwise the full length of the line may need to be scanned to find the next position." :type '(alist :key-type (variable :tag "Variable") @@ -822,18 +822,18 @@ If nil, no mode line indicator will be displayed." (defface so-long-mode-line-active '((t :inherit mode-line-emphasis)) - "Face for `so-long-mode-line-info' when mitigation is active." + "Face for `so-long-mode-line-info' when mitigations are active." :package-version '(so-long . "1.0")) (defface so-long-mode-line-inactive '((t :inherit mode-line-inactive)) - "Face for `so-long-mode-line-info' when mitigation has been reverted." + "Face for `so-long-mode-line-info' when mitigations have been reverted." :package-version '(so-long . "1.0")) ;; Modes that go slowly and line lengths excessive ;; Font-lock performance becoming oppressive ;; All of my CPU tied up with strings -;; These are a few of my least-favorite things +;; These are a few of my least-favourite things (defvar-local so-long-original-values nil "Alist holding the buffer's original `major-mode' value, and other data. @@ -983,7 +983,7 @@ Displayed as part of `mode-line-misc-info'. `so-long-mode-line-label' defines the text to be displayed (if any). -Face `so-long-mode-line-active' is used while mitigation is active, and +Face `so-long-mode-line-active' is used while mitigations are active, and `so-long-mode-line-inactive' is used if `so-long-revert' is called. Not displayed when `so-long-mode' is enabled, as the major mode construct @@ -1129,7 +1129,7 @@ This minor mode is a standard `so-long-action' option." (if so-long-minor-mode ;; We are enabling the mode. (progn ;; Housekeeping. `so-long-minor-mode' might be invoked directly rather - ;; than via `so-long', so replicate the necessary behaviors. The minor + ;; than via `so-long', so replicate the necessary behaviours. The minor ;; mode also cares about whether `so-long' was already active, as we do ;; not want to remember values which were potentially overridden already. (unless (or so-long--calling so-long--active) @@ -1201,9 +1201,9 @@ values), despite potential performance issues, type \\[so-long-revert]. Use \\[so-long-commentary] for more information. -Use \\[so-long-customize] to configure the behavior." +Use \\[so-long-customize] to configure the behaviour." ;; Housekeeping. `so-long-mode' might be invoked directly rather than via - ;; `so-long', so replicate the necessary behaviors. We could use this same + ;; `so-long', so replicate the necessary behaviours. We could use this same ;; test in `so-long-after-change-major-mode' to run `so-long-hook', but that's ;; not so obviously the right thing to do, so I've omitted it for now. (unless so-long--calling @@ -1249,7 +1249,7 @@ Use \\[so-long-customize] to configure the behavior." This advice acts before `so-long-mode', with the previous mode still active." (unless (derived-mode-p 'so-long-mode) ;; Housekeeping. `so-long-mode' might be invoked directly rather than - ;; via `so-long', so replicate the necessary behaviors. + ;; via `so-long', so replicate the necessary behaviours. (unless so-long--calling (so-long-remember-all :reset)) ;; Remember the original major mode, regardless. @@ -1334,7 +1334,7 @@ This is the `so-long-revert-function' for `so-long-mode'." ;; Emacs 26+ has already called `hack-local-variables' (during ;; `run-mode-hooks'; provided there was a `buffer-file-name'), but for older ;; versions we need to call it here. In Emacs 26+ the revised 'HANDLE-MODE' - ;; argument is set to `no-mode' (being the non-nil-and-non-t behavior), + ;; argument is set to `no-mode' (being the non-nil-and-non-t behaviour), ;; which we mimic here by binding `so-long--hack-local-variables-no-mode', ;; in order to prevent a local 'mode' variable from clobbering the major ;; mode we have just called. @@ -1371,7 +1371,7 @@ because we do not want to downgrade the major mode in that scenario." ;; Act only if `so-long-mode' would be enabled by the current action. (when (and (symbolp (so-long-function)) (provided-mode-derived-p (so-long-function) 'so-long-mode)) - ;; Downgrade from `so-long-mode' to the `so-long-minor-mode' behavior. + ;; Downgrade from `so-long-mode' to the `so-long-minor-mode' behaviour. (setq so-long-function 'turn-on-so-long-minor-mode so-long-revert-function 'turn-off-so-long-minor-mode)))) @@ -1391,7 +1391,7 @@ and cannot be conveniently intercepted, so we are forced to replicate it here. This special-case code will ultimately be removed from Emacs, as it exists to deal with a deprecated feature; but until then we need to replicate it in order -to inhibit our own behavior in the presence of a header comment `mode' +to inhibit our own behaviour in the presence of a header comment `mode' declaration. If a file-local mode is detected in the header comment, then we call the @@ -1526,7 +1526,7 @@ by testing the value against `major-mode'; but as we may have changed the major mode to `so-long-mode' by this point, that protection is insufficient and so we need to perform our own test. -We likewise need to support an equivalent of the `no-mode' behavior in 26.1+ +We likewise need to support an equivalent of the `no-mode' behaviour in 26.1+ to ensure that `so-long-mode-revert' will not restore a file-local mode again after it has already reverted to the original mode. @@ -1659,7 +1659,7 @@ Equivalent to calling (global-so-long-mode 0)" ;;;###autoload (define-minor-mode global-so-long-mode - "Toggle automated performance mitigation for files with long lines. + "Toggle automated performance mitigations for files with long lines. Many Emacs modes struggle with buffers which contain excessively long lines, and may consequently cause unacceptable performance issues. @@ -1673,7 +1673,7 @@ When such files are detected by `so-long-predicate', we invoke the selected Use \\[so-long-commentary] for more information. -Use \\[so-long-customize] to configure the behavior." +Use \\[so-long-customize] to configure the behaviour." :global t :group 'so-long (if global-so-long-mode @@ -1862,7 +1862,7 @@ If it appears in `%s', you should remove it." ; LocalWords: noerror selectable mapc sgml nxml hl flydiff defs arg Phil Sainty ; LocalWords: defadvice nadvice whitespace ie bos eos eobp origmode un Un setq ; LocalWords: docstring auf Wiedersehen longlines alist autoload Refactored Inc -; LocalWords: MERCHANTABILITY RET REGEXP VAR ELPA WS EmacsWiki eval +; LocalWords: MERCHANTABILITY RET REGEXP VAR ELPA WS mitigations EmacsWiki eval ; LocalWords: rx filename filenames ;; So long, farewell, auf Wiedersehen, goodbye -- cgit v1.2.3 From 19f8f36f11cf5ae62a7b92dc1496c72db4d377b3 Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Sun, 8 Dec 2019 23:35:48 +1300 Subject: ; * lisp/so-long.el (so-long-variable-overrides): Improve doc --- lisp/so-long.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lisp/so-long.el b/lisp/so-long.el index 68614ca0023..b3596bdab7b 100644 --- a/lisp/so-long.el +++ b/lisp/so-long.el @@ -783,7 +783,18 @@ to their original states. The combination of `line-move-visual' (enabled) and `truncate-lines' (disabled) is important for maximising responsiveness when moving vertically within an extremely long line, as otherwise the full length of the line may need to be -scanned to find the next position." +scanned to find the next position. + +Bidirectional text display -- especially handling the large quantities of +nested parentheses which are liable to occur in minified programming code -- +can be very expensive for extremely long lines, and so this support is disabled +by default (insofar as is supported; in particular `bidi-inhibit-bpa' is not +available in Emacs versions < 27). For more information refer to info node +`(emacs) Bidirectional Editing' and info node `(elisp) Bidirectional Display'. + +Buffers are made read-only by default to prevent potentially-slow editing from +occurring inadvertantly, as buffers with excessively long lines are likely not +intended to be edited manually." :type '(alist :key-type (variable :tag "Variable") :value-type (sexp :tag "Value")) :options '((bidi-inhibit-bpa boolean) @@ -1863,7 +1874,7 @@ If it appears in `%s', you should remove it." ; LocalWords: defadvice nadvice whitespace ie bos eos eobp origmode un Un setq ; LocalWords: docstring auf Wiedersehen longlines alist autoload Refactored Inc ; LocalWords: MERCHANTABILITY RET REGEXP VAR ELPA WS mitigations EmacsWiki eval -; LocalWords: rx filename filenames +; LocalWords: rx filename filenames bidi bpa ;; So long, farewell, auf Wiedersehen, goodbye ;; You have to go, this code is minified -- cgit v1.2.3 From 986c12b20fa29c37f13563846fddf6edcd0b4945 Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Sat, 4 Jul 2020 01:43:08 +1200 Subject: ; * lisp/so-long.el: Byte-compilation bug fix As this `require' is not at the top-level (it is only conditionally evaluated, when loading the library over the top of an earlier version), we need `eval-and-compile' to ensure that both macros and functions from advice.el are accounted for. --- lisp/so-long.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/so-long.el b/lisp/so-long.el index b3596bdab7b..21dc7de75c8 100644 --- a/lisp/so-long.el +++ b/lisp/so-long.el @@ -1819,9 +1819,10 @@ If it appears in `%s', you should remove it." ;; Update to version 1.0 from earlier versions: (when (version< so-long-version "1.0") (remove-hook 'change-major-mode-hook 'so-long-change-major-mode) - (require 'advice) + (eval-and-compile (require 'advice)) ;; Both macros and functions. (declare-function ad-find-advice "advice") (declare-function ad-remove-advice "advice") + (declare-function ad-activate "advice") (when (ad-find-advice 'hack-local-variables 'after 'so-long--file-local-mode) (ad-remove-advice 'hack-local-variables 'after 'so-long--file-local-mode) (ad-activate 'hack-local-variables)) -- cgit v1.2.3 From 8576297b2a657d1944b7d824b30a1cb6459685c6 Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Sat, 11 Jul 2020 19:40:27 +1200 Subject: ; lisp/so-long.el: Prevent potential error if comment-use-syntax is nil * lisp/so-long.el (so-long-detected-long-line-p): Ensure that `comment-start-skip' and `comment-end-skip' are both set if `comment-use-syntax' is nil, as `comment-forward' requires them to be bound in this scenario. --- lisp/so-long.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/so-long.el b/lisp/so-long.el index 21dc7de75c8..1332ae12633 100644 --- a/lisp/so-long.el +++ b/lisp/so-long.el @@ -1047,7 +1047,9 @@ This is the default value of `so-long-predicate'." (let ((count 0) start) (save-excursion (goto-char (point-min)) - (when so-long-skip-leading-comments + (when (and so-long-skip-leading-comments + (or comment-use-syntax ;; Refer to `comment-forward'. + (and comment-start-skip comment-end-skip))) ;; Skip the shebang line, if any. This is not necessarily comment ;; syntax, so we need to treat it specially. (when (looking-at "#!") -- cgit v1.2.3 From 99275822c6c36ac308a7b77b5271066df5f38dfb Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 3 Aug 2020 17:56:40 +0300 Subject: Fix last change in 'try_window' * src/xdisp.c (try_window): Don't modify the logic when EOB is in the viewport. (Bug#42653) --- src/xdisp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index a8cd4dc853c..9f07361d48b 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -19234,9 +19234,8 @@ try_window (Lisp_Object window, struct text_pos pos, int flags) seems to give wrong results. We don't want to recenter when the last line is partly visible, we want to allow that case to be handled in the usual way. */ - || (it_charpos < ZV /* if EOB is visible, disable bottom margin */ - && w->cursor.y > (it.last_visible_y - partial_line_height (&it) - - this_scroll_margin - 1))) + || w->cursor.y > (it.last_visible_y - partial_line_height (&it) + - this_scroll_margin - 1)) { w->cursor.vpos = -1; clear_glyph_matrix (w->desired_matrix); -- cgit v1.2.3 From ca419812d35f252fca2708ffdd132c223d094c0f Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Mon, 3 Aug 2020 21:07:32 +0200 Subject: Avoid duplicate Edebug symbols when backtracking (Bug#42701) When Edebug backtracks, it nevertheless generates definitions for the non-matching branches, see Bug#41988 and Bug#42701. This should be fixed eventually (probably by deferring the definition until a branch is known to match), but for now add a band-aid to avoid these duplicate symbols, at least for anonymous forms. * lisp/emacs-lisp/edebug.el (edebug-make-enter-wrapper): Regenerate anonymous names. * test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-duplicate-symbol-backtrack): New regression test. --- lisp/emacs-lisp/edebug.el | 7 +++++++ test/lisp/emacs-lisp/edebug-tests.el | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el index cef97e0fb45..d9bbf6129c6 100644 --- a/lisp/emacs-lisp/edebug.el +++ b/lisp/emacs-lisp/edebug.el @@ -1240,6 +1240,13 @@ purpose by adding an entry to this alist, and setting ;; since it wraps the list of forms with a call to `edebug-enter'. ;; Uses the dynamically bound vars edebug-def-name and edebug-def-args. ;; Do this after parsing since that may find a name. + (when (string-match-p (rx bos "edebug-anon" (+ digit) eos) + (symbol-name edebug-old-def-name)) + ;; FIXME: Due to Bug#42701, we reset an anonymous name so that + ;; backtracking doesn't generate duplicate definitions. It would + ;; be better to not define wrappers in the case of a non-matching + ;; specification branch to begin with. + (setq edebug-old-def-name nil)) (setq edebug-def-name (or edebug-def-name edebug-old-def-name (gensym "edebug-anon"))) `(edebug-enter diff --git a/test/lisp/emacs-lisp/edebug-tests.el b/test/lisp/emacs-lisp/edebug-tests.el index 1be68f6ff46..04a7b2f5a0f 100644 --- a/test/lisp/emacs-lisp/edebug-tests.el +++ b/test/lisp/emacs-lisp/edebug-tests.el @@ -1000,5 +1000,37 @@ clashes (Bug#41853)." inner@cl-flet@10005 edebug-tests-cl-flet-2)))))) +(ert-deftest edebug-tests-duplicate-symbol-backtrack () + "Check that Edebug doesn't create duplicate symbols when +backtracking (Bug#42701)." + (with-temp-buffer + (dolist (form '((require 'subr-x) + (defun edebug-tests-duplicate-symbol-backtrack () + (if-let (x (funcall (lambda (y) 1) 2)) 3 4)))) + (print form (current-buffer))) + (let* ((edebug-all-defs t) + (edebug-initial-mode 'Go-nonstop) + (instrumented-names ()) + (edebug-new-definition-function + (lambda (name) + (when (memq name instrumented-names) + (error "Duplicate definition of `%s'" name)) + (push name instrumented-names) + (edebug-new-definition name))) + ;; Make generated symbols reproducible. + (gensym-counter 10000)) + (eval-buffer) + ;; The anonymous symbols are uninterned. Use their names so we + ;; can perform the assertion. The names should still be unique. + (should (equal (mapcar #'symbol-name (reverse instrumented-names)) + ;; The outer definition comes after the inner + ;; ones because its body ends later. + ;; FIXME: There are twice as many inner + ;; definitions as expected due to Bug#42701. + ;; Once that bug is fixed, remove the duplicates. + '("edebug-anon10000" + "edebug-anon10001" + "edebug-tests-duplicate-symbol-backtrack")))))) + (provide 'edebug-tests) ;;; edebug-tests.el ends here -- cgit v1.2.3 From a4ed198e8f3754a59cabbb03ab6bae8a49597ee0 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 3 Aug 2020 15:21:58 -0700 Subject: Simplify pointer computation in mark_maybe_object * src/alloc.c (mark_maybe_object): Use simpler way to avoid -fsanitize=undefined false alarms, by converting the word tag to intptr_t first. Omit now-unnecessary runtime overflow check. (mark_memory): Work even if UINTPTR_MAX <= INT_MAX (!). --- src/alloc.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 5220ef84783..3a02ef3f8c4 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4625,7 +4625,7 @@ mark_maybe_object (Lisp_Object obj) #endif int type_tag = XTYPE (obj); - intptr_t offset; + intptr_t pointer_word_tag = LISP_WORD_TAG (type_tag), offset, ipo; switch (type_tag) { @@ -4641,19 +4641,8 @@ mark_maybe_object (Lisp_Object obj) break; } - bool overflow - = INT_SUBTRACT_WRAPV (offset, LISP_WORD_TAG (type_tag), &offset); -#if !defined WIDE_EMACS_INT || USE_LSB_TAG - /* If we don't use wide integers, then `intptr_t' should always be - large enough to not overflow. Furthermore, when using the least - significant bits as tag bits, the tag is small enough to not - overflow either. */ - eassert (!overflow); -#else - (void) overflow; -#endif - INT_ADD_WRAPV (offset, (intptr_t) (char *) XLP (obj), &offset); - void *po = (char *) offset; + INT_ADD_WRAPV ((intptr_t) XLP (obj), offset - pointer_word_tag, &ipo); + void *po = (void *) ipo; /* If the pointer is in the dump image and the dump has a record of the object starting at the place where the pointer points, we @@ -4856,7 +4845,7 @@ mark_memory (void const *start, void const *end) for (pp = start; (void const *) pp < end; pp += GC_POINTER_ALIGNMENT) { - char *p = *(char *const *) pp; + void *p = *(void *const *) pp; mark_maybe_pointer (p); /* Unmask any struct Lisp_Symbol pointer that make_lisp_symbol @@ -4864,8 +4853,9 @@ mark_memory (void const *start, void const *end) On a host with 32-bit pointers and 64-bit Lisp_Objects, a Lisp_Object might be split into registers saved into non-adjacent words and P might be the low-order word's value. */ - p = (char *) ((uintptr_t) p + (uintptr_t) lispsym); - mark_maybe_pointer (p); + intptr_t ip; + INT_ADD_WRAPV ((intptr_t) p, (intptr_t) lispsym, &ip); + mark_maybe_pointer ((void *) ip); verify (alignof (Lisp_Object) % GC_POINTER_ALIGNMENT == 0); if (alignof (Lisp_Object) == GC_POINTER_ALIGNMENT -- cgit v1.2.3 From a1436544ff826b8c51242f4afb7c5d485c8e2e32 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 3 Aug 2020 15:21:59 -0700 Subject: Simplify use of __lsan_ignore_object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * configure.ac: Use AC_CHECK_FUNCS_ONCE for __lsan_ignore_object. * src/buffer.c, src/data.c, src/emacs-module.c, src/regex-emacs.c: * src/search.c: Use __lsan_ignore_object unconditionally, and don’t include sanitizer/lsan_interface.h. * src/lisp.h (__lsan_ignore_object): Provide a dummy in the typical case where leak sanitization is not available. --- configure.ac | 6 ++++-- src/buffer.c | 6 ------ src/data.c | 6 ------ src/emacs-module.c | 8 -------- src/lisp.h | 11 +++++++++++ src/regex-emacs.c | 6 ------ src/search.c | 6 ------ 7 files changed, 15 insertions(+), 34 deletions(-) diff --git a/configure.ac b/configure.ac index 93463e344ab..4ee4517e11c 100644 --- a/configure.ac +++ b/configure.ac @@ -4512,11 +4512,13 @@ AC_CHECK_HEADERS(valgrind/valgrind.h) AC_CHECK_MEMBERS([struct unipair.unicode], [], [], [[#include ]]) -AC_CHECK_FUNCS_ONCE([sbrk]) +AC_CHECK_FUNCS_ONCE([__lsan_ignore_object sbrk]) AC_FUNC_FORK -AC_CHECK_FUNCS(snprintf __lsan_ignore_object) +dnl AC_CHECK_FUNCS_ONCE wouldn’t be right for snprintf, which needs +dnl the current CFLAGS etc. +AC_CHECK_FUNCS(snprintf) dnl Check for glib. This differs from other library checks in that dnl Emacs need not link to glib unless some other library is already diff --git a/src/buffer.c b/src/buffer.c index e441499aeb0..241f2d43a93 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -28,10 +28,6 @@ along with GNU Emacs. If not, see . */ #include #include -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H -#include -#endif - #include #include "lisp.h" @@ -5087,9 +5083,7 @@ enlarge_buffer_text (struct buffer *b, ptrdiff_t delta) #else p = xrealloc (b->text->beg, new_nbytes); #endif -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (p); -#endif if (p == NULL) { diff --git a/src/data.c b/src/data.c index 5fff52d24c2..59d148166fe 100644 --- a/src/data.c +++ b/src/data.c @@ -23,10 +23,6 @@ along with GNU Emacs. If not, see . */ #include #include -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H -#include -#endif - #include #include #include @@ -1788,9 +1784,7 @@ make_blv (struct Lisp_Symbol *sym, bool forwarded, set_blv_defcell (blv, tem); set_blv_valcell (blv, tem); set_blv_found (blv, false); -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (blv); -#endif return blv; } diff --git a/src/emacs-module.c b/src/emacs-module.c index f57101946b3..a0bab118019 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -84,10 +84,6 @@ To add a new module function, proceed as follows: #include #include -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H -#include -#endif - #include "lisp.h" #include "bignum.h" #include "dynlib.h" @@ -1103,9 +1099,7 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0, if (module_assertions) { rt = xmalloc (sizeof *rt); -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (rt); -#endif } else rt = &rt_pub; @@ -1426,9 +1420,7 @@ initialize_environment (emacs_env *env, struct emacs_env_private *priv) if (module_assertions) { env = xmalloc (sizeof *env); -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (env); -#endif } priv->pending_non_local_exit = emacs_funcall_exit_return; diff --git a/src/lisp.h b/src/lisp.h index fdf69ab7368..22ddf3e5faf 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4789,6 +4789,17 @@ lispstpcpy (char *dest, Lisp_Object string) return dest + len; } +#if (defined HAVE___LSAN_IGNORE_OBJECT \ + && defined HAVE_SANITIZER_LSAN_INTERFACE_H) +# include +#else +/* Treat *P as a non-leak. */ +INLINE void +__lsan_ignore_object (void const *p) +{ +} +#endif + extern void xputenv (const char *); extern char *egetenv_internal (const char *, ptrdiff_t); diff --git a/src/regex-emacs.c b/src/regex-emacs.c index 1ecbc74b96c..c44cce9f787 100644 --- a/src/regex-emacs.c +++ b/src/regex-emacs.c @@ -29,10 +29,6 @@ #include -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H -#include -#endif - #include "character.h" #include "buffer.h" #include "syntax.h" @@ -1761,9 +1757,7 @@ regex_compile (re_char *pattern, ptrdiff_t size, /* Initialize the compile stack. */ compile_stack.stack = xmalloc (INIT_COMPILE_STACK_SIZE * sizeof *compile_stack.stack); -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (compile_stack.stack); -#endif compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; diff --git a/src/search.c b/src/search.c index 7b74ff91480..38c64caf7c0 100644 --- a/src/search.c +++ b/src/search.c @@ -21,10 +21,6 @@ along with GNU Emacs. If not, see . */ #include -#ifdef HAVE_SANITIZER_LSAN_INTERFACE_H -#include -#endif - #include "lisp.h" #include "character.h" #include "buffer.h" @@ -619,9 +615,7 @@ newline_cache_on_off (struct buffer *buf) if (base_buf->newline_cache == 0) { base_buf->newline_cache = new_region_cache (); -#ifdef HAVE___LSAN_IGNORE_OBJECT __lsan_ignore_object (base_buf->newline_cache); -#endif } } return base_buf->newline_cache; -- cgit v1.2.3 From fd50b3fc45d35549b842a3ac4889b10f7fcf574c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 3 Aug 2020 15:21:59 -0700 Subject: Ignore another memory leak * src/pdumper.c (dump_mmap_contiguous_heap): Ignore the heap control block when checking for leaks. --- src/pdumper.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index 865ceff6fff..63ee0fcb7f6 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -4680,15 +4680,15 @@ dump_mmap_contiguous_heap (struct dump_memory_map *maps, int nr_maps, Beware: the simple patch 2019-03-11T15:20:54Z!eggert@cs.ucla.edu is worse, as it sometimes frees this storage twice. */ struct dump_memory_map_heap_control_block *cb = calloc (1, sizeof (*cb)); - - char *mem; if (!cb) goto out; + __lsan_ignore_object (cb); + cb->refcount = 1; cb->mem = malloc (total_size); if (!cb->mem) goto out; - mem = cb->mem; + char *mem = cb->mem; for (int i = 0; i < nr_maps; ++i) { struct dump_memory_map *map = &maps[i]; -- cgit v1.2.3 From 19e76f6190c5c7b939bb15c8ab1137c5db2871c0 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 3 Aug 2020 15:21:59 -0700 Subject: Use void * for pointers in with_echo_area_buffer * src/xdisp.c (with_echo_area_buffer): Pass void * instead of ptrdiff_t, since the values are typically pointers and this ports better to (mostly-theoretical) hosts where ptrdiff_t is narrower than intptr_t. All uses changed. --- src/xdisp.c | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 9f07361d48b..4fe1c4288af 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -993,12 +993,12 @@ static void handle_line_prefix (struct it *); static void handle_stop_backwards (struct it *, ptrdiff_t); static void unwind_with_echo_area_buffer (Lisp_Object); static Lisp_Object with_echo_area_buffer_unwind_data (struct window *); -static bool current_message_1 (ptrdiff_t, Lisp_Object); -static bool truncate_message_1 (ptrdiff_t, Lisp_Object); +static bool current_message_1 (void *, Lisp_Object); +static bool truncate_message_1 (void *, Lisp_Object); static void set_message (Lisp_Object); -static bool set_message_1 (ptrdiff_t, Lisp_Object); -static bool display_echo_area_1 (ptrdiff_t, Lisp_Object); -static bool resize_mini_window_1 (ptrdiff_t, Lisp_Object); +static bool set_message_1 (void *, Lisp_Object); +static bool display_echo_area_1 (void *, Lisp_Object); +static bool resize_mini_window_1 (void *, Lisp_Object); static void unwind_redisplay (void); static void extend_face_to_end_of_line (struct it *); static intmax_t message_log_check_duplicate (ptrdiff_t, ptrdiff_t); @@ -11278,8 +11278,8 @@ ensure_echo_area_buffers (void) static bool with_echo_area_buffer (struct window *w, int which, - bool (*fn) (ptrdiff_t, Lisp_Object), - ptrdiff_t a1, Lisp_Object a2) + bool (*fn) (void *, Lisp_Object), + void *a1, Lisp_Object a2) { Lisp_Object buffer; bool this_one, the_other, clear_buffer_p, rc; @@ -11550,8 +11550,7 @@ display_echo_area (struct window *w) window_height_changed_p = with_echo_area_buffer (w, display_last_displayed_message_p, - display_echo_area_1, - (intptr_t) w, Qnil); + display_echo_area_1, w, Qnil); if (no_message_p) echo_area_buffer[i] = Qnil; @@ -11568,10 +11567,9 @@ display_echo_area (struct window *w) Value is true if height of W was changed. */ static bool -display_echo_area_1 (ptrdiff_t a1, Lisp_Object a2) +display_echo_area_1 (void *a1, Lisp_Object a2) { - intptr_t i1 = a1; - struct window *w = (struct window *) i1; + struct window *w = a1; Lisp_Object window; struct text_pos start; @@ -11612,7 +11610,7 @@ resize_echo_area_exactly (void) struct window *w = XWINDOW (echo_area_window); Lisp_Object resize_exactly = (minibuf_level == 0 ? Qt : Qnil); bool resized_p = with_echo_area_buffer (w, 0, resize_mini_window_1, - (intptr_t) w, resize_exactly); + w, resize_exactly); if (resized_p) { windows_or_buffers_changed = 42; @@ -11630,10 +11628,9 @@ resize_echo_area_exactly (void) returns. */ static bool -resize_mini_window_1 (ptrdiff_t a1, Lisp_Object exactly) +resize_mini_window_1 (void *a1, Lisp_Object exactly) { - intptr_t i1 = a1; - return resize_mini_window ((struct window *) i1, !NILP (exactly)); + return resize_mini_window (a1, !NILP (exactly)); } @@ -11769,8 +11766,7 @@ current_message (void) msg = Qnil; else { - with_echo_area_buffer (0, 0, current_message_1, - (intptr_t) &msg, Qnil); + with_echo_area_buffer (0, 0, current_message_1, &msg, Qnil); if (NILP (msg)) echo_area_buffer[0] = Qnil; } @@ -11780,10 +11776,9 @@ current_message (void) static bool -current_message_1 (ptrdiff_t a1, Lisp_Object a2) +current_message_1 (void *a1, Lisp_Object a2) { - intptr_t i1 = a1; - Lisp_Object *msg = (Lisp_Object *) i1; + Lisp_Object *msg = a1; if (Z > BEG) *msg = make_buffer_string (BEG, Z, true); @@ -11857,7 +11852,8 @@ truncate_echo_area (ptrdiff_t nchars) just an informative message; if the frame hasn't really been initialized yet, just toss it. */ if (sf->glyphs_initialized_p) - with_echo_area_buffer (0, 0, truncate_message_1, nchars, Qnil); + with_echo_area_buffer (0, 0, truncate_message_1, + (void *) (intptr_t) nchars, Qnil); } } @@ -11866,8 +11862,9 @@ truncate_echo_area (ptrdiff_t nchars) message to at most NCHARS characters. */ static bool -truncate_message_1 (ptrdiff_t nchars, Lisp_Object a2) +truncate_message_1 (void *a1, Lisp_Object a2) { + intptr_t nchars = (intptr_t) a1; if (BEG + nchars < Z) del_range (BEG + nchars, Z); if (Z == BEG) @@ -11919,7 +11916,7 @@ set_message (Lisp_Object string) This function is called with the echo area buffer being current. */ static bool -set_message_1 (ptrdiff_t a1, Lisp_Object string) +set_message_1 (void *a1, Lisp_Object string) { eassert (STRINGP (string)); -- cgit v1.2.3 From b8b25400d544b2178ddc51de05a681ed11d581d6 Mon Sep 17 00:00:00 2001 From: Theodor Thornhill Date: Tue, 4 Aug 2020 12:12:46 +0200 Subject: Add sass @use rule to css-mode * lisp/textmodes/css-mode.el (scss-at-ids): Add 'use' to scss-at-ids for autocompletion (bug#42700). --- lisp/textmodes/css-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el index 2cd99787e8a..cc5879880c8 100644 --- a/lisp/textmodes/css-mode.el +++ b/lisp/textmodes/css-mode.el @@ -67,7 +67,7 @@ (defconst scss-at-ids '("at-root" "content" "debug" "each" "else" "else if" "error" "extend" - "for" "function" "if" "import" "include" "mixin" "return" "warn" + "for" "function" "if" "import" "include" "mixin" "return" "use" "warn" "while") "Additional identifiers that appear in the form @foo in SCSS.") -- cgit v1.2.3 From 83b1db043b44a8efb091ced873eab686e671c5ac Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 4 Aug 2020 14:19:51 +0200 Subject: Add Tramp support of direct asynchronous process invocation * doc/misc/tramp.texi (Predefined connection information): Add "direct-async-process". (Remote processes): New subsection "Improving performance of asynchronous remote processes". * lisp/net/tramp-adb.el (tramp-methods) : Add `tramp-login-program' and `tramp-login-args'. (tramp-adb-handle-make-process): Use `tramp-handle-make-process'. (tramp-adb-maybe-open-connection): Add "set +o vi +o emacs" command. * lisp/net/tramp-sh.el (tramp-sh-handle-make-process): Use `tramp-handle-make-process'. (tramp-sh-file-name-handler-p, tramp-multi-hop-p): New defuns. (tramp-compute-multi-hops): Use `tramp-multi-hop-p'. * lisp/net/tramp.el (tramp-dissect-file-name, tramp-dissect-hop-name): Use `tramp-multi-hop-p'. (tramp-handle-insert-file-contents, tramp-local-host-p): Use `tramp-sh-file-name-handler-p'. (tramp-handle-make-process): New defun. * test/README: Add another example how to use SELECTOR. * test/lisp/net/tramp-tests.el (tramp-test03-file-name-method-rules): Adapt test. (tramp--test-sh-p): Use `tramp-sh-file-name-handler-p'. --- doc/misc/tramp.texi | 83 +++++++- lisp/net/tramp-adb.el | 323 +++++++++++++++--------------- lisp/net/tramp-sh.el | 462 ++++++++++++++++++++++--------------------- lisp/net/tramp.el | 165 ++++++++++++++-- test/README | 5 + test/lisp/net/tramp-tests.el | 18 +- 6 files changed, 651 insertions(+), 405 deletions(-) diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index b4195111d4a..91b1e996f45 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -2053,6 +2053,13 @@ The temporary directory on the remote host. If not specified, the default value is @t{"/data/local/tmp"} for the @option{adb} method, @t{"/C$/Temp"} for the @option{smb} method, and @t{"/tmp"} otherwise. +@item @t{"direct-async-process"} + +When this property is non-@code{nil}, an alternative, more performant +implementation of @code{make-process} and +@code{start-file-process} is applied. @ref{Improving performance of +asynchronous remote processes} for a discussion of constraints. + @item @t{"posix"} Connections using the @option{smb} method check, whether the remote @@ -2458,10 +2465,9 @@ overwrite as follows: @lisp @group -(add-to-list - 'tramp-connection-properties - `(,(regexp-quote "192.168.0.1") - "remote-copy-args" (("-l") ("%r")))) +(add-to-list 'tramp-connection-properties + `(,(regexp-quote "192.168.0.1") + "remote-copy-args" (("-l") ("%r")))) @end group @end lisp @@ -3527,6 +3533,70 @@ To open @command{powershell} as a remote shell, use this: @end lisp +@anchor{Improving performance of asynchronous remote processes} +@subsection Improving performance of asynchronous remote processes +@cindex Asynchronous remote processes +@findex make-process +@findex start-file-process + +@value{tramp}'s implementation of @code{make-process} and +@code{start-file-process} requires a serious overhead for +initialization, every process invocation. This is needed for handling +interactive dialogues when connecting the remote host (like providing +a password), and initial environment setup. + +Sometimes, this is not needed. Instead of starting a remote shell and +running the command afterwards, it is sufficient to run the command +directly. @value{tramp} supports this by an alternative +implementation of @code{make-process} and @code{start-file-process}. +This is triggered by the connection property +@t{"direct-async-process"}, @xref{Predefined connection information}, +which must be set to a non-@code{nil} value. Example: + +@lisp +@group +(add-to-list 'tramp-connection-properties + (list (regexp-quote "@trampfn{ssh,user@@host,}") + "direct-async-process" t)) +@end group +@end lisp + +However, this approach has different limitations: + +@itemize +@item +It works only for connection methods defined in @file{tramp-sh.el} and +@file{tramp-adb.el}. + +@item +It does not support multi-hop methods. + +@item +It does not support interactive user authentication, like password +handling. + +@item +It does not support a separated error stream. + +@item +It cannot be killed via @code{interrupt-process}. + +@item +It does not report the remote terminal name via @code{process-tty-name}. + +@item +It does not use @code{tramp-remote-path} and +@code{tramp-remote-process-environment}. + +@item +It does not set environment variable @env{INSIDE_EMACS}. +@end itemize + +In order to gain even more performance, it is recommended to bind +@code{tramp-verbose} to 0 when running @code{make-process} or +@code{start-file-process}. + + @node Cleanup remote connections @section Cleanup remote connections @cindex cleanup @@ -4555,9 +4625,8 @@ Abbreviation list expansion can be used to reduce typing long file names: @lisp @group -(add-to-list - 'directory-abbrev-alist - '("^/xy" . "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}")) +(add-to-list 'directory-abbrev-alist + '("^/xy" . "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}")) @end group @end lisp diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el index 7e5af6910bb..88f5c2928e3 100644 --- a/lisp/net/tramp-adb.el +++ b/lisp/net/tramp-adb.el @@ -96,8 +96,10 @@ It is used for TCP/IP devices." (tramp--with-startup (add-to-list 'tramp-methods `(,tramp-adb-method - (tramp-tmpdir "/data/local/tmp") - (tramp-default-port 5555))) + (tramp-login-program ,tramp-adb-program) + (tramp-login-args (("shell"))) + (tramp-tmpdir "/data/local/tmp") + (tramp-default-port 5555))) (add-to-list 'tramp-default-host-alist `(,tramp-adb-method nil "")) @@ -885,158 +887,163 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored." ;; The complete STDERR buffer is available only when the process has ;; terminated. (defun tramp-adb-handle-make-process (&rest args) - "Like `make-process' for Tramp files." - (when args - (with-parsed-tramp-file-name (expand-file-name default-directory) nil - (let ((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 (plist-get args :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 (null buffer) (bufferp buffer) (stringp buffer)) - (signal 'wrong-type-argument (list #'stringp 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))) - (unless (or (null connection-type) (memq connection-type '(pipe pty))) - (signal 'wrong-type-argument (list #'symbolp connection-type))) - (unless (or (null filter) (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) (stringp stderr)) - (signal 'wrong-type-argument (list #'stringp stderr))) - (when (and (stringp stderr) (tramp-tramp-file-p stderr) - (not (tramp-equal-remote default-directory stderr))) - (signal 'file-error (list "Wrong stderr" 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))) - ;; STDERR can also be a file name. - (tmpstderr - (and stderr - (if (and (stringp stderr) (tramp-tramp-file-p stderr)) - (tramp-unquote-file-local-name stderr) - (tramp-make-tramp-temp-file v)))) - (remote-tmpstderr - (and tmpstderr (tramp-make-tramp-file-name v tmpstderr))) - (program (car command)) - (args (cdr command)) - (command - (format "cd %s && exec %s %s" - (tramp-shell-quote-argument localname) - (if tmpstderr (format "2>'%s'" tmpstderr) "") - (mapconcat #'tramp-shell-quote-argument - (cons program args) " "))) - (tramp-process-connection-type - (or (null program) tramp-process-connection-type)) - (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer))) - (name1 name) - (i 0)) - - (while (get-process name1) - ;; NAME must be unique as process name. - (setq i (1+ i) - name1 (format "%s<%d>" name i))) - (setq name name1) - ;; Set the new process properties. - (tramp-set-connection-property v "process-name" name) - (tramp-set-connection-property v "process-buffer" buffer) - - (with-current-buffer (tramp-get-connection-buffer v) - (unwind-protect - ;; We catch this event. Otherwise, `make-process' - ;; could be called on the local host. - (save-excursion - (save-restriction - ;; Activate narrowing in order to save BUFFER - ;; contents. Clear also the modification time; - ;; otherwise we might be interrupted by - ;; `verify-visited-file-modtime'. - (let ((buffer-undo-list t) - (inhibit-read-only t)) - (clear-visited-file-modtime) - (narrow-to-region (point-max) (point-max)) - ;; We call `tramp-adb-maybe-open-connection', in - ;; order to cleanup the prompt afterwards. - (tramp-adb-maybe-open-connection v) - (delete-region (point-min) (point-max)) - ;; Send the command. - (let* ((p (tramp-get-connection-process v))) - (tramp-adb-send-command v command nil t) ; nooutput - ;; Set sentinel and filter. - (when sentinel - (set-process-sentinel p sentinel)) - (when filter - (set-process-filter p filter)) - ;; Set query flag and process marker for this - ;; process. We ignore errors, because the - ;; process could have finished already. - (ignore-errors - (set-process-query-on-exit-flag p (null noquery)) - (set-marker (process-mark p) (point))) - ;; We must flush them here already; otherwise - ;; `rename-file', `delete-file' or - ;; `insert-file-contents' will fail. - (tramp-flush-connection-property v "process-name") - (tramp-flush-connection-property v "process-buffer") - ;; Copy tmpstderr file. - (when (and (stringp stderr) - (not (tramp-tramp-file-p stderr))) - (add-function - :after (process-sentinel p) - (lambda (_proc _msg) - (rename-file remote-tmpstderr stderr)))) - ;; Read initial output. Remove the first line, - ;; which is the command echo. - (while - (progn - (goto-char (point-min)) - (not (re-search-forward "[\n]" nil t))) - (tramp-accept-process-output p 0)) - (delete-region (point-min) (point)) - ;; Provide error buffer. This shows only - ;; initial error messages; messages arriving - ;; later on will be inserted when the process - ;; is deleted. The temporary file will exist - ;; until the process is deleted. - (when (bufferp stderr) - (with-current-buffer stderr - (insert-file-contents-literally - remote-tmpstderr 'visit)) - ;; Delete tmpstderr file. - (add-function - :after (process-sentinel p) - (lambda (_proc _msg) - (with-current-buffer stderr - (insert-file-contents-literally - remote-tmpstderr 'visit nil nil 'replace)) - (delete-file remote-tmpstderr)))) - ;; Return process. - p)))) - - ;; Save exit. - (if (string-match-p tramp-temp-buffer-name (buffer-name)) - (ignore-errors - (set-process-buffer (tramp-get-connection-process v) nil) - (kill-buffer (current-buffer))) - (set-buffer-modified-p bmp)) - (tramp-flush-connection-property v "process-name") - (tramp-flush-connection-property v "process-buffer")))))))) + "Like `make-process' for Tramp files. +If connection property \"direct-async-process\" is non-nil, an +alternative implementation will be used." + (if (tramp-get-connection-property + (tramp-dissect-file-name default-directory) "direct-async-process" nil) + (apply #'tramp-handle-make-process args) + (when args + (with-parsed-tramp-file-name (expand-file-name default-directory) nil + (let ((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 (plist-get args :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 (null buffer) (bufferp buffer) (stringp buffer)) + (signal 'wrong-type-argument (list #'stringp 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))) + (unless (or (null connection-type) (memq connection-type '(pipe pty))) + (signal 'wrong-type-argument (list #'symbolp connection-type))) + (unless (or (null filter) (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) (stringp stderr)) + (signal 'wrong-type-argument (list #'stringp stderr))) + (when (and (stringp stderr) (tramp-tramp-file-p stderr) + (not (tramp-equal-remote default-directory stderr))) + (signal 'file-error (list "Wrong stderr" 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))) + ;; STDERR can also be a file name. + (tmpstderr + (and stderr + (if (and (stringp stderr) (tramp-tramp-file-p stderr)) + (tramp-unquote-file-local-name stderr) + (tramp-make-tramp-temp-file v)))) + (remote-tmpstderr + (and tmpstderr (tramp-make-tramp-file-name v tmpstderr))) + (program (car command)) + (args (cdr command)) + (command + (format "cd %s && exec %s %s" + (tramp-shell-quote-argument localname) + (if tmpstderr (format "2>'%s'" tmpstderr) "") + (mapconcat #'tramp-shell-quote-argument + (cons program args) " "))) + (tramp-process-connection-type + (or (null program) tramp-process-connection-type)) + (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer))) + (name1 name) + (i 0)) + + (while (get-process name1) + ;; NAME must be unique as process name. + (setq i (1+ i) + name1 (format "%s<%d>" name i))) + (setq name name1) + ;; Set the new process properties. + (tramp-set-connection-property v "process-name" name) + (tramp-set-connection-property v "process-buffer" buffer) + + (with-current-buffer (tramp-get-connection-buffer v) + (unwind-protect + ;; We catch this event. Otherwise, `make-process' + ;; could be called on the local host. + (save-excursion + (save-restriction + ;; Activate narrowing in order to save BUFFER + ;; contents. Clear also the modification time; + ;; otherwise we might be interrupted by + ;; `verify-visited-file-modtime'. + (let ((buffer-undo-list t) + (inhibit-read-only t)) + (clear-visited-file-modtime) + (narrow-to-region (point-max) (point-max)) + ;; We call `tramp-adb-maybe-open-connection', + ;; in order to cleanup the prompt afterwards. + (tramp-adb-maybe-open-connection v) + (delete-region (point-min) (point-max)) + ;; Send the command. + (let* ((p (tramp-get-connection-process v))) + (tramp-adb-send-command v command nil t) ; nooutput + ;; Set sentinel and filter. + (when sentinel + (set-process-sentinel p sentinel)) + (when filter + (set-process-filter p filter)) + ;; Set query flag and process marker for + ;; this process. We ignore errors, because + ;; the process could have finished already. + (ignore-errors + (set-process-query-on-exit-flag p (null noquery)) + (set-marker (process-mark p) (point))) + ;; We must flush them here already; + ;; otherwise `rename-file', `delete-file' or + ;; `insert-file-contents' will fail. + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer") + ;; Copy tmpstderr file. + (when (and (stringp stderr) + (not (tramp-tramp-file-p stderr))) + (add-function + :after (process-sentinel p) + (lambda (_proc _msg) + (rename-file remote-tmpstderr stderr)))) + ;; Read initial output. Remove the first + ;; line, which is the command echo. + (while + (progn + (goto-char (point-min)) + (not (re-search-forward "[\n]" nil t))) + (tramp-accept-process-output p 0)) + (delete-region (point-min) (point)) + ;; Provide error buffer. This shows only + ;; initial error messages; messages arriving + ;; later on will be inserted when the + ;; process is deleted. The temporary file + ;; will exist until the process is deleted. + (when (bufferp stderr) + (with-current-buffer stderr + (insert-file-contents-literally + remote-tmpstderr 'visit)) + ;; Delete tmpstderr file. + (add-function + :after (process-sentinel p) + (lambda (_proc _msg) + (with-current-buffer stderr + (insert-file-contents-literally + remote-tmpstderr 'visit nil nil 'replace)) + (delete-file remote-tmpstderr)))) + ;; Return process. + p)))) + + ;; Save exit. + (if (string-match-p tramp-temp-buffer-name (buffer-name)) + (ignore-errors + (set-process-buffer (tramp-get-connection-process v) nil) + (kill-buffer (current-buffer))) + (set-buffer-modified-p bmp)) + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer"))))))))) (defun tramp-adb-handle-exec-path () "Like `exec-path' for Tramp files." @@ -1253,6 +1260,14 @@ connection if a previous connection has died for some reason." (tramp-adb-send-command vec (format "PS1=\"///\"\"%s\"\"#$\"" prompt)) + ;; 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")) + ;; Check whether the properties have been changed. If ;; yes, this is a strong indication that we must expire all ;; connection properties. We start again. diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index f9f0cbcc023..3e2eb023a33 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2787,228 +2787,233 @@ the result will be a local, non-Tramp, file name." ;; terminated. (defun tramp-sh-handle-make-process (&rest args) "Like `make-process' for Tramp files. -STDERR can also be a file name." - (when args - (with-parsed-tramp-file-name (expand-file-name default-directory) nil - (let ((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 (plist-get args :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 (null buffer) (bufferp buffer) (stringp buffer)) - (signal 'wrong-type-argument (list #'stringp 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))) - (unless (or (null connection-type) (memq connection-type '(pipe pty))) - (signal 'wrong-type-argument (list #'symbolp connection-type))) - (unless (or (null filter) (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) (stringp stderr)) - (signal 'wrong-type-argument (list #'stringp stderr))) - (when (and (stringp stderr) (tramp-tramp-file-p stderr) - (not (tramp-equal-remote default-directory stderr))) - (signal 'file-error (list "Wrong stderr" 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))) - ;; STDERR can also be a file name. - (tmpstderr - (and stderr - (if (and (stringp stderr) (tramp-tramp-file-p stderr)) - (tramp-unquote-file-local-name stderr) - (tramp-make-tramp-temp-file v)))) - (remote-tmpstderr - (and tmpstderr (tramp-make-tramp-file-name v tmpstderr))) - (program (car command)) - (args (cdr command)) - ;; When PROGRAM matches "*sh", and the first arg is - ;; "-c", it might be that the arguments exceed the - ;; command line length. Therefore, we modify the - ;; command. - (heredoc (and (stringp program) - (string-match-p "sh$" program) - (string-equal "-c" (car args)) - (= (length args) 2))) - ;; When PROGRAM is nil, we just provide a tty. - (args (if (not heredoc) args - (let ((i 250)) - (while (and (< i (length (cadr args))) - (string-match " " (cadr args) i)) - (setcdr - args - (list - (replace-match " \\\\\n" nil nil (cadr args)))) - (setq i (+ i 250)))) - (cdr args))) - ;; Use a human-friendly prompt, for example for - ;; `shell'. We discard hops, if existing, that's why - ;; we cannot use `file-remote-p'. - (prompt (format "PS1=%s %s" - (tramp-make-tramp-file-name v nil 'nohop) - tramp-initial-end-of-output)) - ;; We use as environment the difference to toplevel - ;; `process-environment'. - env uenv - (env (dolist (elt (cons prompt process-environment) env) - (or (member - elt (default-toplevel-value 'process-environment)) - (if (string-match-p "=" elt) - (setq env (append env `(,elt))) - (if (tramp-get-env-with-u-option v) - (setq env (append `("-u" ,elt) env)) - (setq uenv (cons elt uenv))))))) - (command - (when (stringp program) - (setenv-internal - env "INSIDE_EMACS" - (concat (or (getenv "INSIDE_EMACS") emacs-version) - ",tramp:" tramp-version) - 'keep) - (format "cd %s && %s exec %s %s env %s %s" - (tramp-shell-quote-argument localname) - (if uenv - (format - "unset %s &&" - (mapconcat - #'tramp-shell-quote-argument uenv " ")) - "") - (if heredoc (format "<<'%s'" tramp-end-of-heredoc) "") - (if tmpstderr (format "2>'%s'" tmpstderr) "") - (mapconcat #'tramp-shell-quote-argument env " ") - (if heredoc - (format "%s\n(\n%s\n) " name i))) - (setq name name1) - ;; Set the new process properties. - (tramp-set-connection-property v "process-name" name) - (tramp-set-connection-property v "process-buffer" buffer) - - (with-current-buffer (tramp-get-connection-buffer v) - (unwind-protect - ;; We catch this event. Otherwise, `make-process' could - ;; be called on the local host. - (save-excursion - (save-restriction - ;; Activate narrowing in order to save BUFFER - ;; contents. Clear also the modification time; - ;; otherwise we might be interrupted by - ;; `verify-visited-file-modtime'. - (let ((buffer-undo-list t) - (inhibit-read-only t) - (mark (point-max))) - (clear-visited-file-modtime) - (narrow-to-region (point-max) (point-max)) - ;; We call `tramp-maybe-open-connection', in - ;; order to cleanup the prompt afterwards. - (catch 'suppress - (tramp-maybe-open-connection v) - (setq p (tramp-get-connection-process v)) - ;; Set the pid of the remote shell. This is - ;; needed when sending signals remotely. - (let ((pid (tramp-send-command-and-read v "echo $$"))) - (process-put p 'remote-pid pid) - (tramp-set-connection-property p "remote-pid" pid)) - ;; `tramp-maybe-open-connection' and - ;; `tramp-send-command-and-read' could have - ;; trashed the connection buffer. Remove this. - (widen) - (delete-region mark (point-max)) +STDERR can also be a file name. If connection property +\"direct-async-process\" is non-nil, an alternative +implementation will be used." + (if (tramp-get-connection-property + (tramp-dissect-file-name default-directory) "direct-async-process" nil) + (apply #'tramp-handle-make-process args) + (when args + (with-parsed-tramp-file-name (expand-file-name default-directory) nil + (let ((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 (plist-get args :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 (null buffer) (bufferp buffer) (stringp buffer)) + (signal 'wrong-type-argument (list #'stringp 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))) + (unless (or (null connection-type) (memq connection-type '(pipe pty))) + (signal 'wrong-type-argument (list #'symbolp connection-type))) + (unless (or (null filter) (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) (stringp stderr)) + (signal 'wrong-type-argument (list #'stringp stderr))) + (when (and (stringp stderr) (tramp-tramp-file-p stderr) + (not (tramp-equal-remote default-directory stderr))) + (signal 'file-error (list "Wrong stderr" 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))) + ;; STDERR can also be a file name. + (tmpstderr + (and stderr + (if (and (stringp stderr) (tramp-tramp-file-p stderr)) + (tramp-unquote-file-local-name stderr) + (tramp-make-tramp-temp-file v)))) + (remote-tmpstderr + (and tmpstderr (tramp-make-tramp-file-name v tmpstderr))) + (program (car command)) + (args (cdr command)) + ;; When PROGRAM matches "*sh", and the first arg is + ;; "-c", it might be that the arguments exceed the + ;; command line length. Therefore, we modify the + ;; command. + (heredoc (and (stringp program) + (string-match-p "sh$" program) + (string-equal "-c" (car args)) + (= (length args) 2))) + ;; When PROGRAM is nil, we just provide a tty. + (args (if (not heredoc) args + (let ((i 250)) + (while (and (< i (length (cadr args))) + (string-match " " (cadr args) i)) + (setcdr + args + (list + (replace-match " \\\\\n" nil nil (cadr args)))) + (setq i (+ i 250)))) + (cdr args))) + ;; Use a human-friendly prompt, for example for + ;; `shell'. We discard hops, if existing, that's why + ;; we cannot use `file-remote-p'. + (prompt (format "PS1=%s %s" + (tramp-make-tramp-file-name v nil 'nohop) + tramp-initial-end-of-output)) + ;; We use as environment the difference to toplevel + ;; `process-environment'. + env uenv + (env (dolist (elt (cons prompt process-environment) env) + (or (member + elt (default-toplevel-value 'process-environment)) + (if (string-match-p "=" elt) + (setq env (append env `(,elt))) + (if (tramp-get-env-with-u-option v) + (setq env (append `("-u" ,elt) env)) + (setq uenv (cons elt uenv))))))) + (command + (when (stringp program) + (setenv-internal + env "INSIDE_EMACS" + (concat (or (getenv "INSIDE_EMACS") emacs-version) + ",tramp:" tramp-version) + 'keep) + (format "cd %s && %s exec %s %s env %s %s" + (tramp-shell-quote-argument localname) + (if uenv + (format + "unset %s &&" + (mapconcat + #'tramp-shell-quote-argument uenv " ")) + "") + (if heredoc (format "<<'%s'" tramp-end-of-heredoc) "") + (if tmpstderr (format "2>'%s'" tmpstderr) "") + (mapconcat #'tramp-shell-quote-argument env " ") + (if heredoc + (format "%s\n(\n%s\n) " name i))) + (setq name name1) + ;; Set the new process properties. + (tramp-set-connection-property v "process-name" name) + (tramp-set-connection-property v "process-buffer" buffer) + + (with-current-buffer (tramp-get-connection-buffer v) + (unwind-protect + ;; We catch this event. Otherwise, `make-process' + ;; could be called on the local host. + (save-excursion + (save-restriction + ;; Activate narrowing in order to save BUFFER + ;; contents. Clear also the modification time; + ;; otherwise we might be interrupted by + ;; `verify-visited-file-modtime'. + (let ((buffer-undo-list t) + (inhibit-read-only t) + (mark (point-max))) + (clear-visited-file-modtime) (narrow-to-region (point-max) (point-max)) - ;; Now do it. - (if command - ;; Send the command. - (tramp-send-command v command nil t) ; nooutput - ;; Check, whether a pty is associated. - (unless (process-get p 'remote-tty) - (tramp-error - v 'file-error - "pty association is not supported for `%s'" - name)))) - ;; Set sentinel and filter. - (when sentinel - (set-process-sentinel p sentinel)) - (when filter - (set-process-filter p filter)) - ;; Set query flag and process marker for this - ;; process. We ignore errors, because the - ;; process could have finished already. - (ignore-errors - (set-process-query-on-exit-flag p (null noquery)) - (set-marker (process-mark p) (point))) - ;; We must flush them here already; otherwise - ;; `rename-file', `delete-file' or - ;; `insert-file-contents' will fail. - (tramp-flush-connection-property v "process-name") - (tramp-flush-connection-property v "process-buffer") - ;; Copy tmpstderr file. - (when (and (stringp stderr) - (not (tramp-tramp-file-p stderr))) - (add-function - :after (process-sentinel p) - (lambda (_proc _msg) - (rename-file remote-tmpstderr stderr)))) - ;; Provide error buffer. This shows only - ;; initial error messages; messages arriving - ;; later on will be inserted when the process is - ;; deleted. The temporary file will exist until - ;; the process is deleted. - (when (bufferp stderr) - (with-current-buffer stderr - (insert-file-contents-literally remote-tmpstderr)) - ;; Delete tmpstderr file. - (add-function - :after (process-sentinel p) - (lambda (_proc _msg) - (when (file-exists-p remote-tmpstderr) - (with-current-buffer stderr - (insert-file-contents-literally - remote-tmpstderr nil nil nil 'replace)) - (delete-file remote-tmpstderr))))) - ;; Return process. - p))) + ;; We call `tramp-maybe-open-connection', in + ;; order to cleanup the prompt afterwards. + (catch 'suppress + (tramp-maybe-open-connection v) + (setq p (tramp-get-connection-process v)) + ;; Set the pid of the remote shell. This is + ;; needed when sending signals remotely. + (let ((pid (tramp-send-command-and-read v "echo $$"))) + (process-put p 'remote-pid pid) + (tramp-set-connection-property p "remote-pid" pid)) + ;; `tramp-maybe-open-connection' and + ;; `tramp-send-command-and-read' could have + ;; trashed the connection buffer. Remove this. + (widen) + (delete-region mark (point-max)) + (narrow-to-region (point-max) (point-max)) + ;; Now do it. + (if command + ;; Send the command. + (tramp-send-command v command nil t) ; nooutput + ;; Check, whether a pty is associated. + (unless (process-get p 'remote-tty) + (tramp-error + v 'file-error + "pty association is not supported for `%s'" + name)))) + ;; Set sentinel and filter. + (when sentinel + (set-process-sentinel p sentinel)) + (when filter + (set-process-filter p filter)) + ;; Set query flag and process marker for this + ;; process. We ignore errors, because the + ;; process could have finished already. + (ignore-errors + (set-process-query-on-exit-flag p (null noquery)) + (set-marker (process-mark p) (point))) + ;; We must flush them here already; otherwise + ;; `rename-file', `delete-file' or + ;; `insert-file-contents' will fail. + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer") + ;; Copy tmpstderr file. + (when (and (stringp stderr) + (not (tramp-tramp-file-p stderr))) + (add-function + :after (process-sentinel p) + (lambda (_proc _msg) + (rename-file remote-tmpstderr stderr)))) + ;; Provide error buffer. This shows only + ;; initial error messages; messages arriving + ;; later on will be inserted when the process + ;; is deleted. The temporary file will exist + ;; until the process is deleted. + (when (bufferp stderr) + (with-current-buffer stderr + (insert-file-contents-literally remote-tmpstderr)) + ;; Delete tmpstderr file. + (add-function + :after (process-sentinel p) + (lambda (_proc _msg) + (when (file-exists-p remote-tmpstderr) + (with-current-buffer stderr + (insert-file-contents-literally + remote-tmpstderr nil nil nil 'replace)) + (delete-file remote-tmpstderr))))) + ;; Return process. + p))) - ;; Save exit. - (if (string-match-p tramp-temp-buffer-name (buffer-name)) - (ignore-errors - (set-process-buffer p nil) - (kill-buffer (current-buffer))) - (set-buffer-modified-p bmp)) - (tramp-flush-connection-property v "process-name") - (tramp-flush-connection-property v "process-buffer")))))))) + ;; Save exit. + (if (string-match-p tramp-temp-buffer-name (buffer-name)) + (ignore-errors + (set-process-buffer p nil) + (kill-buffer (current-buffer))) + (set-buffer-modified-p bmp)) + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer"))))))))) (defun tramp-sh-get-signal-strings (vec) "Strings to return by `process-file' in case of signals." @@ -3646,6 +3651,14 @@ Fall back to normal file name handler if no Tramp handler exists." (save-match-data (apply (cdr fn) args)) (tramp-run-real-handler operation args))) +;;;###tramp-autoload +(defun tramp-sh-file-name-handler-p (vec) + "Whether VEC uses a method from `tramp-sh-file-name-handler'." + (and (assoc (tramp-file-name-method vec) tramp-methods) + (eq (tramp-find-foreign-file-name-handler + (tramp-make-tramp-file-name vec nil 'nohop)) + 'tramp-sh-file-name-handler))) + ;; This must be the last entry, because `identity' always matches. ;;;###tramp-autoload (tramp--with-startup @@ -4769,6 +4782,12 @@ Goes through the list `tramp-inline-compress-commands'." (tramp-message vec 2 "Couldn't find an inline transfer compress command"))))) +;;;###tramp-autoload +(defun tramp-multi-hop-p (vec) + "Whether the method of VEC is capable of multi-hops." + (and (tramp-sh-file-name-handler-p vec) + (not (tramp-get-method-parameter vec 'tramp-copy-program)))) + (defun tramp-compute-multi-hops (vec) "Expands VEC according to `tramp-default-proxies-alist'." (let ((saved-tdpa tramp-default-proxies-alist) @@ -4832,8 +4851,7 @@ Goes through the list `tramp-inline-compress-commands'." (when (cdr target-alist) (setq choices target-alist) (while (setq item (pop choices)) - (when (or (not (tramp-get-method-parameter item 'tramp-login-program)) - (tramp-get-method-parameter item 'tramp-copy-program)) + (unless (tramp-multi-hop-p item) (setq tramp-default-proxies-alist saved-tdpa) (tramp-user-error vec "Method `%s' is not supported for multi-hops." diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index c169a86f915..d1b2935a3c6 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -1482,10 +1482,7 @@ default values are used." (tramp-user-error v "Method `%s' is not known." method)) ;; Only some methods from tramp-sh.el do support multi-hops. - (when (and - hop - (or (not (tramp-get-method-parameter v 'tramp-login-program)) - (tramp-get-method-parameter v 'tramp-copy-program))) + (unless (or (null hop) nodefault non-essential (tramp-multi-hop-p v)) (tramp-user-error v "Method `%s' is not supported for multi-hops." method))))))) @@ -1499,8 +1496,7 @@ See `tramp-dissect-file-name' for details." tramp-postfix-host-format name)) nodefault))) ;; Only some methods from tramp-sh.el do support multi-hops. - (when (or (not (tramp-get-method-parameter v 'tramp-login-program)) - (tramp-get-method-parameter v 'tramp-copy-program)) + (unless (or nodefault non-essential (tramp-multi-hop-p v)) (tramp-user-error v "Method `%s' is not supported for multi-hops." (tramp-file-name-method v))) @@ -3519,13 +3515,10 @@ User is always nil." ;; When we shall insert only a part of the file, we ;; copy this part. This works only for the shell file - ;; name handlers. + ;; name handlers. It doesn't work for crypted files. (when (and (or beg end) - ;; Direct actions aren't possible for - ;; crypted directories. - (null tramp-crypt-enabled) - (tramp-get-method-parameter - v 'tramp-login-program)) + (tramp-sh-file-name-handler-p v) + (null tramp-crypt-enabled)) (setq remote-copy (tramp-make-tramp-temp-file v)) ;; This is defined in tramp-sh.el. Let's assume ;; this is loaded already. @@ -3640,6 +3633,152 @@ User is always nil." (load local-copy noerror t nosuffix must-suffix) (delete-file local-copy))))) t))) +;; We use BUFFER also as connection buffer during setup. Because of +;; this, its original contents must be saved, and restored once +;; connection has been setup. +(defun tramp-handle-make-process (&rest args) + "An alternative `make-process' implementation for Tramp files." + (when args + (with-parsed-tramp-file-name (expand-file-name default-directory) nil + (let ((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 (plist-get args :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 (null buffer) (bufferp buffer) (stringp buffer)) + (signal 'wrong-type-argument (list #'stringp 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))) + (unless (or (null connection-type) (memq connection-type '(pipe pty))) + (signal 'wrong-type-argument (list #'symbolp connection-type))) + (unless (or (null filter) (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) (stringp stderr)) + (signal 'wrong-type-argument (list #'stringp stderr))) + (when (and (stringp stderr) (tramp-tramp-file-p stderr) + (not (tramp-equal-remote default-directory stderr))) + (signal 'file-error (list "Wrong stderr" 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))) + (command (append `("cd" ,localname "&&") + (mapcar #'tramp-shell-quote-argument command))) + (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer))) + (name1 name) + (i 0) + ;; We do not want to raise an error when `make-process' + ;; has been started several times in `eshell' and + ;; friends. + tramp-current-connection + p) + + (while (get-process name1) + ;; NAME must be unique as process name. + (setq i (1+ i) + name1 (format "%s<%d>" name i))) + (setq name name1) + ;; Set the new process properties. + (tramp-set-connection-property v "process-name" name) + (tramp-set-connection-property v "process-buffer" buffer) + + (with-current-buffer (tramp-get-connection-buffer v) + (unwind-protect + (let* ((login-program + (tramp-get-method-parameter v 'tramp-login-program)) + (login-args + (tramp-get-method-parameter v 'tramp-login-args)) + (async-args + (tramp-get-method-parameter v 'tramp-async-args)) + ;; We don't create the temporary file. In + ;; fact, it is just a prefix for the + ;; ControlPath option of ssh; the real + ;; temporary file has another name, and it is + ;; created and protected by ssh. It is also + ;; removed by ssh when the connection is + ;; closed. The temporary file name is cached + ;; in the main connection process, therefore + ;; we cannot use `tramp-get-connection-process'. + (tmpfile + (when (tramp-sh-file-name-handler-p v) + (with-tramp-connection-property + (tramp-get-process v) "temp-file" + (tramp-compat-make-temp-name)))) + (options + (when (tramp-sh-file-name-handler-p v) + (tramp-compat-funcall + 'tramp-ssh-controlmaster-options v))) + spec) + + ;; Replace `login-args' place holders. + (setq + spec (format-spec-make ?t tmpfile) + options (format-spec (or options "") spec) + spec (format-spec-make + ?h (or host "") ?u (or user "") ?p (or port "") + ?c options ?l "") + ;; Add arguments for asynchronous processes. + login-args (append async-args login-args) + ;; Expand format spec. + login-args + (tramp-compat-flatten-tree + (mapcar + (lambda (x) + (setq x (mapcar (lambda (y) (format-spec y spec)) x)) + (unless (member "" x) x)) + login-args)) + ;; Split ControlMaster options. + login-args + (tramp-compat-flatten-tree + (mapcar (lambda (x) (split-string x " ")) login-args)) + p (apply + #'start-process + name buffer login-program (append login-args command))) + + (tramp-message v 6 "%s" (string-join (process-command p) " ")) + ;; Set sentinel and filter. + (when sentinel + (set-process-sentinel p sentinel)) + (when filter + (set-process-filter p filter)) + ;; Set query flag and process marker for this + ;; process. We ignore errors, because the + ;; process could have finished already. + (ignore-errors + (set-process-query-on-exit-flag p (null noquery)) + (set-marker (process-mark p) (point))) + ;; We must flush them here already; otherwise + ;; `rename-file', `delete-file' or + ;; `insert-file-contents' will fail. + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer") + ;; Return process. + p) + + ;; Save exit. + (if (string-match-p tramp-temp-buffer-name (buffer-name)) + (ignore-errors + (set-process-buffer p nil) + (kill-buffer (current-buffer))) + (set-buffer-modified-p bmp)) + (tramp-flush-connection-property v "process-name") + (tramp-flush-connection-property v "process-buffer")))))))) (defun tramp-handle-make-symbolic-link (target linkname &optional ok-if-already-exists) @@ -4706,7 +4845,7 @@ This handles also chrooted environments, which are not regarded as local." ;; The method shall be applied to one of the shell file name ;; handlers. `tramp-local-host-p' is also called for "smb" and ;; alike, where it must fail. - (tramp-get-method-parameter vec 'tramp-login-program) + (tramp-sh-file-name-handler-p vec) ;; Direct actions aren't possible for crypted directories. (null tramp-crypt-enabled) ;; The local temp directory must be writable for the other user. diff --git a/test/README b/test/README index 1f69f7142c1..fe05b5403b1 100644 --- a/test/README +++ b/test/README @@ -64,6 +64,11 @@ protect against "make" variable expansion): make SELECTOR='"foo$$"' +In case you want to use the symbol name of a test as selector, you can +use it directly: + + make SELECTOR='test-foo-remote' + Note that although the test files are always compiled (unless they set no-byte-compile), the source files will be run when expensive or unstable tests are involved, to give nicer backtraces. To run the diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el index ac24fcf280a..05196e7e4a6 100644 --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@ -2001,12 +2001,13 @@ is greater than 10. (skip-unless (tramp--test-enabled)) ;; Multi hops are allowed for inline methods only. - (should-error - (file-remote-p "/ssh:user1@host1|method:user2@host2:/path/to/file") - :type 'user-error) - (should-error - (file-remote-p "/method:user1@host1|ssh:user2@host2:/path/to/file") - :type 'user-error) + (let (non-essential) + (should-error + (expand-file-name "/ssh:user1@host1|method:user2@host2:/path/to/file") + :type 'user-error) + (should-error + (expand-file-name "/method:user1@host1|ssh:user2@host2:/path/to/file") + :type 'user-error)) ;; Samba does not support file names with periods followed by ;; spaces, and trailing periods or spaces. @@ -5681,9 +5682,8 @@ This does not support special file names." (defun tramp--test-sh-p () "Check, whether the remote host runs a based method from tramp-sh.el." - (eq - (tramp-find-foreign-file-name-handler tramp-test-temporary-file-directory) - 'tramp-sh-file-name-handler)) + (tramp-sh-file-name-handler-p + (tramp-dissect-file-name tramp-test-temporary-file-directory))) (defun tramp--test-sudoedit-p () "Check, whether the sudoedit method is used." -- cgit v1.2.3 From 3da0d3852923f0a20157f72aba6d8896019559f8 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Tue, 4 Aug 2020 14:20:16 +0200 Subject: * etc/NEWS: Add Tramp support of direct asynchronous process invocation. --- etc/NEWS | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 7221c9cf9e6..cd5cc2c3397 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -324,6 +324,16 @@ This command marks a remote directory to contain only encrypted files. See the "(tramp) Keeping files encrypted" node of the Tramp manual for details. This feature is experimental. ++++ +*** Support of direct asynchronous process invocation. +When Tramp connection property "direct-async-process" is set to +non-nil for a given connection, 'make-process' and 'start-file-process' +calls are performed directly as in "ssh ... ". This avoids +initialization performance penalties. See the "(tramp) Improving +performance of asynchronous remote processes" node of the Tramp manual +for details, and also for a discussion or restrictions. This feature +is experimental. + ** Tempo --- -- cgit v1.2.3 From e208d67e8401b8e08d697273e6e162b1e4620005 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 14:30:13 +0200 Subject: Fix wdired test for Macos * test/lisp/wdired-tests.el (wdired-test-bug34915): Macos adds "@" to the end of symlinks (bug#42537). --- test/lisp/wdired-tests.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/lisp/wdired-tests.el b/test/lisp/wdired-tests.el index 5b01c54cf24..fcd8b626404 100644 --- a/test/lisp/wdired-tests.el +++ b/test/lisp/wdired-tests.el @@ -132,7 +132,7 @@ wdired-mode." (declare-function dired-smart-shell-command "dired-x" (command &optional output-buffer error-buffer)) -(ert-deftest wdired-test-bug34915 () +(defun wdired-test-bug34915 () "Test editing when dired-listing-switches includes -F. Appended file indicators should not count as part of the file name, either before or after editing. Since @@ -143,6 +143,7 @@ wdired-get-filename before and after editing." (let* ((test-dir (make-temp-file "test-dir-" t)) (server-socket-dir test-dir) (dired-listing-switches "-Fl") + (dired-ls-F-marks-symlinks (eq system-type 'darwin)) (buf (find-file-noselect test-dir))) (unwind-protect (progn -- cgit v1.2.3 From 934585a6498428f60d709e2ec0379f4667554c6b Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 14:31:36 +0200 Subject: dired-ls-F-marks-symlinks should be set under Macos * lisp/dired.el (dired-ls-F-marks-symlinks): Not that this should be set under Macos (bug#42537). --- lisp/dired.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/dired.el b/lisp/dired.el index 1792250ac90..d19d6d1581d 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -125,7 +125,7 @@ For more details, see Info node `(emacs)ls in Lisp'." "Informs Dired about how `ls -lF' marks symbolic links. Set this to t if `ls' (or whatever program is specified by `insert-directory-program') with `-lF' marks the symbolic link -itself with a trailing @ (usually the case under Ultrix). +itself with a trailing @ (usually the case under Ultrix and macOS). Example: if `ln -s foo bar; ls -F bar' gives `bar -> foo', set it to nil (the default), if it gives `bar@ -> foo', set it to t. -- cgit v1.2.3 From a3c870d7e2426bd401c2de60fa851176cf631f7c Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 14:48:33 +0200 Subject: Fix svn tests on Macos * test/lisp/vc/vc-tests.el (vc-test--svn-enabled): Macos machines may have a dummy svn program that helpfully just outputs "There's no svn program here", so also test for the svnadmin program (bug#42536). --- test/lisp/vc/vc-tests.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/lisp/vc/vc-tests.el b/test/lisp/vc/vc-tests.el index 8e5cc95ec94..01d196565dd 100644 --- a/test/lisp/vc/vc-tests.el +++ b/test/lisp/vc/vc-tests.el @@ -554,7 +554,8 @@ This checks also `vc-backend' and `vc-responsible-backend'." (defvar vc-svn-program) (defun vc-test--svn-enabled () - (executable-find vc-svn-program)) + (and (executable-find "svnadmin") + (executable-find vc-svn-program))) (defun vc-test--sccs-enabled () (executable-find "sccs")) -- cgit v1.2.3 From 1432cfd485d33bb518ab6ac5667ae4e4faf7f6b5 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 15:15:36 +0200 Subject: Fix debugging code checked in from wdired-tests --- test/lisp/wdired-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lisp/wdired-tests.el b/test/lisp/wdired-tests.el index fcd8b626404..2cfabd1ee2d 100644 --- a/test/lisp/wdired-tests.el +++ b/test/lisp/wdired-tests.el @@ -132,7 +132,7 @@ wdired-mode." (declare-function dired-smart-shell-command "dired-x" (command &optional output-buffer error-buffer)) -(defun wdired-test-bug34915 () +(ert-deftest wdired-test-bug34915 () "Test editing when dired-listing-switches includes -F. Appended file indicators should not count as part of the file name, either before or after editing. Since -- cgit v1.2.3 From ea9520a7a23dfd66de30b04d0c5ff878fecfd3d2 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 15:56:12 +0200 Subject: Mark the end of file names correctly on Macos in wdired * lisp/wdired.el (wdired--restore-dired-filename-prop): Fix problem with finding the end of the name on Macos. --- lisp/wdired.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lisp/wdired.el b/lisp/wdired.el index 768b8f597b4..b98becfafe7 100644 --- a/lisp/wdired.el +++ b/lisp/wdired.el @@ -609,7 +609,10 @@ Optional arguments are ignored." (defun wdired--restore-dired-filename-prop (beg end _len) (save-match-data (save-excursion - (let ((lep (line-end-position))) + (let ((lep (line-end-position)) + (used-F (dired-check-switches + dired-actual-switches + "F" "classify"))) (beginning-of-line) (when (re-search-forward directory-listing-before-filename-regexp lep t) @@ -623,13 +626,17 @@ Optional arguments are ignored." (and (re-search-backward dired-permission-flags-regexp nil t) (looking-at "l") - (search-forward " -> " lep t)) + ;; macOS and Ultrix adds "@" to the end + ;; of symlinks when using -F. + (if (and used-F + dired-ls-F-marks-symlinks) + (re-search-forward "@? -> " lep t) + (search-forward " -> " lep t))) ;; When dired-listing-switches includes "F" ;; or "classify", don't treat appended ;; indicator characters as part of the file ;; name (bug#34915). - (and (dired-check-switches dired-actual-switches - "F" "classify") + (and used-F (re-search-forward "[*/@|=>]$" lep t))) (goto-char (match-beginning 0)) lep)) -- cgit v1.2.3 From 99e9bdcd4105ac70f8f7ee06f2450cdbb15dbf3b Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 17:25:36 +0200 Subject: Make a network-stream test more robust * test/lisp/net/network-stream-tests.el (network-test--resolve-system-name): New function. (echo-server-with-dns): Skip test if (system-name) doesn't look like it's going to resolve (bug#42535). --- test/lisp/net/network-stream-tests.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/lisp/net/network-stream-tests.el b/test/lisp/net/network-stream-tests.el index 7a982548ae1..f44682e1edb 100644 --- a/test/lisp/net/network-stream-tests.el +++ b/test/lisp/net/network-stream-tests.el @@ -136,7 +136,20 @@ (t )))) +(defun network-test--resolve-system-name () + (cl-loop for address in (network-lookup-address-info (system-name)) + when (or (and (= (length address) 5) + ;; IPv4 localhost addresses start with 127. + (= (elt address 0) 127)) + (and (= (length address) 9) + ;; IPv6 localhost addresses start with 0. + (= (elt address 0) 0))) + return t)) + (ert-deftest echo-server-with-dns () + (unless (network-test--resolve-system-name) + (ert-skip "Can't test resolver for (system-name)")) + (let* ((server (make-server (system-name))) (port (aref (process-contact server :local) 4)) (proc (make-network-process :name "foo" -- cgit v1.2.3 From 89dbd0838b980f6ef58fa0f614bd743f86ec1c74 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 17:34:21 +0200 Subject: Fix previous network stream test * test/lisp/net/network-stream-tests.el (network-test--resolve-system-name): There's only one ipv6 localhost address. --- test/lisp/net/network-stream-tests.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/lisp/net/network-stream-tests.el b/test/lisp/net/network-stream-tests.el index f44682e1edb..cf416155e50 100644 --- a/test/lisp/net/network-stream-tests.el +++ b/test/lisp/net/network-stream-tests.el @@ -142,8 +142,8 @@ ;; IPv4 localhost addresses start with 127. (= (elt address 0) 127)) (and (= (length address) 9) - ;; IPv6 localhost addresses start with 0. - (= (elt address 0) 0))) + ;; IPv6 localhost address. + (equal address [0 0 0 0 0 0 0 1 0]))) return t)) (ert-deftest echo-server-with-dns () -- cgit v1.2.3 From 0a12d43e84eb5592c39350432c7a3e8fdaa71a06 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 18:08:47 +0200 Subject: Fix viewing encrypted+signed messages from Outlook * lisp/gnus/mm-decode.el (mm-possibly-verify-or-decrypt): Fix problem with CRLF-encoded encrypted+signed parts (bug#42637). --- lisp/gnus/mm-decode.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index 587c4e01b92..7f8ab5f9ef5 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -1680,6 +1680,12 @@ If RECURSIVE, search recursively." (t (y-or-n-p (format "Decrypt (S/MIME) part? ")))) (mm-view-pkcs7 parts from)) + (goto-char (point-min)) + ;; The encrypted document is a MIME part, and may use either + ;; CRLF (Outlook and the like) or newlines for end-of-line + ;; markers. Translate from CRLF. + (while (search-forward "\r\n" nil t) + (replace-match "\n")) ;; Normally there will be a Content-type header here, but ;; some mailers don't add that to the encrypted part, which ;; makes the subsequent re-dissection fail here. -- cgit v1.2.3 From b0e828da4f55d0dddcd8f8fc2e21e4b02a12852e Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 31 Jul 2020 06:09:09 +0200 Subject: Add new cconv-tests (Bug#28557) These tests are all written by Gemini Lasswell . * test/lisp/emacs-lisp/cconv-tests.el (top-level): Add two commented out tests which the byte-compiler can't handle. (cconv-tests-lambda-:documentation) (cconv-tests-pcase-lambda-:documentation) (cconv-tests-defun-:documentation) (cconv-tests-cl-defun-:documentation) (cconv-tests-function-:documentation) (cconv-tests-cl-defgeneric-literal-:documentation) (cconv-tests-defsubst-:documentation) (cconv-tests-cl-defsubst-:documentation): New tests. (cconv-tests-cl-iter-defun-:documentation) (cconv-tests-iter-defun-:documentation) (cconv-tests-iter-lambda-:documentation) (cconv-tests-cl-function-:documentation) (cconv-tests-cl-defgeneric-:documentation): New failing tests. --- test/lisp/emacs-lisp/cconv-tests.el | 158 ++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/test/lisp/emacs-lisp/cconv-tests.el b/test/lisp/emacs-lisp/cconv-tests.el index c8d46541ad4..148bcd69be1 100644 --- a/test/lisp/emacs-lisp/cconv-tests.el +++ b/test/lisp/emacs-lisp/cconv-tests.el @@ -20,6 +20,164 @@ ;;; Commentary: (require 'ert) +(require 'cl-lib) + +(ert-deftest cconv-tests-lambda-:documentation () + "Docstring for lambda can be specified with :documentation." + (let ((fun (lambda () + (:documentation (concat "lambda" " documentation")) + 'lambda-result))) + (should (string= (documentation fun) "lambda documentation")) + (should (eq (funcall fun) 'lambda-result)))) + +(ert-deftest cconv-tests-pcase-lambda-:documentation () + "Docstring for pcase-lambda can be specified with :documentation." + (let ((fun (pcase-lambda (`(,a ,b)) + (:documentation (concat "pcase-lambda" " documentation")) + (list b a)))) + (should (string= (documentation fun) "pcase-lambda documentation")) + (should (equal '(2 1) (funcall fun '(1 2)))))) + +(defun cconv-tests-defun () + (:documentation (concat "defun" " documentation")) + 'defun-result) +(ert-deftest cconv-tests-defun-:documentation () + "Docstring for defun can be specified with :documentation." + (should (string= (documentation 'cconv-tests-defun) + "defun documentation")) + (should (eq (cconv-tests-defun) 'defun-result))) + +(cl-defun cconv-tests-cl-defun () + (:documentation (concat "cl-defun" " documentation")) + 'cl-defun-result) +(ert-deftest cconv-tests-cl-defun-:documentation () + "Docstring for cl-defun can be specified with :documentation." + (should (string= (documentation 'cconv-tests-cl-defun) + "cl-defun documentation")) + (should (eq (cconv-tests-cl-defun) 'cl-defun-result))) + +;; FIXME: The byte-complier croaks on this. See Bug#28557. +;; (defmacro cconv-tests-defmacro () +;; (:documentation (concat "defmacro" " documentation")) +;; '(quote defmacro-result)) +;; (ert-deftest cconv-tests-defmacro-:documentation () +;; "Docstring for defmacro can be specified with :documentation." +;; (should (string= (documentation 'cconv-tests-defmacro) +;; "defmacro documentation")) +;; (should (eq (cconv-tests-defmacro) 'defmacro-result))) + +;; FIXME: The byte-complier croaks on this. See Bug#28557. +;; (cl-defmacro cconv-tests-cl-defmacro () +;; (:documentation (concat "cl-defmacro" " documentation")) +;; '(quote cl-defmacro-result)) +;; (ert-deftest cconv-tests-cl-defmacro-:documentation () +;; "Docstring for cl-defmacro can be specified with :documentation." +;; (should (string= (documentation 'cconv-tests-cl-defmacro) +;; "cl-defmacro documentation")) +;; (should (eq (cconv-tests-cl-defmacro) 'cl-defmacro-result))) + +(cl-iter-defun cconv-tests-cl-iter-defun () + (:documentation (concat "cl-iter-defun" " documentation")) + (iter-yield 'cl-iter-defun-result)) +(ert-deftest cconv-tests-cl-iter-defun-:documentation () + "Docstring for cl-iter-defun can be specified with :documentation." + ;; FIXME: See Bug#28557. + :expected-result :failed + (should (string= (documentation 'cconv-tests-cl-iter-defun) + "cl-iter-defun documentation")) + (should (eq (iter-next (cconv-tests-cl-iter-defun)) + 'cl-iter-defun-result))) + +(iter-defun cconv-tests-iter-defun () + (:documentation (concat "iter-defun" " documentation")) + (iter-yield 'iter-defun-result)) +(ert-deftest cconv-tests-iter-defun-:documentation () + "Docstring for iter-defun can be specified with :documentation." + ;; FIXME: See Bug#28557. + :expected-result :failed + (should (string= (documentation 'cconv-tests-iter-defun) + "iter-defun documentation")) + (should (eq (iter-next (cconv-tests-iter-defun)) 'iter-defun-result))) + +(ert-deftest cconv-tests-iter-lambda-:documentation () + "Docstring for iter-lambda can be specified with :documentation." + ;; FIXME: See Bug#28557. + :expected-result :failed + (let ((iter-fun + (iter-lambda () + (:documentation (concat "iter-lambda" " documentation")) + (iter-yield 'iter-lambda-result)))) + (should (string= (documentation iter-fun) "iter-lambda documentation")) + (should (eq (iter-next (funcall iter-fun)) 'iter-lambda-result)))) + +(ert-deftest cconv-tests-cl-function-:documentation () + "Docstring for cl-function can be specified with :documentation." + ;; FIXME: See Bug#28557. + :expected-result :failed + (let ((fun (cl-function (lambda (&key arg) + (:documentation (concat "cl-function" + " documentation")) + (list arg 'cl-function-result))))) + (should (string= (documentation fun) "cl-function documentation")) + (should (equal (funcall fun :arg t) '(t cl-function-result))))) + +(ert-deftest cconv-tests-function-:documentation () + "Docstring for lambda inside function can be specified with :documentation." + (let ((fun #'(lambda (arg) + (:documentation (concat "function" " documentation")) + (list arg 'function-result)))) + (should (string= (documentation fun) "function documentation")) + (should (equal (funcall fun t) '(t function-result))))) + +(fmakunbound 'cconv-tests-cl-defgeneric) +(setplist 'cconv-tests-cl-defgeneric nil) +(cl-defgeneric cconv-tests-cl-defgeneric (n) + (:documentation (concat "cl-defgeneric" " documentation"))) +(cl-defmethod cconv-tests-cl-defgeneric ((n integer)) + (:documentation (concat "cl-defmethod" " documentation")) + (+ 1 n)) +(ert-deftest cconv-tests-cl-defgeneric-:documentation () + "Docstring for cl-defgeneric can be specified with :documentation." + ;; FIXME: See Bug#28557. + :expected-result :failed + (let ((descr (describe-function 'cconv-tests-cl-defgeneric))) + (set-text-properties 0 (length descr) nil descr) + (should (string-match-p "cl-defgeneric documentation" descr)) + (should (string-match-p "cl-defmethod documentation" descr))) + (should (= 11 (cconv-tests-cl-defgeneric 10)))) + +(fmakunbound 'cconv-tests-cl-defgeneric-literal) +(setplist 'cconv-tests-cl-defgeneric-literal nil) +(cl-defgeneric cconv-tests-cl-defgeneric-literal (n) + (:documentation "cl-defgeneric-literal documentation")) +(cl-defmethod cconv-tests-cl-defgeneric-literal ((n integer)) + (:documentation "cl-defmethod-literal documentation") + (+ 1 n)) +(ert-deftest cconv-tests-cl-defgeneric-literal-:documentation () + "Docstring for cl-defgeneric can be specified with :documentation." + (let ((descr (describe-function 'cconv-tests-cl-defgeneric-literal))) + (set-text-properties 0 (length descr) nil descr) + (should (string-match-p "cl-defgeneric-literal documentation" descr)) + (should (string-match-p "cl-defmethod-literal documentation" descr))) + (should (= 11 (cconv-tests-cl-defgeneric-literal 10)))) + +(defsubst cconv-tests-defsubst () + (:documentation (concat "defsubst" " documentation")) + 'defsubst-result) +(ert-deftest cconv-tests-defsubst-:documentation () + "Docstring for defsubst can be specified with :documentation." + (should (string= (documentation 'cconv-tests-defsubst) + "defsubst documentation")) + (should (eq (cconv-tests-defsubst) 'defsubst-result))) + +(cl-defsubst cconv-tests-cl-defsubst () + (:documentation (concat "cl-defsubst" " documentation")) + 'cl-defsubst-result) +(ert-deftest cconv-tests-cl-defsubst-:documentation () + "Docstring for cl-defsubst can be specified with :documentation." + (should (string= (documentation 'cconv-tests-cl-defsubst) + "cl-defsubst documentation")) + (should (eq (cconv-tests-cl-defsubst) 'cl-defsubst-result))) (ert-deftest cconv-convert-lambda-lifted () "Bug#30872." -- cgit v1.2.3 From 9eb04d87409db48ce63ef5d40201c92bc9e7028c Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 18:52:31 +0200 Subject: Mark unused Gnus util function as obsolete * lisp/gnus/gnus-util.el (gnus-test-list): Mark utility function as obsolete -- there are no in-tree usage. --- lisp/gnus/gnus-util.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 8d8956f1fb9..abe546b8cb6 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -1654,6 +1654,7 @@ The first found will be returned if a file has hard or symbolic links." "To each element of LIST apply PREDICATE. Return nil if LIST is no list or is empty or some test returns nil; otherwise, return t." + (declare (obsolete nil "28.1")) (when (and list (listp list)) (let ((result (mapcar predicate list))) (not (memq nil result))))) -- cgit v1.2.3 From fbfa70f486522e1b752ebf3d8590375508ea2a55 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 18:53:47 +0200 Subject: Add test file lost when merged from Gnus in 2016 --- test/lisp/gnus/gnus-util-tests.el | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/lisp/gnus/gnus-util-tests.el diff --git a/test/lisp/gnus/gnus-util-tests.el b/test/lisp/gnus/gnus-util-tests.el new file mode 100644 index 00000000000..b01e2fc2966 --- /dev/null +++ b/test/lisp/gnus/gnus-util-tests.el @@ -0,0 +1,76 @@ +;;; gnus-util-tests.el --- Selectived tests only. +;; Copyright (C) 2015-2020 Free Software Foundation, Inc. + +;; Author: Jens Lechtenbörger + +;; This file is not 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, 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 'gnus-util) + +(ert-deftest gnus-subsetp () + ;; False for non-lists. + (should-not (gnus-subsetp "1" "1")) + (should-not (gnus-subsetp "1" '("1"))) + (should-not (gnus-subsetp '("1") "1")) + + ;; Real tests. + (should (gnus-subsetp '() '())) + (should (gnus-subsetp '() '("1"))) + (should (gnus-subsetp '("1") '("1"))) + (should (gnus-subsetp '(42) '("1" 42))) + (should (gnus-subsetp '(42) '(42 "1"))) + (should (gnus-subsetp '(42) '("1" 42 2))) + (should-not (gnus-subsetp '("1") '())) + (should-not (gnus-subsetp '("1") '(2))) + (should-not (gnus-subsetp '("1" 2) '(2))) + (should-not (gnus-subsetp '(2 "1") '(2))) + (should-not (gnus-subsetp '("1" 2) '(2 3))) + + ;; Duplicates don't matter for sets. + (should (gnus-subsetp '("1" "1") '("1"))) + (should (gnus-subsetp '("1" 2 "1") '(2 "1"))) + (should (gnus-subsetp '("1" 2 "1") '(2 "1" "1" 2))) + (should-not (gnus-subsetp '("1" 2 "1" 3) '(2 "1" "1" 2)))) + +(ert-deftest gnus-setdiff () + ;; False for non-lists. + (should-not (gnus-setdiff "1" "1")) + (should-not (gnus-setdiff "1" '())) + (should-not (gnus-setdiff '() "1")) + + ;; Real tests. + (should-not (gnus-setdiff '() '())) + (should-not (gnus-setdiff '() '("1"))) + (should-not (gnus-setdiff '("1") '("1"))) + (should (equal '("1") (gnus-setdiff '("1") '()))) + (should (equal '("1") (gnus-setdiff '("1") '(2)))) + (should (equal '("1") (gnus-setdiff '("1" 2) '(2)))) + (should (equal '("1") (gnus-setdiff '("1" 2 3) '(3 2)))) + (should (equal '("1") (gnus-setdiff '(2 "1" 3) '(3 2)))) + (should (equal '("1") (gnus-setdiff '(2 3 "1") '(3 2)))) + (should (equal '(2 "1") (gnus-setdiff '(2 3 "1") '(3)))) + + ;; Duplicates aren't touched for sets if they are not removed. + (should-not (gnus-setdiff '("1" "1") '("1"))) + (should (equal '("1") (gnus-setdiff '(2 "1" 2) '(2)))) + (should (equal '("1" "1") (gnus-setdiff '(2 "1" 2 "1") '(2))))) + +;;; gnustest-gnus-util.el ends here -- cgit v1.2.3 From 59243e9f18a247bddd91ed704c8e3234383ed414 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 19:26:04 +0200 Subject: Fix two mml-sec minor bugs revealed by new test harness * lisp/gnus/mml-sec.el (mml-secure-allow-signing-with-unknown-recipient): New variable (bug#18393) (but this should probably be fixed in a different way). (mml-secure-epg-sign): Use it. (mml-secure-check-user-id): Protect against recipients that aren't email addresses, like "No recipient". --- lisp/gnus/mml-sec.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lisp/gnus/mml-sec.el b/lisp/gnus/mml-sec.el index 740e1d2b722..69852c381d6 100644 --- a/lisp/gnus/mml-sec.el +++ b/lisp/gnus/mml-sec.el @@ -665,8 +665,9 @@ The passphrase is read and cached." (epg-user-id-string uid)))) (equal (downcase (car (mail-header-parse-address (epg-user-id-string uid)))) - (downcase (car (mail-header-parse-address - recipient)))) + (downcase (or (car (mail-header-parse-address + recipient)) + recipient))) (not (memq (epg-user-id-validity uid) '(revoked expired)))) (throw 'break t)))))) @@ -937,6 +938,10 @@ If no one is selected, symmetric encryption will be performed. " (signal (car error) (cdr error)))) cipher)) +;; Should probably be removed and the interface should be different. +(defvar mml-secure-allow-signing-with-unknown-recipient nil + "Variable to bind to allow automatic recipient selection.") + (defun mml-secure-epg-sign (protocol mode) ;; Based on code appearing inside mml2015-epg-sign. (let* ((context (epg-make-context protocol)) @@ -953,7 +958,8 @@ If no one is selected, symmetric encryption will be performed. " ;; then there's no point advising the user to examine it. If ;; there are any other variables worth examining, please ;; improve this error message by having it mention them. - (error "Couldn't find any signer names%s" maybe-msg))) + (unless mml-secure-allow-signing-with-unknown-recipient + (error "Couldn't find any signer names%s" maybe-msg)))) (when (eq 'OpenPGP protocol) (setf (epg-context-armor context) t) (setf (epg-context-textmode context) t) -- cgit v1.2.3 From 0c6d2f0ff51eb24938f4af4116855b5facee9d24 Mon Sep 17 00:00:00 2001 From: Jens Lechtenbörger Date: Tue, 4 Aug 2020 19:28:41 +0200 Subject: Add tests for mml-sec.el --- test/data/mml-sec/.gpg-v21-migrated | 0 test/data/mml-sec/gpg-agent.conf | 5 + .../02089CDDC6DFE93B8EA10D9E876F983E61FEC476.key | Bin 0 -> 797 bytes .../171B444DE92BEF997229000D9784118A94EEC1C9.key | Bin 0 -> 526 bytes .../19FFEBC04DF3E037E16F6A4474DCB7984406975D.key | Bin 0 -> 841 bytes .../1E36D27DF9DAB96302D35268DADC5CE73EF45A2A.key | Bin 0 -> 797 bytes .../293109315BE584AB2EFEFCFCAD64666221D8B36C.key | Bin 0 -> 526 bytes .../335689599E1C0F66D73ADCF51E03EE36C97D121F.key | Bin 0 -> 797 bytes .../40BF94E540E3726CB150A1ADF7C1B514444B3FA6.key | Bin 0 -> 797 bytes .../515D4637EFC6C09DB1F78BE8C2F2A3D63E7756C3.key | Bin 0 -> 798 bytes .../5A11B1935C46D0B227A73978DCA1293A85604F1D.key | Bin 0 -> 798 bytes .../62643CEBC7AEBE6817577A34399483700D76BD64.key | Bin 0 -> 526 bytes .../680D01F368916A0021C14E3453B27B3C5F900683.key | Bin 0 -> 710 bytes .../6DF2D9DF7AED06F0524BEB642DF0FB48EFDBDB93.key | Bin 0 -> 798 bytes .../78C17E134E86E691297F7B719B2F2CDF41976234.key | Bin 0 -> 527 bytes .../7F714F4D9D9676638214991E96D45704E4FFC409.key | Bin 0 -> 798 bytes .../854752F5D8090CA36EFBDD79C72BDFF6FA2D1FF0.key | Bin 0 -> 526 bytes .../93FF37C268FDBF0767F5FFDC49409DDAC9388B2C.key | Bin 0 -> 709 bytes .../A3BA94EAE83509CC90DB1B77B54A51959D8DABEA.key | Bin 0 -> 797 bytes .../A73E9D01F0465B518E8E7D5AD529077AAC1603B4.key | Bin 0 -> 710 bytes .../AE6A24B17A8D0CAF9B7E000AA77F0B41D7BFFFCF.key | Bin 0 -> 841 bytes .../C072AF82DCCCB9A7F1B85FFA10B802DC4ED16703.key | Bin 0 -> 841 bytes .../C43E1A079B28DFAEBB39CBA01793BDE11EF4B490.key | Bin 0 -> 527 bytes .../C67DAD345455EAD6D51368008FC3A53B8D195B5A.key | Bin 0 -> 710 bytes .../CB5E00CE582C2645D2573FC16B2F14F85A7F47AA.key | Bin 0 -> 797 bytes .../CC68630A06B048F5A91136C162C7A3273E20DE6F.key | Bin 0 -> 710 bytes .../E7E73903E1BF93481DE0E7C9769D6C31E1863CFF.key | Bin 0 -> 797 bytes .../F0117468BE801ED4B81972E159A98FDD4814DCEC.key | Bin 0 -> 797 bytes .../F4C5EFD5779BE892CAFD5B721D68DED677C9B151.key | Bin 0 -> 841 bytes test/data/mml-sec/pubring.gpg | Bin 0 -> 13883 bytes test/data/mml-sec/pubring.kbx | Bin 0 -> 3076 bytes test/data/mml-sec/random_seed | Bin 0 -> 600 bytes test/data/mml-sec/secring.gpg | Bin 0 -> 17362 bytes test/data/mml-sec/trustdb.gpg | Bin 0 -> 1880 bytes test/data/mml-sec/trustlist.txt | 26 + test/lisp/gnus/mml-sec-tests.el | 859 +++++++++++++++++++++ 36 files changed, 890 insertions(+) create mode 100644 test/data/mml-sec/.gpg-v21-migrated create mode 100644 test/data/mml-sec/gpg-agent.conf create mode 100644 test/data/mml-sec/private-keys-v1.d/02089CDDC6DFE93B8EA10D9E876F983E61FEC476.key create mode 100644 test/data/mml-sec/private-keys-v1.d/171B444DE92BEF997229000D9784118A94EEC1C9.key create mode 100644 test/data/mml-sec/private-keys-v1.d/19FFEBC04DF3E037E16F6A4474DCB7984406975D.key create mode 100644 test/data/mml-sec/private-keys-v1.d/1E36D27DF9DAB96302D35268DADC5CE73EF45A2A.key create mode 100644 test/data/mml-sec/private-keys-v1.d/293109315BE584AB2EFEFCFCAD64666221D8B36C.key create mode 100644 test/data/mml-sec/private-keys-v1.d/335689599E1C0F66D73ADCF51E03EE36C97D121F.key create mode 100644 test/data/mml-sec/private-keys-v1.d/40BF94E540E3726CB150A1ADF7C1B514444B3FA6.key create mode 100644 test/data/mml-sec/private-keys-v1.d/515D4637EFC6C09DB1F78BE8C2F2A3D63E7756C3.key create mode 100644 test/data/mml-sec/private-keys-v1.d/5A11B1935C46D0B227A73978DCA1293A85604F1D.key create mode 100644 test/data/mml-sec/private-keys-v1.d/62643CEBC7AEBE6817577A34399483700D76BD64.key create mode 100644 test/data/mml-sec/private-keys-v1.d/680D01F368916A0021C14E3453B27B3C5F900683.key create mode 100644 test/data/mml-sec/private-keys-v1.d/6DF2D9DF7AED06F0524BEB642DF0FB48EFDBDB93.key create mode 100644 test/data/mml-sec/private-keys-v1.d/78C17E134E86E691297F7B719B2F2CDF41976234.key create mode 100644 test/data/mml-sec/private-keys-v1.d/7F714F4D9D9676638214991E96D45704E4FFC409.key create mode 100644 test/data/mml-sec/private-keys-v1.d/854752F5D8090CA36EFBDD79C72BDFF6FA2D1FF0.key create mode 100644 test/data/mml-sec/private-keys-v1.d/93FF37C268FDBF0767F5FFDC49409DDAC9388B2C.key create mode 100644 test/data/mml-sec/private-keys-v1.d/A3BA94EAE83509CC90DB1B77B54A51959D8DABEA.key create mode 100644 test/data/mml-sec/private-keys-v1.d/A73E9D01F0465B518E8E7D5AD529077AAC1603B4.key create mode 100644 test/data/mml-sec/private-keys-v1.d/AE6A24B17A8D0CAF9B7E000AA77F0B41D7BFFFCF.key create mode 100644 test/data/mml-sec/private-keys-v1.d/C072AF82DCCCB9A7F1B85FFA10B802DC4ED16703.key create mode 100644 test/data/mml-sec/private-keys-v1.d/C43E1A079B28DFAEBB39CBA01793BDE11EF4B490.key create mode 100644 test/data/mml-sec/private-keys-v1.d/C67DAD345455EAD6D51368008FC3A53B8D195B5A.key create mode 100644 test/data/mml-sec/private-keys-v1.d/CB5E00CE582C2645D2573FC16B2F14F85A7F47AA.key create mode 100644 test/data/mml-sec/private-keys-v1.d/CC68630A06B048F5A91136C162C7A3273E20DE6F.key create mode 100644 test/data/mml-sec/private-keys-v1.d/E7E73903E1BF93481DE0E7C9769D6C31E1863CFF.key create mode 100644 test/data/mml-sec/private-keys-v1.d/F0117468BE801ED4B81972E159A98FDD4814DCEC.key create mode 100644 test/data/mml-sec/private-keys-v1.d/F4C5EFD5779BE892CAFD5B721D68DED677C9B151.key create mode 100644 test/data/mml-sec/pubring.gpg create mode 100644 test/data/mml-sec/pubring.kbx create mode 100644 test/data/mml-sec/random_seed create mode 100644 test/data/mml-sec/secring.gpg create mode 100644 test/data/mml-sec/trustdb.gpg create mode 100644 test/data/mml-sec/trustlist.txt create mode 100644 test/lisp/gnus/mml-sec-tests.el diff --git a/test/data/mml-sec/.gpg-v21-migrated b/test/data/mml-sec/.gpg-v21-migrated new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/data/mml-sec/gpg-agent.conf b/test/data/mml-sec/gpg-agent.conf new file mode 100644 index 00000000000..20192990caf --- /dev/null +++ b/test/data/mml-sec/gpg-agent.conf @@ -0,0 +1,5 @@ +# pinentry-program /usr/bin/pinentry-gtk-2 + +# verbose +# log-file /tmp/gpg-agent.log +# debug-all diff --git a/test/data/mml-sec/private-keys-v1.d/02089CDDC6DFE93B8EA10D9E876F983E61FEC476.key b/test/data/mml-sec/private-keys-v1.d/02089CDDC6DFE93B8EA10D9E876F983E61FEC476.key new file mode 100644 index 00000000000..58fd0b5edbc Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/02089CDDC6DFE93B8EA10D9E876F983E61FEC476.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/171B444DE92BEF997229000D9784118A94EEC1C9.key b/test/data/mml-sec/private-keys-v1.d/171B444DE92BEF997229000D9784118A94EEC1C9.key new file mode 100644 index 00000000000..62f4ab25a69 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/171B444DE92BEF997229000D9784118A94EEC1C9.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/19FFEBC04DF3E037E16F6A4474DCB7984406975D.key b/test/data/mml-sec/private-keys-v1.d/19FFEBC04DF3E037E16F6A4474DCB7984406975D.key new file mode 100644 index 00000000000..2a8ce135fb2 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/19FFEBC04DF3E037E16F6A4474DCB7984406975D.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/1E36D27DF9DAB96302D35268DADC5CE73EF45A2A.key b/test/data/mml-sec/private-keys-v1.d/1E36D27DF9DAB96302D35268DADC5CE73EF45A2A.key new file mode 100644 index 00000000000..9f8de71c5e2 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/1E36D27DF9DAB96302D35268DADC5CE73EF45A2A.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/293109315BE584AB2EFEFCFCAD64666221D8B36C.key b/test/data/mml-sec/private-keys-v1.d/293109315BE584AB2EFEFCFCAD64666221D8B36C.key new file mode 100644 index 00000000000..6e4a4e548fd Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/293109315BE584AB2EFEFCFCAD64666221D8B36C.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/335689599E1C0F66D73ADCF51E03EE36C97D121F.key b/test/data/mml-sec/private-keys-v1.d/335689599E1C0F66D73ADCF51E03EE36C97D121F.key new file mode 100644 index 00000000000..cff58edaa89 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/335689599E1C0F66D73ADCF51E03EE36C97D121F.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/40BF94E540E3726CB150A1ADF7C1B514444B3FA6.key b/test/data/mml-sec/private-keys-v1.d/40BF94E540E3726CB150A1ADF7C1B514444B3FA6.key new file mode 100644 index 00000000000..14af8662f79 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/40BF94E540E3726CB150A1ADF7C1B514444B3FA6.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/515D4637EFC6C09DB1F78BE8C2F2A3D63E7756C3.key b/test/data/mml-sec/private-keys-v1.d/515D4637EFC6C09DB1F78BE8C2F2A3D63E7756C3.key new file mode 100644 index 00000000000..207a7237d3a Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/515D4637EFC6C09DB1F78BE8C2F2A3D63E7756C3.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/5A11B1935C46D0B227A73978DCA1293A85604F1D.key b/test/data/mml-sec/private-keys-v1.d/5A11B1935C46D0B227A73978DCA1293A85604F1D.key new file mode 100644 index 00000000000..85ca78da04d Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/5A11B1935C46D0B227A73978DCA1293A85604F1D.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/62643CEBC7AEBE6817577A34399483700D76BD64.key b/test/data/mml-sec/private-keys-v1.d/62643CEBC7AEBE6817577A34399483700D76BD64.key new file mode 100644 index 00000000000..79f3cd2b841 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/62643CEBC7AEBE6817577A34399483700D76BD64.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/680D01F368916A0021C14E3453B27B3C5F900683.key b/test/data/mml-sec/private-keys-v1.d/680D01F368916A0021C14E3453B27B3C5F900683.key new file mode 100644 index 00000000000..776ddf7e9e2 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/680D01F368916A0021C14E3453B27B3C5F900683.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/6DF2D9DF7AED06F0524BEB642DF0FB48EFDBDB93.key b/test/data/mml-sec/private-keys-v1.d/6DF2D9DF7AED06F0524BEB642DF0FB48EFDBDB93.key new file mode 100644 index 00000000000..2b464f0ccbe Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/6DF2D9DF7AED06F0524BEB642DF0FB48EFDBDB93.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/78C17E134E86E691297F7B719B2F2CDF41976234.key b/test/data/mml-sec/private-keys-v1.d/78C17E134E86E691297F7B719B2F2CDF41976234.key new file mode 100644 index 00000000000..28a07668b21 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/78C17E134E86E691297F7B719B2F2CDF41976234.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/7F714F4D9D9676638214991E96D45704E4FFC409.key b/test/data/mml-sec/private-keys-v1.d/7F714F4D9D9676638214991E96D45704E4FFC409.key new file mode 100644 index 00000000000..137659693bd Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/7F714F4D9D9676638214991E96D45704E4FFC409.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/854752F5D8090CA36EFBDD79C72BDFF6FA2D1FF0.key b/test/data/mml-sec/private-keys-v1.d/854752F5D8090CA36EFBDD79C72BDFF6FA2D1FF0.key new file mode 100644 index 00000000000..c99824ccd43 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/854752F5D8090CA36EFBDD79C72BDFF6FA2D1FF0.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/93FF37C268FDBF0767F5FFDC49409DDAC9388B2C.key b/test/data/mml-sec/private-keys-v1.d/93FF37C268FDBF0767F5FFDC49409DDAC9388B2C.key new file mode 100644 index 00000000000..49c2dc58bd8 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/93FF37C268FDBF0767F5FFDC49409DDAC9388B2C.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/A3BA94EAE83509CC90DB1B77B54A51959D8DABEA.key b/test/data/mml-sec/private-keys-v1.d/A3BA94EAE83509CC90DB1B77B54A51959D8DABEA.key new file mode 100644 index 00000000000..ca128408952 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/A3BA94EAE83509CC90DB1B77B54A51959D8DABEA.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/A73E9D01F0465B518E8E7D5AD529077AAC1603B4.key b/test/data/mml-sec/private-keys-v1.d/A73E9D01F0465B518E8E7D5AD529077AAC1603B4.key new file mode 100644 index 00000000000..3f14b40927a Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/A73E9D01F0465B518E8E7D5AD529077AAC1603B4.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/AE6A24B17A8D0CAF9B7E000AA77F0B41D7BFFFCF.key b/test/data/mml-sec/private-keys-v1.d/AE6A24B17A8D0CAF9B7E000AA77F0B41D7BFFFCF.key new file mode 100644 index 00000000000..06adc06c427 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/AE6A24B17A8D0CAF9B7E000AA77F0B41D7BFFFCF.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/C072AF82DCCCB9A7F1B85FFA10B802DC4ED16703.key b/test/data/mml-sec/private-keys-v1.d/C072AF82DCCCB9A7F1B85FFA10B802DC4ED16703.key new file mode 100644 index 00000000000..cf9a60d233b Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/C072AF82DCCCB9A7F1B85FFA10B802DC4ED16703.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/C43E1A079B28DFAEBB39CBA01793BDE11EF4B490.key b/test/data/mml-sec/private-keys-v1.d/C43E1A079B28DFAEBB39CBA01793BDE11EF4B490.key new file mode 100644 index 00000000000..0ed35172fe0 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/C43E1A079B28DFAEBB39CBA01793BDE11EF4B490.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/C67DAD345455EAD6D51368008FC3A53B8D195B5A.key b/test/data/mml-sec/private-keys-v1.d/C67DAD345455EAD6D51368008FC3A53B8D195B5A.key new file mode 100644 index 00000000000..090059d9e81 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/C67DAD345455EAD6D51368008FC3A53B8D195B5A.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/CB5E00CE582C2645D2573FC16B2F14F85A7F47AA.key b/test/data/mml-sec/private-keys-v1.d/CB5E00CE582C2645D2573FC16B2F14F85A7F47AA.key new file mode 100644 index 00000000000..9061f675121 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/CB5E00CE582C2645D2573FC16B2F14F85A7F47AA.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/CC68630A06B048F5A91136C162C7A3273E20DE6F.key b/test/data/mml-sec/private-keys-v1.d/CC68630A06B048F5A91136C162C7A3273E20DE6F.key new file mode 100644 index 00000000000..89f6013100d Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/CC68630A06B048F5A91136C162C7A3273E20DE6F.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/E7E73903E1BF93481DE0E7C9769D6C31E1863CFF.key b/test/data/mml-sec/private-keys-v1.d/E7E73903E1BF93481DE0E7C9769D6C31E1863CFF.key new file mode 100644 index 00000000000..41dac37574e Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/E7E73903E1BF93481DE0E7C9769D6C31E1863CFF.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/F0117468BE801ED4B81972E159A98FDD4814DCEC.key b/test/data/mml-sec/private-keys-v1.d/F0117468BE801ED4B81972E159A98FDD4814DCEC.key new file mode 100644 index 00000000000..5df7b4a5953 Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/F0117468BE801ED4B81972E159A98FDD4814DCEC.key differ diff --git a/test/data/mml-sec/private-keys-v1.d/F4C5EFD5779BE892CAFD5B721D68DED677C9B151.key b/test/data/mml-sec/private-keys-v1.d/F4C5EFD5779BE892CAFD5B721D68DED677C9B151.key new file mode 100644 index 00000000000..03daf80975b Binary files /dev/null and b/test/data/mml-sec/private-keys-v1.d/F4C5EFD5779BE892CAFD5B721D68DED677C9B151.key differ diff --git a/test/data/mml-sec/pubring.gpg b/test/data/mml-sec/pubring.gpg new file mode 100644 index 00000000000..6bd169963df Binary files /dev/null and b/test/data/mml-sec/pubring.gpg differ diff --git a/test/data/mml-sec/pubring.kbx b/test/data/mml-sec/pubring.kbx new file mode 100644 index 00000000000..399a0414fd2 Binary files /dev/null and b/test/data/mml-sec/pubring.kbx differ diff --git a/test/data/mml-sec/random_seed b/test/data/mml-sec/random_seed new file mode 100644 index 00000000000..530fd76c1e5 Binary files /dev/null and b/test/data/mml-sec/random_seed differ diff --git a/test/data/mml-sec/secring.gpg b/test/data/mml-sec/secring.gpg new file mode 100644 index 00000000000..b323c072c04 Binary files /dev/null and b/test/data/mml-sec/secring.gpg differ diff --git a/test/data/mml-sec/trustdb.gpg b/test/data/mml-sec/trustdb.gpg new file mode 100644 index 00000000000..09ebd8db114 Binary files /dev/null and b/test/data/mml-sec/trustdb.gpg differ diff --git a/test/data/mml-sec/trustlist.txt b/test/data/mml-sec/trustlist.txt new file mode 100644 index 00000000000..f886572d283 --- /dev/null +++ b/test/data/mml-sec/trustlist.txt @@ -0,0 +1,26 @@ +# This is the list of trusted keys. Comment lines, like this one, as +# well as empty lines are ignored. Lines have a length limit but this +# is not a serious limitation as the format of the entries is fixed and +# checked by gpg-agent. A non-comment line starts with optional white +# space, followed by the SHA-1 fingerpint in hex, followed by a flag +# which may be one of 'P', 'S' or '*' and optionally followed by a list of +# other flags. The fingerprint may be prefixed with a '!' to mark the +# key as not trusted. You should give the gpg-agent a HUP or run the +# command "gpgconf --reload gpg-agent" after changing this file. + + +# Include the default trust list +include-default + + +# CN=No Expiry +D0:6A:A1:18:65:3C:C3:8E:9D:0C:AF:56:ED:7A:21:35:E1:58:21:77 S relax + +# CN=Second Key Pair +0E:58:22:9B:80:EE:33:95:9F:F7:18:FE:EF:25:40:2B:47:9D:C6:E2 S relax + +# CN=No Expiry two UIDs +D4:CA:78:E1:47:0B:9F:C2:AE:45:D7:84:64:9B:8C:E6:4E:BB:32:0C S relax + +# CN=Different subkeys +4F:96:2A:B7:F4:76:61:6A:78:3D:72:AA:40:35:D5:9B:5F:88:E9:FC S relax diff --git a/test/lisp/gnus/mml-sec-tests.el b/test/lisp/gnus/mml-sec-tests.el new file mode 100644 index 00000000000..28be3b9bd46 --- /dev/null +++ b/test/lisp/gnus/mml-sec-tests.el @@ -0,0 +1,859 @@ +;;; gnustest-mml-sec.el --- Tests mml-sec.el, see README-mml-secure.txt. +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Author: Jens Lechtenbörger + +;; This file is not 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, 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 'message) +(require 'epa) +(require 'epg) +(require 'mml-sec) +(require 'gnus-sum) + +(defvar with-smime nil + "If nil, exclude S/MIME from tests as passphrases need to entered manually. +Mostly, the empty passphrase is used. However, the keys for + \"No Expiry two UIDs\" have the passphrase \"Passphrase\" (for OpenPGP as well + as S/MIME).") + +(defun enc-standards () + (if with-smime '(enc-pgp enc-pgp-mime enc-smime) + '(enc-pgp enc-pgp-mime))) +(defun enc-sign-standards () + (if with-smime + '(enc-sign-pgp enc-sign-pgp-mime enc-sign-smime) + '(enc-sign-pgp enc-sign-pgp-mime))) +(defun sign-standards () + (if with-smime + '(sign-pgp sign-pgp-mime sign-smime) + '(sign-pgp sign-pgp-mime))) + +(defun mml-secure-test-fixture (body &optional interactive) + "Setup GnuPG home containing test keys and prepare environment for BODY. +If optional INTERACTIVE is non-nil, allow questions to the user in case of +key problems. +This fixture temporarily unsets GPG_AGENT_INFO to enable passphrase tests, +which will neither work with gpgsm nor GnuPG 2.1 any longer, I guess. +Actually, I'm not sure why people would want to cache passwords in Emacs +instead of gpg-agent." + (unwind-protect + (let ((agent-info (getenv "GPG_AGENT_INFO")) + (gpghome (getenv "GNUPGHOME"))) + (condition-case error + (let ((epg-gpg-home-directory + (expand-file-name "test/data/mml-sec" source-directory)) + (mml-secure-allow-signing-with-unknown-recipient t) + (mml-smime-use 'epg) + ;; Create debug output in empty epg-debug-buffer. + (epg-debug t) + (epg-debug-buffer (get-buffer-create " *epg-test*")) + (mml-secure-fail-when-key-problem (not interactive))) + (with-current-buffer epg-debug-buffer + (erase-buffer)) + ;; Unset GPG_AGENT_INFO to enable passphrase caching inside Emacs. + ;; Just for testing. Jens does not recommend this for daily use. + (setenv "GPG_AGENT_INFO") + ;; Set GNUPGHOME as gpg-agent started by gpgsm does + ;; not look in the proper places otherwise, see: + ;; https://bugs.gnupg.org/gnupg/issue2126 + (setenv "GNUPGHOME" epg-gpg-home-directory) + (funcall body)) + (error + (setenv "GPG_AGENT_INFO" agent-info) + (setenv "GNUPGHOME" gpghome) + (signal (car error) (cdr error)))) + (setenv "GPG_AGENT_INFO" agent-info) + (setenv "GNUPGHOME" gpghome)))) + +(defun mml-secure-test-message-setup (method to from &optional text bcc) + "Setup a buffer with MML METHOD, TO, and FROM headers. +Optionally, a message TEXT and BCC header can be passed." + (with-temp-buffer + (when bcc (insert (format "Bcc: %s\n" bcc))) + (insert (format "To: %s +From: %s +Subject: Test +%s\n" to from mail-header-separator)) + (if text + (insert (format "%s" text)) + (spook)) + (cond ((eq method 'enc-pgp-mime) + (mml-secure-message-encrypt-pgpmime 'nosig)) + ((eq method 'enc-sign-pgp-mime) + (mml-secure-message-encrypt-pgpmime)) + ((eq method 'enc-pgp) (mml-secure-message-encrypt-pgp 'nosig)) + ((eq method 'enc-sign-pgp) (mml-secure-message-encrypt-pgp)) + ((eq method 'enc-smime) (mml-secure-message-encrypt-smime 'nosig)) + ((eq method 'enc-sign-smime) (mml-secure-message-encrypt-smime)) + ((eq method 'sign-pgp-mime) (mml-secure-message-sign-pgpmime)) + ((eq method 'sign-pgp) (mml-secure-message-sign-pgp)) + ((eq method 'sign-smime) (mml-secure-message-sign-smime)) + (t (error "Unknown method"))) + (buffer-string))) + +(defun mml-secure-test-mail-fixture (method to from body2 + &optional interactive) + "Setup buffer encrypted using METHOD for TO from FROM, call BODY2. +Pass optional INTERACTIVE to mml-secure-test-fixture." + (mml-secure-test-fixture + (lambda () + (let ((context (if (memq method '(enc-smime enc-sign-smime sign-smime)) + (epg-make-context 'CMS) + (epg-make-context 'OpenPGP))) + ;; Verify and decrypt by default. + (mm-verify-option 'known) + (mm-decrypt-option 'known) + (plaintext "The Magic Words are Squeamish Ossifrage")) + (with-temp-buffer + (insert (mml-secure-test-message-setup method to from plaintext)) + (message-options-set-recipient) + (message-encode-message-body) + ;; Replace separator line with newline. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + ;; The following treatment of handles, plainbuf, and multipart + ;; resulted from trial-and-error. + ;; Someone with more knowledge on how to decrypt messages and verify + ;; signatures might know more appropriate functions to invoke + ;; instead. + (let* ((handles (or (mm-dissect-buffer) + (mm-uu-dissect))) + (isplain (bufferp (car handles))) + (ismultipart (equal (car handles) "multipart/mixed")) + (plainbuf (if isplain + (car handles) + (if ismultipart + (car (cadadr handles)) + (caadr handles)))) + (decrypted + (with-current-buffer plainbuf (buffer-string))) + (gnus-info + (if isplain + nil + (if ismultipart + (or (mm-handle-multipart-ctl-parameter + (cadr handles) 'gnus-details) + (mm-handle-multipart-ctl-parameter + (cadr handles) 'gnus-info)) + (mm-handle-multipart-ctl-parameter + handles 'gnus-info))))) + (funcall body2 gnus-info plaintext decrypted))))) + interactive)) + +;; TODO If the variable BODY3 is renamed to BODY, an infinite recursion +;; occurs. Emacs bug? +(defun mml-secure-test-key-fixture (body3) + "Customize unique keys for sub@example.org and call BODY3. +For OpenPGP, we have: +- 1E6B FA97 3D9E 3103 B77F D399 C399 9CF1 268D BEA2 + uid Different subkeys +- 1463 2ECA B9E2 2736 9C8D D97B F7E7 9AB7 AE31 D471 + uid Second Key Pair + +For S/MIME: + ID: 0x479DC6E2 + Subject: /CN=Second Key Pair + aka: sub@example.org + fingerprint: 0E:58:22:9B:80:EE:33:95:9F:F7:18:FE:EF:25:40:2B:47:9D:C6:E2 + + ID: 0x5F88E9FC + Subject: /CN=Different subkeys + aka: sub@example.org + fingerprint: 4F:96:2A:B7:F4:76:61:6A:78:3D:72:AA:40:35:D5:9B:5F:88:E9:FC + +In both cases, the first key is customized for signing and encryption." + (mml-secure-test-fixture + (lambda () + (let* ((mml-secure-key-preferences + '((OpenPGP (sign) (encrypt)) (CMS (sign) (encrypt)))) + (pcontext (epg-make-context 'OpenPGP)) + (pkey (epg-list-keys pcontext "C3999CF1268DBEA2")) + (scontext (epg-make-context 'CMS)) + (skey (epg-list-keys scontext "0x479DC6E2"))) + (mml-secure-cust-record-keys pcontext 'encrypt "sub@example.org" pkey) + (mml-secure-cust-record-keys pcontext 'sign "sub@example.org" pkey) + (mml-secure-cust-record-keys scontext 'encrypt "sub@example.org" skey) + (mml-secure-cust-record-keys scontext 'sign "sub@example.org" skey) + (funcall body3))))) + +(ert-deftest mml-secure-key-checks () + "Test mml-secure-check-user-id and mml-secure-check-sub-key on sample keys." + (mml-secure-test-fixture + (lambda () + (let* ((context (epg-make-context 'OpenPGP)) + (keys1 (epg-list-keys context "expired@example.org")) + (keys2 (epg-list-keys context "no-exp@example.org")) + (keys3 (epg-list-keys context "sub@example.org")) + (keys4 (epg-list-keys context "revoked-uid@example.org")) + (keys5 (epg-list-keys context "disabled@example.org")) + (keys6 (epg-list-keys context "sign@example.org")) + (keys7 (epg-list-keys context "jens.lechtenboerger@fsfe")) + ) + (should (and (= 1 (length keys1)) (= 1 (length keys2)) + (= 2 (length keys3)) + (= 1 (length keys4)) (= 1 (length keys5)) + )) + ;; key1 is expired + (should-not (mml-secure-check-user-id (car keys1) "expired@example.org")) + (should-not (mml-secure-check-sub-key context (car keys1) 'encrypt)) + (should-not (mml-secure-check-sub-key context (car keys1) 'sign)) + + ;; key2 does not expire, but does not have the UID expired@example.org + (should-not (mml-secure-check-user-id (car keys2) "expired@example.org")) + (should (mml-secure-check-user-id (car keys2) "no-exp@example.org")) + (should (mml-secure-check-sub-key context (car keys2) 'encrypt)) + (should (mml-secure-check-sub-key context (car keys2) 'sign)) + + ;; Two keys exist for sub@example.org. + (should (mml-secure-check-user-id (car keys3) "sub@example.org")) + (should (mml-secure-check-sub-key context (car keys3) 'encrypt)) + (should (mml-secure-check-sub-key context (car keys3) 'sign)) + (should (mml-secure-check-user-id (cadr keys3) "sub@example.org")) + (should (mml-secure-check-sub-key context (cadr keys3) 'encrypt)) + (should (mml-secure-check-sub-key context (cadr keys3) 'sign)) + + ;; The UID revoked-uid@example.org is revoked. The key itself is + ;; usable, though (with the UID sub@example.org). + (should-not + (mml-secure-check-user-id (car keys4) "revoked-uid@example.org")) + (should (mml-secure-check-sub-key context (car keys4) 'encrypt)) + (should (mml-secure-check-sub-key context (car keys4) 'sign)) + (should (mml-secure-check-user-id (car keys4) "sub@example.org")) + + ;; The next key is disabled and, thus, unusable. + (should (mml-secure-check-user-id (car keys5) "disabled@example.org")) + (should-not (mml-secure-check-sub-key context (car keys5) 'encrypt)) + (should-not (mml-secure-check-sub-key context (car keys5) 'sign)) + + ;; The next key has multiple subkeys. + ;; 42466F0F is valid sign subkey, 501FFD98 is expired + (should (mml-secure-check-sub-key context (car keys6) 'sign "42466F0F")) + (should-not + (mml-secure-check-sub-key context (car keys6) 'sign "501FFD98")) + ;; DC7F66E7 is encrypt subkey + (should + (mml-secure-check-sub-key context (car keys6) 'encrypt "DC7F66E7")) + (should-not + (mml-secure-check-sub-key context (car keys6) 'sign "DC7F66E7")) + (should-not + (mml-secure-check-sub-key context (car keys6) 'encrypt "42466F0F")) + + ;; The final key is just a public key. + (should (mml-secure-check-sub-key context (car keys7) 'encrypt)) + (should-not (mml-secure-check-sub-key context (car keys7) 'sign)) + )))) + +(ert-deftest mml-secure-find-usable-keys-1 () + "Make sure that expired and disabled keys and revoked UIDs are not used." + (mml-secure-test-fixture + (lambda () + (let ((context (epg-make-context 'OpenPGP))) + (should-not + (mml-secure-find-usable-keys context "expired@example.org" 'encrypt)) + (should-not + (mml-secure-find-usable-keys context "expired@example.org" 'sign)) + + (should-not + (mml-secure-find-usable-keys context "disabled@example.org" 'encrypt)) + (should-not + (mml-secure-find-usable-keys context "disabled@example.org" 'sign)) + + (should-not + (mml-secure-find-usable-keys + context "" 'encrypt)) + (should-not + (mml-secure-find-usable-keys + context "" 'sign)) + ;; Same test without ankles. Will fail for Ma Gnus v0.14 and earlier. + (should-not + (mml-secure-find-usable-keys + context "revoked-uid@example.org" 'encrypt)) + + ;; Expired key should not be usable. + ;; Will fail for Ma Gnus v0.14 and earlier. + ;; sign@example.org has the expired subkey 0x501FFD98. + (should-not + (mml-secure-find-usable-keys context "0x501FFD98" 'sign)) + + (should + (mml-secure-find-usable-keys context "no-exp@example.org" 'encrypt)) + (should + (mml-secure-find-usable-keys context "no-exp@example.org" 'sign)) + )))) + +(ert-deftest mml-secure-find-usable-keys-2 () + "Test different ways to search for keys." + (mml-secure-test-fixture + (lambda () + (let ((context (epg-make-context 'OpenPGP))) + ;; Plain substring search is not supported. + (should + (= 0 (length + (mml-secure-find-usable-keys context "No Expiry" 'encrypt)))) + (should + (= 0 (length + (mml-secure-find-usable-keys context "No Expiry" 'sign)))) + + ;; Search for e-mail addresses works with and without ankle brackets. + (should + (= 1 (length (mml-secure-find-usable-keys + context "" 'encrypt)))) + (should + (= 1 (length (mml-secure-find-usable-keys + context "" 'sign)))) + (should + (= 1 (length (mml-secure-find-usable-keys + context "no-exp@example.org" 'encrypt)))) + (should + (= 1 (length (mml-secure-find-usable-keys + context "no-exp@example.org" 'sign)))) + + ;; Use full UID string. + (should + (= 1 (length (mml-secure-find-usable-keys + context "No Expiry " 'encrypt)))) + (should + (= 1 (length (mml-secure-find-usable-keys + context "No Expiry " 'sign)))) + + ;; If just the public key is present, only encryption is possible. + ;; Search works with key IDs, with and without prefix "0x". + (should + (= 1 (length (mml-secure-find-usable-keys + context "A142FD84" 'encrypt)))) + (should + (= 1 (length (mml-secure-find-usable-keys + context "0xA142FD84" 'encrypt)))) + (should + (= 0 (length (mml-secure-find-usable-keys + context "A142FD84" 'sign)))) + (should + (= 0 (length (mml-secure-find-usable-keys + context "0xA142FD84" 'sign)))) + )))) + +(ert-deftest mml-secure-select-preferred-keys-1 () + "If only one key exists for an e-mail address, it is the preferred one." + (mml-secure-test-fixture + (lambda () + (let ((context (epg-make-context 'OpenPGP))) + (should (equal "832F3CC6518D37BC658261B802372A42CA6D40FB" + (mml-secure-fingerprint + (car (mml-secure-select-preferred-keys + context '("no-exp@example.org") 'encrypt))))))))) + +(ert-deftest mml-secure-select-preferred-keys-2 () + "If multiple keys exists for an e-mail address, customization is necessary." + (mml-secure-test-fixture + (lambda () + (let* ((context (epg-make-context 'OpenPGP)) + (mml-secure-key-preferences + '((OpenPGP (sign) (encrypt)) (CMS (sign) (encrypt)))) + (pref (car (mml-secure-find-usable-keys + context "sub@example.org" 'encrypt)))) + (should-error (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)) + (mml-secure-cust-record-keys + context 'encrypt "sub@example.org" (list pref)) + (should (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)) + (should-error (mml-secure-select-preferred-keys + context '("sub@example.org") 'sign)) + (should (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)) + (should + (equal (list (mml-secure-fingerprint pref)) + (mml-secure-cust-fpr-lookup context 'encrypt "sub@example.org"))) + (should (mml-secure-cust-remove-keys context 'encrypt "sub@example.org")) + (should-error (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)))))) + +(ert-deftest mml-secure-select-preferred-keys-3 () + "Expired customized keys are removed if multiple keys are available." + (mml-secure-test-fixture + (lambda () + (let ((context (epg-make-context 'OpenPGP)) + (mml-secure-key-preferences + '((OpenPGP (sign) (encrypt)) (CMS (sign) (encrypt))))) + ;; sub@example.org has two keys (268DBEA2, AE31D471). + ;; Normal preference works. + (mml-secure-cust-record-keys + context 'encrypt "sub@example.org" (epg-list-keys context "268DBEA2")) + (should (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)) + (mml-secure-cust-remove-keys context 'encrypt "sub@example.org") + + ;; Fake preference for expired (unrelated) key CE15FAE7, + ;; results in error (and automatic removal of outdated preference). + (mml-secure-cust-record-keys + context 'encrypt "sub@example.org" (epg-list-keys context "CE15FAE7")) + (should-error (mml-secure-select-preferred-keys + context '("sub@example.org") 'encrypt)) + (should-not + (mml-secure-cust-remove-keys context 'encrypt "sub@example.org")))))) + +(ert-deftest mml-secure-select-preferred-keys-4 () + "Multiple keys can be recorded per recipient or signature." + (mml-secure-test-fixture + (lambda () + (let ((pcontext (epg-make-context 'OpenPGP)) + (scontext (epg-make-context 'CMS)) + (pkeys '("1E6BFA973D9E3103B77FD399C3999CF1268DBEA2" + "14632ECAB9E227369C8DD97BF7E79AB7AE31D471")) + (skeys '("0x5F88E9FC" "0x479DC6E2")) + (mml-secure-key-preferences + '((OpenPGP (sign) (encrypt)) (CMS (sign) (encrypt))))) + + ;; OpenPGP preferences via pcontext + (dolist (key pkeys nil) + (mml-secure-cust-record-keys + pcontext 'encrypt "sub@example.org" (epg-list-keys pcontext key)) + (mml-secure-cust-record-keys + pcontext 'sign "sub@example.org" (epg-list-keys pcontext key 'secret))) + (let ((p-e-fprs (mml-secure-cust-fpr-lookup + pcontext 'encrypt "sub@example.org")) + (p-s-fprs (mml-secure-cust-fpr-lookup + pcontext 'sign "sub@example.org"))) + (should (= 2 (length p-e-fprs))) + (should (= 2 (length p-s-fprs))) + (should (member "1E6BFA973D9E3103B77FD399C3999CF1268DBEA2" p-e-fprs)) + (should (member "14632ECAB9E227369C8DD97BF7E79AB7AE31D471" p-e-fprs)) + (should (member "1E6BFA973D9E3103B77FD399C3999CF1268DBEA2" p-s-fprs)) + (should (member "14632ECAB9E227369C8DD97BF7E79AB7AE31D471" p-s-fprs))) + ;; Duplicate record does not change anything. + (mml-secure-cust-record-keys + pcontext 'encrypt "sub@example.org" + (epg-list-keys pcontext "1E6BFA973D9E3103B77FD399C3999CF1268DBEA2")) + (mml-secure-cust-record-keys + pcontext 'sign "sub@example.org" + (epg-list-keys pcontext "1E6BFA973D9E3103B77FD399C3999CF1268DBEA2")) + (let ((p-e-fprs (mml-secure-cust-fpr-lookup + pcontext 'encrypt "sub@example.org")) + (p-s-fprs (mml-secure-cust-fpr-lookup + pcontext 'sign "sub@example.org"))) + (should (= 2 (length p-e-fprs))) + (should (= 2 (length p-s-fprs)))) + + ;; S/MIME preferences via scontext + (dolist (key skeys nil) + (mml-secure-cust-record-keys + scontext 'encrypt "sub@example.org" + (epg-list-keys scontext key)) + (mml-secure-cust-record-keys + scontext 'sign "sub@example.org" + (epg-list-keys scontext key 'secret))) + (let ((s-e-fprs (mml-secure-cust-fpr-lookup + scontext 'encrypt "sub@example.org")) + (s-s-fprs (mml-secure-cust-fpr-lookup + scontext 'sign "sub@example.org"))) + (should (= 2 (length s-e-fprs))) + (should (= 2 (length s-s-fprs)))) + )))) + +(defun mml-secure-test-en-decrypt + (method to from + &optional checksig checkplain enc-keys expectfail interactive) + "Encrypt message using METHOD, addressed to TO, from FROM. +If optional CHECKSIG is non-nil, it must be a number, and a signature check is +performed; the number indicates how many signatures are expected. +If optional CHECKPLAIN is non-nil, the expected plaintext should be obtained +via decryption. +If optional ENC-KEYS is non-nil, it is a list of pairs of encryption keys (for +OpenPGP and S/SMIME) expected in `epg-debug-buffer'. +If optional EXPECTFAIL is non-nil, a decryption failure is expected. +Pass optional INTERACTIVE to mml-secure-test-mail-fixture." + (mml-secure-test-mail-fixture method to from + (lambda (gnus-info plaintext decrypted) + (if expectfail + (should-not (equal plaintext decrypted)) + (when checkplain + (should (equal plaintext decrypted))) + (let ((protocol (if (memq method + '(enc-smime enc-sign-smime sign-smime)) + 'CMS + 'OpenPGP))) + (when checksig + (let* ((context (epg-make-context protocol)) + (signer-names (mml-secure-signer-names protocol from)) + (signer-keys (mml-secure-signers context signer-names)) + (signer-fprs (mapcar 'mml-secure-fingerprint signer-keys))) + (should (eq checksig (length signer-fprs))) + (if (eq checksig 0) + ;; First key in keyring + (should (string-match-p + (concat "Good signature from " + (if (eq protocol 'CMS) + "0E58229B80EE33959FF718FEEF25402B479DC6E2" + "02372A42CA6D40FB")) + gnus-info))) + (dolist (fpr signer-fprs nil) + ;; OpenPGP: "Good signature from 02372A42CA6D40FB No Expiry (trust undefined) created ..." + ;; S/MIME: "Good signature from D06AA118653CC38E9D0CAF56ED7A2135E1582177 /CN=No Expiry (trust full) ..." + (should (string-match-p + (concat "Good signature from " + (if (eq protocol 'CMS) + fpr + (substring fpr -16 nil))) + gnus-info))))) + (when enc-keys + (with-current-buffer epg-debug-buffer + (goto-char (point-min)) + ;; The following regexp does not necessarily match at the + ;; start of the line as a path may or may not be present. + ;; Also note that gpg.* matches gpg2 and gpgsm as well. + (let* ((line (concat "gpg.*--encrypt.*$")) + (end (re-search-forward line)) + (match (match-string 0))) + (should (and end match)) + (dolist (pair enc-keys nil) + (let ((fpr (if (eq protocol 'OpenPGP) + (car pair) + (cdr pair)))) + (should (string-match-p (concat "-r " fpr) match)))) + (goto-char (point-max)) + )))))) + interactive)) + +(defun mml-secure-test-en-decrypt-with-passphrase + (method to from checksig jl-passphrase do-cache + &optional enc-keys expectfail) + "Call mml-secure-test-en-decrypt with changed passphrase caching. +Args METHOD, TO, FROM, CHECKSIG are passed to mml-secure-test-en-decrypt. +JL-PASSPHRASE is fixed as return value for `read-passwd', +boolean DO-CACHE determines whether to cache the passphrase. +If optional ENC-KEYS is non-nil, it is a list of encryption keys expected +in `epg-debug-buffer'. +If optional EXPECTFAIL is non-nil, a decryption failure is expected." + (let ((mml-secure-cache-passphrase do-cache) + (mml1991-cache-passphrase do-cache) + (mml2015-cache-passphrase do-cache) + (mml-smime-cache-passphrase do-cache) + ) + (cl-letf (((symbol-function 'read-passwd) + (lambda (prompt &optional confirm default) jl-passphrase))) + (mml-secure-test-en-decrypt method to from checksig t enc-keys expectfail) + ))) + +(ert-deftest mml-secure-en-decrypt-1 () + "Encrypt message; then decrypt and test for expected result. +In this test, the single matching key is chosen automatically." + (dolist (method (enc-standards) nil) + ;; no-exp@example.org with single encryption key + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" nil t + (list (cons "02372A42CA6D40FB" "ED7A2135E1582177"))))) + +(ert-deftest mml-secure-en-decrypt-2 () + "Encrypt message; then decrypt and test for expected result. +In this test, the encryption key needs to fixed among multiple ones." + ;; sub@example.org with multiple candidate keys, + ;; fixture customizes preferred ones. + (mml-secure-test-key-fixture + (lambda () + (dolist (method (enc-standards) nil) + (mml-secure-test-en-decrypt + method "sub@example.org" "no-exp@example.org" nil t + (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2"))))))) + +(ert-deftest mml-secure-en-decrypt-3 () + "Encrypt message; then decrypt and test for expected result. +In this test, encrypt-to-self variables are set to t." + ;; sub@example.org with multiple candidate keys, + ;; fixture customizes preferred ones. + (mml-secure-test-key-fixture + (lambda () + (let ((mml-secure-openpgp-encrypt-to-self t) + (mml-secure-smime-encrypt-to-self t)) + (dolist (method (enc-standards) nil) + (mml-secure-test-en-decrypt + method "sub@example.org" "no-exp@example.org" nil t + (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2") + (cons "02372A42CA6D40FB" "ED7A2135E1582177")))))))) + +(ert-deftest mml-secure-en-decrypt-4 () + "Encrypt message; then decrypt and test for expected result. +In this test, encrypt-to-self variables are set to lists." + ;; Send from sub@example.org, which has two keys; encrypt to both. + (let ((mml-secure-openpgp-encrypt-to-self + '("C3999CF1268DBEA2" "F7E79AB7AE31D471")) + (mml-secure-smime-encrypt-to-self + '("EF25402B479DC6E2" "4035D59B5F88E9FC"))) + (dolist (method (enc-standards) nil) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" nil t + (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2") + (cons "F7E79AB7AE31D471" "4035D59B5F88E9FC")))))) + +(ert-deftest mml-secure-en-decrypt-sign-1 () + "Sign and encrypt message; then decrypt and test for expected result. +In this test, just multiple encryption and signing keys may be available." + (mml-secure-test-key-fixture + (lambda () + (let ((mml-secure-openpgp-sign-with-sender t) + (mml-secure-smime-sign-with-sender t)) + (dolist (method (enc-sign-standards) nil) + ;; no-exp with just one key + (mml-secure-test-en-decrypt + method "no-exp@example.org" "no-exp@example.org" 1 t) + ;; customized choice for encryption key + (mml-secure-test-en-decrypt + method "sub@example.org" "no-exp@example.org" 1 t) + ;; customized choice for signing key + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 1 t) + ;; customized choice for both keys + (mml-secure-test-en-decrypt + method "sub@example.org" "sub@example.org" 1 t) + ) + + ;; Now use both keys to sign. The customized one via sign-with-sender, + ;; the other one via the following setting. + (let ((mml-secure-openpgp-signers '("F7E79AB7AE31D471")) + (mml-secure-smime-signers '("0x5F88E9FC"))) + (dolist (method (enc-sign-standards) nil) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 2 t) + ))) + + ;; Now use both keys for sub@example.org to sign an e-mail from + ;; a different address (without associated keys). + (let ((mml-secure-openpgp-sign-with-sender nil) + (mml-secure-smime-sign-with-sender nil) + (mml-secure-openpgp-signers + '("F7E79AB7AE31D471" "C3999CF1268DBEA2")) + (mml-secure-smime-signers '("0x5F88E9FC" "0x479DC6E2"))) + (dolist (method (enc-sign-standards) nil) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "no-keys@example.org" 2 t) + ))))) + +(ert-deftest mml-secure-en-decrypt-sign-2 () + "Sign and encrypt message; then decrypt and test for expected result. +In this test, lists of encryption and signing keys are customized." + (mml-secure-test-key-fixture + (lambda () + (let ((mml-secure-key-preferences + '((OpenPGP (sign) (encrypt)) (CMS (sign) (encrypt)))) + (pcontext (epg-make-context 'OpenPGP)) + (scontext (epg-make-context 'CMS)) + (mml-secure-openpgp-sign-with-sender t) + (mml-secure-smime-sign-with-sender t)) + (dolist (key '("F7E79AB7AE31D471" "C3999CF1268DBEA2") nil) + (mml-secure-cust-record-keys + pcontext 'encrypt "sub@example.org" (epg-list-keys pcontext key)) + (mml-secure-cust-record-keys + pcontext 'sign "sub@example.org" (epg-list-keys pcontext key t))) + (dolist (key '("0x5F88E9FC" "0x479DC6E2") nil) + (mml-secure-cust-record-keys + scontext 'encrypt "sub@example.org" (epg-list-keys scontext key)) + (mml-secure-cust-record-keys + scontext 'sign "sub@example.org" (epg-list-keys scontext key t))) + (dolist (method (enc-sign-standards) nil) + ;; customized choice for encryption key + (mml-secure-test-en-decrypt + method "sub@example.org" "no-exp@example.org" 1 t) + ;; customized choice for signing key + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 2 t) + ;; customized choice for both keys + (mml-secure-test-en-decrypt + method "sub@example.org" "sub@example.org" 2 t) + ))))) + +(ert-deftest mml-secure-en-decrypt-sign-3 () + "Sign and encrypt message; then decrypt and test for expected result. +Use sign-with-sender and encrypt-to-self." + (mml-secure-test-key-fixture + (lambda () + (let ((mml-secure-openpgp-sign-with-sender t) + (mml-secure-openpgp-encrypt-to-self t) + (mml-secure-smime-sign-with-sender t) + (mml-secure-smime-encrypt-to-self t)) + (dolist (method (enc-sign-standards) nil) + (mml-secure-test-en-decrypt + method "sub@example.org" "no-exp@example.org" 1 t + (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2") + (cons "02372A42CA6D40FB" "ED7A2135E1582177")))) + )))) + +(ert-deftest mml-secure-sign-verify-1 () + "Sign message with sender; then verify and test for expected result." + (mml-secure-test-key-fixture + (lambda () + (dolist (method (sign-standards) nil) + (let ((mml-secure-openpgp-sign-with-sender t) + (mml-secure-smime-sign-with-sender t)) + ;; A single signing key for sender sub@example.org is customized + ;; in the fixture. + (mml-secure-test-en-decrypt + method "uid1@example.org" "sub@example.org" 1 nil) + + ;; From sub@example.org, sign with two keys; + ;; sign-with-sender and one from signers-variable: + (let ((mml-secure-openpgp-signers '("02372A42CA6D40FB")) + (mml-secure-smime-signers + '("D06AA118653CC38E9D0CAF56ED7A2135E1582177"))) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 2 nil)) + ))))) + +(ert-deftest mml-secure-sign-verify-2 () + "Sign message without sender; then verify and test for expected result." + (mml-secure-test-key-fixture + (lambda () + (dolist (method (sign-standards) nil) + (let ((mml-secure-openpgp-sign-with-sender nil) + (mml-secure-smime-sign-with-sender nil)) + ;; A single signing key for sender sub@example.org is customized + ;; in the fixture, but not used here. + ;; By default, gpg uses the first secret key in the keyring, which + ;; is 02372A42CA6D40FB (OpenPGP) or + ;; 0E58229B80EE33959FF718FEEF25402B479DC6E2 (S/MIME) here. + (mml-secure-test-en-decrypt + method "uid1@example.org" "sub@example.org" 0 nil) + + ;; From sub@example.org, sign with specified key: + (let ((mml-secure-openpgp-signers '("02372A42CA6D40FB")) + (mml-secure-smime-signers + '("D06AA118653CC38E9D0CAF56ED7A2135E1582177"))) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 1 nil)) + + ;; From sub@example.org, sign with different specified key: + (let ((mml-secure-openpgp-signers '("C3999CF1268DBEA2")) + (mml-secure-smime-signers + '("0E58229B80EE33959FF718FEEF25402B479DC6E2"))) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sub@example.org" 1 nil)) + ))))) + +(ert-deftest mml-secure-sign-verify-3 () + "Try to sign message with expired OpenPGP subkey, which raises an error. +With Ma Gnus v0.14 and earlier a signature would be created with a wrong key." + (should-error + (mml-secure-test-key-fixture + (lambda () + (let ((with-smime nil) + (mml-secure-openpgp-sign-with-sender nil) + (mml-secure-openpgp-signers '("501FFD98"))) + (dolist (method (sign-standards) nil) + (mml-secure-test-en-decrypt + method "no-exp@example.org" "sign@example.org" 1 nil) + )))))) + +;; TODO Passphrase passing and caching in Emacs does not seem to work +;; with gpgsm at all. +;; Independently of caching settings, a pinentry dialogue is displayed. +;; Thus, the following tests require the user to enter the correct gpgsm +;; passphrases at the correct points in time. (Either empty string or +;; "Passphrase".) +(ert-deftest mml-secure-en-decrypt-passphrase-cache () + "Encrypt message; then decrypt and test for expected result. +In this test, a key is used that requires the passphrase \"Passphrase\". +In the first decryption this passphrase is hardcoded, in the second one it + is taken from a cache." + (ert-skip "Requires passphrase") + (mml-secure-test-key-fixture + (lambda () + (dolist (method (enc-standards) nil) + (mml-secure-test-en-decrypt-with-passphrase + method "uid1@example.org" "sub@example.org" nil + ;; Beware! For passphrases copy-sequence is necessary, as they may + ;; be erased, which actually changes the function's code and causes + ;; multiple invokations to fail. I was surprised... + (copy-sequence "Passphrase") t) + (mml-secure-test-en-decrypt-with-passphrase + method "uid1@example.org" "sub@example.org" nil + (copy-sequence "Incorrect") t))))) + +(defun mml-secure-en-decrypt-passphrase-no-cache (method) + "Encrypt message with METHOD; then decrypt and test for expected result. +In this test, a key is used that requires the passphrase \"Passphrase\". +In the first decryption this passphrase is hardcoded, but caching disabled. +So the second decryption fails." + (mml-secure-test-key-fixture + (lambda () + (mml-secure-test-en-decrypt-with-passphrase + method "uid1@example.org" "sub@example.org" nil + (copy-sequence "Passphrase") nil) + (mml-secure-test-en-decrypt-with-passphrase + method "uid1@example.org" "sub@example.org" nil + (copy-sequence "Incorrect") nil nil t)))) + +(ert-deftest mml-secure-en-decrypt-passphrase-no-cache-openpgp-todo () + "Passphrase caching with OpenPGP only for GnuPG 1.x." + (skip-unless (string< (cdr (assq 'version (epg-configuration))) "2")) + (mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp) + (mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp-mime)) + +(ert-deftest mml-secure-en-decrypt-passphrase-no-cache-smime-todo () + "Passphrase caching does not work with S/MIME (and gpgsm)." + :expected-result :failed + (if with-smime + (mml-secure-en-decrypt-passphrase-no-cache 'enc-smime) + (should nil))) + + +;; Test truncation of question in y-or-n-p. +(defun mml-secure-select-preferred-keys-todo () + "Manual customization with truncated question." + (mml-secure-test-key-fixture + (lambda () + (mml-secure-test-en-decrypt + 'enc-pgp-mime + "jens.lechtenboerger@informationelle-selbstbestimmung-im-internet.de" + "no-exp@example.org" nil t nil nil t)))) + +(defun mml-secure-select-preferred-keys-ok () + "Manual customization with entire question." + (mml-secure-test-fixture + (lambda () + (mml-secure-select-preferred-keys + (epg-make-context 'OpenPGP) + '("jens.lechtenboerger@informationelle-selbstbestimmung-im-internet.de") + 'encrypt)) + t)) + + +;; ERT entry points +(defun mml-secure-run-tests () + "Run all tests with defaults." + (ert-run-tests-batch)) + +(defun mml-secure-run-tests-with-gpg2 () + "Run all tests with gpg2 instead of gpg." + (let* ((epg-gpg-program "gpg2"); ~/local/gnupg-2.1.9/PLAY/inst/bin/gpg2 + (gpg-version (cdr (assq 'version (epg-configuration)))) + ;; Empty passphrases do not seem to work with gpgsm in 2.1.x: + ;; https://lists.gnupg.org/pipermail/gnupg-users/2015-October/054575.html + (with-smime (string< gpg-version "2.1"))) + (ert-run-tests-batch))) + +(defun mml-secure-run-tests-without-smime () + "Skip S/MIME tests (as they require manual passphrase entry)." + (let ((with-smime nil)) + (ert-run-tests-batch))) + +;;; gnustest-mml-sec.el ends here -- cgit v1.2.3 From 34229d3915f3205324eeab1ade37bb5eccc468b1 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 19:47:06 +0200 Subject: Tweak mml-sec test that sometimes fails * test/lisp/gnus/mml-sec-tests.el (mml-first-secure-en-decrypt-sign-1): mml-secure-en-decrypt-sign-1 fail sometimes, on some machines, unless it's the first test. I'm guessing there's a race condition somewhere in the test, but put it first now to avoid build reports. --- test/lisp/gnus/mml-sec-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lisp/gnus/mml-sec-tests.el b/test/lisp/gnus/mml-sec-tests.el index 28be3b9bd46..50bb6e6b278 100644 --- a/test/lisp/gnus/mml-sec-tests.el +++ b/test/lisp/gnus/mml-sec-tests.el @@ -606,7 +606,7 @@ In this test, encrypt-to-self variables are set to lists." (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2") (cons "F7E79AB7AE31D471" "4035D59B5F88E9FC")))))) -(ert-deftest mml-secure-en-decrypt-sign-1 () +(ert-deftest mml-first-secure-en-decrypt-sign-1 () "Sign and encrypt message; then decrypt and test for expected result. In this test, just multiple encryption and signing keys may be available." (mml-secure-test-key-fixture -- cgit v1.2.3 From cc41b36af9372e6396d10198bbf286b49d8a5255 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 19:48:12 +0200 Subject: Remove mistakenly checked-in random_seed file --- test/data/mml-sec/random_seed | Bin 600 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/data/mml-sec/random_seed diff --git a/test/data/mml-sec/random_seed b/test/data/mml-sec/random_seed deleted file mode 100644 index 530fd76c1e5..00000000000 Binary files a/test/data/mml-sec/random_seed and /dev/null differ -- cgit v1.2.3 From 1308587c25cc28248c3d38748f76bb9e6324b929 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 19:50:37 +0200 Subject: Ignore test/data/mml-sec/random_seed The file is generated when mml-sec-tests is run. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 890e63a4318..d69a40af8cd 100644 --- a/.gitignore +++ b/.gitignore @@ -152,6 +152,7 @@ test/manual/etags/regexfile test/manual/etags/ETAGS test/manual/etags/CTAGS test/manual/indent/*.new +test/data/mml-sec/random_seed # ctags, etags. TAGS -- cgit v1.2.3 From fe2649528b0b7637e6b6851c41e696a1016d8d53 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 4 Aug 2020 11:09:55 -0700 Subject: Drop support for -fcheck-pointer-bounds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC has removed the -fcheck-pointer bounds option, and the Linux kernel has also removed support for Intel MPX, so there’s no point to keeping this debugging option within Emacs. * src/bytecode.c (BYTE_CODE_THREADED): * src/lisp.h (DEFINE_LISP_SYMBOL, XSYMBOL, make_lisp_symbol): Assume __CHKP__ is not defined. * src/ptr-bounds.h: Remove. All uses of ptr_bounds_clip, ptr_bounds_copy, ptr_bounds_init, ptr_bounds_set removed. --- etc/NEWS | 5 ++++ src/alloc.c | 31 ++++++++-------------- src/bytecode.c | 11 +++----- src/callint.c | 4 --- src/dispnew.c | 7 ----- src/editfns.c | 3 --- src/emacs.c | 1 - src/frame.c | 6 ----- src/fringe.c | 5 +--- src/gmalloc.c | 16 +++--------- src/lisp.h | 31 +++++----------------- src/ptr-bounds.h | 79 -------------------------------------------------------- 12 files changed, 31 insertions(+), 168 deletions(-) delete mode 100644 src/ptr-bounds.h diff --git a/etc/NEWS b/etc/NEWS index cd5cc2c3397..f135b3f6b3c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -58,6 +58,11 @@ shaping, so 'configure' now recommends that combination. ** The ftx font backend driver has been removed. It was declared obsolete in Emacs 27.1. +--- +** Support for building with '-fcheck-pointer-bounds' has been removed. +GCC has withdrawn the '-fcheck-pointer-bounds' option and support for +its implementation has been removed from the Linux kernel. + --- ** Emacs no longer supports old OpenBSD systems. OpenBSD 5.3 and older releases are no longer supported, as they lack diff --git a/src/alloc.c b/src/alloc.c index 3a02ef3f8c4..b16b2f8b93e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -34,7 +34,6 @@ along with GNU Emacs. If not, see . */ #include "bignum.h" #include "dispextern.h" #include "intervals.h" -#include "ptr-bounds.h" #include "puresize.h" #include "sheap.h" #include "sysstdio.h" @@ -1624,8 +1623,7 @@ static struct Lisp_String *string_free_list; a pointer to the `u.data' member of its sdata structure; the structure starts at a constant offset in front of that. */ -#define SDATA_OF_STRING(S) ((sdata *) ptr_bounds_init ((S)->u.s.data \ - - SDATA_DATA_OFFSET)) +#define SDATA_OF_STRING(S) ((sdata *) ((S)->u.s.data - SDATA_DATA_OFFSET)) #ifdef GC_CHECK_STRING_OVERRUN @@ -1799,7 +1797,7 @@ allocate_string (void) /* Every string on a free list should have NULL data pointer. */ s->u.s.data = NULL; NEXT_FREE_LISP_STRING (s) = string_free_list; - string_free_list = ptr_bounds_clip (s, sizeof *s); + string_free_list = s; } } @@ -1908,7 +1906,7 @@ allocate_string_data (struct Lisp_String *s, MALLOC_UNBLOCK_INPUT; - s->u.s.data = ptr_bounds_clip (SDATA_DATA (data), nbytes + 1); + s->u.s.data = SDATA_DATA (data); #ifdef GC_CHECK_STRING_BYTES SDATA_NBYTES (data) = nbytes; #endif @@ -2036,7 +2034,7 @@ sweep_strings (void) /* Put the string on the free-list. */ NEXT_FREE_LISP_STRING (s) = string_free_list; - string_free_list = ptr_bounds_clip (s, sizeof *s); + string_free_list = s; ++nfree; } } @@ -2044,7 +2042,7 @@ sweep_strings (void) { /* S was on the free-list before. Put it there again. */ NEXT_FREE_LISP_STRING (s) = string_free_list; - string_free_list = ptr_bounds_clip (s, sizeof *s); + string_free_list = s; ++nfree; } } @@ -2171,8 +2169,7 @@ compact_small_strings (void) { eassert (tb != b || to < from); memmove (to, from, size + GC_STRING_EXTRA); - to->string->u.s.data - = ptr_bounds_clip (SDATA_DATA (to), nbytes + 1); + to->string->u.s.data = SDATA_DATA (to); } /* Advance past the sdata we copied to. */ @@ -2959,7 +2956,6 @@ Lisp_Object zero_vector; static void setup_on_free_list (struct Lisp_Vector *v, ptrdiff_t nbytes) { - v = ptr_bounds_clip (v, nbytes); eassume (header_size <= nbytes); ptrdiff_t nwords = (nbytes - header_size) / word_size; XSETPVECTYPESIZE (v, PVEC_FREE, 0, nwords); @@ -3307,7 +3303,7 @@ allocate_vectorlike (ptrdiff_t len, bool clearit) MALLOC_UNBLOCK_INPUT; - return ptr_bounds_clip (p, nbytes); + return p; } @@ -4461,7 +4457,6 @@ live_string_holding (struct mem_node *m, void *p) must not be on the free-list. */ if (0 <= offset && offset < sizeof b->strings) { - cp = ptr_bounds_copy (cp, b); struct Lisp_String *s = p = cp -= offset % sizeof b->strings[0]; if (s->u.s.data) return s; @@ -4494,7 +4489,6 @@ live_cons_holding (struct mem_node *m, void *p) && (b != cons_block || offset / sizeof b->conses[0] < cons_block_index)) { - cp = ptr_bounds_copy (cp, b); struct Lisp_Cons *s = p = cp -= offset % sizeof b->conses[0]; if (!deadp (s->u.s.car)) return s; @@ -4528,7 +4522,6 @@ live_symbol_holding (struct mem_node *m, void *p) && (b != symbol_block || offset / sizeof b->symbols[0] < symbol_block_index)) { - cp = ptr_bounds_copy (cp, b); struct Lisp_Symbol *s = p = cp -= offset % sizeof b->symbols[0]; if (!deadp (s->u.s.function)) return s; @@ -5234,7 +5227,7 @@ pure_alloc (size_t size, int type) pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp; if (pure_bytes_used <= pure_size) - return ptr_bounds_clip (result, size); + return result; /* Don't allocate a large amount here, because it might get mmap'd and then its address @@ -5325,7 +5318,7 @@ find_string_data_in_pure (const char *data, ptrdiff_t nbytes) /* Check the remaining characters. */ if (memcmp (data, non_lisp_beg + start, nbytes) == 0) /* Found. */ - return ptr_bounds_clip (non_lisp_beg + start, nbytes + 1); + return non_lisp_beg + start; start += last_char_skip; } @@ -6049,7 +6042,6 @@ garbage_collect (void) stack_copy = xrealloc (stack_copy, stack_size); stack_copy_size = stack_size; } - stack = ptr_bounds_set (stack, stack_size); no_sanitize_memcpy (stack_copy, stack, stack_size); } } @@ -6885,8 +6877,7 @@ sweep_conses (void) for (pos = start; pos < stop; pos++) { - struct Lisp_Cons *acons - = ptr_bounds_copy (&cblk->conses[pos], cblk); + struct Lisp_Cons *acons = &cblk->conses[pos]; if (!XCONS_MARKED_P (acons)) { this_free++; @@ -6939,7 +6930,7 @@ sweep_floats (void) int this_free = 0; for (int i = 0; i < lim; i++) { - struct Lisp_Float *afloat = ptr_bounds_copy (&fblk->floats[i], fblk); + struct Lisp_Float *afloat = &fblk->floats[i]; if (!XFLOAT_MARKED_P (afloat)) { this_free++; diff --git a/src/bytecode.c b/src/bytecode.c index 5ac30aa1010..1913a4812a0 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -24,7 +24,6 @@ along with GNU Emacs. If not, see . */ #include "character.h" #include "buffer.h" #include "keyboard.h" -#include "ptr-bounds.h" #include "syntax.h" #include "window.h" @@ -47,7 +46,7 @@ along with GNU Emacs. If not, see . */ indirect threaded, using GCC's computed goto extension. This code, as currently implemented, is incompatible with BYTE_CODE_SAFE and BYTE_CODE_METER. */ -#if (defined __GNUC__ && !defined __STRICT_ANSI__ && !defined __CHKP__ \ +#if (defined __GNUC__ && !defined __STRICT_ANSI__ \ && !BYTE_CODE_SAFE && !defined BYTE_CODE_METER) #define BYTE_CODE_THREADED #endif @@ -368,14 +367,12 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, USE_SAFE_ALLOCA; void *alloc; SAFE_ALLOCA_LISP_EXTRA (alloc, stack_items, bytestr_length); - ptrdiff_t item_bytes = stack_items * word_size; - Lisp_Object *stack_base = ptr_bounds_clip (alloc, item_bytes); + Lisp_Object *stack_base = alloc; Lisp_Object *top = stack_base; *top = vector; /* Ensure VECTOR survives GC (Bug#33014). */ Lisp_Object *stack_lim = stack_base + stack_items; - unsigned char *bytestr_data = alloc; - bytestr_data = ptr_bounds_clip (bytestr_data + item_bytes, bytestr_length); - memcpy (bytestr_data, SDATA (bytestr), bytestr_length); + unsigned char const *bytestr_data = memcpy (stack_lim, + SDATA (bytestr), bytestr_length); unsigned char const *pc = bytestr_data; ptrdiff_t count = SPECPDL_INDEX (); diff --git a/src/callint.c b/src/callint.c index eb916353a0c..f609c96a6fa 100644 --- a/src/callint.c +++ b/src/callint.c @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see . */ #include #include "lisp.h" -#include "ptr-bounds.h" #include "character.h" #include "buffer.h" #include "keyboard.h" @@ -440,9 +439,6 @@ invoke it (via an `interactive' spec that contains, for instance, an signed char *varies = (signed char *) (visargs + nargs); memclear (args, nargs * (2 * word_size + 1)); - args = ptr_bounds_clip (args, nargs * sizeof *args); - visargs = ptr_bounds_clip (visargs, nargs * sizeof *visargs); - varies = ptr_bounds_clip (varies, nargs * sizeof *varies); if (!NILP (enable)) specbind (Qenable_recursive_minibuffers, Qt); diff --git a/src/dispnew.c b/src/dispnew.c index 1ae59e3ff2b..d318e26308e 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -25,7 +25,6 @@ along with GNU Emacs. If not, see . */ #include #include "lisp.h" -#include "ptr-bounds.h" #include "termchar.h" /* cm.h must come after dispextern.h on Windows. */ #include "dispextern.h" @@ -4891,12 +4890,6 @@ scrolling (struct frame *frame) unsigned *new_hash = old_hash + height; int *draw_cost = (int *) (new_hash + height); int *old_draw_cost = draw_cost + height; - old_hash = ptr_bounds_clip (old_hash, height * sizeof *old_hash); - new_hash = ptr_bounds_clip (new_hash, height * sizeof *new_hash); - draw_cost = ptr_bounds_clip (draw_cost, height * sizeof *draw_cost); - old_draw_cost = ptr_bounds_clip (old_draw_cost, - height * sizeof *old_draw_cost); - eassert (current_matrix); /* Compute hash codes of all the lines. Also calculate number of diff --git a/src/editfns.c b/src/editfns.c index 763d95bb8fa..cb09ea8a31a 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -46,7 +46,6 @@ along with GNU Emacs. If not, see . */ #include "composite.h" #include "intervals.h" -#include "ptr-bounds.h" #include "systime.h" #include "character.h" #include "buffer.h" @@ -3131,8 +3130,6 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message) string was not copied into the output. It is 2 if byte I was not the first byte of its character. */ char *discarded = (char *) &info[nspec_bound]; - info = ptr_bounds_clip (info, info_size); - discarded = ptr_bounds_clip (discarded, formatlen); memset (discarded, 0, formatlen); /* Try to determine whether the result should be multibyte. diff --git a/src/emacs.c b/src/emacs.c index 8a6bb3ad228..8e5eaf5e43e 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -83,7 +83,6 @@ along with GNU Emacs. If not, see . */ #include "charset.h" #include "composite.h" #include "dispextern.h" -#include "ptr-bounds.h" #include "regex-emacs.h" #include "sheap.h" #include "syntax.h" diff --git a/src/frame.c b/src/frame.c index c871e4fd994..c21d4708f75 100644 --- a/src/frame.c +++ b/src/frame.c @@ -35,7 +35,6 @@ along with GNU Emacs. If not, see . */ #include "buffer.h" /* These help us bind and responding to switch-frame events. */ #include "keyboard.h" -#include "ptr-bounds.h" #include "frame.h" #include "blockinput.h" #include "termchar.h" @@ -5019,8 +5018,6 @@ gui_display_get_resource (Display_Info *dpyinfo, Lisp_Object attribute, USE_SAFE_ALLOCA; char *name_key = SAFE_ALLOCA (name_keysize + class_keysize); char *class_key = name_key + name_keysize; - name_key = ptr_bounds_clip (name_key, name_keysize); - class_key = ptr_bounds_clip (class_key, class_keysize); /* Start with emacs.FRAMENAME for the name (the specific one) and with `Emacs' for the class key (the general one). */ @@ -5091,9 +5088,6 @@ x_get_resource_string (const char *attribute, const char *class) ptrdiff_t class_keysize = sizeof (EMACS_CLASS) - 1 + strlen (class) + 2; char *name_key = SAFE_ALLOCA (name_keysize + class_keysize); char *class_key = name_key + name_keysize; - name_key = ptr_bounds_clip (name_key, name_keysize); - class_key = ptr_bounds_clip (class_key, class_keysize); - esprintf (name_key, "%s.%s", SSDATA (Vinvocation_name), attribute); sprintf (class_key, "%s.%s", EMACS_CLASS, class); diff --git a/src/fringe.c b/src/fringe.c index fc4c738dc2d..c3d64fefc82 100644 --- a/src/fringe.c +++ b/src/fringe.c @@ -23,7 +23,6 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "frame.h" -#include "ptr-bounds.h" #include "window.h" #include "dispextern.h" #include "buffer.h" @@ -1607,9 +1606,7 @@ If BITMAP already exists, the existing definition is replaced. */) fb.dynamic = true; xfb = xmalloc (sizeof fb + fb.height * BYTES_PER_BITMAP_ROW); - fb.bits = b = ((unsigned short *) - ptr_bounds_clip (xfb + 1, fb.height * BYTES_PER_BITMAP_ROW)); - xfb = ptr_bounds_clip (xfb, sizeof *xfb); + fb.bits = b = (unsigned short *) (xfb + 1); j = 0; while (j < fb.height) diff --git a/src/gmalloc.c b/src/gmalloc.c index 8450a639e77..3560c744539 100644 --- a/src/gmalloc.c +++ b/src/gmalloc.c @@ -38,8 +38,6 @@ License along with this library. If not, see . #include "lisp.h" -#include "ptr-bounds.h" - #ifdef HAVE_MALLOC_H # if GNUC_PREREQ (4, 2, 0) # pragma GCC diagnostic ignored "-Wdeprecated-declarations" @@ -200,8 +198,7 @@ extern size_t _bytes_free; /* Internal versions of `malloc', `realloc', and `free' used when these functions need to call each other. - They are the same but don't call the hooks - and don't bound the resulting pointers. */ + They are the same but don't call the hooks. */ extern void *_malloc_internal (size_t); extern void *_realloc_internal (void *, size_t); extern void _free_internal (void *); @@ -551,7 +548,7 @@ malloc_initialize_1 (void) _heapinfo[0].free.size = 0; _heapinfo[0].free.next = _heapinfo[0].free.prev = 0; _heapindex = 0; - _heapbase = (char *) ptr_bounds_init (_heapinfo); + _heapbase = (char *) _heapinfo; _heaplimit = BLOCK (_heapbase + heapsize * sizeof (malloc_info)); register_heapinfo (); @@ -912,8 +909,7 @@ malloc (size_t size) among multiple threads. We just leave it for compatibility with glibc malloc (i.e., assignments to gmalloc_hook) for now. */ hook = gmalloc_hook; - void *result = (hook ? hook : _malloc_internal) (size); - return ptr_bounds_clip (result, size); + return (hook ? hook : _malloc_internal) (size); } #if !(defined (_LIBC) || defined (HYBRID_MALLOC)) @@ -991,7 +987,6 @@ _free_internal_nolock (void *ptr) if (ptr == NULL) return; - ptr = ptr_bounds_init (ptr); PROTECT_MALLOC_STATE (0); @@ -1303,7 +1298,6 @@ _realloc_internal_nolock (void *ptr, size_t size) else if (ptr == NULL) return _malloc_internal_nolock (size); - ptr = ptr_bounds_init (ptr); block = BLOCK (ptr); PROTECT_MALLOC_STATE (0); @@ -1426,8 +1420,7 @@ realloc (void *ptr, size_t size) return NULL; hook = grealloc_hook; - void *result = (hook ? hook : _realloc_internal) (ptr, size); - return ptr_bounds_clip (result, size); + return (hook ? hook : _realloc_internal) (ptr, size); } /* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc. @@ -1601,7 +1594,6 @@ aligned_alloc (size_t alignment, size_t size) { l->exact = result; result = l->aligned = (char *) result + adj; - result = ptr_bounds_clip (result, size); } UNLOCK_ALIGNED_BLOCKS (); if (l == NULL) diff --git a/src/lisp.h b/src/lisp.h index 22ddf3e5faf..17b92a04146 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -893,8 +893,8 @@ verify (GCALIGNED (struct Lisp_Symbol)); convert it to a Lisp_Word. */ #if LISP_WORDS_ARE_POINTERS /* untagged_ptr is a pointer so that the compiler knows that TAG_PTR - yields a pointer; this can help with gcc -fcheck-pointer-bounds. - It is char * so that adding a tag uses simple machine addition. */ + yields a pointer. It is char * so that adding a tag uses simple + machine addition. */ typedef char *untagged_ptr; typedef uintptr_t Lisp_Word_tag; #else @@ -922,13 +922,9 @@ typedef EMACS_UINT Lisp_Word_tag; when using a debugger like GDB, on older platforms where the debug format does not represent C macros. However, they are unbounded and would just be asking for trouble if checking pointer bounds. */ -#ifdef __CHKP__ -# define DEFINE_LISP_SYMBOL(name) -#else -# define DEFINE_LISP_SYMBOL(name) \ - DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \ - DEFINE_GDB_SYMBOL_END (LISPSYM_INITIALLY (name)) -#endif +#define DEFINE_LISP_SYMBOL(name) \ + DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \ + DEFINE_GDB_SYMBOL_END (LISPSYM_INITIALLY (name)) /* The index of the C-defined Lisp symbol SYM. This can be used in a static initializer. */ @@ -1002,30 +998,15 @@ XSYMBOL (Lisp_Object a) eassert (SYMBOLP (a)); intptr_t i = (intptr_t) XUNTAG (a, Lisp_Symbol, struct Lisp_Symbol); void *p = (char *) lispsym + i; -#ifdef __CHKP__ - /* Bypass pointer checking. Although this could be improved it is - probably not worth the trouble. */ - p = __builtin___bnd_set_ptr_bounds (p, sizeof (struct Lisp_Symbol)); -#endif return p; } INLINE Lisp_Object make_lisp_symbol (struct Lisp_Symbol *sym) { -#ifdef __CHKP__ - /* Although '__builtin___bnd_narrow_ptr_bounds (sym, sym, sizeof *sym)' - should be more efficient, it runs afoul of GCC bug 83251 - . - Also, attempting to call __builtin___bnd_chk_ptr_bounds (sym, sizeof *sym) - here seems to trigger a GCC bug, as yet undiagnosed. */ - char *addr = __builtin___bnd_set_ptr_bounds (sym, sizeof *sym); - char *symoffset = addr - (intptr_t) lispsym; -#else - /* If !__CHKP__, GCC 7 x86-64 generates faster code if lispsym is + /* GCC 7 x86-64 generates faster code if lispsym is cast to char * rather than to intptr_t. */ char *symoffset = (char *) ((char *) sym - (char *) lispsym); -#endif Lisp_Object a = TAG_PTR (Lisp_Symbol, symoffset); eassert (XSYMBOL (a) == sym); return a; diff --git a/src/ptr-bounds.h b/src/ptr-bounds.h deleted file mode 100644 index 22d49f25b6c..00000000000 --- a/src/ptr-bounds.h +++ /dev/null @@ -1,79 +0,0 @@ -/* Pointer bounds checking for GNU Emacs - -Copyright 2017-2020 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 . */ - -/* Pointer bounds checking is a no-op unless running on hardware - supporting Intel MPX (Intel Skylake or better). Also, it requires - GCC 5 and Linux kernel 3.19, or later. Configure with - CFLAGS='-fcheck-pointer-bounds -mmpx', perhaps with - -fchkp-first-field-has-own-bounds thrown in. - - Although pointer bounds checking can help during debugging, it is - disabled by default because it hurts performance significantly. - The checking does not detect all pointer errors. For example, a - dumped Emacs might not detect a bounds violation of a pointer that - was created before Emacs was dumped. */ - -#ifndef PTR_BOUNDS_H -#define PTR_BOUNDS_H - -#include - -/* When not checking pointer bounds, the following macros simply - return their first argument. These macros return either void *, or - the same type as their first argument. */ - -INLINE_HEADER_BEGIN - -/* Return a copy of P, with bounds narrowed to [P, P + N). */ -#ifdef __CHKP__ -INLINE void * -ptr_bounds_clip (void const *p, size_t n) -{ - return __builtin___bnd_narrow_ptr_bounds (p, p, n); -} -#else -# define ptr_bounds_clip(p, n) ((void) (size_t) {n}, p) -#endif - -/* Return a copy of P, but with the bounds of Q. */ -#ifdef __CHKP__ -# define ptr_bounds_copy(p, q) __builtin___bnd_copy_ptr_bounds (p, q) -#else -# define ptr_bounds_copy(p, q) ((void) (void const *) {q}, p) -#endif - -/* Return a copy of P, but with infinite bounds. - This is a loophole in pointer bounds checking. */ -#ifdef __CHKP__ -# define ptr_bounds_init(p) __builtin___bnd_init_ptr_bounds (p) -#else -# define ptr_bounds_init(p) (p) -#endif - -/* Return a copy of P, but with bounds [P, P + N). - This is a loophole in pointer bounds checking. */ -#ifdef __CHKP__ -# define ptr_bounds_set(p, n) __builtin___bnd_set_ptr_bounds (p, n) -#else -# define ptr_bounds_set(p, n) ((void) (size_t) {n}, p) -#endif - -INLINE_HEADER_END - -#endif /* PTR_BOUNDS_H */ -- cgit v1.2.3 From 9c967e7298cc4f0e6acbaf9b13755d674d9d460c Mon Sep 17 00:00:00 2001 From: Arik Mitschang Date: Tue, 4 Aug 2020 20:32:13 +0200 Subject: Add options for mode modern ciphers in smime-encrypt-cipher * lisp/gnus/smime.el (smime-encrypt-cipher): Add support for more modern ciphers (bug#8474). Copyright-paperwork-exempt: yes --- lisp/gnus/smime.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lisp/gnus/smime.el b/lisp/gnus/smime.el index fe6daf6b037..5500148e518 100644 --- a/lisp/gnus/smime.el +++ b/lisp/gnus/smime.el @@ -185,6 +185,9 @@ and the files themselves should be in PEM format." :version "22.1" :type '(choice (const :tag "Triple DES" "-des3") (const :tag "DES" "-des") + (const :tag "AES 256 bits" "-aes256") + (const :tag "AES 192 bits" "-aes192") + (const :tag "AES 128 bits" "-aes128") (const :tag "RC2 40 bits" "-rc2-40") (const :tag "RC2 64 bits" "-rc2-64") (const :tag "RC2 128 bits" "-rc2-128")) -- cgit v1.2.3 From 6e70b3793b9cb7730ab8a7132aa6e99f1ca13f98 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 4 Aug 2020 21:42:44 +0200 Subject: When decrypting non-decrypted files, make epa show the raw files * lisp/epa-file.el (epa-file-insert-file-contents): When trying to decrypt a non-decrypted file, just show the bytes from the file instead (bug#3829). --- lisp/epa-file.el | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lisp/epa-file.el b/lisp/epa-file.el index 20043a9eae4..bbd9279a9a8 100644 --- a/lisp/epa-file.el +++ b/lisp/epa-file.el @@ -151,17 +151,25 @@ encryption is used." (nth 3 error))) (let ((exists (file-exists-p local-file))) (when exists - ;; Hack to prevent find-file from opening empty buffer - ;; when decryption failed (bug#6568). See the place - ;; where `find-file-not-found-functions' are called in - ;; `find-file-noselect-1'. - (setq-local epa-file-error error) - (add-hook 'find-file-not-found-functions - 'epa-file--find-file-not-found-function - nil t) - (epa-display-error context)) - (signal (if exists 'file-error 'file-missing) - (cons "Opening input file" (cdr error)))))) + (epa-display-error context) + ;; When the .gpg file isn't an encrypted file (e.g., + ;; it's a keyring.gpg file instead), then gpg will + ;; say "Unexpected exit" as the error message. In + ;; that case, just display the bytes. + (if (equal (caddr error) "Unexpected; Exit") + (setq string (with-temp-buffer + (insert-file-contents-literally local-file) + (buffer-string))) + ;; Hack to prevent find-file from opening empty buffer + ;; when decryption failed (bug#6568). See the place + ;; where `find-file-not-found-functions' are called in + ;; `find-file-noselect-1'. + (setq-local epa-file-error error) + (add-hook 'find-file-not-found-functions + 'epa-file--find-file-not-found-function + nil t) + (signal (if exists 'file-error 'file-missing) + (cons "Opening input file" (cdr error)))))))) (set-buffer buf) ;In case timer/filter changed/killed it (bug#16029)! (setq-local epa-file-encrypt-to (mapcar #'car (epg-context-result-for -- cgit v1.2.3 From 519a93e067f459ceddb57573261a52118086b73d Mon Sep 17 00:00:00 2001 From: Alan Third Date: Sun, 2 Aug 2020 20:43:56 +0100 Subject: Don't smooth images when scaling up (bug#38394) * src/image.c (image_set_transform [HAVE_XRENDER]): Use different filter when scaling up vs scaling down. * src/nsimage.m (ns_image_set_smoothing): ([EmacsImage setSmoothing:]): New functions. * src/nsterm.h: Add definitions. * src/nsterm.m (ns_dumpglyphs_image): Disable smoothing if requested. --- src/image.c | 20 +++++++++++++++++--- src/nsimage.m | 12 ++++++++++++ src/nsterm.h | 3 +++ src/nsterm.m | 12 ++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/image.c b/src/image.c index e7e0a93313b..e236b389210 100644 --- a/src/image.c +++ b/src/image.c @@ -259,6 +259,8 @@ cr_put_image_to_cr_data (struct image *img) cairo_matrix_t matrix; cairo_pattern_get_matrix (img->cr_data, &matrix); cairo_pattern_set_matrix (pattern, &matrix); + cairo_pattern_set_filter + (pattern, cairo_pattern_get_filter (img->cr_data)); cairo_pattern_destroy (img->cr_data); } cairo_surface_destroy (surface); @@ -2114,6 +2116,15 @@ image_set_transform (struct frame *f, struct image *img) double rotation = 0.0; compute_image_rotation (img, &rotation); +# if defined USE_CAIRO || defined HAVE_XRENDER || defined HAVE_NS + /* We want scale up operations to use a nearest neighbour filter to + show real pixels instead of munging them, but scale down + operations to use a blended filter, to avoid aliasing and the like. + + TODO: implement for Windows. */ + bool scale_down = (width < img->width) || (height < img->height); +# endif + /* Perform scale transformation. */ matrix3x3 matrix @@ -2225,11 +2236,14 @@ image_set_transform (struct frame *f, struct image *img) /* Under NS the transform is applied to the drawing surface at drawing time, so store it for later. */ ns_image_set_transform (img->pixmap, matrix); + ns_image_set_smoothing (img->pixmap, scale_down); # elif defined USE_CAIRO cairo_matrix_t cr_matrix = {matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[2][0], matrix[2][1]}; cairo_pattern_t *pattern = cairo_pattern_create_rgb (0, 0, 0); cairo_pattern_set_matrix (pattern, &cr_matrix); + cairo_pattern_set_filter (pattern, scale_down + ? CAIRO_FILTER_BEST : CAIRO_FILTER_NEAREST); /* Dummy solid color pattern just to record pattern matrix. */ img->cr_data = pattern; # elif defined (HAVE_XRENDER) @@ -2246,14 +2260,14 @@ image_set_transform (struct frame *f, struct image *img) XDoubleToFixed (matrix[1][2]), XDoubleToFixed (matrix[2][2])}}}; - XRenderSetPictureFilter (FRAME_X_DISPLAY (f), img->picture, FilterBest, - 0, 0); + XRenderSetPictureFilter (FRAME_X_DISPLAY (f), img->picture, + scale_down ? FilterBest : FilterNearest, 0, 0); XRenderSetPictureTransform (FRAME_X_DISPLAY (f), img->picture, &tmat); if (img->mask_picture) { XRenderSetPictureFilter (FRAME_X_DISPLAY (f), img->mask_picture, - FilterBest, 0, 0); + scale_down ? FilterBest : FilterNearest, 0, 0); XRenderSetPictureTransform (FRAME_X_DISPLAY (f), img->mask_picture, &tmat); } diff --git a/src/nsimage.m b/src/nsimage.m index 07750de95fe..966e7044f12 100644 --- a/src/nsimage.m +++ b/src/nsimage.m @@ -199,6 +199,12 @@ ns_image_set_transform (void *img, double m[3][3]) [(EmacsImage *)img setTransform:m]; } +void +ns_image_set_smoothing (void *img, bool smooth) +{ + [(EmacsImage *)img setSmoothing:smooth]; +} + unsigned long ns_get_pixel (void *img, int x, int y) { @@ -591,4 +597,10 @@ ns_set_alpha (void *img, int x, int y, unsigned char a) [transform setTransformStruct:tm]; } +- (void)setSmoothing: (BOOL) s +{ + smoothing = s; +} + + @end diff --git a/src/nsterm.h b/src/nsterm.h index 8d5371c8f24..a511fef5b98 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -640,6 +640,7 @@ typedef id instancetype; unsigned long xbm_fg; @public NSAffineTransform *transform; + BOOL smoothing; } + (instancetype)allocInitFromFile: (Lisp_Object)file; - (void)dealloc; @@ -658,6 +659,7 @@ typedef id instancetype; - (Lisp_Object)getMetadata; - (BOOL)setFrame: (unsigned int) index; - (void)setTransform: (double[3][3]) m; +- (void)setSmoothing: (BOOL)s; @end @@ -1200,6 +1202,7 @@ extern int ns_image_width (void *img); extern int ns_image_height (void *img); extern void ns_image_set_size (void *img, int width, int height); extern void ns_image_set_transform (void *img, double m[3][3]); +extern void ns_image_set_smoothing (void *img, bool smooth); extern unsigned long ns_get_pixel (void *img, int x, int y); extern void ns_put_pixel (void *img, int x, int y, unsigned long argb); extern void ns_set_alpha (void *img, int x, int y, unsigned char a); diff --git a/src/nsterm.m b/src/nsterm.m index df7f716f51e..572b859a982 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -4043,10 +4043,22 @@ ns_dumpglyphs_image (struct glyph_string *s, NSRect r) [doTransform concat]; + /* Smoothing is the default, so if we don't want smoothing we + have to turn it off. */ + if (! img->smoothing) + [[NSGraphicsContext currentContext] + setImageInterpolation:NSImageInterpolationNone]; + [img drawInRect:ir fromRect:ir operation:NSCompositingOperationSourceOver fraction:1.0 respectFlipped:YES hints:nil]; + /* Apparently image interpolation is not reset with + restoreGraphicsState, so we have to manually reset it. */ + if (! img->smoothing) + [[NSGraphicsContext currentContext] + setImageInterpolation:NSImageInterpolationDefault]; + [[NSGraphicsContext currentContext] restoreGraphicsState]; } -- cgit v1.2.3 From cbb5a67effce7ce2923e498be252c7c8ad96ab53 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 5 Aug 2020 02:51:00 +0300 Subject: * lisp/generic-x.el (ansible-inventory-generic-mode): Fix filename (bug#42703) --- lisp/generic-x.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/generic-x.el b/lisp/generic-x.el index cd24f497c96..48ac1232051 100644 --- a/lisp/generic-x.el +++ b/lisp/generic-x.el @@ -643,7 +643,7 @@ like an INI file. You can add this hook to `find-file-hook'." ("\\([^ =\n\r]+\\)=\\([^ \n\r]*\\)" (1 font-lock-variable-name-face) (2 font-lock-keyword-face))) - '("inventory") + '("inventory\\'") (list (function (lambda () -- cgit v1.2.3 From 398242bb3f08db3be4d8f1a7a95ba44f7aea995c Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 4 Aug 2020 20:15:41 -0400 Subject: * lisp/x-dnd.el: Use lexical-scoping --- lisp/x-dnd.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el index b22af5cc770..1d49f462531 100644 --- a/lisp/x-dnd.el +++ b/lisp/x-dnd.el @@ -1,4 +1,4 @@ -;;; x-dnd.el --- drag and drop support for X +;;; x-dnd.el --- drag and drop support for X -*- lexical-binding: t; -*- ;; Copyright (C) 2004-2020 Free Software Foundation, Inc. @@ -32,7 +32,7 @@ (require 'dnd) ;;; Customizable variables -(defcustom x-dnd-test-function 'x-dnd-default-test-function +(defcustom x-dnd-test-function #'x-dnd-default-test-function "The function drag and drop uses to determine if to accept or reject a drop. The function takes three arguments, WINDOW, ACTION and TYPES. WINDOW is where the mouse is when the function is called. WINDOW may be a -- cgit v1.2.3 From 1f3e2ac4b62e38af2d9424f2a4fcc1515a4c0b30 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 10:07:13 +0200 Subject: Add new function decoded-time-period * lisp/calendar/time-date.el (decoded-time-period): New function. --- etc/NEWS | 5 +++++ lisp/calendar/time-date.el | 15 +++++++++++++++ test/lisp/calendar/time-date-tests.el | 14 ++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index f135b3f6b3c..c1879169dd6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -731,6 +731,11 @@ optional argument specifying whether to follow symbolic links. ** 'parse-time-string' can now parse ISO 8601 format strings, such as "2020-01-15T16:12:21-08:00". +--- +** The new function 'decoded-time-period' has been added. +It interprets a decoded time structure as a period and returns the +equivalent period in seconds. + +++ ** The new function 'dom-remove-attribute' has been added. diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el index eeb09926a6e..125f9acc705 100644 --- a/lisp/calendar/time-date.el +++ b/lisp/calendar/time-date.el @@ -527,6 +527,21 @@ TIME is modified and returned." time) +(defun decoded-time-period (time) + "Interpret DECODED as a period and return its length in seconds. +For computational purposes, years are 365 days long and months +are 30 days long." + (+ (if (consp (decoded-time-second time)) + ;; Fractional second. + (/ (float (car (decoded-time-second time))) + (cdr (decoded-time-second time))) + (or (decoded-time-second time) 0)) + (* (or (decoded-time-minute time) 0) 60) + (* (or (decoded-time-hour time) 0) 60 60) + (* (or (decoded-time-day time) 0) 60 60 24) + (* (or (decoded-time-month time) 0) 60 60 24 30) + (* (or (decoded-time-year time) 0) 60 60 24 365))) + (provide 'time-date) ;;; time-date.el ends here diff --git a/test/lisp/calendar/time-date-tests.el b/test/lisp/calendar/time-date-tests.el index 3eecc67eb53..fe1460cf29e 100644 --- a/test/lisp/calendar/time-date-tests.el +++ b/test/lisp/calendar/time-date-tests.el @@ -109,4 +109,18 @@ (ert-deftest test-time-since () (should (time-equal-p 0 (time-since nil)))) +(ert-deftest test-time-decoded-period () + (should (equal (decoded-time-period '(nil nil 1 nil nil nil nil nil nil)) + 3600)) + + (should (equal (decoded-time-period '(1 0 0 0 0 0 nil nil nil)) 1)) + (should (equal (decoded-time-period '(0 1 0 0 0 0 nil nil nil)) 60)) + (should (equal (decoded-time-period '(0 0 1 0 0 0 nil nil nil)) 3600)) + (should (equal (decoded-time-period '(0 0 0 1 0 0 nil nil nil)) 86400)) + (should (equal (decoded-time-period '(0 0 0 0 1 0 nil nil nil)) 2592000)) + (should (equal (decoded-time-period '(0 0 0 0 0 1 nil nil nil)) 31536000)) + + (should (equal (decoded-time-period '((135 . 10) 0 0 0 0 0 nil nil nil)) + 13.5))) + ;;; time-date-tests.el ends here -- cgit v1.2.3 From a59296d9984023960453322ff7d664ec79250f7a Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 10:27:40 +0200 Subject: Make the erc /ignore command prompt for a timeout * lisp/erc/erc.el (erc--unignore-user): Separate into own function (bug#40137). (erc-cmd-IGNORE): Ask if the user wants a timeout. (erc--read-time-period): New function. --- etc/NEWS | 6 +++++ lisp/erc/erc.el | 65 +++++++++++++++++++++++++++++++++++++++++----- test/lisp/erc/erc-tests.el | 47 +++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 test/lisp/erc/erc-tests.el diff --git a/etc/NEWS b/etc/NEWS index c1879169dd6..670e97f52cb 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -590,6 +590,12 @@ Previously 'xml-print' would produce invalid XML when given a string with characters that are not valid in XML (see https://www.w3.org/TR/xml/#charsets). Now it rejects such strings. +** erc + +--- +*** The /ignore command will now ask for a timeout to stop ignoring the user. +Allowed inputs are seconds or ISO8601-like periods like "1h" or "4h30m". + ** Battery --- diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 8830dd4c45e..927546abc30 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -63,6 +63,8 @@ (require 'thingatpt) (require 'auth-source) (require 'erc-compat) +(require 'time-date) +(require 'iso8601) (eval-when-compile (require 'subr-x)) (defvar erc-official-location @@ -2905,6 +2907,44 @@ therefore has to contain the command itself as well." (erc-server-send (substring line 1)) t) +(defvar erc--read-time-period-history nil) + +(defun erc--read-time-period (prompt) + "Read a time period on the \"2h\" format. +If there's no letter spec, the input is interpreted as a number of seconds. + +If input is blank, this function returns nil. Otherwise it +returns the time spec converted to a number of seconds." + (let ((period (string-trim + (read-string prompt nil 'erc--read-time-period-history)))) + (cond + ;; Blank input. + ((zerop (length period)) + nil) + ;; All-number -- interpret as seconds. + ((string-match-p "\\`[0-9]+\\'" period) + (string-to-number period)) + ;; Parse as a time spec. + (t + (let ((time (condition-case nil + (iso8601-parse-duration + (concat (cond + ((string-match-p "\\`P" (upcase period)) + ;; Somebody typed in a full ISO8601 period. + (upcase period)) + ((string-match-p "[YD]" (upcase period)) + ;; If we have a year/day element, + ;; we have a full spec. + "P") + (t + ;; Otherwise it's just a sub-day spec. + "PT")) + (upcase period))) + (wrong-type-argument nil)))) + (unless time + (user-error "%s is not a valid time period" period)) + (decoded-time-period time)))))) + (defun erc-cmd-IGNORE (&optional user) "Ignore USER. This should be a regexp matching nick!user@host. If no USER argument is specified, list the contents of `erc-ignore-list'." @@ -2914,10 +2954,18 @@ If no USER argument is specified, list the contents of `erc-ignore-list'." (y-or-n-p (format "Use regexp-quoted form (%s) instead? " quoted))) (setq user quoted)) - (erc-display-line - (erc-make-notice (format "Now ignoring %s" user)) - 'active) - (erc-with-server-buffer (add-to-list 'erc-ignore-list user))) + (let ((timeout + (erc--read-time-period + "Add a timeout? (Blank for no, or a time spec like 2h): ")) + (buffer (current-buffer))) + (when timeout + (run-at-time timeout nil + (lambda () + (erc--unignore-user user buffer)))) + (erc-display-line + (erc-make-notice (format "Now ignoring %s" user)) + 'active) + (erc-with-server-buffer (add-to-list 'erc-ignore-list user)))) (if (null (erc-with-server-buffer erc-ignore-list)) (erc-display-line (erc-make-notice "Ignore list is empty") 'active) (erc-display-line (erc-make-notice "Ignore list:") 'active) @@ -2941,12 +2989,17 @@ If no USER argument is specified, list the contents of `erc-ignore-list'." (erc-make-notice (format "%s is not currently ignored!" user)) 'active))) (when ignored-nick + (erc--unignore-user user (current-buffer)))) + t) + +(defun erc--unignore-user (user buffer) + (when (buffer-live-p buffer) + (with-current-buffer buffer (erc-display-line (erc-make-notice (format "No longer ignoring %s" user)) 'active) (erc-with-server-buffer - (setq erc-ignore-list (delete ignored-nick erc-ignore-list))))) - t) + (setq erc-ignore-list (delete user erc-ignore-list)))))) (defun erc-cmd-CLEAR () "Clear the window content." diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el new file mode 100644 index 00000000000..27f48fa8131 --- /dev/null +++ b/test/lisp/erc/erc-tests.el @@ -0,0 +1,47 @@ +;;; erc-tests.el --- Tests for erc. -*- lexical-binding:t -*- + +;; Copyright (C) 2020 Free Software Foundation, Inc. + +;; Author: Lars Ingebrigtsen + +;; 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 . + +;;; Code: + +(require 'ert) +(require 'erc) + +(ert-deftest erc--read-time-period () + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) ""))) + (should (equal (erc--read-time-period "foo: ") nil))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) " "))) + (should (equal (erc--read-time-period "foo: ") nil))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) " 432 "))) + (should (equal (erc--read-time-period "foo: ") 432))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) "432"))) + (should (equal (erc--read-time-period "foo: ") 432))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) "1h"))) + (should (equal (erc--read-time-period "foo: ") 3600))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) "1h10s"))) + (should (equal (erc--read-time-period "foo: ") 3610))) + + (cl-letf (((symbol-function 'read-string) (lambda (&rest _) "1d"))) + (should (equal (erc--read-time-period "foo: ") 86400)))) -- cgit v1.2.3 From c72b734c917f635fac09f691e91d3391b00b96f2 Mon Sep 17 00:00:00 2001 From: Kevin Brubeck Unhammer Date: Wed, 5 Aug 2020 11:13:51 +0200 Subject: Further fix for erc-generate-new-buffer-name * lisp/erc/erc.el (erc-generate-new-buffer-name): Fix buffer name generation when there's two networks on the same server:port (bug#40121). --- lisp/erc/erc.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 927546abc30..62aa76d25c8 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1630,9 +1630,10 @@ symbol, it may have these values: (and (erc-server-buffer-p) (not (erc-server-process-alive))))) ;; Channel buffer; check that it's from the right server. - (with-current-buffer (get-buffer candidate) - (and (string= erc-session-server server) - (erc-port-equal erc-session-port port))))) + (and target + (with-current-buffer (get-buffer candidate) + (and (string= erc-session-server server) + (erc-port-equal erc-session-port port)))))) (setq buffer-name candidate))) ;; if buffer-name is unset, neither candidate worked out for us, ;; fallback to the old uniquification method: -- cgit v1.2.3 From 3f358fc172c50868321b0ef246adb66a7ea795c9 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 11:27:54 +0200 Subject: Mention undo in the doc string of dired-do-kill-lines * lisp/dired-aux.el (dired-do-kill-lines): Mention that this can be undone (bug#42707). --- lisp/dired-aux.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index efb214088d8..806a3955e4d 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -952,13 +952,17 @@ With a prefix argument, kill that many lines starting with the current line. "Kill all marked lines (not the files). With a prefix argument, kill that many lines starting with the current line. \(A negative argument kills backward.) + If you use this command with a prefix argument to kill the line for a file that is a directory, which you have inserted in the Dired buffer as a subdirectory, then it deletes that subdirectory from the buffer as well. + To kill an entire subdirectory \(without killing its line in the parent directory), go to its directory header line and use this -command with a prefix argument (the value does not matter)." +command with a prefix argument (the value does not matter). + +To undo the killing, the undo command can be used as normally." ;; Returns count of killed lines. FMT="" suppresses message. (interactive "P") (if arg -- cgit v1.2.3 From c9d550a301d3a5e62b3296804ccf42efc69d0796 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 11:34:56 +0200 Subject: Fontize $(...) slightly better in bash mode * lisp/progmodes/sh-script.el (sh-font-lock-keywords-var): Fontize $(...) slightly better (bug#42417). Instead of just fontizing the first word in the expression, fontize until the closing parenthesis. This doesn't work well if you have nested $(...) expressions. --- lisp/progmodes/sh-script.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 044d7820ee3..5a47594878e 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -838,7 +838,7 @@ See `sh-feature'.") font-lock-variable-name-face)) (rc sh-append es) - (bash sh-append sh ("\\$(\\(\\sw+\\)" (1 'sh-quoted-exec t) )) + (bash sh-append sh ("\\$(\\([^)\n]+\\)" (1 'sh-quoted-exec t) )) (sh sh-append shell ;; Variable names. ("\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)" 2 -- cgit v1.2.3 From a06f41ad2ca786a70940297fd832a649196be9be Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 12:21:35 +0200 Subject: Implement a screenshot command for Message mode * doc/misc/message.texi (MIME): Document it. * lisp/gnus/message.el (message-screenshot-command): New variable. (message-mode-map): New keystroke and menu item. Also add mml-attach-file to the menu. (message-insert-screenshot): New command. * lisp/gnus/mml.el (mml-parse-1): Allow having content-transfer-encoding already in the part, so that we can have inline base64-encoded binaries in the Message buffers. --- doc/misc/message.texi | 12 ++++++++++++ etc/NEWS | 16 ++++++++++++---- lisp/gnus/message.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/gnus/mml.el | 13 ++++++++++++- 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/doc/misc/message.texi b/doc/misc/message.texi index bdd31b1fe49..7a66422b17e 100644 --- a/doc/misc/message.texi +++ b/doc/misc/message.texi @@ -883,6 +883,18 @@ is a list, valid members are @code{type}, @code{description} and @code{nil}, don't ask for options. If it is @code{t}, ask the user whether or not to specify options. +@vindex message-screenshot-command +@findex message-insert-screenshot +@cindex screenshots +@kindex C-c C-p +If your system supports it, you can also insert screenshots directly +into the Message buffer. The @kbd{C-c C-p} +(@code{message-insert-screenshot}) command inserts the image into the +buffer as an @acronym{MML} part, and puts an image text property on +top. The @code{message-screenshot-command} variable says what +external command to use to take the screenshot. It defaults to +@code{"import png:-"}, which is an ImageMagick command. + You can also create arbitrarily complex multiparts using the @acronym{MML} language (@pxref{Composing, , Composing, emacs-mime, The Emacs MIME Manual}). diff --git a/etc/NEWS b/etc/NEWS index 670e97f52cb..8c6e3e78139 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -228,6 +228,14 @@ The names of the commands 'gnus-slave', 'gnus-slave-no-server' and *** The 'W Q' summary mode command now takes a numerical prefix to allow adjusting the fill width. ++++ +*** New variable 'mm-inline-font-lock'. +This variable is supposed to be bound by callers to determine whether +inline MIME parts (that support it) are supposed to be font-locked or +not. + +** Message + --- *** Change to default value of 'message-draft-headers' user option. The 'Date' symbol has been removed from the default value, meaning that @@ -237,10 +245,10 @@ from when it is first saved or delayed, add the symbol 'Date' back to this user option. +++ -*** New variable 'mm-inline-font-lock'. -This variable is supposed to be bound by callers to determine whether -inline MIME parts (that support it) are supposed to be font-locked or -not. +*** New command to take screenshots. +In Message mode buffers, the 'C-c C-p' ('message-insert-screenshot') +command has been added. It depends on using an external program to +take the actual screenshot, and defaults to ImageMagick "import". ** Help diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index fb560f0eab8..1453cbe643e 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -303,6 +303,13 @@ any confusion." :link '(custom-manual "(message)Message Headers") :type 'regexp) +(defcustom message-screenshot-command '("import" "png:-") + "Command to take a screenshot. +The command should insert a PNG in the current buffer." + :group 'message-various + :type '(list string) + :version "28.1") + ;;; Start of variables adopted from `message-utils.el'. (defcustom message-subject-trailing-was-query t @@ -2810,6 +2817,7 @@ systematically send encrypted emails when possible." (define-key message-mode-map [remap split-line] 'message-split-line) (define-key message-mode-map "\C-c\C-a" 'mml-attach-file) + (define-key message-mode-map "\C-c\C-p" 'message-insert-screenshot) (define-key message-mode-map "\C-a" 'message-beginning-of-line) (define-key message-mode-map "\t" 'message-tab) @@ -2839,6 +2847,8 @@ systematically send encrypted emails when possible." :active (message-mark-active-p) :help "Mark region with enclosing tags"] ["Insert File Marked..." message-mark-insert-file :help "Insert file at point marked with enclosing tags"] + ["Attach File..." mml-attach-file t] + ["Insert Screenshot" message-insert-screenshot t] "----" ["Send Message" message-send-and-exit :help "Send this message"] ["Postpone Message" message-dont-send @@ -8652,6 +8662,49 @@ Used in `message-simplify-recipients'." (* 0.5 (- (nth 3 edges) (nth 1 edges))))) string))))))) +(defun message-insert-screenshot (delay) + "Take a screenshot and insert in the current buffer. +DELAY (the numeric prefix) says how many seconds to wait before +starting the screenshotting process. + +The `message-screenshot-command' variable says what command is +used to take the screenshot." + (interactive "p") + (unless (executable-find (car message-screenshot-command)) + (error "Can't find %s to take the screenshot" + (car message-screenshot-command))) + (cl-decf delay) + (unless (zerop delay) + (dotimes (i delay) + (message "Sleeping %d second%s..." + (- delay i) + (if (= (- delay i) 1) + "" + "s")) + (sleep-for 1))) + (message "Take screenshot") + (let ((image + (with-temp-buffer + (set-buffer-multibyte nil) + (apply #'call-process + (car message-screenshot-command) nil (current-buffer) nil + (cdr message-screenshot-command)) + (buffer-string)))) + (set-mark (point)) + (insert-image + (create-image image 'png t + :max-width (* (frame-pixel-width) 0.8) + :max-height (* (frame-pixel-height) 0.8)) + (format "<#part type=\"image/png\" disposition=inline content-transfer-encoding=base64 raw=t>\n%s\n<#/part>" + ;; Get a base64 version of the image. + (with-temp-buffer + (set-buffer-multibyte nil) + (insert image) + (base64-encode-region (point-min) (point-max) t) + (buffer-string)))) + (insert "\n\n") + (message ""))) + (provide 'message) (run-hooks 'message-load-hook) diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el index 21491499eb8..1d348f3a6f0 100644 --- a/lisp/gnus/mml.el +++ b/lisp/gnus/mml.el @@ -295,6 +295,17 @@ part. This is for the internal use, you should never modify the value.") (t (mm-find-mime-charset-region point (point) mm-hack-charsets)))) + ;; We have a part that already has a transfer encoding. Undo + ;; that so that we don't double-encode later. + (when (and raw + (cdr (assq 'content-transfer-encoding tag))) + (with-temp-buffer + (set-buffer-multibyte nil) + (insert contents) + (mm-decode-content-transfer-encoding + (intern (cdr (assq 'content-transfer-encoding tag))) + (cdr (assq 'type tag))) + (setq contents (buffer-string)))) (when (and (not raw) (memq nil charsets)) (if (or (memq 'unknown-encoding mml-confirmation-set) (message-options-get 'unknown-encoding) @@ -313,8 +324,8 @@ Message contains characters with unknown encoding. Really send? ") (eq 'mml (car tag)) (< (length charsets) 2)) (if (or (not no-markup-p) + ;; Don't create blank parts. (string-match "[^ \t\r\n]" contents)) - ;; Don't create blank parts. (push (nconc tag (list (cons 'contents contents))) struct)) (let ((nstruct (mml-parse-singlepart-with-multiple-charsets -- cgit v1.2.3 From 1b7eb828644a13259ff072e3464c6e8493571e6e Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 12:31:44 +0200 Subject: Tweak the Message screenshot insertion * lisp/gnus/message.el (message-insert-screenshot): Force scaling to 1, since the screenshot image will already be suitable for displaying directly (it's the same resolution). --- lisp/gnus/message.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 1453cbe643e..378c3b04673 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -8694,9 +8694,12 @@ used to take the screenshot." (insert-image (create-image image 'png t :max-width (* (frame-pixel-width) 0.8) - :max-height (* (frame-pixel-height) 0.8)) + :max-height (* (frame-pixel-height) 0.8) + :scale 1) (format "<#part type=\"image/png\" disposition=inline content-transfer-encoding=base64 raw=t>\n%s\n<#/part>" - ;; Get a base64 version of the image. + ;; Get a base64 version of the image -- this avoids later + ;; complications if we're auto-saving the buffer and + ;; restoring from a file. (with-temp-buffer (set-buffer-multibyte nil) (insert image) -- cgit v1.2.3 From 38ad404ba58e83292b3b566a64d8c655aa126cf7 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Wed, 5 Aug 2020 11:40:27 +0100 Subject: ; Silence recent byte-compiler warning in subr.el * lisp/subr.el (save-match-data-internal): Declare before first use. --- lisp/subr.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index 3c8dbd16146..6bd06a0b82c 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -883,6 +883,10 @@ side-effects, and the argument LIST is not modified." ;;;; Keymap support. +;; Declare before first use of `save-match-data', +;; where it is used internally. +(defvar save-match-data-internal) + (defun kbd (keys) "Convert KEYS to the internal Emacs key representation. KEYS should be a string in the format returned by commands such @@ -4105,8 +4109,6 @@ MODES is as for `set-default-file-modes'." ;;; Matching and match data. -(defvar save-match-data-internal) - ;; We use save-match-data-internal as the local variable because ;; that works ok in practice (people should not use that variable elsewhere). ;; We used to use an uninterned symbol; the compiler handles that properly -- cgit v1.2.3 From a937d50a7e039088d493d8f6b8b5be9799b7d7ad Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 12:43:18 +0200 Subject: Mention C-y in the manual for yanking the primary selection * doc/emacs/killing.texi (Primary Selection): Mention C-y here for yanking the primary selection (bug#41857). --- doc/emacs/killing.texi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 6b1f35e6158..bd7dbb6f515 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -577,7 +577,9 @@ regions to the primary selection entirely. To insert the primary selection into an Emacs buffer, click @kbd{mouse-2} (@code{mouse-yank-primary}) where you want to insert it. -@xref{Mouse Commands}. +@xref{Mouse Commands}. You can also use the normal Emacs yank command +(@kbd{C-y}) to insert this text if @code{select-enable-primary} is set +(@pxref{Clipboard}). @cindex MS-Windows, and primary selection MS-Windows provides no primary selection, but Emacs emulates it -- cgit v1.2.3 From dc47bc77dc1c9d34c4c1e2830fe2bfd6be6e241a Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 12:49:14 +0200 Subject: mouse-drag-copy-region doc string clarification * lisp/mouse.el (mouse-drag-copy-region): Clarify that the variable only applies to selections in Emacs (bug#41856). --- lisp/mouse.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lisp/mouse.el b/lisp/mouse.el index 640f10af4e1..d369545f18e 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -49,7 +49,10 @@ "If non-nil, copy to kill-ring upon mouse adjustments of the region. This affects `mouse-save-then-kill' (\\[mouse-save-then-kill]) in -addition to mouse drags." +addition to mouse drags. + +This variable applies only to mouse adjustments in Emacs, not +selecting and adjusting regions in other windows." :type 'boolean :version "24.1") -- cgit v1.2.3 From 4b3f44fc97d3cb29fceb47ec5ba16009b6de7152 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 15:02:28 +0200 Subject: Fix max-width/height for Message screenshots * lisp/gnus/message.el (message-insert-screenshot): :max-width/height apparently has to be integers. --- lisp/gnus/message.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 378c3b04673..cf2b8eebc30 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -8693,8 +8693,8 @@ used to take the screenshot." (set-mark (point)) (insert-image (create-image image 'png t - :max-width (* (frame-pixel-width) 0.8) - :max-height (* (frame-pixel-height) 0.8) + :max-width (truncate (* (frame-pixel-width) 0.8)) + :max-height (truncate (* (frame-pixel-height) 0.8)) :scale 1) (format "<#part type=\"image/png\" disposition=inline content-transfer-encoding=base64 raw=t>\n%s\n<#/part>" ;; Get a base64 version of the image -- this avoids later -- cgit v1.2.3 From 9d409746df593a6579bf7fd4d8ecff08e278cdf8 Mon Sep 17 00:00:00 2001 From: Harald Jörg Date: Wed, 5 Aug 2020 15:37:13 +0200 Subject: cperl-mode: Workaround for failure of cperl-write-tags * lisp/progmodes/cperl-mode.el (cperl-mode): Accomodate recent changes in etags (bug#42356). --- lisp/progmodes/cperl-mode.el | 1 + 1 file changed, 1 insertion(+) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index cdbb59a5add..6755d10f1ab 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -6786,6 +6786,7 @@ Use as (or topdir (setq topdir default-directory)) (let ((tags-file-name "TAGS") + (inhibit-read-only t) (case-fold-search nil) xs rel) (save-excursion -- cgit v1.2.3 From 7389a9ef0954d61bf5a85221da7c919aee3451a0 Mon Sep 17 00:00:00 2001 From: Harald Jörg Date: Wed, 5 Aug 2020 15:55:00 +0200 Subject: cperl-mode: Fix bad parameter construction in cperl-etags * lisp/progmodes/cperl-mode.el (cperl-etags): This fails with (wrong-type-argument stringp cperl-sub-regexp). The error came with incorporating Jonathan Rockway's work (bug#42355). Copyright-paperwork-exempt: yes --- lisp/progmodes/cperl-mode.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 6755d10f1ab..6fe0c018b1d 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -6499,9 +6499,10 @@ If optional argument ALL is `recursive', will process Perl files in subdirectories too." (interactive) (let ((cmd "etags") - (args '("-l" "none" "-r" + (args `("-l" "none" "-r" ;; 1=fullname 2=package? 3=name 4=proto? 5=attrs? (VERY APPROX!) - "/\\<" cperl-sub-regexp "[ \\t]+\\(\\([a-zA-Z0-9:_]*::\\)?\\([a-zA-Z0-9_]+\\)\\)[ \\t]*\\(([^()]*)[ \t]*\\)?\\([ \t]*:[^#{;]*\\)?\\([{#]\\|$\\)/\\3/" + ,(concat + "/\\<" cperl-sub-regexp "[ \\t]+\\(\\([a-zA-Z0-9:_]*::\\)?\\([a-zA-Z0-9_]+\\)\\)[ \\t]*\\(([^()]*)[ \t]*\\)?\\([ \t]*:[^#{;]*\\)?\\([{#]\\|$\\)/\\3/") "-r" "/\\ Date: Wed, 5 Aug 2020 16:07:41 +0200 Subject: Wrap skeleton logic in atomic-change-group * lisp/skeleton.el (define-skeleton): Use an atomic change group so that if the user `C-g's in the middle of it, we're not left with half a skeleton in the buffer (bug#42311). --- lisp/skeleton.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/skeleton.el b/lisp/skeleton.el index 8c694c128b5..3609d6ba6a0 100644 --- a/lisp/skeleton.el +++ b/lisp/skeleton.el @@ -135,7 +135,8 @@ A prefix argument of -1 says to wrap around region, even if not highlighted. A prefix argument of zero says to wrap around zero words---that is, nothing. This is a way of overriding the use of a highlighted region.") (interactive "*P\nP") - (skeleton-proxy-new ',skeleton str arg)))) + (atomic-change-group + (skeleton-proxy-new ',skeleton str arg))))) ;;;###autoload (defun skeleton-proxy-new (skeleton &optional str arg) -- cgit v1.2.3 From 283fce4c3cdb89745a62fdeee83dcd7c2189fba3 Mon Sep 17 00:00:00 2001 From: Harald Jörg Date: Wed, 5 Aug 2020 17:19:06 +0200 Subject: cperl-mode.el: Correctly terminate HERE-docs * lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): cperl-mode in the master branch wrongly uses the first occurrence of "HERE" to terminate the string, resulting in badly fontified / indented code which follows (bug#42251). --- lisp/progmodes/cperl-mode.el | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 6fe0c018b1d..5ecd5668b34 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -3560,19 +3560,18 @@ the sections using `cperl-pod-head-face', `cperl-pod-face', "\\(\\`\n?\\|^\n\\)=" ; POD "\\|" ;; One extra () before this: - "<<~?" ; HERE-DOC - "\\(" ; 1 + 1 + "<<\\(~?\\)" ; HERE-DOC, indented-p = capture 2 + "\\(" ; 2 + 1 ;; First variant "BLAH" or just ``. "[ \t]*" ; Yes, whitespace is allowed! - "\\([\"'`]\\)" ; 2 + 1 = 3 - "\\([^\"'`\n]*\\)" ; 3 + 1 - "\\3" + "\\([\"'`]\\)" ; 3 + 1 = 4 + "\\([^\"'`\n]*\\)" ; 4 + 1 + "\\4" "\\|" ;; Second variant: Identifier or \ID (same as 'ID') or empty - "\\\\?\\(\\([a-zA-Z_][a-zA-Z_0-9]*\\)?\\)" ; 4 + 1, 5 + 1 + "\\\\?\\(\\([a-zA-Z_][a-zA-Z_0-9]*\\)?\\)" ; 5 + 1, 6 + 1 ;; Do not have <<= or << 30 or <<30 or << $blah. ;; "\\([^= \t0-9$@%&]\\|[ \t]+[^ \t\n0-9$@%&]\\)" ; 6 + 1 - "\\(\\)" ; To preserve count of pars :-( 6 + 1 "\\)" "\\|" ;; 1+6 extra () before this: @@ -3762,11 +3761,11 @@ the sections using `cperl-pod-head-face', `cperl-pod-face', ;; ;; "\\([^= \t0-9$@%&]\\|[ \t]+[^ \t\n0-9$@%&]\\)" ; 6 + 1 ;; "\\(\\)" ; To preserve count of pars :-( 6 + 1 ;; "\\)" - ((match-beginning 2) ; 1 + 1 + ((match-beginning 3) ; 2 + 1 (setq b (point) tb (match-beginning 0) c (and ; not HERE-DOC - (match-beginning 5) + (match-beginning 6) (save-match-data (or (looking-at "[ \t]*(") ; << function_call() (save-excursion ; 1 << func_name, or $foo << 10 @@ -3793,17 +3792,17 @@ the sections using `cperl-pod-head-face', `cperl-pod-face', (looking-at "\\(printf?\\|say\\|system\\|exec\\|sort\\)\\>"))) (error t))))))) (error nil))) ; func(< Date: Wed, 5 Aug 2020 18:01:27 +0200 Subject: Enable replying to an ical event even when not an attendee * lisp/gnus/gnus-icalendar.el (gnus-icalendar-event--build-reply-event-body): Display a warning instead of barfing when user is missing from attendee list. When the user identity is not present in the attendee list, an error is triggered making replying to such an event impossible (the reply message not being even composed). This replaces it with a warning. This is necessary because one may receive events that the organizer did not set up well and it is up to the user to decide whether or not to reply to them (bug#41723). Copyright-paperwork-exempt: yes --- lisp/gnus/gnus-icalendar.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/gnus/gnus-icalendar.el b/lisp/gnus/gnus-icalendar.el index 305e17fd8fc..29d3e30780f 100644 --- a/lisp/gnus/gnus-icalendar.el +++ b/lisp/gnus/gnus-icalendar.el @@ -312,7 +312,8 @@ status will be retrieved from the first matching attendee record." (unless (gnus-icalendar-find-if (lambda (x) (string-match "^ATTENDEE" x)) reply-event-lines) - (error "Could not find an event attendee matching given identity")) + (lwarn 'gnus-icalendar :warning + "Could not find an event attendee matching given identity")) (mapconcat #'identity `("BEGIN:VEVENT" ,@(nreverse reply-event-lines) -- cgit v1.2.3 From 1669cf2f286649ea62991371fd19bbc592ca21bb Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 21:17:55 +0200 Subject: Split sometimes-failing test into three tests to ease debugging --- test/lisp/gnus/mml-sec-tests.el | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/test/lisp/gnus/mml-sec-tests.el b/test/lisp/gnus/mml-sec-tests.el index 50bb6e6b278..d9ed96ff1db 100644 --- a/test/lisp/gnus/mml-sec-tests.el +++ b/test/lisp/gnus/mml-sec-tests.el @@ -606,7 +606,7 @@ In this test, encrypt-to-self variables are set to lists." (list (cons "C3999CF1268DBEA2" "EF25402B479DC6E2") (cons "F7E79AB7AE31D471" "4035D59B5F88E9FC")))))) -(ert-deftest mml-first-secure-en-decrypt-sign-1 () +(ert-deftest mml-secure-en-decrypt-sign-1-1-single () "Sign and encrypt message; then decrypt and test for expected result. In this test, just multiple encryption and signing keys may be available." (mml-secure-test-key-fixture @@ -626,17 +626,28 @@ In this test, just multiple encryption and signing keys may be available." ;; customized choice for both keys (mml-secure-test-en-decrypt method "sub@example.org" "sub@example.org" 1 t) - ) + ))))) +(ert-deftest mml-secure-en-decrypt-sign-1-2-double () + "Sign and encrypt message; then decrypt and test for expected result. +In this test, just multiple encryption and signing keys may be available." + (mml-secure-test-key-fixture + (lambda () + (let ((mml-secure-openpgp-sign-with-sender t) + (mml-secure-smime-sign-with-sender t)) ;; Now use both keys to sign. The customized one via sign-with-sender, ;; the other one via the following setting. (let ((mml-secure-openpgp-signers '("F7E79AB7AE31D471")) (mml-secure-smime-signers '("0x5F88E9FC"))) (dolist (method (enc-sign-standards) nil) (mml-secure-test-en-decrypt - method "no-exp@example.org" "sub@example.org" 2 t) - ))) + method "no-exp@example.org" "sub@example.org" 2 t))))))) +(ert-deftest mml-secure-en-decrypt-sign-1-3-double () + "Sign and encrypt message; then decrypt and test for expected result. +In this test, just multiple encryption and signing keys may be available." + (mml-secure-test-key-fixture + (lambda () ;; Now use both keys for sub@example.org to sign an e-mail from ;; a different address (without associated keys). (let ((mml-secure-openpgp-sign-with-sender nil) @@ -646,8 +657,7 @@ In this test, just multiple encryption and signing keys may be available." (mml-secure-smime-signers '("0x5F88E9FC" "0x479DC6E2"))) (dolist (method (enc-sign-standards) nil) (mml-secure-test-en-decrypt - method "no-exp@example.org" "no-keys@example.org" 2 t) - ))))) + method "no-exp@example.org" "no-keys@example.org" 2 t)))))) (ert-deftest mml-secure-en-decrypt-sign-2 () "Sign and encrypt message; then decrypt and test for expected result. -- cgit v1.2.3 From 1a99697b4d8c11a10d5e6a306103740d92cc08a1 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Wed, 5 Aug 2020 21:30:12 +0200 Subject: Skip epg tests if gpg isn't installed --- test/lisp/gnus/mml-sec-tests.el | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/lisp/gnus/mml-sec-tests.el b/test/lisp/gnus/mml-sec-tests.el index d9ed96ff1db..917e627c7ec 100644 --- a/test/lisp/gnus/mml-sec-tests.el +++ b/test/lisp/gnus/mml-sec-tests.el @@ -36,6 +36,9 @@ Mostly, the empty passphrase is used. However, the keys for \"No Expiry two UIDs\" have the passphrase \"Passphrase\" (for OpenPGP as well as S/MIME).") +(defun test-conf () + (ignore-errors (epg-configuration))) + (defun enc-standards () (if with-smime '(enc-pgp enc-pgp-mime enc-smime) '(enc-pgp enc-pgp-mime))) @@ -200,6 +203,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-key-checks () "Test mml-secure-check-user-id and mml-secure-check-sub-key on sample keys." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let* ((context (epg-make-context 'OpenPGP)) @@ -267,6 +271,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-find-usable-keys-1 () "Make sure that expired and disabled keys and revoked UIDs are not used." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let ((context (epg-make-context 'OpenPGP))) @@ -305,6 +310,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-find-usable-keys-2 () "Test different ways to search for keys." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let ((context (epg-make-context 'OpenPGP))) @@ -356,6 +362,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-select-preferred-keys-1 () "If only one key exists for an e-mail address, it is the preferred one." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let ((context (epg-make-context 'OpenPGP))) @@ -366,6 +373,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-select-preferred-keys-2 () "If multiple keys exists for an e-mail address, customization is necessary." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let* ((context (epg-make-context 'OpenPGP)) @@ -392,6 +400,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-select-preferred-keys-3 () "Expired customized keys are removed if multiple keys are available." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let ((context (epg-make-context 'OpenPGP)) @@ -416,6 +425,7 @@ In both cases, the first key is customized for signing and encryption." (ert-deftest mml-secure-select-preferred-keys-4 () "Multiple keys can be recorded per recipient or signature." + (skip-unless (test-conf)) (mml-secure-test-fixture (lambda () (let ((pcontext (epg-make-context 'OpenPGP)) @@ -559,6 +569,7 @@ If optional EXPECTFAIL is non-nil, a decryption failure is expected." (ert-deftest mml-secure-en-decrypt-1 () "Encrypt message; then decrypt and test for expected result. In this test, the single matching key is chosen automatically." + (skip-unless (test-conf)) (dolist (method (enc-standards) nil) ;; no-exp@example.org with single encryption key (mml-secure-test-en-decrypt @@ -568,6 +579,7 @@ In this test, the single matching key is chosen automatically." (ert-deftest mml-secure-en-decrypt-2 () "Encrypt message; then decrypt and test for expected result. In this test, the encryption key needs to fixed among multiple ones." + (skip-unless (test-conf)) ;; sub@example.org with multiple candidate keys, ;; fixture customizes preferred ones. (mml-secure-test-key-fixture @@ -580,6 +592,7 @@ In this test, the encryption key needs to fixed among multiple ones." (ert-deftest mml-secure-en-decrypt-3 () "Encrypt message; then decrypt and test for expected result. In this test, encrypt-to-self variables are set to t." + (skip-unless (test-conf)) ;; sub@example.org with multiple candidate keys, ;; fixture customizes preferred ones. (mml-secure-test-key-fixture @@ -595,6 +608,7 @@ In this test, encrypt-to-self variables are set to t." (ert-deftest mml-secure-en-decrypt-4 () "Encrypt message; then decrypt and test for expected result. In this test, encrypt-to-self variables are set to lists." + (skip-unless (test-conf)) ;; Send from sub@example.org, which has two keys; encrypt to both. (let ((mml-secure-openpgp-encrypt-to-self '("C3999CF1268DBEA2" "F7E79AB7AE31D471")) @@ -609,6 +623,7 @@ In this test, encrypt-to-self variables are set to lists." (ert-deftest mml-secure-en-decrypt-sign-1-1-single () "Sign and encrypt message; then decrypt and test for expected result. In this test, just multiple encryption and signing keys may be available." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (let ((mml-secure-openpgp-sign-with-sender t) @@ -631,6 +646,7 @@ In this test, just multiple encryption and signing keys may be available." (ert-deftest mml-secure-en-decrypt-sign-1-2-double () "Sign and encrypt message; then decrypt and test for expected result. In this test, just multiple encryption and signing keys may be available." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (let ((mml-secure-openpgp-sign-with-sender t) @@ -646,6 +662,7 @@ In this test, just multiple encryption and signing keys may be available." (ert-deftest mml-secure-en-decrypt-sign-1-3-double () "Sign and encrypt message; then decrypt and test for expected result. In this test, just multiple encryption and signing keys may be available." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () ;; Now use both keys for sub@example.org to sign an e-mail from @@ -662,6 +679,7 @@ In this test, just multiple encryption and signing keys may be available." (ert-deftest mml-secure-en-decrypt-sign-2 () "Sign and encrypt message; then decrypt and test for expected result. In this test, lists of encryption and signing keys are customized." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (let ((mml-secure-key-preferences @@ -695,6 +713,7 @@ In this test, lists of encryption and signing keys are customized." (ert-deftest mml-secure-en-decrypt-sign-3 () "Sign and encrypt message; then decrypt and test for expected result. Use sign-with-sender and encrypt-to-self." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (let ((mml-secure-openpgp-sign-with-sender t) @@ -710,6 +729,7 @@ Use sign-with-sender and encrypt-to-self." (ert-deftest mml-secure-sign-verify-1 () "Sign message with sender; then verify and test for expected result." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (dolist (method (sign-standards) nil) @@ -731,6 +751,7 @@ Use sign-with-sender and encrypt-to-self." (ert-deftest mml-secure-sign-verify-2 () "Sign message without sender; then verify and test for expected result." + (skip-unless (test-conf)) (mml-secure-test-key-fixture (lambda () (dolist (method (sign-standards) nil) @@ -762,6 +783,7 @@ Use sign-with-sender and encrypt-to-self." (ert-deftest mml-secure-sign-verify-3 () "Try to sign message with expired OpenPGP subkey, which raises an error. With Ma Gnus v0.14 and earlier a signature would be created with a wrong key." + (skip-unless (test-conf)) (should-error (mml-secure-test-key-fixture (lambda () @@ -784,6 +806,7 @@ With Ma Gnus v0.14 and earlier a signature would be created with a wrong key." In this test, a key is used that requires the passphrase \"Passphrase\". In the first decryption this passphrase is hardcoded, in the second one it is taken from a cache." + (skip-unless (test-conf)) (ert-skip "Requires passphrase") (mml-secure-test-key-fixture (lambda () @@ -814,6 +837,7 @@ So the second decryption fails." (ert-deftest mml-secure-en-decrypt-passphrase-no-cache-openpgp-todo () "Passphrase caching with OpenPGP only for GnuPG 1.x." + (skip-unless (test-conf)) (skip-unless (string< (cdr (assq 'version (epg-configuration))) "2")) (mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp) (mml-secure-en-decrypt-passphrase-no-cache 'enc-pgp-mime)) @@ -821,6 +845,7 @@ So the second decryption fails." (ert-deftest mml-secure-en-decrypt-passphrase-no-cache-smime-todo () "Passphrase caching does not work with S/MIME (and gpgsm)." :expected-result :failed + (skip-unless (test-conf)) (if with-smime (mml-secure-en-decrypt-passphrase-no-cache 'enc-smime) (should nil))) -- cgit v1.2.3 From 155b2c8a8d51a492a8c350b92bd3e83187d72b78 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 5 Aug 2020 17:36:50 -0700 Subject: Simplify Solaris port MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should avoid some configuration confusion as exemplified by Jeffrey Walton’s recent bug report (Bug#42675). * configure.ac (opsys): Simplify Solaris configuration by not worrying about Solaris 9 and earlier, as they are no longer supported by the Solaris developers. This should support Walton’s ‘./configure --build=x86_64-sun-solaris’. Instead of bothering with ‘opsys=sol2-6’ and ‘opsys=sol2-10’, just use ‘opsys=solaris’. All uses changed. (emacs_check_sunpro_c): Remove unused var. * doc/misc/tramp.texi (Remote programs): * etc/MACHINES, etc/PROBLEMS: Modernize PATH for Oracle Developer Studio. * etc/PROBLEMS: Move Solaris-related problems to legacy area, except those that are still relevant. --- configure.ac | 76 ++++++++++------------------- doc/misc/tramp.texi | 2 +- etc/MACHINES | 25 +++++----- etc/PROBLEMS | 135 +++++++++++++++++++++++++++------------------------- lisp/dired-aux.el | 4 +- 5 files changed, 110 insertions(+), 132 deletions(-) diff --git a/configure.ac b/configure.ac index 4ee4517e11c..c9aa076eb3b 100644 --- a/configure.ac +++ b/configure.ac @@ -748,44 +748,21 @@ case "${canonical}" in opsys=aix4-2 ;; - ## Suns - *-sun-solaris* \ - | i[3456]86-*-solaris2* | i[3456]86-*-sunos5* \ - | x86_64-*-solaris2* | x86_64-*-sunos5*) + ## Solaris + *-*-solaris* | *-*-sunos*) case "${canonical}" in i[3456]86-*-* ) ;; amd64-*-*|x86_64-*-*) ;; sparc* ) ;; * ) unported=yes ;; esac - case "${canonical}" in - *-sunos5.[1-9][0-9]* | *-solaris2.[1-9][0-9]* ) - opsys=sol2-10 - emacs_check_sunpro_c=yes - ;; - *-sunos5.[1-5]* | *-solaris2.[1-5]* ) unported=yes ;; - ## Note that Emacs 23.1's NEWS said the following would be dropped. - *-sunos5.6* | *-solaris2.6* ) - opsys=sol2-6 - RANLIB="ar -ts" - ;; - ## 5.7 EOL Aug 2008, 5.8 EOL Mar 2012. - *-sunos5.[7-9]* | *-solaris2.[7-9]* ) - opsys=sol2-6 - emacs_check_sunpro_c=yes - ;; - esac + opsys=solaris ## Watch out for a compiler that we know will not work. - case "${canonical}" in - *-solaris* | *-sunos5* ) - if [ "x$CC" = x/usr/ucb/cc ]; then - ## /usr/ucb/cc doesn't work; - ## we should find some other compiler that does work. - unset CC - fi - ;; - *) ;; - esac + if [ "$CC" = /usr/ucb/cc ]; then + ## /usr/ucb/cc doesn't work; + ## we should find some other compiler that does work. + unset CC + fi ;; ## QNX Neutrino @@ -1476,14 +1453,11 @@ case "$opsys" in mingw32) UNEXEC_OBJ=unexw32.o ;; - sol2-10) + solaris) # Use the Solaris dldump() function, called from unexsol.c, to dump # emacs, instead of the generic ELF dump code found in unexelf.c. # The resulting binary has a complete symbol table, and is better # for debugging and other observability tools (debuggers, pstack, etc). - # - # It is likely that dldump() works with older Solaris too, but this has - # not been tested, so for now this change is for Solaris 10 or newer. UNEXEC_OBJ=unexsol.o ;; *) @@ -1586,7 +1560,7 @@ case "$opsys" in qnxnto) LIBS_SYSTEM="-lsocket" ;; - sol2*) LIBS_SYSTEM="-lsocket -lnsl" ;; + solaris) LIBS_SYSTEM="-lsocket -lnsl" ;; ## Motif needs -lgen. unixware) LIBS_SYSTEM="-lsocket -lnsl -lelf -lgen" ;; @@ -1647,7 +1621,7 @@ case $opsys in SYSTEM_TYPE=berkeley-unix ;; - sol2* | unixware ) + solaris | unixware ) SYSTEM_TYPE=usg-unix-v ;; @@ -2291,7 +2265,7 @@ system_malloc=yes test $with_unexec = yes && case "$opsys" in ## darwin ld insists on the use of malloc routines in the System framework. - darwin | mingw32 | nacl | sol2-10) ;; + darwin | mingw32 | nacl | solaris) ;; cygwin | qnxnto | freebsd) hybrid_malloc=yes system_malloc= ;; @@ -2427,7 +2401,7 @@ if test "$ac_cv_header_pthread_h" && test "$opsys" != "mingw32"; then # need special flags to disable these optimizations. For example, the # definition of 'errno' in . case $opsys in - hpux* | sol*) + hpux* | solaris) AC_DEFINE([_REENTRANT], 1, [Define to 1 if your system requires this in multithreaded code.]);; aix4-2) @@ -2557,7 +2531,7 @@ fail; ## inoue@ainet.or.jp says Solaris has a bug related to X11R6-style ## XIM support. case "$opsys" in - sol2-*) : ;; + solaris) : ;; *) AC_DEFINE(HAVE_X11R6_XIM, 1, [Define if you have usable X11R6-style XIM support.]) ;; @@ -4692,7 +4666,7 @@ if test "$USE_X_TOOLKIT" != "none"; then fi case $opsys in - sol2* | unixware ) + solaris | unixware ) dnl Some SVr4s don't define NSIG in sys/signal.h for ANSI environments; dnl instead, there's a system variable _sys_nsig. Unfortunately, we dnl need the constant to dimension an array. So wire in the appropriate @@ -4705,7 +4679,7 @@ emacs_broken_SIGIO=no case $opsys in dnl SIGIO exists, but the feature doesn't work in the way Emacs needs. - hpux* | nacl | openbsd | sol2* | unixware ) + hpux* | nacl | openbsd | solaris | unixware ) emacs_broken_SIGIO=yes ;; @@ -4754,7 +4728,7 @@ case $opsys in esac case $opsys in - gnu-* | sol2-10 ) + gnu-* | solaris ) dnl FIXME Can't we test if this exists (eg /proc/$$)? AC_DEFINE(HAVE_PROCFS, 1, [Define if you have the /proc filesystem.]) ;; @@ -4883,7 +4857,7 @@ case $opsys in AC_DEFINE(PTY_TTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/pty/tty%c%x", c, i);]) ;; - sol2* ) + solaris ) dnl On SysVr4, grantpt(3) forks a subprocess, so do not use dnl O_CLOEXEC when opening the pty, and keep the SIGCHLD handler dnl from intercepting that death. If any child but grantpt's should die @@ -4893,7 +4867,7 @@ case $opsys in ;; unixware ) - dnl Comments are as per sol2*. + dnl Comments are as per solaris. AC_DEFINE(PTY_OPEN, [fd = open (pty_name, O_RDWR | O_NONBLOCK)]) AC_DEFINE(PTY_TTY_NAME_SPRINTF, [{ char *ptsname (int), *ptyname; int grantpt_result; sigset_t blocked; sigemptyset (&blocked); sigaddset (&blocked, SIGCHLD); pthread_sigmask (SIG_BLOCK, &blocked, 0); grantpt_result = grantpt (fd); pthread_sigmask (SIG_UNBLOCK, &blocked, 0); if (grantpt_result == -1) fatal("could not grant slave pty"); if (unlockpt(fd) == -1) fatal("could not unlock slave pty"); if (!(ptyname = ptsname(fd))) fatal ("could not enable slave pty"); snprintf (pty_name, PTY_NAME_SIZE, "%s", ptyname); }]) ;; @@ -4901,7 +4875,7 @@ esac case $opsys in - sol2* | unixware ) + solaris | unixware ) dnl This change means that we don't loop through allocate_pty too dnl many times in the (rare) event of a failure. AC_DEFINE(FIRST_PTY_LETTER, ['z']) @@ -4996,7 +4970,7 @@ if test x$GCC = xyes; then AC_DEFINE(GC_SETJMP_WORKS, 1) else case $opsys in - aix* | dragonfly | freebsd | netbsd | openbsd | sol2* ) + aix* | dragonfly | freebsd | netbsd | openbsd | solaris ) AC_DEFINE(GC_SETJMP_WORKS, 1) ;; esac @@ -5043,7 +5017,7 @@ case $emacs_cv_func_sigsetjmp,$emacs_cv_alternate_stack,$opsys in esac case $opsys in - sol2* | unixware ) + solaris | unixware ) dnl TIOCGPGRP is broken in SysVr4, so we can't send signals to PTY dnl subprocesses the usual way. But TIOCSIGNAL does work for PTYs, dnl and this is all we need. @@ -5053,7 +5027,7 @@ esac case $opsys in - hpux* | sol2* ) + hpux* | solaris ) dnl Used in xfaces.c. AC_DEFINE(XOS_NEEDS_TIME_H, 1, [Compensate for a bug in Xos.h on some systems, where it requires time.h.]) @@ -5108,7 +5082,7 @@ case $opsys in fi ;; - sol2*) + solaris) AC_DEFINE(USG, []) AC_DEFINE(USG5_4, []) AC_DEFINE(SOLARIS2, [], [Define if the system is Solaris.]) @@ -5173,7 +5147,7 @@ case $opsys in reopen it in the child.]) ;; - sol2-10) + solaris) AC_DEFINE(_STRUCTURED_PROC, 1, [Needed for system_process_attributes on Solaris.]) ;; diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi index 91b1e996f45..56cd220e20e 100644 --- a/doc/misc/tramp.texi +++ b/doc/misc/tramp.texi @@ -2105,7 +2105,7 @@ To improve performance and accuracy of remote file access, @file{/usr/bin}, which are reasonable for most hosts. To accommodate differences in hosts and paths, for example, @file{/bin:/usr/bin} on Debian GNU/Linux or -@file{/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin} on +@file{/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/developerstudio12.6/bin} on Solaris, @value{tramp} queries the remote host with @command{getconf PATH} and updates the symbol @code{tramp-default-remote-path}. diff --git a/etc/MACHINES b/etc/MACHINES index 1bb244b49b0..78e9cef0fd7 100644 --- a/etc/MACHINES +++ b/etc/MACHINES @@ -81,25 +81,26 @@ the list at the end of this file. ** Solaris - On Solaris it is also possible to use either GCC or Solaris Studio - to build Emacs, by pointing ./configure to the right compiler: + On Solaris it is also possible to use either GCC or Oracle Developer + Studio to build Emacs, by pointing ./configure to the right compiler: - ./configure CC='/usr/sfw/bin/gcc' # GCC - ./configure CC='cc' # Solaris Studio + ./configure # Defaults to 'gcc' if available. + ./configure CC='cc' # Oracle Developer Studio - On Solaris, do not use /usr/ucb/cc. Use /opt/SUNWspro/bin/cc. Make - sure that /usr/ccs/bin and /opt/SUNWspro/bin are in your PATH before - /usr/ucb. (Most free software packages have the same requirement on - Solaris.) With this compiler, use '/opt/SUNWspro/bin/cc -E' as the + On Solaris, do not use /usr/ucb/cc. Use Oracle Developer Studio. + Make sure that /usr/ccs/bin and the Oracle Developer Studio bin + directory (e.g., /opt/developerstudio12.6/bin) are in your PATH + before /usr/ucb. (Most free software packages have the same + requirement on Solaris.) With this compiler, use 'cc -E' as the preprocessor. If this inserts extra whitespace into its output (see - the PROBLEMS file) then add the option '-Xs'. + the PROBLEMS file), add the option '-Xs'. To build a 64-bit Emacs (with larger maximum buffer size) on a - Solaris system which supports 64-bit executables, specify the -m64 + Solaris system that defaults to 32-bit executables, specify the -m64 compiler option. For example: - ./configure CC='/usr/sfw/bin/gcc -m64' # GCC - ./configure CC='cc -m64' # Solaris Studio + ./configure CC='gcc -m64' # GCC + ./configure CC='cc -m64' # Oracle Developer Studio * Obsolete platforms diff --git a/etc/PROBLEMS b/etc/PROBLEMS index 4ce738d9a54..598a79f978a 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -2222,6 +2222,7 @@ We list bugs in current versions here. See also the section on legacy systems. *** On Solaris 10, Emacs crashes during the build process. +(This applies only with './configure --with-unexec=yes', which is rare.) This was reported for Emacs 25.2 on i386-pc-solaris2.10 with Sun Studio 12 (Sun C 5.9) and with Oracle Developer Studio 12.6 (Sun C 5.15), and intermittently for sparc-sun-solaris2.10 with Oracle @@ -2239,66 +2240,6 @@ Solaris. See Bug#26638. This is a Solaris feature (at least on Intel x86 cpus). Type C-r C-r C-t, to toggle whether C-x gets through to Emacs. -*** Problem with remote X server on Suns. - -On a Sun, running Emacs on one machine with the X server on another -may not work if you have used the unshared system libraries. This -is because the unshared libraries fail to use YP for host name lookup. -As a result, the host name you specify may not be recognized. - -*** Solaris 2.6: Emacs crashes with SIGBUS or SIGSEGV on Solaris after you delete a frame. - -We suspect that this is a bug in the X libraries provided by -Sun. There is a report that one of these patches fixes the bug and -makes the problem stop: - -105216-01 105393-01 105518-01 105621-01 105665-01 105615-02 105216-02 -105667-01 105401-08 105615-03 105621-02 105686-02 105736-01 105755-03 -106033-01 105379-01 105786-01 105181-04 105379-03 105786-04 105845-01 -105284-05 105669-02 105837-01 105837-02 105558-01 106125-02 105407-01 - -Another person using a newer system (kernel patch level Generic_105181-06) -suspects that the bug was fixed by one of these more recent patches: - -106040-07 SunOS 5.6: X Input & Output Method patch -106222-01 OpenWindows 3.6: filemgr (ff.core) fixes -105284-12 Motif 1.2.7: sparc Runtime library patch - -*** Solaris 7 or 8: Emacs reports a BadAtom error (from X) - -This happens when Emacs was built on some other version of Solaris. -Rebuild it on Solaris 8. - -*** When using M-x dbx with the SparcWorks debugger, the 'up' and 'down' -commands do not move the arrow in Emacs. - -You can fix this by adding the following line to '~/.dbxinit': - - dbxenv output_short_file_name off - -*** On Solaris, CTRL-t is ignored by Emacs when you use -the fr.ISO-8859-15 locale (and maybe other related locales). - -You can fix this by editing the file: - - /usr/openwin/lib/locale/iso8859-15/Compose - -Near the bottom there is a line that reads: - - Ctrl : "\276" threequarters - -while it should read: - - Ctrl : "\276" threequarters - -Note the lower case . Changing this line should make C-t work. - -*** On Solaris, Emacs fails to set menu-bar-update-hook on startup, with error -"Error in menu-bar-update-hook: (error Point before start of properties)". -This seems to be a GCC optimization bug that occurs for GCC 4.1.2 (-g -and -g -O2) and GCC 4.2.3 (-g -O and -g -O2). You can fix this by -compiling with GCC 4.2.3 or CC 5.7, with no optimizations. - * Runtime problems specific to MS-Windows ** Emacs on Windows 9X requires UNICOWS.DLL @@ -2733,13 +2674,13 @@ Libxpm is available for macOS as part of the XQuartz project. This indicates a mismatch between the C compiler and preprocessor that configure is using. For example, on Solaris 10 trying to use -CC=/opt/SUNWspro/bin/cc (the Sun Studio compiler) together with -CPP=/usr/ccs/lib/cpp can result in errors of this form (you may also -see the error '"/usr/include/sys/isa_defs.h", line 500: undefined control'). +CC=/opt/developerstudio12.6/bin/cc (the Oracle Developer Studio +compiler) together with CPP=/usr/lib/cpp can result in errors of +this form. The solution is to tell configure to use the correct C preprocessor -for your C compiler (CPP="/opt/SUNWspro/bin/cc -E" in the above -example). +for your C compiler (CPP="/opt/developerstudio12.6/bin/cc -E" in the +above example). ** Compilation @@ -3110,7 +3051,69 @@ This section covers bugs reported on very old hardware or software. If you are using hardware and an operating system shipped after 2000, it is unlikely you will see any of these. -*** Solaris 2.x +** Solaris + +*** Problem with remote X server on Suns. + +On a Sun, running Emacs on one machine with the X server on another +may not work if you have used the unshared system libraries. This +is because the unshared libraries fail to use YP for host name lookup. +As a result, the host name you specify may not be recognized. + +*** Solaris 2.6: Emacs crashes with SIGBUS or SIGSEGV on Solaris after you delete a frame. + +We suspect that this is a bug in the X libraries provided by +Sun. There is a report that one of these patches fixes the bug and +makes the problem stop: + +105216-01 105393-01 105518-01 105621-01 105665-01 105615-02 105216-02 +105667-01 105401-08 105615-03 105621-02 105686-02 105736-01 105755-03 +106033-01 105379-01 105786-01 105181-04 105379-03 105786-04 105845-01 +105284-05 105669-02 105837-01 105837-02 105558-01 106125-02 105407-01 + +Another person using a newer system (kernel patch level Generic_105181-06) +suspects that the bug was fixed by one of these more recent patches: + +106040-07 SunOS 5.6: X Input & Output Method patch +106222-01 OpenWindows 3.6: filemgr (ff.core) fixes +105284-12 Motif 1.2.7: sparc Runtime library patch + +*** Solaris 7 or 8: Emacs reports a BadAtom error (from X) + +This happens when Emacs was built on some other version of Solaris. +Rebuild it on Solaris 8. + +*** When using M-x dbx with the SparcWorks debugger, the 'up' and 'down' +commands do not move the arrow in Emacs. + +You can fix this by adding the following line to '~/.dbxinit': + + dbxenv output_short_file_name off + +*** On Solaris, CTRL-t is ignored by Emacs when you use +the fr.ISO-8859-15 locale (and maybe other related locales). + +You can fix this by editing the file: + + /usr/openwin/lib/locale/iso8859-15/Compose + +Near the bottom there is a line that reads: + + Ctrl : "\276" threequarters + +while it should read: + + Ctrl : "\276" threequarters + +Note the lower case . Changing this line should make C-t work. + +*** On Solaris, Emacs fails to set menu-bar-update-hook on startup, with error +"Error in menu-bar-update-hook: (error Point before start of properties)". +This seems to be a GCC optimization bug that occurs for GCC 4.1.2 (-g +and -g -O2) and GCC 4.2.3 (-g -O and -g -O2). You can fix this by +compiling with GCC 4.2.3 or CC 5.7, with no optimizations. + +*** Other legacy Solaris problems **** Strange results from format %d in a few cases, on a Sun. diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 806a3955e4d..777df79a6ef 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -1014,8 +1014,8 @@ To undo the killing, the undo command can be used as normally." (defvar dired-compress-file-suffixes '( ;; "tar -zxf" isn't used because it's not available on the - ;; Solaris10 version of tar. Solaris10 becomes obsolete in 2021. - ;; Same thing on AIX 7.1. + ;; Solaris 10 version of tar (obsolete in 2024?). + ;; Same thing on AIX 7.1 (obsolete 2023?) and 7.2 (obsolete 2022?). ("\\.tar\\.gz\\'" "" "gzip -dc %i | tar -xf -") ("\\.tgz\\'" "" "gzip -dc %i | tar -xf -") ("\\.gz\\'" "" "gunzip") -- cgit v1.2.3 From 7384f194bebb161b8f4ef7617f8c328721cd433f Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 08:12:31 +0200 Subject: Make 'byte-compile-info*' functions more logical * lisp/emacs-lisp/byte-run.el (byte-compile-info): New function that's more flexible that replaces 'byte-compile-info-string' and 'byte-compile-info-message'. (byte-compile-info-string): Make obsolete. (byte-compile-info-message): Ditto. * lisp/international/ja-dic-cnv.el (skkdic-convert-okuri-ari) (skkdic-convert-postfix, skkdic-convert-prefix) (skkdic-collect-okuri-nasi, skkdic-set-okuri-nasi): * lisp/finder.el (finder-compile-keywords): * lisp/cus-dep.el (custom-make-dependencies): Adjust callers to use the new function. --- lisp/cus-dep.el | 10 +++++----- lisp/emacs-lisp/byte-run.el | 17 +++++++++++++++-- lisp/finder.el | 2 +- lisp/international/ja-dic-cnv.el | 13 ++++++------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lisp/cus-dep.el b/lisp/cus-dep.el index fd307a5c04e..f1061a8621b 100644 --- a/lisp/cus-dep.el +++ b/lisp/cus-dep.el @@ -70,7 +70,7 @@ Usage: emacs -batch -l ./cus-dep.el -f custom-make-dependencies DIRS" (directory-files subdir nil "\\`[^=.].*\\.el\\'")))) (progress (make-progress-reporter - (byte-compile-info-string "Scanning files for custom") + (byte-compile-info "Scanning files for custom") 0 (length files) nil 10))) (with-temp-buffer (dolist (elem files) @@ -127,8 +127,8 @@ Usage: emacs -batch -l ./cus-dep.el -f custom-make-dependencies DIRS" type))))))))))) (error nil))))))) (progress-reporter-done progress)) - (byte-compile-info-message "Generating %s..." - generated-custom-dependencies-file) + (byte-compile-info + (format "Generating %s..." generated-custom-dependencies-file) t) (set-buffer (find-file-noselect generated-custom-dependencies-file)) (setq buffer-undo-list t) (erase-buffer) @@ -217,8 +217,8 @@ elements the files that have variables or faces that contain that version. These files should be loaded before showing the customization buffer that `customize-changed-options' generates.\")\n\n")) (save-buffer) - (byte-compile-info-message "Generating %s...done" - generated-custom-dependencies-file)) + (byte-compile-info + (format "Generating %s...done" generated-custom-dependencies-file) t)) (provide 'cus-dep) diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el index 88e21b73fed..5279a57cd0c 100644 --- a/lisp/emacs-lisp/byte-run.el +++ b/lisp/emacs-lisp/byte-run.el @@ -576,13 +576,26 @@ Otherwise, return nil. For internal use only." (mapconcat (lambda (char) (format "`?\\%c'" char)) sorted ", "))))) +(defun byte-compile-info (string &optional message type) + "Format STRING in a way that looks pleasing in the compilation output. +If MESSAGE, output the message, too. + +If TYPE, it should be a string that says what the information +type is. This defaults to \"INFO\"." + (let ((string (format " %-9s%s" (or type "INFO") string))) + (when message + (message "%s" string)) + string)) + (defun byte-compile-info-string (&rest args) "Format ARGS in a way that looks pleasing in the compilation output." - (format " %-9s%s" "INFO" (apply #'format args))) + (declare (obsolete byte-compile-info "28.1")) + (byte-compile-info (apply #'format args))) (defun byte-compile-info-message (&rest args) "Message format ARGS in a way that looks pleasing in the compilation output." - (message "%s" (apply #'byte-compile-info-string args))) + (declare (obsolete byte-compile-info "28.1")) + (byte-compile-info (apply #'format args) t)) ;; I nuked this because it's not a good idea for users to think of using it. diff --git a/lisp/finder.el b/lisp/finder.el index f04d73e098f..820d6d0a3b9 100644 --- a/lisp/finder.el +++ b/lisp/finder.el @@ -197,7 +197,7 @@ from; the default is `load-path'." (cons d f)) (directory-files d nil el-file-regexp)))) (progress (make-progress-reporter - (byte-compile-info-string "Scanning files for finder") + (byte-compile-info "Scanning files for finder") 0 (length files))) package-override base-name ; processed summary keywords package version entry desc) diff --git a/lisp/international/ja-dic-cnv.el b/lisp/international/ja-dic-cnv.el index 45e13462656..f5e70ce7021 100644 --- a/lisp/international/ja-dic-cnv.el +++ b/lisp/international/ja-dic-cnv.el @@ -48,7 +48,7 @@ (defvar ja-dic-filename "ja-dic.el") (defun skkdic-convert-okuri-ari (skkbuf buf) - (byte-compile-info-message "Processing OKURI-ARI entries") + (byte-compile-info "Processing OKURI-ARI entries" t) (goto-char (point-min)) (with-current-buffer buf (insert ";; Setting okuri-ari entries.\n" @@ -97,7 +97,7 @@ ("ゆき" "行"))) (defun skkdic-convert-postfix (skkbuf buf) - (byte-compile-info-message "Processing POSTFIX entries") + (byte-compile-info "Processing POSTFIX entries" t) (goto-char (point-min)) (with-current-buffer buf (insert ";; Setting postfix entries.\n" @@ -151,7 +151,7 @@ (defconst skkdic-prefix-list '(skkdic-prefix-list)) (defun skkdic-convert-prefix (skkbuf buf) - (byte-compile-info-message "Processing PREFIX entries") + (byte-compile-info "Processing PREFIX entries" t) (goto-char (point-min)) (with-current-buffer buf (insert ";; Setting prefix entries.\n" @@ -273,7 +273,7 @@ (defun skkdic-collect-okuri-nasi () (save-excursion (let ((progress (make-progress-reporter - (byte-compile-info-message "Collecting OKURI-NASI entries") + (byte-compile-info "Collecting OKURI-NASI entries" t) (point) (point-max) nil 10))) (while (re-search-forward "^\\(\\cH+\\) \\(/\\cj.*\\)/$" @@ -301,7 +301,7 @@ "(skkdic-set-okuri-nasi\n") (let ((l (nreverse skkdic-okuri-nasi-entries)) (progress (make-progress-reporter - (byte-compile-info-message "Processing OKURI-NASI entries") + (byte-compile-info "Processing OKURI-NASI entries" t) 0 skkdic-okuri-nasi-entries-count nil 10)) (count 0)) @@ -531,8 +531,7 @@ To get complete usage, invoke: ',(let ((l entries) (map '(skdic-okuri-nasi)) (progress (make-progress-reporter - (byte-compile-info-message - "Extracting OKURI-NASI entries") + (byte-compile-info "Extracting OKURI-NASI entries") 0 (length entries))) (count 0) entry) -- cgit v1.2.3 From 104dd3b641142671669fc52d33cbcf6cf5f29891 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 08:20:09 +0200 Subject: Make the loaddefs scraping compilation output look more regular * lisp/Makefile.in ($(lisp)/loaddefs.el): Don't output the directories here. * lisp/emacs-lisp/autoload.el (batch-update-autoloads--summary): New function. (batch-update-autoloads): Use it to output the directories we're scraping. This changes the compilation output from: Directories for loaddefs: . ./calc ./calendar ./cedet ./cedet/ede ./cedet/semantic ./cedet/semantic/analyze ./cedet/semantic/bovine ./cedet/semantic/decorate ./cedet/semantic/symref ./cedet/semantic/wisent ./cedet/srecode ./emacs-lisp ./emulation ./erc ./eshell ./gnus ./image ./international ./language ./leim ./leim/ja-dic ./leim/quail ./mail ./mh-e ./net ./nxml ./org ./play ./progmodes ./textmodes ./url ./vc (but all on one long line) To: SCRAPE . ./calc ./calendar ./cedet ./cedet/ede ./cedet/semantic SCRAPE ./cedet/semantic/analyze ./cedet/semantic/bovine SCRAPE ./cedet/semantic/decorate ./cedet/semantic/symref SCRAPE ./cedet/semantic/wisent ./cedet/srecode ./emacs-lisp ./emulation SCRAPE ./erc ./eshell ./gnus ./image ./international ./language ./leim SCRAPE ./leim/ja-dic ./leim/quail ./mail ./mh-e ./net ./nxml ./org ./play SCRAPE ./progmodes ./textmodes ./url ./vc Compilation output with very long lines can be mistaken for errors when they scroll by fast in the compilation output. Making it look more like normal informational output avoids this confusion. --- lisp/Makefile.in | 1 - lisp/emacs-lisp/autoload.el | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lisp/Makefile.in b/lisp/Makefile.in index 57527bb5afc..84c5733918a 100644 --- a/lisp/Makefile.in +++ b/lisp/Makefile.in @@ -196,7 +196,6 @@ $(lisp)/finder-inf.el: autoloads .PHONY: $(lisp)/loaddefs.el $(lisp)/loaddefs.el: gen-lisp $(LOADDEFS) - @echo Directories for loaddefs: ${SUBDIRS_ALMOST} $(AM_V_GEN)$(emacs) -l autoload \ --eval '(setq autoload-ensure-writable t)' \ --eval '(setq autoload-builtin-package-versions t)' \ diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el index ede4edcd57e..222a378566f 100644 --- a/lisp/emacs-lisp/autoload.el +++ b/lisp/emacs-lisp/autoload.el @@ -1124,7 +1124,7 @@ write its autoloads into the specified file instead." ;; Elements remaining in FILES have no existing autoload sections yet. (let ((no-autoloads-time (or last-time '(0 0 0 0))) (progress (make-progress-reporter - (byte-compile-info-string + (byte-compile-info (concat "Scraping files for " (file-relative-name generated-autoload-file))) @@ -1167,6 +1167,19 @@ write its autoloads into the specified file instead." ;; file-local autoload-generated-file settings. (autoload-save-buffers)))) +(defun batch-update-autoloads--summary (strings) + (let ((message "")) + (while strings + (when (> (length (concat message " " (car strings))) 68) + (byte-compile-info message t "SCRAPE") + (setq message "")) + (setq message (if (zerop (length message)) + (car strings) + (concat message " " (car strings)))) + (setq strings (cdr strings))) + (when (> (length message) 0) + (byte-compile-info message t "SCRAPE")))) + ;;;###autoload (defun batch-update-autoloads () "Update loaddefs.el autoloads in batch mode. @@ -1190,6 +1203,7 @@ should be non-nil)." (or (string-match "\\`site-" file) (push (expand-file-name file) autoload-excludes))))))) (let ((args command-line-args-left)) + (batch-update-autoloads--summary args) (setq command-line-args-left nil) (apply #'update-directory-autoloads args))) -- cgit v1.2.3 From 47910420c0fd62976ffa075e35da8a8e3398a836 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 08:24:56 +0200 Subject: Tweak the autoloads scrape output slightly * lisp/emacs-lisp/autoload.el (batch-update-autoloads--summary): Output " ..." at the end of the non-concluding lines to signify that the output continues. --- lisp/emacs-lisp/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el index 222a378566f..c76de43be91 100644 --- a/lisp/emacs-lisp/autoload.el +++ b/lisp/emacs-lisp/autoload.el @@ -1170,8 +1170,8 @@ write its autoloads into the specified file instead." (defun batch-update-autoloads--summary (strings) (let ((message "")) (while strings - (when (> (length (concat message " " (car strings))) 68) - (byte-compile-info message t "SCRAPE") + (when (> (length (concat message " " (car strings))) 64) + (byte-compile-info (concat message " ...") t "SCRAPE") (setq message "")) (setq message (if (zerop (length message)) (car strings) -- cgit v1.2.3 From 7a56e5a44a390aaa29711d63f125f4b802df07c1 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 09:09:57 +0200 Subject: Mark two cconv tests as :unstable * test/lisp/emacs-lisp/cconv-tests.el (cconv-tests-cl-iter-defun-:documentation): Mark as unstable (bug#42723). (cconv-tests-iter-defun-:documentation): Ditto. --- test/lisp/emacs-lisp/cconv-tests.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/lisp/emacs-lisp/cconv-tests.el b/test/lisp/emacs-lisp/cconv-tests.el index 148bcd69be1..0ea9742be49 100644 --- a/test/lisp/emacs-lisp/cconv-tests.el +++ b/test/lisp/emacs-lisp/cconv-tests.el @@ -82,6 +82,7 @@ (ert-deftest cconv-tests-cl-iter-defun-:documentation () "Docstring for cl-iter-defun can be specified with :documentation." ;; FIXME: See Bug#28557. + :tags '(:unstable) :expected-result :failed (should (string= (documentation 'cconv-tests-cl-iter-defun) "cl-iter-defun documentation")) @@ -94,6 +95,7 @@ (ert-deftest cconv-tests-iter-defun-:documentation () "Docstring for iter-defun can be specified with :documentation." ;; FIXME: See Bug#28557. + :tags '(:unstable) :expected-result :failed (should (string= (documentation 'cconv-tests-iter-defun) "iter-defun documentation")) -- cgit v1.2.3 From 361baa451adac7333e1037c3bc73bd95afa9b769 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 11:51:22 +0200 Subject: Make 'n'/'p' in image mode buffers respect dired sorting The commands now also now work on archive and tar mode parent buffers. * doc/emacs/files.texi (Image Mode): Document it. * lisp/arc-mode.el (archive-goto-file): New function (bug#38647). (archive-next-file-displayer): Ditto. * lisp/image-mode.el (image-next-file): Reimplement to work on displayed dired buffers and the like. This means that `n' and `p' now works on the displayed ordering in the dired buffer, so if you've reversed the sorting, `n' picks the right "next" file. (image-mode--directory-buffers): New function. (image-mode--next-file): Ditto. * lisp/tar-mode.el (tar-goto-file): New function. (tar-next-file-displayer): Ditto. --- doc/emacs/files.texi | 7 +++- etc/NEWS | 9 +++++ lisp/arc-mode.el | 47 +++++++++++++++++++++++++ lisp/image-mode.el | 98 ++++++++++++++++++++++++++++++++++++++++++---------- lisp/tar-mode.el | 50 +++++++++++++++++++++++++++ 5 files changed, 191 insertions(+), 20 deletions(-) diff --git a/doc/emacs/files.texi b/doc/emacs/files.texi index 5998326ffef..2fa1ecc003d 100644 --- a/doc/emacs/files.texi +++ b/doc/emacs/files.texi @@ -2149,7 +2149,12 @@ To reset all transformations to the initial state, use @findex image-previous-file You can press @kbd{n} (@code{image-next-file}) and @kbd{p} (@code{image-previous-file}) to visit the next image file and the -previous image file in the same directory, respectively. +previous image file in the same directory, respectively. These +commands will consult the ``parent'' dired buffer to determine what +the next/previous image file is. These commands also work when +opening a file from archive files (like zip or tar files), and will +then instead consult the archive mode buffer. If neither an archive +nor a dired ``parent'' buffer can be found, a dired buffer is opened. @findex image-mode-mark-file @findex image-mode-unmark-file diff --git a/etc/NEWS b/etc/NEWS index 8c6e3e78139..cbb1842e139 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -538,6 +538,15 @@ took more than two seconds to display. The new algorithm maintains a decaying average of delays, and if this number gets too high, the animation is stopped. ++++ +*** The 'n' and 'p' commands (next/previous image) now respects dired order. +These commands would previously display the next/previous image in +alphabetical order, but will now find the "parent" dired buffer and +select the next/previous image file according to how the files are +sorted there. The commands have also been extended to work when the +"parent" buffer is an archive mode (i.e., zip file or the like) or tar +mode buffer. + ** EWW +++ diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index 6781c292d82..901f09302ef 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -989,6 +989,53 @@ using `make-temp-file', and the generated name is returned." (kill-local-variable 'buffer-file-coding-system) (after-insert-file-set-coding (- (point-max) (point-min)))))) +(defun archive-goto-file (file) + "Go to FILE in the current buffer. +FILE should be a relative file name. If FILE can't be found, +return nil. Otherwise point is returned." + (let ((start (point)) + found) + (goto-char (point-min)) + (while (and (not found) + (not (eobp))) + (forward-line 1) + (when-let ((descr (archive-get-descr t))) + (when (equal (archive--file-desc-ext-file-name descr) file) + (setq found t)))) + (if (not found) + (progn + (goto-char start) + nil) + (point)))) + +(defun archive-next-file-displayer (file regexp n) + "Return a closure to display the next file after FILE that matches REGEXP." + (let ((short (replace-regexp-in-string "\\`.*:" "" file)) + next) + (archive-goto-file short) + (while (and (not next) + ;; Stop if we reach the end/start of the buffer. + (if (> n 0) + (not (eobp)) + (not (save-excursion + (beginning-of-line) + (bobp))))) + (archive-next-line n) + (when-let ((descr (archive-get-descr t))) + (let ((candidate (archive--file-desc-ext-file-name descr)) + (buffer (current-buffer))) + (when (and candidate + (string-match-p regexp candidate)) + (setq next (lambda () + (kill-buffer (current-buffer)) + (switch-to-buffer buffer) + (archive-extract))))))) + (unless next + ;; If we didn't find a next/prev file, then restore + ;; point. + (archive-goto-file short)) + next)) + (defun archive-extract (&optional other-window-p event) "In archive mode, extract this entry of the archive into its own buffer." (interactive (list nil last-input-event)) diff --git a/lisp/image-mode.el b/lisp/image-mode.el index c417be43da5..948e62e10d0 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -40,6 +40,7 @@ (require 'image) (require 'exif) +(require 'dired) (eval-when-compile (require 'cl-lib)) ;;; Image mode window-info management. @@ -1085,28 +1086,87 @@ replacing the current Image mode buffer." (error "The buffer is not in Image mode")) (unless buffer-file-name (error "The current image is not associated with a file")) - (let* ((file (file-name-nondirectory buffer-file-name)) - (images (image-mode--images-in-directory file)) - (idx 0)) - (catch 'image-visit-next-file - (dolist (f images) - (if (string= f file) - (throw 'image-visit-next-file (1+ idx))) - (setq idx (1+ idx)))) - (setq idx (mod (+ idx (or n 1)) (length images))) - (let ((image (nth idx images)) - (dir (file-name-directory buffer-file-name))) - (find-alternate-file image) - ;; If we have dired buffer(s) open to where this image is, then - ;; place point on it. + (let ((next (image-mode--next-file buffer-file-name n))) + (unless next + (user-error "No %s file in this directory" + (if (> n 0) + "next" + "prev"))) + (if (stringp next) + (find-alternate-file next) + (funcall next)))) + +(defun image-mode--directory-buffers (file) + "Return a alist of type/buffer for all \"parent\" buffers to image FILE. +This is normally a list of dired buffers, but can also be archive and +tar mode buffers." + (let ((buffers nil) + (dir (file-name-directory file))) + (cond + ((and (boundp 'tar-superior-buffer) + tar-superior-buffer) + (when (buffer-live-p tar-superior-buffer) + (push (cons 'tar tar-superior-buffer) buffers))) + ((and (boundp 'archive-superior-buffer) + archive-superior-buffer) + (when (buffer-live-p archive-superior-buffer) + (push (cons 'archive archive-superior-buffer) buffers))) + (t + ;; Find a dired buffer. (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (and (derived-mode-p 'dired-mode) + (with-current-buffer buffer + (when (and (derived-mode-p 'dired-mode) (equal (file-truename dir) (file-truename default-directory))) - (save-window-excursion - (switch-to-buffer (current-buffer) t t) - (dired-goto-file (expand-file-name image dir))))))))) + (push (cons 'dired (current-buffer)) buffers)))) + ;; If we can't find any buffers to navigate in, we open a dired + ;; buffer. + (unless buffers + (push (cons 'dired (find-file-noselect dir)) buffers) + (message "Opened a dired buffer on %s" dir)))) + buffers)) + +(declare-function archive-next-file-displayer "arc-mode") +(declare-function tar-next-file-displayer "tar-mode") + +(defun image-mode--next-file (file n) + "Go to the next image file in the parent buffer of FILE. +This is typically a dired buffer, but may also be a tar/archive buffer. +Return the next image file from that buffer. +If N is negative, go to the previous file." + (let ((regexp (image-file-name-regexp)) + (buffers (image-mode--directory-buffers file)) + next) + (dolist (buffer buffers) + ;; We do this traversal for all the dired buffers open on this + ;; directory. There probably is just one, but we want to move + ;; point in all of them. + (save-window-excursion + (switch-to-buffer (cdr buffer) t t) + (cl-case (car buffer) + ('dired + (dired-goto-file file) + (let (found) + (while (and (not found) + ;; Stop if we reach the end/start of the buffer. + (if (> n 0) + (not (eobp)) + (not (bobp)))) + (dired-next-line n) + (let ((candidate (dired-get-filename nil t))) + (when (and candidate + (string-match-p regexp candidate)) + (setq found candidate)))) + (if found + (setq next found) + ;; If we didn't find a next/prev file, then restore + ;; point. + (dired-goto-file file)))) + ('archive + (setq next (archive-next-file-displayer file regexp n))) + ('tar + (setq next (tar-next-file-displayer file regexp n)))))) + next)) (defun image-previous-file (&optional n) "Visit the preceding image in the same directory as the current file. diff --git a/lisp/tar-mode.el b/lisp/tar-mode.el index 73978ffc4a7..5cf09f9055e 100644 --- a/lisp/tar-mode.el +++ b/lisp/tar-mode.el @@ -922,6 +922,56 @@ actually appear on disk when you save the tar-file's buffer." (setq buffer-undo-list nil)))) buffer)) +(defun tar-goto-file (file) + "Go to FILE in the current buffer. +FILE should be a relative file name. If FILE can't be found, +return nil. Otherwise point is returned." + (let ((start (point)) + found) + (goto-char (point-min)) + (while (and (not found) + (not (eobp))) + (forward-line 1) + (when-let ((descriptor (ignore-errors (tar-get-descriptor)))) + (when (equal (tar-header-name descriptor) file) + (setq found t)))) + (if (not found) + (progn + (goto-char start) + nil) + (point)))) + +(defun tar-next-file-displayer (file regexp n) + "Return a closure to display the next file after FILE that matches REGEXP." + (let ((short (replace-regexp-in-string "\\`.*!" "" file)) + next) + ;; The tar buffer chops off leading "./", so do the same + ;; here. + (setq short (replace-regexp-in-string "\\`\\./" "" file)) + (tar-goto-file short) + (while (and (not next) + ;; Stop if we reach the end/start of the buffer. + (if (> n 0) + (not (eobp)) + (not (save-excursion + (beginning-of-line) + (bobp))))) + (tar-next-line n) + (when-let ((descriptor (ignore-errors (tar-get-descriptor)))) + (let ((candidate (tar-header-name descriptor)) + (buffer (current-buffer))) + (when (and candidate + (string-match-p regexp candidate)) + (setq next (lambda () + (kill-buffer (current-buffer)) + (switch-to-buffer buffer) + (tar-extract))))))) + (unless next + ;; If we didn't find a next/prev file, then restore + ;; point. + (tar-goto-file short)) + next)) + (defun tar-extract (&optional other-window-p) "In Tar mode, extract this entry of the tar file into its own buffer." (interactive) -- cgit v1.2.3 From 66bdf77adfa115ad16ec8557c250f0e5683262b0 Mon Sep 17 00:00:00 2001 From: Nick Helm Date: Thu, 6 Aug 2020 12:11:57 +0200 Subject: Signal an error in dired when moving to a directory that doesn't exist * lisp/dired-aux.el (dired-do-create-files): Give an error when apparently moving to a directory name, and that directory doesn't exist (bug#38707). --- lisp/dired-aux.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 777df79a6ef..6587d039b72 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -1978,6 +1978,10 @@ Optional arg HOW-TO determines how to treat the target. (apply (car into-dir) operation rfn-list fn-list target (cdr into-dir)) (if (not (or dired-one-file into-dir)) (error "Marked %s: target must be a directory: %s" operation target)) + (if (and (not (file-directory-p (car fn-list))) + (not (file-directory-p target)) + (directory-name-p target)) + (error "%s: Target directory does not exist: %s" operation target)) ;; rename-file bombs when moving directories unless we do this: (or into-dir (setq target (directory-file-name target))) (dired-create-files -- cgit v1.2.3 From b5ea24cb44a34ee433a6212d9791fe7aff711d3d Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 14:50:40 +0200 Subject: Make it possible to use Message as a mailto: desktop handler * doc/misc/message.texi (System Mailer Setup): Document the usage. * lisp/gnus/gnus-art.el (gnus-url-mailto): Move most of the code here to 'message-mailto-1' (bug#38314). * lisp/gnus/message.el (message-parse-mailto-url): Mark as obsolete. (message-parse-mailto-url): Rewritten slightly from the above. (message-mailto): New command. (message-mailto-1): New function. --- doc/misc/message.texi | 24 +++++++++++++++++++++ etc/NEWS | 10 +++++++++ etc/emacs-mail.desktop | 20 ++++++++++++++++++ lisp/gnus/gnus-art.el | 28 +++---------------------- lisp/gnus/message.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 etc/emacs-mail.desktop diff --git a/doc/misc/message.texi b/doc/misc/message.texi index 7a66422b17e..c9a466eae9f 100644 --- a/doc/misc/message.texi +++ b/doc/misc/message.texi @@ -99,6 +99,7 @@ sending it. * Resending:: Resending a mail message. * Bouncing:: Bouncing a mail message. * Mailing Lists:: Send mail to mailing lists. +* System Mailer Setup:: Using Message as the system mailer. @end menu You can customize the Message Mode tool bar, see @kbd{M-x @@ -529,6 +530,29 @@ It is considered good netiquette to honor MFT, as it is assumed the fellow who posted a message knows where the followups need to go better than you do. + +@node System Mailer Setup +@section System Mailer Setup +@cindex mailto: + +Emacs can be set up as the system mailer, so that Emacs is opened when +you click on @samp{mailto:} links in other programs. + +How this is done varies from system to system, but commonly there's a +way to set the default application for a @acronym{MIME} type, and the +relevant type here is @samp{x-scheme-handler/mailto;}. + +The application to start should be @samp{"emacs -f message-mailto %u"}. +This will start Emacs, and then run the @code{message-mailto} +command. It will parse the given @acronym{URL}, and set up a Message +buffer with the given parameters. + +For instance, @samp{mailto:larsi@@gnus.org;subject=This+is+a+test} +will open a Message buffer with the @samp{To:} header filled in with +@samp{"larsi@@gnus.org"} and the @samp{Subject:} header with +@samp{"This is a test"}. + + @node Commands @chapter Commands diff --git a/etc/NEWS b/etc/NEWS index cbb1842e139..2df7bac9d73 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -236,6 +236,16 @@ not. ** Message ++++ +*** New function to start Emacs in Message mode to send an email. +Emacs can be defined as a handler for the "x-scheme-handler/mailto" +MIME type with the following command: "emacs -f message-mailto %u". +An emacs-mail.desktop file has been included, suitable for installing +in desktop directories like /usr/share/applications. Clicking on a +mailto: link in other applications will then open Emacs with headers +filled out according to the link, e.g. +"mailto:larsi@gnus.org;subject=This+is+a+test". + --- *** Change to default value of 'message-draft-headers' user option. The 'Date' symbol has been removed from the default value, meaning that diff --git a/etc/emacs-mail.desktop b/etc/emacs-mail.desktop new file mode 100644 index 00000000000..dec6cdb3459 --- /dev/null +++ b/etc/emacs-mail.desktop @@ -0,0 +1,20 @@ +Desktop Entry] +Categories=Network;Email; +Comment=GNU Emacs is an extensible, customizable text editor - and more +Exec=/home/larsi/src/emacs/trunk/src/emacs -f message-mailto %u +Icon=emacs +Name=Emacs (Mail) +MimeType=x-scheme-handler/mailto; +NoDisplay=false +Terminal=false +Type=Application +Desktop Entry] +Categories=Network;Email; +Comment=GNU Emacs is an extensible, customizable text editor - and more +Exec=emacs -f message-mailto %u +Icon=emacs +Name=Emacs (Mail) +MimeType=x-scheme-handler/mailto; +NoDisplay=false +Terminal=false +Type=Application diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index d33539bc7f7..1be8c48bcfc 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -8341,6 +8341,7 @@ url is put as the `gnus-button-url' overlay property on the button." (and (match-end 6) (list (string-to-number (match-string 6 address)))))))) (defun gnus-url-parse-query-string (query &optional downcase) + (declare (obsolete message-parse-mailto-url "28.1")) (let (retval pairs cur key val) (setq pairs (split-string query "&")) (while pairs @@ -8360,31 +8361,8 @@ url is put as the `gnus-button-url' overlay property on the button." (defun gnus-url-mailto (url) ;; Send mail to someone - (setq url (replace-regexp-in-string "\n" " " url)) - (when (string-match "mailto:/*\\(.*\\)" url) - (setq url (substring url (match-beginning 1) nil))) - (let* ((args (gnus-url-parse-query-string - (if (string-match "^\\?" url) - (substring url 1) - (if (string-match "^\\([^?]+\\)\\?\\(.*\\)" url) - (concat "to=" (match-string 1 url) "&" - (match-string 2 url)) - (concat "to=" url))))) - (subject (cdr-safe (assoc "subject" args))) - func) - (gnus-msg-mail) - (while args - (setq func (intern-soft (concat "message-goto-" (downcase (caar args))))) - (if (fboundp func) - (funcall func) - (message-position-on-field (caar args))) - (insert (replace-regexp-in-string - "\r\n" "\n" - (mapconcat #'identity (reverse (cdar args)) ", ") nil t)) - (setq args (cdr args))) - (if subject - (message-goto-body) - (message-goto-subject)))) + (gnus-msg-mail) + (message-mailto-1 url)) (defun gnus-button-embedded-url (address) "Activate ADDRESS with `browse-url'." diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index cf2b8eebc30..71ab63de39e 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -8708,6 +8708,63 @@ used to take the screenshot." (insert "\n\n") (message ""))) +(declare-function gnus-url-unhex-string "gnus-util") + +(defun message-parse-mailto-url (url) + "Parse a mailto: url." + (setq url (replace-regexp-in-string "\n" " " url)) + (when (string-match "mailto:/*\\(.*\\)" url) + (setq url (substring url (match-beginning 1) nil))) + (setq url (if (string-match "^\\?" url) + (substring url 1) + (if (string-match "^\\([^?]+\\)\\?\\(.*\\)" url) + (concat "to=" (match-string 1 url) "&" + (match-string 2 url)) + (concat "to=" url)))) + (let (retval pairs cur key val) + (setq pairs (split-string url "&")) + (while pairs + (setq cur (car pairs) + pairs (cdr pairs)) + (if (not (string-match "=" cur)) + nil ; Grace + (setq key (downcase (gnus-url-unhex-string + (substring cur 0 (match-beginning 0)))) + val (gnus-url-unhex-string (substring cur (match-end 0) nil) t)) + (setq cur (assoc key retval)) + (if cur + (setcdr cur (cons val (cdr cur))) + (setq retval (cons (list key val) retval))))) + retval)) + +;;;###autoload +(defun message-mailto () + "Function to be run to parse command line mailto: links. +This is meant to be used for MIME handlers: Setting the handler +for \"x-scheme-handler/mailto;\" to \"emacs -fn message-mailto %u\" +will then start up Emacs ready to compose mail." + (interactive) + ;; Send email + (message-mail) + (message-mailto-1 (car command-line-args-left)) + (setq command-line-args-left (cdr command-line-args-left))) + +(defun message-mailto-1 (url) + (let ((args (message-parse-mailto-url url))) + (dolist (arg args) + (unless (equal (car arg) "body") + (message-position-on-field (capitalize (car arg))) + (insert (replace-regexp-in-string + "\r\n" "\n" + (mapconcat #'identity (reverse (cdr arg)) ", ") nil t)))) + (when (assoc "body" args) + (message-goto-body) + (dolist (body (cdr (assoc "body" args))) + (insert body "\n"))) + (if (assoc "subject" args) + (message-goto-body) + (message-goto-subject)))) + (provide 'message) (run-hooks 'message-load-hook) -- cgit v1.2.3 From 51d063e484c185b7e1d9cb4c6bf56d67b9af4781 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 15:11:48 +0200 Subject: Add a new HTML skeleton for relative (file) URLs * lisp/textmodes/sgml-mode.el (html-href-anchor-file): New skeleton and keystroke (bug#37644). --- etc/NEWS | 7 +++++++ lisp/textmodes/sgml-mode.el | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/etc/NEWS b/etc/NEWS index 2df7bac9d73..c57773922ed 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -659,6 +659,13 @@ custom rules, see the variables 'bug-reference-setup-from-vc-alist', 'bug-reference-setup-from-mail-alist', and 'bug-reference-setup-from-irc-alist'. +** HTML Mode + +--- +*** A new skeleton for adding relative URLs has been added. +It's bound to the 'C-c C-c f' keystroke, and prompts for a local file +name. + * New Modes and Packages in Emacs 28.1 diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el index b5ff6a69671..1672dce4f23 100644 --- a/lisp/textmodes/sgml-mode.el +++ b/lisp/textmodes/sgml-mode.el @@ -1806,6 +1806,7 @@ This takes effect when first loading the library.") (define-key map "\C-c\C-cc" 'html-checkboxes) (define-key map "\C-c\C-cl" 'html-list-item) (define-key map "\C-c\C-ch" 'html-href-anchor) + (define-key map "\C-c\C-cf" 'html-href-anchor-file) (define-key map "\C-c\C-cn" 'html-name-anchor) (define-key map "\C-c\C-c#" 'html-id-anchor) (define-key map "\C-c\C-ci" 'html-image) @@ -1818,6 +1819,7 @@ This takes effect when first loading the library.") (define-key map "\C-cc" 'html-checkboxes) (define-key map "\C-cl" 'html-list-item) (define-key map "\C-ch" 'html-href-anchor) + (define-key map "\C-cf" 'html-href-anchor-file) (define-key map "\C-cn" 'html-name-anchor) (define-key map "\C-c#" 'html-id-anchor) (define-key map "\C-ci" 'html-image) @@ -1845,7 +1847,8 @@ This takes effect when first loading the library.") (define-key menu-map "\n" '("Line Break" . html-line)) (define-key menu-map "\r" '("Paragraph" . html-paragraph)) (define-key menu-map "i" '("Image" . html-image)) - (define-key menu-map "h" '("Href Anchor" . html-href-anchor)) + (define-key menu-map "h" '("Href Anchor URL" . html-href-anchor)) + (define-key menu-map "f" '("Href Anchor File" . html-href-anchor-file)) (define-key menu-map "n" '("Name Anchor" . html-name-anchor)) (define-key menu-map "#" '("ID Anchor" . html-id-anchor)) map) @@ -2453,6 +2456,11 @@ HTML Autoview mode is a buffer-local minor mode for use with ;; '(setq input "http:") "" _ "") +(define-skeleton html-href-anchor-file + "HTML anchor tag with href attribute (from a local file)." + (file-relative-name (read-file-name "File name: ") default-directory) + "" _ "") + (define-skeleton html-name-anchor "HTML anchor tag with name attribute." "Name: " -- cgit v1.2.3 From d3fabff99d4aa74f752956ea5b02be7a977efb94 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 15:53:24 +0200 Subject: Change how Mail-Copies-To: never is handled in Message * lisp/gnus/message.el (message-get-reply-headers): Change how Mail-Copies-To: never is handled (bug#37591). When that header is present, put all the remaining recipients in the To header, instead of picking an arbitrary recipient to have in the To header, and the rest in the Cc header. --- etc/NEWS | 10 ++++++++++ lisp/gnus/message.el | 31 ++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index c57773922ed..185c649186a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -236,6 +236,16 @@ not. ** Message +--- +*** A change to how Mail-Copies-To: never is handled. +If a user has specified Mail-Copies-To: never, and Message was asked +to do a "wide reply", some other arbitrary recipient would end up in +the resulting To header, while the remaining recipients would be put +in the Cc header. This is somewhat misleading, as it looks like +you're responding to a specific person in particular. This has been +changed so that all the recipients are put in the To header in these +instances. + +++ *** New function to start Emacs in Message mode to send an email. Emacs can be defined as a handler for the "x-scheme-handler/mailto" diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 71ab63de39e..6c0f9b5c9ba 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -6998,15 +6998,28 @@ want to get rid of this query permanently."))) ;; Build the header alist. Allow the user to be asked whether ;; or not to reply to all recipients in a wide reply. - (setq follow-to (list (cons 'To (cdr (pop recipients))))) - (when (and recipients - (or (not message-wide-reply-confirm-recipients) - (y-or-n-p "Reply to all recipients? "))) - (setq recipients (mapconcat - (lambda (addr) (cdr addr)) recipients ", ")) - (if (string-match "^ +" recipients) - (setq recipients (substring recipients (match-end 0)))) - (push (cons 'Cc recipients) follow-to))) + (when (or (< (length recipients) 2) + (not message-wide-reply-confirm-recipients) + (y-or-n-p "Reply to all recipients? ")) + (if never-mct + ;; The author has requested never to get a (wide) + ;; response, so put everybody else into the To header. + ;; This avoids looking as if we're To-in somebody else in + ;; specific, and just Cc-in the rest. + (setq follow-to (list + (cons 'To + (mapconcat + (lambda (addr) + (cdr addr)) recipients ", ")))) + ;; Put the first recipient in the To header. + (setq follow-to (list (cons 'To (cdr (pop recipients))))) + ;; Put the rest of the recipients in Cc. + (when recipients + (setq recipients (mapconcat + (lambda (addr) (cdr addr)) recipients ", ")) + (if (string-match "^ +" recipients) + (setq recipients (substring recipients (match-end 0)))) + (push (cons 'Cc recipients) follow-to))))) follow-to)) (defun message-prune-recipients (recipients) -- cgit v1.2.3 From c05f1020cecb4ef7d516e6575c86bf009c2e6f00 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 16:47:21 +0200 Subject: Tweat how MML specifies the encoding of binary data * lisp/gnus/mml.el (mml-parse-1): Use `data-encoding' to be slightly less confusing than `content-transfer-encoding'. * doc/misc/emacs-mime.texi (MML Definition): Document it. * lisp/gnus/message.el (message-insert-screenshot): Adjust usage. --- doc/misc/emacs-mime.texi | 13 +++++++++++-- lisp/gnus/message.el | 2 +- lisp/gnus/mml.el | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi index 974cc10458d..9180b4ec205 100644 --- a/doc/misc/emacs-mime.texi +++ b/doc/misc/emacs-mime.texi @@ -693,8 +693,17 @@ Valid values are @samp{inline} and @samp{attachment} @item encoding Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and -@samp{base64} (@code{Content-Transfer-Encoding}). @xref{Charset -Translation}. +@samp{base64}. @xref{Charset +Translation}. This parameter says what +@code{Content-Transfer-Encoding} to use when sending the part, and is +normally computed automatically. + +@item data-encoding +This parameter says what encoding has been used on the data, and the +data will be decoded before use. Valid values are +@samp{quoted-printable} and @samp{base64}. This is useful when you +have a part with binary data (for instance an image) inserted directly +into the Message buffer inside the @samp{"<#part>...<#/part>"} tags. @item description A description of the part (@code{Content-Description}). diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index 6c0f9b5c9ba..819f3e41d3d 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -8709,7 +8709,7 @@ used to take the screenshot." :max-width (truncate (* (frame-pixel-width) 0.8)) :max-height (truncate (* (frame-pixel-height) 0.8)) :scale 1) - (format "<#part type=\"image/png\" disposition=inline content-transfer-encoding=base64 raw=t>\n%s\n<#/part>" + (format "<#part type=\"image/png\" disposition=inline data-encoding=base64 raw=t>\n%s\n<#/part>" ;; Get a base64 version of the image -- this avoids later ;; complications if we're auto-saving the buffer and ;; restoring from a file. diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el index 1d348f3a6f0..ef8aa6ac019 100644 --- a/lisp/gnus/mml.el +++ b/lisp/gnus/mml.el @@ -298,12 +298,12 @@ part. This is for the internal use, you should never modify the value.") ;; We have a part that already has a transfer encoding. Undo ;; that so that we don't double-encode later. (when (and raw - (cdr (assq 'content-transfer-encoding tag))) + (cdr (assq 'data-encoding tag))) (with-temp-buffer (set-buffer-multibyte nil) (insert contents) (mm-decode-content-transfer-encoding - (intern (cdr (assq 'content-transfer-encoding tag))) + (intern (cdr (assq 'data-encoding tag))) (cdr (assq 'type tag))) (setq contents (buffer-string)))) (when (and (not raw) (memq nil charsets)) -- cgit v1.2.3 From cc365ca6d8ce24b882a39a062ce64f796693f974 Mon Sep 17 00:00:00 2001 From: Philip K Date: Wed, 5 Aug 2020 22:57:01 +0200 Subject: Remove usages of assoc-delete-all in project.el assoc-delete-all is not available for users who have installed project.el via ELPA on older Emacs versions (bug#42668). * lisp/progmodes/project.el (project-remember-project, project--remove-from-project-list): Replace assoc-delete-all with equivalent alternatives. --- lisp/progmodes/project.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 51b9347bb93..b6161351f0b 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -1166,7 +1166,9 @@ Save the result in `project-list-file' if the list of projects has changed." (project--ensure-read-project-list) (let ((dir (project-root pr))) (unless (equal (caar project--list) dir) - (setq project--list (assoc-delete-all dir project--list)) + (dolist (ent project--list) + (when (equal dir (car ent)) + (setq project--list (delq ent project--list)))) (push (list dir) project--list) (project--write-project-list)))) @@ -1176,8 +1178,8 @@ If the directory was in the list before the removal, save the result in `project-list-file'. Announce the project's removal from the list." (project--ensure-read-project-list) - (when (assoc pr-dir project--list) - (setq project--list (assoc-delete-all pr-dir project--list)) + (when-let ((ent (assoc pr-dir project--list))) + (setq project--list (delq ent project--list)) (message "Project `%s' not found; removed from list" pr-dir) (project--write-project-list))) -- cgit v1.2.3 From c8b0005bad4779ef4d3a89aabd2011a7e187d8ff Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 6 Aug 2020 17:45:09 +0200 Subject: Fix broken desktop file Looks like I pasted in the data twice... --- etc/emacs-mail.desktop | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/etc/emacs-mail.desktop b/etc/emacs-mail.desktop index dec6cdb3459..3a96b9ec8c7 100644 --- a/etc/emacs-mail.desktop +++ b/etc/emacs-mail.desktop @@ -1,14 +1,4 @@ -Desktop Entry] -Categories=Network;Email; -Comment=GNU Emacs is an extensible, customizable text editor - and more -Exec=/home/larsi/src/emacs/trunk/src/emacs -f message-mailto %u -Icon=emacs -Name=Emacs (Mail) -MimeType=x-scheme-handler/mailto; -NoDisplay=false -Terminal=false -Type=Application -Desktop Entry] +[Desktop Entry] Categories=Network;Email; Comment=GNU Emacs is an extensible, customizable text editor - and more Exec=emacs -f message-mailto %u -- cgit v1.2.3