Merge remote-tracking branch 'origin/master' into feature/android

This commit is contained in:
Po Lu 2023-03-04 20:22:39 +08:00
commit df74188dba
13 changed files with 199 additions and 111 deletions

View file

@ -325,10 +325,10 @@ function @code{oclosure-interactive-form}.
@defun oclosure-interactive-form function
Just like @code{interactive-form}, this function takes a command and
returns its interactive form. The difference is that it is a generic
function and it is only called when @var{function} is an OClosure.
The purpose is to make it possible for some OClosure types to compute
their interactive forms dynamically instead of carrying it in one of
their slots.
function and it is only called when @var{function} is an OClosure
(@pxref{OClosures}). The purpose is to make it possible for some
OClosure types to compute their interactive forms dynamically instead
of carrying it in one of their slots.
This is used for example for @code{kmacro} functions in order to
reduce their memory size, since they all share the same interactive

View file

@ -569,6 +569,7 @@ Functions
* Function Cells:: Accessing or setting the function definition
of a symbol.
* Closures:: Functions that enclose a lexical environment.
* OClosures:: Function objects with meta-data.
* Advising Functions:: Adding to the definition of a function.
* Obsolete Functions:: Declaring functions obsolete.
* Inline Functions:: Defining functions that the compiler

View file

@ -22,7 +22,7 @@ define them.
* Function Cells:: Accessing or setting the function definition
of a symbol.
* Closures:: Functions that enclose a lexical environment.
* OClosures:: Function objects
* OClosures:: Function objects with meta-data.
* Advising Functions:: Adding to the definition of a function.
* Obsolete Functions:: Declaring functions obsolete.
* Inline Functions:: Functions that the compiler will expand inline.
@ -1586,56 +1586,69 @@ examining or altering the structure of closure objects.
@node OClosures
@section Open Closures
@cindex oclosures
@cindex open closures
Traditionally, functions are opaque objects which offer no other
functionality but to call them. Emacs Lisp functions aren't fully
Traditionally, functions are opaque objects which offer no other
functionality but to call them. (Emacs Lisp functions aren't fully
opaque since you can extract some info out of them such as their
docstring, their arglist, or their interactive spec, but they are
mostly opaque. This is usually what we want, but occasionally we need
functions to expose a bit more information about themselves.
still mostly opaque.) This is usually what we want, but occasionally
we need functions to expose a bit more information about themselves.
OClosures are functions which carry additional type information,
and expose some information in the form of slots which you can access
@dfn{Open closures}, or @dfn{OClosures} for short, are function
objects which carry additional type information and expose some
information about themselves in the form of slots which you can access
via accessor functions.
They are defined in two steps: first @code{oclosure-define} is used to
define new OClosure types by specifying the slots carried by those
OClosures, and then @code{oclosure-lambda} is used to create an
OClosure object of a given type.
OClosures are defined in two steps: first you use
@code{oclosure-define} to define a new OClosure type by specifying the
slots carried by the OClosures of this type, and then you use
@code{oclosure-lambda} to create an OClosure object of a given type.
Let's say we want to define keyboard macros, i.e.@: interactive
functions which re-execute a sequence of key events (@pxref{Keyboard
Macros}). You could do it with a plain function as follows:
Say we want to define keyboard macros, i.e. interactive functions
which re-execute a sequence of key events. You could do it with
a plain function as follows:
@example
(defun kbd-macro (key-sequence)
(lambda (&optional arg)
(interactive "P")
(execute-kbd-macro key-sequence arg)))
@end example
@noindent
But with such a definition there is no easy way to extract the
@var{key-sequence} from that function, for example to print it.
We can solve this problem using OClosures as follows. First we define
the type of our keyboard macros (to which we decided to add
a @code{counter} slot while at it):
@example
(oclosure-define kbd-macro
"Keyboard macro."
keys (counter :mutable t))
@end example
@noindent
After which we can rewrite our @code{kbd-macro} function:
@example
(defun kbd-macro (key-sequence)
(oclosure-lambda (kbd-macro (keys key-sequence) (counter 0))
(&optional arg)
(interactive "p")
(interactive "P")
(execute-kbd-macro keys arg)
(setq counter (1+ counter))))
@end example
@noindent
As you can see, the @code{keys} and @code{counter} slots of the
OClosure can be accessed as local variables from within the body
of the OClosure. But we can now also access them from outside of the
body of the OClosure, for example to describe a keyboard macro:
@example
(defun describe-kbd-macro (km)
(if (not (eq 'kbd-macro (oclosure-type km)))
@ -1644,55 +1657,90 @@ body of the OClosure, for example to describe a keyboard macro:
(counter (kbd-macro--counter km)))
(message "Keys=%S, called %d times" keys counter))))
@end example
@noindent
Where @code{kbd-macro--keys} and @code{kbd-macro--counter} are
accessor functions generated by the @code{oclosure-define} macro.
accessor functions generated by the @code{oclosure-define} macro for
oclosures whose type is @code{kbd-macro}.
@defmac oclosure-define name &optional docstring &rest slots
@defmac oclosure-define oname &optional docstring &rest slots
This macro defines a new OClosure type along with accessor functions
for its slots. @var{name} can be a symbol (the name of
the new type), or a list of the form @code{(@var{name} . @var{type-props})} in
which case @var{type-props} is a list of additional properties.
@var{slots} is a list of slot descriptions where each slot can be
either a symbol (the name of the slot) or it can be of the form
@code{(@var{slot-name} . @var{slot-props})} where @var{slot-props} is
a property list.
for its @var{slots}. @var{oname} can be a symbol (the name of the new
type), or a list of the form
@w{@code{(@var{oname} . @var{type-props})}}, in which case
@var{type-props} is a list of additional properties of this oclosure
type. @var{slots} is a list of slot descriptions where each slot can
be either a symbol (the name of the slot) or it can be of the form
@w{@code{(@var{slot-name} . @var{slot-props})}}, where
@var{slot-props} is a property list of the corresponding slot
@var{slot-name}.
The OClosure type's properties specified by @var{type-props} can
include the following:
For each slot, the macro creates an accessor function named
@code{@var{name}--@var{slot-name}}. By default slots are immutable.
If you need a slot to be mutable, you need to specify it with the
@code{:mutable} slot property, after which it can be mutated for
example with @code{setf}.
@table @code
@item (:predicate @var{pred-name})
This requests creation of a predicate function named @var{pred-name}.
This function will be used to recognize OClosures of the type
@var{oname}. If this type property is not specified,
@code{oclosure-define} will generate a default name for the
predicate.
@item (:parent @var{otype})
This makes type @var{otype} of OClosures be the parent of the type
@var{oname}. The OClosures of type @var{oname} inherit the
@var{slots} defined by their parent type.
@c FIXME: Is the above description of :parent correct?
@item (:copier @var{copier-name} @var{copier-args})
This causes the definition of a functional update function, knows as
the @dfn{copier}, which takes an OClosure of type @var{oname} as its
first argument and returns a copy of it with the slots named in
@var{copier-args} modified to contain the value passed in the
corresponding argument in the actual call to @var{copier-name}.
@end table
Beside slot accessors, the macro can create a predicate and
functional update functions according to @var{type-props}:
a @code{(:predicate @var{pred-name})} in the @var{type-props} causes
the definition of a predicate function under the name @var{pred-name},
and @code{(:copier @var{copier-name} @var{copier-arglist})} causes the
definition of a functional update function which takes an OClosure of
type @var{name} as first argument and returns a copy of it with the
slots named in @var{copier-arglist} modified to the value passed in the
corresponding argument.
For each slot in @var{slots}, the @code{oclosure-define} macro creates
an accessor function named @code{@var{oname}--@var{slot-name}}; these
can be used to access the values of the slots. The slot definitions
in @var{slots} can specify the following properties of the slots:
@table @code
@item :mutable @var{val}
By default, slots are immutable, but if you specify the
@code{:mutable} property with a non-@code{nil} value, the slot can be
mutated, for example with @code{setf} (@pxref{Setting Generalized
Variables}).
@c FIXME: Some rationale and meaning of immutable slot is probably in
@c order here.
@item :type @var{val-type}
This specifies the type of the values expected to appear in the slot.
@c FIXME: What will happen if the value is of a different type? error?
@end table
@end defmac
@defmac oclosure-lambda (type . slots) arglist &rest body
This macro creates an anonymous OClosure of type @var{type}.
@var{slots} should be a list of elements of the form @code{(@var{slot-name}
@var{exp})}.
At run time, each @var{exp} is evaluated, in order, after which
the OClosure is created with its slots initialized with the
resulting values.
This macro creates an anonymous OClosure of type @var{type}, which
should have been defined with @code{oclosure-define}. @var{slots}
should be a list of elements of the form
@w{@code{(@var{slot-name} @var{expr})}}. At run time, each @var{expr}
is evaluated, in order, after which the OClosure is created with its
slots initialized with the resulting values.
When called as a function, the OClosure will accept arguments
according to @var{arglist} and will execute the code in @var{body}.
@var{body} can refer to the value of any of its slot directly as if it
were a local variable that had been captured by static scoping.
When called as a function (@pxref{Calling Functions}), the OClosure
created by this macro will accept arguments according to @var{arglist}
and will execute the code in @var{body}. @var{body} can refer to the
value of any of its slot directly as if it were a local variable that
had been captured by static scoping.
@end defmac
@defun oclosure-type object
This function returns the OClosure type (a symbol) of @var{object} if it is an
OClosure, and @code{nil} otherwise.
This function returns the OClosure type (a symbol) of @var{object} if
it is an OClosure, and @code{nil} otherwise.
@end defun
One other function related to OClosures is
@code{oclosure-interactive-form}, which allows some types of OClosures
to compute their interactive forms dynamically. @xref{Using
Interactive, oclosure-interactive-form}.
@node Advising Functions
@section Advising Emacs Lisp Functions

View file

@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/erc.info
@settitle ERC Manual
@set ERCVER 5.4.1
@set ERCVER 5.5
@set ERCDIST as distributed with Emacs @value{EMACSVER}
@include docstyle.texi
@syncodeindex fn cp

View file

@ -44,8 +44,13 @@ The 'networks' module is now all but required for everyday interactive
use. A default member of 'erc-modules' since ERC 5.3, 'networks' has
grown increasingly integral to core client operations over the years.
From now on, only the most essential operations will be officially
supported in its absence, and users will see a warning upon
entry-point invocation when it's not present.
supported in its absence, and users will see a warning upon invoking
an entry point, like 'erc-tls', when that's the case.
On a related note, the function 'erc-network' now always returns
non-nil in buffers created by a successfully established IRC
connection, even after that connection has been closed. This was done
to aid the overall effort to improve buffer association.
** Tighter auth-source integration.
The days of hit-and-miss auth-source queries are hopefully behind us.
@ -77,12 +82,14 @@ now avoids any hijacking of the active window as well.
Beyond this, additional flexibility is now available for controlling
the behavior of newly created target buffers during reconnection.
See the option 'erc-reconnect-display' for more.
** Improved handling of multiline prompt input.
This means better detection and handling of intervening and trailing
blanks when 'erc-send-whitespace-lines' is active. New options have
also been added for warning when input spans multiple lines. Although
off by default, new users are encouraged to enable them.
off by default, new users are encouraged to enable them. See options
'erc-inhibit-multiline-input' and 'erc-ask-about-multiline-input'.
** URL handling has improved.
Clicking on 'irc://' and 'ircs://' links elsewhere in Emacs now does
@ -91,6 +98,21 @@ users are now prompted to confirm connection parameters prior to lift
off. See the new '(erc) Integrations' section in the Info manual for
details.
** ERC's major-mode hook now runs slightly later.
The function 'erc-open' now delays running 'erc-mode-hook' until ERC's
prompt and its bounding markers and many essential local variables
have been initialized. Those essentials include the familiar
'erc-default-recipients', 'erc-server-users', and 'erc-network', as
well as the various "session" variables, like 'erc-session-connector'.
ERC activates "local modules" immediately afterward, just before
running 'erc-connect-pre-hook', which is still useful for gaining a
full accounting of what's been set.
In similar news, 'erc-open' no longer calls 'erc-update-modules'.
However, it still activates modules in a similar fashion, meaning,
among other things, global-module setup still occurs before major-mode
activation (something that's here to stay for compatibility reasons).
** Miscellaneous behavioral changes impacting the user experience.
A bug has been fixed that saw prompts being mangled, doubled, or
erased in server buffers upon disconnection. Instead, input prompts
@ -99,58 +121,61 @@ now collapse into an alternate form designated by the option
but can be fine-tuned via the repurposed, formerly abandoned option
'erc-hide-prompt'.
Certain commands provided by the 'erc-match' module, such as
'erc-add-keyword', 'erc-add-pal', and others, now optionally ask
whether to 'regexp-quote' the current input. A new option,
'erc-match-quote-when-adding', has been added to allow for retaining
the old behavior, if desired.
Another fix-turned-feature involves certain commands provided by the
'erc-match' module, such as 'erc-add-keyword', 'erc-add-pal', and
others, which now optionally offer to 'regexp-quote' the current
input. The old behavior, if desired, can still be had via the new
option 'erc-match-quote-when-adding'.
A bug has been fixed affecting users of the Soju bouncer: outgoing
messages during periods of heavy traffic no longer disappear.
Although rare, server passwords containing white space are now handled
correctly.
** Miscellaneous behavioral changes in the library API.
A number of core macros and other definitions have been moved to a new
file called erc-common.el. This was done to further lessen the
various complications arising from the mutual dependency between 'erc'
and 'erc-backend'.
ERC now relies on the Compat library from GNU ELPA to supply forward
compatibility shims for users running older versions of Emacs. The
required Compat version resides atop ERC's main library file, in the
'Package-Requires' header. Third-party ERC modules will benefit
automatically from this adoption.
The function 'erc-network' always returns non-nil in server and target
buffers belonging to a successfully established IRC connection, even
after that connection has been closed. (Also see the note in the
section above about the 'networks' module basically being mandatory.)
In 5.4, support for network symbols as keys was added for
In 5.4, support for using network symbols as keys was added for
'erc-autojoin-channels-alist'. This has been extended to include
explicit symbols passed to 'erc-tls' and 'erc' as so-called
network-context identifiers via a new ':id' keyword. The latter
carries wider significance beyond autojoin and can be used for
unequivocally identifying a connection in a human-readable way.
The function 'erc-auto-query' was deemed too difficult to reason
through and has thus been deprecated with no public replacement; it
has also been removed from the client code path.
A number of UX-centric bug fixes accompany this release. For example,
spaces are now possible in server passwords, and users of the Soju
bouncer should no longer see outgoing messages pile up during periods
of heavy traffic. See the Emacs change log for the full complement.
The function 'erc-open' now delays running 'erc-mode-hook' members
until most local session variables have been initialized (minus those
connection-related ones in erc-backend). 'erc-open' also no longer
calls 'erc-update-modules', although modules are still activated
in an identical fashion.
** Miscellaneous behavioral changes in the library API.
A number of core macros and other definitions have been moved to a new
file called erc-common.el. This was done to help mitigate various
complications arising from the mutual dependency between 'erc' and
'erc-backend'.
Some groundwork has been laid for what may become a new breed of ERC
module, namely, "connection-local" (or simply "local") modules.
Also on the maintainability front, ERC now relies on the Compat
library from GNU ELPA to supply forward compatibility shims for users
running older versions of Emacs. The required Compat version resides
atop ERC's main library file, in the 'Package-Requires' header.
Third-party modules should benefit automatically from its adoption.
A few internal variables have been introduced that could just as well
have been made public, possibly as user options. Likewise for some
internal functions. As always, users needing such functionality
In an effort to help further tame ERC's complexity, the variable
'erc-default-recipients' is now expected to hold but a single target.
As a consequence, functions like 'erc-add-default-channel' that
imagine an alternate, aspirational model of buffer-target relations
have been deprecated. See Emacs change-log entries from around July
of 2022 for specifics.
A number of less consequential deprecations also debut in this
release. For example, the function 'erc-auto-query' was deemed too
difficult to understand, behavior wise, and has thus been stricken
from the client code path with no public replacement. Although likely
uncontroversial, such changes may still spell disruption for some. If
you find yourself among them and in need of explanations, please see
related entries in the change log and discussions on the bug tracker.
Although this release is light on API features, some groundwork has
been laid for what may become a new breed of ERC module, namely,
"connection-local" (or simply "local") modules. This marks a small
but crucial step forward toward a more flexible and granular revamping
of ERC's long touted extensibility. See the Info node "(erc) Local
Modules" for details.
Lastly, a few internal variables have been introduced that could just
as well have been made public, possibly as user options. Likewise for
some internal functions. As always, users needing such functionality
officially exposed are encouraged to write to emacs-erc@gnu.org.

View file

@ -3231,8 +3231,11 @@ manually if needed, using the new user options 'wallpaper-command' and
+++
** New package 'oclosure'.
This allows the creation of "functions with slots" or "function
objects" via the macros 'oclosure-define' and 'oclosure-lambda'.
This allows the creation of OClosures, which are "functions with
slots" or "function objects" that expose additional information about
themselves. Use the new macros 'oclosure-define' and
'oclosure-lambda' to create OClosures. See the "(elisp) OClosures"
node for more information.
+++
*** New generic function 'oclosure-interactive-form'.

View file

@ -405,7 +405,7 @@ This doesn't solicit or validate a suite of supported mechanisms."
(erc-sasl--destroy proc))
(define-erc-response-handler (908)
"Handle a RPL_SASLALREADY response." nil
"Handle a RPL_SASLMECHS response." nil
(erc-display-message parsed '(notice error) 'active 's908
?m (alist-get 'mechanism erc-sasl--options)
?s (string-join (cdr (erc-response.command-args parsed))
@ -426,7 +426,8 @@ Otherwise, expect it to disappear in subsequent versions.")
(erc-server-send (if erc-sasl--send-cap-ls "CAP LS" "CAP REQ :sasl"))
(let ((erc-session-password
(and erc-session-password
(not (eq :password (alist-get 'password erc-sasl--options)))
(not (eq :password
(alist-get 'password erc-sasl--options)))
erc-session-password))
(erc-session-username
;; The username may contain a colon or a space

View file

@ -12,8 +12,8 @@
;; David Edmondson (dme@dme.org)
;; Michael Olson (mwolson@gnu.org)
;; Kelvin White (kwhite@gnu.org)
;; Version: 5.4.1
;; Package-Requires: ((emacs "27.1") (compat "28.1.2.0"))
;; Version: 5.5
;; Package-Requires: ((emacs "27.1") (compat "29.1.3.4"))
;; Keywords: IRC, chat, client, Internet
;; URL: https://www.gnu.org/software/emacs/erc.html
@ -71,7 +71,7 @@
(require 'iso8601)
(eval-when-compile (require 'subr-x) (require 'url-parse))
(defconst erc-version "5.4.1"
(defconst erc-version "5.5"
"This version of ERC.")
(defvar erc-official-location
@ -86,7 +86,8 @@
'(ERC ("5.2" . "22.1")
("5.3" . "23.1")
("5.4" . "28.1")
("5.4.1" . "29.1")))
("5.4.1" . "29.1")
("5.5" . "29.1")))
(defgroup erc nil
"Emacs Internet Relay Chat client."

View file

@ -873,6 +873,11 @@ the new frame according to its own rules."
(interactive)
(let* ((display (cdr (assq 'display parameters)))
(w (cond
;; When running in a batch session, don't create a GUI
;; frame. (Batch sessions don't set a SIGIO handler on
;; relevant platforms, so attempting this would terminate
;; Emacs.)
(noninteractive nil)
((assq 'terminal parameters)
(let ((type (terminal-live-p
(cdr (assq 'terminal parameters)))))

View file

@ -1924,7 +1924,6 @@ If it is activated, also signal textDocument/didOpen."
;; about the buffer.
(run-hooks 'eglot-managed-mode-hook))))
(add-hook 'find-file-hook 'eglot--maybe-activate-editing-mode)
(add-hook 'after-change-major-mode-hook 'eglot--maybe-activate-editing-mode)
(defun eglot-clear-status (server)
@ -3603,8 +3602,10 @@ If NOERROR, return predicate, else erroring function."
(goto-char (eglot--lsp-position-to-point position))
(when (or (> (point) to) (< (point) from)) (cl-return))
(let ((left-pad (and paddingLeft
(not (eq paddingLeft :json-false))
(not (memq (char-before) '(32 9))) " "))
(right-pad (and paddingRight
(not (eq paddingRight :json-false))
(not (memq (char-after) '(32 9))) " ")))
(cl-flet
((do-it (text lpad rpad)

View file

@ -427,7 +427,7 @@ what the parent of the node would be if it were a node."
(treesit-major-mode-setup)))
(if (treesit-language-available-p 'gomod)
(if (treesit-ready-p 'gomod)
(add-to-list 'auto-mode-alist '("/go\\.mod\\'" . go-mod-ts-mode)))
(provide 'go-ts-mode)

View file

@ -1087,7 +1087,7 @@ lisp_free (void *block)
BLOCK_BYTES and guarantees they are aligned on a BLOCK_ALIGN boundary. */
/* Byte alignment of storage blocks. */
#define BLOCK_ALIGN (1 << 10)
#define BLOCK_ALIGN (1 << 15)
verify (POWER_OF_2 (BLOCK_ALIGN));
/* Use aligned_alloc if it or a simple substitute is available.

View file

@ -2333,6 +2333,9 @@ set_intervals_multibyte_1 (INTERVAL i, bool multi_flag,
if (TOTAL_LENGTH (i) == 0)
{
/* Delete the whole subtree. */
i->left = NULL;
i->right = NULL;
delete_interval (i);
return;
}