* lisp/org/org-habit.el (org-habit-build-graph): Rewrite without using
string mutation (using vectors instead), fixing a bug where
org-habit-completed-glyph and org-habit-today-glyph wouldn't display
properly if in the U+0080..00FF range, discovered by the more restricted
string mutation.
Reported by Daniel Mendler in
https://lists.gnu.org/archive/html/emacs-orgmode/2025-08/msg00224.html
This fixes a failure in 'test-custom-opts' caused by both strings
and integers being used for 'lua-prefix-key'.
* lisp/progmodes/lua-mode.el (lua-prefix-key): Convert option to
'key-sequence' type.
(lua-mode-map, lua-prefix-key-update-bindings, lua-set-prefix-key)
(lua--customize-set-prefix-key): Adjust to the change of type for
'lua-prefix-key'.
(lua-prefix-mode-map): Use 'defvar-keymap'. (Bug#79335)
* lisp/gnus/nnimap.el (nnimap-open-connection): Use 'tls.
(nnimap-open-connection-1): Check 'tls before 'ssl.
* lisp/mail/smtpmail.el (smtpmail-stream-type): Add 'ssl to
allowed values, state 'tls is preferred.
Rather than using minibuffer-with-setup-hook, just pass the list
of default file names as a regular argument to read-file-name.
This allows read-file-name to run abbreviate-file-name on the
defaults as it normally does, instead of the defaults appearing
in expanded form.
dired-dwim-target-defaults changes slightly to return the
correct default at the start of the list.
* lisp/dired-aux.el (dired-do-create-files)
(dired-compare-directories): Pass default file names as an
argument. (bug#79293)
(dired-dwim-target-defaults): Return the correct default at the
start of the list.
Previously, one could select a completion via M-<up>/M-<down>,
but then RET would not actually select the chosen completion.
With the addition of completion-auto-deselect, this is not
actually necessary: we can reasonably assume that when a
completion is selected, the user wants to use that, since their
last action must have been to select it. So, just choose the
selected completion on RET. This lets us default
minibuffer-completion-auto-choose to nil.
For minibuffers with require-match completion, this can be done
by changing the existing command bound to RET. For minibuffers
with nil require-match completion, RET was previously bound to
exit-minibuffer, and changing exit-minibuffer to have this logic
is risky. We handle that case by adding a new
minibuffer-completion-exit which wraps exit-minibuffer and bind
RET to it.
* lisp/minibuffer.el (minibuffer-insert-completion-if-selected)
(minibuffer-completion-exit, completion--selected-candidate):
Add.
(minibuffer-complete-and-exit): Call
minibuffer-choose-completion. (bug#77253)
(minibuffer-local-completion-map): Bind RET to
minibuffer-completion-exit, overriding exit-minibuffer.
(completion-in-region-mode-map): Bind RET to
minibuffer-choose-completion when there's a selected candidate.
(minibuffer-completion-auto-choose): Default to nil.
(minibuffer-visible-completions--filter)
(minibuffer-visible-completions-map): Delete RET binding, no
longer necessary.
* lisp/simple.el (completion-setup-function): Update completion
help text to show more correct bindings.
* test/lisp/minibuffer-tests.el (completions-header-format-test)
(minibuffer-next-completion): Set
minibuffer-completion-auto-choose=t explicitly.
(with-minibuffer-setup, minibuffer-completion-RET-prefix)
(completion-in-region-next-completion): Add new tests.
* etc/NEWS: Announce.
* lisp/progmodes/lua-mode.el (lua-indent-level): Contemporary Lua
style guides no longer recommend 3 as default. Change type to
'natnum'.
(lua-always-show, lua-get-block-token-info)
(lua--backward-up-list-noerror, lua-make-indentation-info-pair)
(lua-accumulate-indentation-info)
(lua-calculate-indentation-block-modifier): Quote function names.
(lua-toggle-electric-state): Re-format to avoid confusion.
(lua-is-continuing-statement-p-1): Fix typo.
(lua--builtins): Move docstring to correct location.
(lua-is-continuing-statement-p-1): Remove unnecessary 'or'.
(lua-make-lua-string): Remove excessive backslashes and
unnecessary use of a temporary buffer.
(lua-find-matching-token-word): Make it clear that 'goto-char' is
only used only for its side-effect.
* src/xdisp.c (next_element_from_display_vector): Only switch the
iterator from unibyte to multibyte, never in the other direction,
and not if the original character came from a unibyte buffer.
(Bug#79317)
* lisp/erc/erc-fill.el (erc-fill--wrap-measure): Using
`buffer-text-pixel-size' for measuring text size in the selected window
can end up triggering a scroll, which then requires imperfect countering
by the scrolltobottom module, especially with regard to the option
`erc-scrolltobottom-all'. Thanks to Alcor for reporting and helping
with this bug, which was introduced along with fill-wrap in ERC 5.6.
* lisp/progmodes/ruby-mode.el (ruby-flymake-simple): Update
regular expression to handle new versions of Ruby including the
location of the executable in the output.
The following changes make the changes for bug#79275 less
radical, closer to their previous shape, while still fixing
that bug.
* src/xdisp.c (push_prefix_prop, get_it_property): Restore
original code that determined the object and position on it.
(get_line_prefix_it_property): Take FROM_BUFFER from the actual
object of the prefix property.
* lisp/progmodes/bug-reference.el (bug-reference-setup-from-vc-alist):
Add comment explaining the meaning of the nil argument when calling
vc-call-backend. Even though "origin" and nil are equivalent when using
the git backend, it is more intelligible to see "upstream" and "origin"
passed explicitly (bug#79276).
* lisp/erc/erc-status-sidebar.el (erc-status-sidebar-get-window): Set
`cursor-type' in `erc-status-sidebar-mode' buffer instead. This bug was
introduced along with the bufbar module for bug#63595 in ERC 5.6. It's
a regression because it also affects the status-sidebar module.
* lisp/erc/erc.el (erc-bug): On Emacs 30 and later, search for and
ideally use an existing "X-Debbugs-CC" header instead of inserting a new
one at the top. Section 4.5 Obsolete Header Fields of RFC 5322 says,
"except for destination address fields (described in section 4.5.3), the
interpretation of multiple occurrences of fields is unspecified."
Anecdotal fiddling suggests the Savannah servers aren't confused by the
second "empty" header field, so this change is probably just cosmetic.
Only allow string mutation that is certain not to require string data to
be resized and reallocated: writing bytes into a unibyte string, and
changing ASCII to ASCII in a multibyte string.
This ensures that mutation will never transform a unibyte string to
multibyte, that the size of a string in bytes never changes, and that
the byte offsets of characters remain the same. Most importantly, it
removes a long-standing obstacle to reform of string representation and
allow for future performance improvements.
* src/data.c (Faset): Disallow resizing string mutation.
* src/fns.c (clear_string_char_byte_cache):
* src/alloc.c (resize_string_data): Remove.
* test/src/data-tests.el (data-aset-string): New test.
* test/lisp/subr-tests.el (subr--subst-char-in-string):
Skip error cases.
* test/src/alloc-tests.el (aset-nbytes-change):
Remove test that is no longer relevant.
* doc/lispref/strings.texi (Modifying Strings):
* doc/lispref/sequences.texi (Array Functions):
* doc/lispref/text.texi (Substitution): Update manual.
* etc/NEWS: Announce.