]> git.eshelyaron.com Git - emacs.git/commitdiff
Merge remote-tracking branch 'origin/master' into feature/tramp-thread-safe
authorMichael Albinus <michael.albinus@gmx.de>
Sat, 15 Feb 2020 16:04:45 +0000 (17:04 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Sat, 15 Feb 2020 16:04:45 +0000 (17:04 +0100)
13 files changed:
1  2 
doc/emacs/files.texi
doc/lispref/commands.texi
doc/lispref/elisp.texi
doc/lispref/files.texi
etc/NEWS
lisp/files.el
lisp/net/tramp-cache.el
lisp/net/tramp-compat.el
lisp/net/tramp-ftp.el
lisp/net/tramp.el
lisp/simple.el
lisp/vc/vc-hooks.el
test/lisp/net/tramp-tests.el

Simple merge
Simple merge
Simple merge
Simple merge
diff --cc etc/NEWS
index 5d91bc41a91d1914c3cdee9427afac5a0717d343,1f8e6049a88fa74d1db51af2264ab4eb7040af51..5fd24395bac4156212223811496675e28a29a6e7
+++ b/etc/NEWS
@@@ -16,572 -16,85 +16,95 @@@ You can narrow news to a specific versi
  with a prefix argument or by typing 'C-u C-h C-n'.
  
  Temporary note:
- +++ indicates that all necessary documentation updates are complete.
-     (This means all relevant manuals in doc/ AND lisp doc-strings.)
+ +++ indicates that all relevant manuals in doc/ have been updated.
  --- means no change in the manuals is needed.
- When you add a new item, use the appropriate mark if you are sure it applies,
+ When you add a new item, use the appropriate mark if you are sure it
+ applies, and please also update docstrings as needed.
  
  \f
- * Installation Changes in Emacs 27.1
+ * Installation Changes in Emacs 28.1
  
- ** Emacs now uses GMP, the GNU Multiple Precision library.
- By default, if 'configure' does not find a suitable libgmp, it
- arranges for the included mini-gmp library to be built and used.
- The new 'configure' option --without-libgmp uses mini-gmp even if a
- suitable libgmp is available.
+ ** Cairo graphics library is now used by default if found.
+ '--with-cairo' is now the default, if the appropriate development files
+ are found by 'configure'.  Note that building with Cairo means using
+ Pango instead of libXFT for font support.  Since Pango 1.44 has
+ removed support for bitmapped fonts, this may require you to adjust
+ your font settings.
  
- ** The new configure option '--with-json' adds support for JSON using
- the Jansson library.  It is on by default; use 'configure
- --with-json=no' to build without Jansson support.  The new JSON
- functions 'json-serialize', 'json-insert', 'json-parse-string', and
- 'json-parse-buffer' are typically much faster than their Lisp
- counterparts from json.el.
- ** The etags program now uses the C library's regular expression matcher
- when possible, and a compatible regex substitute otherwise.  This will
- let developers maintain Emacs's own regex code without having to also
- support other programs.  The new configure option '--without-included-regex'
- forces etags to use the C library's regex matcher even if the regex
- substitute ordinarily would be used to work around compatibility problems.
- ** Emacs has been ported to the -fcheck-pointer-bounds option of GCC.
- This causes Emacs to check bounds of some arrays addressed by its
- internal pointers, which can be helpful when debugging the Emacs
- interpreter or modules that it uses.  If your platform supports it you
- can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2
- -mmpx -fcheck-pointer-bounds"' on Intel MPX platforms.
- ** Emacs now normally uses a C pointer type instead of a C integer
- type to implement Lisp_Object, which is the fundamental machine word
- type internal to the Emacs Lisp interpreter.  This change aims to
- catch typos and support -fcheck-pointer-bounds.  The 'configure'
- option --enable-check-lisp-object-type is therefore no longer as
- useful and so is no longer enabled by default in developer builds,
- to reduce differences between developer and production builds.
- ** Ibuffer
- ---
- *** All mode filters can now accept a list of symbols.
- This means you can now easily filter several major modes, as well
- as a single mode.
- ** Gnus
- +++
- *** The nnimap backend now has support for IMAP namespaces.
- This feature can be enabled by setting the new 'nnimap-use-namespaces'
- server variable to non-nil.
\f
- * Startup Changes in Emacs 27.1
- +++
- ** Emacs can now be configured using an early init file.
- The file is called 'early-init.el', in 'user-emacs-directory'.  It is
- loaded very early in the startup process: before graphical elements
- such as the tool bar are initialized, and before the package manager
- is initialized.  The primary purpose is to allow customizing how the
- package system is initialized given that initialization now happens
- before loading the regular init file (see below).
- We recommend against putting any customizations in this file that
- don't need to be set up before initializing installed add-on packages,
- because the early init file is read too early into the startup
- process, and some important parts of the Emacs session, such as
- window-system and other GUI features, are not yet set up, which could
- make some customization fail to work.
- +++
- ** Installed packages are now activated *before* loading the init file.
- This is part of a change intended to eliminate the behavior of
- package.el inserting a call to 'package-initialize' into the init
- file, which was previously done when Emacs was started.  As a result
- of this change, it is no longer necessary to call 'package-initialize'
- in your init file.
- However, if your init file changes the values of 'package-load-list' or
- 'package-user-dir', or sets 'package-enable-at-startup' to nil then it won't
- work right without some adjustment:
- - you can move that code to the early init file (see above), so those settings
-   apply before Emacs tries to activate the packages.
- - you can use the new 'package-quickstart' so activation of packages does not
-   need to pay attention to 'package-load-list' or 'package-user-dir' any more.
+ Note also that 'FontBackend' settings in ".Xdefaults" or
+ ".Xresources", or 'font-backend' frame parameter settings in your init
+ files, may need to be adjusted, as 'xft' is no longer a valid backend
+ when using Cairo.  Use 'ftcrhb' if your Emacs was built with HarfBuzz
+ text shaping support, and 'ftcr' otherwise.  You can determine this by
+ checking 'system-configuration-features'.  The 'ftcr' backend will
+ still be available when HarfBuzz is supported, but will not be used by
+ default.  We strongly recommend building with HarBuzz support. 'x' is
+ still a valid backend.
  
  ---
- ** Emacs now notifies systemd when startup finishes or shutdown begins.
- Units that are ordered after 'emacs.service' will only be started
- after Emacs has finished initialization and is ready for use.
- (If your Emacs is installed in a non-standard location and you copied the
- emacs.service file to eg ~/.config/systemd/user/, you will need to copy
- the new version of the file again.)
\f
- * Changes in Emacs 27.1
- +++
- ** emacsclient now supports the 'EMACS_SOCKET_NAME' environment variable.
- The behavior is identical to 'EMACS_SERVER_FILE', in that the
- command-line value specified via '--socket-name' will override the
- environment, and the natural default to TMPDIR, then '/tmp', continues
- to apply.
- +++
- ** The function 'read-passwd' uses '*' as default character to hide passwords.
+ ** 'configure' now warns about building with libXft support.
+ libXft is unmaintained, and causes a number of problems with modern
+ fonts including but not limited to crashes; support for it may be
+ removed in a future version of Emacs.  Please consider using
+ Cairo + HarfBuzz instead.
  
  ---
- ** The new option 'tooltip-resize-echo-area' avoids truncating tooltip text
- on GUI frames when tooltips are displayed in the echo area.  Instead,
- it resizes the echo area as needed to accommodate the full tool-tip
text.
+ ** 'configure' now warns about not using HarfBuzz if using Cairo.
+ We want to encourage people to use the most modern font features
+ available, and this is the Cairo graphics library + HarfBuzz for font
shaping, so 'configure' now recommends that combination.
  
  ---
- ** Show modeline tooltips only if the corresponding action applies.
- Customize the option 'mode-line-default-help-echo' to restore the old
- behavior where the tooltip text is also shown when the corresponding
- action does not apply.
+ ** The ftx font backend driver has been removed.
+ It was declared obsolete in Emacs 27.1.
  
- +++
- ** New hook 'server-after-make-frame-hook'.
- This hook is a convenient place to perform initializations in daemon
- mode which require GUI features to be available.  One example is
- restoration of the previous session using the desktop.el package: put
- the call to 'desktop-read' in this hook, if you want the GUI settings
- to be restored, or if desktop.el needs to interact with you during
- restoration of the session.
- +++
- ** New function 'logcount' calculates an integer's Hamming weight.
- +++
- ** New function 'libxml-available-p'.
- This function returns non-nil if libxml support is both compiled in
- and available at run time.  Lisp programs should use this function to
- detect built-in libxml support, instead of testing for that
- indirectly, e.g., by checking that functions like
- 'libxml-parse-html-region' return nil.
- +++
- ** 'libxml-parse-xml-region' and 'libxml-parse-html' region take
- a parameter that's called DISCARD-COMMENTS, but it really only
- discards the top-level comment.  Therefore this parameter is now
- obsolete, and the new utility function 'xml-remove-comments' can be
- used to remove comments before calling the libxml functions to parse
- the data.
- +++
- ** The Network Security Manager now allows more fine-grained control
- of what checks to run via the 'network-security-protocol-checks'
- variable.
- +++
- ** TLS connections have their security tightened by default.
- Most of the checks for outdated, believed-to-be-weak TLS algorithms
- and ciphers are now switched on by default.  By default, the NSM will
- flag connections using these weak algorithms and ask users whether to
- allow them.  To get the old behavior back (where certificates are
- checked for validity, but no warnings about weak cryptography are
- issued), you can either set 'network-security-protocol-checks' to nil,
- or adjust the elements in that variable to only happen on the 'high'
- security level (assuming you use the 'medium' level).
- +++
- ** New function 'fill-polish-nobreak-p', to be used in 'fill-nobreak-predicate'.
- It blocks line breaking after a one-letter word, also in the case when
- this word is preceded by a non-space, but non-alphanumeric character.
- +++
- ** The limit on repetitions in regexps has been raised to 2^16-1.
- It was previously limited to 2^15-1.  For example, the following
- regular expression was previously invalid, but is now accepted:
-    x\{32768\}
- ---
- ** The German prefix and postfix input methods now support Capital sharp S.
- ---
- ** New input methods hawaiian-postfix and hawaiian-prefix.
- +++
- ** New function 'exec-path'.
- This function by default returns the value of the corresponding
- variable, but can optionally return the equivalent of 'exec-path'
- from a remote host.
- +++
- ** The function 'executable-find' supports an optional argument REMOTE.
- This triggers to search the program on the remote host as indicated by
- 'default-directory'.
\f
+ * Startup Changes in Emacs 28.1
  
- +++
- ** New variable 'auto-save-no-message'.
- When set to t, no message will be shown when auto-saving (default
- value: nil).
\f
+ * Changes in Emacs 28.1
  
- ---
- ** The value of 'make-cursor-line-fully-visible' can now be a function.
- In addition to nil or non-nil, the value can now be a predicate
- function.  Follow mode uses this to control scrolling of its windows
when the last screen line in a window is not fully visible.
+ ** Support for '(box . SIZE)' cursor-type.
+ By default, 'box' cursor always has a filled box shape.  But if you
+ specify cursor-type to be '(box . SIZE)', the cursor becomes a hollow
+ box if the point is on an image larger than 'SIZE' pixels in any
dimension.
  
  \f
- * Editing Changes in Emacs 27.1
+ * Editing Changes in Emacs 28.1
  
  +++
- ** New command 'make-empty-file'.
- ---
- ** New variable 'x-wait-for-event-timeout'.
- This controls how long Emacs will wait for updates to the graphical
- state to take effect (making a frame visible, for example).
+ ** New command 'undo-redo'.
+ It undoes previous undo commands, but doesn't record itself as an
+ undoable command.
  
  +++
- ** New user option 'electric-quote-replace-double'.
- This option controls whether '"' is replaced in 'electric-quote-mode',
- in addition to other quote characters.  If non-nil, ASCII double-quote
- characters that quote text "like this" are replaced by double
- typographic quotes, “like this”, in text modes, and in comments in
- non-text modes.
- ---
- ** New user option 'flyspell-case-fold-duplications'.
- This option controls whether Flyspell mode considers consecutive words
- to be duplicates if they are not in the same case.  If non-nil, the
- default, words are considered to be duplicates even if their letters'
- case does not match.
- ---
- ** 'write-abbrev-file' now includes special properties.
- 'write-abbrev-file' now writes special properties like ':case-fixed'
- for abbrevs that have them.
+ ** 'read-number' now has its own history variable.
+ Additionally, the function now accepts a HIST argument which can be
+ used to specify a custom history variable.
  
  +++
- ** 'write-abbrev-file' skips empty tables.
- 'write-abbrev-file' now skips inserting a 'define-abbrev-table' form for
- tables which do not have any non-system abbrevs to save.
+ ** Input history for 'goto-line' is now local to every buffer.
+ Each buffer will keep a separate history of line numbers used with
+ 'goto-line'.  This should help making faster the process of finding
+ line numbers that were previously jumped to.
  
  +++
- ** The new functions and commands 'text-property-search-forward' and
- 'text-property-search-backward' have been added.  These provide an
- interface that's more like functions like @code{search-forward}.
- ---
- ** More commands support noncontiguous rectangular regions, namely
- 'upcase-dwim', 'downcase-dwim', 'replace-string', 'replace-regexp'.
- +++
- ** When asked to visit a large file, Emacs now offers visiting it literally.
- Previously, Emacs would only ask for confirmation before visiting
- large files.  Now it also offers a third alternative: to visit the
- file literally, as in 'find-file-literally', which speeds up
- navigation and editing of large files.
+ ** When 'suggest-key-bindings' is non-nil, the completion list of 'M-x'
+ shows equivalent key bindings for all commands that have them.
  
- ---
- ** add-dir-local-variable now uses dotted pair notation syntax
- to write alists of variables to .dir-locals.el.  This is the same
- syntax that you can see in the example of a .dir-locals.el file
- in (info "(emacs) Directory Variables")
 ++++
 +** Files can be visited asynchronously.
 +If the new user option 'execute-file-commands-asynchronously' has a
 +non-nil value, interactive file visiting commands load the file
 +asynchronously into the respective buffer.  I.e., Emacs is still
 +responsive while loading the files, which is useful especially for
 +remote files.  If the value is a regular expression, files matching
 +this expression are loaded asynchronously.  See the node "(emacs)
 +Visiting" in the user manual for the supported commands.
 +
  \f
- * Changes in Specialized Modes and Packages in Emacs 27.1
- ---
- ** Follow mode
- In the current follow group of windows, "ghost" cursors are no longer
- displayed in the non-selected follow windows.  To get the old behavior
- back, customize follow-hide-ghost-cursors to nil.
- ** Octave mode
- The mode is automatically enabled in files that start with the
- 'function' keyword.
- ** project.el
- *** New commands project-search and project-query-replace
- ** Etags
- +++
- *** 'next-file' is now an obsolete alias of tags-next-file
- *** tags-loop-revert-buffers is an obsolete alias of multifile-revert-buffers
- *** The tags-loop-continue function along with the tags-loop-operate and
- tags-loop-scan variables are now obsolete; use the new multifile-initialize and
- multifile-continue functions instead.
- ---
- ** bibtex
- *** New commands 'bibtex-next-entry' and 'bibtex-previous-entry'.
- In bibtex-mode-map, forward-paragraph and backward-paragraph are
- remapped to these, respectively.
- +++
- ** Dired
- *** New command 'dired-create-empty-file'.
- ** Change Logs and VC
- *** Recording ChangeLog entries doesn't require an actual file.
- If a ChangeLog file doesn't exist, and if the new variable
- 'add-log-dont-create-changelog-file' is non-nil (which is the
- default), commands such as 'C-x 4 a' will add log entries to a
- suitable named temporary buffer.  (An existing ChangeLog file will
- still be used if it exists.)  Set the variable to nil to get the
- previous behavior of always creating a buffer that visits a ChangeLog
- file.
- *** New customizable variable 'vc-git-grep-template'.
- This new variable allows customizing the default arguments passed to
- git-grep when 'vc-git-grep' is used.
- *** Command 'vc-git-stash' now respects marks in the '*vc-dir*' buffer.
- When some files are marked, only those are stashed.
- When no files are marked, all modified files are stashed, as before.
- *** The new hook 'vc-retrieve-tag-hook' runs after retrieving a tag.
- ---
- *** 'vc-hg' now invokes 'smerge-mode' when visiting files.
- Code that attempted to invoke 'smerge-mode' when visiting an Hg file
- with conflicts existed in earlier versions of Emacs, but incorrectly
- never detected a conflict due to invalid assumptions about cached
- values.
- ** diff-mode
- *** Hunks are now automatically refined by default.
- To disable it, set the new defcustom 'diff-font-lock-refine' to nil.
- *** File headers can be shortened, mimicking Magit's diff format.
- To enable it, set the new defcustom 'diff-font-lock-prettify to t.
- ** Browse-url
- *** The function 'browse-url-emacs' can now visit a URL in selected window.
- It now treats the optional 2nd argument to mean that the URL should be
- shown in the currently selected window.
- ** Comint
- +++
- *** 'send-invisible' is now an obsolete alias for 'comint-send-invisible'.
- Also, 'shell-strip-ctrl-m' is declared obsolete.
- +++
- *** 'C-c .' (comint-insert-previous-argument) no longer interprets '&'.
- This feature caused problems when '&&' was present in the previous
- command.  Since this command emulates 'M-.' in Bash and zsh, neither
- of which treats '&' specially, the feature was removed for
- compatibility with these shells.
- +++
- *** 'comint-insert-previous-argument' can now count arguments from the end.
- By default, invoking 'C-c .' with a numeric argument N would copy the
- Nth argument, counting from the first one.  But if the new option
- 'comint-insert-previous-argument-from-end' is non-nil, it will copy
- the Nth argument counting from the last one.  Thus 'C-c .' can now
- better emulate 'M-.' in both Bash and zsh, since the former counts
- from the beginning of the arguments, while the latter counts from the
- end.
- ** SQL
- *** Installation of 'sql-indent' from ELPA is strongly encouraged.
- This package support sophisticated rules for properly indenting SQL
- statements.  SQL is not like other programming languages like C, Java,
- or Python where code is sparse and rules for formatting are fairly
- well established. Instead SQL is more like COBOL (from which it came)
- and code tends to be very dense and line ending decisions driven by
- syntax and line length considerations to make readable code.
- Experienced SQL developers may prefer to rely upon existing Emacs
- facilities for formatting code but the 'sql-indent' package provides
- facilities to aid more casual SQL developers layout queries and
- complex expressions.
- *** 'sql-use-indent-support' (default t) enables SQL indention support.
- The 'sql-indent' package from ELPA must be installed to get the
- indentation support in 'sql-mode' and 'sql-interactive-mode'.
- *** 'sql-mode-hook' and 'sql-interactive-mode-hook' changed.
- Both hook variables have had 'sql-indent-enable' added to their
- default values. If youhave existing customizations to these variables,
- you should make sure that the new default entry is included.
- ** Term
- ---
- *** 'term-read-noecho' is now obsolete, use 'read-passwd' instead.
- ** Flymake
- +++
- *** The variable 'flymake-diagnostic-types-alist' is obsolete.
- You should instead set properties on known diagnostic symbols, like
- ':error' and ':warning', as demonstrated in the Flymake manual.
- *** New customizable variable 'flymake-start-on-save-buffer'.
- Control whether Flymake starts checking the buffer on save.
- *** Flymake and backend functions may exchange hints about buffer changes.
- This enables more efficient backends.  See the docstring of
- 'flymake-diagnostic-functions' or the Flymake manual for details.
- ** Package
- *** New function 'package-get-version' lets packages query their own version.
- Example use in auctex.el: (defconst auctex-version (package-get-version))
- *** New 'package-quickstart' feature.
- When 'package-quickstart' is non-nil, package.el precomputes a big autoloads
- file so that activation of packages can be done much faster, which can speed up
- your startup significantly.
- It also causes variables like package-user-dir and package-load-list to be
- consulted when 'package-quickstart-refresh' is run rather than at startup so
- you don't need to set them in your early init file.
- *** New function 'package-activate-all'.
- ** Info
- ---
- *** Info can now follow 'file://' protocol URLs.
- The 'file://' URLs in Info documents can now be followed by passing
- them to the 'browse-url' function, like the other protocols: ftp,
- http, and https.  This allows to have references to local HTML files,
- for example.
- ** Xref
- +++
- *** New command 'xref-find-definitions-at-mouse'.
- This command finds definitions of the identifier at the place of a
- mouse click event, and is intended to be bound to a mouse event.
- ** Ecomplete
- *** The ecomplete sorting has changed to a decay-based algorithm.
- This can be controlled by the new 'ecomplete-sort-predicate' variable.
- *** The 'ecompleterc' file is now placed in ~/.emacs.d/ecompleterc by default.
- Of course it will still find it if you have it in ~/.ecompleterc
- ** Gnus
- +++
- *** A prefix argument to 'gnus-summary-limit-to-score' will limit reverse.
- Limit to articles with score at below.
- *** The function 'gnus-score-find-favorite-words' has been renamed
- from 'gnus-score-find-favourite-words'.
- ---
- *** Gmane has been removed as an nnir backend, since Gmane no longer
- has a search engine.
- +++
- *** Splitting mail on common mailing list headers has been added.
- See the concept index in the Gnus manual for the 'match-list' entry.
- +++
- *** nil is no longer an allowed value for 'mm-text-html-renderer'.
- +++
- *** A new Gnus summary mode command, 'S A'
- ('gnus-summary-attach-article') can be used to attach the current
- article(s) to a pre-existing Message buffer, or create a new Message
- buffer with the article(s) attached.
- ---
- *** New option 'nnir-notmuch-filter-group-names-function'.
- This option controls whether and how to use Gnus search groups as
- 'path:' search terms to 'notmuch'.
- ** erc
- ---
- *** 'erc-button-google-url' has been renamed 'erc-button-search-url'
- and its value has been changed to Duck Duck Go.
- ** EUDC
- *** XEmacs support has been removed.
- ** eww/shr
- *** When opening external links in eww/shr (typically with the
- 'C-u RET' keystroke on a link), the link will be flashed with the new
- 'shr-selected-link' face to give the user feedback that the command
- has been executed.
- +++
- *** New option 'shr-discard-aria-hidden'.
- If set, shr will not render tags with attribute 'aria-hidden="true"'.
- This attribute is meant to tell screen readers to ignore a tag.
- ** Htmlfontify
- *** The functions 'hfy-color', 'hfy-color-vals' and
- 'hfy-fallback-color-values' and the variables 'hfy-fallback-color-map'
- and 'hfy-rgb-txt-color-map' have been renamed from names that used
- 'colour' instead of 'color'.
- +++
- ** Enriched mode supports the 'charset' text property.
- You can add or modify the 'charset' text properties of text using the
- Edit->Text Properties->Special Properties menu, or by invoking the
- 'facemenu-set-charset' command.  Documents in Enriched mode will be
- saved with the charset properties, and those properties will be
- restored when the file is visited.
- ** Smtpmail
- Authentication mechanisms can be added via external packages, by
- defining new cl-defmethod of smtpmail-try-auth-method.
- ** Footnote-mode
- *** Support Hebrew-style footnotes
- *** Footnote text lines are now aligned.
- Can be controlled via the new variable 'footnote-align-to-fn-text'.
- ** CSS mode
- ---
- *** A new command 'css-cycle-color-format' for cycling between color
- formats (e.g. "black" => "#000000" => "rgb(0, 0, 0)") has been added,
- bound to 'C-c C-f'.
- ---
- *** CSS mode, SCSS mode, and Less CSS mode now have support for Imenu.
- ** SGML mode
- ---
- *** 'sgml-quote' now handles double quotes and apostrophes
- when escaping text and in addition all numeric entities when
- unescaping text.
- ** Python mode
- ---
- *** Python mode supports three different font lock decoration levels.
- The maximum level is used by default; customize
- 'font-lock-maximum-decoration' to tone down the decoration.
- ** Dired
- +++
- *** The new user option 'dired-create-destination-dirs' controls whether
- 'dired-do-copy' and 'dired-rename-file' should create non-existent
- directories in the destination.
+ * Changes in Specialized Modes and Packages in Emacs 28.1
  
  ** Help
  
@@@ -761,555 -122,79 +132,89 @@@ supplied error message
  
  ** Tramp
  
 +---
 +*** Tramp is now thread-safe.
 +
  +++
- *** New connection method "nextcloud", which allows to access OwnCloud
or NextCloud hosted files and directories.
+ *** New connection method "media", which allows accessing media devices
like cell phones, tablets or cameras.
  
- +++
- *** Connection methods "obex" and "synce" are removed, because they
- are obsoleted in GVFS.
- +++
- *** Validated passwords are saved by auth-source backends which support this.
- +++
- *** During user and host name completion in the minibuffer, results
- from auth-source search are taken into account.  This can be disabled
- by setting user option 'tramp-completion-use-auth-sources' to nil.
- +++
- *** The user option 'tramp-ignored-file-name-regexp' allows to disable
- Tramp for some look-alike remote file names.
- +++
- *** For some connection methods, like "su" or "sudo", the host name in
- ad-hoc multi-hop file names must match the previous hop.
- ** Rcirc
- ---
- *** New user option 'rcirc-url-max-length'.
- Setting this option to an integer causes URLs displayed in Rcirc
- buffers to be truncated to that many characters.
- ** Register
- ---
- *** The return value of method 'register-val-describe' includes the
- names of buffers shown by the windows of a window configuration.
- ---
- ** The options.el library has been removed.
- It was obsolete since Emacs 22.1, replaced by customize.
- ** The tls.el and starttls.el libraries are now marked obsolete.
- Use of built-in libgnutls based functionality (described in the Emacs
- GnuTLS manual) is recommended instead.
- ** Message
- +++
- *** Messages can now be systematically encrypted
- when the PGP keyring contains a public key for every recipient.  To
- achieve this, add 'message-sign-encrypt-if-all-keys-available' to
- 'message-send-hook'.
- ---
- *** When replying a message that have addresses on the form
- '"foo@bar.com" <foo@bar.com>', Message will elide the repeated "name"
- from the address field in the response.
- ---
- *** The default of 'message-forward-as-mime' has changed from t to nil
- as it has been reported that many recipients can't read forwards that
- are formatted as MIME digests.
- +++
- *** 'message-forward-included-headers' has changed its default to
- exclude most headers when forwarding.
- ** EasyPG
- ---
- *** 'epa-pinentry-mode' is renamed to 'epg-pinentry-mode'.
- It now applies to epg functions as well as epa functions.
- ---
- *** The alias functions 'epa--encode-coding-string',
- 'epa--decode-coding-string', and 'epa--select-safe-coding-system' have
- been removed.  Use 'encode-coding-string', 'decode-coding-string', and
- 'select-safe-coding-system' instead.
- ** Rmail
- +++
- *** New user option 'rmail-output-reset-deleted-flag'.
- If this option is non-nil, messages appended to an output file by the
- 'rmail-output' command have their Deleted flag reset.
- *** The command 'rmail-summary-by-senders' with an empty argument
- selects the messages to summarize with a regexp that matches the
- sender of the current message.
- ** Threads
- +++
- *** New variable 'main-thread' holds Emacs's main thread.
- This is handy in Lisp programs that run on a non-main thread and want
- to signal the main thread, e.g., when they encounter an error.
- +++
- *** 'thread-join' returns the result of the finished thread now.
- +++
- *** 'thread-signal' does not propagate errors to the main thread.
- Instead, error messages are just printed in the main thread.
- ---
- *** 'thread-alive-p' is now obsolete, use 'thread-live-p' instead.
- +++
- *** New command 'list-threads' shows Lisp threads.
- See the current list of live threads in a tabulated-list buffer which
- automatically updates.  In the buffer, you can use 's q' or 's e' to
- signal a thread with quit or error respectively, or get a snapshot
- backtrace with 'b'.
- ---
- ** thingatpt.el supports a new "thing" called 'uuid'.
- A symbol 'uuid' can be passed to thing-at-point and it returns the
- UUID at point.
+ ** map.el
  
+ *** Pcase 'map' pattern added keyword symbols abbreviation.
+ A pattern like '(map :sym)' binds the map's value for ':sym' to 'sym',
+ equivalent to '(map (:sym sym))'.
+ ** Package
  
- ** Interactive automatic highlighting
  +++
- *** 'highlight-regexp' can now highlight subexpressions.
- The now command accepts a prefix numeric argument to choose the
- subexpression.
- ** Mouse display of minor mode menu
+ *** New functions to filter the package list.
+ The filter command key bindings are as follows:
  
- ---
- *** 'minor-mode-menu-from-indicator' now display full minor mode name.
- When there is no menu for a mode, display the mode name after the
- indicator instead of just the indicator (which is sometimes cryptic).
+ key             binding
+ ---             -------
+ / a             package-menu-filter-by-archive
+ / k             package-menu-filter-by-keyword
+ / n             package-menu-filter-by-name
+ / s             package-menu-filter-by-status
+ / v             package-menu-filter-by-version
+ / /             package-menu-filter-clear
  
  \f
- * New Modes and Packages in Emacs 27.1
- ** multifile.el lets one setup multifile operations like search&replace
- +++
- ** Emacs can now visit files in archives as if they were directories.
- This feature uses Tramp and works only on systems which support GVFS,
- i.e. GNU/Linux, roughly spoken.  See the chapter "(tramp) Archive file
- names" in the Tramp manual for full documentation of these facilities.
- +++
- ** New library for writing JSONRPC applications (https://jsonrpc.org)
- The 'jsonrpc' library enables writing Emacs Lisp applications that
- rely on this protocol.  Since the protocol is designed to be
- transport-agnostic, the library provides an API to implement new
- transport strategies as well as a separate API to use them.  A
- transport implementation for process-based communication, such as is
- used by the Language Server Protocol (LSP), is readily available.
- +++
- ** Backtrace mode improves viewing of Elisp backtraces.
- Backtrace mode adds pretty printing, fontification and ellipsis
- expansion to backtrace buffers produced by the Lisp debugger, Edebug
- and ERT.  See the node "Backtraces" in the Elisp manual for
- documentation of the new mode and its commands.
+ * New Modes and Packages in Emacs 28.1
  
  \f
- * Incompatible Lisp Changes in Emacs 27.1
+ * Incompatible Lisp Changes in Emacs 28.1
  
- ** define-fringe-bitmap is always defined, even when Emacs is built
- without any GUI support.
+ ** 'equal' no longer examines some contents of window configurations.
+ Instead, it considers window configurations to be equal only if they
+ are 'eq'.  To compare contents, use 'compare-window-configurations'
+ instead.  This change helps fix a bug in 'sxhash-equal', which returned
+ incorrect hashes for window configurations and some other objects.
  
  ---
- ** Just loading a theme's file no longer activates the theme's settings.
- Loading a theme with 'M-x load-theme' still activates the theme, as it
- did before.  However, loading the theme's file with "M-x load-file",
- or using 'require' or 'load' in a Lisp program, doesn't actually apply
- the theme's settings until you either invoke 'M-x enable-theme' or
- type 'M-x load-theme'.  (In a Lisp program, calling 'enable-theme' or
- invoking 'load-theme' with NO-ENABLE argument omitted or nil has the
- same effect of activating a theme whose file has been loaded.)  The
- special case of the 'user' theme is an exception: it is frequently
- used for ad-hoc customizations, so the settings of that theme are by
- default applied immediately.
- The variable 'custom--inhibit-theme-enable' controls this behavior;
- its default value changed in Emacs 27.1.
+ ** The obsolete function 'thread-alive-p' has been removed.
  
- ** The 'repetitions' argument of 'benchmark-run' can now also be a variable.
+ ** 'dns-query' now consistently uses Lisp integers to represent integers.
+ Formerly it made an exception for integer components of SOA records,
+ because SOA serial numbers can exceed fixnum ranges on 32-bit platforms.
+ Emacs now supports bignums so this old glitch is no longer needed.
  
- ** The FILENAME argument to 'file-name-base' is now mandatory and no
- longer defaults to 'buffer-file-name'.
- ---
- ** The function 'eldoc-message' now accepts a single argument.
- Programs that called it with multiple arguments before should pass
- them through 'format' first.  Even that is discouraged: for ElDoc
- support, you should set 'eldoc-documentation-function' instead of
- calling 'eldoc-message' directly.
- ** Old-style backquotes now generate an error.
- They have been generating warnings for a decade.  To interpret
- old-style backquotes as new-style, bind the new variable
- 'force-new-style-backquotes' to t.
- ** Defining a Common Lisp structure using 'cl-defstruct' or
- 'cl-struct-define' whose name clashes with a builtin type (e.g.,
- 'integer' or 'hash-table') now signals an error.
- ** When formatting a floating-point number as an octal or hexadecimal
- integer, Emacs now signals an error if the number is too large for the
- implementation to format.
- ---
- ** Some functions and variables obsolete since Emacs 22 have been removed:
- archive-mouse-extract, assoc-ignore-case, assoc-ignore-representation,
- backward-text-line, blink-cursor, bookmark-exit-hooks,
- comint-use-prompt-regexp-instead-of-fields, compilation-finish-function,
- count-text-lines, cperl-vc-header-alist, custom-face-save-command,
- cvs-display-full-path, cvs-fileinfo->full-path, delete-frame-hook,
- derived-mode-class, describe-char-after, describe-project,
- desktop-basefilename, desktop-buffer-handlers, desktop-buffer-misc-functions,
- desktop-buffer-modes-to-save, desktop-enable, desktop-load-default,
- dired-omit-files-p, disabled-command-hook, dungeon-mode-map,
- electric-nroff-mode, electric-nroff-newline, electric-perl-terminator,
- focus-frame, forward-text-line, generic-define-mswindows-modes,
- generic-define-unix-modes, generic-font-lock-defaults, goto-address-at-mouse,
- highlight-changes-colours, ibuffer-elide-long-columns, ibuffer-hooks,
- ibuffer-mode-hooks, icalendar-convert-diary-to-ical,
- icalendar-extract-ical-from-buffer, imenu-always-use-completion-buffer-p,
- ipconfig-program, ipconfig-program-options, isearch-lazy-highlight-cleanup,
- isearch-lazy-highlight-initial-delay, isearch-lazy-highlight-interval,
- isearch-lazy-highlight-max-at-a-time, iswitchb-use-fonts,
- latin1-char-displayable-p, mouse-wheel-click-button, mouse-wheel-down-button,
- mouse-wheel-up-button, new-frame, pascal-outline, process-kill-without-query,
- recentf-menu-append-commands-p, rmail-pop-password,
- rmail-pop-password-required, savehist-load, set-default-font,
- spam-list-of-processors, speedbar-add-ignored-path-regexp,
- speedbar-buffers-line-path, speedbar-ignored-path-expressions,
- speedbar-ignored-path-regexp, speedbar-line-path, speedbar-path-line,
- timer-set-time-with-usecs, tooltip-gud-display, tooltip-gud-modes,
- tooltip-gud-toggle-dereference, unfocus-frame, unload-hook-features-list,
- update-autoloads-from-directories, vc-comment-ring, vc-comment-ring-index,
- vc-comment-search-forward, vc-comment-search-reverse, vc-comment-to-change-log,
- vc-diff-switches-list, vc-next-comment, vc-previous-comment, view-todo,
- x-lost-selection-hooks, x-sent-selection-hooks.
- ---
- ** Further functions and variables obsolete since Emacs 24 have been removed:
- default-directory-alist, dired-default-directory,
- dired-default-directory-alist, dired-enable-local-variables,
- dired-hack-local-variables, dired-local-variables-file, dired-omit-here-always.
- ** garbage collection no longer treats miscellaneous objects specially;
- they are now allocated like any other pseudovector.  As a result, the
- 'garbage-collect' and 'memory-use-count' functions no longer return a
- 'misc' component, and the 'misc-objects-consed' variable has been
- removed.
+ ** The Lisp variables 'previous-system-messages-locale' and
+ 'previous-system-time-locale' have been removed, as they were created
+ by mistake and were not useful to Lisp code.
  
  \f
- * Lisp Changes in Emacs 27.1
- ** lookup-key can take a list of keymaps as argument.
- +++
- ** 'condition-case' now accepts 't' to match any error symbol.
- +++
- ** New function 'proper-list-p'.
- Given a proper list as argument, this predicate returns its length;
- otherwise, it returns nil.  'format-proper-list-p' is now an obsolete
- alias for the new function.
- +++
- ** Emacs Lisp integers can now be of arbitrary size.
- Emacs uses the GNU Multiple Precision (GMP) library to support
- integers whose size is too large to support natively.  The integers
- supported natively are known as "fixnums", while the larger ones are
- "bignums".  The new predicates 'bignump' and 'fixnump' can be used to
- distinguish between these two types of integers.
- All the arithmetic, comparison, and logical (a.k.a. "bitwise")
- operations where bignums make sense now support both fixnums and
- bignums.  However, note that unlike fixnums, bignums will not compare
- equal with 'eq', you must use 'eql' instead.  (Numerical comparison
- with '=' works on both, of course.)
- Since large bignums consume a lot of memory, Emacs limits the size of
- the largest bignum a Lisp program is allowed to create.  The
- nonnegative value of the new variable 'integer-width' specifies the
- maximum number of bits allowed in a bignum.  Emacs signals an integer
- overflow error if this limit is exceeded.
- Several primitive functions formerly returned floats or lists of
- integers to represent integers that did not fit into fixnums.  These
- functions now simply return integers instead.  Affected functions
- include functions like encode-char that compute code-points, functions
- like file-attributes that compute file sizes and other attributes,
- functions like process-id that compute process IDs, and functions like
- user-uid and group-gid that compute user and group IDs.
- +++
- ** Although the default timestamp format is still (HI LO US PS),
- it is planned to change in a future Emacs version, to exploit bignums.
- The documentation has been updated to mention that the timestamp
- format may change and that programs should use functions like
- format-time-string, decode-time, and encode-time rather than probing
- the innards of a timestamp directly, or creating a timestamp by hand.
- +++
- ** encode-time supports a new API (encode-time TIME &optional FORM).
- This can convert decoded times and Lisp time values to Lisp timestamps
- of various forms, including a new timestamp form (TICKS . HZ), where
- TICKS is an integer and HZ is a positive integer denoting a clock
- frequency.  The old encode-time API is still supported.
- +++
- ** 'time-add', 'time-subtract', and 'time-less-p' now accept
- infinities and NaNs too, and propagate them or return nil like
- floating-point operators do.
- +++
- ** New function 'time-equal-p' compares time values for equality.
- ** define-minor-mode automatically documents the meaning of ARG.
- +++
- ** The function 'recenter' now accepts an additional optional argument.
- By default, calling 'recenter' will not redraw the frame even if
- 'recenter-redisplay' is non-nil.  Call 'recenter' with the new second
- argument non-nil to force redisplay per 'recenter-redisplay's value.
- +++
- ** New functions 'major-mode-suspend' and 'major-mode-restore'.
- Use them when switching temporarily to another major mode, e.g. for
- 'hexl-mode', or to switch between 'c-mode' and 'image-mode' in XPM.
- +++
- ** New macro 'dolist-with-progress-reporter'.
- This works like 'dolist', but reports progress similar to
- 'dotimes-with-progress-reporter'.
- +++
- ** New hook 'after-delete-frame-functions'.
- This works like 'delete-frame-functions', but runs after the frame to
- be deleted has been made dead and removed from the frame list.
- ---
- ** The function 'provided-mode-derived-p' was extended to support aliases.
- The function now returns non-nil when the argument MODE is derived
- from any alias of any of MODES.
- +++
- ** New frame focus state inspection interface.
- The hooks 'focus-in-hook' and 'focus-out-hook' are now obsolete.
- Instead, attach to 'after-focus-change-function' using 'add-function'
- and inspect the focus state of each frame using 'frame-focus-state'.
- +++
- ** Emacs now requests and recognizes focus-change notifications from TTYs.
- On terminal emulators that support the feature, Emacs can now support
- 'focus-in-hook' and 'focus-out-hook' for TTY frames.
- +++
- ** Window-specific face remapping.
- Face specifications (of the kind used in 'face-remapping-alist')
- now support filters, allowing faces to vary between different windows
- displaying the same buffer.  See the Info node "Face Remapping" of the
- Emacs Lisp Reference manual for more detail.
- +++
- ** Special handling of buffer-local 'window-size-change-functions'.
- A buffer-local value of this hook is now run only if at least one
- window showing the buffer has changed its size.
- +++
- ** The function assoc-delete-all now takes an optional predicate argument.
- +++
- ** New function 'string-distance' to calculate the Levenshtein distance
- between two strings.
- ** 'print-quoted' now defaults to t, so if you want to see
- (quote x) instead of 'x you will have to bind it to nil where applicable.
- +++
- ** Numbers formatted via %o or %x may now be formatted as signed integers.
- This avoids problems in calls like (read (format "#x%x" -1)), and is
- more compatible with bignums, a planned feature.  To get this
- behavior, set the experimental variable binary-as-unsigned to nil,
- and if the new behavior breaks your code please email
- 32252@debbugs.gnu.org.  Because %o and %x can now format signed
- integers, they now support the + and space flags.
- ** To avoid confusion caused by "smart quotes", the reader signals an
- error when reading Lisp symbols which begin with one of the following
- quotation characters: ‘’‛“”‟〞"'.  A symbol beginning with such a
- character can be written by escaping the quotation character with a
- backslash.  For example:
-     (read "‘smart") => (invalid-read-syntax "strange quote" "‘")
-     (read "\\‘smart") == (intern "‘smart")
- +++
- ** Omitting variables after '&optional' and '&rest' is now allowed.
- For example (defun foo (&optional)) is no longer an error.  This is
- sometimes convenient when writing macros.  See the ChangeLog entry
- titled "Allow '&rest' or '&optional' without following variable
- (Bug#29165)" for a full listing of which arglists are accepted across
- versions.
- ** Internal parsing commands now use 'syntax-ppss' and disregard
- 'open-paren-in-column-0-is-defun-start'.  This affects mostly things like
- 'forward-comment', 'scan-sexps', and 'forward-sexp' when parsing backward.
- The new variable 'comment-use-syntax-ppss' can be set to nil to recover the old
- behavior if needed.
- ** The 'server-name' and 'server-socket-dir' variables are set when a
- socket has been passed to Emacs.
- ---
- ** The 'file-system-info' function is now available on all platforms.
- instead of just Microsoft platforms.  This fixes a 'get-free-disk-space'
- bug on OS X 10.8 and later.
- +++
- ** 'memory-limit' now returns a better estimate of memory consumption.
- +++
- ** New macro 'combine-change-calls' arranges to call the change hooks
- ('before-change-functions' and 'after-change-functions') just once
- each around a sequence of lisp forms, given a region.  This is
- useful when a function makes a possibly large number of repetitive
- changes and the change hooks are time consuming.
- ---
- ** The function 'get-free-disk-space' returns now a non-nil value for
- remote systems, which support this check.
- +++
- ** 'eql', 'make-hash-table', etc. now treat NaNs consistently.
- Formerly, some of these functions ignored signs and significands of
- NaNs.  Now, all these functions treat NaN signs and significands as
- significant.  For example, (eql 0.0e+NaN -0.0e+NaN) now returns nil
- because the two NaNs have different signs; formerly it returned t.
- Also, Emacs now reads and prints NaN significands; e.g., if X is a
- NaN, (format "%s" X) now returns "0.0e+NaN", "1.0e+NaN", etc.,
- depending on X's significand.
- +++
- ** The function 'make-string' accepts an additional optional argument.
- If the optional third argument is non-nil, 'make-string' will produce
- a multibyte string even if its second argument is an ASCII character.
- ** (format "%d" X) no longer mishandles a floating-point number X that
- does not fit in a machine integer.
- +++
- ** In the DST slot, encode-time and parse-time-string now return -1
- if it is not known whether daylight saving time is in effect.
- Formerly they were inconsistent: encode-time returned t in this
- situation, whereas parse-time-string returned nil.  Now they
- consistently use use nil to mean that DST is not in effect, and use -1
- to mean that it is not known whether DST is in effect.
- ** New JSON parsing and serialization functions 'json-serialize',
- 'json-insert', 'json-parse-string', and 'json-parse-buffer'.  These
- are implemented in C using the Jansson library.
- ** Mailcap
- ---
- *** The new function 'mailcap-file-name-to-mime-type' has been added.
- It's a simple convenience function for looking up MIME types based on
- file name extensions.
- *** The default way the list of possible external viewers for MIME
- types is sorted and chosen has changed.  Earlier, the most specific
- viewer was chosen, even if there was a general override in ~/.mailcap.
- For instance, if /etc/mailcap has an entry for image/gif, that one
- will be chosen even if you have an entry for image/* in your
- ~/.mailcap file.  But with the new method, entries from ~/.mailcap
- overrides all system and Emacs-provided defaults.  To get the old
- method back, set 'mailcap-prefer-mailcap-viewers' to nil.
- ** URL
+ * Lisp Changes in Emacs 28.1
  
- *** The file: handler no longer looks for index.html in directories if
- you ask it for a file:///dir URL.  Since this is a low-level library,
- such decisions (if they are to be made at all) are left to
- higher-level functions.
+ ** The variable 'force-new-style-backquotes' has been removed.
+ This removes the final remaining trace of old-style backquotes.
  
- ** image-mode
+ ** The module header 'emacs-module.h' now contains type aliases
+ 'emacs_function' and 'emacs_finalizer' for module functions and
+ finalizers, respectively.
  
- *** image-mode started using ImageMagick by default for all images
- some years back.  It now respects 'imagemagick-types-inhibit' as a way
- to disable that.
+ ** Module functions can now install an optional finalizer that is
+ called when the function object is garbage-collected.  Use
+ 'set_function_finalizer' to set the finalizer and
+ 'get_function_finalizer' to retrieve it.
  
- ** The function 'load' now behaves correctly when loading modules.
- Specifically, it puts the module name into 'load-history', prints
- loading messages if requested, and protects against recursive loads.
- +++
- ** The function 'read-variable' now uses its own history list.
- The history of variable names read by 'read-variable' is recorded in
- the new variable 'custom-variable-history'.
- ---
- ** The function 'string-to-unibyte' is no longer declared obsolete.
- We have found that there are legitimate use cases for this function,
- where there's no better alternative.  We believe that the incorrect
- uses of this function all but disappeared by now, so we are
- un-obsoleting it.
+ ** 'parse-time-string' can now parse ISO 8601 format strings,
+ such as "2020-01-15T16:12:21-08:00".
  
 +--- (Needs better documentation)
 +** There is a new command 'universal-async-argument', bound to 'C-x &'.
 +If this command precedes another command, the value of variable
 +'universal-async-argument' will be toggled.  This indicates, that the
 +following command shall be executed asynchronously.  For example,
 +file visiting commands would load files into buffers asynchronously.
 +
  \f
- * Changes in Emacs 27.1 on Non-Free Operating Systems
- ---
- ** Battery status is now supported in all Cygwin builds.
- Previously it was supported only in the Cygwin-w32 build.
- ** Emacs now handles key combinations involving the macOS "command"
- and "option" modifier keys more correctly.
- ** The special handling of 'frame-title-format' on NS where setting it
- to 't' would enable the macOS proxy icon has been replaced with a
- separate variable, 'ns-use-proxy-icon'.  'frame-title-format' will now
- work as on other platforms.
- ---
- ** New primitive 'w32-read-registry'.
- This primitive lets Lisp programs access the MS-Windows Registry by
- retrieving values stored under a given key.  It is intended to be used
- for supporting features such as XDG-like location of important files
- and directories.
+ * Changes in Emacs 28.1 on Non-Free Operating Systems
  
  +++
- ** The default value of 'w32-pipe-read-delay' is now zero.
- This speeds up reading output from sub-processes that produce a lot of
- data.
- This variable may need to be non-zero only when running DOS programs
- as Emacs subprocesses, which by now is not supported on modern
- versions of MS-Windows.  Set this variable to 50 if for some reason
- you need the old behavior (and please report such situations to Emacs
- developers).
+ ** On macOS, Emacs can now load dynamic modules with a ".dylib" suffix.
+ 'module-file-suffix' now has the value ".dylib" on macOS, but the
+ ".so" suffix is supported as well.
  
  \f
  ----------------------------------------------------------------------
diff --cc lisp/files.el
index 5764a43590ab2362256393841839406ba01af0b3,683f4a8ce7c520c8186cece73e9ac1033a005c9a..37d42c35c298244d6a39375a7421d7c9cda7627e
@@@ -1699,38 -1741,24 +1770,38 @@@ current directory to be available on fi
  request.
  
  Interactively, or if WILDCARDS is non-nil in a call from Lisp,
 -expand wildcards (if any) and visit multiple files."
 +expand wildcards (if any) and visit multiple files.
 +
 +If ASYNC is non-nil, the file will be loaded into the buffer
 +asynchronously.  Interactively, this is indicated by setting
 +`execute-file-commands-asynchronously' to a proper non-nil value.
 +This behavior can be toggled by \\[universal-async-argument]
 +prior the command invocation."
    (interactive
     (find-file-read-args "Find file in other frame: "
 -                        (confirm-nonexistent-file-or-buffer)))
 -  (let ((value (find-file-noselect filename nil nil wildcards)))
 -    (if (listp value)
 -      (progn
 -        (setq value (nreverse value))
 -        (switch-to-buffer-other-frame (car value))
 -        (mapc 'switch-to-buffer (cdr value))
 -        value)
 -      (switch-to-buffer-other-frame value))))
 +                        (confirm-nonexistent-file-or-buffer) t))
 +  (find-file-with-threads filename async
 +    (let ((value (find-file-noselect filename nil nil wildcards async)))
 +      (if (listp value)
 +        (progn
 +          (setq value (nreverse value))
 +          (switch-to-buffer-other-frame (car value))
 +          (mapc 'switch-to-buffer (cdr value))
 +          value)
 +        (switch-to-buffer-other-frame value)))))
  
 -(defun find-file-existing (filename)
 +(defun find-file-existing (filename &optional async)
     "Edit the existing file FILENAME.
- Like \\[find-file], but only allow a file that exists, and do not allow
+ Like \\[find-file], but allow only a file that exists, and do not allow
 -file names with wildcards."
 -   (interactive (nbutlast (find-file-read-args "Find existing file: " t)))
 +file names with wildcards.
 +
 +If ASYNC is non-nil, the file will be loaded into the buffer
 +asynchronously.  Interactively, this is indicated by setting
 +`execute-file-commands-asynchronously' to a proper non-nil value.
 +This behavior can be toggled by \\[universal-async-argument]
 +prior the command invocation."
 +   (interactive
 +    (find-file-read-args "Find existing file: " t))
     (if (and (not (called-interactively-p 'interactive))
            (not (file-exists-p filename)))
         (error "%s does not exist" filename)
@@@ -1895,8 -1903,7 +1966,7 @@@ killed.
            ;; Don't use `find-file' because it may end up using another window
            ;; in some corner cases, e.g. when the selected window is
            ;; softly-dedicated.
-         (let ((newbuf
-                  (find-file-noselect filename nil nil wildcards async)))
 -        (let ((newbuf (find-file-noselect filename nil nil wildcards)))
++        (let ((newbuf (find-file-noselect filename nil nil wildcards async)))
              (switch-to-buffer (if (consp newbuf) (car newbuf) newbuf))))
        (when (eq obuf (current-buffer))
        ;; This executes if find-file gets an error
@@@ -2084,15 -2086,6 +2149,15 @@@ suppresses this warning.
    :version "21.1"
    :type 'boolean)
  
-   :version "27.1"
 +(defcustom execute-file-commands-asynchronously nil
 +  "Non-nil means visit files asynchronously when called interactively.
 +If it is a regular expression, it must match the file names to be
 +visited.  This behavior is toggled by \\[universal-async-argument]
 +prior the command invocation."
 +  :group 'files
++  :version "28.1"
 +  :type '(choice boolean regexp))
 +
  (defcustom large-file-warning-threshold 10000000
    "Maximum size of file above which a confirmation is requested.
  When nil, never request confirmation."
@@@ -2509,15 -2477,9 +2575,15 @@@ and local variable specifications in th
  Automatic uncompression and adding a newline at the end of the
  file due to `require-final-newline' is also disabled.
  
- If Emacs already has a buffer which is visiting the file,
+ If Emacs already has a buffer that is visiting the file,
  this command asks you whether to visit it literally instead.
  
 +If ASYNC is non-nil, the file will be loaded into the buffer
 +asynchronously.  Interactively, this is indicated by setting
 +`execute-file-commands-asynchronously' to a proper non-nil value.
 +This behavior can be toggled by \\[universal-async-argument]
 +prior the command invocation.
 +
  In non-interactive use, the value is the buffer where the file is
  visited literally.  If the file was visited in a buffer before
  this command was invoked, it will reuse the existing buffer,
Simple merge
index b3a0f74951a9c158c6adf14da84f0914950f2f29,87bcd08b85a597ae6e086497e13a1abe4caf60d0..565651ecc5fc0430696078df1d4ac0193e071cc8
@@@ -241,49 -232,48 +232,73 @@@ NAME is unquoted.
  (defconst tramp-compat-use-url-tramp-p (fboundp 'temporary-file-directory)
    "Whether to use url-tramp.el.")
  
 +;; Threads have entered Emacs 26.1, `main-thread' in Emacs 27.1.  But
 +;; then, they might not exist when Emacs is configured
 +;; --without-threads.
 +(defconst tramp-compat-main-thread (bound-and-true-p main-thread)
 +  "The main thread of Emacs, if compiled --with-threads.")
 +
 +(defsubst tramp-compat-current-thread ()
 +  "The current thread, or nil if compiled --without-threads."
 +  (tramp-compat-funcall 'current-thread))
 +
 +(defsubst tramp-compat-thread-yield ()
 +  "Yield the CPU to another thread."
 +  (tramp-compat-funcall 'thread-yield))
 +
 +;; Mutexes have entered Emacs 26.1.  Once we use only Emacs 26+, we
 +;; must check (mutexp mutex), because the other functions might still
 +;; not exist when Emacs is configured --without-threads.
 +(defmacro tramp-compat-with-mutex (mutex &rest body)
 +  "Invoke BODY with MUTEX held, releasing MUTEX when done.
 +This is the simplest safe way to acquire and release a mutex."
 +  (declare (indent 1) (debug t))
 +  `(if (fboundp 'with-mutex)
 +       (with-mutex ,mutex ,@body)
 +     ,@body))
 +
  ;; `exec-path' is new in Emacs 27.1.
- (eval-and-compile
+ (defalias 'tramp-compat-exec-path
    (if (fboundp 'exec-path)
-       (defalias 'tramp-compat-exec-path 'exec-path)
-     (defun tramp-compat-exec-path ()
+       #'exec-path
+     (lambda ()
        "List of directories to search programs to run in remote subprocesses."
-       (let ((handler (find-file-name-handler default-directory 'exec-path)))
-       (if handler
-           (funcall handler 'exec-path)
-         exec-path)))))
+       (if-let ((handler (find-file-name-handler default-directory 'exec-path)))
+         (funcall handler 'exec-path)
+       exec-path))))
  
  ;; `time-equal-p' has appeared in Emacs 27.1.
- (if (fboundp 'time-equal-p)
-     (defalias 'tramp-compat-time-equal-p 'time-equal-p)
-   (defsubst tramp-compat-time-equal-p (t1 t2)
-     "Return non-nil if time value T1 is equal to time value T2.
+ (defalias 'tramp-compat-time-equal-p
+   (if (fboundp 'time-equal-p)
+       #'time-equal-p
+     (lambda (t1 t2)
+       "Return non-nil if time value T1 is equal to time value T2.
  A nil value for either argument stands for the current time."
-     (equal (or t1 (current-time)) (or t2 (current-time)))))
+       (equal (or t1 (current-time)) (or t2 (current-time))))))
+ ;; `flatten-tree' has appeared in Emacs 27.1.
+ (defalias 'tramp-compat-flatten-tree
+   (if (fboundp 'flatten-tree)
+       #'flatten-tree
+     (lambda (tree)
+       "Take TREE and \"flatten\" it."
+       (let (elems)
+       (setq tree (list tree))
+       (while (let ((elem (pop tree)))
+                (cond ((consp elem)
+                       (setq tree (cons (car elem) (cons (cdr elem) tree))))
+                        (elem
+                       (push elem elems)))
+                tree))
+       (nreverse elems)))))
+ ;; `progress-reporter-update' got argument SUFFIX in Emacs 27.1.
+ (defalias 'tramp-compat-progress-reporter-update
+   (if (equal (tramp-compat-funcall 'func-arity #'progress-reporter-update)
+            '(1 . 3))
+       #'progress-reporter-update
+     (lambda (reporter &optional value _suffix)
+       (progress-reporter-update reporter value))))
  
  (add-hook 'tramp-unload-hook
          (lambda ()
index 4a98717666be22712ea3033db220cd1c6cdbf9c2,95ae1569dc907dc884c17d7fb9047550968e89ae..6609064c222a152aa0dbcfb1be83a31e20d8e72d
@@@ -151,9 -137,11 +147,10 @@@ pass to the OPERATION.
         ;; completion.  We don't use `with-parsed-tramp-file-name',
         ;; because this returns another user but the one declared in
         ;; "~/.netrc".
--       ((memq operation '(file-directory-p file-exists-p))
-       (if (apply 'ange-ftp-hook-function operation args)
-           (tramp-set-connection-property v "started" t)
+       (if (apply #'ange-ftp-hook-function operation args)
+           (let ((v (tramp-dissect-file-name (car args) t)))
+             (setf (tramp-file-name-method v) tramp-ftp-method)
+             (tramp-set-connection-property v "started" t))
          nil))
  
         ;; If the second argument of `copy-file' or `rename-file' is a
index 4c23392639f4d1ae997293d49a0e9024b17f3fcc,409e1f7499a40f11e4d4f603f96dd8b2450729e0..651289213c09e1e862bf9bc465280a785f669fa8
@@@ -2290,24 -2310,14 +2314,26 @@@ preventing reentrant calls of Tramp."
  Together with `tramp-locked', this implements a locking mechanism
  preventing reentrant calls of Tramp.")
  
 +;; Mutexes have entered Emacs 26.1.
 +(defvar tramp-mutex (tramp-compat-funcall 'make-mutex "tramp")
 +  "Global mutex for Tramp threads.")
 +
 +(defun tramp-get-mutex (vec)
 +  "Return the mutex locking Tramp threads for VEC."
 +  (let ((p (tramp-get-connection-process vec)))
 +    (if p
 +      (with-tramp-connection-property p "mutex"
 +      (tramp-compat-funcall 'make-mutex (process-name p)))
 +      tramp-mutex)))
 +
  ;; Main function.
  (defun tramp-file-name-handler (operation &rest args)
-   "Invoke Tramp file name handler.
- Falls back to normal file name handler if no Tramp file name handler exists.
- If Emacs is compiled --with-threads, the body is protected by a mutex."
-   (let ((filename (apply 'tramp-file-name-for-operation operation args)))
+   "Invoke Tramp file name handler for OPERATION and ARGS.
+ Fall back to normal file name handler if no Tramp file name handler exists."
+   (let ((filename (apply #'tramp-file-name-for-operation operation args))
+       ;; `file-remote-p' is called for everything, even for symbolic
+       ;; links which look remote.  We don't want to get an error.
+       (non-essential (or non-essential (eq operation 'file-remote-p))))
      (if (tramp-tramp-file-p filename)
        (save-match-data
            (setq filename (tramp-replace-environment-variables filename))
diff --cc lisp/simple.el
Simple merge
index 5dc80c3edfba77f3f77a4935622269464f1ea2ff,345a28d3f1d42ea85c67c948b8ccaecb1f259c59..44d7a1ff1b05577a272c9aad6a019428a392c216
@@@ -813,78 -809,60 +813,78 @@@ In the latter case, VC mode is deactiva
    (when vc-mode
      (setq vc-mode nil))
    (when buffer-file-name
 -    (vc-file-clearprops buffer-file-name)
 -    ;; FIXME: Why use a hook?  Why pass it buffer-file-name?
 -    (add-hook 'vc-mode-line-hook #'vc-mode-line nil t)
 -    (let (backend)
 -      (cond
 -        ((setq backend (with-demoted-errors (vc-backend buffer-file-name)))
 -         ;; Let the backend setup any buffer-local things he needs.
 -         (vc-call-backend backend 'find-file-hook)
 -      ;; Compute the state and put it in the mode line.
 -      (vc-mode-line buffer-file-name backend)
 -      (unless vc-make-backup-files
 -        ;; Use this variable, not make-backup-files,
 -        ;; because this is for things that depend on the file name.
 -          (set (make-local-variable 'backup-inhibited) t)))
 -       ((let* ((truename (and buffer-file-truename
 -                            (expand-file-name buffer-file-truename)))
 -             (link-type (and truename
 -                             (not (equal buffer-file-name truename))
 -                             (vc-backend truename))))
 -        (cond ((not link-type) nil)   ;Nothing to do.
 -              ((eq vc-follow-symlinks nil)
 -               (message
 -                "Warning: symbolic link to %s-controlled source file" link-type))
 -              ((or (not (eq vc-follow-symlinks 'ask))
 -                   ;; Assume we cannot ask, default to yes.
 -                   noninteractive
 -                   ;; Copied from server-start.  Seems like there should
 -                   ;; be a better way to ask "can we get user input?"...
 -                   (and (daemonp)
 -                        (null (cdr (frame-list)))
 -                        (eq (selected-frame) terminal-frame))
 -                   ;; If we already visited this file by following
 -                   ;; the link, don't ask again if we try to visit
 -                   ;; it again.  GUD does that, and repeated questions
 -                   ;; are painful.
 -                   (get-file-buffer
 -                    (abbreviate-file-name
 -                     (file-chase-links buffer-file-name))))
 -
 -               (vc-follow-link)
 -               (message "Followed link to %s" buffer-file-name)
 -               (vc-refresh-state))
 -              (t
 -               (if (yes-or-no-p (format
 -                                 "Symbolic link to %s-controlled source file; follow link? " link-type))
 -                   (progn (vc-follow-link)
 -                          (message "Followed link to %s" buffer-file-name)
 -                          (vc-refresh-state))
 -                 (message
 -                  "Warning: editing through the link bypasses version control")
 -                 )))))))))
 +    ;; Run it asynchronously.
 +    (make-thread
 +     (lambda ()
 +       ;; Wait, until the file visiting function tells us so.
 +       (with-mutex vc-mutex)
 +       (vc-file-clearprops buffer-file-name)
 +       ;; FIXME: Why use a hook?  Why pass it buffer-file-name?
 +       (add-hook 'vc-mode-line-hook 'vc-mode-line nil t)
 +       (let (backend)
 +         (cond
 +          ((setq backend (with-demoted-errors (vc-backend buffer-file-name)))
 +           ;; Let the backend setup any buffer-local things he needs.
 +           (vc-call-backend backend 'find-file-hook)
 +         ;; Compute the state and put it in the mode line.
 +         (vc-mode-line buffer-file-name backend)
 +         (unless vc-make-backup-files
 +           ;; Use this variable, not make-backup-files, because this
 +           ;; is for things that depend on the file name.
 +             (set (make-local-variable 'backup-inhibited) t)))
 +          ((let* ((truename (and buffer-file-truename
 +                               (expand-file-name buffer-file-truename)))
 +                (link-type (and truename
 +                                (not (equal buffer-file-name truename))
 +                                (vc-backend truename))))
 +           (cond ((not link-type) nil)        ;Nothing to do.
 +                 ((eq vc-follow-symlinks nil)
 +                  (message
 +                   "Warning: symbolic link to %s-controlled source file"
 +                     link-type))
 +                 ((or (not (eq vc-follow-symlinks 'ask))
 +                      ;; Assume we cannot ask, default to yes.
 +                      noninteractive
 +                      ;; Copied from server-start.  Seems like there
 +                      ;; should be a better way to ask "can we get
 +                      ;; user input?"...
 +                      (and (daemonp)
 +                           (null (cdr (frame-list)))
 +                           (eq (selected-frame) terminal-frame))
 +                      ;; If we already visited this file by
 +                      ;; following the link, don't ask again if we
 +                      ;; try to visit it again.  GUD does that, and
 +                      ;; repeated questions are painful.
 +                      (get-file-buffer
 +                       (abbreviate-file-name
 +                        (file-chase-links buffer-file-name))))
 +
 +                  (vc-follow-link)
 +                  (message "Followed link to %s" buffer-file-name)
 +                  (vc-refresh-state))
 +                 (t
 +                  (if (yes-or-no-p
 +                         (format
 +                          (concat
 +                         "Symbolic link to %s-controlled source file; "
 +                           "follow link? ")
 +                          link-type))
 +                      (progn (vc-follow-link)
 +                             (message
 +                                "Followed link to %s" buffer-file-name)
 +                             (vc-refresh-state))
 +                    (message
 +                       (concat
 +                      "Warning: editing through the link "
 +                        "bypasses version control"))))))))))
 +     ;; The thread name.
 +     (concat "vc-refresh-state " (buffer-name)))
 +
 +    ;; Give other threads a chance to run.
 +    (thread-yield)))
  
  (add-hook 'find-file-hook #'vc-refresh-state)
- (define-obsolete-function-alias 'vc-find-file-hook 'vc-refresh-state "25.1")
+ (define-obsolete-function-alias 'vc-find-file-hook #'vc-refresh-state "25.1")
  
  (defun vc-kill-buffer-hook ()
    "Discard VC info about a file when we kill its buffer."
index 6bc36cf893a423cb6045d7376fa8f2b0bef68ecd,9409cc2a39ff83cb27421a4e94c8a87fa50116fa..81485da246a9b3ec2d306f681a6cd48073dbcbf3
@@@ -5145,107 -6112,8 +6112,107 @@@ process sentinels.  They shall not dist
            (ignore-errors (delete-process (get-buffer-process buf)))
            (ignore-errors (kill-buffer buf)))
          (ignore-errors (cancel-timer timer))
-         (ignore-errors (delete-directory tmp-name 'recursive)))))))
+         (ignore-errors (delete-directory tmp-name 'recursive))))))
  
 +(ert-deftest tramp-test43-threads ()
 +  "Check that Tramp cooperates with threads."
 +  (skip-unless (tramp--test-enabled))
 +  (skip-unless (featurep 'threads))
 +  (skip-unless (= (length (all-threads)) 1))
 +  (skip-unless (not (thread-last-error)))
 +
 +  ;; We cannot bind the variables dynamically; they are used in the threads.
 +  (defvar tmp-name1 (tramp--test-make-temp-name))
 +  (defvar tmp-name2 (tramp--test-make-temp-name))
 +  (defvar tmp-mutex (make-mutex "mutex"))
 +  (defvar tmp-condvar1 (make-condition-variable tmp-mutex "condvar1"))
 +  (defvar tmp-condvar2 (make-condition-variable tmp-mutex "condvar2"))
 +
 +  ;; Rename simple file.
 +  (unwind-protect
 +      (let (tmp-thread1 tmp-thread2)
 +      (write-region "foo" nil tmp-name1)
 +      (should (file-exists-p tmp-name1))
 +      (should-not (file-exists-p tmp-name2))
 +
 +      (should (mutexp tmp-mutex))
 +      (should (condition-variable-p tmp-condvar1))
 +      (should (condition-variable-p tmp-condvar2))
 +
 +      ;; This thread renames `tmp-name1' to `tmp-name2' twice.
 +      (setq
 +       tmp-thread1
 +       (make-thread
 +        (lambda ()
 +          ;; Rename first time.
 +          (rename-file tmp-name1 tmp-name2)
 +          ;; Notify thread2.
 +          (with-mutex (condition-mutex tmp-condvar2)
 +            (condition-notify tmp-condvar2 t))
 +          ;; Rename second time, once we've got notification from thread2.
 +          (with-mutex (condition-mutex tmp-condvar1)
 +            (condition-wait tmp-condvar1))
 +          (rename-file tmp-name1 tmp-name2))
 +        "thread1"))
 +
 +      (should (threadp tmp-thread1))
 +      (should (thread-live-p tmp-thread1))
 +
 +      ;; This thread renames `tmp-name2' to `tmp-name1' twice.
 +      (setq
 +       tmp-thread2
 +       (make-thread
 +        (lambda ()
 +          ;; Rename first time, once we've got notification from thread1.
 +          (with-mutex (condition-mutex tmp-condvar2)
 +            (condition-wait tmp-condvar2))
 +          (rename-file tmp-name2 tmp-name1)
 +          ;; Notify thread1.
 +          (with-mutex (condition-mutex tmp-condvar1)
 +            (condition-notify tmp-condvar1 t))
 +          ;; Rename second time, once we've got notification from
 +          ;; the main thread.
 +          (with-mutex (condition-mutex tmp-condvar2)
 +            (condition-wait tmp-condvar2))
 +          (rename-file tmp-name2 tmp-name1))
 +        "thread2"))
 +
 +      (should (threadp tmp-thread2))
 +      (should (thread-live-p tmp-thread2))
 +      (should (= (length (all-threads)) 3))
 +
 +      ;; Wait for thread1.
 +      (thread-join tmp-thread1)
 +      ;; Checks.
 +      (should-not (thread-live-p tmp-thread1))
 +      (should (= (length (all-threads)) 2))
 +      (should-not (thread-last-error))
 +      (should (file-exists-p tmp-name2))
 +      (should-not (file-exists-p tmp-name1))
 +
 +      ;; Notify thread2.
 +      (with-mutex (condition-mutex tmp-condvar2)
 +        (condition-notify tmp-condvar2 t))
 +
 +      ;; Wait for thread2.
 +      (thread-join tmp-thread2)
 +      ;; Checks.
 +      (should-not (thread-live-p tmp-thread2))
 +      (should (= (length (all-threads)) 1))
 +      (should-not (thread-last-error))
 +      (should (file-exists-p tmp-name1))
 +      (should-not (file-exists-p tmp-name2)))
 +
 +    ;; Cleanup.
 +    (ignore-errors (delete-file tmp-name1))
 +    (ignore-errors (delete-file tmp-name2))
 +    ;; We could have spurious threads still running; wait for them to die.
 +    (while (cdr (all-threads))
 +      (thread-signal (cadr (all-threads)) 'error nil)
 +      (thread-yield))
 +    ;; Cleanup errors.
 +    (thread-last-error 'cleanup)))
 +
  ;; This test is inspired by Bug#29163.
  (ert-deftest tramp-test44-auto-load ()
    "Check that Tramp autoloads properly."