From: Michael Albinus Date: Sat, 15 Feb 2020 16:04:45 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/master' into feature/tramp-thread-safe X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=47278d3724858dad5e5c6311e5270d324526174c;p=emacs.git Merge remote-tracking branch 'origin/master' into feature/tramp-thread-safe --- 47278d3724858dad5e5c6311e5270d324526174c diff --cc etc/NEWS index 5d91bc41a91,1f8e6049a88..5fd24395bac --- a/etc/NEWS +++ 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. - * 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. - - - * 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.) - - - * 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'. + + * 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). + + * 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. - * 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. ++++ +** 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. + - --- - ** 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") - - * 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" ', 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 - * 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 - * 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. - * 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. + - * 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. ---------------------------------------------------------------------- diff --cc lisp/files.el index 5764a43590a,683f4a8ce7c..37d42c35c29 --- a/lisp/files.el +++ b/lisp/files.el @@@ -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) +(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 "27.1" ++ :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, diff --cc lisp/net/tramp-compat.el index b3a0f74951a,87bcd08b85a..565651ecc5f --- a/lisp/net/tramp-compat.el +++ b/lisp/net/tramp-compat.el @@@ -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 () diff --cc lisp/net/tramp-ftp.el index 4a98717666b,95ae1569dc9..6609064c222 --- a/lisp/net/tramp-ftp.el +++ b/lisp/net/tramp-ftp.el @@@ -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 diff --cc lisp/net/tramp.el index 4c23392639f,409e1f7499a..651289213c0 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@@ -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/vc/vc-hooks.el index 5dc80c3edfb,345a28d3f1d..44d7a1ff1b0 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@@ -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." diff --cc test/lisp/net/tramp-tests.el index 6bc36cf893a,9409cc2a39f..81485da246a --- a/test/lisp/net/tramp-tests.el +++ b/test/lisp/net/tramp-tests.el @@@ -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."