1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-24 06:20:43 -08:00

Merge branch 'master' into feature/igc

This commit is contained in:
Gerd Möllmann 2025-08-24 12:15:10 +02:00
commit 7d7ecea0eb
218 changed files with 6084 additions and 2921 deletions

View file

@ -1,3 +1,306 @@
2025-08-14 Eli Zaretskii <eliz@maintain0p.gnu.org>
* Version 30.2 released.
2025-08-14 Eli Zaretskii <eliz@maintain0p.gnu.org>
* README:
* configure.ac:
* exec/configure.ac:
* java/AndroidManifest.xml.in (Version-code):
* nt/README.W32:
* msdos/sed2v2.inp: Bump Emacs version to 30.2.
* ChangeLog.5:
* etc/AUTHORS:
* etc/HISTORY: Update for Emacs 30.2.
* admin/admin.el (set-version): Fix handling of official releases.
2025-08-07 Vinícius Moraes <vinicius.moraes@eternodevir.com> (tiny change)
Handle remote file names in cmuscheme.el
* lisp/cmuscheme.el (scheme-load-file, scheme-compile-file): Use
'file-local-name' to handle file names on remote systems.
(Bug#79163)
2025-08-06 Sean Whitton <spwhitton@spwhitton.name>
* lisp/vc/vc.el (vc-register): Fix interactive spec (bug#79183).
2025-07-31 James Thomas <jimjoe@gmx.net>
* doc/misc/gnus.texi (Category Syntax): Update gnus-agent-predicate.
This updates the Gnus manual due to recent code change (bug#79123).
2025-07-28 Robert Pluim <rpluim@gmail.com>
Prefer "tls" to "ssl" in documentation
* doc/misc/gnus.texi (NNTP): Refer to 'nntp-open-tls-stream'.
(Direct Functions, Customizing the IMAP Connection): Add
commentary about desirability of STARTTLS. Correct
documentation about use of GnuTLS. Use 'tls in example.
* lisp/gnus/nnimap.el (nnimap-server-port): Mention 'tls in
preference to 'ssl.
* lisp/gnus/nntp.el (nntp-open-connection-function)
(nntp-never-echoes-commands): Document 'nntp-open-tls-stream' as
preferred to 'nntp-open-ssl-stream'.
2025-07-26 Sean Whitton <spwhitton@spwhitton.name>
loaddefs-generate--rubric: Note about committing ldefs-boot.el
* lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--rubric):
Note that ldefs-boot.el should be committed on its own.
2025-07-21 Jim Porter <jporterbugs@gmail.com>
Fix Eshell call to 'string-suffix-p' when checking for trailing newline
* lisp/eshell/esh-io.el (eshell--output-maybe-n): Fix call.
* test/lisp/eshell/esh-io-tests.el
(esh-io-test/output-newline/add-newline)
(esh-io-test/output-newline/no-newline)
(esh-io-test/output-newline/no-extra-newline): New tests (bug#79063).
2025-07-21 Robert Pluim <rpluim@gmail.com>
* etc/PROBLEMS: Describe how to work around screen reader TAB issue
2025-07-21 Sean Whitton <spwhitton@spwhitton.name>
(gnus)Scoring Tips: New tip regarding header continuation lines
* doc/misc/gnus.texi (Scoring Tips): New "Continuation lines
when scoring on other headers" tip.
2025-07-16 Ken Mankoff <mankoff@gmail.com>
Fix :box attribute of faces in Leuven themes.
* etc/themes/leuven-dark-theme.el:
* etc/themes/leuven-theme.el: Fix 'lui-highlight-face' face.
(Bug#79029)
2025-07-09 Andrea Corallo <acorallo@gnu.org>
Nativecomp don't error with undeclared types (bug#6573) (don't merge)
Backporting f38e969e472 from trunk to emacs-30
* test/src/comp-resources/comp-test-funcs.el (comp-test-76573-1-f): New
function.
* lisp/emacs-lisp/comp-cstr.el (comp-supertypes): Don't error if 'type'
is unknown.
2025-07-06 Eli Zaretskii <eliz@gnu.org>
Fix 'kill-ring-deindent-mode'
* lisp/indent-aux.el
(kill-ring-deindent-buffer-substring-function): Fix deindenting
for modes which set 'indent-tab-mode' to nil. (Bug#77981)
(cherry picked from commit 1c7fe501fedb41aaf5b22d82dab5a365f86e4c85)
2025-07-04 Yuan Fu <casouri@gmail.com>
Handle ts_node_type return NULL (bug#78938)
* src/treesit.c (treesit_traverse_match_predicate): Handle the
case when ts_node_type returns NULL.
(Ftreesit_node_type): Add some comment.
2025-07-04 Eli Zaretskii <eliz@gnu.org>
Improve documentation of 'warning-display-at-bottom'
* lisp/emacs-lisp/warnings.el (warning-display-at-bottom):
* doc/lispref/display.texi (Warning Options):
* doc/emacs/windows.texi (Temporary Displays):
* etc/NEWS: Improve documentation of 'warning-display-at-bottom'.
See https://lists.gnu.org/archive/html/emacs-devel/2025-07/msg00024.html
for more details.
2025-07-04 Yuan Fu <casouri@gmail.com>
Handle the case when ts_node_type returns NULL (bug#78938)
* src/treesit.c (Ftreesit_node_type): Handle NULL.
2025-06-29 Jim Porter <jporterbugs@gmail.com>
Populate the ':title' in EWW when defaulting to readable mode
Do not merge to master.
* lisp/net/eww.el (eww-display-document): Always render the full
document first to populate ':title' (bug#77299).
2025-06-28 Liam Hupfer <liam@hpfr.net>
bug#78901: [PATCH] js-ts-mode: Fix auto-mode-alist regexp
Align the js-ts-mode entry with the javascript-mode entries in the
default auto-mode-alist value in lisp/files.el. Otherwise, js-ts-mode is
not associated with .js files.
* lisp/progmodes/js.el (js-ts-mode): Fix auto-mode-alist regexp.
Fixes: 2023-01-20 6b2f85caa6ca "Make tree-sitter based modes optional"
2025-06-25 Eli Zaretskii <eliz@gnu.org>
Fix 'insert-directory' in Turkish language-environment
* lisp/files.el (insert-directory-clean, insert-directory): Use
case-sensitive search for "//DIRED//" and similar strings.
(Bug#78894)
2025-06-25 Michael Albinus <michael.albinus@gmx.de>
Fix job control in remote shell
* lisp/net/tramp-sh.el (tramp-methods) <rsync>:
Adapt `tramp-direct-async' argument. (Bug#71050, Bug#71259)
2025-06-21 Eli Zaretskii <eliz@gnu.org>
Workaround for "M-x man" on macOS 15 and later
* lisp/man.el (Man-init-defvars): Workaround for macOS Sed. Do
not merge to master. (Bug#77944)
2025-06-11 Sean Whitton <spwhitton@spwhitton.name>
Insert missing step to make use of directory tracking OSC codes
* doc/emacs/misc.texi (Interactive Shell): Say to add
comint-osc-process-output to comint-output-filter-function.
2025-06-11 Robert Pluim <rpluim@gmail.com>
* lisp/keymap.el (keymap-set): Refer to 'key-description'. (Bug#78714)
2025-06-11 Yuan Fu <casouri@gmail.com>
Support new tree-sitter grammar filename format (bug#78754)
Previously Emacs only looks for filenames like
libtree-sitter-json.so.0.0. Now Emacs also look for filenames
like libtree-sitter-json.so.15.0.
* src/treesit.c:
(treesit_load_language_push_for_each_suffix): Add versioned
candidate to candidate list too.
2025-06-10 Pip Cet <pipcet@protonmail.com>
Fix crash when evaluating "(signal nil 5)" (bug#78738)
The docstring already warns against calling signal with a nil
error symbol, which is for internal use only, but we can avoid crashing
in this case.
* src/eval.c (Fsignal): Produce a "peculiar error" for more arguments
involving non-lists.
2025-06-08 Michael Albinus <michael.albinus@gmx.de>
Adapt emba integration (don't merge)
* test/infra/Dockerfile.emba (emacs-inotify): Don't install clangd.
* test/infra/gitlab-ci.yml (.job-template): Make actions in
after_script more robust.
2025-06-03 Xiyue Deng <manphiz@gmail.com>
Make xoauth2 auth fail when a smtp server replies 334 (Bug#78366)
* lisp/mail/smtpmail.el (smtpmail-try-auth-method): Throw error 535
when receiving a "334 server challenge" reply.
(cherry picked from commit 53371c959462a677a29ee869b3b6627facf3ed79)
2025-05-31 Eli Zaretskii <eliz@gnu.org>
Revert "; * lisp/subr.el (setq-local): Doc fix (bug#78644)."
This reverts commit cb9556d669c037c4e2f1a9c80adacad55948c706.
Some of its parts were not supposed to be installed.
2025-05-28 Stephen Berman <stephen.berman@gmx.net>
Fix bug in 'todo-jump-to-category' (bug#78608)
* lisp/calendar/todo-mode.el (todo-jump-to-category): Eliminate
comparison of the number of Todo categories before and after
specifying the category to jump to and replace it by a check of
whether there are any items in the category, since an existing
category should always have at least one item (perhaps done or
archived).
2025-05-27 Michael Albinus <michael.albinus@gmx.de>
Fix gitlab-ci.yml (don't merge to master)
* test/infra/gitlab-ci.yml (.job-template): Fix config.log name.
(test-filenotify-gio, test-eglot): Fix formatting.
2025-05-25 Konstantin Kharlamov <Hi-Angel@yandex.ru>
typescript-ts-mode: Improve function body indentation (bug#78121)
Older code was calculating body indentation depending on function
parameters alignment. This is incorrect, because if parameters are
misaligned, so will the function body. Instead, use offset of the
previous standalone parent.
* lisp/progmodes/typescript-ts-mode.el:
(typescript-ts-mode--indent-rules): Stop depending on function
parameters indentation for calculating body content and the closing
`}'.
* test/lisp/progmodes/typescript-ts-mode-resources/indent.erts:
(Function body with params misindented (bug#78121)): Add new test.
2025-05-24 Eli Zaretskii <eliz@gnu.org>
Fix documentation of use-package's ':hook' keyword
* doc/misc/use-package.texi (Hooks): Document how to add several
functions to the same hook (bug#77609).
2025-05-22 Michael Albinus <michael.albinus@gmx.de>
* test/infra/gitlab-ci.yml (.job-template): Make it more robust.
2025-05-20 Stephen Berman <stephen.berman@gmx.net>
Fix todo-mode item insertion bug (bug#78506)
* lisp/calendar/todo-mode.el (todo-insert-item--next-param): Unset
transient keymap on completing default or copy item insertion
command, to ensure that the next Todo mode key is recognized.
2025-05-19 Jostein Kjønigsen <jostein@kjonigsen.net>
Add support for Pyrefly LSP for Python
* lisp/progmodes/eglot.el (eglot-server-programs): Add config
for Pyrefly. (Bug#78492)
2025-05-18 Michael Albinus <michael.albinus@gmx.de>
Adapt Tramp version in customize-package-emacs-version-alist
* lisp/net/trampver.el (customize-package-emacs-version-alist):
Add Tramp version integrated in Emacs 30.1.
2025-05-17 Eli Zaretskii <eliz@gnu.org>
Fix saving abbrevs by 'abbrev-edit-save-buffer'
@ -1157,7 +1460,7 @@
This file records repository revisions from
commit 1cda0967b4d3c815fc610794ad6a8fc2b913a3c5 (exclusive) to
commit 299d3a440121ff6692a85615ff97e6ad4dde91db (inclusive).
commit 49d64bfb1a4ca5fc8b3a4d215fb6cabbb9780f9b (inclusive).
See ChangeLog.4 for earlier changes.
;; Local Variables:

View file

@ -96,6 +96,10 @@ Dmitry Gutov
test/indent/ruby.rb
lisp/progmodes/xref.el
lisp/progmodes/project.el
lisp/thread.el
src/thread.c
Thread-related code in src/process.c
Ulf Jasper
Newsticker
@ -323,12 +327,14 @@ Michael Albinus
lisp/autorevert.el
lisp/eshell/em-tramp.el
lisp/files.el (file-name-non-special)
lisp/files-x.el (connection-local variables)
lisp/net/ange-ftp.el
lisp/notifications.el
lisp/shadowfile.el
test/infra/*
test/lisp/autorevert-tests.el
test/lisp/files-tests.el (file-name-non-special)
test/lisp/files-x-tests.el (connection-local variables)
test/lisp/shadowfile-tests.el
test/src/inotify-test.el
@ -381,6 +387,10 @@ Harald Jörg
Spencer Baugh
lisp/progmodes/flymake.el
lisp/thread.el
src/thread.c
Thread-related code in src/process.c
Yuan Fu
lisp/progmodes/c-ts-mode.el

View file

@ -128,8 +128,13 @@ Root must be the root of an Emacs source tree."
(submatch (1+ (in "0-9."))))))
(set-version-in-file root "java/AndroidManifest.xml.in"
(apply #'format "%02d%02d%02d000"
(mapcar #'string-to-number
(split-string version "\\.")))
(let ((ver-list
(mapcar #'string-to-number
(split-string version "\\."))))
;; Official releases are XX.YY, not XX.YY.ZZ
(if (= 2 (length ver-list))
(setq ver-list (append ver-list '(0))))
ver-list))
admin-android-version-code-regexp)
(set-version-in-file root "nt/README.W32" version
(rx (and "version" (1+ space)

View file

@ -187,6 +187,7 @@ files.")
("Mark D. Baushke" "Mark D Baushke")
("Mark E. Shoulson" "Mark Shoulson")
("Marko Kohtala" "Kohtala Marko")
("Mattias Roux" "mattias@kojin\\.tech")
("Maxim Nikulin" "Max Nikulin")
("Agustín Martín" "Agustin Martin" "Agustín Martín Domingo")
("Martin Lorentzon" "Martin Lorentzson")

View file

@ -388,9 +388,9 @@ add the new NEWS file as news/NEWS.xx.y
Copy new etc/MACHINES to MACHINES and CONTRIBUTE to CONTRIBUTE
For every new release, a banner is displayed on top of the emacs.html
page. Uncomment and the release banner in emacs.html. Keep it on the
page for about a month, then comment it again. The new release banner
looks like this:
page. Uncomment the release banner in emacs.html. Keep it on the page
for about a month, then comment it again. The new release banner looks
like this:
<div class="release-banner">
<div class="container">
@ -398,6 +398,16 @@ looks like this:
</div>
</div>
Add the information about the new release in the "Releases" section of
emacs.html, which begins like this:
<div class="releases">
<div class="container">
<!-- NOTE: There is no need to keep more than the two most recent -->
<!-- major versions here. -->
<h2 id="Releases">
Also, make sure the copyright years at the bottom of emacs.html are
up-to-date.

View file

@ -70,6 +70,9 @@ Section
# create uninstaller
WriteUninstaller "$UninstallerPath"
# request to set x64 registry keys
SetRegView 64
# add registry key to enable uninstall from control panel
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "GNU Emacs ${VERSION_BRANCH}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$\"$UninstallerPath$\""

View file

@ -83,6 +83,7 @@
go-ts-mode
heex-ts-mode
html-ts-mode
mhtml-ts-mode
java-ts-mode
js-ts-mode
json-ts-mode
@ -107,6 +108,7 @@
go-ts-mode
heex-ts-mode
html-ts-mode
mhtml-ts-mode
java-ts-mode
js
json-ts-mode

View file

@ -2247,9 +2247,9 @@ AC_CACHE_CHECK([for flag to work around GCC union bugs],
[/* Work around GCC bugs 117423 and 119085 re holes in unions:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117423
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119085
These are fixed in GCC 15.2.
These are fixed in GCC 14.4 and 15.2.
Working wround them also works around GCC bug 58416
Working around them also works around GCC bug 58416
with double in unions on x86, where the generated insns
copy non-floating-point data via fldl/fstpl instruction pairs.
This can misbehave if the data's bit pattern looks like a NaN.

View file

@ -702,14 +702,14 @@ the directory.
@kindex touchscreen-hold @r{(Dired)}
@findex dired-click-to-select-mode
@findex dired-enable-click-to-select-mode
Enter a ``click to select'' mode, where using the mouse button
@kbd{mouse-2} on a file name will cause its mark to be toggled. This
mode is useful when performing file management using a touch screen
device.
Enter a ``click to select'' mode (@code{dired-click-to-select-mode}),
where using the mouse button @kbd{mouse-2} on a file name will cause its
mark to be toggled. This mode is useful when performing file management
using a touch screen device.
It is enabled when a ``hold'' gesture (@pxref{Touchscreens}) is
detected over a file name, and is automatically disabled once a Dired
command operates on the marked files.
It is enabled when a ``hold'' gesture (@pxref{Touchscreens}) is detected
over a file name, and is automatically disabled once a Dired command
that operates on the marked files finishes.
@end table
@node Operating on Files

View file

@ -1070,11 +1070,18 @@ non-@code{nil}, @kbd{C-x v I} becomes a prefix key, and
@code{vc-log-incoming} becomes bound to @kbd{C-x v I L}.
@item M-x vc-root-diff-incoming
Display a diff of the changes that a pull operation will retrieve.
Display a diff of all changes that a pull operation will retrieve.
If you customize @code{vc-use-incoming-outgoing-prefixes} to
non-@code{nil}, this command becomes available on @kbd{C-x v I D}.
@item M-x vc-diff-incoming
Display a diff of changes that a pull operation will retrieve, but
limited to the current fileset.
If you customize @code{vc-use-incoming-outgoing-prefixes} to
non-@code{nil}, this command becomes available on @kbd{C-x v I =}.
@item C-x v O
Display log entries for the changes that will be sent by the next
``push'' operation (@code{vc-log-outgoing}).
@ -1084,12 +1091,19 @@ non-@code{nil}, @kbd{C-x v O} becomes a prefix key, and
@code{vc-log-outgoing} becomes bound to @kbd{C-x v O L}.
@item M-x vc-root-diff-outgoing
Display a diff of the changes that will be sent by the next push
Display a diff of all changes that will be sent by the next push
operation.
If you customize @code{vc-use-incoming-outgoing-prefixes} to
non-@code{nil}, this command is bound to @kbd{C-x v O D}.
@item M-x vc-diff-outgoing
Display a diff of changes that will be sent by the next push operation,
but limited to the current fileset.
If you customize @code{vc-use-incoming-outgoing-prefixes} to
non-@code{nil}, this command becomes available on @kbd{C-x v O =}.
@item C-x v h
Display the history of changes made in the region of file visited by
the current buffer (@code{vc-region-history}).
@ -1176,13 +1190,21 @@ version control system can be a branch name.
@findex vc-root-diff-outgoing
The closely related commands @code{vc-root-diff-incoming} and
@code{vc-root-diff-outgoing} are the diff analogues of
@code{vc-log-incoming} and @code{vc-log-outgoing}. These display a diff
buffer reporting the changes that would be pulled or pushed. You can
@code{vc-log-incoming} and @code{vc-log-outgoing}. These display diff
buffers reporting the changes that would be pulled or pushed. You can
use a prefix argument here too to specify a particular remote location.
@code{vc-root-diff-outgoing} is useful as a way to preview your push and
quickly check that all and only the changes you intended to include were
committed and will be pushed.
@findex vc-diff-incoming
@findex vc-diff-outgoing
The commands @code{vc-diff-incoming} and @code{vc-diff-outgoing} are
very similar. They also display changes that would be pulled or pushed.
The difference is that the diffs reported are limited to the current
fileset. Don't forget that actual pull and push operations always
affect the whole working tree, not just the current fileset.
@cindex VC log buffer, commands in
@cindex vc-log buffer
In the @file{*vc-change-log*} buffer, you can use the following keys

View file

@ -285,7 +285,11 @@ tree.
Add a new working tree.
@item C-x v w w
Visit this file in another working tree.
Visit this file or directory in another working tree.
@item C-x v w s
Invoke @kbd{C-x p p} (@code{project-switch-project}) but limited to
other working trees.
@item C-x v w x
Delete a working tree you no longer need.
@ -313,12 +317,24 @@ new working tree.
@findex vc-switch-working-tree
Once your repository has other working trees, you can use the command
@kbd{C-x v w w} (@code{vc-switch-working-tree}) to switch between them.
It tries to find the analogue of the current buffer's file
under another working tree. Typically the sets of workfiles
under different working trees differ more in file contents than in which
files do and do not exist. In other words, the file the
current buffer visits probably exists in other working trees too, and
this command lets you switch to those versions of the file.
It tries to find the analogue of the current buffer's file or directory
under another working tree. Typically the sets of workfiles under
different working trees differ more in file contents than in which files
do and do not exist. In other words, the file or directory the current
buffer visits probably exists in other working trees too, and this
command lets you switch to those versions of the file.
@kindex C-x v w s
@findex vc-working-tree-switch-project
An alternative way to switch between working trees is @kbd{C-x v w s}
(@code{vc-working-tree-switch-project}). This prompts you to select a
working tree, and then displays a menu of commands to operate on it.
This is in fact just @kbd{C-x p p} (@code{project-switch-project})
(@pxref{Switching Projects}) but with the selection of projects limited
to other working trees. The main difference between @kbd{C-x v w w} and
@kbd{C-x v w s} is that the former looks for an analogue of the current
buffer in the other working tree while the latter considers the other
working tree as a whole, independent project.
@kindex C-x v w x
@kindex C-x v w R

View file

@ -158,6 +158,8 @@ this option is @code{nil}.
@table @kbd
@item C-x o
Select another window (@code{other-window}).
@item C-x O
Select another window, backwards (@code{other-window-backward}).
@item C-M-v
Scroll the next window upward (@code{scroll-other-window}).
@item C-M-S-v
@ -183,7 +185,8 @@ cycle in the opposite order. When the minibuffer is active, the
minibuffer window is the last window in the cycle; you can switch from
the minibuffer window to one of the other windows, and later switch
back and finish supplying the minibuffer argument that is requested.
@xref{Minibuffer Edit}.
@xref{Minibuffer Edit}. @kbd{C-x O} is similar, but defaults to the
opposite order.
@findex next-window-any-frame
The @code{other-window} command will normally only switch to the next

View file

@ -719,7 +719,7 @@ preserved, but this is up to the specific @code{revert-buffer-function}
implementation.
@end deffn
@defvar revert-buffer-in-progress-p
@defvar revert-buffer-in-progress
@code{revert-buffer} binds this variable to a non-@code{nil} value
while it is working.
@end defvar
@ -852,6 +852,13 @@ It is important to assure that point does not continuously jump around
as a consequence of auto-reverting. Of course, moving point might be
inevitable if the buffer radically changes.
@defvar auto-revert-buffer-in-progress
@code{auto-revert-buffer} binds this variable to a non-@code{nil} value
while it is working. This can be used by major mode
@code{revert-buffer-function} implementations to suppress messages in
Auto Revert modes, for example.
@end defvar
@defvar inhibit-auto-revert-buffers
When the current buffer is member of this variable (a list of buffers),
auto-reverting is suppressed for that buffer. This is useful if serious

View file

@ -1489,8 +1489,8 @@ Each clause normally has the form @w{@code{(@var{condition}
@findex bind*
@code{(bind* @var{bindings}@dots{})} means to bind @var{bindings} (like
the bindings list in @code{let*}, @pxref{Local Variables}) for the body
of the clause. As a condition, it counts as true if the first binding's
value is non-@code{nil}.
of the clause, and all subsequent clauses. As a condition, it counts as
true if the first binding's value is non-@code{nil}.
@findex match*
@findex pcase*

View file

@ -256,38 +256,47 @@ commands; all except for @kbd{S} resume execution of the program, at
least for a certain distance.
@table @kbd
@findex edebug-stop
@item S
Stop: don't execute any more of the program, but wait for more
Edebug commands (@code{edebug-stop}).
@c FIXME Does not work. https://debbugs.gnu.org/9764
@findex edebug-step-mode
@item @key{SPC}
Step: stop at the next stop point encountered (@code{edebug-step-mode}).
@findex edebug-next-mode
@item n
Next: stop at the next stop point encountered after an expression
(@code{edebug-next-mode}). Also see @code{edebug-forward-sexp} in
@ref{Jumping}.
@findex edebug-trace-mode
@item t
Trace: pause (normally one second) at each Edebug stop point
(@code{edebug-trace-mode}).
@findex edebug-Trace-fast-mode
@item T
Rapid trace: update the display at each stop point, but don't actually
pause (@code{edebug-Trace-fast-mode}).
@findex edebug-go-mode
@item g
Go: run until the next breakpoint (@code{edebug-go-mode}). @xref{Breakpoints}.
@findex edebug-continue-mode
@item c
Continue: pause one second at each breakpoint, and then continue
(@code{edebug-continue-mode}).
@findex edebug-Continue-fast-mode
@item C
Rapid continue: move point to each breakpoint, but don't pause
(@code{edebug-Continue-fast-mode}).
@findex edebug-Go-nonstop-mode
@item G
Go non-stop: ignore breakpoints (@code{edebug-Go-nonstop-mode}). You
can still stop the program by typing @kbd{S}, or any editing command.
@ -345,25 +354,30 @@ in trace mode or continue mode. The default is 1 second.
The commands described in this section execute until they reach a
specified location. All except @kbd{i} make a temporary breakpoint to
establish the place to stop, then switch to go mode. Any other
breakpoint reached before the intended stop point will also stop
execution. @xref{Breakpoints}, for the details on breakpoints.
establish the place to stop, then switch to go mode (@pxref{Edebug
Execution Modes}). Any other breakpoint reached before the intended
stop point will also stop execution. @xref{Breakpoints}, for the
details on breakpoints.
These commands may fail to work as expected in case of nonlocal exit,
as that can bypass the temporary breakpoint where you expected the
program to stop.
@table @kbd
@findex edebug-goto-here
@item h
Proceed to the stop point near where point is (@code{edebug-goto-here}).
@findex edebug-forward-sexp
@item f
Run the program for one expression
(@code{edebug-forward-sexp}).
@findex edebug-step-out
@item o
Run the program until the end of the containing sexp (@code{edebug-step-out}).
@findex edebug-step-in
@item i
Step into the function or macro called by the form after point
(@code{edebug-step-in}).
@ -397,7 +411,7 @@ containing sexp is a function definition itself, @kbd{o} continues until
just before the last sexp in the definition. If that is where you are
now, it returns from the function and then stops. In other words, this
command does not exit the currently executing function unless you are
positioned after the last sexp.
positioned after the last sexp of that function.
Normally, the @kbd{h}, @kbd{f}, and @kbd{o} commands display ``Break''
and pause for @code{edebug-sit-for-seconds} before showing the result
@ -421,14 +435,17 @@ arrange to deinstrument it.
Some miscellaneous Edebug commands are described here.
@table @kbd
@findex edebug-help
@item ?
Display the help message for Edebug (@code{edebug-help}).
@findex abort-recursive-edit @r{(Edebug)}
@item a
@itemx C-]
Abort one level back to the previous command level
(@code{abort-recursive-edit}).
(@code{abort-recursive-edit}). @xref{Recursive Editing}.
@findex top-level @r{(Edebug)}
@item q
Return to the top level editor command loop (@code{top-level}). This
exits all recursive editing levels, including all levels of Edebug
@ -436,14 +453,17 @@ activity. However, instrumented code protected with
@code{unwind-protect} or @code{condition-case} forms may resume
debugging.
@findex edebug-top-level-nonstop
@item Q
Like @kbd{q}, but don't stop even for protected code
(@code{edebug-top-level-nonstop}).
@findex edebug-previous-result
@item r
Redisplay the most recently known expression result in the echo area
(@code{edebug-previous-result}).
@findex edebug-pop-to-backtrace
@item d
Display a backtrace, excluding Edebug's own functions for clarity
(@code{edebug-pop-to-backtrace}).
@ -473,9 +493,10 @@ display a backtrace of all the pending evaluations with @kbd{d}.
@node Breaks
@subsection Breaks
Edebug's step mode stops execution when the next stop point is reached.
There are three other ways to stop Edebug execution once it has started:
breakpoints, the global break condition, and source breakpoints.
Edebug's step mode (@pxref{Edebug Execution Modes}) stops execution when
the next stop point is reached. There are three other ways to stop
Edebug execution once it has started: breakpoints, the global break
condition, and source breakpoints.
@menu
* Breakpoints:: Breakpoints at stop points.
@ -495,6 +516,9 @@ the first one at or after point in the source code buffer. Here are the
Edebug commands for breakpoints:
@table @kbd
@findex edebug-set-breakpoint
@vindex edebug-enabled-breakpoint @r{(face)}
@vindex edebug-disabled-breakpoint @r{(face)}
@item b
Set a breakpoint at the stop point at or after point
(@code{edebug-set-breakpoint}). If you use a prefix argument, the
@ -502,26 +526,34 @@ breakpoint is temporary---it turns off the first time it stops the
program. An overlay with the @code{edebug-enabled-breakpoint} or
@code{edebug-disabled-breakpoint} faces is put at the breakpoint.
@findex edebug-unset-breakpoint
@item u
Unset the breakpoint (if any) at the stop point at or after
point (@code{edebug-unset-breakpoint}).
@findex edebug-unset-breakpoints
@item U
Unset any breakpoints in the current form
(@code{edebug-unset-breakpoints}).
@findex edebug-toggle-disable-breakpoint
@item D
Toggle whether to disable the breakpoint near point
(@code{edebug-toggle-disable-breakpoint}). This command is mostly
useful if the breakpoint is conditional and it would take some work to
recreate the condition.
@findex edebug-set-conditional-breakpoint
@item x @var{condition} @key{RET}
Set a conditional breakpoint which stops the program only if
evaluating @var{condition} produces a non-@code{nil} value
(@code{edebug-set-conditional-breakpoint}). With a prefix argument,
the breakpoint is temporary.
@item X @var{condition} @key{RET}
Set @code{edebug-global-break-condition} to @var{condition}.
@findex edebug-next-breakpoint
@item B
Move point to the next breakpoint in the current definition
(@code{edebug-next-breakpoint}).
@ -542,6 +574,8 @@ conditional breakpoint, use @kbd{x}, and specify the condition
expression in the minibuffer. Setting a conditional breakpoint at a
stop point that has a previously established conditional breakpoint puts
the previous condition expression in the minibuffer so you can edit it.
(You can also use @kbd{X} to set the global break condition, to be
evaluated at every stop point, @pxref{Global Break Condition}.)
You can make a conditional or unconditional breakpoint
@dfn{temporary} by using a prefix argument with the command to set the
@ -566,8 +600,9 @@ point in the buffer.
condition is satisfied, no matter where that may occur. Edebug
evaluates the global break condition at every stop point; if it
evaluates to a non-@code{nil} value, then execution stops or pauses
depending on the execution mode, as if a breakpoint had been hit. If
evaluating the condition gets an error, execution does not stop.
depending on the execution mode (@pxref{Edebug Execution Modes}), as if
a breakpoint had been hit. If evaluating the condition gets an error,
execution does not stop.
@findex edebug-set-global-break-condition
The condition expression is stored in
@ -603,7 +638,8 @@ argument reaches zero:
When the @code{fac} definition is instrumented and the function is
called, the call to @code{edebug} acts as a breakpoint. Depending on
the execution mode, Edebug stops or pauses there.
the execution mode (@pxref{Edebug Execution Modes}), Edebug stops or
pauses there.
If no instrumented code is being executed when @code{edebug} is called,
that function calls @code{debug}.
@ -640,17 +676,20 @@ configuration is the collection of windows and contents that were in
effect outside of Edebug.
@table @kbd
@findex edebug-view-outside
@item P
@itemx v
Switch to viewing the outside window configuration
(@code{edebug-view-outside}). Type @kbd{C-x X w} to return to Edebug.
@findex edebug-bounce-point
@item p
Temporarily display the outside current buffer with point at its
outside position (@code{edebug-bounce-point}), pausing for one second
before returning to Edebug. With a prefix argument @var{n}, pause for
@var{n} seconds instead.
@findex edebug-where
@item w
Move point back to the current stop point in the source code buffer
(@code{edebug-where}).
@ -659,6 +698,7 @@ If you use this command in a different window displaying the same
buffer, that window will be used instead to display the current
definition in the future.
@findex edebug-toggle-save-windows
@item W
@c Its function is not simply to forget the saved configuration -- dan
Toggle whether Edebug saves and restores the outside window
@ -697,6 +737,7 @@ explicitly saves and restores. @xref{The Outside Context}, for details
on this process.
@table @kbd
@findex edebug-eval-expression
@item e @var{exp} @key{RET}
Evaluate expression @var{exp} in the context outside of Edebug
(@code{edebug-eval-expression}). That is, Edebug tries to minimize
@ -707,30 +748,47 @@ pretty-print the result there.
By default, this command
suppresses the debugger during evaluation, so that an error in the
evaluated expression won't add a new error on top of the existing one.
Set the @code{debug-allow-recursive-debug} user option to a
non-@code{nil} value to override this.
Set the @code{debug-allow-recursive-debug} user option (@pxref{Error
Debugging}) to a non-@code{nil} value to override this.
@findex eval-expression @r{(Edebug)}
@item M-: @var{exp} @key{RET}
Evaluate expression @var{exp} in the context of Edebug itself
(@code{eval-expression}).
@findex edebug-eval-last-sexp
@item C-x C-e
Evaluate the expression before point, in the context outside of Edebug
(@code{edebug-eval-last-sexp}). With the prefix argument of zero
(@kbd{C-u 0 C-x C-e}), don't shorten long items (like strings and
lists). Any other prefix will result in the value being
pretty-printed in a separate buffer.
(@code{edebug-eval-last-sexp}) and show the value in the minibuffer.
With the prefix argument of zero (@kbd{C-u 0 C-x C-e}), don't shorten
long items (like strings and lists) when showing the value, due to
@code{edebug-print-length} and @code{edebug-print-level}
(@pxref{Printing in Edebug}). Any other prefix will result in the value
being pretty-printed in a separate buffer instead of the minibuffer.
@end table
@xref{Eval List}, for additional Edebug features related to evaluating
lists of expressions interactively.
@cindex lexical binding (Edebug)
@findex cl-macrolet @r{(Edebug)}
@findex cl-symbol-macrolet @r{(Edebug)}
Edebug supports evaluation of expressions containing references to
lexically bound symbols created by the following constructs in
@file{cl-lib.el}: @code{cl-macrolet} and @code{cl-symbol-macrolet}.
@c FIXME? What about lexical-binding = t?
@node Eval List
@subsection Evaluation List Buffer
@cindex evaluation list buffer
You can use the @dfn{evaluation list buffer}, called @file{*edebug*}, to
evaluate expressions interactively. You can also set up the
@dfn{evaluation list} of expressions to be evaluated automatically each
time Edebug updates the display.
@table @kbd
@findex edebug-visit-eval-list
@item E
Switch to the evaluation list buffer @file{*edebug*}
(@code{edebug-visit-eval-list}).
@ -741,20 +799,25 @@ Interaction mode (@pxref{Lisp Interaction,,, emacs, The GNU Emacs
Manual}) as well as these special commands:
@table @kbd
@findex edebug-eval-print-last-sexp
@item C-j
Evaluate the expression before point, in the outside context, and
insert the value in the buffer (@code{edebug-eval-print-last-sexp}).
With prefix argument of zero (@kbd{C-u 0 C-j}), don't shorten long
items (like strings and lists).
items (like strings and lists) due to @code{edebug-print-length} and
@code{edebug-print-level} (@pxref{Printing in Edebug}).
@findex edebug-eval-last-sexp
@item C-x C-e
Evaluate the expression before point, in the context outside of Edebug
(@code{edebug-eval-last-sexp}).
@findex edebug-update-eval-list
@item C-c C-u
Build a new evaluation list from the contents of the buffer
(@code{edebug-update-eval-list}).
@findex edebug-delete-eval-item
@item C-c C-d
Delete the evaluation list group that point is in
(@code{edebug-delete-eval-item}).
@ -797,24 +860,36 @@ not interrupt your debugging.
several expressions have been added to it:
@smallexample
@group
(current-buffer)
#<buffer *scratch*>
;---------------------------------------------------------------
@end group
@group
(selected-window)
#<window 16 on *scratch*>
;---------------------------------------------------------------
@end group
@group
(point)
196
;---------------------------------------------------------------
@end group
@group
bad-var
"Symbol's value as variable is void: bad-var"
;---------------------------------------------------------------
@end group
@group
(recursion-depth)
0
;---------------------------------------------------------------
@end group
@group
this-command
eval-last-sexp
;---------------------------------------------------------------
@end group
@end smallexample
To delete a group, move point into it and type @kbd{C-c C-d}, or simply
@ -825,8 +900,9 @@ the expression at a suitable place, insert a new comment line, then type
contents don't matter.
After selecting @file{*edebug*}, you can return to the source code
buffer with @kbd{C-c C-w}. The @file{*edebug*} buffer is killed when
you continue execution, and recreated next time it is needed.
buffer with @kbd{C-c C-w} (@pxref{Edebug Views}). The @file{*edebug*}
buffer is killed when you continue execution, and recreated next time it
is needed.
@node Printing in Edebug
@subsection Printing in Edebug
@ -860,8 +936,10 @@ to a non-@code{nil} value.
Here is an example of code that creates a circular structure:
@example
@group
(setq a (list 'x 'y))
(setcar a a)
@end group
@end example
@noindent
@ -883,11 +961,14 @@ printing results. The default value is @code{t}.
@node Trace Buffer
@subsection Trace Buffer
@cindex trace buffer
@cindex Edebug trace buffer
@cindex tracing in Edebug
Edebug can record an execution trace, storing it in a buffer named
@file{*edebug-trace*}. This is a log of function calls and returns,
showing the function names and their arguments and values. To enable
trace recording, set @code{edebug-trace} to a non-@code{nil} value.
trace recording, set @code{edebug-trace} to a non-@code{nil} value
(@pxref{Edebug Options}).
Making a trace buffer is not the same thing as using trace execution
mode (@pxref{Edebug Execution Modes}).
@ -918,7 +999,7 @@ value of the last form in @var{body}.
@defun edebug-trace format-string &rest format-args
This function inserts text in the trace buffer. It computes the text
with @code{(apply 'format @var{format-string} @var{format-args})}.
with @w{@code{(apply 'format @var{format-string} @var{format-args})}}.
It also appends a newline to separate entries.
@end defun
@ -945,10 +1026,10 @@ correctly; Edebug will tell you when you have tried enough different
conditions that each form has returned two different values.
Coverage testing makes execution slower, so it is only done if
@code{edebug-test-coverage} is non-@code{nil}. Frequency counting is
performed for all executions of an instrumented function, even if the
execution mode is Go-nonstop, and regardless of whether coverage testing
is enabled.
@code{edebug-test-coverage} is non-@code{nil} (@pxref{Edebug Options}).
Frequency counting is performed for all executions of an instrumented
function, even if the execution mode is Go-nonstop, and regardless of
whether coverage testing is enabled.
@kindex C-x X =
@findex edebug-temp-display-freq-count
@ -981,6 +1062,7 @@ breakpoint, and setting @code{edebug-test-coverage} to @code{t}, when
the breakpoint is reached, the frequency data looks like this:
@example
@group
(defun fac (n)
(if (= n 0) (edebug))
;#6 1 = =5
@ -989,7 +1071,8 @@ the breakpoint is reached, the frequency data looks like this:
(* n (fac (1- n)))
;# 5 0
1))
;# 0
a;# 0
@end group
@end example
The comment lines show that @code{fac} was called 6 times. The
@ -1030,15 +1113,19 @@ using Edebug. You can also enlarge the value of
@code{edebug-max-depth} if Edebug reaches the limit of recursion depth
instrumenting code that contains very large quoted lists.
@vindex executing-kbd-macro @r{(Edebug)}
@item
The state of keyboard macro execution is saved and restored. While
Edebug is active, @code{executing-kbd-macro} is bound to @code{nil}
unless @code{edebug-continue-kbd-macro} is non-@code{nil}.
unless @code{edebug-continue-kbd-macro} is non-@code{nil} (@pxref{Edebug
Options}).
@end itemize
@node Edebug Display Update
@subsubsection Edebug Display Update
@cindex Edebug and display updates
@cindex display updates, and Edebug
@c This paragraph is not filled, because LaLiberte's conversion script
@c needs an xref to be on just one line.
@ -1059,13 +1146,13 @@ following data (though some of them are deliberately not restored if an
error or quit signal occurs).
@itemize @bullet
@item
@cindex current buffer point and mark (Edebug)
@item
Which buffer is current, and the positions of point and the mark in the
current buffer, are saved and restored.
@item
@cindex window configuration (Edebug)
@item
The outside window configuration is saved and restored if
@code{edebug-save-windows} is non-@code{nil} (@pxref{Edebug Options}).
If the value of @code{edebug-save-windows} is a list, only the listed
@ -1079,7 +1166,7 @@ The window start and horizontal scrolling of the source code buffer are
not restored, however, so that the display remains coherent within Edebug.
@cindex buffer point changed by Edebug
@cindex edebug overwrites buffer point position
@cindex Edebug overwrites buffer point position
Saving and restoring the outside window configuration can sometimes
change the positions of point in the buffers on which the Lisp program
you are debugging operates, especially if your program moves point.
@ -1091,11 +1178,14 @@ set @code{edebug-save-windows} to @code{nil}
The value of point in each displayed buffer is saved and restored if
@code{edebug-save-displayed-buffer-points} is non-@code{nil}.
@vindex overlay-arrow-position @r{(Edebug)}
@vindex overlay-arrow-string @r{(Edebug)}
@item
The variables @code{overlay-arrow-position} and
@code{overlay-arrow-string} are saved and restored, so you can safely
invoke Edebug from the recursive edit elsewhere in the same buffer.
@vindex cursor-in-echo-area @r{(Edebug)}
@item
@code{cursor-in-echo-area} is locally bound to @code{nil} so that
the cursor shows up in the window.
@ -1103,6 +1193,8 @@ the cursor shows up in the window.
@node Edebug Recursive Edit
@subsubsection Edebug Recursive Edit
@cindex Edebug and recursive edit
@cindex recursive edit, and Edebug
When Edebug is entered and actually reads commands from the user, it
saves (and later restores) these additional data:
@ -1149,6 +1241,8 @@ Edebug is active, @code{defining-kbd-macro} is bound to
@node Edebug and Macros
@subsection Edebug and Macros
@cindex Edebug and macros
@cindex macros, debugging with Edebug
To make Edebug properly instrument expressions that call macros, some
extra care is needed. This subsection explains the details.
@ -1172,23 +1266,26 @@ time later.)
Therefore, you must define an Edebug specification for each macro
that Edebug will encounter, to explain the format of calls to that
macro. To do this, add a @code{debug} declaration to the macro
definition. Here is a simple example that shows the specification for
the @code{for} example macro (@pxref{Argument Evaluation}).
macro. To do this, add a @code{debug} declaration (@pxref{Declare
Form}) to the macro definition. Here is a simple example that shows the
specification for the @code{for} example macro (@pxref{Argument
Evaluation}).
@smallexample
@group
(defmacro for (var from init to final do &rest body)
"Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
(declare (debug (symbolp "from" form "to" form "do" &rest form)))
...)
@end group
@end smallexample
The Edebug specification says which parts of a call to the macro are
forms to be evaluated. For simple macros, the specification
often looks very similar to the formal argument list of the macro
definition, but specifications are much more general than macro
arguments. @xref{Defining Macros}, for more explanation of
arguments. @xref{Declare Form}, for more details about
the @code{declare} form.
@c See, e.g., https://debbugs.gnu.org/10577
@ -1252,6 +1349,7 @@ are instrumented.
@subsubsection Specification List
@cindex Edebug specification list
@cindex specification list, Edebug
A @dfn{specification list} is required for an Edebug specification if
some arguments of a macro call are evaluated while others are not. Some
elements in a specification list match one or more arguments, but others
@ -1358,8 +1456,8 @@ This is successful when there are no more arguments to match at the
current argument list level; otherwise it fails. See sublist
specifications and the backquote example.
@cindex preventing backtracking, in Edebug specification list
@item gate
@cindex preventing backtracking
No argument is matched but backtracking through the gate is disabled
while matching the remainder of the specifications at this level. This
is primarily used to generate more specific syntax error messages.
@ -1385,8 +1483,8 @@ sexps whose first element is a symbol and then lets
with that head symbol according to @code{pcase--match-pat-args} and
pass them to the @var{pf} it received as argument.
@item @var{other-symbol}
@cindex indirect specifications
@item @var{other-symbol}
Any other symbol in a specification list may be a predicate or an
indirect specification.
@ -1408,8 +1506,8 @@ specification fails and the argument is not instrumented.
Some suitable predicates include @code{symbolp}, @code{integerp},
@code{stringp}, @code{vectorp}, and @code{atom}.
@item [@var{elements}@dots{}]
@cindex [@dots{}] (Edebug)
@item [@var{elements}@dots{}]
A vector of elements groups the elements into a single @dfn{group
specification}. Its meaning has nothing to do with vectors.
@ -1470,8 +1568,8 @@ The argument, a symbol, is the name of an argument of the defining form.
However, lambda-list keywords (symbols starting with @samp{&})
are not allowed.
@item lambda-list
@cindex lambda-list (Edebug)
@item lambda-list
This matches a lambda list---the argument list of a lambda expression.
@item def-body
@ -1791,6 +1889,7 @@ a breakpoint. Set to @code{nil} to prevent the pause, non-@code{nil}
to allow it.
@end defopt
@cindex Edebug, changing behavior with instrumented code
@defopt edebug-behavior-alist
By default, this alist contains one entry with the key @code{edebug}
and a list of three functions, which are the default implementations
@ -1798,6 +1897,7 @@ of the functions inserted in instrumented code: @code{edebug-enter},
@code{edebug-before} and @code{edebug-after}. To change Edebug's
behavior globally, modify the default entry.
@vindex edebug-behavior, symbol property
Edebug's behavior may also be changed on a per-definition basis by
adding an entry to this alist, with a key of your choice and three
functions. Then set the @code{edebug-behavior} symbol property of an

View file

@ -149,9 +149,10 @@ The function returns an existing buffer if there is one; otherwise it
creates a new buffer and reads the file into it. When
@code{find-file-noselect} uses an existing buffer, it first verifies
that the file has not changed since it was last visited or saved in
that buffer. If the file has changed, this function asks the user
whether to reread the changed file. If the user says @samp{yes}, any
edits previously made in the buffer are lost.
that buffer (unless @var{nowarn} is non-@code{nil}, see below). If the
file has changed, this function asks the user whether to reread the
changed file. If the user says @samp{yes}, any edits previously made in
the buffer are lost.
Reading the file involves decoding the file's contents (@pxref{Coding
Systems}), including end-of-line conversion, and format conversion
@ -163,7 +164,8 @@ This function displays warning or advisory messages in various peculiar
cases, unless the optional argument @var{nowarn} is non-@code{nil}. For
example, if it needs to create a buffer, and there is no file named
@var{filename}, it displays the message @samp{(New file)} in the echo
area, and leaves the buffer empty.
area, and leaves the buffer empty. The verification of the file's last
change is also bypassed if @var{nowarn} is non-@code{nil}.
The @code{find-file-noselect} function normally calls
@code{after-find-file} after reading the file (@pxref{Subroutines of

View file

@ -2742,6 +2742,14 @@ Indent calls to this function or macro according to @var{indent-spec}.
This is typically used for macros, though it works for functions too.
@xref{Indenting Macros}.
@cindex @code{autoload-macro} (@code{declare} spec)
@item (autoload-macro @var{value})
This is used when defining a macro. If @var{value} is @samp{expand},
any calls to the macro which follow an autoload comment will first be
expanded during generation of the autoloads. This declaration is used
as an alternative to hard-coding lists of macros to expand in
@code{loaddefs-generate--make-autoload}. @xref{Autoload}.
@item (interactive-only @var{value})
Set the function's @code{interactive-only} property to @var{value}.
@xref{The interactive-only property}.

View file

@ -445,16 +445,17 @@ object type; space allocated to the contents of buffers does not count.
The initial threshold value is @code{GC_DEFAULT_THRESHOLD}, defined in
@file{alloc.c}. Since it's defined in @code{word_size} units, the
value is 400,000 for the default 32-bit configuration and 800,000 for
the 64-bit one. If you specify a larger value, garbage collection
will happen less often. This reduces the amount of time spent garbage
collecting (so Lisp programs will run faster between cycles of garbage
collection that happen more rarely), but increases total memory use.
You may want to do this when running a program that creates lots of
Lisp data, especially if you need it to run faster. However, we
recommend against increasing the threshold for prolonged periods of
time, and advise that you never set it higher than needed for the
program to run in reasonable time. Using thresholds higher than
value is 400,000 for the default 32-bit configuration, and 800,000 for
the 64-bit one and for 32-bit builds configured with the
@option{--with-wide-int} option. If you specify a larger value, garbage
collection will happen less often. This reduces the amount of time
spent garbage collecting (so Lisp programs will run faster between
cycles of garbage collection that happen more rarely), but increases
total memory use. You may want to do this when running a program that
creates lots of Lisp data, especially if you need it to run faster.
However, we recommend against increasing the threshold for prolonged
periods of time, and advise that you never set it higher than needed for
the program to run in reasonable time. Using thresholds higher than
necessary could potentially cause higher system-wide memory pressure,
and also make each garbage-collection cycle take much more time, and
should therefore be avoided.
@ -475,6 +476,10 @@ As the heap size increases, the time to perform a garbage collection
increases. Thus, it can be desirable to do them less frequently in
proportion.
The initial percentage value is 0.1 in interactive sessions and while
dumping Emacs (@pxref{Building Emacs}), and 1.0 in non-interactive
(a.k.a.@: ``batch'') sessions.
As with @code{gc-cons-threshold}, do not enlarge this more than
necessary, and never for prolonged periods of time.
@end defopt

View file

@ -665,10 +665,12 @@ Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}.
The same magic comment can copy any kind of form into
@file{loaddefs.el}. The form following the magic comment is copied
verbatim, @emph{except} if it is one of the forms which the autoload
facility handles specially (e.g., by conversion into an
@code{autoload} call). The forms which are not copied verbatim are
the following:
verbatim, unless it is a form which the autoload facility handles
specially, by conversion directly into an @code{autoload} call, or by
recursively expanding the macro. Any macro can request expansion of
autoloads which call it during generation; @xref{autoload-macro expand}.
The following forms are handled specially:
@table @asis
@item Definitions for function or function-like objects:
@ -684,8 +686,12 @@ and @code{define-overloadable-function} (see the commentary in
@item Other definition types:
@code{defcustom}, @code{defgroup}, @code{deftheme}, @code{defclass}
(@pxref{Top,EIEIO,,eieio,EIEIO}), and @code{define-skeleton}
(@pxref{Top,Autotyping,,autotype,Autotyping}).
(@pxref{Top,EIEIO,,eieio,EIEIO}), @code{define-skeleton}
(@pxref{Top,Autotyping,,autotype,Autotyping}),
@code{transient-define-prefix}, @code{transient-define-suffix},
@code{transient-define-infix}, @code{transient-define-argument}, and
@code{transient-define-group} (@pxref{TOP,Transient,,transient,Transient
User and Developer Manual}).
@end table
You can also use a magic comment to execute a form at build time
@ -727,11 +733,50 @@ keep the line length down. @samp{(fn)} in the usage part of the
documentation string is replaced with the function's name when the
various help functions (@pxref{Help Functions}) display it.
@anchor{autoload-macro expand}
If you write a function definition with an unusual macro that is not
one of the known and recognized function definition methods, use of an
ordinary magic autoload comment would copy the whole definition into
@code{loaddefs.el}. That is not desirable. You can put the desired
@code{autoload} call into @code{loaddefs.el} instead by writing this:
one of the known and recognized function definition methods, using an
ordinary magic autoload comment with a call to the macro would require
autoloading the macro definition itself to work. Doing so copies the
whole macro definition into the autoload file. If that is not desired,
you can use the special declare form @code{(autoload-macro expand)} in
your macro definition (@pxref{Declare Form}), instead of autoloading it.
This indicates to the autoload system that calls to your macro following
@samp{;;;###autoload} should be expanded, similar to how the special
functions listed above are handled. For example, a macro which wraps
@code{define-minor-mode} can request expansion, so that proper
@code{autoload} calls for the function it defines are generated.
@cindex @code{:autoload-end}
The keyword symbol @code{:autoload-end} can be used in the expansion of
a macro to prevent including unwanted forms in the autoload output. Its
presence causes any further elements within the form where it appears to
be silently skipped. For example, if during autoload generation, a
macro's expansion includes:
@example
(progn
(put my-mode 'visible-prop t)
:autoload-end
(put my-mode 'hidden-prop nil))
@end example
@noindent
the final form (@w{@code{(put my-mode 'hidden-prop nil)}}) will not be
copied into the autoload file.
Note that, if a symbol in the @code{car} of an autoloaded form is found
to be undefined during autoload generation, the file in which the
associated @samp{;;;###autoload} appears will itself be loaded, to give
the macro a chance to be defined. Packages which use special loading
mechanisms, including loading their own @file{@var{package}-loaddefs.el}
file, should therefore gracefully handle load errors, since these files
may not yet exist during autoload generation. This can be done, e.g.,
by setting the @var{no-error} argument of @code{require} non-@code{nil}
(@pxref{Named Features})).
Alternatively, instead of expansion, you can put the desired
@code{autoload} call into @file{loaddefs.el} by writing this:
@example
;;;###autoload (autoload 'foo "myfile")

View file

@ -1289,10 +1289,11 @@ the Tabulated List buffer. Its value should be either a list or a
function.
If the value is a list, each list element corresponds to one group, and
should have the form @w{@code{(@var{group-name} @var{entries})}}, where
should have the form
@w{@code{(@var{group-name} @var{entry1} @var{entry2} @dots{})}}, where
@var{group-name} is a string inserted before all group entries, and
@var{entries} have the same format as @code{tabulated-list-entries}
(see above).
@var{entry1}, @var{entry2} and so on each have the same format as an
element of @code{tabulated-list-entries} (see above).
Otherwise, the value should be a function which returns a list of the
above form when called with no arguments.

View file

@ -1441,8 +1441,8 @@ x
The @var{array} should be mutable. @xref{Mutability}.
If @var{array} is a string and @var{object} is not a character, a
@code{wrong-type-argument} error results. The function converts a
unibyte string to multibyte if necessary to insert a character.
@code{wrong-type-argument} error results. For more information about
string mutation, @pxref{Modifying Strings}.
@end defun
@defun fillarray array object

View file

@ -1054,7 +1054,7 @@ This overrides @code{print-escape-nonascii}.
This overrides @code{print-escape-multibyte}.
@item charset-text-property
This overrides @code{print-charset-text-property}.
@item unreadeable-function
@item unreadable-function
This overrides @code{print-unreadable-function}.
@item gensym
This overrides @code{print-gensym}.
@ -1066,6 +1066,8 @@ This overrides @code{print-number-table}.
This overrides @code{float-output-format}.
@item integers-as-characters
This overrides @code{print-integers-as-characters}.
@item symbols-bare
This overrides @code{print-symbols-bare}.
@end table
In the future, more overrides may be offered that do not map directly

View file

@ -467,12 +467,10 @@ described in this section. @xref{Mutability}.
The most basic way to alter the contents of an existing string is with
@code{aset} (@pxref{Array Functions}). @w{@code{(aset @var{string}
@var{idx} @var{char})}} stores @var{char} into @var{string} at character
index @var{idx}. It will automatically convert a pure-@acronym{ASCII}
@var{string} to a multibyte string (@pxref{Text Representations}) if
needed, but we recommend to always make sure @var{string} is multibyte
(e.g., by using @code{string-to-multibyte}, @pxref{Converting
Representations}), if @var{char} is a non-@acronym{ASCII} character, not
a raw byte.
index @var{idx}. When @var{string} is a unibyte string (@pxref{Text
Representations}), @var{char} must be a single byte (0--255); when
@var{string} is multibyte, both @var{char} and the previous character at
@var{idx} must be ASCII (0--127).
To clear out a string that contained a password, use
@code{clear-string}:

View file

@ -4641,6 +4641,8 @@ with @var{tochar} in @var{string}. By default, substitution occurs in
a copy of @var{string}, but if the optional argument @var{inplace} is
non-@code{nil}, the function modifies the @var{string} itself. In any
case, the function returns the resulting string.
For restrictions when altering an existing string, @pxref{Modifying Strings}.
@end defun
@deffn Command translate-region start end table
@ -4716,9 +4718,9 @@ value visits file @var{filename} and goes to buffer position
@var{position}. Restoring this type of position asks the user for
confirmation first.
@item @code{(buffer @var{buffer-name})}
This represents a buffer; jumping to this value switches to buffer
@var{buffer-name}.
@item @code{(buffer @var{buffer})}
This represents a buffer; jumping to this value switches to that
@var{buffer}.
@end table
The functions in this section return unpredictable values unless
@ -6311,7 +6313,11 @@ specific parts of the text.
The functions you use in these hooks should save and restore the match
data if they do anything that uses regular expressions; otherwise, they
will interfere in bizarre ways with the editing operations that call
them.
them. In addition, the functions in these hooks should avoid changing
buffer text, faces, properties, overlays, and other aspects of the
buffer-specific state except those that the hook functions themselves
create and manage, because other parts of Emacs might become confused by
such changes behind their back.
@defvar before-change-functions
This variable holds a list of functions to call when Emacs is about to

View file

@ -55,7 +55,7 @@ closure are shared by any threads invoking the closure.
directly, but the current thread can be exited implicitly, and other
threads can be signaled.
@defun make-thread function &optional name
@defun make-thread function &optional name buffer-disposition
Create a new thread of execution which invokes @var{function}. When
@var{function} returns, the thread exits.
@ -66,9 +66,23 @@ The new thread's current buffer is inherited from the current thread.
used for debugging and informational purposes only; it has no meaning
to Emacs. If @var{name} is provided, it must be a string.
@var{buffer-disposition} indicates what happens if the thread's current
buffer is about to be killed. If the value is @code{t}, killing the
buffer is not allowed. Any other value, including @code{nil} (which is
the default), means that the buffer is killed and the thread is assigned
another current buffer, and it's signaled the error
@code{thread-buffer-killed}. But if the value is the symbol
@code{silently}, the error is not signaled.
This function returns the new thread.
@end defun
@findex thread-buffer-disposition
@findex thread-set-buffer-disposition
After a thread had been created, you can inspect or change its
buffer-disposition using functions @code{thread-buffer-disposition} and
@code{thread-set-buffer-disposition}.
@defun threadp object
This function returns @code{t} if @var{object} represents an Emacs
thread, @code{nil} otherwise.

View file

@ -273,13 +273,15 @@ empty file is visited. This is accomplished by putting
@vindex auto-insert-alist
What gets inserted, if anything, is determined by the variable
@code{auto-insert-alist}. The @sc{car} of each element of this list
is either a mode name, making the element applicable when a buffer is
in that mode, or a string, which is a regexp matched against a
buffer's file name (the latter enables you to distinguish between
different kinds of files that have the same mode in Emacs). The
@sc{car} of an element may also be a cons cell, consisting of mode
name or regexp, as above, and an additional descriptive string.
@code{auto-insert-alist}. The @sc{car} of each element of this list is
either a mode name, making the element applicable when a buffer is in
that mode, or a string, which is a regexp matched against a buffer's
file name (the latter enables you to distinguish between different kinds
of files that have the same mode in Emacs). It can also be a predicate
declared through a plist of the form @code{(predicate @var{function})}.
@var{function} should be a predicate function of no arguments. The
@sc{car} of an element may also be a cons cell, consisting of mode name
or regexp, as above, and an additional descriptive string.
When a matching element is found, the @sc{cdr} says what to do. It may
be a string, which is a file name, whose contents are to be inserted, if

View file

@ -881,7 +881,7 @@ help with this a plethora of predicates have been created.
@anchor{find-class}
Return the class that @var{symbol} represents.
If there is no class, @code{nil} is returned if @var{errorp} is @code{nil}.
If @var{errorp} is non-@code{nil}, @code{wrong-argument-type} is signaled.
If @var{errorp} is non-@code{nil}, @code{wrong-type-argument} is signaled.
@end defun
@defun class-p class

View file

@ -316,10 +316,8 @@ reported.
The indicator type which Flymake should use to indicate lines with
errors or warnings.
Depending on your preference, this can either use @code{fringes} or
@code{margins} for indicating errors.
If set to @code{fringes} (the default), it will automatically fall back
to using margins in windows or frames without fringes, such as text
terminals.
@code{margins} for indicating errors. On text terminals, only
@code{margins} is available.
@item flymake-error-bitmap
A bitmap used in the fringe to mark lines for which an error has

View file

@ -14088,7 +14088,7 @@ indirect ones (three pre-made).
Non-@code{nil} means the nntp server never echoes commands. It is
reported that some nntps server doesn't echo commands. So, you may want
to set this to non-@code{nil} in the method for such a server setting
@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
@code{nntp-open-connection-function} to @code{nntp-open-tls-stream} for
example. The default value is @code{nil}. Note that the
@code{nntp-open-connection-functions-never-echo-commands} variable
overrides the @code{nil} value of this variable.
@ -14144,18 +14144,26 @@ functions is also affected by commonly understood variables
@findex nntp-open-network-stream
@item nntp-open-network-stream
This is the default, and simply connects to some port or other on the
remote system. If both Emacs and the server supports it, the
connection will be upgraded to an encrypted @acronym{STARTTLS}
connection automatically.
remote system. If both Emacs and the server supports it, the connection
will be upgraded to an encrypted @acronym{STARTTLS} connection
automatically. If you want to avoid the possibility of a malicious
intermediary blocking the use of @acronym{STARTTLS}, use
@code{nntp-open-tls-stream} instead.
@item network-only
The same as the above, but don't do automatic @acronym{STARTTLS} upgrades.
@item nntp-open-plain-stream
@itemx network-only
The same as the above, but don't do automatic @acronym{STARTTLS}
upgrades. Only use this if you want anyone to be able to read your
traffic.
@findex nntp-open-tls-stream
@item nntp-open-tls-stream
Opens a connection to a server over a @dfn{secure} channel. To use
this you must have @uref{https://www.gnu.org/software/gnutls/, GnuTLS}
installed. You then define a server as follows:
this, your Emacs must have been compiled with GnuTLS support
@uref{https://www.gnu.org/software/gnutls/, GnuTLS}. You can check this
using the @code{gnutls-available-p} command.
You then define a server as follows:
@lisp
;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
@ -14167,26 +14175,10 @@ installed. You then define a server as follows:
(nntp-address "snews.bar.com"))
@end lisp
@c FIXME openssl s_client should be deprecated in favor of gnutls.
@findex nntp-open-ssl-stream
@item nntp-open-ssl-stream
Opens a connection to a server over a @dfn{secure} channel. To use
this you must have @uref{https://www.openssl.org/, OpenSSL}
@ignore
@c Defunct URL, ancient package, so don't mention it.
or @uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay}
@end ignore
installed. You then define a server as follows:
@lisp
;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
;;
(nntp "snews.bar.com"
(nntp-open-connection-function nntp-open-ssl-stream)
(nntp-port-number 563)
(nntp-address "snews.bar.com"))
@end lisp
This is the old name for @code{nntp-open-tls-stream}, and is
completely equivalent.
@findex nntp-open-netcat-stream
@item nntp-open-netcat-stream
@ -14528,7 +14520,7 @@ Here's an example method that's more complex:
(nnimap-inbox "INBOX")
(nnimap-split-methods default)
(nnimap-expunge t)
(nnimap-stream ssl))
(nnimap-stream tls))
@end example
@table @code
@ -14554,11 +14546,12 @@ How @code{nnimap} should connect to the server. Possible values are:
@table @code
@item undecided
This is the default, and this first tries the @code{ssl} setting, and
This is the default, and this first tries the @code{tls} setting, and
then tries the @code{network} setting.
@item ssl
This uses standard @acronym{TLS}/@acronym{SSL} connections.
@item tls
This uses standard @acronym{TLS}/@acronym{SSL} connections. @code{ssl}
is an equivalent but deprecated way to specify this.
@item network
Non-encrypted and unsafe straight socket connection, but will upgrade
@ -18870,7 +18863,7 @@ operators sprinkled in between.
Perhaps some examples are in order.
Here's a simple predicate. (It's the default predicate, in fact, used
Here's a simple predicate. (The default predicate is @code{false}, used
for all groups that don't belong to any other category.)
@lisp

View file

@ -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{2025-07-15.21}
\def\texinfoversion{2025-07-31.19}
%
% Copyright 1985, 1986, 1988, 1990-2025 Free Software Foundation, Inc.
%
@ -9634,7 +9634,10 @@ might help (with 'rm \jobname.?? \jobname.??s')%
% Auto-number footnotes. Otherwise like plain.
\gdef\footnote{%
\global\advance\footnoteno by \@ne
\edef\thisfootno{$^{\the\footnoteno}$}%
%
% Output for the footnote marker. If we are immediately after another
% footnote, output a comma and small space first.
\edef\thisfootno{$^{\ifnum\lastpenalty=3 ,\mskip 1mu \fi\the\footnoteno}$}%
%
% In case the footnote comes at the end of a sentence, preserve the
% extra spacing after we do the footnote number.
@ -9643,19 +9646,25 @@ might help (with 'rm \jobname.?? \jobname.??s')%
%
% Remove inadvertent blank space before typesetting the footnote number.
\unskip
\thisfootno\@sf
%
% \scriptspace is 0.5pt by default and gives excessive space before the
% comma if we have multiple footnote markers in a row.
\bgroup\scriptspace=0pt
\thisfootno\@sf
\egroup
\dofootnote
}%
% Don't bother with the trickery in plain.tex to not require the
% footnote text as a parameter. Our footnotes don't need to be so general.
%
% Oh yes, they do; otherwise, @ifset (and anything else that uses
% \parseargline) fails inside footnotes because the tokens are fixed when
% the footnote is read. --karl, 16nov96.
% marker for immediately after a footnote marker
\gdef\footnoteendmarker{\penalty3 }
% Do not require the footnote text as a parameter; otherwise, @ifset
% (and anything else that uses \parseargline) fails inside footnotes
% because the tokens are fixed when the footnote is read.
%
\gdef\dofootnote{%
\insert\footins\bgroup
\aftergroup\footnoteendmarker
%
% Nested footnotes are not supported in TeX, that would take a lot
% more work. (\startsavinginserts does not suffice.)
@ -9686,14 +9695,14 @@ might help (with 'rm \jobname.?? \jobname.??s')%
% Hang the footnote text off the number. Use \everypar in case the
% footnote extends for more than one paragraph.
\everypar = {\hang}%
\textindent{\thisfootno}%
\textindent{$^{\the\footnoteno}$}%
%
% Don't crash into the line above the footnote text. Since this
% expands into a box, it must come within the paragraph, lest it
% provide a place where TeX can split the footnote.
\footstrut
%
% Invoke rest of plain TeX footnote routine.
% Eat opening brace and invoke rest of plain TeX footnote routine.
\futurelet\next\fo@t
}
}%end \catcode `\@=11

View file

@ -169,6 +169,7 @@ How file names, directories and localnames are mangled and managed
* Localname deconstruction:: Breaking a localname into its components.
* External packages:: Integration with external Lisp packages.
* Extension packages:: Adding new methods to @value{tramp}.
* New operations:: Handling further operations in @value{tramp}.
@end detailmenu
@end menu
@ -2375,9 +2376,11 @@ value is @t{"-l"}, but some shells, like @command{ksh}, prefer
All @file{tramp-sh.el} based methods accept the property
@t{"session-timeout"}. This is the time (in seconds) after a
connection is disabled for security reasons, and must be
reestablished. A value of @code{nil} disables this feature. Most of
the methods do not set this property except the @option{sudo},
@option{doas} and @option{run0} methods, which use predefined values.
reestablished@footnote{If there is a modified buffer, or a buffer
under @code{auto-revert}, this is suppressed.}. A value of @code{nil}
disables this feature. Most of the methods do not set this property
except the @option{sudo}, @option{doas} and @option{run0} methods,
which use predefined values.
@item @t{"~"}@*
@t{"~user"}
@ -3658,6 +3661,8 @@ behavior: @file{@trampfn{method,user@@host,path/to/file}}.
For specifying port numbers, affix @file{#<port>} to the host
name. For example: @file{@trampfn{ssh,daniel@@melancholia#42,.emacs}}.
If the host is an IPv6 address, the port is appended like this:
@file{@trampfn{ssh,@value{ipv6prefix}::1@value{ipv6postfix}#42,.emacs}}.
All method, user name, host name, port number and local name parts are
optional, @xref{Default Method}, @xref{Default User}, @xref{Default Host}.
@ -5472,6 +5477,13 @@ Suppress reading the remote history file in @code{shell}. Set
Disable excessive traces. Set @code{tramp-verbose} to 3 or lower,
default being 3. Increase trace levels temporarily when hunting for
bugs.
@item
Use a package with @value{tramp} specific implementation of high-level
operations. For example, the GNU ELPA package @file{tramp-hlo}
implements specialized versions of @code{dir-locals--all-files},
@code{locate-dominating-file} and @code{dir-locals-find-file} for
@value{tramp}'s @code{tramp-sh} backend (@pxref{New operations}).
@end itemize
@ -6457,6 +6469,7 @@ programs.
* Localname deconstruction:: Splitting a localname into its component parts.
* External packages:: Integrating with external Lisp packages.
* Extension packages:: Adding new methods to @value{tramp}.
* New operations:: Handling further operations in @value{tramp}.
@end menu
@ -6721,15 +6734,112 @@ The trick is to wrap the function definition of
@code{;;;###autoload} cookie.
@node New operations
@section Handling further operations in @value{tramp}
By default, @value{tramp} handles the basic operations listed in
@ref{Magic File Names, , Magic File Name Operations, elisp}.
Sometimes, it is desired to support more complex operations directly,
mainly for performance reasons.
An external package package could add an own implementation of an
operation to @value{tramp}, which avoids the performance overhead
caused by using the basic operations which are aware of remote files.
For example, it could implement this by using an own shell script
which collects the information on the remote host for this very
special purpose with one round-trip per-call.
@defun tramp-add-external-operation operation function backend
This adds an implementation of @var{operation} to @value{tramp}'s
backend @var{backend}. @var{function} is the new implementation.
Both @var{operation} and @var{function} shall be function symbols.
They must have the same argument list. The first argument is used to
determine, whether @value{tramp} is invoked (check for remote file
name syntax). It must be a string or nil, in the latter case
@code{default-directory} is used for the check.
@var{backend}, also a symbol, is the feature name of a @value{tramp}
backend (except @code{tramp-ftp}). The new implementation will be
applied only for this backend. Example:
@lisp
@group
(defun test-operation (file)
(message "Original implementation for %s" file))
@end group
@group
(defun handle-test-operation (file)
(message "Handler implementation for %s" file))
@end group
@group
(tramp-add-external-operation
#'test-operation #'handle-test-operation 'tramp-sh)
@end group
@end lisp
Then we have the different use cases:
@lisp
@group
;; Local file name.
(test-operation "/a/b")
@result{} "Original implementation for /a/b"
@end group
@group
;; Remote file name, handled by `tramp-sh'.
(test-operation "/ssh::/a/b")
@result{} "Handler implementation for /ssh::/a/b"
@end group
@group
;; Remote file name, handled by `tramp-gvfs'.
(test-operation "/sftp::/a/b")
@result{} "Original implementation for /sftp::/a/b"
@end group
@end lisp
@var{function} is implemented like an ordinary @value{tramp} backend
handler, see the examples in @code{tramp-<backend>-handle-*} and
@code{tramp-handle-*}. It can expect, that the first argument (or
@code{default-directory}, if that is @code{nil}) has remote file name
syntax. It shall use @value{tramp} internal macros and functions like
@code{with-parsed-tramp-file-name} and the different cache functions.
If the same @var{function} shall be used for different @value{tramp}
backends, @code{tramp-add-external-operation} must be called for every
backend, respectively.
@end defun
@defun tramp-remove-external-operation operation backend
The handler for @var{operation}, added by
@code{tramp-add-external-operation}, is removed from @var{backend}.
If there are handlers of @var{operation} for other @var{backend}s,
they are kept. Example:
@lisp
@group
(tramp-remove-external-operation
#'test-operation 'tramp-sh)
@end group
@end lisp
@end defun
@node Traces and Profiles
@chapter How to Customize Traces
@vindex tramp-verbose
@vindex tramp-debug-to-file
@vindex tramp-debug-command-messages
@vindex tramp-debug-buffer-limit
@value{tramp} messages are raised with verbosity levels ranging from 0
to 10. @value{tramp} does not display all messages; only those with a
verbosity level less than or equal to @code{tramp-verbose}.
verbosity level less than or equal to 3, when @code{tramp-verbose}
permits.
@noindent
The verbosity levels are
@ -6814,6 +6924,12 @@ strings), and the entry and exit messages for the function
@code{tramp-file-name-handler}. This is intended for @value{tramp}
maintainers, analyzing the remote commands for performance analysis.
The debug buffer can be very large, if @code{tramp-verbose} is high,
and @value{tramp} runs for a long time. If the buffer size exceeds
@code{tramp-debug-buffer-limit} (100MB by default), a warning will be
raised. This user option can be adapted to your needs; a value of 0
means that there is no limit (no warning).
@node GNU Free Documentation License
@appendix GNU Free Documentation License
@ -6841,7 +6957,7 @@ maintainers, analyzing the remote commands for performance analysis.
@bye
@c TODO
@c TODO:
@c
@c * Say something about the .login and .profile files of the remote
@c shells.
@ -6850,3 +6966,5 @@ maintainers, analyzing the remote commands for performance analysis.
@c host and then send commands to it.
@c
@c * Consistent small or capitalized words especially in menus.
@c
@c * Starting with Emacs 29, use 'setopt' in the examples.

View file

@ -31,7 +31,7 @@ General Public License for more details.
@finalout
@titlepage
@title Transient User and Developer Manual
@subtitle for version 0.9.3
@subtitle for version 0.9.4
@author Jonas Bernoulli
@page
@vskip 0pt plus 1filll
@ -53,7 +53,7 @@ resource to get over that hurdle is Psionic K's interactive tutorial,
available at @uref{https://github.com/positron-solutions/transient-showcase}.
@noindent
This manual is for Transient version 0.9.3.
This manual is for Transient version 0.9.4.
@insertcopying
@end ifnottex

View file

@ -304,7 +304,7 @@ Anders Waldenborg: changed emacsclient.c
Andrea Corallo: wrote comp-common.el comp-cstr-tests.el comp-cstr.el
comp-run.el comp-tests.el comp.c comp.el syncdoc-type-hierarchy.el
and changed pdumper.c lread.c bytecomp.el configure.ac startup.el
loadup.el comp.h lisp.h cl-macs.el cl-preloaded.el comp-test-funcs.el
loadup.el comp.h lisp.h cl-macs.el comp-test-funcs.el cl-preloaded.el
subr.el Makefile.in data.c elisp-mode.el nadvice.el alloc.c byte-run.el
emacs.c lisp/Makefile.in advice.el and 101 other files
@ -1740,7 +1740,7 @@ and co-wrote help-tests.el
and changed xdisp.c display.texi w32.c msdos.c simple.el w32fns.c
files.el fileio.c keyboard.c configure.ac emacs.c text.texi w32term.c
dispnew.c frames.texi files.texi w32proc.c xfaces.c window.c
dispextern.h lisp.h and 1407 other files
dispextern.h lisp.h and 1409 other files
Eliza Velasquez: changed server.el simple.el
@ -2625,7 +2625,7 @@ James TD Smith: changed org.el org-colview.el org-clock.el
org.texi
James Thomas: changed eww.el nnmail.el quail/indian.el gnus-cache.el
gnus-msg.el ind-util.el info-look.el progmodes/python.el
gnus-msg.el gnus.texi ind-util.el info-look.el progmodes/python.el
James Troup: changed gnus-sum.el
@ -3198,8 +3198,8 @@ Joshua Datko: changed fortune.el
Joshua Varner: changed intro.texi
Jostein Kjønigsen: changed csharp-mode.el typescript-ts-mode.el js.el
eglot.el progmodes/compile.el README dotnet-appconfig.rnc
Jostein Kjønigsen: changed csharp-mode.el typescript-ts-mode.el eglot.el
js.el progmodes/compile.el README dotnet-appconfig.rnc
dotnet-packages-config.rnc dotnet-packages-props.rnc dotnet-resx.rnc
json-ts-mode.el msbuild.rnc nuget.rnc nuspec.rnc nxml-mode.el
schemas.xml treesit.el
@ -3443,6 +3443,8 @@ and changed pgg-gpg.el pgg.el progmodes/python.el locked-encrypted.png
locked-encrypted.xpm pgg-pgp.el pgg-pgp5.el unlocked-encrypted.png
unlocked-encrypted.xpm README edebug.el pgg.texi tips.texi
Ken Mankoff: changed leuven-dark-theme.el leuven-theme.el
Kenneth Stailey: changed alpha.h configure.ac ns32000.h openbsd.h pmax.h
sparc.h unexalpha.c unexelf.c
@ -3564,11 +3566,11 @@ Koichi Arakawa: changed tramp-sh.el w32proc.c
Konrad Hinsen: wrote ol-eshell.el
and changed ob-python.el
Konstantin Kharlamov: changed smerge-mode.el diff-mode.el files.el
indent.erts typescript-ts-mode.el ada-mode.el alloc.c autorevert.el
calc-aent.el calc-ext.el calc-lang.el cc-mode.el cperl-mode.el
css-mode.el cua-rect.el dnd.el ebnf-abn.el ebnf-dtd.el ebnf-ebx.el
emacs-module-tests.el epg.el and 33 other files
Konstantin Kharlamov: changed indent.erts smerge-mode.el
typescript-ts-mode.el diff-mode.el files.el ada-mode.el alloc.c
autorevert.el calc-aent.el calc-ext.el calc-lang.el cc-mode.el
cperl-mode.el css-mode.el cua-rect.el dnd.el ebnf-abn.el ebnf-dtd.el
ebnf-ebx.el emacs-module-tests.el epg.el and 33 other files
Konstantin Kliakhandler: changed org-agenda.el
@ -3727,6 +3729,8 @@ Lewis Perin: changed emacs-x86.manifest
Liam Healy: changed outline.el
Liam Hupfer: changed js.el
Liam Stitt: changed url-file.el url-vars.el
Liang Wang: changed etags.el
@ -5058,9 +5062,9 @@ Piotr Zieliński: wrote org-mouse.el
Pip Cet: wrote image-circular-tests.el
and changed xdisp.c comp.c byte-opt.el fns.c pdumper.c alloc.c
display.texi ftcrfont.c image.c sfnt.c xterm.c DEBUG bytecomp-tests.el
bytecomp.el ccl-tests.el ccl.c ccl.el cl-macs.el cmds.c comint.el
comp-test-funcs.el and 34 other files
display.texi eval.c ftcrfont.c image.c sfnt.c xterm.c DEBUG
bytecomp-tests.el bytecomp.el ccl-tests.el ccl.c ccl.el cl-macs.el
cmds.c comint.el and 34 other files
Platon Pronko: changed tramp.el
@ -5538,10 +5542,10 @@ Sean O'Rourke: changed complete.el comint.el dabbrev.el find-func.el
Sean Sieger: changed emacs-lisp-intro.texi
Sean Whitton: wrote em-elecslash.el em-extpipe-tests.el em-extpipe.el
and changed vc-git.el project.el bindings.el server.el simple.el subr.el
vc-dispatcher.el vc.el window.el eshell-tests.el eshell.texi subr-x.el
.dir-locals.el cl-macs.el eshell-tests-helpers.el files.texi ftfont.c
remember.el startup.el term.el INSTALL and 38 other files
and changed vc-git.el project.el vc.el bindings.el server.el simple.el
subr.el vc-dispatcher.el window.el eshell-tests.el eshell.texi
subr-x.el .dir-locals.el cl-macs.el eshell-tests-helpers.el files.texi
ftfont.c remember.el startup.el term.el INSTALL and 40 other files
Sebastian Fieber: changed gnus-art.el mm-decode.el mm-view.el
@ -6430,6 +6434,8 @@ and changed ps-prin1.ps ps-bdf.el ps-prin0.ps blank-mode.el ps-prin3.ps
easymenu.el loading.texi menu-bar.el misc.texi progmodes/compile.el
ps-print-def.el ps-vars.el
Vinícius Moraes: changed cmuscheme.el
Vitalie Spinu: changed comint.el eieio-base.el message.el ob-R.el
ob-core.el ob-tangle.el subr.el
@ -6593,7 +6599,7 @@ Xi Lu: changed etags.c htmlfontify.el ruby-mode.el CTAGS.good_crlf
man-tests.el man.el shortdoc.el tramp-sh.el
Xiyue Deng: changed emacs-lisp-intro.texi strings.texi functions.texi
symbols.texi
smtpmail.el symbols.texi
Xuan Wang: changed warnings.el

View file

@ -211,15 +211,19 @@ the debugger, but before running it, is the most efficient way of
making sure control will be returned to the debugger when you need
that.
'Fsignal' is a very useful place to put a breakpoint in. All Lisp
errors go through there. If you are only interested in errors that
would fire the Lisp debugger, breaking at 'maybe_call_debugger' is
useful.
The function 'debugger-trap' is a do-nothing interactive command that
exists to give control to the debugger. It is convenient to set a
breakpoint there to give control to the debugger when the function is
called. You can invoke it interactively with "M-x debugger-trap RET".
The src/.gdbinit file in the Emacs source distribution sets a breakpoint
in this function, so if you arrange for .gdbinit to be loaded, or load
it manually in a debugging session, the breakpoint is set for you
automatically.
Another technique for getting control to the debugger is to put a
breakpoint in some rarely used function. One such convenient function
is Fredraw_display, which you can invoke at will interactively with
"M-x redraw-display RET".
'Fsignal' is another very useful place to put a breakpoint in. All Lisp
errors go through there. If you are only interested in errors that
would fire the Lisp debugger, breaking at 'maybe_call_debugger' is a
useful alternative.
It is also useful to have a guaranteed way to return to the debugger
at any arbitrary time. When using X, this is easy: type C-z at the

View file

@ -241,6 +241,8 @@ GNU Emacs 29.4 (2024-06-22) emacs-29.4
GNU Emacs 30.1 (2025-02-23) emacs-30.1
GNU Emacs 30.2 (2025-08-14) emacs-30.2
----------------------------------------------------------------------
This file is part of GNU Emacs.

278
etc/NEWS
View file

@ -162,15 +162,26 @@ behavior, customize 'find-function-mode-lower-precedence' to non-nil.
** Minibuffer and Completions
+++
*** New user option 'completion-eager-display'.
This option configures whether completion commands should display the
"*Completions*" buffer immediately. When the option is set to t, all
completion commands show "*Completions*" immediately, respectively nil
disables the eager display for all commands. The default setting auto
enables eager completion only if requested by the command.
For more fine-grained control you can also toggle this feature by
category using the symbol 'eager-display' in the user option
'completion-category-overrides'.
*** Support for immediate display of the "*Completions*" buffer.
Whenever a minibuffer with completion is opened, the "*Completions*"
buffer will now be displayed immediately if the completion property
'eager-display', set by the completion table, is non-nil. This property
can be overridden for different completion categories by customizing
'completion-category-overrides'. Alternatively, the new user option
'completion-eager-display' can be set to t to force eager display of
"*Completions*" for all minibuffers, or nil to suppress this for all
minibuffers.
+++
*** Support for updating "*Completions*" as you type.
If the "*Completions*" buffer is displayed, it will now be updated as
you type if the completion property 'eager-update', set by the
completion table, is non-nil. This property can be overridden for
different completion categories by customizing
'completion-category-overrides'. Alternatively, the new user option
'completion-eager-update can be set to t to make "*Completions*" always
be updated as you type, or nil to suppress this always. Note that for
large or inefficient completion tables this can slow down typing.
+++
*** New user option 'completion-pcm-leading-wildcard'.
@ -333,6 +344,10 @@ helps to restore window buffers across Emacs sessions.
You can use this in 'display-buffer-alist' to match buffers displayed
during the execution of particular commands.
*** New command 'other-window-backward' ('C-x O').
This moves in the opposite direction of 'other-window' and is for its
default keybinding consistent with 'repeat-mode'.
** Frames
+++
@ -427,6 +442,16 @@ This user option controls where 'tab-line-mode' should not be enabled in
a buffer. The value must be a condition which is passed to
'buffer-match-p'.
---
*** New user option 'tab-line-close-modified-button-show'.
With this user option, if non-nil (the default), the tab close button
will change its appearance if the tab buffer has been modified.
---
*** New user option 'tab-line-tabs-window-buffers-filter-function'.
This user option controls which buffers should appear in the tab line.
By default, this is set to not filter the buffers.
** Project
---
@ -443,17 +468,31 @@ It is equivalent to running 'project-any-command' with
The prompt now displays the chosen project on which to invoke a command.
---
*** The MAYBE-PROMPT argument of 'project-current' can be a string.
When such value is used, the 'project-prompter' is called with it as the
first argument. This is a way for the callers to indicate, for example,
the reason or the context why the project is asked for.
*** 'project-prompter' values may be called with up to three arguments.
These allow callers of the value of 'project-prompter' to specify a
prompt string; prompt the user to choose between a subset of all the
known projects; and disallow returning arbitrary directories.
See the docstring of 'project-prompter' for a full specification of
these new optional arguments.
---
*** New command 'project-find-matching-file'.
*** 'project-current' has a new optional argument, MAYBE-PROMPT.
If 'project-current' is called with this argument non-nil, then it is
passed to the 'project-prompter' to use as a prompt string.
Callers can use this to indicate the reason for which or context in
which Emacs should ask the user to select a project.
---
*** New command 'project-find-matching-buffer'.
It can be used when switching between projects with similar file trees
(such as Git worktrees of the same repository). It supports being
invoked standalone or from the 'project-switch-commands' dispatch menu.
---
*** New variable 'project-find-matching-buffer-function'.
Major modes can set this to major mode-specific functions to control how
'project-find-matching-buffer' finds matching buffers.
+++
*** New user option 'project-list-exclude'.
This user option describes projects that should always be skipped by
@ -465,12 +504,13 @@ This user option controls the automatic deletion of projects from
'project-list-file' that cannot be accessed when prompting for a
project.
The value can be a predicate which takes one argument and should return
non-nil if the project should be removed. If set to nil, all the
inaccessible projects will not be removed automatically.
The value must be an alist where each element must be in the form:
By default this is set to 'project-prune-zombies-default' function
which removes all non-remote projects.
(WHEN . PREDICATE)
where WHEN specifies where the deletion will be performed, and PREDICATE
a function which takes one argument, and must return non-nil if the
project should be removed.
---
*** New command 'project-save-some-buffers' bound to 'C-x p C-x s'.
@ -478,6 +518,23 @@ This is like 'C-x s', but only for this project's buffers.
*** 'project-remember-project' can now be called interactively.
---
*** 'project-shell' and 'project-eshell' support numeric prefix buffer naming.
They now accept numeric prefix arguments to select or create numbered
shell sessions. For example, 'C-2 C-x p s' switches to or creates a
buffer named "*name-of-project-shell<2>*". By comparison, a plain
universal argument as in 'C-u C-x p s' always creates a new session.
---
*** 'project-switch-buffer' re-uniquifies buffer names while prompting.
When 'uniquify-buffer-name-style' is non-nil, 'project-switch-buffer'
changes the buffer names to only make them unique within the given
project, during completion. That makes some items shorter.
*** 'project-switch-buffer' uses 'project-buffer' as completion category.
The category defaults are the same as for 'buffer' but any user
customizations would need to be re-added.
** Registers
*** New functions 'buffer-to-register' and 'file-to-register'.
@ -662,6 +719,15 @@ to the value 'fill-region-as-paragraph-semlf' to enable functions like
'fill-paragraph' and 'fill-region' to fill text using "semantic
linefeeds".
---
** Temporary files are named differently when 'file-precious-flag' is set.
When the user option 'file-precious-flag' is set to a non-nil value,
Emacs now names the temporary file it creates while saving buffers using
the original file name with ".tmp" appended to it. Thus, if saving the
buffer fails for some reason, and the temporary file is not renamed back
to the original file's name, you can easily identify which file's saving
failed.
+++
** 'C-u C-x .' clears the fill prefix.
You can now use 'C-u C-x .' to clear the fill prefix, similarly to how
@ -670,6 +736,15 @@ you could already use 'C-u C-x C-n' to clear the goal column.
* Changes in Specialized Modes and Packages in Emacs 31.1
** Autoinsert
+++
*** New condition for 'auto-insert-alist'.
'auto-insert-alist' now also allows to have a predicate taking no
argument as conditions. These types of conditions should be declared
with '(predicate FUNCTION)'. This allows to trigger 'auto-insert'
with finer grained control.
** Register
*** The "*Register Preview*" buffer shows only suitable registers.
@ -678,6 +753,12 @@ the default UI you get, i.e., when 'register-use-preview' is 'traditional'.
** Tree-sitter
*** New user option 'treesit-enabled-modes'.
You can customize it either to t to enable all available ts-modes,
or to select a list of ts-modes to enable. Depending on customization,
it modifies the variable 'major-mode-remap-alist' from the corresponding
variable 'treesit-major-mode-remap-alist' prepared by ts-mode packages.
*** New user option 'treesit-auto-install-grammar'.
It controls the automatic installation of tree-sitter grammar libraries
needed for tree-sitter based modes, if these grammar libraries are not
@ -869,6 +950,13 @@ build tags for the test commands.
The 'go-ts-mode-test-flags' user option is available to set a list of
additional flags to pass to the go test command line.
** Lua-ts mode
---
*** New user option 'lua-ts-auto-close-block-comments'.
When non-nil, inserting a block comment "--[[" will close it by
inserting its respective "]]". By default, this is disabled.
** Java-ts mode
+++
@ -885,6 +973,12 @@ option controls how much is indented for method chaining.
** PHP-ts mode
---
*** 'php-ts-mode' now depends on 'mhtml-ts-mode'.
The direct dependency on js-ts-mode, css-ts-mode and html-ts-mode has
now been replaced by mhtml-ts-mode. Navigation, Outline and Imenu
work for all languages and code maintenance is easier.
---
*** 'php-ts-mode-run-php-webserver' can now accept a custom "php.ini" file.
You can use the new optional argument CONFIG when calling
@ -893,6 +987,34 @@ the built-in Web server. Interactively, when invoked with a prefix
argument, 'php-ts-mode-run-php-webserver' prompts for the config file as
well as for other connection parameters.
---
*** The option 'php-ts-mode-css-fontify-colors' has been removed.
'mhtml-ts-mode-css-fontify-colors' replaces this option.
---
*** New user option 'php-ts-mode-html-relative-indent'.
In buffers containing both PHP and HTML, this option allows you to
define how the PHP code should be indented relative to the position of
the HTML tags.
---
*** New user option 'php-ts-mode-html-indent-offset'.
Offset of PHP code block relative to HTML tags.
---
*** New user option 'php-ts-mode-find-sibling-rules'.
Rules for finding siblings of a PHP file.
---
*** New user option 'php-ts-mode-phpdoc-highlight-errors'.
When non nil, it highlights unknown PHPDOC tags using
'font-lock-warning-face' so that the user can identify them more easily.
---
*** New command 'php-ts-mode-show-ini'.
Show the location of the PHP ini files, if the buffer is associated to a remote
PHP file show the remote PHP ini files.
** Rust-ts mode
---
@ -920,6 +1042,14 @@ characters in CJK texts. For example, 'A' is converted to '', '1' is
converted to '', etc. Companion commands 'halfwidth-region' and
'halfwidth-word' perform the opposite conversion.
** Texinfo mode
---
*** texinfo-mode now can auto-close the ``'' pairs.
Now inserting `` in 'texinfo-mode' will close it by inserting its
respective '', if 'electric-pair-mode' is enabled.
** ASM mode
---
@ -1103,6 +1233,14 @@ slot. Symbol macros are created for the accessor functions using
If 'whitespace-style' includes 'missing-newline-at-eof' (which is the
default), the 'whitespace-cleanup' function will now add the newline.
---
*** 'whitespace-mode' now can prettify page delimiter characters (^L).
If 'page-delimiters' is set in 'whitespace-style', or the new minor mode
'whitespace-page-delimiters-mode' is on, the page delimiter characters
(^L) are displayed as a pretty horizontal line that spans the entire
width of the window. The new 'whitespace-page-delimiter' face can be
used to customize the appearence.
** Bookmark
---
@ -1594,6 +1732,15 @@ This feature is experimental.
---
*** Implementation of filesystem notifications for connection method "smb".
+++
*** New functions to extend the set of operations with a remote implementation.
The new functions 'tramp-add-external-operation' and
'tramp-remove-external-operation' allow to add an implementation for
other operations but the defined set of magic file name operations.
This can be used by external ELPA packages for performance optimizations
in special cases. For more information, see "(tramp) New operations" in
the Tramp manual.
** Diff
---
@ -1817,6 +1964,13 @@ restart Emacs.
---
*** Support of 'electric-layout-mode' added.
---
*** 'DEL' now deletes the text in the active region.
When point is between indentation, the command
'python-indent-dedent-line-backspace' (by default bound to 'DEL') now
deletes the text in the region and deactivates the mark if Transient
Mark mode is enabled, the mark is active, and prefix argument is 1.
** Tmm Menubar
---
@ -1876,6 +2030,7 @@ other working trees:
- 'C-x v w c': Add a new working tree.
- 'C-x v w w': Visit this file in another working tree.
- 'C-x v w s': Like 'C-x p p' but limited to other working trees.
- 'C-x v w x': Delete a working tree you no longer need.
- 'C-x v w R': Relocate a working tree to another file name.
@ -1996,15 +2151,19 @@ relevant buffers before generating the contents of a VC Directory buffer
(like the third-party package Magit does with its status buffer).
+++
*** New commands 'vc-root-diff-incoming' and 'vc-root-diff-outgoing'.
These commands report diffs of all the changes that would be pulled and
would be pushed, respectively. They are the diff analogues of the
existing commands 'vc-log-incoming' and 'vc-log-outgoing'.
*** New commands to report incoming and outgoing diffs.
'vc-root-diff-incoming' and 'vc-root-diff-outgoing' report diffs of all
the changes that would be pulled and would be pushed, respectively.
They are the diff analogues of the existing commands 'vc-log-incoming'
and 'vc-log-outgoing'.
In particular, 'vc-root-diff-outgoing' is useful as a way to preview
your push and ensure that all and only the changes you intended to
include were committed and will be pushed.
'vc-diff-incoming' and 'vc-diff-outgoing' are similar but limited to the
current VC fileset.
+++
*** New user option 'vc-use-incoming-outgoing-prefixes'.
If this is customized to non-nil, 'C-x v I' and 'C-x v O' become prefix
@ -2142,6 +2301,16 @@ destination window is chosen using 'display-buffer-alist'. Example:
display-buffer-use-some-window)
(some-window . mru))))
** Revert
+++
*** Variable 'revert-buffer-in-progress' has been renamed.
The old name, 'revert-buffer-in-progress-p', is kept as obsolete
variable alias.
Symbol names with a trailing '-p' are reserved for predicates. Calling
a variable like this was a mistake.
** Autorevert
+++
@ -2155,6 +2324,12 @@ This macro adds the current buffer to 'inhibit-auto-revert-buffers',
runs its body, and removes the current buffer from
'inhibit-auto-revert-buffers' afterwards.
+++
*** New variable 'auto-revert-buffer-in-progress'.
'auto-revert-buffer' binds this variable to a non-nil value while it is
working. This can be used by major mode 'revert-buffer-function'
implementations to suppress messages in Auto Revert modes, for example.
** Strokes
--
@ -2340,11 +2515,6 @@ file names in above buffers. The default is nil.
---
** Flymake
*** Windows without fringes now automatically use margin indicators.
When 'flymake-indicator-type' is set to 'fringes', as is now the default,
flymake will automatically fall back to using margin indicators in
windows without fringes, including any window on a text terminal.
*** Enhanced 'flymake-show-diagnostics-at-end-of-line'
The new value 'fancy' allowed for this user option will attempt to
layout diagnostics below the affected line using unicode graphics to
@ -2410,6 +2580,12 @@ modifier, it scrolls by year.
The month and year navigation key bindings 'M-}', 'M-{', 'C-x ]' and
'C-x [' now have the alternative keys '}', '{', ']' and '['.
---
*** Avoid modifying Calendar's user options.
The user options 'calendar-mark-holidays-flag' and
'calendar-mark-diary-entries-flag' are not modified anymore when
changing the marking state in the calendar buffer.
** Calc
*** New user option 'calc-string-maximum-character'.
@ -2456,10 +2632,10 @@ Use the byte-compiler instead; it provides more and more useful warnings.
---
*** New user option 'newsticker-hide-old-feed-header'.
It controls whether to automatically hide the header of feeds whose
items are all old or obsolete in the plainview *newsticker* buffer.
items are all old or obsolete in the plainview "*newsticker*" buffer.
This is only visually interesting if the content of those feeds are also
hidden (see 'newsticker-hide-old-items-in-newsticker-buffer' and
'newsticker-show-descriptions-of-new-items')."
'newsticker-show-descriptions-of-new-items').
---
*** New commands to hide and show headers of old newsticker feeds.
@ -2471,7 +2647,6 @@ or obsolete.
** CPerl mode
*** Syntax of Perl up to version 5.42 is supported.
CPerl mode creates imenu entries for ":writer" generated accessors and
recognizes the new functions "all" and "any".
See https://perldoc.perl.org/5.42.0/perldelta for details.
@ -2505,6 +2680,21 @@ enabled for files named "go.work".
* Incompatible Lisp Changes in Emacs 31.1
+++
** String mutation has been restricted further.
'aset' on unibyte strings now requires the new character to be a single
byte (0-255). On multibyte strings the new character and the character
being replaced must both be ASCII (0-127).
These rules ensure that mutation will never transform a unibyte string
to multibyte, and that the size of a string in bytes (as reported by
'string-bytes') never changes. They also allow strings to be
represented more efficiently in the future.
Other functions that use 'aset' to modify string data, such as
'subst-char-in-string' with a non-nil INPLACE argument, will signal an
error if called with arguments that would violate these rules.
** Nested backquotes are not supported any more in Pcase patterns.
---
@ -2513,9 +2703,6 @@ enabled for files named "go.work".
** The 'rx' category name 'chinese-two-byte' must now be spelled correctly.
An old alternative name (without the first 'e') has been removed.
+++
** 'read-directory-name' now accepts an optional PREDICATE argument.
+++
** 'text-property-default-nonsticky' is now buffer-local.
This variable now becomes buffer-local when set. Use 'setq-default' in
@ -2586,6 +2773,21 @@ That is, if the PATH environment variable is unset or empty, 'exec-path'
now acts as if PATH is the system default, which is "/bin:/usr/bin"
on GNU/Linux systems.
---
** New variable 'tty-cursor-movement-use-TAB-BS'.
The display optimization where the combination TAB characters +
BACKSPACE is used to move to a position on a TTY frame is now disabled
by default and controlled by this variable; it can be set to non-nil
to keep the old behavior. This change is to accomodate screen
readers.
+++
** A thread's current buffer can now be killed.
We introduce a new attribute for threads called buffer-disposition.
See the new argument in 'make-thread'. The default value allows the
thread's current buffer to be killed by another thread. This does not
apply to the main thread's buffer.
* Lisp Changes in Emacs 31.1
@ -2835,6 +3037,14 @@ option, but can optionally return the equivalent of 'exec-suffixes' from
a remote host. It must be used in conjunction with the function
'exec-path'.
+++
** 'read-directory-name' now accepts an optional PREDICATE argument.
---
** JSON parse error line and column are now obsolete.
The column number is no longer available; the line number will be
removed in next Emacs release.
* Changes in Emacs 31.1 on Non-Free Operating Systems

View file

@ -1822,7 +1822,7 @@ separate Texinfo file.
*** The PCL-CVS package available by either running M-x cvs-examine or
by visiting a CVS administrative directory (with a prefix argument)
provides an alternative interface to VC-dired for CVS. It comes with
provides an alternative interface to VC-Dir for CVS. It comes with
'log-view-mode' to view RCS and SCCS logs and 'log-edit-mode' used to
enter check-in log messages.

View file

@ -15,32 +15,9 @@ 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'.
* Installation Changes in Emacs 30.2
* Startup Changes in Emacs 30.2
* Changes in Emacs 30.2
* Editing Changes in Emacs 30.2
* Changes in Specialized Modes and Packages in Emacs 30.2
* New Modes and Packages in Emacs 30.2
* Incompatible Lisp Changes in Emacs 30.2
* Lisp Changes in Emacs 30.2
* Changes in Emacs 30.2 on Non-Free Operating Systems
Emacs 30.2 is a bug-fix release with no new features.
* Installation Changes in Emacs 30.1

View file

@ -4,5 +4,9 @@ COPYRIGHT AND LICENSE INFORMATION FOR IMAGE FILES
Files: close.xpm new.xpm left-arrow.xpm right-arrow.xpm
Author: Juri Linkov <juri@linkov.net>
Files: close-modified.xpm
Author: Elías Gabriel Pérez <eg642616@gmail.com>
Copyright (C) 2019-2025 Free Software Foundation, Inc.
License: GNU General Public License version 3 or later (see COPYING)

View file

@ -0,0 +1,16 @@
/* XPM */
static char *dummy[]={
"9 9 4 1",
". c None",
"b c #000000",
"a c #808080",
"# c #bfbfbf",
"..#####..",
".#######.",
"###aaa###",
"##abbba##",
"##abbba##",
"##abbba##",
"###aaa###",
".#######.",
"..#####.."};

View file

@ -9,6 +9,8 @@
;; TYPE being `fun' or `var'.
(
("30.1" fun dired-click-to-select-mode)
("30.1" var dired-click-to-select-mode)
("29.1" fun plistp)
("29.1" fun help-key)
("28.1" fun always)

View file

@ -21,9 +21,22 @@
#include <errno.h>
#if defined __linux__ && HAVE_COPY_FILE_RANGE
# include <linux/version.h>
# include <sys/utsname.h>
/* Although it can be dicey to use static checks for Linux kernel versions,
due to the dubious practice of building on newer kernels for older ones,
do it here anyway as the buggy kernels are rare (they are all EOLed)
and builders for them are unlikely to use the dubious practice.
Circa 2029 we should remove the old-kernel workarounds entirely. */
# if LINUX_VERSION_CODE < KERNEL_VERSION (5, 3, 0)
# define CHECK_LINUX_KERNEL_VERSION true
# else
# define CHECK_LINUX_KERNEL_VERSION false
# endif
#endif
#include "sys-limits.h"
ssize_t
copy_file_range (int infd, off_t *pinoff,
int outfd, off_t *poutoff,
@ -31,32 +44,51 @@ copy_file_range (int infd, off_t *pinoff,
{
#undef copy_file_range
#if defined __linux__ && HAVE_COPY_FILE_RANGE
#if HAVE_COPY_FILE_RANGE
bool ok = true;
# if CHECK_LINUX_KERNEL_VERSION
/* The implementation of copy_file_range (which first appeared in
Linux kernel release 4.5) had many issues before release 5.3
<https://lwn.net/Articles/789527/>, so fail with ENOSYS for Linux
kernels 5.2 and earlier.
This workaround, and the configure-time check for Linux, can be
removed when such kernels (released March 2016 through September
2019) are no longer a consideration. As of January 2021, the
furthest-future planned kernel EOL is December 2024 for kernel
release 4.19. */
This workaround can be removed when such kernels (released March
2016 through September 2019) are no longer a consideration.
Although all such kernels have reached EOL, some distros use
older kernels. For example, RHEL 8 uses kernel 4.18 and has an
EOL of 2029. */
static signed char ok;
static signed char kernel_ok;
if (! kernel_ok)
{
struct utsname name;
uname (&name);
char *p = name.release;
kernel_ok = ((p[1] != '.' || '5' < p[0]
|| (p[0] == '5' && (p[3] != '.' || '2' < p[2])))
? 1 : -1);
}
if (! ok)
{
struct utsname name;
uname (&name);
char *p = name.release;
ok = ((p[1] != '.' || '5' < p[0]
|| (p[0] == '5' && (p[3] != '.' || '2' < p[2])))
? 1 : -1);
}
if (kernel_ok < 0)
ok = false;
# endif
if (ok)
{
# if defined __GLIBC__ && ! (2 < __GLIBC__ + (43 <= __GLIBC_MINOR__))
/* Work around glibc bug 33245
<https://sourceware.org/bugzilla/show_bug.cgi?id=33245>.
This bug is present in glibc 2.42 (2025) and fixed in 2.43,
so this workaround, and the configure-time check for glibc,
can be removed once glibc 2.42 and earlier is no longer a
consideration. Perhaps in 2040. */
if (SYS_BUFSIZE_MAX < length)
length = SYS_BUFSIZE_MAX;
# endif
if (0 < ok)
return copy_file_range (infd, pinoff, outfd, poutoff, length, flags);
}
#endif
/* There is little need to emulate copy_file_range with read+write,

View file

@ -1799,6 +1799,8 @@ ifneq (,$(GL_COND_OBJ_COPY_FILE_RANGE_CONDITION))
libgnu_a_SOURCES += copy-file-range.c
endif
EXTRA_DIST += sys-limits.h
endif
## end gnulib module copy-file-range

42
lib/sys-limits.h Normal file
View file

@ -0,0 +1,42 @@
/* System call limits
Copyright 2018-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#ifndef _GL_SYS_LIMITS_H
#define _GL_SYS_LIMITS_H
#include <limits.h>
/* Maximum number of bytes to read or write in a single system call.
This can be useful for system calls like sendfile on GNU/Linux,
which do not handle more than MAX_RW_COUNT bytes correctly.
The Linux kernel MAX_RW_COUNT is at least INT_MAX >> 20 << 20,
where the 20 comes from the Hexagon port with 1 MiB pages; use that
as an approximation, as the exact value may not be available to us.
Using this also works around a serious Linux bug before 2.6.16; see
<https://bugzilla.redhat.com/show_bug.cgi?id=612839>.
Using this also works around a Tru64 5.1 bug, where attempting
to read INT_MAX bytes fails with errno == EINVAL. See
<https://lists.gnu.org/r/bug-gnu-utils/2002-04/msg00010.html>.
Using this is likely to work around similar bugs in other operating
systems. */
enum { SYS_BUFSIZE_MAX = INT_MAX >> 20 << 20 };
#endif

View file

@ -212,7 +212,8 @@ autoloads-force:
$(MAKE) autoloads
ldefs-boot.el: autoloads-force
sed '/^;; Local Variables:/a ;; no-byte-compile: t'\
sed '/^;; Local Variables:/a\
;; no-byte-compile: t'\
< $(lisp)/loaddefs.el > $(lisp)/ldefs-boot.el
# This is required by the bootstrap-emacs target in ../src/Makefile, so

View file

@ -897,7 +897,7 @@ when parsing the archive."
"Toggle alternative display.
To avoid very long lines archive mode does not show all information.
This function changes the set of information shown for each files."
(interactive)
(interactive nil archive-mode)
(setq archive-alternate-display (not archive-alternate-display))
(setq-local archive-hidden-columns
(if archive-alternate-display
@ -913,7 +913,8 @@ This function changes the set of information shown for each files."
(list (intern
(completing-read "Toggle visibility of: "
'(Mode Ids Ratio Date&Time)
nil t))))
nil t)))
archive-mode)
(setq-local archive-hidden-columns
(if (memq column archive-hidden-columns)
(remove column archive-hidden-columns)
@ -1133,7 +1134,8 @@ NEW-NAME."
(or (archive-get-marked ?*) (list (archive-get-descr))))))
(list names
(read-file-name (format "Copy %s to: " (string-join names ", "))
nil default-directory))))
nil default-directory)))
archive-mode)
(unless (consp files)
(setq files (list files)))
(when (and (> (length files) 1)
@ -1171,7 +1173,7 @@ NEW-NAME."
(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))
(interactive (list nil last-input-event) archive-mode)
(if event (posn-set-point (event-end event)))
(let* ((view-p (eq other-window-p 'view))
(descr (archive-get-descr))
@ -1348,17 +1350,17 @@ NEW-NAME."
(defun archive-extract-other-window ()
"In archive mode, find this member in another window."
(interactive)
(interactive nil archive-mode)
(archive-extract t))
(defun archive-display-other-window ()
"In archive mode, display this member in another window."
(interactive)
(interactive nil archive-mode)
(archive-extract 'display))
(defun archive-view ()
"In archive mode, view the member on this line."
(interactive)
(interactive nil archive-mode)
(archive-extract 'view))
(defun archive-add-new-member (arcbuf name)
@ -1469,7 +1471,7 @@ NEW-NAME."
(defun archive-flag-deleted (p &optional type)
"In archive mode, mark this member to be deleted from the archive.
With a prefix argument, mark that many files."
(interactive "p")
(interactive "p" archive-mode)
(or type (setq type ?D))
(beginning-of-line)
(let ((sign (if (>= p 0) +1 -1))
@ -1488,18 +1490,18 @@ With a prefix argument, mark that many files."
(defun archive-unflag (p)
"In archive mode, un-mark this member if it is marked to be deleted.
With a prefix argument, un-mark that many files forward."
(interactive "p")
(interactive "p" archive-mode)
(archive-flag-deleted p ?\s))
(defun archive-unflag-backwards (p)
"In archive mode, un-mark this member if it is marked to be deleted.
With a prefix argument, un-mark that many members backward."
(interactive "p")
(interactive "p" archive-mode)
(archive-flag-deleted (- p) ?\s))
(defun archive-unmark-all-files ()
"Remove all marks."
(interactive)
(interactive nil archive-mode)
(let ((modified (buffer-modified-p))
(inhibit-read-only t))
(save-excursion
@ -1514,7 +1516,7 @@ With a prefix argument, un-mark that many members backward."
"In archive mode, mark this member for group operations.
With a prefix argument, mark that many members.
Use \\[archive-unmark-all-files] to remove all marks."
(interactive "p")
(interactive "p" archive-mode)
(archive-flag-deleted p ?*))
(defun archive-get-marked (mark &optional default)
@ -1532,20 +1534,20 @@ Use \\[archive-unmark-all-files] to remove all marks."
;;; Section: Operate
(defun archive-next-line (p)
(interactive "p")
(interactive "p" archive-mode)
(forward-line p)
(or (eobp)
(forward-char archive-file-name-indent)))
(defun archive-previous-line (p)
(interactive "p")
(interactive "p" archive-mode)
(archive-next-line (- p)))
(defun archive-chmod-entry (new-mode)
"Change the protection bits associated with all marked or this member.
The new protection bits can either be specified as an octal number or
as a relative change like \"g+rw\" as for chmod(2)."
(interactive "sNew mode (octal or symbolic): ")
(interactive "sNew mode (octal or symbolic): " archive-mode)
(if archive-read-only (error "Archive is read-only"))
(let ((func (archive-name "chmod-entry")))
(if (fboundp func)
@ -1556,7 +1558,7 @@ as a relative change like \"g+rw\" as for chmod(2)."
(defun archive-chown-entry (new-uid)
"Change the owner of all marked or this member."
(interactive "nNew uid: ")
(interactive "nNew uid: " archive-mode)
(if archive-read-only (error "Archive is read-only"))
(let ((func (archive-name "chown-entry")))
(if (fboundp func)
@ -1567,7 +1569,7 @@ as a relative change like \"g+rw\" as for chmod(2)."
(defun archive-chgrp-entry (new-gid)
"Change the group of all marked or this member."
(interactive "nNew gid: ")
(interactive "nNew gid: " archive-mode)
(if archive-read-only (error "Archive is read-only"))
(let ((func (archive-name "chgrp-entry")))
(if (fboundp func)
@ -1607,7 +1609,7 @@ as a relative change like \"g+rw\" as for chmod(2)."
(defun archive-expunge ()
"Do the flagged deletions."
(interactive)
(interactive nil archive-mode)
(archive--expunge-maybe-force nil))
(defun archive-*-expunge (archive files command)
@ -1616,7 +1618,7 @@ as a relative change like \"g+rw\" as for chmod(2)."
(defun archive-rename-entry (newname)
"Change the name associated with this entry in the archive file."
(interactive "sNew name: ")
(interactive "sNew name: " archive-mode)
(if archive-read-only (error "Archive is read-only"))
(if (string= newname "")
(error "Archive members may not be given empty names"))
@ -1644,7 +1646,7 @@ as a relative change like \"g+rw\" as for chmod(2)."
(defun archive-undo ()
"Undo in an archive buffer.
This doesn't recover lost files, it just undoes changes in the buffer itself."
(interactive)
(interactive nil archive-mode)
(let ((inhibit-read-only t))
(undo)))

View file

@ -323,8 +323,11 @@ The document was typeset with
"))
"A list specifying text to insert by default into a new file.
Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION).
CONDITION may be a regexp that must match the new file's name, or it may be
a symbol that must match the major mode for this element to apply.
CONDITION may be a regexp that must match the new file's name, or it
may be a symbol that must match the major mode for this element to apply.
CONDITION can also be a custom predicate of no arguments declared
with (predicate FUNCTION). Emacs will insert the text if the
predicate function returns non-nil.
Only the first matching element is effective.
Optional DESCRIPTION is a string for filling `auto-insert-prompt'.
ACTION may be a skeleton to insert (see `skeleton-insert'), an absolute
@ -368,12 +371,24 @@ Matches the visited file name against the elements of `auto-insert-alist'."
(pcase-lambda (`(,cond . ,action))
(if (atom cond)
(setq desc cond)
(setq desc (cdr cond)
cond (car cond)))
(when (if (symbolp cond)
(derived-mode-p cond)
;; if `cond' is a predicate, don't split it but set `desc' to a custom string
(if (and (consp cond) (equal (car cond) 'predicate))
(setq desc "predicate")
(setq desc (cdr cond)
cond (car cond))))
(when (cond
;; `cond' should be a major-mode variable
((symbolp cond)
(derived-mode-p cond))
;; `cond' should be a predicate that takes no argument
((and (consp cond) (equal (car cond) 'predicate))
(funcall (cadr cond)))
;; cond should be a regexp
(t
(and buffer-file-name
(string-match cond buffer-file-name)))
(string-match cond buffer-file-name))))
action))
auto-insert-alist)))
(goto-char 1)

View file

@ -329,6 +329,10 @@ seconds, in addition to using notification for those files."
;; Internal variables:
;;;###autoload
(defvar auto-revert-buffer-in-progress nil "\
Non-nil if a `auto-revert-buffer' operation is in progress, nil otherwise.")
(defvar auto-revert-buffer-list ()
"List of buffers in Auto-Revert Mode.
@ -834,16 +838,15 @@ This is an internal function used by Auto-Revert Mode."
t)))))
eob eoblist)
(when (timerp auto-revert--lockout-timer)
(cancel-timer auto-revert--lockout-timer))
(setq auto-revert-notify-modified-p nil
auto-revert--last-time
(if revert (current-time) auto-revert--last-time)
auto-revert--lockout-timer nil)
(cancel-timer auto-revert--lockout-timer)
(setq auto-revert--lockout-timer nil))
(when revert
(when (and auto-revert-verbose
(not (eq revert 'fast)))
(message "Reverting buffer `%s'" (buffer-name)))
(setq auto-revert-notify-modified-p nil
auto-revert--last-time (current-time))
;; If point (or a window point) is at the end of the buffer, we
;; want to keep it at the end after reverting. This allows one
;; to tail a file.
@ -872,7 +875,7 @@ This is an internal function used by Auto-Revert Mode."
;; `preserve-modes' avoids changing the (minor) modes. But we do
;; want to reset the mode for VC, so we do it manually.
(when (and (not auto-revert-tail-mode) (or revert auto-revert-check-vc-info))
(let ((revert-buffer-in-progress-p t))
(let ((revert-buffer-in-progress t))
(vc-refresh-state)))))
(defun auto-revert-tail-handler (size)
@ -933,25 +936,25 @@ buffers not reverted last time due to user interruption."
This is performed as specified by Auto-Revert and Global
Auto-Revert Modes."
(if (not (buffer-live-p buf))
(auto-revert-remove-current-buffer buf)
(with-current-buffer buf
;; Test if someone has turned off Auto-Revert Mode
;; in a non-standard way, for example by changing
;; major mode.
(when (and (not auto-revert-mode)
(not auto-revert-tail-mode))
(auto-revert-remove-current-buffer))
(when (auto-revert-active-p)
;; Enable file notification.
;; Don't bother creating a notifier for non-file buffers
;; unless it explicitly indicates that this works.
(when (and auto-revert-use-notify
(not auto-revert-notify-watch-descriptor)
(or buffer-file-name
buffer-auto-revert-by-notification))
(auto-revert-notify-add-watch))
(auto-revert-handler)))))
(let ((auto-revert-buffer-in-progress t))
(if (not (buffer-live-p buf))
(auto-revert-remove-current-buffer buf)
(with-current-buffer buf
;; Test if someone has turned off Auto-Revert Mode in a
;; non-standard way, for example by changing major mode.
(when (and (not auto-revert-mode)
(not auto-revert-tail-mode))
(auto-revert-remove-current-buffer))
(when (auto-revert-active-p)
;; Enable file notification.
;; Don't bother creating a notifier for non-file buffers
;; unless it explicitly indicates that this works.
(when (and auto-revert-use-notify
(not auto-revert-notify-watch-descriptor)
(or buffer-file-name
buffer-auto-revert-by-notification))
(auto-revert-notify-add-watch))
(auto-revert-handler))))))
(defun auto-revert-buffers ()
"Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode.

View file

@ -456,6 +456,12 @@ LEFT is the leftmost column associated with month segment N,
FIRST and LAST are the first and last columns with day digits in,
and LAST is the rightmost column.")
(defvar calendar-mark-holidays nil
"Variable version of the user option `calendar-mark-holidays-flag'.")
(defvar calendar-mark-diary-entries nil
"Variable version of the user option `calendar-mark-diary-entries-flag'.")
(defun calendar-month-edges (segment)
"Compute the month edge columns for month SEGMENT.
Returns a list (LEFT FIRST LAST RIGHT), where LEFT is the
@ -1161,17 +1167,20 @@ MON defaults to `displayed-month'. YR defaults to `displayed-year'."
First creates or erases BUFFER as needed. Leaves BUFFER read-only,
with disabled undo. Leaves point at `point-min', displays BUFFER."
(declare (indent 1) (debug t))
`(progn
(set-buffer (get-buffer-create ,buffer))
(or (derived-mode-p 'special-mode) (special-mode))
(setq buffer-read-only nil
buffer-undo-list t)
(erase-buffer)
(display-buffer ,buffer)
,@body
(goto-char (point-min))
(set-buffer-modified-p nil)
(setq buffer-read-only t)))
(let ((window (gensym)))
`(progn
(set-buffer (get-buffer-create ,buffer))
(or (derived-mode-p 'special-mode) (special-mode))
(setq buffer-read-only nil
buffer-undo-list t)
(erase-buffer)
(let ((,window (display-buffer ,buffer)))
(when ,window
(with-selected-window ,window
,@body
(goto-char (point-min)))))
(set-buffer-modified-p nil)
(setq buffer-read-only t))))
;; The following are in-line for speed; they can be called thousands of times
;; when looking up holidays or processing the diary. Here, for example, are
@ -1433,11 +1442,11 @@ Optional integers MON and YR are used instead of today's date."
;; For a full height window or a window that is horizontally
;; combined don't fit height to that of its buffer.
(set-window-vscroll nil 0)))
(and calendar-mark-holidays-flag
(and calendar-mark-holidays
;; (calendar-date-is-valid-p today) ; useful for BC dates
(calendar-mark-holidays))
(unwind-protect
(if calendar-mark-diary-entries-flag (diary-mark-entries))
(if calendar-mark-diary-entries (diary-mark-entries))
(run-hooks (if today-visible
'calendar-today-visible-hook
'calendar-today-invisible-hook)))))
@ -1830,6 +1839,9 @@ For a complete description, see the info node `Calendar/Diary'.
(make-local-variable 'calendar-mark-ring)
(make-local-variable 'displayed-month) ; month in middle of window
(make-local-variable 'displayed-year) ; year in middle of window
;; Init with user options.
(setq calendar-mark-holidays calendar-mark-holidays-flag
calendar-mark-diary-entries calendar-mark-diary-entries-flag)
;; Most functions only work if displayed-month and displayed-year are set,
;; so let's make sure they're always set. Most likely, this will be reset
;; soon in calendar-generate, but better safe than sorry.
@ -2428,8 +2440,8 @@ interpreted as BC; -1 being 1 BC, and so on."
(defun calendar-unmark ()
"Delete all diary/holiday marks/highlighting from the calendar."
(interactive)
(setq calendar-mark-holidays-flag nil
calendar-mark-diary-entries-flag nil)
(setq calendar-mark-holidays nil
calendar-mark-diary-entries nil)
(with-current-buffer calendar-buffer
(mapc #'delete-overlay (overlays-in (point-min) (point-max)))))

View file

@ -1395,8 +1395,8 @@ marks. This is intended to deal with deleted diary entries."
;; ii) called via calendar-redraw (since calendar has already been
;; erased).
;; Use of REDRAW handles both of these cases.
(when (and redraw calendar-mark-diary-entries-flag)
(setq calendar-mark-diary-entries-flag nil)
(when (and redraw calendar-mark-diary-entries)
(setq calendar-mark-diary-entries nil)
(calendar-redraw))
(let ((diary-marking-entries-flag t)
(diary-buffer (find-buffer-visiting diary-file))
@ -1417,7 +1417,7 @@ marks. This is intended to deal with deleted diary entries."
;; If including, caller has already verified it is readable.
(insert-file-contents diary-file)
(if (eq major-mode (default-value 'major-mode)) (diary-mode)))
(setq calendar-mark-diary-entries-flag t)
(setq calendar-mark-diary-entries t)
(setq file-glob-attrs (nth 1 (diary-pull-attrs nil '())))
(with-syntax-table diary-syntax-table
(save-excursion
@ -2243,7 +2243,7 @@ Prefix argument ARG makes the entry nonmarking."
(defun diary-redraw-calendar ()
"If `calendar-buffer' is live and diary entries are marked, redraw it."
(and calendar-mark-diary-entries-flag
(and calendar-mark-diary-entries
(save-excursion
(calendar-redraw)))
;; Return value suitable for `write-contents-functions'.

View file

@ -585,7 +585,7 @@ use instead of point."
(with-current-buffer
(if event (calendar-event-buffer event)
(current-buffer))
(setq calendar-mark-holidays-flag t)
(setq calendar-mark-holidays t)
(message "Marking holidays...")
(dolist (holiday (calendar-holiday-list))
(calendar-mark-visible-date (car holiday) calendar-holiday-marker))

View file

@ -416,7 +416,7 @@ in the next one.")
(setq scheme-prev-l/c-dir/file (cons (file-name-directory file-name)
(file-name-nondirectory file-name)))
(comint-send-string (scheme-proc) (concat "(load \""
file-name
(file-local-name file-name)
"\")\n")))
(defun scheme-compile-file (file-name)
@ -430,7 +430,7 @@ in the next one.")
(setq scheme-prev-l/c-dir/file (cons (file-name-directory file-name)
(file-name-nondirectory file-name)))
(comint-send-string (scheme-proc) (concat "(compile-file \""
file-name
(file-local-name file-name)
"\")\n")))

View file

@ -1197,7 +1197,7 @@ This function makes `comint-dynamic-list-input-ring' obsolete."
(ring-elements comint-input-ring)
(user-error "No history available")))
(completion-in-region-mode-predicate
(lambda () (get-buffer-window "*Completions*" 0))))
(lambda () (minibuffer--completions-visible))))
(completion-in-region
(comint-line-beginning-position) (point-max)
(completion-table-with-metadata
@ -3521,7 +3521,7 @@ The optional argument COMMON-SUBSTRING, if non-nil, should be a string
specifying a common substring for adding the faces
`completions-first-difference' and `completions-common-part' to
the completions."
(let ((window (get-buffer-window "*Completions*" 0)))
(let ((window (minibuffer--completions-visible)))
(setq completions (sort completions #'string-lessp))
(if (and (eq last-command this-command)
window (window-live-p window) (window-buffer window)

View file

@ -521,7 +521,9 @@ candidates or if there are multiple matching completions and
(run-hook-wrapped
'completion-at-point-functions
#'completion-preview--capf-wrapper)
(when-let* ((suffix (car suffixes)))
(when-let* ((suffix (car suffixes))
(inhibit-quit t))
;; Critical section, do not quit upon receiving input here.
(set-text-properties 0 (length suffix)
(list 'face (if (cdr suffixes)
'completion-preview

View file

@ -77,10 +77,10 @@
(const box) integer)
(const :tag "Hollow cursor" hollow)
(const :tag "Vertical bar" bar)
(cons :tag "Vertical bar with specified height"
(cons :tag "Vertical bar with specified width"
(const bar) integer)
(const :tag "Horizontal bar" hbar)
(cons :tag "Horizontal bar with specified width"
(cons :tag "Horizontal bar with specified height"
(const hbar) integer)
(const :tag "None "nil))))
(pcase-dolist

View file

@ -475,7 +475,9 @@ status message."
nil)))
(let ((omit-re (or regexp (dired-omit-regexp)))
(old-modified-p (buffer-modified-p))
(count (or init-count 0)))
(count (or init-count 0))
(dired-omit-verbose
(and dired-omit-verbose (not auto-revert-buffer-in-progress))))
(unless (string= omit-re "")
(let ((dired-marker-char dired-omit-marker-char))
(when dired-omit-verbose (message "Omitting..."))

View file

@ -4057,7 +4057,10 @@ non-empty directories is allowed."
(message "(No deletions requested)")))))
(defun dired-post-do-command ()
"Disable `dired-click-to-select-mode' after an operation."
"Disable `dired-click-to-select-mode' if enabled..
This is called after Dired finishes an operation on marked files, and it
disables `dired-click-to-select-mode' that is automatically enabled
by the \"hold\" touch-screen gestures."
(when dired-click-to-select-mode
(dired-click-to-select-mode -1)))
@ -5381,12 +5384,14 @@ When this minor mode is enabled, using `mouse-2' on a file name
within a Dired buffer will toggle its mark instead of going to it
within another window.
Disabling this minor mode will unmark all files within the Dired
buffer.
`dired-click-to-select-mode' is automatically disabled after any
Dired operation (command whose name starts with `dired-do')
completes."
This minor mode is intended to be used when performing file management
using a touch-screen device. The mode is automatically enabled when a
\"hold\" gesture over a file name is received, and is therefore
automatically disabled after any Dired operation on the marked
files (any command whose name starts with \"dired-do-\" and which
performs some operation on the marked files) completes. When the mode
is automatically disabled, it unmarks all the marked files in the Dired
buffer."
:group 'dired
:lighter " Click-To-Select"
(unless (derived-mode-p '(dired-mode wdired-mode))

View file

@ -2143,7 +2143,11 @@ If FILE-NAME is nil, use the current file instead."
(defun doc-view-initiate-display ()
;; Switch to image display if possible.
(if (doc-view-mode-p doc-view-doc-type)
(progn
;; Inhibit the echo area display of the "Type C-c C-c..." message
;; if the doc-view buffer is not shown in the selected window
;; which can happen due to auto-reverting the buffer (bug#79145).
(let ((inhibit-message (not (eq (current-buffer)
(window-buffer)))))
(doc-view-buffer-message)
(setf (doc-view-current-page) (or (doc-view-current-page) 1))
(if (doc-view-already-converted-p)

View file

@ -286,6 +286,12 @@ This is used by `declare'.")
(list 'put (list 'quote name)
''edebug-form-spec (list 'quote spec)))))
(defalias 'byte-run--set-autoload-macro
#'(lambda (name _args spec)
(list 'function-put (list 'quote name)
''autoload-macro (list 'quote spec)))
"Handle autoload-macro declarations")
(defalias 'byte-run--set-no-font-lock-keyword
#'(lambda (name _args val)
(list 'function-put (list 'quote name)
@ -365,8 +371,13 @@ This is used by `declare'.")
(cons
(list 'debug #'byte-run--set-debug)
(cons
(list 'no-font-lock-keyword #'byte-run--set-no-font-lock-keyword)
defun-declarations-alist))
;; macros can declare (autoload-macro expand) to request expansion
;; during autoload generation of forms calling them. See
;; `loaddefs-generate--make-autoload'.
(list 'autoload-macro #'byte-run--set-autoload-macro)
(cons
(list 'no-font-lock-keyword #'byte-run--set-no-font-lock-keyword)
defun-declarations-alist)))
"List associating properties of macros to their macro expansion.
Each element of the list takes the form (PROP FUN) where FUN is a function.
For each (PROP . VALUES) in a macro's declaration, the FUN corresponding
@ -412,6 +423,8 @@ The return value is undefined.
(if declarations
(cons 'prog1 (cons def (car declarations)))
def))))))
;; Expand to defalias and related forms on autoload gen
(function-put 'defmacro 'autoload-macro 'expand) ; Since we cannot `declare' it
;; Now that we defined defmacro we can use it!
(defmacro defun (name arglist &rest body)
@ -424,7 +437,9 @@ INTERACTIVE is an optional `interactive' specification.
The return value is undefined.
\(fn NAME ARGLIST [DOCSTRING] [DECL] [INTERACTIVE] BODY...)"
(declare (doc-string 3) (indent 2))
(declare (doc-string 3) (indent 2)
;; Expand to defalias on autoload gen
(autoload-macro expand))
(or name (error "Cannot define '%s' as a function" name))
(if (null
(and (listp arglist)

View file

@ -3592,6 +3592,7 @@ This assumes the function has the `important-return-value' property."
(cl-nset-exclusive-or 1 2)
(cl-nreconc 1)
(cl-sort 1) (cl-stable-sort 1) (cl-merge 2 3)
(cl-fill 1) (cl-replace 1)
)))
(dolist (entry mutating-fns)
(put (car entry) 'mutates-arguments (cdr entry))))

View file

@ -230,9 +230,11 @@ SPECIALIZERS-FUNCTION takes as first argument a tag value TAG
(defmacro cl-defgeneric (name args &rest options-and-methods)
"Create a generic function NAME.
DOC-STRING is the base documentation for this class. A generic
function has no body, as its purpose is to decide which method body
is appropriate to use. Specific methods are defined with `cl-defmethod'.
With this implementation the ARGS are currently ignored.
function usually has no body, as its purpose is to decide which
method body is appropriate to use; ARGS are currently ignored if
there's no body. If BODY is present, it provides the default
implementation.
Specific implementation methods are defined with `cl-defmethod'.
OPTIONS-AND-METHODS currently understands:
- (:documentation DOCSTRING)
- (declare DECLARATIONS)
@ -258,7 +260,9 @@ DEFAULT-BODY, if present, is used as the body of a default method.
cl--generic-edebug-make-name in:method]
lambda-doc
def-body)]]
def-body)))
def-body))
;; Expand to defun and related forms on autoload definition
(autoload-macro expand))
(let* ((doc (if (stringp (car-safe options-and-methods))
(pop options-and-methods)))
(declarations nil)

View file

@ -396,7 +396,9 @@ more details.
[&optional ("interactive" interactive)]
def-body))
(doc-string 3)
(indent 2))
(indent 2)
;; expand to function definition on autoload gen
(autoload-macro expand))
`(defun ,name ,@(cl--transform-lambda (cons args body) name)))
;;;###autoload
@ -414,7 +416,9 @@ and BODY is implicitly surrounded by (cl-block NAME ...).
[&optional ("interactive" interactive)]
def-body))
(doc-string 3)
(indent 2))
(indent 2)
;; expand (eventually) to function definition on autoload gen
(autoload-macro expand))
(require 'generator)
`(iter-defun ,name ,@(cl--transform-lambda (cons args body) name)))
@ -473,7 +477,8 @@ more details.
(declare (debug
(&define name cl-macro-list cl-declarations-or-string def-body))
(doc-string 3)
(indent 2))
(indent 2)
(autoload-macro expand)) ; expand to defmacro on autoload gen
`(defmacro ,name ,@(cl--transform-lambda (cons args body) name)))
(def-edebug-elem-spec 'cl-lambda-expr
@ -3087,7 +3092,9 @@ To see the documentation for a defined struct type, use
sexp])]
[&optional stringp]
;; All the above is for the following def-form.
&rest &or symbolp (symbolp &optional def-form &rest sexp))))
&rest &or symbolp (symbolp &optional def-form &rest sexp)))
;; expand to function definitions and related forms on autoload gen
(autoload-macro expand))
(let* ((name (if (consp struct) (car struct) struct))
(warning nil)
(opts (cdr-safe struct))

View file

@ -259,6 +259,7 @@ with empty strings removed."
(list minibuffer-visible-completions-map
map))
map))
(buffer (current-buffer))
input)
(minibuffer-with-setup-hook
(lambda ()
@ -282,6 +283,8 @@ with empty strings removed."
;; see completing_read in src/minibuf.c
(setq-local minibuffer-completion-confirm
(unless (eq require-match t) require-match))
(setq-local minibuffer--require-match require-match)
(setq-local minibuffer--original-buffer buffer)
(setq-local crm-completion-table table))
(setq input (read-from-minibuffer
(format-spec

View file

@ -222,10 +222,12 @@ INIT-VALUE LIGHTER KEYMAP.
(indent defun)
(debug (&define name string-or-null-p
[&optional [&not keywordp] sexp
&optional [&not keywordp] sexp
&optional [&not keywordp] sexp]
&optional [&not keywordp] sexp
&optional [&not keywordp] sexp]
[&rest [keywordp sexp]]
def-body)))
def-body))
;; expand to the command definition on autoload gen
(autoload-macro expand))
(let* ((last-message (make-symbol "last-message"))
(mode-name (symbol-name mode))
@ -488,7 +490,9 @@ after running the major mode's hook. However, MODE is not turned
on if the hook has explicitly disabled it.
\(fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)"
(declare (doc-string 2) (indent defun))
(declare (doc-string 2) (indent defun)
;; expand to the minor-mode definition on autoload gen
(autoload-macro expand))
(let* ((global-mode-name (symbol-name global-mode))
(mode-name (symbol-name mode))
(pretty-name (easy-mmode-pretty-mode-name mode))
@ -499,8 +503,8 @@ on if the hook has explicitly disabled it.
(MODE-enable-in-buffer
(intern (concat global-mode-name "-enable-in-buffer")))
(minor-MODE-hook (intern (concat mode-name "-hook")))
(MODE-set-explicitly (intern (concat mode-name "-set-explicitly")))
(MODE-major-mode (intern (concat (symbol-name mode) "-major-mode")))
(MODE-set-explicitly (intern (concat mode-name "--set-explicitly")))
(MODE-major-mode (intern (concat global-mode-name "--major-mode")))
(MODE-predicate (intern (concat (replace-regexp-in-string
"-mode\\'" "" global-mode-name)
"-modes")))

View file

@ -593,7 +593,7 @@ OBJECT can be an instance or a class."
(defun find-class (symbol &optional errorp)
"Return the class that SYMBOL represents.
If there is no class, nil is returned if ERRORP is nil.
If ERRORP is non-nil, `wrong-argument-type' is signaled."
If ERRORP is non-nil, `wrong-type-argument' is signaled."
(let ((class (cl--find-class symbol)))
(cond
((eieio--class-p class) class)

View file

@ -813,7 +813,7 @@ This mainly sets up debugger-related bindings."
(letrec ((debugfun (lambda (err)
(ert--run-test-debugger test-execution-info
err debugfun))))
(handler-bind (((error quit) debugfun))
(handler-bind ((t debugfun))
(funcall (ert-test-body (ert--test-execution-info-test
test-execution-info))))))))
(ert-pass))

View file

@ -675,7 +675,8 @@ encapsulates the state of a computation that produces a sequence
of values. Callers can retrieve each value using `iter-next'."
(declare (indent defun)
(debug (&define name lambda-list lambda-doc &rest sexp))
(doc-string 3))
(doc-string 3)
(autoload-macro expand)) ; expand to the defun on autoload gen
(cl-assert lexical-binding)
(let* ((parsed-body (macroexp-parse-body body))
(declarations (car parsed-body))

View file

@ -135,7 +135,8 @@ After VARS is handled, BODY is evaluated in the new environment."
This is like `defmacro', but has several advantages.
See Info node `(elisp)Defining Functions' for more details."
;; FIXME: How can this work with CL arglists?
(declare (indent defun) (debug defun) (doc-string 3))
(declare (indent defun) (debug defun) (doc-string 3)
(autoload-macro expand)) ; expand to the defun on autoload gen
(let ((doc (if (stringp (car-safe body)) (list (pop body))))
(declares (if (eq (car-safe (car-safe body)) 'declare) (pop body)))
(cm-name (intern (format "%s--inliner" name)))

View file

@ -143,12 +143,37 @@ scanning for autoloads and will be in the `load-path'."
3)
form))
;; The following macros are known to define functions, and are treated
;; specially when encountered during autoload generation, translating
;; calls to them directly into appropriate (autoload function ...)
;; forms.
;;
;; An alternative to appearing on this list is for a macro to declare
;; (autoload-macro expand), so calls to it get expanded into more basic
;; forms during generation. Macros may be removed from this list once
;; they request such expansion and produce suitable output (e.g. by
;; employing :autoload-end to omit unneeded forms).
(defconst loaddefs--defining-macros
'( define-skeleton define-derived-mode define-compilation-mode
define-generic-mode define-globalized-minor-mode define-minor-mode
cl-defun defun* cl-defmacro defmacro* define-overloadable-function
transient-define-prefix transient-define-suffix transient-define-infix
transient-define-argument transient-define-group
;; Obsolete; keep until the alias is removed.
easy-mmode-define-global-mode
easy-mmode-define-minor-mode
define-global-minor-mode))
(defvar loaddefs--load-error-files nil)
(defun loaddefs-generate--make-autoload (form file &optional expansion)
"Turn FORM into an autoload or defvar for source file FILE.
Returns nil if FORM is not a special autoload form (i.e. a function definition
or macro definition or a defcustom).
If EXPANSION is non-nil, we're processing the macro expansion of an
expression, in which case we want to handle forms differently."
expression, in which case we want to handle forms differently.
Note that macros can request expansion by including `(autoload-macro
expand)' among their `declare' forms."
(let ((car (car-safe form)) expand)
(cond
((and expansion (eq car 'defalias))
@ -192,42 +217,58 @@ expression, in which case we want to handle forms differently."
(setq form (copy-sequence form))
(setcdr (memq :autoload-end form) nil))
(let ((exps (delq nil (mapcar (lambda (form)
(loaddefs-generate--make-autoload
form file expansion))
(unless (eq form :autoload-end)
(loaddefs-generate--make-autoload
form file expansion)))
(cdr form)))))
(when exps (cons 'progn exps)))))
;; For complex cases, try again on the macro-expansion.
((and (memq car '( define-globalized-minor-mode defun defmacro
define-minor-mode define-inline
cl-defun cl-defmacro cl-defgeneric
cl-defstruct pcase-defmacro iter-defun cl-iter-defun
;; Obsolete; keep until the alias is removed.
easy-mmode-define-global-mode
easy-mmode-define-minor-mode
define-global-minor-mode))
(macrop car)
(setq expand (let ((load-true-file-name file)
(load-file-name file))
(macroexpand form)))
(memq (car expand) '(progn prog1 defalias)))
;; For macros which request it, try again on their expansion.
((progn
;; If the car is an unknown symbol, we load the file first to
;; give packages a chance to define their macros.
(unless (or (not (symbolp car)) (fboundp car)
;; Special cases handled below
(memq car loaddefs--defining-macros)
(memq car '(defclass defcustom deftheme defgroup nil))
(assoc file load-history)
(member file loaddefs--load-error-files))
(let ((load-path (cons (file-name-directory file) load-path)))
(message "loaddefs-gen: loading file %s (for %s)" file car)
(condition-case e (load file)
(error
(push file loaddefs--load-error-files) ; do not attempt again
(warn "loaddefs-gen: load error\n\t%s" e)))))
(and (macrop car)
(eq 'expand (function-get car 'autoload-macro))
(setq expand (let ((load-true-file-name file)
(load-file-name file))
(macroexpand form)))
(or (and
;; Previously, macros defined in this list would not
;; see their expansions processed in place of
;; themselves if such an expansion did not yield a
;; `progn', `prog1' or `defalias' form. Not
;; reproducing these conditions results in the
;; omission of minor mode variables and suchlike in
;; loaddefs.el when only the defuns in the
;; macroexpansions are autoloaded.
(not (memq car '( define-globalized-minor-mode defun defmacro
define-minor-mode define-inline
cl-defun cl-defmacro cl-defgeneric
cl-defstruct pcase-defmacro iter-defun cl-iter-defun
;; Obsolete; keep until the alias is removed.
easy-mmode-define-global-mode
easy-mmode-define-minor-mode
define-global-minor-mode)))
(not (eq car (car expand))))
(memq (car expand) '(progn prog1 defalias)))))
;; Recurse on the expansion.
(loaddefs-generate--make-autoload expand file 'expansion))
;; For special function-like operators, use the `autoload' function.
((memq car '( define-skeleton define-derived-mode
define-compilation-mode define-generic-mode
define-globalized-minor-mode
define-minor-mode
cl-defun defun* cl-defmacro defmacro*
define-overloadable-function
transient-define-prefix transient-define-suffix
transient-define-infix transient-define-argument
transient-define-group
;; Obsolete; keep until the alias is removed.
easy-mmode-define-global-mode
easy-mmode-define-minor-mode
define-global-minor-mode))
;; For known special macros which define functions, use `autoload'
;; directly.
((memq car loaddefs--defining-macros)
(let* ((macrop (memq car '(defmacro cl-defmacro defmacro*)))
(name (nth 1 form))
(args (pcase car
@ -268,8 +309,8 @@ expression, in which case we want to handle forms differently."
t)
(and (eq (car-safe (car body)) 'interactive)
;; List of modes or just t.
(or (if (nthcdr 1 (car body))
(list 'quote (nthcdr 1 (car body)))
(or (if (nthcdr 2 (car body))
(list 'quote (nthcdr 2 (car body)))
t))))
,(if macrop ''macro nil)))))

View file

@ -350,7 +350,8 @@ The default implementation delegates to `map-apply'."
(cl-defgeneric map-filter (pred map)
"Return an alist of key/val pairs for which (PRED key val) is non-nil in MAP.
The default implementation delegates to `map-apply'."
The default implementation delegates to `map-apply'.
This does not modify MAP."
(delq nil (map-apply (lambda (key val)
(and (funcall pred key val)
(cons key val)))
@ -358,7 +359,8 @@ The default implementation delegates to `map-apply'."
(cl-defgeneric map-remove (pred map)
"Return an alist of the key/val pairs for which (PRED key val) is nil in MAP.
The default implementation delegates to `map-filter'."
The default implementation delegates to `map-filter'.
This does not modify MAP."
(map-filter (lambda (key val) (not (funcall pred key val)))
map))
@ -457,7 +459,8 @@ MAP may be of a type other than TYPE."
(defun map-merge (type &rest maps)
"Merge into a map of TYPE all the key/value pairs in MAPS.
See `map-into' for all supported values of TYPE."
See `map-into' for all supported values of TYPE.
This does not modify any of the MAPS."
(apply #'map--merge
(lambda (result key value)
(setf (map-elt result key) value)
@ -469,7 +472,8 @@ See `map-into' for all supported values of TYPE."
When two maps contain the same key, call FUNCTION on the two
values and use the value FUNCTION returns.
Each of MAPS can be an alist, plist, hash-table, or array.
See `map-into' for all supported values of TYPE."
See `map-into' for all supported values of TYPE.
This does not modify any of the MAPS."
(let ((not-found (list nil)))
(apply #'map--merge
(lambda (result key value)

View file

@ -995,18 +995,22 @@ Newer versions are always activated, regardless of FORCE."
This uses `tar-untar-buffer' from Tar mode. All files should
untar into a directory named DIR; otherwise, signal an error."
(tar-mode)
;; Make sure everything extracts into DIR.
(let ((regexp (concat "\\`" (regexp-quote (expand-file-name dir)) "/"))
(case-fold-search (file-name-case-insensitive-p dir)))
(dolist (tar-data tar-parse-info)
(let ((name (expand-file-name (tar-header-name tar-data))))
(or (string-match regexp name)
;; Tarballs created by some utilities don't list
;; directories with a trailing slash (Bug#13136).
(and (string-equal (expand-file-name dir) name)
(eq (tar-header-link-type tar-data) 5))
(error "Package does not untar cleanly into directory %s/" dir)))))
(tar-untar-buffer))
(unwind-protect
(progn
;; Make sure everything extracts into DIR.
(let ((regexp (concat "\\`" (regexp-quote (expand-file-name dir)) "/"))
(case-fold-search (file-name-case-insensitive-p dir)))
(dolist (tar-data tar-parse-info)
(let ((name (expand-file-name (tar-header-name tar-data))))
(or (string-match regexp name)
;; Tarballs created by some utilities don't list
;; directories with a trailing slash (Bug#13136).
(and (string-equal (expand-file-name dir) name)
(eq (tar-header-link-type tar-data) 5))
(error "Package does not untar cleanly into directory %s/"
dir)))))
(tar-untar-buffer))
(fundamental-mode))) ; free auxiliary tar-mode data
(defun package--alist-to-plist-args (alist)
(mapcar #'macroexp-quote
@ -2455,7 +2459,9 @@ directory."
(set-visited-file-name file)
(set-buffer-modified-p nil)
(when (string-match "\\.tar\\'" file) (tar-mode)))
(package-install-from-buffer)))
(unwind-protect
(package-install-from-buffer)
(fundamental-mode)))) ; free auxiliary data
;;;###autoload
(defun package-install-selected-packages (&optional noconfirm)

View file

@ -544,7 +544,9 @@ to this macro.
By convention, DOC should use \"EXPVAL\" to stand
for the result of evaluating EXP (first arg to `pcase').
\n(fn NAME ARGS [DOC] &rest BODY...)"
(declare (indent 2) (debug defun) (doc-string 3))
(declare (indent 2) (debug defun) (doc-string 3)
;; Expand to defun and related forms on autoload gen
(autoload-macro expand))
;; Add the function via `fsym', so that an autoload cookie placed
;; on a pcase-defmacro will cause the macro to be loaded on demand.
(let ((fsym (intern (format "%s--pcase-macroexpander" name)))

View file

@ -274,7 +274,8 @@ Value is a sequence of the same type as SEQUENCE."
(cl-defgeneric seq-sort (pred sequence)
"Sort SEQUENCE using PRED as the sorting comparison function.
The result is a sequence of the same type as SEQUENCE."
The result is a sequence of the same type as SEQUENCE. The sort
operates on a copy of SEQUENCE and does not modify SEQUENCE."
(let ((result (seq-sort pred (append sequence nil))))
(seq-into result (type-of sequence))))
@ -285,7 +286,8 @@ The result is a sequence of the same type as SEQUENCE."
(defun seq-sort-by (function pred sequence)
"Sort SEQUENCE transformed by FUNCTION using PRED as the comparison function.
Elements of SEQUENCE are transformed by FUNCTION before being
sorted. FUNCTION must be a function of one argument."
sorted. FUNCTION must be a function of one argument. The sort
operates on a copy of SEQUENCE and does not modify SEQUENCE."
(seq-sort (lambda (a b)
(funcall pred
(funcall function a)
@ -293,7 +295,8 @@ sorted. FUNCTION must be a function of one argument."
sequence))
(cl-defgeneric seq-reverse (sequence)
"Return a sequence with elements of SEQUENCE in reverse order."
"Return a sequence with elements of SEQUENCE in reverse order.
This does not modify SEQUENCE."
(let ((result '()))
(seq-map (lambda (elt)
(push elt result))
@ -307,6 +310,7 @@ sorted. FUNCTION must be a function of one argument."
(cl-defgeneric seq-concatenate (type &rest sequences)
"Concatenate SEQUENCES into a single sequence of type TYPE.
TYPE must be one of following symbols: `vector', `string' or `list'.
This does not modify any of the SEQUENCES.
\n(fn TYPE SEQUENCE...)"
(setq sequences (mapcar #'seq-into-sequence sequences))
@ -321,7 +325,9 @@ TYPE must be one of following symbols: `vector', `string' or `list'.
The default implementation is to signal an error if SEQUENCE is not a
sequence, specific functions should be implemented for new types
of sequence."
of sequence.
This does not modify SEQUENCE."
(unless (sequencep sequence)
(error "Cannot convert %S into a sequence" sequence))
sequence)
@ -329,7 +335,7 @@ of sequence."
(cl-defgeneric seq-into (sequence type)
"Concatenate the elements of SEQUENCE into a sequence of type TYPE.
TYPE can be one of the following symbols: `vector', `string' or
`list'."
`list'. This does not modify SEQUENCE."
(pcase type
(`vector (seq--into-vector sequence))
(`string (seq--into-string sequence))
@ -338,7 +344,8 @@ TYPE can be one of the following symbols: `vector', `string' or
;;;###autoload
(cl-defgeneric seq-filter (pred sequence)
"Return a list of all the elements in SEQUENCE for which PRED returns non-nil."
"Return a list of all the elements in SEQUENCE for which PRED returns non-nil.
This does not modify SEQUENCE."
(let ((exclude (make-symbol "exclude")))
(delq exclude (seq-map (lambda (elt)
(if (funcall pred elt)
@ -348,7 +355,8 @@ TYPE can be one of the following symbols: `vector', `string' or
;;;###autoload
(cl-defgeneric seq-remove (pred sequence)
"Return a list of all the elements in SEQUENCE for which PRED returns nil."
"Return a list of all the elements in SEQUENCE for which PRED returns nil.
This does not modify SEQUENCE."
(seq-filter (lambda (elt) (not (funcall pred elt)))
sequence))
@ -359,7 +367,8 @@ TYPE can be one of the following symbols: `vector', `string' or
N is the (zero-based) index of the element that should not be in
the result.
The result is a sequence of the same type as SEQUENCE."
The result is a sequence of the same type as SEQUENCE.
This does not modify SEQUENCE."
(seq-concatenate
(if (listp sequence) 'list (type-of sequence))
(seq-subseq sequence 0 n)
@ -376,7 +385,9 @@ third element of SEQUENCE, etc. FUNCTION will be called with
INITIAL-VALUE (and then the accumulated value) as the first
argument, and the elements from SEQUENCE as the second argument.
If SEQUENCE is empty, return INITIAL-VALUE and FUNCTION is not called."
If SEQUENCE is empty, return INITIAL-VALUE and FUNCTION is not called.
This does not modify SEQUENCE."
(if (seq-empty-p sequence)
initial-value
(let ((acc initial-value))
@ -411,7 +422,9 @@ If no such element is found, return DEFAULT.
Note that `seq-find' has an ambiguity if the found element is
identical to DEFAULT, as in that case it is impossible to know
whether an element was found or not."
whether an element was found or not.
This does not modify SEQUENCE."
(catch 'seq--break
(seq-doseq (elt sequence)
(when (funcall pred elt)
@ -485,7 +498,8 @@ The result is a list of (zero-based) indices."
;;;###autoload
(cl-defgeneric seq-uniq (sequence &optional testfn)
"Return a list of the elements of SEQUENCE with duplicates removed.
TESTFN is used to compare elements, and defaults to `equal'."
TESTFN is used to compare elements, and defaults to `equal'.
This does not modify SEQUENCE."
(let ((result '()))
(seq-doseq (elt sequence)
(unless (seq-contains-p result elt testfn)
@ -521,14 +535,16 @@ TESTFN is used to compare elements, and defaults to `equal'."
(cl-defgeneric seq-mapcat (function sequence &optional type)
"Concatenate the results of applying FUNCTION to each element of SEQUENCE.
The result is a sequence of type TYPE; TYPE defaults to `list'."
The result is a sequence of type TYPE; TYPE defaults to `list'.
This does not modify SEQUENCE."
(apply #'seq-concatenate (or type 'list)
(seq-map function sequence)))
(cl-defgeneric seq-partition (sequence n)
"Return list of elements of SEQUENCE grouped into sub-sequences of length N.
The last sequence may contain less than N elements. If N is a
negative integer or 0, the function returns nil."
negative integer or 0, the function returns nil.
This does not modify SEQUENCE."
(unless (< n 1)
(let ((result '()))
(while (not (seq-empty-p sequence))
@ -540,7 +556,8 @@ negative integer or 0, the function returns nil."
(cl-defgeneric seq-union (sequence1 sequence2 &optional testfn)
"Return a list of all the elements that appear in either SEQUENCE1 or SEQUENCE2.
\"Equality\" of elements is defined by the function TESTFN, which
defaults to `equal'."
defaults to `equal'.
This does not modify SEQUENCE1 or SEQUENCE2."
(let* ((accum (lambda (acc elt)
(if (seq-contains-p acc elt testfn)
acc
@ -553,7 +570,8 @@ defaults to `equal'."
(cl-defgeneric seq-intersection (sequence1 sequence2 &optional testfn)
"Return a list of all the elements that appear in both SEQUENCE1 and SEQUENCE2.
\"Equality\" of elements is defined by the function TESTFN, which
defaults to `equal'."
defaults to `equal'.
This does not modify SEQUENCE1 or SEQUENCE2."
(seq-reduce (lambda (acc elt)
(if (seq-contains-p sequence2 elt testfn)
(cons elt acc)
@ -564,7 +582,8 @@ defaults to `equal'."
(cl-defgeneric seq-difference (sequence1 sequence2 &optional testfn)
"Return list of all the elements that appear in SEQUENCE1 but not in SEQUENCE2.
\"Equality\" of elements is defined by the function TESTFN, which
defaults to `equal'."
defaults to `equal'.
This does not modify SEQUENCE1 or SEQUENCE2."
(seq-reduce (lambda (acc elt)
(if (seq-contains-p sequence2 elt testfn)
acc
@ -576,7 +595,7 @@ defaults to `equal'."
(cl-defgeneric seq-group-by (function sequence)
"Apply FUNCTION to each element of SEQUENCE.
Separate the elements of SEQUENCE into an alist using the results as
keys. Keys are compared using `equal'."
keys. Keys are compared using `equal'. This does not modify SEQUENCE."
(seq-reduce
(lambda (acc elt)
(let* ((key (funcall function elt))
@ -692,7 +711,7 @@ Signal an error if SEQUENCE is empty."
(defun seq-split (sequence length)
"Split SEQUENCE into a list of sub-sequences of at most LENGTH elements.
All the sub-sequences will be LENGTH long, except the last one,
which may be shorter."
which may be shorter. This does not modify SEQUENCE."
(when (< length 1)
(error "Sub-sequence length must be larger than zero"))
(let ((result nil)
@ -705,7 +724,8 @@ which may be shorter."
(nreverse result)))
(defun seq-keep (function sequence)
"Apply FUNCTION to SEQUENCE and return the list of all the non-nil results."
"Apply FUNCTION to SEQUENCE and return the list of all the non-nil results.
This does not modify SEQUENCE."
(delq nil (seq-map function sequence)))
(provide 'seq)

View file

@ -1131,6 +1131,9 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
:eval (seq-map-indexed (lambda (a i) (cons i a)) '(a b c)))
(seq-mapcat
:eval (seq-mapcat #'upcase '("a" "b" "c") 'string))
(seq-doseq
:no-eval (seq-doseq (a '("foo" "bar")) (insert a))
:eg-result ("foo" "bar"))
(seq-do
:no-eval (seq-do (lambda (a) (insert a)) '("foo" "bar"))
:eg-result ("foo" "bar"))

View file

@ -142,13 +142,14 @@ arguments and must return a list of the above form.")
(defvar-local tabulated-list-groups nil
"Groups displayed in the current Tabulated List buffer.
This should be either a function, or a list.
If a list, each element has the form (GROUP-NAME ENTRIES),
If a list, each element has the form (GROUP-NAME ENTRY1 ENTRY2 ...),
where:
- GROUP-NAME is a group name as a string, which is displayed
at the top line of each group.
- ENTRIES is a list described in `tabulated-list-entries'.
- ENTRY1, ENTRY2 and so on each have the same format as an element
of `tabulated-list-entries'.
If `tabulated-list-groups' is a function, it is called with no
arguments and must return a list of the above form.")

View file

@ -356,7 +356,7 @@ This function is called, by name, directly by the C code."
(defun run-at-time (time repeat function &rest args)
"Perform an action at time TIME.
Repeat the action every REPEAT seconds, if REPEAT is non-nil.
REPEAT may be an integer or floating point number.
REPEAT may be a non-negative integer or floating point number.
TIME should be one of:
- a string giving today's time like \"11:23pm\"
@ -386,10 +386,10 @@ This function returns a timer object which you can use in
`cancel-timer'."
(interactive "sRun at time: \nNRepeat interval: \naFunction: ")
(when (and repeat
(numberp repeat)
(< repeat 0))
(error "Invalid repetition interval"))
(unless (or (null repeat)
(and (numberp repeat)
(>= repeat 0)))
(error "Invalid repetition interval: %s" repeat))
(let ((timer (timer-create)))
;; Special case: nil means "now" and is useful when repeating.
@ -433,6 +433,7 @@ This function returns a timer object which you can use in
"Perform an action after a delay of SECS seconds.
Repeat the action every REPEAT seconds, if REPEAT is non-nil.
SECS and REPEAT may be integers or floating point numbers.
REPEAT, if non-nil, must be a non-negative number.
The action is to call FUNCTION with arguments ARGS.
This function returns a timer object which you can use in `cancel-timer'."

View file

@ -5,6 +5,7 @@
;; Version: 0.1
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; Maintainer: João Távora <joaotavora@gmail.com>
;; Package-Requires: ((emacs "26.1"))
;; Keywords:
;; This is a GNU ELPA :core package. Avoid functionality that is not
@ -117,10 +118,11 @@ EXPANDED-PATTERN."
completion-category-defaults)))
(let ((cache (make-hash-table :test #'equal)))
(cl-flet ((lookup-internal (string point)
(let ((key (cons string point)))
(if (hash-table-contains-p key cache)
(gethash key cache)
(puthash key (funcall lookup string point) cache)))))
(let* ((key (cons string point))
(probe (gethash key cache 'external--notfound)))
(if (eq probe 'external--notfound)
(puthash key (funcall lookup string point) cache)
probe))))
(lambda (string pred action)
(pcase action
(`metadata

View file

@ -500,7 +500,8 @@ DESCRIPTOR should be an object returned by `file-notify-add-watch'."
(maphash
(lambda (key _value)
(file-notify-rm-watch key))
file-notify-descriptors))
file-notify-descriptors)
(setq file-notify-descriptors (clrhash file-notify-descriptors)))
(defun file-notify-valid-p (descriptor)
"Check a watch specified by its DESCRIPTOR.

View file

@ -2532,7 +2532,9 @@ be visible in the echo area."
If a buffer exists visiting FILENAME, return that one, but
verify that the file has not changed since visited or saved.
The buffer is not selected, just returned to the caller.
Optional second arg NOWARN non-nil means suppress any warning messages.
Optional second arg NOWARN non-nil means suppress any warning messages,
and also don't verify that the file has not been changed since
last visited or saved.
Optional third arg RAWFILE non-nil means the file is read literally.
Optional fourth arg WILDCARDS non-nil means do wildcard processing
and visit all the matching files. When wildcards are actually
@ -2885,7 +2887,7 @@ error in reading the file. WARN non-nil means warn if there
exists an auto-save file more recent than the visited file.
NOAUTO means don't mess with auto-save mode.
Fourth arg AFTER-FIND-FILE-FROM-REVERT-BUFFER is ignored
\(see `revert-buffer-in-progress-p' for similar functionality).
\(see `revert-buffer-in-progress' for similar functionality).
Fifth arg NOMODES non-nil means don't alter the file's modes.
Finishes by calling the functions in `find-file-hook'
unless NOMODES is non-nil."
@ -6243,7 +6245,13 @@ Before and after saving the buffer, this function runs
;; for saving the buffer.
(setq tempname
(make-temp-file
(expand-file-name "tmp" dir)))
;; The MSDOS 8+3 restricted namespace cannot be
;; relied upon to produce a different file name
;; if we append ".tmp".
(if (and (eq system-type 'ms-dos)
(not (msdos-long-file-names)))
(expand-file-name "tmp" dir)
(concat buffer-file-name ".tmp"))))
;; Pass in nil&nil rather than point-min&max
;; cause we're saving the whole buffer.
;; write-region-annotate-functions may use it.
@ -7105,9 +7113,10 @@ hook functions.
The function `revert-buffer--default' runs this.
A customized `revert-buffer-function' need not run this hook.")
(defvar revert-buffer-in-progress-p nil
(define-obsolete-variable-alias
'revert-buffer-in-progress-p 'revert-buffer-in-progress "31.1")
(defvar revert-buffer-in-progress nil
"Non-nil if a `revert-buffer' operation is in progress, nil otherwise.")
(defvar revert-buffer-internal-hook)
;; `revert-buffer-function' was defined long ago to be a function of only
@ -7166,7 +7175,7 @@ revert buffers without querying for confirmation.)
Optional third argument PRESERVE-MODES non-nil means don't alter
the files modes. Normally we reinitialize them using `normal-mode'.
This function binds `revert-buffer-in-progress-p' non-nil while it operates.
This function binds `revert-buffer-in-progress' non-nil while it operates.
This function calls the function that `revert-buffer-function' specifies
to do the work, with arguments IGNORE-AUTO and NOCONFIRM.
@ -7187,7 +7196,7 @@ preserve markers and overlays, at the price of being slower."
;; reversal of the argument sense. So I'm just changing the user
;; interface, but leaving the programmatic interface the same.
(interactive (list (not current-prefix-arg)))
(let ((revert-buffer-in-progress-p t)
(let ((revert-buffer-in-progress t)
(revert-buffer-preserve-modes preserve-modes)
restore-functions)
(run-hook-wrapped 'revert-buffer-restore-functions

View file

@ -51,7 +51,7 @@
(defvoo nnimap-server-port nil
"The IMAP port used.
If `nnimap-stream' is `ssl', this will default to `imaps'. If not,
If `nnimap-stream' is `tls', this will default to `imaps'. If not,
it will default to `imap'.")
(defvoo nnimap-use-namespaces nil
@ -63,10 +63,10 @@ names of your nnimap groups.")
(defvoo nnimap-stream 'undecided
"How nnimap talks to the IMAP server.
The value should be either `undecided', `ssl' or `tls',
The value should be either `undecided', `tls' or `ssl' (deprecated),
`network', `starttls', `plain', or `shell'.
If the value is `undecided', nnimap tries `ssl' first, then falls
If the value is `undecided', nnimap tries `tls' first, then falls
back on `network'.")
(defvoo nnimap-shell-program (if (boundp 'imap-shell-program)

View file

@ -496,7 +496,8 @@ which RSS 2.0 allows."
(defun nnrss-read-server-data (server)
(setq nnrss-server-data nil)
(let ((file (nnrss-make-filename "nnrss" server))
(file-name-coding-system nnmail-pathname-coding-system))
(file-name-coding-system nnmail-pathname-coding-system)
(warning-inhibit-types '((files missing-lexbind-cookie))))
(when (file-exists-p file)
(load file nil t t))))
@ -505,7 +506,7 @@ which RSS 2.0 allows."
(let ((coding-system-for-write nnrss-file-coding-system)
(file-name-coding-system nnmail-pathname-coding-system))
(with-temp-file (nnrss-make-filename "nnrss" server)
(insert (format ";; -*- coding: %s; -*-\n"
(insert (format ";; -*- coding: %s; lexical-binding:t -*-\n"
nnrss-file-coding-system))
(gnus-prin1 `(setq nnrss-group-alist ',nnrss-group-alist))
(insert "\n")
@ -520,7 +521,8 @@ which RSS 2.0 allows."
(setq nnrss-group-max (or (cadr pair) 0))
(setq nnrss-group-min (+ nnrss-group-max 1)))
(let ((file (nnrss-make-filename group server))
(file-name-coding-system nnmail-pathname-coding-system))
(file-name-coding-system nnmail-pathname-coding-system)
(warning-inhibit-types '((files missing-lexbind-cookie))))
(when (file-exists-p file)
(load file nil t t)
(dolist (e nnrss-group-data)
@ -535,7 +537,7 @@ which RSS 2.0 allows."
(let ((coding-system-for-write nnrss-file-coding-system)
(file-name-coding-system nnmail-pathname-coding-system))
(with-temp-file (nnrss-make-filename group server)
(insert (format ";; -*- coding: %s; -*-\n"
(insert (format ";; -*- coding: %s; lexical-binding:t -*-\n"
nnrss-file-coding-system))
(gnus-prin1 `(setq nnrss-group-data ',nnrss-group-data)))))

View file

@ -82,8 +82,9 @@ as its single argument, or one of the following special values:
upgrading to a TLS connection via STARTTLS if possible.
- `nntp-open-plain-stream' specifies an unencrypted network
connection (no STARTTLS upgrade is attempted).
- `nntp-open-ssl-stream' or `nntp-open-tls-stream' specify a TLS
network connection.
- `nntp-open-tls-stream' specifies a TLS network connection (the
equivalent value `nntp-open-ssl-stream' is accepted for backwards
compatibility).
Apart from the above special values, valid functions are as
follows; please refer to their respective doc string for more
@ -100,7 +101,7 @@ For indirect connections:
"Non-nil means the nntp server never echoes commands.
It is reported that some nntps server doesn't echo commands. So, you
may want to set this to non-nil in the method for such a server setting
`nntp-open-connection-function' to `nntp-open-ssl-stream' for example.
`nntp-open-connection-function' to `nntp-open-tls-stream' for example.
Note that the `nntp-open-connection-functions-never-echo-commands'
variable overrides the nil value of this variable.")

View file

@ -2253,13 +2253,14 @@ is enabled in the Help buffer."
(describe-function major))))
(insert " mode")
(when-let* ((file-name (find-lisp-object-file-name major nil)))
(insert (format " defined in %s:\n\n"
(insert (format " defined in %s"
(buttonize
(help-fns-short-filename file-name)
(lambda (_)
(help-function-def--button-function
major file-name))))))
(insert (help-split-fundoc (documentation major) nil 'doc)
(insert ":\n\n"
(help-split-fundoc (documentation major) nil 'doc)
(with-current-buffer buffer
(help-fns--list-local-commands)))
(ensure-empty-lines 1)

View file

@ -2285,53 +2285,54 @@ ARGLIST can also be t or a string of the form \"(FUN ARG1 ARG2 ...)\"."
"Return a formal argument list for the function DEF.
If PRESERVE-NAMES is non-nil, return a formal arglist that uses
the same names as used in the original source code, when possible."
;; Handle symbols aliased to other symbols.
(if (and (symbolp def) (fboundp def)) (setq def (indirect-function def)))
;; Advice wrappers have "catch all" args, so fetch the actual underlying
;; function to find the real arguments.
(setq def (advice--cd*r def))
;; If definition is a macro, find the function inside it.
(if (eq (car-safe def) 'macro) (setq def (cdr def)))
(cond
((and (closurep def) (listp (aref def 0))) (aref def 0))
((eq (car-safe def) 'lambda) (nth 1 def))
((and (featurep 'native-compile)
(subrp def)
(listp (subr-native-lambda-list def)))
(subr-native-lambda-list def))
((or (and (byte-code-function-p def) (integerp (aref def 0)))
(subrp def) (module-function-p def))
(or (when preserve-names
(let* ((doc (condition-case nil (documentation def 'raw) (error nil)))
(docargs (if doc (car (help-split-fundoc doc nil))))
(arglist (if docargs
(cdar (read-from-string (downcase docargs)))))
(valid t))
;; Check validity.
(dolist (arg arglist)
(unless (and (symbolp arg)
(let ((name (symbol-name arg)))
(if (and (> (length name) 0) (eq (aref name 0) ?&))
(memq arg '(&rest &optional))
(not (string-search "." name)))))
(setq valid nil)))
(when valid arglist)))
(let* ((arity (func-arity def))
(max (cdr arity))
(min (car arity))
(arglist ()))
(dotimes (i min)
(push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
(when (and (integerp max) (> max min))
(push '&optional arglist)
(dotimes (i (- max min))
(push (intern (concat "arg" (number-to-string (+ 1 i min))))
arglist)))
(unless (integerp max) (push '&rest arglist) (push 'rest arglist))
(nreverse arglist))))
((and (autoloadp def) (not (eq (nth 4 def) 'keymap)))
"[Arg list not available until function definition is loaded.]")
(t t)))
(let ((orig-def def)
;; Advice wrappers have "catch all" args, so fetch the actual underlying
;; function to find the real arguments.
(def (advice--cd*r
(indirect-function def)))) ;; Follow aliases to other symbols.
;; If definition is a macro, find the function inside it.
(if (eq (car-safe def) 'macro) (setq def (cdr def)))
(cond
((and (closurep def) (listp (aref def 0))) (aref def 0))
((eq (car-safe def) 'lambda) (nth 1 def))
((and (featurep 'native-compile)
(subrp def)
(listp (subr-native-lambda-list def)))
(subr-native-lambda-list def))
((or (and (byte-code-function-p def) (integerp (aref def 0)))
(subrp def) (module-function-p def))
(or (when preserve-names
(let* ((doc (ignore-errors (documentation orig-def 'raw)))
(docargs (if doc (car (help-split-fundoc doc nil))))
(arglist (if docargs
(cdar (read-from-string (downcase docargs)))))
(valid t))
;; Check validity.
(dolist (arg arglist)
(unless (and (symbolp arg)
(let ((name (symbol-name arg)))
(if (and (> (length name) 0)
(eq (aref name 0) ?&))
(memq arg '(&rest &optional))
(not (string-search "." name)))))
(setq valid nil)))
(when valid arglist)))
(let* ((arity (func-arity def))
(max (cdr arity))
(min (car arity))
(arglist ()))
(dotimes (i min)
(push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
(when (and (integerp max) (> max min))
(push '&optional arglist)
(dotimes (i (- max min))
(push (intern (concat "arg" (number-to-string (+ 1 i min))))
arglist)))
(unless (integerp max) (push '&rest arglist) (push 'rest arglist))
(nreverse arglist))))
((and (autoloadp def) (not (eq (nth 4 def) 'keymap)))
"[Arg list not available until function definition is loaded.]")
(t t))))
(defun help--make-usage (function arglist)
(cons (if (symbolp function) function 'anonymous)

View file

@ -334,11 +334,12 @@ undoes the expansion."
(defun he-capitalize-first (str)
(save-match-data
(if (string-match "\\Sw*\\(\\sw\\).*" str)
(let ((res (downcase str))
(no (match-beginning 1)))
(aset res no (upcase (aref str no)))
res)
(if (string-match "\\Sw*\\(\\sw\\)" str)
(let ((b (match-beginning 1))
(e (match-end 1)))
(concat (substring str 0 b)
(upcase (substring str b e))
(downcase (substring str e))))
str)))
(defun he-ordinary-case-p (str)

View file

@ -2136,7 +2136,8 @@ the value of point at the beginning of the line for that buffer."
`(ibuffer-title t font-lock-face ,ibuffer-title-face)))
;; Now, insert the summary columns.
(goto-char (point-max))
(if (get-text-property (1- (point-max)) 'ibuffer-summary)
(if (and (> (point-max) (point-min))
(get-text-property (1- (point-max)) 'ibuffer-summary))
(delete-region (previous-single-property-change
(point-max) 'ibuffer-summary)
(point-max)))

View file

@ -419,10 +419,10 @@ be determined."
;;;###autoload
(defun image-supported-file-p (file)
"Say whether Emacs has native support for displaying TYPE.
The value is a symbol specifying the image type, or nil if type
cannot be determined (or if Emacs doesn't have built-in support
for the image type)."
"Return non-nil if Emacs can display the specified image FILE.
The returned value is a symbol specifying the image type of FILE,
or nil if Emacs cannot display that image type or if the type
cannot be determined."
(let ((case-fold-search t)
type)
(catch 'found

View file

@ -50,13 +50,16 @@ is yanked."
(delete-and-extract-region beg end)
(buffer-substring beg end))))
(with-temp-buffer
;; Indent/deindent the same as the major mode in the original
;; buffer.
(setq indent-tabs-mode i-t-m)
(insert text)
(indent-rigidly (point-min) (point-max)
(- indentation))
(buffer-string))))
;; We bind inhibit-read-only non-nil in case the copied text has
;; read-only properties.
(let ((inhibit-read-only t))
;; Indent/deindent the same as the major mode in the original
;; buffer.
(setq indent-tabs-mode i-t-m)
(insert text)
(indent-rigidly (point-min) (point-max)
(- indentation))
(buffer-string)))))
;;;###autoload
(define-minor-mode kill-ring-deindent-mode

View file

@ -64,9 +64,12 @@ This string is shown at mode line when users are in KKC mode.")
(not (eq kkc-init-file-flag t)))
(let ((coding-system-for-write 'iso-2022-7bit)
(print-length nil))
(write-region (format "(setq kkc-lookup-cache '%S)\n" kkc-lookup-cache)
nil
kkc-init-file-name))))
(write-region
(format
";; -*- lexical-binding: t; -*-\n\n(setq kkc-lookup-cache '%S)\n"
kkc-lookup-cache)
nil
kkc-init-file-name))))
;; Sequence of characters to be used for indexes for shown list. The
;; Nth character is for the Nth conversion in the list currently shown.
@ -178,7 +181,8 @@ area while indicating the current selection by `<N>'."
(add-hook 'kill-emacs-hook 'kkc-save-init-file)
(if (file-readable-p kkc-init-file-name)
(condition-case nil
(load-file kkc-init-file-name)
(let ((warning-inhibit-types '((files missing-lexbind-cookie))))
(load-file kkc-init-file-name))
(kkc-error "Invalid data in %s" kkc-init-file-name))))
(or (and (nested-alist-p kkc-lookup-cache)
(eq (car kkc-lookup-cache) kkc-lookup-cache-tag))

View file

@ -2135,10 +2135,14 @@ minibuffer and the selected frame has no other windows)."
(let ((guidance (quail-guidance)))
(if (listp guidance)
;; We must replace the typed key with the specified PROMPT-KEY.
(dotimes (i (length str))
(let ((prompt-key (cdr (assoc (aref str i) guidance))))
(if prompt-key
(aset str i (aref prompt-key 0)))))))
(setq str (apply #'string
(mapcar
(lambda (c)
(let ((prompt-key (assq c guidance)))
(if prompt-key
(aref (cdr prompt-key) 0)
c)))
str)))))
;; Show followable keys.
(if (and (> (length quail-current-key) 0) (cdr map))

View file

@ -1751,7 +1751,9 @@ You can update the global isearch variables by setting new values to
;; This is so that the user can do anything without failure,
;; like switch buffers and start another isearch, and return.
(condition-case nil
(isearch-done t t)
(progn
(isearch-done t t)
(isearch-clean-overlays))
(exit nil)) ; was recursive editing
;; Save old point and isearch-other-end before reading from minibuffer
@ -1824,6 +1826,7 @@ You can update the global isearch variables by setting new values to
(progn
;; (sit-for 1) ;; needed if isearch-done does: (message "")
(isearch-done)
(isearch-clean-overlays)
;; The search done message is confusing when the string
;; is empty, so erase it.
(if (equal isearch-string "")
@ -3790,19 +3793,20 @@ Optional third argument, if t, means if fail just return nil (no error).
;; point returns to the original location which surely is not contain
;; in any of these overlays, se we are safe in this case too.
(defun isearch-open-necessary-overlays (ov)
(let ((inside-overlay (and (> (point) (overlay-start ov))
(<= (point) (overlay-end ov))))
;; If this exists it means that the overlay was opened using
;; this function, not by us tweaking the overlay properties.
(fct-temp (overlay-get ov 'isearch-open-invisible-temporary)))
(when (or inside-overlay (not fct-temp))
;; restore the values for the `invisible' properties.
(overlay-put ov 'invisible (overlay-get ov 'isearch-invisible))
(overlay-put ov 'isearch-invisible nil))
(if inside-overlay
(funcall (overlay-get ov 'isearch-open-invisible) ov)
(if fct-temp
(funcall fct-temp ov t)))))
(when (overlay-buffer ov)
(let ((inside-overlay (and (> (point) (overlay-start ov))
(<= (point) (overlay-end ov))))
;; If this exists it means that the overlay was opened using
;; this function, not by us tweaking the overlay properties.
(fct-temp (overlay-get ov 'isearch-open-invisible-temporary)))
(when (or inside-overlay (not fct-temp))
;; restore the values for the `invisible' properties.
(overlay-put ov 'invisible (overlay-get ov 'isearch-invisible))
(overlay-put ov 'isearch-invisible nil))
(if inside-overlay
(funcall (overlay-get ov 'isearch-open-invisible) ov)
(if fct-temp
(funcall fct-temp ov t))))))
;; This is called when exiting isearch. It closes the temporary
;; opened overlays, except the ones that contain the latest match.
@ -3827,16 +3831,17 @@ Optional third argument, if t, means if fail just return nil (no error).
(let ((overlays isearch-opened-overlays))
(setq isearch-opened-overlays nil)
(dolist (ov overlays)
(if (isearch-intersects-p beg end (overlay-start ov) (overlay-end ov))
(push ov isearch-opened-overlays)
(let ((fct-temp (overlay-get ov 'isearch-open-invisible-temporary)))
(if fct-temp
;; If this exists it means that the overlay was opened
;; using this function, not by us tweaking the overlay
;; properties.
(funcall fct-temp ov t)
(overlay-put ov 'invisible (overlay-get ov 'isearch-invisible))
(overlay-put ov 'isearch-invisible nil)))))))
(when (overlay-buffer ov)
(if (isearch-intersects-p beg end (overlay-start ov) (overlay-end ov))
(push ov isearch-opened-overlays)
(let ((fct-temp (overlay-get ov 'isearch-open-invisible-temporary)))
(if fct-temp
;; If this exists it means that the overlay was opened
;; using this function, not by us tweaking the overlay
;; properties.
(funcall fct-temp ov t)
(overlay-put ov 'invisible (overlay-get ov 'isearch-invisible))
(overlay-put ov 'isearch-invisible nil))))))))
(defun isearch-range-invisible (beg end)

View file

@ -6,7 +6,8 @@
;;; Commentary:
;; This file will be copied to ldefs-boot.el and checked in
;; periodically.
;; periodically. Note: When checking in ldefs-boot.el, don't include
;; changes to any other files in the commit.
;;; Code:
@ -1563,6 +1564,8 @@ disabled.
;;; Generated autoloads from autorevert.el
(defvar auto-revert-buffer-in-progress nil "\
Non-nil if a `auto-revert-buffer' operation is in progress, nil otherwise.")
(autoload 'auto-revert-mode "autorevert" "\
Toggle reverting buffer when the file changes (Auto-Revert Mode).
@ -2982,6 +2985,7 @@ This function attempts to use file contents to determine whether
the code is C or C++, and based on that chooses whether to enable
`c-ts-mode' or `c++-ts-mode'." t)
(make-obsolete 'c-or-c++-ts-mode 'c-or-c++-mode "30.1")
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(c-mode . c-ts-mode)) (add-to-list 'treesit-major-mode-remap-alist '(c++-mode . c++-ts-mode)) (add-to-list 'treesit-major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode)))
(register-definition-prefixes "c-ts-mode" '("c-ts-"))
@ -4699,6 +4703,11 @@ For use inside Lisp programs, see also `c-macro-expansion'.
Major mode for editing CMake files, powered by tree-sitter.
(fn)" t)
(autoload 'cmake-ts-mode-maybe "cmake-ts-mode" "\
Enable `cmake-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\(?:CMakeLists\\.txt\\|\\.cmake\\)\\'" . cmake-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(cmake-mode . cmake-ts-mode)))
(register-definition-prefixes "cmake-ts-mode" '("cmake-ts-mode-"))
@ -5923,6 +5932,7 @@ Key bindings:
Major mode for editing C# code.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(csharp-mode . csharp-ts-mode)))
(register-definition-prefixes "csharp-mode" '("codedoc-font-lock-" "csharp-"))
@ -5952,6 +5962,7 @@ can also be used to fill comments.
\\{css-mode-map}
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(css-mode . css-ts-mode)))
(autoload 'css-mode "css-mode" "\
Major mode to edit Cascading Style Sheets (CSS).
\\<css-mode-map>
@ -8385,6 +8396,11 @@ disabled.
Major mode for editing Dockerfiles, powered by tree-sitter.
(fn)" t)
(autoload 'dockerfile-ts-mode-maybe "dockerfile-ts-mode" "\
Enable `dockerfile-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\(?:Dockerfile\\(?:\\..*\\)?\\|\\.[Dd]ockerfile\\)\\'" . dockerfile-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(dockerfile-mode . dockerfile-ts-mode)))
(register-definition-prefixes "dockerfile-ts-mode" '("dockerfile-ts-mode--"))
@ -8534,6 +8550,7 @@ INIT-VALUE LIGHTER KEYMAP.
(fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t)
(function-put 'define-minor-mode 'doc-string-elt 2)
(function-put 'define-minor-mode 'lisp-indent-function 'defun)
(function-put 'define-minor-mode 'autoload-macro 'expand)
(autoload 'define-globalized-minor-mode "easy-mmode" "\
Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
TURN-ON is a function that will be called with no args in every buffer
@ -8577,6 +8594,7 @@ on if the hook has explicitly disabled it.
(fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)" nil t)
(function-put 'define-globalized-minor-mode 'doc-string-elt 2)
(function-put 'define-globalized-minor-mode 'lisp-indent-function 'defun)
(function-put 'define-globalized-minor-mode 'autoload-macro 'expand)
(autoload 'easy-mmode-define-keymap "easy-mmode" "\
Return a keymap built from bindings BS.
BS must be a list of (KEY . BINDING) where
@ -8925,7 +8943,7 @@ A second call of this function without changing point inserts the next match.
A call with prefix PREFIX reads the symbol to insert from the minibuffer with
completion.
(fn PREFIX)" '("P"))
(fn PREFIX)" t)
(autoload 'ebrowse-tags-loop-continue "ebrowse" "\
Repeat last operation on files in tree.
FIRST-TIME non-nil means this is not a repetition, but the first time.
@ -9953,6 +9971,11 @@ mode hooks.
Major mode for editing Elixir, powered by tree-sitter.
(fn)" t)
(autoload 'elixir-ts-mode-maybe "elixir-ts-mode" "\
Enable `elixir-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.elixir\\'" . elixir-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("\\.ex\\'" . elixir-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("\\.exs\\'" . elixir-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("mix\\.lock" . elixir-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(elixir-mode . elixir-ts-mode)))
(register-definition-prefixes "elixir-ts-mode" '("elixir-ts-"))
@ -10691,7 +10714,7 @@ ERC assigns SERVER and FULL-NAME the associated keyword values
and defers to `erc-compute-port', `erc-compute-user', and
`erc-compute-nick' for those respective parameters.
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" '((let ((erc--display-context `((erc-interactive-display . erc) ,@erc--display-context))) (erc-select-read-args))))
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" t)
(defalias 'erc-select #'erc)
(autoload 'erc-tls "erc" "\
Connect to an IRC server over a TLS-encrypted connection.
@ -10714,7 +10737,7 @@ See the alternative entry-point command `erc' as well as Info
node `(erc) Connecting' for a fuller description of the various
parameters, like ID.
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" '((let ((erc-default-port erc-default-port-tls) (erc--display-context `((erc-interactive-display . erc-tls) ,@erc--display-context))) (erc-select-read-args))))
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" t)
(autoload 'erc-handle-irc-url "erc" "\
Use ERC to IRC on HOST:PORT in CHANNEL.
If ERC is already connected to HOST:PORT, simply /join CHANNEL.
@ -15112,15 +15135,29 @@ Major mode for editing Go, powered by tree-sitter.
\\{go-ts-mode-map}
(fn)" t)
(autoload 'go-ts-mode-maybe "go-ts-mode" "\
Enable `go-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.go\\'" . go-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(go-mode . go-ts-mode)))
(autoload 'go-mod-ts-mode "go-ts-mode" "\
Major mode for editing go.mod files, powered by tree-sitter.
(fn)" t)
(autoload 'go-mod-ts-mode-maybe "go-ts-mode" "\
Enable `go-mod-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("/go\\.mod\\'" . go-mod-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(go-mod-mode . go-mod-ts-mode)))
(autoload 'go-work-ts-mode "go-ts-mode" "\
Major mode for editing go.work files, powered by tree-sitter.
(fn)" t)
(add-to-list 'auto-mode-alist '("/go\\.work\\'" . go-work-ts-mode))
(autoload 'go-work-ts-mode-maybe "go-ts-mode" "\
Enable `go-work-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("/go\\.work\\'" . go-work-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(go-work-mode . go-work-ts-mode)))
(register-definition-prefixes "go-ts-mode" '("go-"))
@ -15793,6 +15830,11 @@ Like `hanoi-unix', but with a 64-bit clock." t)
Major mode for editing HEEx, powered by tree-sitter.
(fn)" t)
(autoload 'heex-ts-mode-maybe "heex-ts-mode" "\
Enable `heex-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.[hl]?eex\\'" . heex-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(heex-mode . heex-ts-mode)))
(register-definition-prefixes "heex-ts-mode" '("heex-ts-"))
@ -18851,6 +18893,7 @@ See Info node `(elisp)Defining Functions' for more details.
(fn NAME ARGS &rest BODY)" nil t)
(function-put 'define-inline 'lisp-indent-function 'defun)
(function-put 'define-inline 'doc-string-elt 3)
(function-put 'define-inline 'autoload-macro 'expand)
(register-definition-prefixes "inline" '("inline-"))
@ -19295,6 +19338,7 @@ Return the string read from the minibuffer.
Major mode for editing Java, powered by tree-sitter.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(java-mode . java-ts-mode)))
(register-definition-prefixes "java-ts-mode" '("java-ts-mode-"))
@ -19341,6 +19385,7 @@ Major mode for editing JavaScript.
\\<js-ts-mode-map>
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(javascript-mode . js-ts-mode)))
(autoload 'js-json-mode "js" "\
@ -19376,6 +19421,7 @@ one of the aforementioned options instead of using this mode.
Major mode for editing JSON, powered by tree-sitter.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(js-json-mode . json-ts-mode)))
(register-definition-prefixes "json-ts-mode" '("json-ts-"))
@ -19874,7 +19920,7 @@ The first element on the command line should be the (main)
loaddefs.el output file, and the rest are the directories to
use.")
(load "theme-loaddefs.el" t)
(register-definition-prefixes "loaddefs-gen" '("autoload-" "generated-autoload-" "loaddefs-generate--" "no-update-autoloads"))
(register-definition-prefixes "loaddefs-gen" '("autoload-" "generated-autoload-" "loaddefs-" "no-update-autoloads"))
;;; Generated autoloads from loadhist.el
@ -20105,6 +20151,11 @@ Major mode for editing Lua files, powered by tree-sitter.
\\{lua-ts-mode-map}
(fn)" t)
(autoload 'lua-ts-mode-maybe "lua-ts-mode" "\
Enable `lua-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-ts-mode-maybe)) (add-to-list 'interpreter-mode-alist '("\\<lua\\(?:jit\\)?" . lua-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(lua-mode . lua-ts-mode)))
(register-definition-prefixes "lua-ts-mode" '("lua-ts-"))
@ -20693,6 +20744,11 @@ Populate MENU with commands that open a man page at point.
Major mode for editing Markdown using tree-sitter grammar.
(fn)" t)
(autoload 'markdown-ts-mode-maybe "markdown-ts-mode" "\
Enable `markdown-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(markdown-mode . markdown-ts-mode)))
(register-definition-prefixes "markdown-ts-mode" '("markdown-ts-"))
@ -21198,6 +21254,7 @@ Major mode for editing HTML with embedded JavaScript and CSS.
Powered by tree-sitter.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode)))
(register-definition-prefixes "mhtml-ts-mode" '("mhtml-ts-mode-"))
@ -24614,6 +24671,7 @@ for the result of evaluating EXP (first arg to `pcase').
(fn NAME ARGS [DOC] &rest BODY...)" nil t)
(function-put 'pcase-defmacro 'lisp-indent-function 2)
(function-put 'pcase-defmacro 'doc-string-elt 3)
(function-put 'pcase-defmacro 'autoload-macro 'expand)
(register-definition-prefixes "pcase" '("pcase-"))
@ -25142,6 +25200,11 @@ Prompt for CMD if `php-ts-mode-php-executable' is nil.
Optional CONFIG, if supplied, is the php.ini file to use.
(fn &optional CMD CONFIG)" t)
(autoload 'php-ts-mode-maybe "php-ts-mode" "\
Enable `php-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.\\(?:php[s345]?\\|phtml\\)\\'" . php-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("\\.\\(?:php\\|inc\\|stub\\)\\'" . php-ts-mode-maybe)) (add-to-list 'auto-mode-alist '("/\\.php_cs\\(?:\\.dist\\)?\\'" . php-ts-mode-maybe)) (add-to-list 'interpreter-mode-alist (cons "php\\(?:-?[34578]\\(?:\\.[0-9]+\\)*\\)?" 'php-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(php-mode . php-ts-mode)))
(register-definition-prefixes "php-ts-mode" '("inferior-php-ts-mode" "php-ts-"))
@ -26091,13 +26154,19 @@ interactively, include all files under the project root, except
for VCS directories listed in `vc-directory-exclusion-list'.
(fn &optional INCLUDE-ALL)" t)
(autoload 'project-find-matching-file "project" "\
Visit the file that matches the current one, in another project.
It will skip to the same line number as well.
A matching file has the same file name relative to the project root.
(autoload 'project-find-matching-buffer "project" "\
Switch to a matching buffer in another project.
For most file-visiting buffers, the matching buffer is one visiting a
file in the other project which has the same file name relative to the
project root. See `project-find-matching-file' for details.
Non-file-visiting major modes may configure a different notion of
matching buffer; see `project-find-matching-buffer-function'.
When called during switching to another project, this command will
detect it and use the override. Otherwise, it prompts for the project
to use from the known list." t)
detect that, and use the override. Otherwise, it prompts for the
project to use from the list of known projects.
When calling from Lisp, bind `project-current-directory-override' to a
directory under the target project to preempt this prompting." t)
(autoload 'project-find-dir "project" "\
Start Dired in a directory inside the current project.
@ -26114,13 +26183,17 @@ Start an inferior shell in the current project's root directory.
If a buffer already exists for running a shell in the project's root,
switch to it. Otherwise, create a new shell buffer.
With \\[universal-argument] prefix arg, create a new inferior shell buffer even
if one already exists." t)
if one already exists.
With numeric prefix arg, switch to the session with that number, or
create it if it doesn't already exist." t)
(autoload 'project-eshell "project" "\
Start Eshell in the current project's root directory.
If a buffer already exists for running Eshell in the project's root,
switch to it. Otherwise, create a new Eshell buffer.
With \\[universal-argument] prefix arg, create a new Eshell buffer even
if one already exists." t)
if one already exists.
With numeric prefix arg, switch to the session with that number, or
create it if it doesn't already exist." t)
(autoload 'project-async-shell-command "project" "\
Run `async-shell-command' in the current project's root directory." t)
(function-put 'project-async-shell-command 'interactive-only 'async-shell-command)
@ -26217,9 +26290,13 @@ Like `save-some-buffers', but only for this project's buffers.
Add project PR to the front of the project list.
If project PR satisfies `project-list-exclude', then nothing is done.
Save the result in `project-list-file' if the list of projects
has changed, and NO-WRITE is nil.
has changed.
When called from Lisp, optional argument NO-WRITE non-nil means to
suppress saving `project-list-file'.
Optional argument STABLE means don't move PR to the front of the project
list if it's already present further down the project list.
(fn PR &optional NO-WRITE)" t)
(fn PR &optional NO-WRITE STABLE)" t)
(autoload 'project-forget-project "project" "\
Remove directory PROJECT-ROOT from the project list.
PROJECT-ROOT is the root directory of a known project listed in
@ -28356,6 +28433,7 @@ Major mode for editing Ruby code.
Major mode for editing Ruby, powered by tree-sitter.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(ruby-mode . ruby-ts-mode)))
(register-definition-prefixes "ruby-ts-mode" '("ruby-ts-"))
@ -28391,6 +28469,11 @@ disabled.
Major mode for editing Rust, powered by tree-sitter.
(fn)" t)
(autoload 'rust-ts-mode-maybe "rust-ts-mode" "\
Enable `rust-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(rust-mode . rust-ts-mode)))
(register-definition-prefixes "rust-ts-mode" '("rust-ts-"))
@ -29491,6 +29574,7 @@ This mode automatically falls back to `sh-mode' if the buffer is
not written in Bash or sh.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(sh-mode . bash-ts-mode)))
(register-definition-prefixes "sh-script" '("sh-"))
@ -33624,6 +33708,7 @@ Mode for displaying and reprioritizing top priority Todo.
Major mode for editing TOML, powered by tree-sitter.
(fn)" t)
(when (treesit-available-p) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(conf-toml-mode . toml-ts-mode)))
(register-definition-prefixes "toml-ts-mode" '("toml-ts-mode-"))
@ -34042,7 +34127,7 @@ Interactively, with a prefix argument, prompt for a different method." t)
;;; Generated autoloads from transient.el
(push '(transient 0 9 3) package--builtin-versions)
(push '(transient 0 9 4) package--builtin-versions)
(autoload 'transient-insert-suffix "transient" "\
Insert a SUFFIX into PREFIX before LOC.
PREFIX is a prefix command, a symbol.
@ -34136,6 +34221,11 @@ nil, the grammar is installed to the standard location, the
\"tree-sitter\" directory under `user-emacs-directory'.
(fn LANG &optional OUT-DIR)" t)
(defvar treesit-enabled-modes nil "\
Specify what treesit modes to enable by default.
The value can be either a list of ts-modes to enable,
or t to enable all ts-modes.")
(custom-autoload 'treesit-enabled-modes "treesit" nil)
(register-definition-prefixes "treesit" '("treesit-"))
@ -34443,6 +34533,11 @@ This mode is intended to be inherited by concrete major modes.
Major mode for editing TypeScript.
(fn)" t)
(autoload 'typescript-ts-mode-maybe "typescript-ts-mode" "\
Enable `typescript-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(typescript-mode . typescript-ts-mode)))
(autoload 'tsx-ts-mode "typescript-ts-mode" "\
Major mode for editing TSX and JSX documents.
@ -34455,6 +34550,11 @@ The JSX-specific faces are used when `treesit-font-lock-level' is
at least 3 (which is the default value).
(fn)" t)
(autoload 'tsx-ts-mode-maybe "typescript-ts-mode" "\
Enable `tsx-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(tsx-mode . tsx-ts-mode)))
(register-definition-prefixes "typescript-ts-mode" '("tsx-ts-" "typescript-ts-"))
@ -35613,6 +35713,17 @@ See `vc-use-incoming-outgoing-prefixes' regarding giving this command a
global binding.
(fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-diff-incoming "vc" "\
Report changes to VC fileset that would be pulled from REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-update] would pull from.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name.
When called from Lisp optional argument FILESET overrides the VC fileset.
See `vc-use-incoming-outgoing-prefixes' regarding giving this command a
global binding.
(fn &optional REMOTE-LOCATION FILESET)" t)
(autoload 'vc-root-diff-outgoing "vc" "\
Report diff of all changes that would be pushed to REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-push] would push to.
@ -35623,6 +35734,17 @@ See `vc-use-incoming-outgoing-prefixes' regarding giving this command a
global binding.
(fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-diff-outgoing "vc" "\
Report changes to VC fileset that would be pushed to REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-push] would push to.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name.
When called from Lisp optional argument FILESET overrides the VC fileset.
See `vc-use-incoming-outgoing-prefixes' regarding giving this command a
global binding.
(fn &optional REMOTE-LOCATION FILESET)" t)
(autoload 'vc-version-ediff "vc" "\
Show differences between REV1 and REV2 of FILES using ediff.
This compares two revisions of the files in FILES. Currently,
@ -35937,30 +36059,40 @@ marked revisions, use those.
(fn ADDRESSEE SUBJECT REVISIONS)" t)
(autoload 'vc-add-working-tree "vc" "\
Create working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
Must be called from within an existing VC working tree.
When called interactively, prompts for DIRECTORY.
When called from Lisp, BACKEND is the VC backend.
(fn BACKEND DIRECTORY)" t)
(autoload 'vc-switch-working-tree "vc" "\
Switch to this file or directory's analogue in working tree DIRECTORY.
This command switches to the file or directory which has the same path
relative to DIRECTORY that this buffer's file or directory has relative
Switch to the version of this file in working tree under DIRECTORY.
Must be called from within an existing VC working tree.
When called interactively, prompts for DIRECTORY.
This command switches to the file which has the same file
name relative to DIRECTORY that this buffer's file has relative
to the root of this working tree.
DIRECTORY names another working tree with the same backing repository as
this tree; see Info node `(emacs)Other Working Trees' for general
information regarding VCS repositories with multiple working trees.
(fn DIRECTORY)" t)
(autoload 'vc-working-tree-switch-project "vc" "\
Like \\[project-switch-project] but limited to projects with the same backing repository.
Must be called from within an existing VC working tree.
Prompts for the directory file name of the other working tree.
(fn DIR)" t)
(function-put 'vc-working-tree-switch-project 'interactive-only 'project-switch-project)
(autoload 'vc-delete-working-tree "vc" "\
Delete working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
Must be called from within an existing VC working tree.
When called interactively, prompts for DIRECTORY.
BACKEND is the VC backend.
(fn BACKEND DIRECTORY)" t)
(autoload 'vc-move-working-tree "vc" "\
Relocate a working tree from FROM to TO.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
Relocate a working tree from FROM to TO, two directory file names.
Must be called from within an existing VC working tree.
When called interactively, prompts for the directory file names of each
of the other working trees FROM and TO.
BACKEND is the VC backend.
(fn BACKEND FROM TO)" t)
(register-definition-prefixes "vc" '("log-view-vc-prev-" "vc-" "with-vc-properties"))
@ -37756,6 +37888,25 @@ evaluate the variable `whitespace-newline-mode'.
The mode's hook is called both when the mode is enabled and when it is
disabled.
(fn &optional ARG)" t)
(autoload 'whitespace-page-delimiters-mode "whitespace" "\
Display page-break delimiter characters as horizontal lines.
This is a minor mode. If called interactively, toggle the
`Whitespace-Page-Delimiters mode' mode. If the prefix argument is
positive, enable the mode, and if it is zero or negative, disable the
mode.
If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate the variable `whitespace-page-delimiters-mode'.
The mode's hook is called both when the mode is enabled and when it is
disabled.
(fn &optional ARG)" t)
(put 'global-whitespace-mode 'globalized-minor-mode t)
(defvar global-whitespace-mode nil "\
@ -37832,6 +37983,7 @@ Interactively, it reads one of the following chars:
t toggle TAB visualization
s toggle SPACE and HARD SPACE visualization
r toggle trailing blanks visualization
p toggle page delimiters visualization
l toggle \"long lines\" visualization
L toggle \"long lines\" tail visualization
n toggle NEWLINE visualization
@ -37862,6 +38014,7 @@ The valid symbols are:
tabs toggle TAB visualization
spaces toggle SPACE and HARD SPACE visualization
trailing toggle trailing blanks visualization
page-delimiters toggle page delimiters visualization
lines toggle \"long lines\" visualization
lines-tail toggle \"long lines\" tail visualization
newline toggle NEWLINE visualization
@ -37903,6 +38056,7 @@ Interactively, it accepts one of the following chars:
t toggle TAB visualization
s toggle SPACE and HARD SPACE visualization
r toggle trailing blanks visualization
p toggle page delimiters visualization
l toggle \"long lines\" visualization
L toggle \"long lines\" tail visualization
C-l toggle \"long lines\" one character visualization
@ -37934,6 +38088,7 @@ The valid symbols are:
tabs toggle TAB visualization
spaces toggle SPACE and HARD SPACE visualization
trailing toggle trailing blanks visualization
page-delimiters toggle page delimiters visualization
lines toggle \"long lines\" visualization
lines-tail toggle \"long lines\" tail visualization
lines-char toggle \"long lines\" one character visualization
@ -38936,6 +39091,11 @@ a new xwidget-webkit session, otherwise use an existing session.
Major mode for editing YAML, powered by tree-sitter.
(fn)" t)
(autoload 'yaml-ts-mode-maybe "yaml-ts-mode" "\
Enable `yaml-ts-mode' when its grammar is available.
Also propose to install the grammar when `treesit-enabled-modes'
is t or contains the mode name.")
(when (treesit-available-p) (add-to-list 'auto-mode-alist '("\\.ya?ml\\'" . yaml-ts-mode-maybe)) (defvar treesit-major-mode-remap-alist) (add-to-list 'treesit-major-mode-remap-alist '(yaml-mode . yaml-ts-mode)))
(register-definition-prefixes "yaml-ts-mode" '("yaml-ts-mode--"))

View file

@ -427,13 +427,16 @@ copy text to your preferred mail program.\n"
(defun report-emacs-bug-check-org ()
"Warn the user if the bug report mentions org-mode."
(unless report-emacs-bug-no-confirmation
(goto-char (point-max))
(skip-chars-backward " \t\n")
(let* ((text (buffer-substring-no-properties (point-min) (point)))
(l (length report-emacs-bug-orig-text))
(text (substring text 0 l))
(org-regex "\\b[Oo]rg\\(-mode\\)?\\b"))
(when (string-match-p org-regex text)
(let* ((org-regex "\\(^\\|\\s-\\)[Oo]rg\\(-mode\\)?\\(\\s-\\|$\\)")
(count (lambda (r s)
(let ((c 0) (start 0))
(while (string-match r s start)
(setq c (1+ c))
(setq start (match-end 0)))
c)))
(m (funcall count org-regex (buffer-string)))
(m-orig (funcall count org-regex report-emacs-bug-orig-text)))
(when (> m m-orig)
(when (yes-or-no-p "Is this bug about org-mode?")
(error (substitute-command-keys "\
Not sending, use \\[org-submit-bug-report] to report an Org-mode bug.")))))))
@ -584,7 +587,7 @@ Message buffer where you can explain more about the patch."
(message-goto-body)
(insert "\n\n\n")
(emacs-build-description)
(mml-attach-file file "text/patch" nil "attachment")
(mml-attach-file file "text/x-patch" nil "attachment")
(message-goto-body)
(message "Write a description of the patch and use %s to send it"
(substitute-command-keys "\\[message-send-and-exit]"))

View file

@ -4515,6 +4515,11 @@ TEXT and INDENT are not used."
;; to "prying eyes." Obviously, this encoding isn't "real security,"
;; nor is it meant to be.
(defvar rmail--remote-password-host nil
"Last recorded value of the HOST argument to `rmail-get-remote-password'.")
(defvar rmail--remote-password-user nil
"Last recorded value of the USER argument to `rmail-get-remote-password'.")
;;;###autoload
(defun rmail-set-remote-password (password)
"Set PASSWORD to be used for retrieving mail from a POP or IMAP server."
@ -4535,7 +4540,12 @@ machine mymachine login myloginname password mypassword
If auth-source search yields no result, prompt the user for the
password."
(when (not rmail-encoded-remote-password)
(when (or (not rmail-encoded-remote-password)
(not (equal user rmail--remote-password-user))
(not (equal host rmail--remote-password-host)))
;; Record the values we will be using from now on.
(setq rmail--remote-password-host host
rmail--remote-password-user user)
(if (not rmail-remote-password)
(setq rmail-remote-password
(let ((found (nth 0 (auth-source-search

View file

@ -1123,7 +1123,14 @@ for the current invocation."
(and (not (equal default-entry ""))
default-entry))
#'Man-completion-table
nil nil nil 'Man-topic-history default-entry)))
nil nil nil 'Man-topic-history
`(,default-entry
,@(when (use-region-p)
(list (string-replace
" " "-"
(buffer-substring-no-properties
(region-beginning)
(region-end)))))))))
(if Man-cache-completion-results-flag
(read)
(let ((Man-completion-cache)) (read))))))

View file

@ -1064,6 +1064,24 @@ metadata."
(const :tag "If requested by the completion command" auto))
:version "31.1")
(defcustom completion-eager-update 'auto
"Whether the *Completions* buffer should update as you type.
If `t', always update as you type.
If `auto', only update if the completion property `eager-update' is
non-nil, whether set by the completion table or by
`completion-category-overrides' or by `completion-category-defaults'.
If nil, never update as you type.
This only affects the *Completions* buffer if it is already
displayed."
:type '(choice (const :tag "Don't update as you type" nil)
(const :tag "Auto-update based on the category" auto)
(const :tag "Always update as you type" t))
:version "31.1")
(defcustom completion-auto-help t
"Non-nil means automatically provide help for invalid completion input.
If the value is t, the *Completions* buffer is displayed whenever completion
@ -1197,6 +1215,7 @@ styles for specific categories, such as files, buffers, etc."
;; A new style that combines substring and pcm might be better,
;; e.g. one that does not anchor to bos.
(project-file (styles . (substring)))
(project-buffer (styles . (basic substring)))
(xref-location (styles . (substring)))
(info-menu (styles . (basic substring)))
(symbol-help (styles . (basic shorthand substring))))
@ -1598,7 +1617,7 @@ when the buffer's text is already an exact match."
(completed
(cond
((pcase completion-auto-help
('visible (get-buffer-window "*Completions*" 0))
('visible (minibuffer--completions-visible))
('always t))
(minibuffer-completion-help beg end))
(t (minibuffer-hide-completions)
@ -2634,12 +2653,43 @@ The candidate will still be chosen by `choose-completion' unless
(goto-char (or (next-single-property-change (point) 'completion--string)
(point-max)))))
(defun completion--eager-update-p (start)
"Return non-nil if *Completions* should be automatically updated.
If `completion-eager-update' is the symbol `auto', checks completion
metadata for the string from START to point."
(if (eq completion-eager-update 'auto)
(completion-metadata-get (completion--field-metadata start) 'eager-update)
completion-eager-update))
(defun completions--background-update ()
"Try to update *Completions* without blocking input.
This function uses `while-no-input' and sets `non-essential' to t
so that the update is less likely to interfere with user typing."
(while-no-input
(let ((non-essential t))
(redisplay)
(cond
(completion-in-region-mode (completion-help-at-point t))
((completion--eager-update-p (minibuffer-prompt-end))
(minibuffer-completion-help))))))
(defun completions--post-command-update ()
"Update displayed *Completions* buffer after command, once."
(remove-hook 'post-command-hook #'completions--post-command-update)
(when (and completion-eager-update (minibuffer--completions-visible))
(completions--background-update)))
(defun completions--after-change (_start _end _old-len)
"Update displayed *Completions* buffer after change in buffer contents."
(when completion-auto-deselect
(when-let* ((window (get-buffer-window "*Completions*" 0)))
(with-selected-window window
(completions--deselect)))))
(when (or completion-auto-deselect completion-eager-update)
(when-let* ((window (minibuffer--completions-visible)))
(when completion-auto-deselect
(with-selected-window window
(completions--deselect)))
(when completion-eager-update
(add-hook 'post-command-hook #'completions--post-command-update)))))
(defun minibuffer-completion-help (&optional start end)
"Display a list of possible completions of the current minibuffer contents."
@ -2730,7 +2780,7 @@ The candidate will still be chosen by `choose-completion' unless
(body-function
. ,#'(lambda (window)
(with-current-buffer mainbuf
(when completion-auto-deselect
(when (or completion-auto-deselect completion-eager-update)
(add-hook 'after-change-functions #'completions--after-change nil t))
;; Remove the base-size tail because `sort' requires a properly
;; nil-terminated list.
@ -2836,7 +2886,7 @@ The candidate will still be chosen by `choose-completion' unless
;; FIXME: We could/should use minibuffer-scroll-window here, but it
;; can also point to the minibuffer-parent-window, so it's a bit tricky.
(interactive)
(when-let* ((win (get-buffer-window "*Completions*" 0)))
(when-let* ((win (minibuffer--completions-visible)))
(with-selected-window win
;; Move point off any completions, so we don't move point there
;; again the next time `minibuffer-completion-help' is called.
@ -3119,7 +3169,7 @@ The completion method is determined by `completion-at-point-functions'."
(car res)))
(cdr res)))))
(defun completion-help-at-point ()
(defun completion-help-at-point (&optional only-if-eager)
"Display the completions on the text around point.
The completion method is determined by `completion-at-point-functions'."
(interactive)
@ -3146,7 +3196,8 @@ The completion method is determined by `completion-at-point-functions'."
`(,start ,(copy-marker end t) ,collection
,(plist-get plist :predicate)))
(completion-in-region-mode 1)
(minibuffer-completion-help start end)))
(when (or (not only-if-eager) (completion--eager-update-p start))
(minibuffer-completion-help start end))))
(`(,hookfun . ,_)
;; The hook function already performed completion :-(
;; Not much we can do at this point.
@ -3282,18 +3333,26 @@ and `RET' accepts the input typed into the minibuffer."
(defvar minibuffer-visible-completions--always-bind nil
"If non-nil, force the `minibuffer-visible-completions' bindings on.")
(defun minibuffer--completions-visible ()
"Return the window where the current *Completions* buffer is visible, if any."
(when-let* ((window (get-buffer-window "*Completions*" 0)))
(when (eq (buffer-local-value 'completion-reference-buffer
(window-buffer window))
;; If there's no active minibuffer, we call
;; `window-buffer' on nil, assuming that completion is
;; happening in the selected window.
(window-buffer (active-minibuffer-window)))
window)))
(defun minibuffer-visible-completions--filter (cmd)
"Return CMD if `minibuffer-visible-completions' bindings should be active."
(if minibuffer-visible-completions--always-bind
cmd
(when-let* ((window (get-buffer-window "*Completions*" 0)))
(when (and (eq (buffer-local-value 'completion-reference-buffer
(window-buffer window))
(window-buffer (active-minibuffer-window)))
(if (eq cmd #'minibuffer-choose-completion-or-exit)
(with-current-buffer (window-buffer window)
(get-text-property (point) 'completion--string))
t))
(when-let* ((window (minibuffer--completions-visible)))
(when (if (eq cmd #'minibuffer-choose-completion-or-exit)
(with-current-buffer (window-buffer window)
(get-text-property (point) 'completion--string))
t)
cmd))))
(defun minibuffer-visible-completions--bind (binding)
@ -4067,7 +4126,7 @@ style."
"Split STRING into a pattern.
A pattern is a list where each element is either a string
or a symbol, see `completion-pcm--merge-completions'."
(if (and point (< point (length string)))
(if (and point (<= point (length string)))
(let ((prefix (substring string 0 point))
(suffix (substring string point)))
(append (completion-pcm--string->pattern prefix)
@ -4128,12 +4187,6 @@ or a symbol, see `completion-pcm--merge-completions'."
(pcase p
(`(,(or 'any 'any-delim) ,(or 'any 'point) . ,_)
(setq p (cdr p)))
;; This is not just a performance improvement: it turns a
;; terminating `point' into an implicit `any', which affects
;; the final position of point (because `point' gets turned
;; into a non-greedy ".*?" regexp whereas we need it to be
;; greedy when it's at the end, see bug#38458).
(`(point) (setq p nil)) ;Implicit terminating `any'.
(_ (push (pop p) n))))
(nreverse n)))
@ -4542,38 +4595,35 @@ the same set of elements."
(cond
((null (cdr strs)) (list (car strs)))
(t
(let ((re (completion-pcm--pattern->regex pattern 'group))
(let ((re (concat
(completion-pcm--pattern->regex pattern 'group)
;; The implicit trailing `any' is greedy.
"\\([^z-a]*\\)"))
(ccs ())) ;Chopped completions.
;; First chop each string into the parts corresponding to each
;; non-constant element of `pattern', using regexp-matching.
;; First match each string against PATTERN as a regex and extract
;; the text matched by each wildcard.
(let ((case-fold-search completion-ignore-case))
(dolist (str strs)
(unless (string-match re str)
(error "Internal error: %s doesn't match %s" str re))
(let ((chopped ())
(last 0)
(i 1)
next)
(while (setq next (match-end i))
(push (substring str last next) chopped)
(setq last next)
(while (setq next (match-string i str))
(push next chopped)
(setq i (1+ i)))
;; Add the text corresponding to the implicit trailing `any'.
(push (substring str last) chopped)
(push (nreverse chopped) ccs))))
;; Then for each of those non-constant elements, extract the
;; commonality between them.
;; Then for each of those wildcards, extract the commonality between them.
(let ((res ())
(fixed "")
;; Accumulate each stretch of wildcards, and process them as a unit.
(wildcards ()))
;; Make the implicit trailing `any' explicit.
(dolist (elem (append pattern '(any)))
(if (stringp elem)
(progn
(setq fixed (concat fixed elem))
(push elem res)
(setq wildcards nil))
(let ((comps ()))
(push elem wildcards)
@ -4584,10 +4634,14 @@ the same set of elements."
;; different capitalizations in different parts.
;; In practice, it doesn't seem to make any difference.
(setq ccs (nreverse ccs))
(let* ((prefix (try-completion fixed comps))
(unique (or (and (eq prefix t) (setq prefix fixed))
(let* ((prefix (try-completion "" comps))
(unique (or (and (eq prefix t) (setq prefix ""))
(and (stringp prefix)
(eq t (try-completion prefix comps))))))
;; If PREFIX is equal to all of COMPS,
;; then PREFIX is a unique completion.
(seq-every-p
(lambda (comp) (= (length prefix) (length comp)))
comps)))))
;; If there's only one completion, `elem' is not useful
;; any more: it can only match the empty string.
;; FIXME: in some cases, it may be necessary to turn an
@ -4601,7 +4655,7 @@ the same set of elements."
;; `prefix' only wants to include the fixed part before the
;; wildcard, not the result of growing that fixed part.
(when (seq-some (lambda (elem) (eq elem 'prefix)) wildcards)
(setq prefix fixed))
(setq prefix ""))
(push prefix res)
;; Push all the wildcards in this stretch, to preserve `point' and
;; `star' wildcards before ELEM.
@ -4625,8 +4679,7 @@ the same set of elements."
(unless (equal suffix "")
(push suffix res))))
;; We pushed these wildcards on RES, so we're done with them.
(setq wildcards nil))
(setq fixed "")))))
(setq wildcards nil))))))
;; We return it in reverse order.
res)))))
@ -5063,10 +5116,10 @@ the minibuffer was activated, and execute the forms."
When used in a minibuffer window, select the window with completions,
and execute the forms."
(declare (indent 0) (debug t))
`(let ((window (or (get-buffer-window "*Completions*" 0)
`(let ((window (or (minibuffer--completions-visible)
;; Make sure we have a completions window.
(progn (minibuffer-completion-help)
(get-buffer-window "*Completions*" 0)))))
(minibuffer--completions-visible)))))
(when window
(with-selected-window window
(completion--lazy-insert-strings)
@ -5161,7 +5214,7 @@ inputs for the prompting command, instead of the default completion table."
(user-error "No history available"))))
;; FIXME: Can we make it work for CRM?
(let ((completion-in-region-mode-predicate
(lambda () (get-buffer-window "*Completions*" 0))))
(lambda () (minibuffer--completions-visible))))
(completion-in-region
(minibuffer--completion-prompt-end) (point-max)
(completion-table-with-metadata
@ -5179,7 +5232,7 @@ provided by the prompting command, instead of the completion table."
minibuffer-default (funcall minibuffer-default-add-function)))
(let ((completions (ensure-list minibuffer-default))
(completion-in-region-mode-predicate
(lambda () (get-buffer-window "*Completions*" 0))))
(lambda () (minibuffer--completions-visible))))
(completion-in-region
(minibuffer--completion-prompt-end) (point-max)
(completion-table-with-metadata

View file

@ -1356,7 +1356,6 @@ This consults the entries in `eww-readable-urls' (which see)."
"<mouse-9>" #'eww-forward-url
:menu '("Eww"
["Exit" quit-window t]
["Close browser" quit-window t]
["Reload" eww-reload t]
["Follow URL in new buffer" eww-open-in-new-buffer]

View file

@ -573,9 +573,9 @@ Emacs dired can't find files."
"touch -t %s %s %s")
(format-time-string "%Y-%m-%dT%H:%M:%S.%NZ" time t)
nofollow quoted-name (tramp-get-remote-null-device v)
(format-time-string "%Y-%m-%dT%H:%M:%S" time t)
(format-time-string "%Y-%m-%dT%H:%M:%S" time)
nofollow quoted-name (tramp-get-remote-null-device v)
(format-time-string "%Y%m%d%H%M.%S" time t)
(format-time-string "%Y%m%d%H%M.%S" time)
nofollow quoted-name)))))
(defun tramp-adb-handle-copy-file

View file

@ -29,7 +29,7 @@
;;; Code:
(require 'tramp-loaddefs)
(require 'tramp-loaddefs nil t) ; guard against load during autoload gen
(require 'ansi-color)
(require 'auth-source)
(require 'format-spec)

View file

@ -94,6 +94,15 @@ This increases `tramp-verbose' to 6 if necessary."
:type 'boolean
:link '(info-link :tag "Tramp manual" "(tramp) Traces and Profiles"))
(defcustom tramp-debug-buffer-limit (* 100 1024 1024) ;100MB
"The upper limit of a Tramp debug buffer.
If the size of a debug buffer exceeds this limit, a warning is raised.
Set it to 0 if there is no limit."
:group 'tramp
:version "31.1"
:type 'natnum
:link '(info-link :tag "Tramp manual" "(tramp) Traces and Profiles"))
(defconst tramp-debug-outline-regexp
(rx ;; Timestamp.
(+ digit) ":" (+ digit) ":" (+ digit) "." (+ digit) blank
@ -281,7 +290,14 @@ ARGUMENTS to actually emit the message (if applicable)."
(when tramp-debug-to-file
(ignore-errors
(write-region
point (point-max) (tramp-get-debug-file-name vec) 'append))))))))
point (point-max) (tramp-get-debug-file-name vec) 'append))))
(when (and (natnump tramp-debug-buffer-limit)
(not (zerop tramp-debug-buffer-limit))
(> (point-max) tramp-debug-buffer-limit))
(setq-local tramp-debug-buffer-limit nil)
(lwarn
'tramp :warning
"Tramp debug buffer %S exceeds the limit" (current-buffer)))))))
;;;###tramp-autoload
(defun tramp-message (vec-or-proc level fmt-string &rest arguments)

Some files were not shown because too many files have changed in this diff Show more