emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp f5ea65b 2/2: Merge remote-tracking branch 'savannah/


From: Andrea Corallo
Subject: feature/native-comp f5ea65b 2/2: Merge remote-tracking branch 'savannah/master' into HEAD
Date: Thu, 4 Jun 2020 05:48:56 -0400 (EDT)

branch: feature/native-comp
commit f5ea65b43678621cb450d7afbcd46032258d4b20
Merge: e4e6bb7 4fff650
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Merge remote-tracking branch 'savannah/master' into HEAD
---
 doc/emacs/buffers.texi       |    9 +-
 doc/emacs/maintaining.texi   |   11 +
 doc/misc/cc-mode.texi        |    4 +-
 etc/NEWS                     |    8 +-
 etc/TODO                     | 1360 ++++++++++++++++++++++--------------------
 lisp/button.el               |    2 +-
 lisp/dnd.el                  |    3 -
 lisp/emacs-lisp/bytecomp.el  |    7 +-
 lisp/jsonrpc.el              |   74 +--
 lisp/language/hebrew.el      |    2 +-
 lisp/language/misc-lang.el   |    8 +-
 lisp/ldefs-boot.el           |  297 +++++----
 lisp/progmodes/cc-align.el   |   22 +-
 lisp/progmodes/cc-mode.el    |    2 +-
 lisp/progmodes/elisp-mode.el |    7 +-
 lisp/progmodes/etags.el      |    4 +-
 lisp/progmodes/project.el    |  103 ++--
 lisp/progmodes/xref.el       |   32 +-
 lisp/tab-bar.el              |    7 +-
 src/alloc.c                  |   57 +-
 src/composite.c              |    4 +-
 src/emacs.c                  |    5 +-
 src/lread.c                  |   21 +-
 src/pdumper.c                |    2 +-
 src/xdisp.c                  |    7 +-
 src/xfaces.c                 |   24 +-
 test/src/xfaces-tests.el     |   27 +
 27 files changed, 1165 insertions(+), 944 deletions(-)

diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi
index 6a53942..89ed470 100644
--- a/doc/emacs/buffers.texi
+++ b/doc/emacs/buffers.texi
@@ -741,7 +741,14 @@ Ido'').  Among other things, in Fido mode, @kbd{C-s} and 
@kbd{C-r} are
 also used to rotate the completions list, @kbd{C-k} can be used to
 delete files and kill buffers in-list.  Another noteworthy aspect is
 that @code{flex} is used as the default completion style
-(@pxref{Completion Styles}).
+(@pxref{Completion Styles}).  To change this, add the following to
+your initialization file (@pxref{Init File}):
+
+@example
+(defun my-icomplete-styles ()
+  (setq-local completion-styles '(initials flex)))
+(add-hook 'icomplete-minibuffer-setup-hook 'my-icomplete-styles)
+@end example
 
   To enable Fido mode, type @kbd{M-x fido-mode}, or customize
 the variable @code{fido-mode} to @code{t} (@pxref{Easy
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index 22b7639..cc7415e 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -1718,6 +1718,17 @@ continue with @w{@kbd{M-x fileloop-continue @key{RET}}}.
 (@pxref{Dired}) listing the files in the current project's root
 directory.
 
+@findex project-vc-dir
+  The command @code{project-vc-dir} opens a VC Directory buffer
+(@pxref{VC Directory Mode}) listing the version control statuses of
+the files in a directory tree under the current project's
+root directory.
+
+@findex project-shell
+  The command @code{project-shell} starts a shell session
+(@pxref{Shell}) in a new buffer with the current project's root as the
+working directory.
+
 @findex project-eshell
   The command @code{project-eshell} starts an Eshell session in a new
 buffer with the current project's root as the working directory.
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 16eac48..10bbf8f 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -6399,8 +6399,8 @@ function is the same as specifying a list 
@code{(c-lineup-assignments
 @findex lineup-ternary-bodies @r{(c-)}
 Line up true and false branches of a ternary operator
 (i.e. @code{?:}).  More precisely, if the line starts with a colon
-which is a part of a said operator it with corresponding question
-mark.  For example:
+which is a part of a said operator, align it with corresponding
+question mark.  For example:
 
 @example
 @group
diff --git a/etc/NEWS b/etc/NEWS
index 3086ffa..ed4722b 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -411,15 +411,19 @@ information, see the related entry about 'shr-browse-url' 
above.
 all commands that prompt for a project directory.
 
 +++
-*** New commands 'project-dired' and 'project-eshell'.
-These commands run Dired and Eshell in a project's root directory,
+*** New commands 'project-dired', 'project-vc-dir', 'project-shell', 
'project-eshell'.
+These commands run Dired/VC-Dir and Shell/Eshell in a project's root directory,
 respectively.
 
+*** New command 'project-compile', which runs compilation.
+
 +++
 *** New command 'project-switch-project'.
 This command lets you "switch" to another project and run a project
 command chosen from a dispatch menu.
 
+*** New user option 'project-list-file'.
+
 ** json.el
 
 ---
diff --git a/etc/TODO b/etc/TODO
index 0f908de..152a299 100644
--- a/etc/TODO
+++ b/etc/TODO
@@ -30,14 +30,15 @@ difficult to fix.  Bugs with severity "minor" may be 
simpler, but this
 is not always true.
 
 * Speed up Elisp execution
+
 ** Speed up function calls
 Change src/bytecode.c so that calls from byte-code functions to byte-code
 functions don't go through Ffuncall/funcall_lambda/exec_byte_code but instead
 stay within exec_byte_code.
 
-** Improve the byte-compiler to recognize immutable (lexical) bindings
-and get rid of them if they're used only once and/or they're bound to
-a constant expression.
+** Improve the byte-compiler to recognize immutable bindings
+Recognize immutable (lexical) bindings and get rid of them if they're
+used only once and/or they're bound to a constant expression.
 
 Such things aren't present in hand-written code, but macro expansion and
 defsubst can often end up generating things like
@@ -45,7 +46,8 @@ defsubst can often end up generating things like
 (let ((arg actual)) (body)) but should additionally get optimized further
 when 'actual' is a constant/copyable expression.
 
-** Add an "indirect goto" byte-code and use it for local lambda expressions.
+** Add an "indirect goto" byte-code
+Such a byte-code can be used for local lambda expressions.
 E.g. when you have code like
 
    (let ((foo (lambda (x) bar)))
@@ -56,7 +58,6 @@ E.g. when you have code like
 turn those 'funcalls' into jumps and their return into indirect jumps back.
 
 ** Compile efficiently local recursive functions
-
 Similar to the previous point, we should be able to handle something like
 
    (letrec ((loop () (blabla) (if (toto) (loop))))
@@ -68,153 +69,175 @@ which ideally should generate the same byte-code as
 
 * Things that were planned for Emacs-24
 
-** concurrency: including it as an "experimental" compile-time option
-  sounds good.  Of course there might still be big questions around "which form
-  of concurrency" we'll want.
-** better support for dynamic embedded graphics: I like this idea (my
-  mpc.el code could use it for the volume widget), though I wonder if the
-  resulting efficiency will be sufficient.
-** Spread Semantic.
-** Improve the "code snippets" support: consolidate skeleton.el, tempo.el,
-  and expand.el (any other?) and then advertise/use/improve it.
-** Improve VC: yes, there's a lot of work to be done there :-(
-
-** Random things that cross my mind right now that I'd like to see (some of
-them from my local hacks), but it's not obvious at all whether they'll
-make it.
-*** prog-mode could/should provide a better fill-paragraph default
-  that uses syntax-tables to recognize string/comment boundaries.
-*** provide more completion-at-point-functions.  Make existing
-  in-buffer completion use completion-at-point.
-*** "functional" function-key-map that would make it easy to add (and
-  remove) mappings like "FOO-mouse-4 -> FOO-scroll-down",
-  "FOO-tab -> ?\FOO-\t", "uppercase -> lowercase", "[fringe KEY...] ->
-  [KEY]", "H-FOO -> M-FOO", "C-x C-y FOO -> H-FOO", ...
+** concurrency
+Including it as an "experimental" compile-time option sounds good.  Of
+course there might still be big questions around "which form of
+concurrency" we'll want.
+
+** better support for dynamic embedded graphics
+I like this idea (my mpc.el code could use it for the volume widget),
+though I wonder if the resulting efficiency will be sufficient.
+
+** Spread Semantic
+
+** Improve the "code snippets" support
+Consolidate skeleton.el, tempo.el, and expand.el (any other?) and then
+advertise/use/improve it.
+
+** Improve VC
+Yes, there's a lot of work to be done there :-(
+
+** Random things that cross my mind right now that I'd like to see
+Some of them from my local hacks, but it's not obvious at all whether
+they'll make it.
+
+*** Prog-mode could/should provide a better fill-paragraph default
+That default should use syntax-tables to recognize string/comment
+boundaries.
+
+*** Provide more completion-at-point-functions
+Make existing in-buffer completion use completion-at-point.
+
+*** "Functional" function-key-map
+It would make it easy to add (and remove) mappings like
+"FOO-mouse-4 -> FOO-scroll-down",   "FOO-tab -> ?\FOO-\t",
+"uppercase -> lowercase", "[fringe KEY...] -> [KEY]",
+"H-FOO -> M-FOO", "C-x C-y FOO -> H-FOO", ...
 
 * Things related to elpa.gnu.org.
 
-** Move idlwave to elpa.gnu.org.
+** Move idlwave to elpa.gnu.org
 Need to sync up the Emacs and external versions.
 See <https://lists.gnu.org/r/emacs-devel/2014-07/msg00008.html>
 
-** Move Org mode to elpa.gnu.org.
+** Move Org mode to elpa.gnu.org
 See <https://lists.gnu.org/r/emacs-devel/2014-08/msg00300.html>
 <https://lists.gnu.org/r/emacs-devel/2014-11/msg00257.html>
 
-** Move verilog-mode to elpa.gnu.org.
+** Move verilog-mode to elpa.gnu.org
 See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
 
-** Move vhdl-mode to elpa.gnu.org.
+** Move vhdl-mode to elpa.gnu.org
 See <https://lists.gnu.org/r/emacs-devel/2015-02/msg01180.html>
 
-* Simple tasks. These don't require much Emacs knowledge, they are
-suitable for anyone from beginners to experts.
+* Simple tasks
+These don't require much Emacs knowledge, they are suitable for anyone
+from beginners to experts.
 
-** Convert modes that use view-mode to be derived from special-mode instead.
+** Convert modes that use view-mode to be derived from special-mode instead
 
-** Major modes should have a menu entry.
+** Major modes should have a menu entry
 
-** Check if all items on the mode-line have a suitable tooltip for all modes.
+** Check if all items on the mode-line have a suitable tooltip for all modes
 
-** edebug and debugger-mode should have a toolbar.
+** edebug and debugger-mode should have a toolbar
 It can use the same icons as gud.
 
-** Check what minor modes don't use define-minor-mode and convert them
-to use it.
+** Check what minor modes don't use define-minor-mode
+Convert those to use it.
 
-** Remove unnecessary autoload cookies from defcustoms.
+** Remove unnecessary autoload cookies from defcustoms
 This needs a bit of care, since often people have become used to
 expecting such variables to always be defined, eg when they modify
 things in their .emacs.
 
-** See if other files can use generated-autoload-file (see eg ps-print).
+** See if other files can use generated-autoload-file (see eg ps-print)
+
+** Write more tests
+Pick a fixed bug from the database, write a test case to make sure it
+stays fixed.  Or pick your favorite programming major-mode, and write
+a test for its indentation.  Or a version control backend, and write a
+test for its status parser.  Etc.  See the 'test' directory for
+examples.
 
-** Write more tests.  Pick a fixed bug from the database, write a test
-case to make sure it stays fixed.  Or pick your favorite programming
-major-mode, and write a test for its indentation.  Or a version
-control backend, and write a test for its status parser.  Etc.
-See the 'test' directory for examples.
+* Small but important fixes needed in existing features
 
-* Small but important fixes needed in existing features:
+** A better display of the bar cursor
+Distribute a bar cursor of width > 1 evenly between the two glyphs on
+each side of the bar (what to do at the edges?).
 
-** Distribute a bar cursor of width > 1 evenly between the two glyphs
-   on each side of the bar (what to do at the edges?).
+** revert-buffer should eliminate overlays and the mark
+For related problems consult the thread starting with
+https://lists.gnu.org/r/emacs-devel/2005-11/msg01346.html
 
-** revert-buffer should eliminate overlays and the mark.
-   For related problems consult the thread starting with
-   https://lists.gnu.org/r/emacs-devel/2005-11/msg01346.html
+** erase-buffer should perhaps disregard read-only properties of text
 
-** erase-buffer should perhaps disregard read-only properties of text.
+** Fix the kill/yank treatment of invisible text
+At the moment, invisible text is placed in the kill-ring, so that the
+contents of the ring may not correspond to the text as displayed to
+the user.  It ought to be possible to omit text which is invisible
+(due to a text-property, overlay, or selective display) from the
+kill-ring.
 
-** Fix the kill/yank treatment of invisible text.  At the moment,
-  invisible text is placed in the kill-ring, so that the contents of
-  the ring may not correspond to the text as displayed to the user.
-  It ought to be possible to omit text which is invisible (due to a
-  text-property, overlay, or selective display) from the kill-ring.
+** Change cursor shape when Emacs is idle
+When Emacs is idle for more than a specified time, change the cursor
+shape to indicate the idleness.
 
-** Feature to change cursor shape when Emacs is idle (for more than
-  a specified time).
+** Improve buttons in the Custom buffer
+The buttons at the top of a Custom buffer should not omit variables
+whose values are currently hidden.
 
-** The buttons at the top of a custom buffer should not omit
-  variables whose values are currently hidden.
+** Clean up the variables in browse-url
+Perhaps use a shell command string to specify the browser instead of
+the mushrooming set of functions.
 
-** Clean up the variables in browse-url.  Perhaps use a shell command string to
-  specify the browser instead of the mushrooming set of functions.
-  See also ESR's proposal for a BROWSER environment variable
-  <URL:http://www.catb.org/~esr/BROWSER/browse-url.patch>.
+See also ESR's proposal for a BROWSER environment variable
+<URL:http://www.catb.org/~esr/BROWSER/browse-url.patch>.
 
-** Enhance scroll-bar to handle tall line (similar to line-move).
+** Enhance scroll-bar to handle tall line (similar to line-move)
 
-** In Custom buffers, put the option that turns a mode on or off first,
-  using a heuristic of some kind?
+** In Custom buffers, put the option that turns a mode on or off first
+This should use a heuristic of some kind?
 
-** Define recompute-arg and recompute-arg-if for fix_command to use.
-  See rms message of 11 Dec 05 in
-  https://lists.gnu.org/r/emacs-pretest-bug/2005-12/msg00165.html,
-  and the rest of that discussion.
+** Define recompute-arg and recompute-arg-if for fix_command to use
+See rms message of 11 Dec 05 in
+https://lists.gnu.org/r/emacs-pretest-bug/2005-12/msg00165.html,
+and the rest of that discussion.
 
 ** In Emacs Info, examples of using Customize should be clickable
-   and they should create Custom buffers.
+They should create Custom buffers when clicked.
 
-** Add function to redraw the tool bar.
+** Add function to redraw the tool bar
 
-** Redesign the load-history data structure so it can cope better
-  with evaluating definitions of the same function from different files,
-  recording which file the latest definition came from.
+** Redesign the load-history data structure
+It should cope better with evaluating definitions of the same function
+from different files, recording which file the latest definition came
+from.
 
-** make back_comment use syntax-ppss or equivalent.
+** Make back_comment use syntax-ppss or equivalent
 
-** Consider improving src/sysdep.c's search for a fqdn.
+** Consider improving src/sysdep.c's search for a fqdn
 https://lists.gnu.org/r/emacs-devel/2007-04/msg00782.html
 
-** Find a proper fix for rcirc multiline nick adding.
+** Find a proper fix for rcirc multiline nick adding
 https://lists.gnu.org/r/emacs-devel/2007-04/msg00684.html
 
-** Check for any included packages that define obsolete bug-reporting commands.
+** Check for any included packages that define obsolete bug-reporting commands
 Change them to use report-emacs-bug.
-*** Related functions:
+
+*** Related functions (do all of them need changing?):
 **** org-submit-bug-report
 **** lm-report-bug
 **** tramp-bug
 **** c-submit-bug-report
-[Do all of them need changing?]
 
-** Allow fringe indicators to display a tooltip (provide a help-echo property?)
+** Allow fringe indicators to display a tooltip
+Provide a help-echo property?
 
-** Add a defcustom that supplies a function to name numeric backup files,
-like make-backup-file-name-function for non-numeric backup files.
+** Add a defcustom that supplies a function to name numeric backup files
+Like 'make-backup-file-name-function' for non-numeric backup files.
 
-** 'dired-mode' should specify the semantics of 'buffer-modified-p' for
-dired buffers and DTRT WRT 'auto-revert-mode'.
+** 'dired-mode' should specify the semantics of 'buffer-modified-p'
+Needed for dired buffers and DTRT WRT 'auto-revert-mode'.
 
-** Check uses of prin1 for error-handling.
+** Check uses of prin1 for error-handling
 https://lists.gnu.org/r/emacs-devel/2008-08/msg00456.html
 
-* Important features:
+* Important features
 
 ** "Emacs as word processor"
 https://lists.gnu.org/r/emacs-devel/2013-11/msg00515.html
-    rms writes:
+ rms writes:
     25 years ago I hoped we would extend Emacs to do WYSIWYG word
     processing.  That is why we added text properties and variable
     width fonts.  However, more features are still needed to achieve this.
@@ -333,13 +356,11 @@ to pass to 'hb_shape_full' the required array of 
features, as
 mentioned in the above HarfBuzz discussion.
 
 ** Better support for displaying Emoji
-
 Emacs is capable of displaying Emoji and some of the Emoji sequences,
 provided that its fontsets are configured with a suitable font.  To
 make this easier out of the box, the following should be done:
 
 *** Populate composition-function-table with Emoji rules
-
 The Unicode Character Database (UCD) includes several data files that
 define the valid Emoji sequences.  These files should be imported into
 the Emacs tree, and should be converted by some script at Emacs build
@@ -347,7 +368,6 @@ time to Lisp code that populates composition-function-table 
with the
 corresponding composition rules.
 
 *** Augment the default fontsets with Emoji-capable fonts
-
 The default fontsets set up by fontest.el should include known free
 fonts that provide good support for displaying Emoji sequences.  In
 addition, the rule that the default face's font is used for symbol and
@@ -358,7 +378,6 @@ not have to be tweaked to have Emoji display by default 
with a capable
 font.
 
 *** Consider changing the default display of Variation Selectors
-
 Emacs by default displays the Variation Selector (VS) codepoints not
 composed with base characters as hex codes in a box.  The Unicode FAQ
 says that if variation sequences cannot be supported, the VS
@@ -369,7 +388,6 @@ could display them as a thin 1-pixel space, as we do with 
format
 control characters, by using 'thin-space' there.
 
 *** Special face for displaying text presentation of Emoji
-
 Emoji-capable fonts support Emoji sequences with the U+FE0F VARIATION
 SELECTOR-16 (VS16) for emoji-style display, but usually don't support
 the U+FE0F VARIATION SELECTOR-15 (VS15) for text-style display.  There
@@ -387,6 +405,7 @@ Another relevant resource is the Unicode Technical Standard 
#51
 "Unicode Emoji" (http://www.unicode.org/reports/tr51/).
 
 ** Extend text-properties and overlays
+
 *** Several text-property planes
 This would get us rid of font-lock-face property (and I'd be happy to
 get rid of char-property-alias-alist as well) since font-lock would
@@ -408,7 +427,6 @@ generally can't run Elisp code, whereas we generally can do 
that when
 properties are added.
 
 *** Move overlays to intervals.c
-
 Currently overlays are implemented as (two) sorted singly linked lists (one
 for overlays_before some position and one for overlay_after that
 position, for some quirky definition of "before" and "after").
@@ -450,355 +468,383 @@ One way of doing this is to start with fx's dynamic 
loading, and use it
 to implement things like auto-loaded buffer parsers and database
 access in cases which need more than Lisp.
 
-** Fix portable dumping so that you can redump without using -batch.
+** Fix portable dumping so that you can redump without using -batch
 
 ** Imenu could be extended into a file-structure browsing mechanism
-using code like that of customize-groups.
+This could use code like that of customize-groups.
 
-** Display something in the margin on lines that have compilation errors.
+** Display something in the margin on lines that have compilation errors
 
-** Compilation error navigation bar, parallel to the scroll bar,
-indicating where in the buffer there are compilation errors.
-Perhaps we could arrange to display these error indications on top
-of the scroll bar itself.  That depends on to what extent toolkit
-scroll bars are extensible.
+** Compilation error navigation bar, parallel to the scroll bar
+The bar should indicate where in the buffer there are compilation
+errors.  Perhaps we could arrange to display these error indications
+on top of the scroll bar itself.  That depends on to what extent
+toolkit scroll bars are extensible.
 
-** Provide user-friendly ways to list all available font families,
-  list fonts, display a font as a sample, etc.  [fx is looking at
-  multilingual font selection for the Unicode branch of Emacs.]
+** Provide user-friendly ways to list all available font families
+Also for listing fonts, displaying a font as a sample, etc.
 
-** Provide a convenient way to select a color with the mouse.
+** Provide a convenient way to select a color with the mouse
 
-** Rewrite the face code to be simpler, clearer and faster.
+** Rewrite the face code to be simpler, clearer and faster
 
-** Program Enriched mode to read and save in RTF.  [Is there actually a
-  decent single definition of RTF?  Maybe see info at
-  http://latex2rtf.sourceforge.net/.]  This task seems to be addressed
-  by https://savannah.nongnu.org/projects/emacs-rtf/, which is still in
-  very early stages.
+** Program Enriched mode to read and save in RTF
+Is there actually a decent single definition of RTF?  Maybe see info at
+http://latex2rtf.sourceforge.net/.
 
-  Another place to look is the Wikipedia article at
-  http://en.wikipedia.org/wiki/Rich_Text_Format
+This task seems to be addressed by
+https://savannah.nongnu.org/projects/emacs-rtf/, which is still in
+very early stages.
 
-  It currently points to the latest spec of RTF v1.9.1 at
-  http://www.microsoft.com/en-us/download/details.aspx?id=10725
+Another place to look is the Wikipedia article at
+http://en.wikipedia.org/wiki/Rich_Text_Format.  It currently points to
+the latest spec of RTF v1.9.1 at
+https://web.archive.org/web/20190708132914/http://www.kleinlercher.at/tools/Windows_Protocols/Word2007RTFSpec9.pdf
 
-** Implement primitive and higher-level functions to allow filling
-  properly with variable-pitch faces.
+** Better support for variable-pitch faces
+Implement primitive and higher-level functions to allow filling
+properly with variable-pitch faces.
 
 ** Implement intelligent search/replace, going beyond query-replace
-  (see http://groups.csail.mit.edu/uid/projects/clustering/chi04.pdf).
+See http://groups.csail.mit.edu/uid/projects/clustering/chi04.pdf.
+
+** Implement other text formatting properties
+
+*** Footnotes that can appear either in place or at the end of the page
 
-** Implement other text formatting properties.
-*** Footnotes that can appear either in place or at the end of the page.
-*** text property that says "don't break line in middle of this".
-   Don't break the line between two characters that have the
-   same value of this property.
-*** Discretionary hyphens that are not visible when they are at end of line.
+*** text property that says "don't break line in middle of this"
+Don't break the line between two characters that have the same value
+of this property.
 
-** Internationalize Emacs's messages.
+*** Discretionary hyphens that are not visible when they are at end of line
 
-** Set up a facility to save backtraces when errors happen during
-specified filters, specified timers, and specified hooks.
+** Internationalize Emacs's messages
 
-** Install mmc@maruska.dyndns.org's no-flicker change.
+** Set up a facility to save backtraces
+Save backtraces when errors happen during specified filters, specified
+timers, and specified hooks.
 
-  https://lists.gnu.org/archive/html/emacs-devel/2005-12/msg00699.html
+** Install mmc@maruska.dyndns.org's no-flicker change
+https://lists.gnu.org/archive/html/emacs-devel/2005-12/msg00699.html
 
-  I don't know if this is still relevant.  I can't reach the URLs in
-  the above message thread and double-buffering may have solved some
-  of the problems.
+I don't know if this is still relevant.  I can't reach the URLs in
+the above message thread and double-buffering may have solved some
+of the problems.
 
-** Add a "current vertical pixel level" value that goes with point,
-  so that motion commands can also move through tall images.
-  This value would be to point as window-vscroll is to window-start.
+** Add a "current vertical pixel level" value
+This should go with point, so that motion commands can also move
+through tall images.  This value would be to point as window-vscroll
+is to window-start.
 
-** Address internationalization of symbols names essentially
-  as documentation, e.g. in command names and Custom.
+** Address internationalization of symbols names
+Essentially as if they were documentation, e.g. in command names and
+Custom.
 
-** Make the Lucid menu widget display multilingual text.  [This
-  probably needs to be done from actual Emacs buffers, either directly
-  in the menu or by rendering in an unmapped window and copying the
-  pixels.  The current code assumes a specific locale; that isn't good
-  enough even if X can render the arbitrary text] [The gtk
-  port now displays multilingual text in menus, but only insofar as
-  Emacs can encode it as utf-8 and gtk can display the result.]
-  Maybe making Lucid menus work like Gtk's (i.e. just force utf-8) is good
-  enough now that Emacs can encode most chars into utf-8.
+** Make the Lucid menu widget display multilingual text
+This probably needs to be done from actual Emacs buffers, either
+directly in the menu or by rendering in an unmapped window and copying
+the pixels.  The current code assumes a specific locale; that isn't
+good enough even if X can render the arbitrary text.  The gtk port now
+displays multilingual text in menus, but only insofar as Emacs can
+encode it as utf-8 and gtk can display the result.  Maybe making
+Lucid menus work like Gtk's (i.e. just force utf-8) is good enough now
+that Emacs can encode most chars into utf-8.
 
-** The GNUstep port needs some serious attention, ideally from someone
-familiar with GNUstep and Objective C.
+** The GNUstep port needs some serious attention
+Ideally from someone familiar with GNUstep and Objective C.
 
-* Other features we would like:
+* Other features we would like
 
-** A more modern printing interface.  One that pops up a dialog that lets
-you choose printer, page style, etc.
-Integration with the Gtk print dialog is apparently difficult.  See eg:
-https://lists.gnu.org/r/emacs-devel/2009-03/msg00501.html
+** A more modern printing interface
+A UI that pops up a dialog that lets you choose printer, page style,
+etc.  Integration with the Gtk print dialog is apparently difficult.
+See eg: https://lists.gnu.org/r/emacs-devel/2009-03/msg00501.html
 https://lists.gnu.org/r/emacs-devel/2009-04/msg00034.html
 
 ** Allow frames(terminals) created by emacsclient to inherit their environment
-from the emacsclient process.
+They should inherit environment from the emacsclient process.
 
-** Give Tar mode all the features of Archive mode.
+** Give Tar mode all the features of Archive mode
 
 ** Create a category of errors called 'process-error'
-  for some or all errors associated with using subprocesses.
+Do this for some or all errors associated with using subprocesses.
 
 ** Maybe reinterpret 'parse-error' as a category of errors
-  and put some other errors under it.
+Put some other errors under it.
 
-** Make byte-compile warn when a doc string is too wide.
+** Make byte-compiler warn when a doc string is too wide
 
-** Make byte-optimization warnings issue accurate line numbers.
+** Make byte-optimization warnings issue accurate line numbers
 
 ** Record the sxhash of the default value for customized variables
-  and notify the user (maybe by adding a menu item or toolbar button,
-  as the detection can occur during autoload time) when the default
-  changes (meaning that new versions of the Lisp source with a changed
-  default value got installed) and offer ediff on the respective
-  customization buffers.
+Also, the user (maybe by adding a menu item or toolbar button, as the
+detection can occur during autoload time) when the default changes
+(meaning that new versions of the Lisp source with a changed default
+value got installed) and offer ediff on the respective customization
+buffers.
 
-** Emacs Lisp mode could put an overlay on the defun for every
-  function that has advice.  The overlay could have 'after-text' like
-  " [Function has advice]".  It might look like (defun foo [Function
-  has advice] (x y) The overlay could also be a button that you could
-  use to view the advice.
+** Emacs Lisp mode could put an overlay on the defun for advised functions
+The overlay could have 'after-text' like " [Function has advice]".  It
+might look like (defun foo [Function has advice] (x y) The overlay
+could also be a button that you could use to view the advice.
 
-** Add a function to get the insertion-type of the markers in an overlay.
+** Add a function to get the insertion-type of the markers in an overlay
 
 ** ange-ftp
-*** understand sftp
-   This is hard to make work because sftp doesn't print status messages.
 
-*** Use MLS for ange-ftp-insert-directory if a list of files is specified.
+*** Make ange-ftp understand sftp
+This is hard to make work because sftp doesn't print status messages.
+
+*** Use MLS for ange-ftp-insert-directory if a list of files is specified
+
+** Ability to map a key, including all modified-combinations
+E.g map mouse-4 to wheel-up as well as M-mouse-4 -> M-wheel-up
+M-C-mouse-4 -> M-C-wheel-up, H-S-C-M-s-double-mouse-4 ->
+H-S-C-M-s-double-wheel-up, ...
+
+** Beefed-up syntax-tables
 
-** Ability to map a key, including all modified-combinations.
-   E.g map mouse-4 to wheel-up as well as M-mouse-4 -> M-wheel-up
-   M-C-mouse-4 -> M-C-wheel-up, H-S-C-M-s-double-mouse-4 ->
-   H-S-C-M-s-double-wheel-up, ...
+*** Recognize multi-character syntactic entities like 'begin' and 'end'
 
-** Beefed-up syntax-tables.
-*** recognize multi-character syntactic entities like 'begin' and 'end'.
-*** nested string-delimiters (for PostScript's (foo(bar)baz) strings).
-*** support for infix operators (with precedence).
-*** support for the $ (paired delimiter) in parse-partial-sexp.
-*** support for hook-chars whose effect on the parsing-state is specified
-       by elisp code.  Thus a char could both close a string and open a comment
-       at the same time and do it in a context-sensitive way.
-*** ability to add mode-specific data to the partial-parse-state.
+*** Nested string-delimiters (for PostScript's (foo(bar)baz) strings)
 
-** Add a way to convert a keyboard macro to equivalent Lisp code.
+*** Support for infix operators (with precedence)
 
-** Have a command suggestion help system that recognizes patterns
-  of commands which could be replaced with a simpler common command.
-  It should not make more than one suggestion per 10 minutes.
+*** Support for the $ (paired delimiter) in parse-partial-sexp
 
-** Add a way to define input methods by computing them (when first used)
-  from other input methods.  Then redefine C-x 8 to use a
-  user-selected input method, with the default being the union of
-  latin-1-prefix and latin-1-postfix.
+*** Support for hook-chars whose effect is specified by ELisp code
+Hook-chars could have their effect on the parsing-state specified by
+ELisp code.  Thus a character could both close a string and open a
+comment at the same time and do it in a context-sensitive way.
 
-** Implement a clean way to use different major modes for
-  different parts of a buffer.  This could be useful in editing
-  Bison input files, for instance, or other kinds of text
-  where one language is embedded in another language.  See
-  http://www.loveshack.ukfsn.org/emacs/multi-mode.el and also
-  mmm-mode, as reference for approaches taken by others.
+*** Ability to add mode-specific data to the partial-parse-state
 
-** Arrange a way for an input method to return the first character
-  immediately, then replace it later.  So that C-s a with
-  input method latin-1-postfix would immediately search for an a.
+** Add a way to convert a keyboard macro to equivalent Lisp code
 
-** Give start-process the ability to direct standard-error
-  output to a different filter.
+** Have a command suggestion help system
+The idea is to recognize patterns of commands which could be replaced
+with a simpler common command.  It should not make more than one
+suggestion per 10 minutes.
 
-** Give desktop.el a feature to switch between different named desktops.
+** Add a way to define input methods by computing them
+When an input method is first used, redefine C-x 8 to use a
+user-selected input method, with the default being the union of
+latin-1-prefix and latin-1-postfix.
 
-** Add a cpio mode, more or less like tar mode.
+** Implement a clean way to use several major modes in a buffer
+Different parts of a buffer could use different major modes.  This
+could be useful in editing Bison input files, for instance, or other
+kinds of text where one language is embedded in another language.  See
+http://www.loveshack.ukfsn.org/emacs/multi-mode.el and also mmm-mode,
+as reference for approaches taken by others.
+
+** A more convenient use of input methods in search
+Arrange a way for an input method to return the first character
+immediately, then replace it later.  So that C-s a with input method
+latin-1-postfix would immediately search for an a.
+
+** Give start-process the ability to redirect standard-error
+It should be possible to redirect stderr to a different filter.
+(Isn't this already possible in Emacs 27?)
+
+** Give desktop.el a feature to switch between different named desktops
+
+** Add a cpio mode, more or less like tar mode
 
 ** Save undo information in special temporary files, and reload it
-  when needed for undoing.  This could extend undo capacity.
-  undo-tree, in ELPA, already does this; its saving code could be
-  integrated without requiring the use of undo-tree.
+Reload the file when needed for undoing.  This could extend undo
+capacity.  undo-tree, in ELPA, already does this; its saving code
+could be integrated without requiring the use of undo-tree.
 
 ** Change the Windows NT menu code
-  so that it handles the deep_p argument and avoids
-  regenerating the whole menu bar menu tree except
-  when the user tries to use the menubar.
+Change the code so that it handles the deep_p argument and avoids
+regenerating the whole menu-bar menu tree except when the user tries
+to use the menubar.
+
+This requires the RIT to forward the WM_INITMENU message to the main
+thread, and not return from that message until the main thread has
+processed the MENU_BAR_ACTIVATE_EVENT and regenerated the whole menu
+bar.  In the mean time, it should process other messages.
+
+** Get some major packages installed
 
-  This requires the RIT to forward the WM_INITMENU message to
-  the main thread, and not return from that message until the main
-  thread has processed the MENU_BAR_ACTIVATE_EVENT and regenerated
-  the whole menu bar.  In the mean time, it should process other messages.
+*** W3 (development version needs significant work)
 
-** Get some major packages installed: W3 (development version needs
-  significant work), PSGML, _possibly_ ECB.
-  https://lists.gnu.org/r/emacs-devel/2007-05/msg01493.html
-  Check the assignments file for other packages which might go in and
-  have been missed.
+*** PSGML, _possibly_ ECB
+https://lists.gnu.org/r/emacs-devel/2007-05/msg01493.html Check the
+assignments file for other packages which might go in and have been
+missed.
 
-** Make compiler warnings about functions that might be undefined at run time
- smarter, so that they know which files are required by the file being
- compiled and don't warn about functions defined in them.
+** Make byte-compiler warnings smarter
+Byte-compiler warnings about functions that might be undefined at run
+time should be smarter, so that they know which files are required by
+the file being compiled and don't warn about functions defined in
+them.
 
-** Split out parts of lisp.h.
-
-** Update the FAQ.
-
-** Allow auto-compression-mode to use zlib calls if zlib is available.
-  [It's required for PNG, so may be linked anyhow.]
-
-** Improve the GC (generational, incremental).  (We may be able to use
-  the Boehm collector.)  [See the Boehm-GC branch in CVS for work on this.]
-
-** Check what hooks would help Emacspeak -- see the defadvising in W3.
-
-** Add definitions for symbol properties, for documentation purposes.
-
-** Temporarily remove scroll bars when they are not needed, typically
-  when a buffer can be fully displayed in its window.
-
-** Provide an optional feature which computes a scroll bar slider's
-  size and its position from lines instead of characters.
-
-** Allow displaying an X window from an external program in a buffer,
-  e.g. to render graphics from Java applets.  [gerd and/or wmperry
-  thought this was feasible.]
+** Split out parts of lisp.h
 
-** Allow images (not just text) in the margin to be mouse-sensitive.
-  (Requires recursing through display properties).  Provide some way
-  to simulate mouse-clicks on marginal text without a mouse.
+** Update the FAQ
 
-** Extend ps-print to deal with multiple font sizes, images, and extra
-  encodings.
-
-** Use the XIE X extension, if available, for image display.
-
-(Obsolete as XIE is now considered obsolete itself.)
-
-** Make monochrome images display using the foreground and background
-  colors of the applicable faces.
-
-** Make 'format-time-string' preserve text properties like 'format'.
-
-** Optionally make the cursor a little thinner at the end of a line
-  or the end of the buffer.
-
-** Reorder defcustom's in each package so that the more important
-  options come first in the Customize buffers.  This could be done by
-  either rearranging the file (since options are shown in the order
-  they appear in the *.el files), or by adding a few :set-after attributes.
-
-** Maybe document the features of libraries missing from the manual (or
-  ancillary manuals, including the Lisp manual in some cases).
-  This is not worth doing for all of these packages and we need not
-  aim for completeness, but some may be worth documenting.
-
-  Here's a list which is probably not complete/correct: align, allout,
-  artist, ansi-color, array, calculator, cdl, cmuscheme,
-  completion, delim-col, dirtrack, double, echistory, elide-head,
-  easymenu, expand, flow-ctrl, format [format-alist],
-  generic/generic-x [various modes], kermit, log-edit,
-  makesum, midnight [other than in Kill Buffer node],
-  mouse-copy [?], mouse-drag, mouse-sel, net-utils, rcompile,
-  snmp-mode [?], soundex [should be interactive?], strokes [start from
-  the web page], talk, thingatpt [interactive functions?], type-break,
-  vcursor, xscheme, zone-mode [?], mlconvert [?], iso-cvt,
-  feedmail [?], uce, gametree, page-ext, refbib, refer, scribe,
-  texinfo, underline, cmacexp, hideif, pcomplete, xml,
-  cvs-status (should be described in PCL-CVS manual); other progmodes,
-  probably in separate manual.
-
-** Convert the XPM bitmaps to PPM, replace the PBMs with them and scrap
-  the XPMs so that the color versions work generally.  (Requires care
-  with the color used for the transparent regions.)
-
-** Convenient access to the 'values' variable.  It would be nice to have an
-  interface that would show you the printed reps of the elements of the
-  list in a menu, let you select one of the values, and put it into some
-  other variable, without changing the value of 'values'.
-
-** (Controlled by a flag) make open and close syntax match exactly,
-  i.e. '(' doesn't match ']'.
-
-** Specify parameter ID-FORMAT in all calls to 'file-attributes' and
-  'directory-files-and-attributes' where attributes UID or GID are used.
-  Whenever possible, use value 'string.
-  When done, change meaning of default value from 'integer to 'string.
-  If value 'integer is used nowhere, remove the parameter ID-FORMAT from
-  the definition of 'file-attributes' and 'directory-files-and-attributes'
-  and from the calls.
+** Allow auto-compression-mode to use zlib calls if zlib is available
+Zlib is required for PNG, so may be linked anyhow.
 
-** Make language-info-alist customizable.  Currently a user can customize
-  only the variable 'current-language-environment'.
-
-** Improve language environment handling so that Emacs can fit
-  better to a users locale.  Currently Emacs uses utf-8 language
-  environment for all utf-8 locales, thus a user in ja_JP.UTF-8 locale
-  are also put in utf-8 lang. env.  In such a case, it is
-  better to use Japanese lang. env. but prefer utf-8 coding system.
+** Improve the GC
+Introduce generational or incremental GC.  We may be able to use the
+Boehm collector.)  See the Boehm-GC branch in CVS for work on this.
 
-** Enhance locale handling:  handle language, territory and charset
-  orthogonally and de-emphasize language environments.  Use the locale
-  to set up more things, such as fontsets, the default Ispell
-  dictionary, diary format, calendar holidays and display, quoting
-  characters and phrase boundaries, sentence endings, collation for
-  sorting (at least for unicodes), HTTP Accept-language, patterns for
-  directory listings and compilation messages, yes-or-no replies,
-  common menu items when the toolkit supports it ...  'locale-info'
-  needs extending for LC_COLLATE &c.  [fx started on this.]
-
-** Eliminate the current restriction on header printing by ps-print.
-  Currently, a header can contain only single 1-byte charset in
-  addition to ASCII.
-
-** In ps-print, provide an user friendly interface to specify fonts.
-
-** Enhance word boundary detection for such a script that doesn't use
-  space at word boundary (e.g. Thai).
-
-** Implement interface programs with major Japanese conversion server
-  in lib-src so that they can be used from the input method
-  "japanese".  Currently, most Japanese users are using external
-  packages (e.g. tamago, anthy) or an input method via XIM.
-
-** Let LEIM handle the Mode_switch key like XIM does (i.e. a toggle like C-\
-   but which can also be used as a modifier).
-
-** Improve Help buffers: Change the face of previously visited links (like
-   Info, but also with regard to namespace), and give the value of
-   lisp expressions, e.g auto-mode-alist, the right face.
-
-** Possibly make 'list-holidays' eval items in the calendar-holidays variable.
-   See thread
-   <https://lists.gnu.org/r/emacs-devel/2006-02/msg01034.html>.
-   [rgm@gnu.org will look at this after 22.1]
-
-** Possibly make cal-dst use the system timezone database directly.
-   See thread
-   <https://lists.gnu.org/r/emacs-pretest-bug/2006-11/msg00060.html>
-
-** Possibly add a "close" button to the modeline.
-   The idea is to add an "X" of some kind, that when clicked deletes
-   the window associated with that modeline.
-   https://lists.gnu.org/r/emacs-devel/2007-09/msg02416.html
+** Check what hooks would help Emacspeak
+See the defadvising in W3.
+
+** Add definitions for symbol properties, for documentation purposes
+
+** Temporarily remove scroll bars when they are not needed
+Typically when a buffer can be fully displayed in its window.
+
+** Compute scroll bar's slider by lines
+Provide an optional feature which computes a scroll bar slider's
+size and its position from lines instead of characters.
+
+** Allow displaying an X window from an external program in a buffer
+E.g. to render graphics from Java applets.  [gerd and/or wmperry
+thought this was feasible.]  [Is xwidget that feature?]
+
+** Allow images (not just text) in the margin to be mouse-sensitive
+This requires recursing through display properties.  Provide some way
+to simulate mouse-clicks on marginal text without a mouse.
+
+** Extend ps-print
+
+*** It should deal with multiple font sizes, images, and extra encodings
+
+*** Eliminate the current restriction on header printing by ps-print
+Currently, a header can contain only single 1-byte charset in addition
+to ASCII.
+
+*** Provide a user friendly interface to specify fonts
+
+** Use the XIE X extension, if available, for image display
+This is obsolete, as XIE itself is now considered obsolete.
+
+** Make monochrome images honor the face
+Display those images using the foreground and background colors of the
+applicable faces.
+
+** Make 'format-time-string' preserve text properties like 'format'
+
+** Optionally make the cursor a little thinner at EOL and EOB
+
+** Reorder defcustom's in each package by importance
+The more important options should come first in the Customize buffers.
+This could be done by either rearranging the file (since options are
+shown in the order they appear in the *.el files), or by adding a few
+:set-after attributes.
+
+** Maybe document the features of libraries missing from the manual
+Also in ancillary manuals, including the Lisp manual in some cases.
+This is not worth doing for all of these packages and we need not aim
+for completeness, but some may be worth documenting.
+
+Here's a list which is probably not complete/correct: align, allout,
+artist, ansi-color, array, calculator, cdl, cmuscheme, completion,
+delim-col, dirtrack, double, echistory, elide-head, easymenu, expand,
+flow-ctrl, format [format-alist], generic/generic-x [various modes],
+kermit, log-edit, makesum, midnight [other than in Kill Buffer node],
+mouse-copy [?], mouse-drag, mouse-sel, net-utils, rcompile, snmp-mode
+[?], soundex [should be interactive?], strokes [start from the web
+page], talk, thingatpt [interactive functions?], type-break, vcursor,
+xscheme, zone-mode [?], mlconvert [?], iso-cvt, feedmail [?], uce,
+gametree, page-ext, refbib, refer, scribe, texinfo, underline,
+cmacexp, hideif, pcomplete, xml, cvs-status (should be described in
+PCL-CVS manual); other progmodes, probably in separate manual.
+
+** Deprecate and remove XPM icons
+Convert the XPM bitmaps to PPM, replace the PBMs with them and scrap
+the XPMs so that the color versions work generally.  (Requires care
+with the color used for the transparent regions.)
+
+** Convenient access to the 'values' variable
+It would be nice to have an interface that would show you the printed
+reps of the elements of the list in a menu, let you select one of the
+values, and put it into some other variable, without changing the
+value of 'values'.
+
+** Make open and close syntax match exactly
+Make open and close syntax match exactly, i.e. '(' doesn't match ']'.
+This should be controlled by a flag.
+
+** Use ID-FORMAT in 'file-attributes' and 'directory-files-and-attributes'
+Specify an explicit parameter ID-FORMAT in all calls to these
+functions where attributes UID or GID are used.  Whenever possible,
+use 'string'.  When done, change meaning of default value from
+'integer' to 'string'.  If value 'integer' is used nowhere, remove the
+parameter ID-FORMAT from the definition of 'file-attributes' and
+'directory-files-and-attributes' and from the calls.
+
+** Make language-info-alist customizable
+Currently a user can customize only the variable
+'current-language-environment'.
+
+** Improve language environment handling
+Allow Emacs to fit better to a user's locale.  Currently Emacs uses
+UTF-8 language environment for all UTF-8 locales, thus a user in
+ja_JP.UTF-8 locale are also put in UTF-8 language environment.  In
+such a case, it is better to use Japanese language environment, while
+preferring the utf-8 coding system.
+
+** Enhance locale handling
+Handle language, territory and charset orthogonally, and de-emphasize
+language environments.  Use the locale to set up more things, such as
+fontsets, the default Ispell dictionary, diary format, calendar
+holidays and display, quoting characters and phrase boundaries,
+sentence endings, collation for sorting (at least for unicodes), HTTP
+Accept-language, patterns for directory listings and compilation
+messages, yes-or-no replies, common menu items when the toolkit
+supports it ...  'locale-info' needs extending for LC_COLLATE &c.  [fx
+started on this.]
+
+** Enhance word boundary detection
+This is needed for scripts that don't use space at word boundary
+(e.g., Thai).
+
+** Implement interface programs with major Japanese input methods
+The idea is to write programs in lib-src for interfacing with Japanese
+conversion servers so that they can be used from the input method
+"japanese".  Currently, most Japanese users are using external
+packages (e.g. tamago, anthy) or an input method via XIM.
+
+** Let LEIM handle the Mode_switch key like XIM does
+I.e. a toggle like C-\ but which can also be used as a modifier.
+
+** Improve Help buffers
+Change the face of previously visited links (like Info, but also with
+regard to namespace), and give the value of lisp expressions, e.g
+auto-mode-alist, the right face.
+
+** Possibly make 'list-holidays' eval items in the calendar-holidays variable
+See thread <https://lists.gnu.org/r/emacs-devel/2006-02/msg01034.html>.
+[rgm@gnu.org will look at this after 22.1]
+
+** Possibly make cal-dst use the system timezone database directly
+See thread <https://lists.gnu.org/r/emacs-pretest-bug/2006-11/msg00060.html>.
+
+** Possibly add a "close" button to the modeline
+The idea is to add an "X" of some kind, that when clicked deletes the
+window associated with that modeline.
+https://lists.gnu.org/r/emacs-devel/2007-09/msg02416.html
 
 * Things to be done for specific packages or features
 
 ** NeXTstep port
 
 *** Missing features
-
 This sections contains features found in other official Emacs ports.
 
 **** Support for xwidgets
-
 Emacs 25 has support for xwidgets, a system to include operating
 system components into an Emacs buffer.  The components range from
 simple buttons to webkit (effectively, a web browser).
 
-Currently, xwidgets works only for the gtk+ framework but it is
+Currently, xwidgets work only for the gtk+ framework but they are
 designed to be compatible with multiple Emacs ports.
 
 (See the scratch/nsxwidget branch, and the discussion around
@@ -806,7 +852,6 @@ Objective-C code and GCC at
 https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00072.html)
 
 **** Respect 'frame-inhibit-implied-resize'
-
 When the variable 'frame-inhibit-implied-resize' is non-nil, frames
 should not be resized when operations like changing font or toggling
 the tool bar is performed.
@@ -815,7 +860,6 @@ Unfortunately, the tool bar (and possible other operations) 
always
 resize the frame.
 
 **** Support 'proced' (implement 'process-attributes')
-
 Unfortunately, a user-level process like Emacs does not have the
 privileges to get information about other processes under macOS.
 
@@ -835,16 +879,13 @@ See this article by Bozhidar Batsov for an overview of 
Proced:
 https://emacsredux.com/blog/2013/05/02/manage-processes-with-proced/
 
 **** Tooltip properties
-
 Tooltip properties like the background color and font are hard-wired,
 even though Emacs allows a user to customize such features.
 
 *** New features
-
 This section contains features unique to Nextstep and/or macOS.
 
 **** PressAndHold for writing accented character
-
 On macOS, many application support the press and hold pattern to
 invoke a menu of accented characters.  (See example at
 https://support.apple.com/en-us/HT201586 .)
@@ -857,7 +898,6 @@ Note: This feature might not be allowed to be implemented 
until also
 implemented in Emacs for a free system.
 
 **** Floating scroll bars
-
 In modern macOS applications, the scroll bar often floats over the
 content, and is invisible unless actually used.  This makes the user
 interface less cluttered and more area could be used to contain text.
@@ -871,7 +911,6 @@ Note: This feature might not be allowed to be implemented 
until also
 implemented in Emacs for a free system.
 
 *** Features from the "mac" port
-
 This section contains features available in the "mac" Emacs port.
 
 As the "mac" port (as of this writing) isn't an official Emacs port,
@@ -884,7 +923,6 @@ interface.  The Carbon interface has been enhanced, and a 
number of the
 features of that interface could be implemented NS.
 
 **** Smooth scrolling -- maybe not a good idea
-
 Today, by default, scrolling with a trackpad makes the text move in
 steps of five lines.  (Scrolling with SHIFT scrolls one line at a time.)
 
@@ -901,7 +939,6 @@ Note: This feature might not be allowed to be implemented 
until also
 implemented in Emacs for a free system.
 
 **** Mouse gestures
-
 The "mac" port defines the gestures 'swipe-left/right/up/down',
 'magnify-up/down', and 'rotate-left/right'.
 
@@ -915,11 +952,9 @@ implemented in Emacs for a free system.
 **** Synthesize bold fonts
 
 *** Open issues
-
 This section contains issues where there is an ongoing debate.
 
 **** Key bindings of CMD and ALT
-
 Currently in the "ns" port, ALT is bound to Meta and CMD is bound to
 Super -- allowing the user to use typical macOS commands like CMD-A to
 mark everything.
@@ -942,7 +977,6 @@ https://lists.gnu.org/r/emacs-devel/2016-01/msg00008.html
 *** Internal development features
 
 **** Regression test system (or at least a checklist)
-
 Today, after each change to the user interface, Emacs must be manually
 tested.  Often, small details are overlooked ("Oh, I didn't test
 toggling the tool-bar in one of the full screen modes, when multiple
@@ -953,18 +987,15 @@ Many features are generic, however, the NS interface 
provides a number
 of unique features.
 
 **** Existing packages
-
 Note that there is a generic UI test named frame-test.el, see
 https://debbugs.gnu.org/21415#284 .
 The NS interface passes this, with the exception of two toolbar-related errors.
 
 **** Anders frame test
-
 Anders Lindgren <andlind@gmail.com> has implemented some (very basic)
 tests for full screen, toolbar, and auto-hiding the menu bar.
 
 **** Make sure all build variants work
-
 Emacs can be build in a number of different ways.  For each feature,
 consider if is really is "NS" specific, or if it should be applied to
 all build versions.
@@ -982,7 +1013,6 @@ all build versions.
 *** Bugs
 
 **** Toggling the toolbar in fullheight or maximized modes
-
 The toolbar, in the NS interface, is not considered part of the text
 area.  When it is toggled, the Emacs frame change height accordingly.
 
@@ -997,7 +1027,7 @@ i.e. change the text area.
 
 This is related to the 'frame-inhibit-implied-resize' issue.
 
-**** The event loop does not redraw.
+**** The event loop does not redraw
 A problem is that redraw don't happen during resize,
 because we can't break out from the NSapp loop during resize.
 There was a special trick to detect mouse press in the lower right
@@ -1005,8 +1035,9 @@ corner and track mouse movements, but this did not work 
well, and was
 not scalable to the new Lion "resize on every window edge" behavior.
 [As of trunk r109635, 2012-08-15, the event loop no longer polls.]
 
-**** (mouse-avoidance-mode 'banish) then minimize Emacs, will pop window back
-up on top of all others (probably fixed in bug#17439)
+**** mouse-avoidance-mode
+(mouse-avoidance-mode 'banish) then minimize Emacs, will pop window back
+up on top of all others (probably fixed in bug#17439).
 
 **** free_frame_resources, face colors
 
@@ -1052,13 +1083,13 @@ pay attention to the bidi directives embedded in the 
HTML/XML stream.
 
 *** Allow the user to control the direction of the UI
 
-**** Introduce user option to control direction of mode line.
+**** Introduce user option to control direction of mode line
 One problem is the header line, which is produced by the same routines
 as the mode line.  While it makes sense to have the mode-line
 direction controlled by a single global variable, header lines are
 buffer-specific, so they need a separate treatment in this regard.
 
-**** User options to control direction of menu bar and tool bar.
+**** User options to control direction of menu bar and tool bar
 For the tool bar, it's relatively easy: set it.paragraph_embedding
 in redisplay_tool_bar according to the user variable, and make
 f->desired_tool_bar_string multibyte with STRING_SET_MULTIBYTE.  Some
@@ -1075,7 +1106,7 @@ with toolkit-specific code to display the menu bar right 
to left.
 
 ** Custom
 
-*** Extend :set-after to also mean initialize after.
+*** Extend :set-after to also mean initialize after
 If defcustom A specifies :set-after '(B), then if a user customizes
 both A and B, custom will set A after B.  But if the user only customizes
 A, then if B is already defined, it gets left at its original setting.
@@ -1086,14 +1117,16 @@ such as for mail-host-address and user-mail-address in 
startup.el.
 
 ** ImageMagick support
 
-*** image-type-header-regexps priorities the jpeg loader over the
+*** Image priority
+'image-type-header-regexps' prioritizes the jpeg loader over the
 ImageMagick one.  This is not wrong, but how should a user go about
 preferring the ImageMagick loader?  The user might like zooming etc in jpegs.
 
 Try (setq image-type-header-regexps nil) for a quick hack to prefer
 ImageMagick over the jpg loader.
 
-*** For some reason it's unbearably slow to look at a page in a large
+*** Slow display
+For some reason it's unbearably slow to look at a page in a large
 image bundle using the :index feature.  The ImageMagick "display"
 command is also a bit slow, but nowhere near as slow as the Emacs
 code.  It seems ImageMagick tries to unpack every page when loading the
@@ -1102,77 +1135,81 @@ bundle.  This feature is not the primary usecase in 
Emacs though.
 ImageMagick 6.6.2-9 introduced a bugfix for single page djvu load.  It
 is now much faster to use the :index feature, but still not very fast.
 
-*** Try to cache the num pages calculation.  It can take a while to
-calculate the number of pages, and if you need to do it for each page
-view, page-flipping becomes uselessly slow.
+*** Try to cache the num pages calculation
+It can take a while to calculate the number of pages, and if you need
+to do it for each page view, page-flipping becomes uselessly slow.
 
-*** Integrate with image-dired.
+*** Integrate with image-dired
 
-*** Integrate with docview.
+*** Integrate with docview
 
-*** Integrate with image-mode.
-Some work has been done, e.g. M-x image-transform-fit-to-height will
+*** Integrate with image-mode
+Some work has been done, e.g. "M-x image-transform-fit-to-height" will
 fit the image to the height of the Emacs window.
 
-*** Look for optimizations for handling images with low depth.
+*** Look for optimizations for handling images with low depth
 Currently the code seems to default to 24 bit RGB which is costly for
 images with lower bit depth.
 
 *** Decide what to do with some uncommitted imagemagick support
-functions for image size etc.
+Functions for image size etc.
 
 ** nxml mode
 
 *** High priority
 
-**** Command to insert an element template, including all required
-attributes and child elements.  When there's a choice of elements
-possible, we could insert a comment, and put an overlay on that
-comment that makes it behave like a button with a pop-up menu to
-select the appropriate choice.
+**** Command to insert an element template
+This should include all required attributes and child elements.  When
+there's a choice of elements possible, we could insert a comment, and
+put an overlay on that comment that makes it behave like a button with
+a pop-up menu to select the appropriate choice.
 
-**** Command to tag a region.  With a schema should complete using legal
-tags, but should work without a schema as well.
+**** Command to tag a region
+With a schema should complete using legal tags, but should work
+without a schema as well.
 
-**** Provide a way to conveniently rename an element.  With a schema should
-complete using legal tags, but should work without a schema as well.
+**** Provide a way to conveniently rename an element
+With a schema should complete using legal tags, but should work
+without a schema as well.
 
 *** Outlining
 
-**** Implement C-c C-o C-q.
+**** Implement C-c C-o C-q
 
-**** Install pre/post command hook for moving out of invisible section.
+**** Install pre/post command hook for moving out of invisible section
 
-**** Put a modify hook on invisible sections that expands them.
+**** Put a modify hook on invisible sections that expands them
 
-**** Integrate dumb folding somehow.
+**** Integrate dumb folding somehow
 
-**** An element should be able to be its own heading.
+**** An element should be able to be its own heading
 
-**** Optimize to avoid complete buffer scan on each command.
+**** Optimize to avoid complete buffer scan on each command
 
-**** Make it work with HTML-style headings (i.e. level indicated by
-name of heading element rather than depth of section nesting).
+**** Make it work with HTML-style headings
+I.e., level indicated by name of heading element rather than depth of
+section nesting.
 
-**** Recognize root element as a section provided it has a title, even
-if it doesn't match section-element-name-regex.
+**** Recognize root element as a section provided it has a title
+Even if it doesn't match section-element-name-regex.
 
-**** Support for incremental search automatically making hidden text visible.
+**** Support for incremental search automatically making hidden text visible
 
-**** Allow title to be an attribute.
+**** Allow title to be an attribute
 
-**** Command that says to recognize the tag at point as a section/heading.
+**** Command that says to recognize the tag at point as a section/heading
 
-**** Explore better ways to determine when an element is a section
-or a heading.
+**** Explore better ways to determine when an element is a section or a heading
 
-**** rng-next-error needs to either ignore invisible portion or reveal it
+**** Extend 'rng-next-error'
+'rng-next-error' needs to either ignore invisible portion or reveal it
 (maybe use isearch oriented text properties).
 
-**** Errors within hidden section should be highlighted by underlining the
-ellipsis.
+**** Errors within hidden section should be highlighted
+They should be highlighted by underlining the ellipsis.
 
-**** Make indirect buffers work.
+**** Make indirect buffers work
+[??? Don't they already work?]
 
 **** How should nxml-refresh outline recover from non well-formed tags?
 
@@ -1181,11 +1218,11 @@ ellipsis.
 **** Use overlays instead of text properties for holding outline state?
 Necessary for indirect buffers to work?
 
-**** Allow an outline to go in the speedbar.
+**** Allow an outline to go in the speedbar
 
-**** Split up outlining manual section into subsections.
+**** Split up outlining manual section into subsections
 
-**** More detail in the manual about each outlining command.
+**** More detail in the manual about each outlining command
 
 **** More menu entries for hiding/showing?
 
@@ -1193,390 +1230,428 @@ Necessary for indirect buffers to work?
 
 *** Locating schemas
 
-**** Should rng-validate-mode give the user an opportunity to specify a
-schema if there is currently none? Or should it at least give a hint
-to the user how to specify a non-vacuous schema?
+**** Should 'rng-validate-mode' allow to specify a schema?
+Give the user an opportunity to specify a schema if there is currently
+none?  Or should it at least give a hint to the user how to specify a
+non-vacuous schema?
 
-**** Support for adding new schemas to schema-locating files.
+**** Support for adding new schemas to schema-locating files
 Add documentElement and namespace elements.
 
-**** C-c C-w should be able to report current type id.
+**** C-c C-w should be able to report current type id
 
-**** Implement doctypePublicId.
+**** Implement doctypePublicId
 
-**** Implement typeIdBase.
+**** Implement typeIdBase
 
-**** Implement typeIdProcessingInstruction.
+**** Implement typeIdProcessingInstruction
 
-**** Support xml:base.
+**** Support xml:base
 
-**** Implement group.
+**** Implement group
 
-**** Find preferred prefix from schema-locating files.  Get rid of
-rng-preferred-prefix-alist.
+**** Find preferred prefix from schema-locating files
+Get rid of 'rng-preferred-prefix-alist'.
 
-**** Inserting document element with vacuous schema should complete using
-document elements declared in schema locating files, and set schema
-appropriately.
+**** Inserting document element with vacuous schema should complete
+Completion should use document elements declared in schema locating
+files, and set schema appropriately.
 
 **** Add a ruleType attribute to the <include> element?
 
-**** Allow processing instruction in prolog to contain the compact syntax
+**** Syntax of schema in prologue
+Allow processing instruction in prologue to contain the compact syntax
 schema directly.
 
-**** Use RDDL to locate a schema based on the namespace URI.
+**** Use RDDL to locate a schema based on the namespace URI
 
-**** Should not prompt to add redundant association to schema locating file.
+**** Should not prompt to add redundant association to schema locating file
 
-**** Command to reload current schema.
+**** Command to reload current schema
 
 *** Schema-sensitive features
 
-**** Should filter dynamic markup possibilities using schema validity, by
-adding hook to nxml-mode.
+**** Should filter dynamic markup possibilities using schema validity
+Should do this by adding hook to nxml-mode.
 
-**** Dynamic markup word should (at least optionally) be able to look in
-other buffers that are using nxml-mode.
+**** Dynamic markup word should be able to look in other buffers
+It should be able to look in other buffers that are using nxml-mode
+(at least optionally).
 
 **** Should clicking on Invalid move to next error if already on an error?
 
-**** Take advantage of a:documentation.  Needs change to schema format.
+**** Take advantage of a:documentation
+Needs change to schema format.
 
-**** Provide feasible validation (as in Jing) toggle.
+**** Provide feasible validation (as in Jing) toggle
 
-**** Save the validation state as a property on the error overlay to enable
-more detailed diagnosis.
+**** Save the validation state as a property on the error overlay
+This would enable more detailed diagnosis.
 
-**** Provide an Error Summary buffer showing all the validation errors.
+**** Provide an Error Summary buffer showing all the validation errors
 
-**** Pop-up menu.  What is useful?  Tag a region (should be grayed out if
-the region is not balanced).  Suggestions based on error messages.
+**** Pop-up menu
+What is useful?  Tag a region (should be grayed out if the region is
+not balanced).  Suggestions based on error messages.
 
-**** Have configurable list of namespace URIs so that we can provide
-namespace URI completion on extension elements or with schema-less documents.
+**** Have configurable list of namespace URIs
+So that we can provide namespace URI completion on extension elements
+or with schema-less documents.
 
-**** Allow validation to handle XInclude.
+**** Allow validation to handle XInclude
 
-**** ID/IDREF support.
+**** ID/IDREF support
 
 *** Completion
 
-**** Make it work with icomplete.  Only use a function to complete when
-some of the possible names have undeclared namespaces.
+**** Make it work with icomplete
+Only use a function to complete when some of the possible names have
+undeclared namespaces.
 
 **** How should C-return in mixed text work?
 
-**** When there's a vacuous schema, C-return after < will insert the end-tag.
+**** When there's a vacuous schema, C-return after < will insert the end-tag
 Is this a bug or a feature?
 
-**** After completing start-tag, ensure we don't get unhelpful message
-from validation
+**** Validation messages after completing start-tag
+After completing start-tag, ensure we don't get unhelpful message from
+validation
 
-**** Syntax table for completion.
+**** Syntax table for completion
 
-**** Should complete start-tag name with a space if namespace attributes
-are required.
+**** Should complete start-tag name with a space
+If namespace attributes are required.
 
-**** When completing start-tag name with no prefix and it doesn't match
+**** Completing start-tag name with no prefix
+When completing start-tag name with no prefix and it doesn't match
 should try to infer namespace from local name.
 
-**** Should completion pay attention to characters after point?  If so, how?
+**** Should completion pay attention to characters after point?
+If so, how?
 
-**** When completing start-tag name, add required atts if only one required
+**** Completion of start-tag with only one attribute
+When completing start-tag name, add required atts if only one required
 attribute.
 
-**** When completing attribute name, add attribute value if only one value
+**** Completion of name of attribute with only one attribute value
+When completing attribute name, add attribute value if only one value
 is possible.
 
-**** After attribute-value completion, insert space after close delimiter
+**** Completion of attribute values
+After attribute-value completion, insert space after close delimiter
 if more attributes are required.
 
-**** Complete on enumerated data values in elements.
+**** Complete on enumerated data values in elements
 
-**** When in context that allows only elements, should get tag
-completion without having to type < first.
+**** Tag completion in context that allows only elements
+When in context that allows only elements, should get tag completion
+without having to type < first.
 
-**** When immediately after start-tag name, and name is valid and not
+**** C-return completion immediately after start-tag name
+When immediately after start-tag name, and name is valid and not
 prefix of any other name, should C-return complete on attribute names?
 
-**** When completing attributes, more consistent to ignore all attributes
+**** Ignoring all attributes during attribute completion
+When completing attributes, more consistent to ignore all attributes
 after point.
 
-**** Inserting attribute value completions needs to be sensitive to what
-delimiter is used so that it quotes the correct character.
+**** Inserting attribute value by completions
+Completions inserting attribute value need to be sensitive to what
+delimiter is used so that they quote the correct character.
 
-**** Complete on encoding-names in XML decl.
+**** Complete on encoding-names in XML decl
 
-**** Complete namespace declarations by searching for all namespaces
-mentioned in the schema.
+**** Complete namespace declarations
+Can be done by searching for all namespaces mentioned in the schema.
 
 *** Well-formed XML support
 
 **** Deal better with Mule-UCS
 
-**** Deal with UTF-8 BOM when reading.
+**** Deal with UTF-8 BOM when reading
+[Isn't this already working when visiting XML files?]
 
-**** Complete entity names.
+**** Complete entity names
 
-**** Provide some support for entity names for MathML.
+**** Provide some support for entity names for MathML
 
-**** Command to repeat the last tag.
+**** Command to repeat the last tag
 
-**** Support for changing between character references and characters.
+**** Support for changing between character references and characters
 Need to check that context is one in which character references are
 allowed.  xmltok prolog parsing will need to distinguish parameter
 literals from other kinds of literal.
 
-**** Provide a comment command to bind to M-; that works better than the
-normal one.
+**** Provide a comment command to bind to M-;
+The command should work better than the normal one.
 
-**** Make indenting in a multi-line comment work.
+**** Make indenting in a multi-line comment work
 
-**** Structure view.  Separate buffer displaying element tree.
-Be able to navigate from structure view to document and vice-versa.
+**** Structure view
+Separate buffer displaying element tree.  Be able to navigate from
+structure view to document and vice-versa.
 
-**** Flash matching >.
+**** Flash matching >
 
-**** Smart selection command that selects increasingly large syntactically
+**** Smart selection command
+Provide a command that selects increasingly large syntactically
 coherent chunks of XML.  If point is in an attribute value, first
 select complete value; then if command is repeated, select value plus
 delimiters, then select attribute name as well, then complete
 start-tag, then complete element, then enclosing element, etc.
 
-**** ispell integration.
+**** Ispell integration
 
-**** Block-level items in mixed content should be indented, e.g:
+**** Block-level items in mixed content
+This should be indented, e.g:
   <para>This is list:
     <ul>
       <li>item</li>
 
-**** Provide option to indent like this:
+**** Optionally different indentation style
+Provide an option to indent like this:
     <para>This is a paragraph
      occupying multiple lines.</para>
 
-**** Option to add make a / that closes a start-tag electrically insert a
-space for the XHTML guys.
+**** Option to make a / that closes a start-tag electrically insert a space
+Important for the XHTML guys.
 
-**** C-M-q should work.
+**** C-M-q should work
 
 *** Datatypes
 
-**** Figure out workaround for CJK characters with regexps.
+**** Figure out workaround for CJK characters with regexps
 
 **** Does category C contain Cn?
 
-**** Do ENTITY datatype properly.
+**** Do ENTITY datatype properly
 
 *** XML Parsing Library
 
-**** Parameter entity parsing option, nil (never), t (always),
-unless-standalone (unless standalone="yes" in XML declaration).
+**** Parameter entity parsing option
+Values: nil (never), t (always), unless-standalone (unless
+standalone="yes" in XML declaration).
 
-**** When a file is currently being edited, there should be an option to
+**** Option to parse a buffer
+When a file is currently being edited, there should be an option to
 use its buffer instead of the on-disk copy.
 
 *** Handling all XML features
 
-**** Provide better support for editing external general parsed entities.
+**** Provide better support for editing external general parsed entities
 Perhaps provide a way to force ignoring undefined entities; maybe turn
 this on automatically with <?xml encoding=""?> (with no version
 pseudo-att).
 
-**** Handle internal general entity declarations containing elements.
+**** Handle internal general entity declarations containing elements
 
-**** Handle external general entity declarations.
+**** Handle external general entity declarations
 
-**** Handle default attribute declarations in internal subset.
+**** Handle default attribute declarations in internal subset
 
-**** Handle parameter entities (including DTD).
+**** Handle parameter entities (including DTD)
 
 *** RELAX NG
 
-**** Do complete schema checking, at least optionally.
+**** Do complete schema checking, at least optionally
 
-**** Detect include/external loops during schema parse.
+**** Detect include/external loops during schema parse
 
-**** Coding system detection for schemas.  Should use utf-8/utf-16 per the
-spec.  But also need to allow encodings other than UTF-8/16 to support
-CJK charsets that Emacs cannot represent in Unicode.
+**** Coding system detection for schemas
+Should use utf-8/utf-16 per the spec.  But also need to allow
+encodings other than UTF-8/16 to support CJK charsets that Emacs
+cannot represent in Unicode.
 
 *** Catching XML errors
 
-**** Check public identifiers.
+**** Check public identifiers
 
-**** Check default attribute values.
+**** Check default attribute values
 
 *** Performance
 
-**** Explore whether overlay-recenter can cure overlays performance problems.
+**** Explore whether overlay-recenter can cure overlays performance problems
 
-**** Cache schemas.  Need to have list of files and mtimes.
+**** Cache schemas.  Need to have list of files and mtimes
 
-**** Make it possible to reduce rng-validate-chunk-size significantly,
-perhaps to 500 bytes, without bad performance impact: don't do
+**** Make it possible to reduce rng-validate-chunk-size significantly
+Perhaps up to 500 bytes, without bad performance impact: don't do
 redisplay on every chunk; pass continue functions on other uses of
 rng-do-some-validation.
 
-**** Cache after first tag.
+**** Cache after first tag
 
-**** Introduce a new name class that is a choice between names (so that
-we can use member)
+**** Introduce a new name class that is a choice between names
+So that we can use member.
 
 **** intern-choice should simplify after patterns with same 1st/2nd args
 
-**** Large numbers of overlays slow things down dramatically.  Represent
-errors using text properties.  This implies we cannot incrementally
-keep track of the number of errors, in order to determine validity.
-Instead, when validation completes, scan for any characters with an
-error text property; this seems to be fast enough even with large
-buffers.  Problem with error at end of buffer, where there's no
-character; need special variable for this.  Need to merge face from
-font-lock with the error face: use :inherit attribute with list of two
-faces.  How do we avoid making rng-valid depend on nxml-mode?
+**** Large numbers of overlays slow things down dramatically
+Represent errors using text properties.  This implies we cannot
+incrementally keep track of the number of errors, in order to
+determine validity.  Instead, when validation completes, scan for any
+characters with an error text property; this seems to be fast enough
+even with large buffers.  Problem with error at end of buffer, where
+there's no character; need special variable for this.  Need to merge
+face from font-lock with the error face: use :inherit attribute with
+list of two faces.  How do we avoid making rng-valid depend on
+nxml-mode?
 
 *** Error recovery
 
-**** Don't stop at newline in looking for close of start-tag.
+**** Don't stop at newline in looking for close of start-tag
 
 **** Use indentation to guide recovery from mismatched end-tags
 
-**** Don't keep parsing when currently not well-formed but previously
-well-formed
+**** Smarter parsing in presence of errors
+Don't keep parsing when currently not well-formed but previously
+well-formed.
 
-**** Try to recover from a bad start-tag by popping an open element if
+**** Recovery from bad start-tag
+Try to recover from a bad start-tag by popping an open element if
 there was a mismatched end-tag unaccounted for.
 
-**** Try to recover from a bad start-tag open on the hypothesis that there
+Try to recover from a bad start-tag open on the hypothesis that there
 was an error in the namespace URI.
 
-**** Better recovery from ill-formed XML declarations.
+**** Better recovery from ill-formed XML declarations
 
 *** Usability improvements
 
-**** Should print a "Parsing..." message during long movements.
+**** Should print a "Parsing..." message during long movements
 
-**** Provide better position for reference to undefined pattern error.
+**** Provide better position for reference to undefined pattern error
 
-**** Put Well-formed in the mode-line when validating against any-content.
+**** Put Well-formed in the mode-line when validating against any-content
 
-**** Trim marking of illegal data for leading and trailing whitespace.
+**** Trim marking of illegal data for leading and trailing whitespace
 
-**** Show Invalid status as soon as we are sure it's invalid, rather than
-waiting for everything to be completely up to date.
+**** Show Invalid status as soon as we are sure it's invalid
+That's instead of waiting for everything to be completely up to date.
 
-**** When narrowed, Valid or Invalid status should probably consider only
+**** Operation when narrowed
+When narrowed, Valid or Invalid status should probably consider only
 validity of narrowed region.
 
 *** Bug fixes
 
 **** Need to give an error for a document like: <foo/><![CDATA[  ]]>
 
-**** Make nxml-forward-balanced-item work better for the prolog.
+**** Make nxml-forward-balanced-item work better for the prologue
 
-**** Make filling and indenting comments work in the prolog.
+**** Make filling and indenting comments work in the prologue
 
-**** Should delete RNC Input buffers.
+**** Should delete RNC Input buffers
 
-**** Figure out what regex use for NCName and use it consistently,
+**** Figure out what regex use for NCName and use it consistently
 
-**** Should have not-well-formed tokens in ref.
+**** Should have not-well-formed tokens in ref
 
-**** Require version in XML declaration? Probably not because prevents
-use for external parsed entities.  At least forbid standalone without version.
+**** Require version in XML declaration?
+Probably not because prevents use for external parsed entities.  At
+least forbid standalone without version.
 
-**** Reject schema that compiles to rng-not-allowed-ipattern.
+**** Reject schema that compiles to rng-not-allowed-ipattern
 
-**** Move point backwards on schema parse error so that it's on the right 
token.
+**** Move point backwards on schema parse error so that it's on the right token
 
 *** Internal
 
-**** Use rng-quote-string consistently.
+**** Use rng-quote-string consistently
 
-**** Use parsing library for XML to texinfo conversion.
+**** Use parsing library for XML to texinfo conversion
 
-**** Rename xmltok.el to nxml-token.el.  Use nxml-t- prefix instead of
-xmltok-.  Change nxml-t-type to nxml-t-token-type, nxml-t-start to
-nxml-t-token-start.
+**** Rename xmltok.el to nxml-token.el
+Use nxml-t- prefix instead of xmltok-.  Change nxml-t-type to
+nxml-t-token-type, nxml-t-start to nxml-t-token-start.
 
 **** Can we set fill-prefix to nil and rely on indenting?
 
-**** xmltok should make available replacement text of entities containing
-elements
+**** xmltok should make available replacement text of entities with elements
 
-**** In rng-valid, instead of using modification-hooks and
-insert-behind-hooks on dependent overlays, use same technique as nxml-mode.
+**** In rng-valid, use same technique as nxml-mode
+That's instead of using modification-hooks and insert-behind-hooks on
+dependent overlays.
 
 *** Fontification
 
-**** Allow face to depend on element qname, attribute qname, attribute
-value.  Use list with pairs of (R . F), where R specifies regexps and
-F specifies faces.  How can this list be made to depend on the document type?
+**** Allow face to depend on element qname, attribute qname, attribute value
+Use list with pairs of (R . F), where R specifies regexps and F
+specifies faces.  How can this list be made to depend on the document
+type?
 
 *** Other
 
-**** Support RELAX NG XML syntax (use XML parsing library).
+**** Support RELAX NG XML syntax (use XML parsing library)
 
-**** Support W3C XML Schema (use XML parsing library).
+**** Support W3C XML Schema (use XML parsing library)
 
-**** Command to infer schema from current document (like trang).
+**** Command to infer schema from current document (like trang)
 
 *** Schemas
 
-**** XSLT schema should take advantage of RELAX NG to express cooccurrence
-constraints on attributes (e.g. xsl:template).
+**** XSLT schema should take advantage of RELAX NG
+So as to express co-occurrence constraints on attributes
+(e.g. xsl:template).
 
 *** Documentation
 
-**** Move material from README to manual.
+**** Move material from README to manual
 
-**** Document encodings.
+**** Document encodings
 
 *** Notes
 
-**** How can we allow an error to be displayed on a different token from
+**** Error display
+How can we allow an error to be displayed on a different token from
 where it is detected?  In particular, for a missing closing ">" we
-will need to display it at the beginning of the following token.  At the
-moment, when we parse the following token the error overlay will get cleared.
+will need to display it at the beginning of the following token.  At
+the moment, when we parse the following token the error overlay will
+get cleared.
 
 **** How should rng-goto-next-error deal with narrowing?
 
-**** Perhaps should merge errors having same start position even if they
-have different ends.
+**** Perhaps should merge errors
+Merge errors having same start position even if they have different
+ends.
 
-**** How to handle surrogates? One possibility is to be compatible with
-utf8.e: represent as sequence of 4 chars.  But utf-16 is incompatible
-with this.
+**** How to handle surrogates?
+One possibility is to be compatible with utf8.e: represent as sequence
+of 4 chars.  But utf-16 is incompatible with this.
 
 **** Should we distinguish well-formedness errors from invalidity errors?
 (I think not: we may want to recover from a bad start-tag by implying
 an end-tag.)
 
-**** Seems to be a bug with Emacs, where a mouse movement that causes
+**** Mouse movement that causes help-echo
+Seems to be a bug with Emacs, where a mouse movement that causes
 help-echo text to appear counts as pending input but does not cause
 idle timer to be restarted.
 
-**** Use XML to represent this file.
+**** Use XML to represent this file
 
-**** I had a TODO which said simply "split-string".  What did I mean?
+**** I had a TODO which said simply "split-string"
+What did I mean?
 
-**** Investigate performance on large files all on one line.
+**** Investigate performance on large files all on one line
 
 *** Issues for Emacs versions >= 22
 
-**** Take advantage of UTF-8 CJK support.
+**** Take advantage of UTF-8 CJK support
 
-**** Supply a next-error-function.
+**** Supply a next-error-function
 
-**** Investigate this NEWS item "Emacs now tries to set up buffer coding
-systems for HTML/XML files automatically."
+**** Investigate a NEWS item
+There's a NEWS item which says "Emacs now tries to set up buffer
+coding systems for HTML/XML files automatically."
 
-**** Take advantage of the pointer text property.
+**** Take advantage of the pointer text property
 
-**** Leverage char-displayable-p.
+**** Leverage char-displayable-p
 
 ** RefTeX
 
-*** Provide a wdired-like mode for editing RefTeX TOC buffers.
+*** Provide a wdired-like mode for editing RefTeX TOC buffers
 As a first step, renaming of sections could be supported.  Ultimately,
 it would be great if it also supported moving sections, e.g., by
 killing and yanking or providing org-mode like "move section
@@ -1585,68 +1660,71 @@ presence of multi-file documents.
 
 * Internal changes
 
-** Cleanup all the GC_ mark bit stuff -- there is no longer any distinction
-   since the mark bit is no longer stored in the Lisp_Object itself.
+** Cleanup all the GC_ mark bit stuff
+There is no longer any distinction since the mark bit is no longer
+stored in the Lisp_Object itself.
 
-** Refine the 'predicate' arg to read-file-name.
-   Currently, it mixes up the predicate to apply when doing completion and the
-   one to use when terminating the selection.
+** Refine the 'predicate' arg to read-file-name
+Currently, it mixes up the predicate to apply when doing completion
+and the one to use when terminating the selection.
 
-** Merge ibuffer.el and buff-menu.el.
-   More specifically do what's needed to make ibuffer.el the default,
-   or just an extension of buff-menu.el.
+** Merge ibuffer.el and buff-menu.el
+More specifically do what's needed to make ibuffer.el the default, or
+just an extension of buff-menu.el.
 
 ** Replace linum.el with nlinum.el
-   https://lists.gnu.org/r/emacs-devel/2013-08/msg00379.html
+https://lists.gnu.org/r/emacs-devel/2013-08/msg00379.html
 
-   (Since Emacs 26 introduced native line numbers, this item is
-   probably obsolete.)
+(Since Emacs 26 introduced native line numbers, this item is
+probably obsolete.)
 
-** Merge sendmail.el and messages.el.
-   Probably not a complete merge, but at least arrange for messages.el to be
-   a derived mode of sendmail.el.  Or arrange for messages.el to be split
-   into a small core and "the rest" so that we use less resources as long as
-   we stick to the features provided in sendmail.el.
+** Merge sendmail.el and messages.el
+Probably not a complete merge, but at least arrange for messages.el to
+be a derived mode of sendmail.el.  Or arrange for messages.el to be
+split into a small core and "the rest" so that we use less resources
+as long as we stick to the features provided in sendmail.el.
 
-   (Probably obsolete, as Emacs 24 switched to message.el as the
-   default mail composer.)
+(Probably obsolete, as Emacs 24 switched to message.el as the
+default mail composer.)
 
-** Replace gmalloc.c with the modified Doug Lea code from the current
-   GNU libc so that the special mmapping of buffers can be removed --
-   that apparently loses under Solaris, at least. [fx has mostly done
-   this.]
+** Replace gmalloc.c
+Replace it with the modified Doug Lea code from the current GNU libc
+so that the special mmapping of buffers can be removed -- that
+apparently loses under Solaris, at least. [fx has mostly done this.]
 
-   (Obsolete, since gmalloc.c is nowadays only used on MS-DOS.)
+(Obsolete, since gmalloc.c is nowadays only used on MS-DOS.)
 
-** Rewrite make-docfile to be clean and maintainable.
-   It might be better to replace it with Lisp, using the byte compiler.
-   https://lists.gnu.org/r/emacs-devel/2012-06/msg00037.html
+** Rewrite make-docfile to be clean and maintainable
+It might be better to replace it with Lisp, using the byte compiler.
+https://lists.gnu.org/r/emacs-devel/2012-06/msg00037.html
 
-** Add an inferior-comint-minor-mode to capture the common set of operations
-   offered by major modes that offer an associated inferior
-   comint-derived mode.  I.e. basically make cmuscheme.el/inf-lisp.el generic.
-   For use by sml-mode, python-mode, tex-mode, scheme-mode, lisp-mode,
-   haskell-mode, tuareg-mode, ...
+** Add an inferior-comint-minor-mode
+The purpose is to have a mode to capture the common set of operations
+offered by major modes that offer an associated inferior
+comint-derived mode.  I.e. basically make cmuscheme.el/inf-lisp.el
+generic.  For use by sml-mode, python-mode, tex-mode, scheme-mode,
+lisp-mode, haskell-mode, tuareg-mode, ...
 
 ** Add "link" button class
-   Add a standard button-class named "link", and make all other link-like
-   button classes inherit from it.  Set the default face of the "link" button
-   class to the standard "link" face.
+Add a standard button-class named "link", and make all other link-like
+button classes inherit from it.  Set the default face of the "link"
+button class to the standard "link" face.
 
-* Wishlist items:
+* Wishlist items
 
 ** Maybe replace etags.c with a Lisp implementation.
 https://lists.gnu.org/r/emacs-devel/2012-06/msg00354.html
 
-** Maybe replace lib-src/rcs2log with a Lisp implementation.
+** Maybe replace lib-src/rcs2log with a Lisp implementation
 It wouldn't have to be a complete replacement, just enough
 for vc-rcs-update-changelog.
 
-* Other known bugs:
+* Other known bugs
 
-** 'make-frame' forgets unhandled parameters, at least for X11 frames.
+** 'make-frame' forgets unhandled parameters, at least for X11 frames
 
-** a two-char comment-starter whose two chars are symbol constituents will
+** Problem with comment-start
+A two-char comment-starter whose two chars are symbol constituents will
 not be noticed if it appears within a word.
 
 
diff --git a/lisp/button.el b/lisp/button.el
index f969a03..3a6a6de 100644
--- a/lisp/button.el
+++ b/lisp/button.el
@@ -349,7 +349,7 @@ Also see `insert-text-button'."
         (or (plist-member properties 'type)
             (plist-member properties :type))))
     (when (stringp beg)
-      (setq object (copy-sequence beg) beg 0 end (length object)))
+      (setq object beg beg 0 end (length object)))
     ;; Disallow setting the `category' property directly.
     (when (plist-get properties 'category)
       (error "Button `category' property may not be set directly"))
diff --git a/lisp/dnd.el b/lisp/dnd.el
index f47f4a2..1d0e26c 100644
--- a/lisp/dnd.el
+++ b/lisp/dnd.el
@@ -101,9 +101,6 @@ is what has been dropped.  Returns ACTION."
           (throw 'done t)))
        nil)
      (catch 'done
-       ;; Autoloaded but the byte-compiler still complains.
-       (declare-function browse-url-select-handler "browse-url"
-                         (url &optional kind))
        (let ((browser (browse-url-select-handler url 'internal)))
          (when browser
            (setq ret 'private)
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index f33c30e..9e39b8f 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2820,14 +2820,15 @@ If FORM is a lambda or a macro, byte-compile it as a 
function."
         ;; Expand macros.
         (setq fun (byte-compile-preprocess fun))
         (setq fun (byte-compile-top-level fun nil 'eval))
-        (if macro (push 'macro fun))
         (if (symbolp form)
             ;; byte-compile-top-level returns an *expression* equivalent to the
             ;; `fun' expression, so we need to evaluate it, tho normally
             ;; this is not needed because the expression is just a constant
             ;; byte-code object, which is self-evaluating.
-            (fset form (eval fun t))
-          fun)))))))
+            (setq fun (eval fun t)))
+        (if macro (push 'macro fun))
+        (if (symbolp form) (fset form fun))
+        fun))))))
 
 (defun byte-compile-sexp (sexp)
   "Compile and return SEXP."
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 42e7701..ff8f250 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -4,7 +4,7 @@
 
 ;; Author: João Távora <joaotavora@gmail.com>
 ;; Keywords: processes, languages, extensions
-;; Version: 1.0.11
+;; Version: 1.0.12
 ;; Package-Requires: ((emacs "25.2"))
 
 ;; This is a GNU ELPA :core package.  Avoid functionality that is not
@@ -364,40 +364,44 @@ connection object, called when the process dies .")
 (cl-defmethod initialize-instance ((conn jsonrpc-process-connection) slots)
   (cl-call-next-method)
   (cl-destructuring-bind (&key ((:process proc)) name &allow-other-keys) slots
-    ;; FIXME: notice the undocumented bad coupling in the buffer name.
-    ;; The client making the process _must_ use a buffer named exactly
-    ;; like this property when calling `make-process'.  If there were
-    ;; a `set-process-stderr' like there is `set-process-buffer' we
-    ;; wouldn't need this and could use a pipe with a process filter
-    ;; instead of `after-change-functions'.  Alternatively, we need a
-    ;; new initarg (but maybe not a slot).
-    (with-current-buffer (get-buffer-create (format "*%s stderr*" name))
-      (let ((inhibit-read-only t)
-            (hidden-name (concat " " (buffer-name))))
-        (erase-buffer)
-        (buffer-disable-undo)
-        (add-hook
-         'after-change-functions
-         (lambda (beg _end _pre-change-len)
-           (cl-loop initially (goto-char beg)
-                    do (forward-line)
-                    when (bolp)
-                    for line = (buffer-substring
-                                (line-beginning-position 0)
-                                (line-end-position 0))
-                    do (with-current-buffer (jsonrpc-events-buffer conn)
-                         (goto-char (point-max))
-                         (let ((inhibit-read-only t))
-                           (insert (format "[stderr] %s\n" line))))
-                    until (eobp)))
-         nil t)
-        ;; If we are correctly coupled to the client, it should pick up
-        ;; the current buffer immediately.
-        (setq proc (if (functionp proc) (funcall proc) proc))
-        (ignore-errors (kill-buffer hidden-name))
-        (rename-buffer hidden-name)
-        (process-put proc 'jsonrpc-stderr (current-buffer))
-        (read-only-mode t)))
+    ;; FIXME: notice the undocumented bad coupling in the stderr
+    ;; buffer name, it must be named exactly like this we expect when
+    ;; calling `make-process'.  If there were a `set-process-stderr'
+    ;; like there is `set-process-buffer' we wouldn't need this and
+    ;; could use a pipe with a process filter instead of
+    ;; `after-change-functions'.  Alternatively, we need a new initarg
+    ;; (but maybe not a slot).
+    (let ((calling-buffer (current-buffer)))
+      (with-current-buffer (get-buffer-create (format "*%s stderr*" name))
+        (let ((inhibit-read-only t)
+              (hidden-name (concat " " (buffer-name))))
+          (erase-buffer)
+          (buffer-disable-undo)
+          (add-hook
+           'after-change-functions
+           (lambda (beg _end _pre-change-len)
+             (cl-loop initially (goto-char beg)
+                      do (forward-line)
+                      when (bolp)
+                      for line = (buffer-substring
+                                  (line-beginning-position 0)
+                                  (line-end-position 0))
+                      do (with-current-buffer (jsonrpc-events-buffer conn)
+                           (goto-char (point-max))
+                           (let ((inhibit-read-only t))
+                             (insert (format "[stderr] %s\n" line))))
+                      until (eobp)))
+           nil t)
+          ;; If we are correctly coupled to the client, the process
+          ;; now created should pick up the current stderr buffer,
+          ;; which we immediately rename
+          (setq proc (if (functionp proc)
+                         (with-current-buffer calling-buffer (funcall proc))
+                       proc))
+          (ignore-errors (kill-buffer hidden-name))
+          (rename-buffer hidden-name)
+          (process-put proc 'jsonrpc-stderr (current-buffer))
+          (read-only-mode t))))
     (setf (jsonrpc--process conn) proc)
     (set-process-buffer proc (get-buffer-create (format " *%s output*" name)))
     (set-process-filter proc #'jsonrpc--process-filter)
diff --git a/lisp/language/hebrew.el b/lisp/language/hebrew.el
index 573541a..08b70ab 100644
--- a/lisp/language/hebrew.el
+++ b/lisp/language/hebrew.el
@@ -240,7 +240,7 @@ Bidirectional editing is supported.")))
 
 (let* ((base "[\u05D0-\u05F2\uFB1D\uFB1F-\uFB28\uFB2A-\uFB4F]")
        (combining
-        "[\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\uFB1E]+")
+        "[\u034F\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\uFB1E]+")
        (pattern1 (concat base combining))
        (pattern2 (concat base "\u200D" combining)))
   (set-char-table-range
diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el
index e25e63b..e3a24c4 100644
--- a/lisp/language/misc-lang.el
+++ b/lisp/language/misc-lang.el
@@ -136,10 +136,10 @@ thin (i.e. 1-dot width) space."
 (set-char-table-range
  composition-function-table
  '(#x600 . #x74F)
- (list (vector "[\u0600-\u074F\u200C\u200D]+" 0
-               'arabic-shape-gstring)
-       (vector "[\u200C\u200D][\u0600-\u074F\u200C\u200D]+" 1
-               'arabic-shape-gstring)))
+ (list (vector "[\u200C\u200D][\u0600-\u074F\u200C\u200D]+"
+               1 'arabic-shape-gstring)
+       (vector "[\u0600-\u074F\u200C\u200D]+"
+               0 'arabic-shape-gstring)))
 
 (provide 'misc-lang)
 
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index d49c752..d7da5f6 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -2452,16 +2452,34 @@ Function to display the current buffer in a WWW browser.
 This is used by the `browse-url-at-point', `browse-url-at-mouse', and
 `browse-url-of-file' commands.
 
-If the value is not a function it should be a list of pairs
-\(REGEXP . FUNCTION).  In this case the function called will be the one
-associated with the first REGEXP which matches the current URL.  The
-function is passed the URL and any other args of `browse-url'.  The last
-regexp should probably be \".\" to specify a default browser.
-
-Also see `browse-url-secondary-browser-function'.")
+Also see `browse-url-secondary-browser-function' and
+`browse-url-handlers'.")
 
 (custom-autoload 'browse-url-browser-function "browse-url" t)
 
+(defvar browse-url-default-handlers '(("\\`mailto:"; . browse-url--mailto) 
("\\`man:" . browse-url--man) (browse-url--non-html-file-url-p . 
browse-url-emacs)) "\
+Like `browse-url-handlers' but populated by Emacs and packages.
+
+Emacs and external packages capable of browsing certain URLs
+should place their entries in this alist rather than
+`browse-url-handlers' which is reserved for the user.")
+
+(autoload 'browse-url-select-handler "browse-url" "\
+Return a handler of suitable for browsing URL.
+This searches `browse-url-handlers', and
+`browse-url-default-handlers' for a matching handler.  Return nil
+if no handler is found.
+
+If KIND is given, the search is restricted to handlers whose
+function symbol has the symbol-property `browse-url-browser-kind'
+set to KIND.
+
+Currently, it also consults `browse-url-browser-function' first
+if it is set to an alist, although this usage is deprecated since
+Emacs 28.1 and will be removed in a future release.
+
+\(fn URL &optional KIND)" nil nil)
+
 (autoload 'browse-url-of-file "browse-url" "\
 Ask a WWW browser to display FILE.
 Display the current buffer's file if FILE is nil or if called
@@ -2491,16 +2509,18 @@ Ask a WWW browser to display the current region.
 Ask a WWW browser to load URL.
 Prompt for a URL, defaulting to the URL at or before point.
 Invokes a suitable browser function which does the actual job.
-The variable `browse-url-browser-function' says which browser function to
-use.  If the URL is a mailto: URL, consult `browse-url-mailto-function'
-first, if that exists.
 
-The additional ARGS are passed to the browser function.  See the doc
-strings of the actual functions, starting with `browse-url-browser-function',
-for information about the significance of ARGS (most of the functions
-ignore it).
-If ARGS are omitted, the default is to pass `browse-url-new-window-flag'
-as ARGS.
+The variables `browse-url-browser-function',
+`browse-url-handlers', and `browse-url-default-handlers'
+determine which browser function to use.
+
+The additional ARGS are passed to the browser function.  See the
+doc strings of the actual functions, starting with
+`browse-url-browser-function', for information about the
+significance of ARGS (most of the functions ignore it).
+
+If ARGS are omitted, the default is to pass
+`browse-url-new-window-flag' as ARGS.
 
 \(fn URL &rest ARGS)" t nil)
 
@@ -2512,6 +2532,15 @@ Optional prefix argument ARG non-nil inverts the value 
of the option
 
 \(fn &optional ARG)" t nil)
 
+(autoload 'browse-url-with-browser-kind "browse-url" "\
+Browse URL with a browser of the given browser KIND.
+KIND is either `internal' or `external'.
+
+When called interactively, the default browser kind is the
+opposite of the browser kind of `browse-url-browser-function'.
+
+\(fn KIND URL &optional ARG)" t nil)
+
 (autoload 'browse-url-at-mouse "browse-url" "\
 Ask a WWW browser to load a URL clicked with the mouse.
 The URL is the one around or before the position of the mouse click
@@ -2699,6 +2728,8 @@ NEW-WINDOW instead of `browse-url-new-window-flag'.
 
 \(fn URL &optional NEW-WINDOW)" t nil)
 
+(make-obsolete 'browse-url-conkeror 'nil '"28.1")
+
 (autoload 'browse-url-w3 "browse-url" "\
 Ask the w3 WWW browser to load URL.
 Default to the URL around or before point.
@@ -3674,7 +3705,7 @@ Return the syntactic context of the current line." nil 
nil)
 ;;;### (autoloads nil "cc-fonts" "progmodes/cc-fonts.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cc-fonts.el
 
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"cc-fonts" '("autodoc-" "c++-font-lock-keywords" "c-" "gtkdoc-font-lock-" 
"idl-font-lock-keywords" "java" "objc-font-lock-keywords" 
"pike-font-lock-keywords")))
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"cc-fonts" '("autodoc-" "c++-font-lock-keywords" "c-" "doxygen-font-lock-" 
"gtkdoc-font-lock-" "idl-font-lock-keywords" "java" "objc-font-lock-keywords" 
"pike-font-lock-keywords")))
 
 ;;;***
 
@@ -3843,7 +3874,7 @@ should be used.
 
 This function attempts to use file contents to determine whether
 the code is C or C++ and based on that chooses whether to enable
-`c-mode' or `c++-mode'." nil nil)
+`c-mode' or `c++-mode'." t nil)
 
 (autoload 'c++-mode "cc-mode" "\
 Major mode for editing C++ code.
@@ -6635,7 +6666,7 @@ Create a new data-debug buffer with NAME.
 
 \(fn NAME)" nil nil)
 
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"data-debug" '("data-debug-" "dd-propertize")))
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"data-debug" '("data-debug-")))
 
 ;;;***
 
@@ -7258,13 +7289,16 @@ deletes all frames except the selected one (and its 
minibuffer frame,
 if different)." t nil)
 
 (autoload 'desktop-save "desktop" "\
-Save the desktop in a desktop file.
-Parameter DIRNAME specifies where to save the desktop file.
-Optional parameter RELEASE says whether we're done with this
-desktop.  If ONLY-IF-CHANGED is non-nil, compare the current
-desktop information to that in the desktop file, and if the
-desktop information has not changed since it was last saved then
-do not rewrite the file.
+Save the state of Emacs in a desktop file in directory DIRNAME.
+Optional argument RELEASE non-nil says we're done with this
+desktop, in which case this function releases the lock of the
+desktop file in DIRNAME.
+If ONLY-IF-CHANGED is non-nil, compare the current desktop
+information to that in the desktop file, and if the desktop
+information has not changed since it was last saved, then do
+not rewrite the file.
+
+To restore the desktop, use `desktop-read'.
 
 This function can save the desktop in either format version
 208 (which only Emacs 25.1 and later can read) or version
@@ -7274,14 +7308,20 @@ it was last saved, or version 208 when writing a fresh 
desktop
 file.
 
 To upgrade a version 206 file to version 208, call this command
-explicitly with a bare prefix argument: C-u M-x desktop-save.
-You are recommended to do this once you have firmly upgraded to
-Emacs 25.1 (or later).  To downgrade a version 208 file to version
-206, use a double command prefix: C-u C-u M-x desktop-save.
-Confirmation will be requested in either case.  In a non-interactive
-call, VERSION can be given as an integer, either 206 or 208, which
-will be accepted as the format version in which to save the file
-without further confirmation.
+explicitly with a prefix argument: \\[universal-argument] \\[desktop-save].
+If you are upgrading from Emacs 24 or older, we recommed to do
+this once you decide you no longer need compatibility with versions
+of Emacs before 25.1.
+
+To downgrade a version 208 file to version 206, use a double prefix
+argument: \\[universal-argument] \\[universal-argument] \\[desktop-save].
+
+Emacs will ask for confirmation when you upgrade or downgrade your
+desktop file.
+
+In a non-interactive call, VERSION can be given as an integer, either
+206 or 208, to specify the format version in which to save the file,
+no questions asked.
 
 \(fn DIRNAME &optional RELEASE ONLY-IF-CHANGED VERSION)" t nil)
 
@@ -7866,6 +7906,7 @@ it if ARG is `toggle'; disable the mode otherwise.
 To change the position of the column displayed by default
 customize `display-fill-column-indicator-column'.  You can change the
 character for the indicator setting `display-fill-column-indicator-character'.
+See Info node `Displaying Boundaries' for details.
 
 \(fn &optional ARG)" t nil)
 
@@ -9906,6 +9947,12 @@ It creates an autoload function for CNAME's constructor.
 
 ;;;***
 
+;;;### (autoloads nil "eldoc" "emacs-lisp/eldoc.el" (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/eldoc.el
+(push (purecopy '(eldoc 1 0 0)) package--builtin-versions)
+
+;;;***
+
 ;;;### (autoloads nil "elec-pair" "elec-pair.el" (0 0 0 0))
 ;;; Generated autoloads from elec-pair.el
 
@@ -12470,9 +12517,14 @@ operating on the next file and nil otherwise.
 (autoload 'fileloop-initialize-replace "fileloop" "\
 Initialize a new round of query&replace on several files.
 FROM is a regexp and TO is the replacement to use.
-FILES describes the file, as in `fileloop-initialize'.
-CASE-FOLD can be t, nil, or `default', the latter one meaning to obey
-the default setting of `case-fold-search'.
+FILES describes the files, as in `fileloop-initialize'.
+CASE-FOLD can be t, nil, or `default':
+  if it is nil, matching of FROM is case-sensitive.
+  if it is t, matching of FROM is case-insensitive, except
+     when `search-upper-case' is non-nil and FROM includes
+     upper-case letters.
+  if it is `default', the function uses the value of
+     `case-fold-search' instead.
 DELIMITED if non-nil means replace only word-delimited matches.
 
 \(fn FROM TO FILES CASE-FOLD &optional DELIMITED)" nil nil)
@@ -13058,9 +13110,10 @@ generated it.
 
 (autoload 'flymake-make-diagnostic "flymake" "\
 Make a Flymake diagnostic for BUFFER's region from BEG to END.
-TYPE is a key to symbol and TEXT is a description of the problem
-detected in this region.  DATA is any object that the caller
-wishes to attach to the created diagnostic for later retrieval.
+TYPE is a diagnostic symbol and TEXT is string describing the
+problem detected in this region.  DATA is any object that the
+caller wishes to attach to the created diagnostic for later
+retrieval.
 
 OVERLAY-PROPERTIES is an alist of properties attached to the
 created diagnostic, overriding the default properties and any
@@ -13576,7 +13629,7 @@ and choose the directory as the fortune-file.
 Minimum set of parameters to filter for live (on-session) framesets.
 DO NOT MODIFY.  See `frameset-filter-alist' for a full description.")
 
-(defvar frameset-persistent-filter-alist (nconc '((background-color . 
frameset-filter-sanitize-color) (buffer-list . :never) (buffer-predicate . 
:never) (buried-buffer-list . :never) (client . :never) (delete-before . 
:never) (font . frameset-filter-font-param) (font-backend . :never) 
(foreground-color . frameset-filter-sanitize-color) 
(frameset--text-pixel-height . :save) (frameset--text-pixel-width . :save) 
(fullscreen . frameset-filter-shelve-param) (GUI:font . frameset-filter-unshelv 
[...]
+(defvar frameset-persistent-filter-alist (append '((background-color . 
frameset-filter-sanitize-color) (buffer-list . :never) (buffer-predicate . 
:never) (buried-buffer-list . :never) (client . :never) (delete-before . 
:never) (font . frameset-filter-font-param) (font-backend . :never) 
(foreground-color . frameset-filter-sanitize-color) 
(frameset--text-pixel-height . :save) (frameset--text-pixel-width . :save) 
(fullscreen . frameset-filter-shelve-param) (GUI:font . frameset-filter-unshel 
[...]
 Parameters to filter for persistent framesets.
 DO NOT MODIFY.  See `frameset-filter-alist' for a full description.")
 
@@ -15827,10 +15880,10 @@ Commands:
 \(fn)" t nil)
 
 (autoload 'help-mode-setup "help-mode" "\
-Enter Help Mode in the current buffer." nil nil)
+Enter Help mode in the current buffer." nil nil)
 
 (autoload 'help-mode-finish "help-mode" "\
-Finalize Help Mode setup in current buffer." nil nil)
+Finalize Help mode setup in current buffer." nil nil)
 
 (autoload 'help-setup-xref "help-mode" "\
 Invoked from commands using the \"*Help*\" buffer to install some xref info.
@@ -16053,7 +16106,10 @@ or add (global-hi-lock-mode 1) to your init file.
 In buffers where Font Lock mode is enabled, patterns are
 highlighted using font lock.  In buffers where Font Lock mode is
 disabled, patterns are applied using overlays; in this case, the
-highlighting will not be updated as you type.
+highlighting will not be updated as you type.  The Font Lock mode
+is considered \"enabled\" in a buffer if its `major-mode'
+causes `font-lock-specified-p' to return non-nil, which means
+the major mode specifies support for Font Lock.
 
 When Hi Lock mode is enabled, a \"Regexp Highlighting\" submenu
 is added to the \"Edit\" menu.  The commands in the submenu,
@@ -16166,7 +16222,10 @@ and `search-upper-case' is non-nil, the matching is 
case-sensitive.
 
 Use Font lock mode, if enabled, to highlight REGEXP.  Otherwise,
 use overlays for highlighting.  If overlays are used, the
-highlighting will not update as you type.
+highlighting will not update as you type.  The Font Lock mode
+is considered \"enabled\" in a buffer if its `major-mode'
+causes `font-lock-specified-p' to return non-nil, which means
+the major mode specifies support for Font Lock.
 
 \(fn REGEXP &optional FACE SUBEXP LIGHTER)" t nil)
 
@@ -16183,7 +16242,10 @@ Also set `search-spaces-regexp' to the value of 
`search-whitespace-regexp'.
 
 Use Font lock mode, if enabled, to highlight REGEXP.  Otherwise,
 use overlays for highlighting.  If overlays are used, the
-highlighting will not update as you type.
+highlighting will not update as you type.  The Font Lock mode
+is considered \"enabled\" in a buffer if its `major-mode'
+causes `font-lock-specified-p' to return non-nil, which means
+the major mode specifies support for Font Lock.
 
 \(fn REGEXP &optional FACE)" t nil)
 
@@ -16199,7 +16261,10 @@ If REGEXP contains upper case characters (excluding 
those preceded by `\\')
 and `search-upper-case' is non-nil, the matching is case-sensitive.
 
 This uses Font lock mode if it is enabled; otherwise it uses overlays,
-in which case the highlighting will not update as you type." t nil)
+in which case the highlighting will not update as you type.  The Font
+Lock mode is considered \"enabled\" in a buffer if its `major-mode'
+causes `font-lock-specified-p' to return non-nil, which means
+the major mode specifies support for Font Lock." t nil)
 
 (defalias 'unhighlight-regexp 'hi-lock-unface-buffer)
 
@@ -18322,6 +18387,7 @@ Moving within a node:
          already visible, try to go to the previous menu entry, or up
          if there is none.
 \\[beginning-of-buffer]        Go to beginning of node.
+\\[end-of-buffer]      Go to end of node.
 
 Advanced commands:
 \\[Info-search]        Search through this Info file for specified regexp,
@@ -19097,7 +19163,7 @@ one of the aforementioned options instead of using this 
mode.
 
 ;;;### (autoloads nil "json" "json.el" (0 0 0 0))
 ;;; Generated autoloads from json.el
-(push (purecopy '(json 1 4)) package--builtin-versions)
+(push (purecopy '(json 1 5)) package--builtin-versions)
 
 (if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"json" '("json-")))
 
@@ -19105,7 +19171,7 @@ one of the aforementioned options instead of using this 
mode.
 
 ;;;### (autoloads nil "jsonrpc" "jsonrpc.el" (0 0 0 0))
 ;;; Generated autoloads from jsonrpc.el
-(push (purecopy '(jsonrpc 1 0 9)) package--builtin-versions)
+(push (purecopy '(jsonrpc 1 0 11)) package--builtin-versions)
 
 (if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"jsonrpc" '("jrpc-default-request-timeout" "jsonrpc-")))
 
@@ -20701,49 +20767,6 @@ Major mode for editing MetaPost sources.
 
 ;;;***
 
-;;;### (autoloads nil "metamail" "mail/metamail.el" (0 0 0 0))
-;;; Generated autoloads from mail/metamail.el
-
-(autoload 'metamail-interpret-header "metamail" "\
-Interpret a header part of a MIME message in current buffer.
-Its body part is not interpreted at all." t nil)
-
-(autoload 'metamail-interpret-body "metamail" "\
-Interpret a body part of a MIME message in current buffer.
-Optional argument VIEWMODE specifies the value of the
-EMACS_VIEW_MODE environment variable (defaulted to 1).
-Optional argument NODISPLAY non-nil means buffer is not
-redisplayed as output is inserted.
-Its header part is not interpreted at all.
-
-\(fn &optional VIEWMODE NODISPLAY)" t nil)
-
-(autoload 'metamail-buffer "metamail" "\
-Process current buffer through `metamail'.
-Optional argument VIEWMODE specifies the value of the
-EMACS_VIEW_MODE environment variable (defaulted to 1).
-Optional argument BUFFER specifies a buffer to be filled (nil
-means current).
-Optional argument NODISPLAY non-nil means buffer is not
-redisplayed as output is inserted.
-
-\(fn &optional VIEWMODE BUFFER NODISPLAY)" t nil)
-
-(autoload 'metamail-region "metamail" "\
-Process current region through `metamail'.
-Optional argument VIEWMODE specifies the value of the
-EMACS_VIEW_MODE environment variable (defaulted to 1).
-Optional argument BUFFER specifies a buffer to be filled (nil
-means current).
-Optional argument NODISPLAY non-nil means buffer is not
-redisplayed as output is inserted.
-
-\(fn BEG END &optional VIEWMODE BUFFER NODISPLAY)" t nil)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"metamail" '("metamail-")))
-
-;;;***
-
 ;;;### (autoloads nil "mh-acros" "mh-e/mh-acros.el" (0 0 0 0))
 ;;; Generated autoloads from mh-e/mh-acros.el
 
@@ -26181,13 +26204,12 @@ Open profile FILENAME.
 
 ;;;### (autoloads nil "project" "progmodes/project.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/project.el
+(push (purecopy '(project 0 3 0)) package--builtin-versions)
 
 (autoload 'project-current "project" "\
 Return the project instance in DIR or `default-directory'.
 When no project found in DIR, and MAYBE-PROMPT is non-nil, ask
-the user for a different directory to look in.  If that directory
-is not a part of a detectable project either, return a
-`transient' project instance rooted in it.
+the user for a different project to look in.
 
 \(fn &optional MAYBE-PROMPT DIR)" nil nil)
 
@@ -26210,15 +26232,21 @@ pattern to search for.
 \(fn REGEXP)" t nil)
 
 (autoload 'project-find-file "project" "\
-Visit a file (with completion) in the current project's roots.
+Visit a file (with completion) in the current project.
 The completion default is the filename at point, if one is
 recognized." t nil)
 
 (autoload 'project-or-external-find-file "project" "\
-Visit a file (with completion) in the current project's roots or external 
roots.
+Visit a file (with completion) in the current project or external roots.
 The completion default is the filename at point, if one is
 recognized." t nil)
 
+(autoload 'project-dired "project" "\
+Open Dired in the current project." t nil)
+
+(autoload 'project-eshell "project" "\
+Open Eshell in the current project." t nil)
+
 (autoload 'project-search "project" "\
 Search for REGEXP in all the files of the project.
 Stops when a match is found.
@@ -26235,6 +26263,23 @@ loop using the command \\[fileloop-continue].
 
 \(fn FROM TO)" t nil)
 
+(autoload 'project-compile "project" "\
+Run `compile' in the project root." t nil)
+
+(defvar project-switch-commands '(("f" "Find file" project-find-file) ("s" 
"Find regexp" project-find-regexp) ("d" "Dired" project-dired) ("e" "Eshell" 
project-eshell)) "\
+Alist mapping keys to project switching menu entries.
+Used by `project-switch-project' to construct a dispatch menu of
+commands available upon \"switching\" to another project.
+
+Each element looks like (KEY LABEL COMMAND), where COMMAND is the
+command to run when KEY is pressed.  LABEL is used to distinguish
+the choice in the dispatch menu.")
+
+(autoload 'project-switch-project "project" "\
+\"Switch\" to another project by running a chosen command.
+The available commands are picked from `project-switch-commands'
+and presented in a dispatch menu." t nil)
+
 (if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"project" '("project-")))
 
 ;;;***
@@ -26890,7 +26935,7 @@ HELP-TEXT is a text set in 
`hangul-input-method-help-text'.
 ;;;;;;  0 0))
 ;;; Generated autoloads from leim/quail/indian.el
 
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"quail/indian" '("inscript-" "quail-")))
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"quail/indian" '("indian-mlm-mozhi-u" "inscript-" "quail-")))
 
 ;;;***
 
@@ -30138,7 +30183,7 @@ have <h1>Very Major Headlines</h1> through <h6>Very 
Minor Headlines</h6>
 
 <p>Paragraphs only need an opening tag.  Line breaks and multiple spaces are
 ignored unless the text is <pre>preformatted.</pre>  Text can be marked as
-<b>bold</b>, <i>italic</i> or <u>underlined</u> using the normal M-o or
+<strong>bold</strong>, <em>italic</em> or <u>underlined</u> using the normal 
M-o or
 Edit/Text Properties/Face commands.
 
 Pages can have <a name=\"SOMENAME\">named points</a> and can link other points
@@ -36425,6 +36470,13 @@ These are the commands available for use in the file 
status buffer:
 
 \(fn DIR &optional BACKEND)" t nil)
 
+(autoload 'vc-dir-bookmark-jump "vc-dir" "\
+Provides the bookmark-jump behavior for a `vc-dir' buffer.
+This implements the `handler' function interface for the record
+type returned by `vc-dir-bookmark-make-record'.
+
+\(fn BMK)" nil nil)
+
 (if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"vc-dir" '("vc-")))
 
 ;;;***
@@ -38695,6 +38747,7 @@ If LIMIT is non-nil, then do not consider characters 
beyond LIMIT.
 
 ;;;### (autoloads nil "xref" "progmodes/xref.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/xref.el
+(push (purecopy '(xref 1 0 1)) package--builtin-versions)
 
 (autoload 'xref-find-backend "xref" nil nil nil)
 
@@ -38920,29 +38973,29 @@ Zone out, completely." t nil)
 ;;;;;;  "electric.el" "emacs-lisp/backquote.el" "emacs-lisp/byte-run.el"
 ;;;;;;  "emacs-lisp/cl-extra.el" "emacs-lisp/cl-macs.el" 
"emacs-lisp/cl-preloaded.el"
 ;;;;;;  "emacs-lisp/cl-seq.el" "emacs-lisp/eieio-compat.el" 
"emacs-lisp/eieio-custom.el"
-;;;;;;  "emacs-lisp/eieio-opt.el" "emacs-lisp/eldoc.el" 
"emacs-lisp/float-sup.el"
-;;;;;;  "emacs-lisp/lisp-mode.el" "emacs-lisp/lisp.el" "emacs-lisp/macroexp.el"
-;;;;;;  "emacs-lisp/map-ynp.el" "emacs-lisp/nadvice.el" "emacs-lisp/syntax.el"
-;;;;;;  "emacs-lisp/timer.el" "env.el" "epa-hook.el" "erc/erc-autoaway.el"
-;;;;;;  "erc/erc-button.el" "erc/erc-capab.el" "erc/erc-compat.el"
-;;;;;;  "erc/erc-dcc.el" "erc/erc-desktop-notifications.el" 
"erc/erc-ezbounce.el"
-;;;;;;  "erc/erc-fill.el" "erc/erc-identd.el" "erc/erc-imenu.el"
-;;;;;;  "erc/erc-join.el" "erc/erc-list.el" "erc/erc-log.el" "erc/erc-match.el"
-;;;;;;  "erc/erc-menu.el" "erc/erc-netsplit.el" "erc/erc-notify.el"
-;;;;;;  "erc/erc-page.el" "erc/erc-pcomplete.el" "erc/erc-replace.el"
-;;;;;;  "erc/erc-ring.el" "erc/erc-services.el" "erc/erc-sound.el"
-;;;;;;  "erc/erc-speedbar.el" "erc/erc-spelling.el" "erc/erc-stamp.el"
-;;;;;;  "erc/erc-track.el" "erc/erc-truncate.el" "erc/erc-xdcc.el"
-;;;;;;  "eshell/em-alias.el" "eshell/em-banner.el" "eshell/em-basic.el"
-;;;;;;  "eshell/em-cmpl.el" "eshell/em-dirs.el" "eshell/em-glob.el"
-;;;;;;  "eshell/em-hist.el" "eshell/em-ls.el" "eshell/em-pred.el"
-;;;;;;  "eshell/em-prompt.el" "eshell/em-rebind.el" "eshell/em-script.el"
-;;;;;;  "eshell/em-smart.el" "eshell/em-term.el" "eshell/em-tramp.el"
-;;;;;;  "eshell/em-unix.el" "eshell/em-xtra.el" "facemenu.el" "faces.el"
-;;;;;;  "files.el" "font-core.el" "font-lock.el" "format.el" "frame.el"
-;;;;;;  "help.el" "hfy-cmap.el" "ibuf-ext.el" "indent.el" 
"international/characters.el"
-;;;;;;  "international/charprop.el" "international/charscript.el"
-;;;;;;  "international/cp51932.el" "international/eucjp-ms.el" 
"international/mule-cmds.el"
+;;;;;;  "emacs-lisp/eieio-opt.el" "emacs-lisp/float-sup.el" 
"emacs-lisp/lisp-mode.el"
+;;;;;;  "emacs-lisp/lisp.el" "emacs-lisp/macroexp.el" "emacs-lisp/map-ynp.el"
+;;;;;;  "emacs-lisp/nadvice.el" "emacs-lisp/syntax.el" "emacs-lisp/timer.el"
+;;;;;;  "env.el" "epa-hook.el" "erc/erc-autoaway.el" "erc/erc-button.el"
+;;;;;;  "erc/erc-capab.el" "erc/erc-compat.el" "erc/erc-dcc.el" 
"erc/erc-desktop-notifications.el"
+;;;;;;  "erc/erc-ezbounce.el" "erc/erc-fill.el" "erc/erc-identd.el"
+;;;;;;  "erc/erc-imenu.el" "erc/erc-join.el" "erc/erc-list.el" "erc/erc-log.el"
+;;;;;;  "erc/erc-match.el" "erc/erc-menu.el" "erc/erc-netsplit.el"
+;;;;;;  "erc/erc-notify.el" "erc/erc-page.el" "erc/erc-pcomplete.el"
+;;;;;;  "erc/erc-replace.el" "erc/erc-ring.el" "erc/erc-services.el"
+;;;;;;  "erc/erc-sound.el" "erc/erc-speedbar.el" "erc/erc-spelling.el"
+;;;;;;  "erc/erc-stamp.el" "erc/erc-track.el" "erc/erc-truncate.el"
+;;;;;;  "erc/erc-xdcc.el" "eshell/em-alias.el" "eshell/em-banner.el"
+;;;;;;  "eshell/em-basic.el" "eshell/em-cmpl.el" "eshell/em-dirs.el"
+;;;;;;  "eshell/em-glob.el" "eshell/em-hist.el" "eshell/em-ls.el"
+;;;;;;  "eshell/em-pred.el" "eshell/em-prompt.el" "eshell/em-rebind.el"
+;;;;;;  "eshell/em-script.el" "eshell/em-smart.el" "eshell/em-term.el"
+;;;;;;  "eshell/em-tramp.el" "eshell/em-unix.el" "eshell/em-xtra.el"
+;;;;;;  "facemenu.el" "faces.el" "files.el" "font-core.el" "font-lock.el"
+;;;;;;  "format.el" "frame.el" "help.el" "hfy-cmap.el" "ibuf-ext.el"
+;;;;;;  "indent.el" "international/characters.el" "international/charprop.el"
+;;;;;;  "international/charscript.el" "international/cp51932.el"
+;;;;;;  "international/eucjp-ms.el" "international/mule-cmds.el"
 ;;;;;;  "international/mule-conf.el" "international/mule.el" 
"international/uni-bidi.el"
 ;;;;;;  "international/uni-brackets.el" "international/uni-category.el"
 ;;;;;;  "international/uni-combining.el" "international/uni-comment.el"
diff --git a/lisp/progmodes/cc-align.el b/lisp/progmodes/cc-align.el
index c49bdc5..6172afe 100644
--- a/lisp/progmodes/cc-align.el
+++ b/lisp/progmodes/cc-align.el
@@ -791,32 +791,32 @@ arglist-cont-nonempty."
       c-basic-offset))
 
 (defun c-lineup-ternary-bodies (langelem)
-  "Line up true and false branches of a ternary operator (i.e. ‘?:’).
+  "Line up true and false branches of a ternary operator (i.e. `?:').
 More precisely, if the line starts with a colon which is a part of
-a said operator it with corresponding question mark; otherwise return
-nil.  For example:
+a said operator, align it with corresponding question mark; otherwise
+return nil.  For example:
 
     return arg % 2 == 0 ? arg / 2
                         : (3 * arg + 1);    <- c-lineup-ternary-bodies
 
-Works with: arglist-cont, arglist-cont-nonempty and statement-cont.
-"
+Works with: arglist-cont, arglist-cont-nonempty and statement-cont."
   (save-excursion
     (back-to-indentation)
     (when (and (eq ?: (char-after))
                (not (eq ?: (char-after (1+ (point))))))
       (let ((limit (c-langelem-pos langelem)) (depth 1))
         (catch 'done
-          (while (c-syntactic-skip-backward "^?:" limit t)
-            (goto-char (1- (point)))
+          (while (and (c-syntactic-skip-backward "^?:" limit t)
+                     (not (bobp)))
+            (backward-char)
             (cond ((eq (char-after) ??)
-                   ;; If we’ve found a question mark, decrease depth.  If we’re
-                   ;; reached zero, we’ve found the one we were looking for.
+                   ;; If we've found a question mark, decrease depth.  If we've
+                   ;; reached zero, we've found the one we were looking for.
                    (when (zerop (setq depth (1- depth)))
                      (throw 'done (vector (current-column)))))
                   ((or (eq ?: (char-before)) (eq ?? (char-before)))
-                   ;; Step over ‘::’ and ‘?:’ operators.  We don’t have to
-                   ;; handle ‘?:’ here but doing so saves an iteration.
+                   ;; Step over `::' and `?:' operators.  We don't have to
+                   ;; handle `?:' here but doing so saves an iteration.
                    (if (eq (point) limit)
                        (throw 'done nil)
                      (goto-char (1- (point)))))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index b3b2374..4869f5c 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -1621,7 +1621,7 @@ Note that the style variables are always made local to 
the buffer."
       (goto-char (1+ end))             ; After the \
       ;; Search forward for EOLL
       (setq lim (re-search-forward "\\(?:\\\\\\(?:.\\|\n\\)\\|[^\\\n\r]\\)*"
-                                          nil t))
+                                  nil t))
       (goto-char (1+ end))
       (when (c-search-forward-char-property-with-value-on-char
             'syntax-table '(15) ?\" lim)
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index d37eb8c..8812c49 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -861,11 +861,12 @@ non-nil result supercedes the xrefs produced by
 
     xrefs))
 
-(declare-function project-external-roots "project")
+(declare-function xref-apropos-regexp "xref" (pattern))
 
-(cl-defmethod xref-backend-apropos ((_backend (eql elisp)) regexp)
+(cl-defmethod xref-backend-apropos ((_backend (eql elisp)) pattern)
   (apply #'nconc
-         (let (lst)
+         (let ((regexp (xref-apropos-regexp pattern))
+               lst)
            (dolist (sym (apropos-internal regexp))
              (push (elisp--xref-find-definitions sym) lst))
            (nreverse lst))))
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 897f105..edadbbd 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -2080,8 +2080,8 @@ file name, add `tag-partial-file-name-match-p' to the 
list value.")
 (cl-defmethod xref-backend-definitions ((_backend (eql etags)) symbol)
   (etags--xref-find-definitions symbol))
 
-(cl-defmethod xref-backend-apropos ((_backend (eql etags)) symbol)
-  (etags--xref-find-definitions symbol t))
+(cl-defmethod xref-backend-apropos ((_backend (eql etags)) pattern)
+  (etags--xref-find-definitions (xref-apropos-regexp pattern) t))
 
 (defun etags--xref-find-definitions (pattern &optional regexp?)
   ;; This emulates the behavior of `find-tag-in-order' but instead of
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 2d0b6c4..c701b80 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -93,6 +93,11 @@
 (require 'cl-generic)
 (eval-when-compile (require 'subr-x))
 
+(defgroup project nil
+  "Operations on the current project."
+  :version "28.1"
+  :group 'tools)
+
 (defvar project-find-functions (list #'project-try-vc)
   "Special hook to find the project containing a given directory.
 Each functions on this hook is called in turn with one
@@ -236,12 +241,12 @@ to find the list of ignores for each directory."
 (defgroup project-vc nil
   "Project implementation based on the VC package."
   :version "25.1"
-  :group 'tools)
+  :group 'project)
 
 (defcustom project-vc-ignores nil
   "List of patterns to include in `project-ignores'."
   :type '(repeat string)
-  :safe 'listp)
+  :safe #'listp)
 
 (defcustom project-vc-merge-submodules t
   "Non-nil to consider submodules part of the parent project.
@@ -249,8 +254,9 @@ to find the list of ignores for each directory."
 After changing this variable (using Customize or .dir-locals.el)
 you might have to restart Emacs to see the effect."
   :type 'boolean
+  :version "28.1"
   :package-version '(project . "0.2.0")
-  :safe 'booleanp)
+  :safe #'booleanp)
 
 ;; FIXME: Using the current approach, major modes are supposed to set
 ;; this variable to a buffer-local value.  So we don't have access to
@@ -601,6 +607,7 @@ For the arguments list, see 
`project--read-file-cpd-relative'."
                  (const :tag "Read with completion from absolute names"
                         project--read-file-absolute)
                  (function :tag "Custom function" nil))
+  :group 'project
   :version "27.1")
 
 (defun project--read-file-cpd-relative (prompt
@@ -672,6 +679,20 @@ PREDICATE, HIST, and DEFAULT have the same meaning as in
   (dired (project-root (project-current t))))
 
 ;;;###autoload
+(defun project-vc-dir ()
+  "Open VC-Dir in the current project."
+  (interactive)
+  (vc-dir (project-root (project-current t))))
+
+;;;###autoload
+(defun project-shell ()
+  "Open Shell in the current project."
+  (interactive)
+  (let ((default-directory (project-root (project-current t))))
+    ;; Use ‘create-file-buffer’ to uniquify shell buffer names.
+    (shell (create-file-buffer "*shell*"))))
+
+;;;###autoload
 (defun project-eshell ()
   "Open Eshell in the current project."
   (interactive)
@@ -705,39 +726,50 @@ loop using the command \\[fileloop-continue]."
    from to (project-files (project-current t)) 'default)
   (fileloop-continue))
 
+(defvar compilation-read-command)
+(declare-function compilation-read-command "compile")
+
 ;;;###autoload
-(defun project-compile ()
-  "Run `compile' in the project root."
-  (interactive)
+(defun project-compile (command &optional comint)
+  "Run `compile' in the project root.
+Arguments the same as in `compile'."
+  (interactive
+   (list
+    (let ((command (eval compile-command)))
+      (if (or compilation-read-command current-prefix-arg)
+         (compilation-read-command command)
+       command))
+    (consp current-prefix-arg)))
   (let* ((pr (project-current t))
          (default-directory (project-root pr)))
-    (call-interactively 'compile)))
+    (compile command comint)))
 
 
 ;;; Project list
 
+(defcustom project-list-file (locate-user-emacs-file "project-list")
+  "File to save the list of known projects."
+  :type 'file
+  :version "28.1"
+  :group 'project)
+
 (defvar project--list 'unset
   "List of known project directories.")
 
-(defun project--ensure-file-exists (filename)
-  "Create an empty file FILENAME if it doesn't exist."
-  (unless (file-exists-p filename)
-    (with-temp-buffer
-      (write-file filename))))
-
 (defun project--read-project-list ()
   "Initialize `project--list' from the project list file."
-  (let ((filename (locate-user-emacs-file "project-list")))
-    (project--ensure-file-exists filename)
-    (with-temp-buffer
-      (insert-file-contents filename)
-      (let ((dirs (split-string (buffer-string) "\n" t))
-            (project-list '()))
-        (dolist (dir dirs)
-          (cl-pushnew (file-name-as-directory dir)
-                      project-list
-                      :test #'equal))
-        (setq project--list (reverse project-list))))))
+  (let ((filename project-list-file))
+    (setq project--list
+          (when (file-exists-p filename)
+            (with-temp-buffer
+              (insert-file-contents filename)
+              (let ((dirs (split-string (buffer-string) "\n" t))
+                    (project-list '()))
+                (dolist (dir dirs)
+                  (cl-pushnew (file-name-as-directory dir)
+                              project-list
+                              :test #'equal))
+                (reverse project-list)))))))
 
 (defun project--ensure-read-project-list ()
   "Initialize `project--list' if it hasn't already been."
@@ -746,28 +778,27 @@ loop using the command \\[fileloop-continue]."
 
 (defun project--write-project-list ()
   "Persist `project--list' to the project list file."
-  (let ((filename (locate-user-emacs-file "project-list")))
+  (let ((filename project-list-file))
     (with-temp-buffer
       (insert (string-join project--list "\n"))
       (write-region nil nil filename nil 'silent))))
 
 (defun project--add-to-project-list-front (pr)
-  "Add project PR to the front of the project list and save it.
-Return PR."
+  "Add project PR to the front of the project list.
+Save the result to disk if the project list was changed."
   (project--ensure-read-project-list)
-  (let ((dir (project-root pr)))
-    (setq project--list (delete dir project--list))
-    (push dir project--list))
-  (project--write-project-list)
-  pr)
+  (let* ((dir (project-root pr))
+         (do-write (not (equal (car project--list) dir))))
+    (when do-write
+      (setq project--list (delete dir project--list))
+      (push dir project--list)
+      (project--write-project-list))))
 
 (defun project--remove-from-project-list (pr-dir)
   "Remove directory PR-DIR from the project list.
 If the directory was in the list before the removal, save the
 result to disk."
   (project--ensure-read-project-list)
-  ;; XXX: This hardcodes that the number of roots = 1.
-  ;; It's fine, though.
   (when (member pr-dir project--list)
     (setq project--list (delete pr-dir project--list))
     (message "Project `%s' not found; removed from list" pr-dir)
@@ -795,8 +826,10 @@ It's also possible to enter an arbitrary directory."
 ;;;###autoload
 (defvar project-switch-commands
   '(("f" "Find file" project-find-file)
-    ("s" "Find regexp" project-find-regexp)
+    ("r" "Find regexp" project-find-regexp)
     ("d" "Dired" project-dired)
+    ("v" "VC-Dir" project-vc-dir)
+    ("s" "Shell" project-shell)
     ("e" "Eshell" project-eshell))
   "Alist mapping keys to project switching menu entries.
 Used by `project-switch-project' to construct a dispatch menu of
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 2477884..5b5fb4b 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -273,7 +273,11 @@ find a search tool; by default, this uses \"find | grep\" 
in the
       (project-external-roots pr)))))
 
 (cl-defgeneric xref-backend-apropos (backend pattern)
-  "Find all symbols that match regexp PATTERN.")
+  "Find all symbols that match PATTERN string.
+The second argument has the same meaning as in `apropos'.
+
+If BACKEND is implemented in Lisp, it can use
+`xref-apropos-regexp' to convert the pattern to regexp.")
 
 (cl-defgeneric xref-backend-identifier-at-point (_backend)
   "Return the relevant identifier at point.
@@ -1098,14 +1102,24 @@ The argument has the same meaning as in `apropos'."
                       "Search for pattern (word list or regexp): "
                       nil 'xref--read-pattern-history)))
   (require 'apropos)
-  (xref--find-xrefs pattern 'apropos
-                    (apropos-parse-pattern
-                     (if (string-equal (regexp-quote pattern) pattern)
-                         ;; Split into words
-                         (or (split-string pattern "[ \t]+" t)
-                             (user-error "No word list given"))
-                       pattern))
-                    nil))
+  (let* ((newpat
+          (if (and (version< emacs-version "28.0.50")
+                   (memq (xref-find-backend) '(elisp etags)))
+              ;; Handle backends in older Emacs.
+              (xref-apropos-regexp pattern)
+            ;; Delegate pattern handling to the backend fully.
+            ;; The old way didn't work for "external" backends.
+            pattern)))
+    (xref--find-xrefs pattern 'apropos newpat nil)))
+
+(defun xref-apropos-regexp (pattern)
+  "Return an Emacs regexp from PATTERN similar to `apropos'."
+  (apropos-parse-pattern
+   (if (string-equal (regexp-quote pattern) pattern)
+       ;; Split into words
+       (or (split-string pattern "[ \t]+" t)
+           (user-error "No word list given"))
+     pattern)))
 
 
 ;;; Key bindings
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index d24d59c..76e7f8c 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -1554,9 +1554,10 @@ indirectly called by the latter."
 Like \\[switch-to-buffer-other-frame] (which see), but creates a new tab."
   (interactive
    (list (read-buffer-to-switch "Switch to buffer in other tab: ")))
-  (display-buffer buffer-or-name '((display-buffer-in-tab)
-                                   (inhibit-same-window . nil)
-                                   (reusable-frames . t))
+  (display-buffer (window-normalize-buffer-to-switch-to buffer-or-name)
+                  '((display-buffer-in-tab)
+                    (inhibit-same-window . nil)
+                    (reusable-frames . t))
                   norecord))
 
 (defun find-file-other-tab (filename &optional wildcards)
diff --git a/src/alloc.c b/src/alloc.c
index dc92d67..281525b 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -67,7 +67,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 # include <malloc.h>
 #endif
 
-#if defined HAVE_VALGRIND_VALGRIND_H && !defined USE_VALGRIND
+#if (defined ENABLE_CHECKING \
+     && defined HAVE_VALGRIND_VALGRIND_H && !defined USE_VALGRIND)
 # define USE_VALGRIND 1
 #endif
 
@@ -4463,7 +4464,7 @@ live_string_holding (struct mem_node *m, void *p)
 
       /* P must point into a Lisp_String structure, and it
         must not be on the free-list.  */
-      if (0 <= offset && offset < STRING_BLOCK_SIZE * sizeof b->strings[0])
+      if (0 <= offset && offset < sizeof b->strings)
        {
          cp = ptr_bounds_copy (cp, b);
          struct Lisp_String *s = p = cp -= offset % sizeof b->strings[0];
@@ -4496,7 +4497,7 @@ live_cons_holding (struct mem_node *m, void *p)
       /* P must point into a Lisp_Cons, not be
         one of the unused cells in the current cons block,
         and not be on the free-list.  */
-      if (0 <= offset && offset < CONS_BLOCK_SIZE * sizeof b->conses[0]
+      if (0 <= offset && offset < sizeof b->conses
          && (b != cons_block
              || offset / sizeof b->conses[0] < cons_block_index))
        {
@@ -4532,7 +4533,7 @@ live_symbol_holding (struct mem_node *m, void *p)
       /* P must point into the Lisp_Symbol, not be
         one of the unused cells in the current symbol block,
         and not be on the free-list.  */
-      if (0 <= offset && offset < SYMBOL_BLOCK_SIZE * sizeof b->symbols[0]
+      if (0 <= offset && offset < sizeof b->symbols
          && (b != symbol_block
              || offset / sizeof b->symbols[0] < symbol_block_index))
        {
@@ -4566,9 +4567,8 @@ live_float_p (struct mem_node *m, void *p)
 
       /* P must point to the start of a Lisp_Float and not be
         one of the unused cells in the current float block.  */
-      return (offset >= 0
+      return (0 <= offset && offset < sizeof b->floats
              && offset % sizeof b->floats[0] == 0
-             && offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
              && (b != float_block
                  || offset / sizeof b->floats[0] < float_block_index));
     }
@@ -4694,35 +4694,6 @@ mark_maybe_objects (Lisp_Object const *array, ptrdiff_t 
nelts)
     mark_maybe_object (*array);
 }
 
-/* A lower bound on the alignment of Lisp objects that need marking.
-   Although 1 is safe, higher values speed up mark_maybe_pointer.
-   If USE_LSB_TAG, this value is typically GCALIGNMENT; otherwise,
-   it's determined by the natural alignment of Lisp structs.
-   All vectorlike objects have alignment at least that of union
-   vectorlike_header and it's unlikely they all have alignment greater,
-   so use the union as a safe and likely-accurate standin for
-   vectorlike objects.  */
-
-enum { GC_OBJECT_ALIGNMENT_MINIMUM
-         = max (GCALIGNMENT,
-               min (alignof (union vectorlike_header),
-                    min (min (alignof (struct Lisp_Cons),
-                              alignof (struct Lisp_Float)),
-                         min (alignof (struct Lisp_String),
-                              alignof (struct Lisp_Symbol))))) };
-
-/* Return true if P might point to Lisp data that can be garbage
-   collected, and false otherwise (i.e., false if it is easy to see
-   that P cannot point to Lisp data that can be garbage collected).
-   Symbols are implemented via offsets not pointers, but the offsets
-   are also multiples of GC_OBJECT_ALIGNMENT_MINIMUM.  */
-
-static bool
-maybe_lisp_pointer (void *p)
-{
-  return (uintptr_t) p % GC_OBJECT_ALIGNMENT_MINIMUM == 0;
-}
-
 /* If P points to Lisp data, mark that as live if it isn't already
    marked.  */
 
@@ -4731,13 +4702,10 @@ mark_maybe_pointer (void *p)
 {
   struct mem_node *m;
 
-#ifdef USE_VALGRIND
+#if USE_VALGRIND
   VALGRIND_MAKE_MEM_DEFINED (&p, sizeof (p));
 #endif
 
-  if (!maybe_lisp_pointer (p))
-    return;
-
   if (pdumper_object_p (p))
     {
       int type = pdumper_find_object_type (p);
@@ -4837,7 +4805,16 @@ mark_memory (void const *start, void const *end)
 
   for (pp = start; (void const *) pp < end; pp += GC_POINTER_ALIGNMENT)
     {
-      mark_maybe_pointer (*(void *const *) pp);
+      char *p = *(char *const *) pp;
+      mark_maybe_pointer (p);
+
+      /* Unmask any struct Lisp_Symbol pointer that make_lisp_symbol
+        previously disguised by adding the address of 'lispsym'.
+        On a host with 32-bit pointers and 64-bit Lisp_Objects,
+        a Lisp_Object might be split into registers saved into
+        non-adjacent words and P might be the low-order word's value.  */
+      p += (intptr_t) lispsym;
+      mark_maybe_pointer (p);
 
       verify (alignof (Lisp_Object) % GC_POINTER_ALIGNMENT == 0);
       if (alignof (Lisp_Object) == GC_POINTER_ALIGNMENT
diff --git a/src/composite.c b/src/composite.c
index 518502b..2c589e4 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -1987,7 +1987,9 @@ preceding and/or following characters, this char-table 
contains
 a function to call to compose that character.
 
 The element at index C in the table, if non-nil, is a list of
-composition rules of this form: ([PATTERN PREV-CHARS FUNC] ...)
+composition rules of the form ([PATTERN PREV-CHARS FUNC] ...);
+the rules must be specified in the descending order of PREV-CHARS
+values.
 
 PATTERN is a regular expression which C and the surrounding
 characters must match.
diff --git a/src/emacs.c b/src/emacs.c
index 8ecf9b4..228ac29 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -358,7 +358,10 @@ setlocale (int cat, char const *locale)
 static bool
 using_utf8 (void)
 {
-#ifdef HAVE_WCHAR_H
+  /* We don't want to compile in mbrtowc on WINDOWSNT because that
+     will prevent Emacs from starting on older Windows systems, while
+     the result is known in advance anyway...  */
+#if defined HAVE_WCHAR_H && !defined WINDOWSNT
   wchar_t wc;
   mbstate_t mbs = { 0 };
   return mbrtowc (&wc, "\xc4\x80", 2, &mbs) == 2 && wc == 0x100;
diff --git a/src/lread.c b/src/lread.c
index 9f849ed..026f3b6 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -3030,17 +3030,18 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list)
          struct Lisp_Vector *vec;
          tmp = read_vector (readcharfun, 1);
          vec = XVECTOR (tmp);
-         if (! (COMPILED_STACK_DEPTH < vec->header.size
-                && (FIXNUMP (vec->contents[COMPILED_ARGLIST])
-                    || CONSP (vec->contents[COMPILED_ARGLIST])
-                    || NILP (vec->contents[COMPILED_ARGLIST]))
-                && ((STRINGP (vec->contents[COMPILED_BYTECODE])
-                     && VECTORP (vec->contents[COMPILED_CONSTANTS]))
-                    || CONSP (vec->contents[COMPILED_BYTECODE]))
-                && FIXNATP (vec->contents[COMPILED_STACK_DEPTH])))
+         if (! (COMPILED_STACK_DEPTH < ASIZE (tmp)
+                && (FIXNUMP (AREF (tmp, COMPILED_ARGLIST))
+                    || CONSP (AREF (tmp, COMPILED_ARGLIST))
+                    || NILP (AREF (tmp, COMPILED_ARGLIST)))
+                && ((STRINGP (AREF (tmp, COMPILED_BYTECODE))
+                     && VECTORP (AREF (tmp, COMPILED_CONSTANTS)))
+                    || CONSP (AREF (tmp, COMPILED_BYTECODE)))
+                && FIXNATP (AREF (tmp, COMPILED_STACK_DEPTH))))
            invalid_syntax ("Invalid byte-code object");
 
-         if (STRING_MULTIBYTE (AREF (tmp, COMPILED_BYTECODE)))
+         if (STRINGP (AREF (tmp, COMPILED_BYTECODE))
+             && STRING_MULTIBYTE (AREF (tmp, COMPILED_BYTECODE)))
            {
              /* BYTESTR must have been produced by Emacs 20.2 or earlier
                 because it produced a raw 8-bit string for byte-code and
@@ -3051,7 +3052,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list)
                    Fstring_as_unibyte (AREF (tmp, COMPILED_BYTECODE)));
            }
 
-         if (COMPILED_DOC_STRING < vec->header.size
+         if (COMPILED_DOC_STRING < ASIZE (tmp)
              && EQ (AREF (tmp, COMPILED_DOC_STRING), make_fixnum (0)))
            {
              /* read_list found a docstring like '(#$ . 5521)' and treated it
diff --git a/src/pdumper.c b/src/pdumper.c
index 29e3560..ffe59fb 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2256,7 +2256,7 @@ dump_bignum (struct dump_context *ctx, Lisp_Object object)
 static dump_off
 dump_float (struct dump_context *ctx, const struct Lisp_Float *lfloat)
 {
-#if CHECK_STRUCTS && !defined (HASH_Lisp_Float_50A7B216D9)
+#if CHECK_STRUCTS && !defined (HASH_Lisp_Float_7E7D284C02)
 # error "Lisp_Float changed. See CHECK_STRUCTS comment in config.h."
 #endif
   eassert (ctx->header.cold_start);
diff --git a/src/xdisp.c b/src/xdisp.c
index ea28395..327e8a1 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -8692,6 +8692,7 @@ handle_stop_backwards (struct it *it, ptrdiff_t charpos)
   ptrdiff_t where_we_are = (bufp ? IT_CHARPOS (*it) : IT_STRING_CHARPOS (*it));
   struct display_pos save_current = it->current;
   struct text_pos save_position = it->position;
+  struct composition_it save_cmp_it = it->cmp_it;
   struct text_pos pos1;
   ptrdiff_t next_stop;
 
@@ -8719,6 +8720,7 @@ handle_stop_backwards (struct it *it, ptrdiff_t charpos)
   it->bidi_p = true;
   it->current = save_current;
   it->position = save_position;
+  it->cmp_it = save_cmp_it;
   next_stop = it->stop_charpos;
   it->stop_charpos = it->prev_stop;
   handle_stop (it);
@@ -11575,7 +11577,9 @@ display_echo_area_1 (ptrdiff_t a1, Lisp_Object a2)
   /* Display.  */
   clear_glyph_matrix (w->desired_matrix);
   XSETWINDOW (window, w);
+  void *itdata = bidi_shelve_cache ();
   try_window (window, start, 0);
+  bidi_unshelve_cache (itdata, false);
 
   return window_height_changed_p;
 }
@@ -19748,7 +19752,7 @@ find_last_row_displaying_text (struct glyph_matrix 
*matrix, struct it *it,
    by changes at the start of current_buffer that occurred since W's
    current matrix was built.  Value is null if no such row exists.
 
-   BEG_UNCHANGED us the number of characters unchanged at the start of
+   BEG_UNCHANGED is the number of characters unchanged at the start of
    current_buffer.  BEG + BEG_UNCHANGED is the buffer position of the
    first changed character in current_buffer.  Characters at positions <
    BEG + BEG_UNCHANGED are at the same buffer positions as they were
@@ -27702,6 +27706,7 @@ fill_gstring_glyph_string (struct glyph_string *s, int 
face_id,
   while (glyph < last
         && glyph->u.cmp.automatic
         && glyph->u.cmp.id == s->cmp_id
+        && glyph->face_id == face_id
         && s->cmp_to == glyph->slice.cmp.from)
     {
       s->width += glyph->pixel_width;
diff --git a/src/xfaces.c b/src/xfaces.c
index 7d7aff9..cf15528 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -4356,15 +4356,15 @@ color_distance (Emacs_Color *x, Emacs_Color *y)
 
      See <https://www.compuphase.com/cmetric.htm> for more info.  */
 
-  long r = (x->red   - y->red)   >> 8;
-  long g = (x->green - y->green) >> 8;
-  long b = (x->blue  - y->blue)  >> 8;
-  long r_mean = (x->red + y->red) >> 9;
-
-  return
-    (((512 + r_mean) * r * r) >> 8)
-    + 4 * g * g
-    + (((767 - r_mean) * b * b) >> 8);
+  long long r = x->red   - y->red;
+  long long g = x->green - y->green;
+  long long b = x->blue  - y->blue;
+  long long r_mean = (x->red + y->red) >> 1;
+
+  return (((((2 * 65536 + r_mean) * r * r) >> 16)
+           + 4 * g * g
+           + (((2 * 65536 + 65535 - r_mean) * b * b) >> 16))
+          >> 16);
 }
 
 
@@ -4374,7 +4374,9 @@ COLOR1 and COLOR2 may be either strings containing the 
color name,
 or lists of the form (RED GREEN BLUE), each in the range 0 to 65535 inclusive.
 If FRAME is unspecified or nil, the current frame is used.
 If METRIC is specified, it should be a function that accepts
-two lists of the form (RED GREEN BLUE) aforementioned. */)
+two lists of the form (RED GREEN BLUE) aforementioned.
+Despite the name, this is not a true distance metric as it does not satisfy
+the triangle inequality.  */)
   (Lisp_Object color1, Lisp_Object color2, Lisp_Object frame,
    Lisp_Object metric)
 {
@@ -4931,7 +4933,7 @@ DEFUN ("face-attributes-as-vector", 
Fface_attributes_as_vector,
 
 /* If the distance (as returned by color_distance) between two colors is
    less than this, then they are considered the same, for determining
-   whether a color is supported or not.  The range of values is 0-65535.  */
+   whether a color is supported or not.  */
 
 #define TTY_SAME_COLOR_THRESHOLD  10000
 
diff --git a/test/src/xfaces-tests.el b/test/src/xfaces-tests.el
new file mode 100644
index 0000000..5ed16c9
--- /dev/null
+++ b/test/src/xfaces-tests.el
@@ -0,0 +1,27 @@
+;;; xfaces-tests.el --- tests for xfaces.c           -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+(require 'ert)
+
+(ert-deftest xfaces-color-distance ()
+  ;; Check symmetry (bug#41544).
+  (should (equal (color-distance "#222222" "#ffffff")
+                 (color-distance "#ffffff" "#222222"))))
+
+(provide 'xfaces-tests)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]