emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 6ee8270 1/5: Merge from origin/emacs-26


From: Paul Eggert
Subject: [Emacs-diffs] master 6ee8270 1/5: Merge from origin/emacs-26
Date: Wed, 8 Nov 2017 23:30:39 -0500 (EST)

branch: master
commit 6ee827059463e4b95c9251ef22a21f9c67cf668d
Merge: 83dc3f0 255ba01
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Merge from origin/emacs-26
    
    255ba01148 Fix handling of nil PRED2 arg for completion-table-with-pr...
    949b70a7d8 ; Minor comment copyedit in window.c
    20f9bf30f0 Describe Lao rendering problem
    3d61657694 Fix docstring of arabic-shaper-ZWNJ-handling
    db949166ec Handle single-line comments correctly (Bug#26049)
    795bb233a5 * test/lisp/net/tramp-tests.el (tramp-test16-file-expand-w...
    ba00ea7d0d * etc/PROBLEMS: Add URL to relevant issues for xterm+evil bug
    4a6015811e ; In text.texi fix typo spotted by Štěpán Němec
    93cd8415b2 Document new treatment of 'comment-auto-fill-only-comments'
    ca2d94ba61 Do not load Tramp unless `tramp-mode' is non-nil
    709478eaa8 Prefer `customize-set-variable' in tramp.texi
    5d36f2227f Fix last change in hscroll_window_tree
    72d07d1950 Ediff: add some missing documentation
    18af404ef3 Support python virtualenv on w32 (Bug#24464)
    efd0371c23 Improve dired deletion error handling (Bug#28797)
    5d744e032f Don't replace user input when completion prefix is empty (...
    ec6cf35c5f ; Describe xt-mouse problems with Evil mode
    c572e1f329 Return non-nil from gnutls-available-p under GnuTLS 2.x
    a2cc6d74c5 Fix Flymake help-echo functions across windows (bug#29142)
    58bb3462ee Add tests for Flymake backends for Ruby and Perl
    58e742b21d Add a Flymake backend for Perl
    9dee764165 Add a Flymake backend for Ruby
    3ad712ebc9 Add a Flymake backend for Python (bug#28808)
    8db2b3a79b Allow "%" in Tramp host names
    8c50842790 ; Fix typo in test/file-organization.org
    00fa4449cd ; Fix typo
    918a2dda07 Use hybrid malloc for FreeBSD (Bug#28308)
    725ab635d9 Add html-, mhtml- and python-mode support to semantic symref
    369da28702 Improve documentation of 'window-scroll-functions'
    93818eed8a Fix subtle problems in tabulated-list-mode with line numbers
    1f1de8e872 Make gdb-non-stop-setting default to nil on MS-Windows
    680e8e119b Fix gdb-mi prompt after "attach PID" command
    ff33074546 Fix doc string of 'window-configuration-change-hook'
    787b75ad71 Improve documentation of window hooks
    d9be8704ae Fix hscroll suspension after cursor motion
    6f43d29d29 ; * CONTRIBUTE, admin/make-tarball.txt: Doc tweaks re 'ema...
    a0d30d6369 Introduce a function to CC Mode which displays the current...
    383abc8898 ; Fix some comment typos
    b02c2714c3 Fix typos in ediff-wind.el
    4f38bdec74 Examine tex-chktex--process in the correct buffer
    94b490529a * nt/INSTALL.W64: Update to current mingw64 install instru...
    c25113d4ac Don't resignal errors in flymake-diag-region
    e950f329c0 New xref-quit-and-goto-xref command bound to TAB (bug#28814)
    5d34e1b288 Allow split-window-sensibly to split threshold in further ...
    2a973edeac Honor window-switching intents in xref-find-definitions (b...
    78e9065e9f * lisp/emacs-lisp/generator.el (iter-do): Add a debug decl...
    caa63cc96c * lisp/progmodes/flymake.el (flymake-start): Fix dead buff...
    9f4f130b79 Fix buffer name comparison in async shell-command
    
    # Conflicts:
    #   etc/NEWS
    #   lisp/vc/ediff-wind.el
---
 CONTRIBUTE                                    |   9 +-
 admin/make-tarball.txt                        |   5 +
 configure.ac                                  |   2 +-
 doc/emacs/maintaining.texi                    |   7 +-
 doc/lispref/text.texi                         |  24 ++--
 doc/lispref/windows.texi                      |  23 +++-
 doc/misc/cc-mode.texi                         |  13 +++
 doc/misc/emacs-gnutls.texi                    |   6 +-
 doc/misc/tramp.texi                           |  77 ++++++-------
 etc/NEWS.26                                   |  19 ++++
 etc/PROBLEMS                                  |  46 ++++++++
 lisp/calc/calcalg2.el                         |   2 +-
 lisp/cedet/semantic/symref/grep.el            |  20 ++--
 lisp/dired.el                                 |   2 +-
 lisp/emacs-lisp/generator.el                  |   3 +-
 lisp/emacs-lisp/tabulated-list.el             |  15 ++-
 lisp/language/misc-lang.el                    |   4 +-
 lisp/minibuffer.el                            |   2 +-
 lisp/net/tramp-gvfs.el                        |   3 +-
 lisp/net/tramp.el                             |  18 +--
 lisp/newcomment.el                            |   8 +-
 lisp/pcomplete.el                             |   2 +-
 lisp/progmodes/cc-cmds.el                     |  19 +++-
 lisp/progmodes/cc-mode.el                     |   3 +-
 lisp/progmodes/cperl-mode.el                  |   4 +-
 lisp/progmodes/flymake-proc.el                |   2 +-
 lisp/progmodes/flymake.el                     |  26 +++--
 lisp/progmodes/gdb-mi.el                      |  19 +++-
 lisp/progmodes/perl-mode.el                   |  71 +++++++++++-
 lisp/progmodes/python.el                      | 151 +++++++++++++++++++++++++-
 lisp/progmodes/ruby-mode.el                   |  63 +++++++++++
 lisp/progmodes/xref.el                        |  91 +++++++++++-----
 lisp/simple.el                                |  40 +++----
 lisp/textmodes/reftex-index.el                |   2 +-
 lisp/textmodes/reftex-ref.el                  |   2 +-
 lisp/textmodes/reftex-toc.el                  |   2 +-
 lisp/textmodes/tex-mode.el                    |   3 +-
 lisp/vc/ediff.el                              | 125 ++++++++++++++++-----
 lisp/window.el                                |  35 ++++--
 nt/INSTALL.W64                                |   8 +-
 src/gmalloc.c                                 |  11 +-
 src/gnutls.c                                  |   2 +
 src/window.c                                  |   6 +-
 src/xdisp.c                                   |  19 +++-
 test/file-organization.org                    |   2 +-
 test/lisp/minibuffer-tests.el                 |  32 ++++++
 test/lisp/net/tramp-tests.el                  |  32 +++---
 test/lisp/progmodes/flymake-resources/test.pl |   2 +
 test/lisp/progmodes/flymake-resources/test.rb |   5 +
 test/lisp/progmodes/flymake-tests.el          |  27 +++--
 50 files changed, 866 insertions(+), 248 deletions(-)

diff --git a/CONTRIBUTE b/CONTRIBUTE
index c7f3330..c324375 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -27,10 +27,11 @@ admin/notes/git-workflow.
 ** Getting involved with development
 
 Discussion about Emacs development takes place on address@hidden
-You can subscribe to the address@hidden mailing list, paying
-attention to postings with subject lines containing "emacs-announce",
-as these discuss important events like feature freezes.  See
-https://lists.gnu.org/mailman/listinfo/emacs-devel for mailing list
+You can subscribe to the address@hidden mailing list.
+If you want to get only the important mails (for things like
+feature freezes), choose to receive only the 'emacs-announce' topic
+(although so far this feature has not been well or consistently used).
+See https://lists.gnu.org/mailman/listinfo/emacs-devel for mailing list
 instructions and archives.  You can develop and commit changes in your
 own copy of the repository, and discuss proposed changes on the
 mailing list.  Frequent contributors to Emacs can request write access
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 3b811fb..ac6d15d 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -177,6 +177,11 @@ General steps (for each step, check for possible errors):
     See the info-gnu-emacs mailing list archives for the form
     of past announcements.  The first pretest announcement, and the
     release announcement, should have more detail.
+    Use the emacs-devel topic 'emacs-announce'.  The best way to do
+    this is to add a header "Keywords: emacs-announce" to your mail.
+    (You can also put it in the Subject, but this is not as good
+    because replies that invariably are not announcements also get
+    sent out as if they were.)
 
 12. After a release, update the Emacs pages as below.
 
diff --git a/configure.ac b/configure.ac
index 5ab9599..2dd21b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2218,7 +2218,7 @@ test "$CANNOT_DUMP" = yes ||
 case "$opsys" in
   ## darwin ld insists on the use of malloc routines in the System framework.
   darwin | mingw32 | nacl | sol2-10) ;;
-  cygwin | qnxto)
+  cygwin | qnxto | freebsd)
          hybrid_malloc=yes
           system_malloc= ;;
   *) test "$ac_cv_func_sbrk" = yes && 
system_malloc=$emacs_cv_sanitize_address;;
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index dc0a715..112f1f4 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -1887,8 +1887,7 @@ the special XREF mode:
 @table @kbd
 @item @key{RET}
 @itemx mouse-2
-Display the reference on the current line and bury the @file{*xref*}
-buffer.
+Display the reference on the current line.
 @item n
 @itemx .
 @findex xref-next-line
@@ -1903,6 +1902,10 @@ Move to the previous reference and display it in the 
other window
 @findex xref-show-location-at-point
 Display the reference on the current line in the other window
 (@code{xref-show-location-at-point}).
address@hidden TAB
address@hidden xref-quit-and-goto-xref
+Display the reference on the current line and bury the @file{*xref*}
+buffer (@code{xref-quit-and-goto-xref}).
 @findex xref-query-replace-in-results
 @item r @var{pattern} @key{RET} @var{replacement} @key{RET}
 Perform interactive query-replace on references that match
diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi
index 6094a41..ab554dc 100644
--- a/doc/lispref/text.texi
+++ b/doc/lispref/text.texi
@@ -1886,10 +1886,10 @@ prefix or @code{nil}, meaning it has failed to 
determine a prefix.
 @cindex filling, automatic
 @cindex Auto Fill mode
 
address@hidden FIXME: I don't think any of the variables below is a/an 
normal/abnormal hook.
-  Auto Fill mode is a minor mode that fills lines automatically as text
-is inserted.  This section describes the hook used by Auto Fill mode.
-For a description of functions that you can call explicitly to fill and
+Auto Fill mode is a minor mode that fills lines automatically as text is
+inserted.  @xref{Auto Fill,,, emacs, The GNU Emacs Manual}.  This
+section describes some variables used by Auto Fill mode.  For a
+description of functions that you can call explicitly to fill and
 justify existing text, see @ref{Filling}.
 
   Auto Fill mode also enables the functions that change the margins and
@@ -1898,11 +1898,11 @@ justification style to refill portions of the text.  
@xref{Margins}.
 @defvar auto-fill-function
 The value of this buffer-local variable should be a function (of no
 arguments) to be called after self-inserting a character from the table
address@hidden  It may be @code{nil}, in which case nothing
-special is done in that case.
address@hidden, see below.  It may be @code{nil}, in which case
+nothing special is done in that case.
 
-The value of @code{auto-fill-function} is @code{do-auto-fill} when
-Auto-Fill mode is enabled.  That is a function whose sole purpose is to
+The value of @code{auto-fill-function} is @code{do-auto-fill} when Auto
+Fill mode is enabled.  That is a function whose sole purpose is to
 implement the usual strategy for breaking a line.
 @end defvar
 
@@ -1919,6 +1919,14 @@ self-inserted---space and newline in most language 
environments.  They
 have an entry @code{t} in the table.
 @end defvar
 
address@hidden comment-auto-fill-only-comments
+This variable, if address@hidden, means to fill lines automatically
+within comments only.  More precisely, this means that if a comment
+syntax was defined for the current buffer, then self-inserting a
+character outside of a comment will not call @code{auto-fill-function}.
address@hidden defopt
+
+
 @node Sorting
 @section Sorting Text
 @cindex sorting text
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 5014cd3..e1eac45 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -5127,7 +5127,10 @@ redisplaying a window with scrolling.  Displaying a 
different buffer in
 the window also runs these functions.
 
 This variable is not a normal hook, because each function is called with
-two arguments: the window, and its new display-start position.
+two arguments: the window, and its new display-start position.  At the
+time of the call, the display-start position of the window argument is
+already set to its new value, and the buffer to be displayed in the
+window is already set as the current buffer.
 
 These functions must take care when using @code{window-end}
 (@pxref{Window Start and End}); if you need an up-to-date value, you
@@ -5138,6 +5141,11 @@ is scrolled.  It's not designed for that, and such use 
probably won't
 work.
 @end defvar
 
address@hidden run-window-scroll-functions &optional window
+This function calls @code{window-scroll-functions} for the specified
address@hidden, which defaults to the selected window.
address@hidden defun
+
 @defvar window-size-change-functions
 This variable holds a list of functions to be called if the size of any
 window changes for any reason.  The functions are called once per
@@ -5167,17 +5175,22 @@ be called again.
 @defvar window-configuration-change-hook
 A normal hook that is run every time the window configuration of a frame
 changes.  Window configuration changes include splitting and deleting
-windows and the display of a different buffer in a window.  Resizing the
+windows, and the display of a different buffer in a window.  Resizing the
 frame or individual windows do not count as configuration changes.  Use
 @code{window-size-change-functions}, see above, when you want to track
 size changes that are not caused by the deletion or creation of windows.
 
-The buffer-local part of this hook is run once for each window on the
+The buffer-local value of this hook is run once for each window on the
 affected frame, with the relevant window selected and its buffer
-current.  The global part is run once for the modified frame, with that
-frame selected.
+current.  The global value of this hook is run once for the modified
+frame, with that frame selected.
 @end defvar
 
address@hidden run-window-configuration-change-hook &optional frame
+This function runs @code{window-configuration-change-hook} for the
+specified @var{frame}, which defaults to the selected frame.
address@hidden defun
+
   In addition, you can use @code{jit-lock-register} to register a Font
 Lock fontification function, which will be called whenever parts of a
 buffer are (re)fontified because a window was scrolled or its size
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index c90f6d0..13f5c81 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -1760,6 +1760,7 @@ file.  For commands that you can use to view the effect 
of your changes,
 see @ref{Indentation Commands} and @ref{Filling and Breaking}.
 
 For details of the @ccmode{} style system, see @ref{Styles}.
+
 @item @kbd{C-c :} (@code{c-scope-operator})
 @kindex C-c :
 @findex c-scope-operator
@@ -1768,6 +1769,18 @@ In C++, it is also sometimes desirable to insert the 
double-colon scope
 operator without performing the electric behavior of colon insertion.
 @kbd{C-c :} does just this.
 
address@hidden @kbd{C-c C-z} (@code{c-display-defun-name})
address@hidden C-c C-z
address@hidden c-display-defun-name
address@hidden display-defun-name (c-)
+Display the current function name, if any, in the minibuffer.
+Additionally, if a prefix argument is given, push the function name to
+the kill ring.  If there is no current function,
address@hidden does nothing.  In Emacs, you can use this
+command in the middle of an interactive search if you set the
+customizable option @code{isearch-allow-scroll} to address@hidden
address@hidden Exiting Isearch,,,emacs, GNU Emacs Manual}.
+
 @item @kbd{C-c C-\} (@code{c-backslash-region})
 @kindex C-c C-\
 @findex c-backslash-region
diff --git a/doc/misc/emacs-gnutls.texi b/doc/misc/emacs-gnutls.texi
index 0ad48b0..92846a9 100644
--- a/doc/misc/emacs-gnutls.texi
+++ b/doc/misc/emacs-gnutls.texi
@@ -94,7 +94,11 @@ There's one way to find out if GnuTLS is available, by 
calling
 Zaretskii) in the same directory as Emacs, you should be OK.
 
 @defun gnutls-available-p
-This function returns @code{t} if GnuTLS is available in this instance of 
Emacs.
+This function returns address@hidden if GnuTLS is available in this
+instance of Emacs, @code{nil} otherwise.  If GnuTLS is available, the
+value is a list of GnuTLS capabilities supported by the installed
+GnuTLS library, which depends on the library version.  The meaning of
+the capabilities is documented in the doc string of this function.
 @end defun
 
 Oh, but sometimes things go wrong.  Budgets aren't balanced,
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 4705579..f1d9434 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -581,10 +581,7 @@ not auto loaded by Emacs.  All examples require 
@value{tramp} is
 installed and loaded:
 
 @lisp
address@hidden
-(custom-set-variables
- '(tramp-verbose 6 nil (tramp) "Enable remote command traces"))
address@hidden group
+(customize-set-variable 'tramp-verbose 6 "Enable remote command traces")
 @end lisp
 
 
@@ -1155,7 +1152,7 @@ option to determine the default method for remote file 
names that do
 not have one specified.
 
 @lisp
-(custom-set-variables '(tramp-default-method "ssh" nil (tramp)))
+(customize-set-variable 'tramp-default-method "ssh")
 @end lisp
 @end defopt
 
@@ -1242,7 +1239,7 @@ this substitution can be overridden with 
@option{tramp-default-user}.
 For example:
 
 @lisp
-(custom-set-variables'(tramp-default-user "root" nil (tramp)))
+(customize-set-variable 'tramp-default-user "root")
 @end lisp
 @end defopt
 
@@ -1298,9 +1295,9 @@ follows:
 @lisp
 @group
 (custom-set-variables
- '(tramp-default-method "ssh" nil (tramp))
- '(tramp-default-user "john" nil (tramp))
- '(tramp-default-host "target" nil (tramp)))
+ '(tramp-default-method "ssh")
+ '(tramp-default-user "john")
+ '(tramp-default-host "target"))
 @end group
 @end lisp
 
@@ -1858,21 +1855,20 @@ example below:
 
 @lisp
 @group
-(custom-set-variables
- '(tramp-password-prompt-regexp
-   (concat
-    "^.*"
-    (regexp-opt
-     '("passphrase" "Passphrase"
-       ;; English
-       "password" "Password"
-       ;; Deutsch
-       "passwort" "Passwort"
-       ;; Français
-       "mot de passe" "Mot de passe")
-     t)
-    ".*:\0? *")
-   nil (tramp)))
+(customize-set-variable
+ 'tramp-password-prompt-regexp
+  (concat
+   "^.*"
+   (regexp-opt
+    '("passphrase" "Passphrase"
+      ;; English
+      "password" "Password"
+      ;; Deutsch
+      "passwort" "Passwort"
+      ;; Français
+      "mot de passe" "Mot de passe")
+    t)
+   ".*:\0? *"))
 @end group
 @end lisp
 
@@ -2175,8 +2171,8 @@ Example:
 @group
 (add-to-list 'backup-directory-alist
              (cons "." "~/.emacs.d/backups/"))
-(custom-set-variables
- '(tramp-backup-directory-alist backup-directory-alist 6 nil (tramp)))
+(customize-set-variable
+ 'tramp-backup-directory-alist backup-directory-alist)
 @end group
 @end lisp
 
@@ -2549,7 +2545,7 @@ For ad-hoc definitions to be saved automatically in
 @option{tramp-save-ad-hoc-proxies} to address@hidden
 
 @lisp
-(custom-set-variables '(tramp-save-ad-hoc-proxies t nil (tramp)))
+(customize-set-variable 'tramp-save-ad-hoc-proxies t)
 @end lisp
 @end defopt
 
@@ -3189,10 +3185,11 @@ which allows you to set the @code{ControlPath} provided 
the variable
 
 @lisp
 @group
-(setq tramp-ssh-controlmaster-options
-      (concat
-        "-o ControlPath=/tmp/ssh-ControlPath-%%r@@%%h:%%p "
-        "-o ControlMaster=auto -o ControlPersist=yes"))
+(customize-set-variable
+ 'tramp-ssh-controlmaster-options
+ (concat
+   "-o ControlPath=/tmp/ssh-ControlPath-%%r@@%%h:%%p "
+   "-o ControlMaster=auto -o ControlPersist=yes"))
 @end group
 @end lisp
 
@@ -3205,10 +3202,7 @@ behavior, then any changes to @command{ssh} can be 
suppressed with
 this @code{nil} setting:
 
 @lisp
address@hidden
-(custom-set-variables
- '(tramp-use-ssh-controlmaster-options nil nil (tramp)))
address@hidden group
+(customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
 @end lisp
 
 
@@ -3364,8 +3358,8 @@ You can define default methods and user names for hosts,
 @lisp
 @group
 (custom-set-variables
- '(tramp-default-method "ssh" nil (tramp))
- '(tramp-default-user "news" nil (tramp)))
+ '(tramp-default-method "ssh")
+ '(tramp-default-user "news"))
 @end group
 @end lisp
 
@@ -3659,7 +3653,7 @@ disable such features.
 Disable @value{tramp} file name completion:
 
 @lisp
-(custom-set-variables '(ido-enable-tramp-completion nil))
+(customize-set-variable 'ido-enable-tramp-completion nil)
 @end lisp
 
 @item
@@ -3682,15 +3676,16 @@ To keep Ange FTP as default the remote files access 
package, set this
 in @file{.emacs}:
 
 @lisp
-(custom-set-variables '(tramp-default-method "ftp" nil (tramp)))
+(customize-set-variable 'tramp-default-method "ftp")
 @end lisp
 
 @item
 To disable both @value{tramp} (and Ange FTP), set @code{tramp-mode} to
address@hidden in @file{.emacs}.
address@hidden in @file{.emacs}.  @strong{Note}, that we don't use
address@hidden, in order to avoid loading @value{tramp}.
 
 @lisp
-(custom-set-variables '(tramp-mode nil nil (tramp)))
+(setq tramp-mode nil)
 @end lisp
 
 @item
diff --git a/etc/NEWS.26 b/etc/NEWS.26
index 286d274..f79c2cb 100644
--- a/etc/NEWS.26
+++ b/etc/NEWS.26
@@ -1213,6 +1213,16 @@ New user options `term-char-mode-buffer-read-only' and
 are non-nil by default.  Customize these options to nil if you want
 the previous behavior.
 
+** Xref
+
++++
+*** When an *xref* buffer is needed, 'TAB' quits and jumps to an xref.
+
+A new command 'xref-quit-and-goto-xref', bound to 'TAB' in *xref*
+buffers, quits the window before jumping to the destination.  In many
+situations, the intended window configuration is restored, just as if
+the *xref* buffer hadn't been necessary in the first place.
+
 
 * New Modes and Packages in Emacs 26.1
 
@@ -1262,6 +1272,11 @@ table implementation.  This uses a new bytecode op 
'switch', which
 isn't compatible with previous Emacs versions.  This functionality can
 be disabled by setting 'byte-compile-cond-use-jump-table' to nil.
 
++++
+** If 'comment-auto-fill-only-comments' is non-nil, 'auto-fill-function'
+is now called only if either no comment syntax is defined for the
+current buffer or the self-insertion takes place within a comment.
+
 ---
 ** The alist 'ucs-names' is now a hash table.
 
@@ -1526,6 +1541,10 @@ and 'gnutls-symmetric-decrypt'.
 See the node "(elisp) GnuTLS Cryptography" in the ELisp manual for details.
 
 +++
+** The function 'gnutls-available-p' now returns a list of capabilities
+supported by the GnuTLS library used by Emacs.
+
++++
 ** Emacs now supports records for user-defined types, via the new
 functions 'make-record', 'record', and 'recordp'.  Records are now
 used internally to represent cl-defstruct and defclass instances, for
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 4db97ff..6a847f6 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -826,6 +826,36 @@ index 45cc554..0cc5e76 100644
 If you can't modify that file directly, copy it to the directory
 ~/.m17n.d/ (create it if it doesn't exist), and apply the patch.
 
+** Emacs running on GNU/Linux system with the m17n library Ver.1.7.1 or the
+earlier version has a problem with rendering Lao script with OpenType font.
+
+The problem can be fixed by installing the newer version of the m17n
+library (if any), or by following this procedure:
+
+1. Locate the file LAOO-OTF.flt installed on your system as part of the
+m17n library.  Usually it is under the directory /usr/share/m17n.
+
+2. Apply the following patch to LAOO-OTF.flt
+
+------------------------------------------------------------
+diff --git a/FLT/LAOO-OTF.flt b/FLT/LAOO-OTF.flt
+index 5504171..431adf8 100644
+--- a/FLT/LAOO-OTF.flt
++++ b/FLT/LAOO-OTF.flt
+@@ -3,7 +3,7 @@
+ ;; See the end for copying conditions.
+
+ (font layouter laoo-otf nil
+-      (font (nil phetsarath\ ot unicode-bmp)))
++      (font (nil nil unicode-bmp :otf=lao\ )))
+
+ ;;; <li> LAOO-OTF.flt
+
+------------------------------------------------------------
+
+If you can't modify that file directly, copy it to the directory
+~/.m17n.d/ (create it if it doesn't exist), and apply the patch.
+
 * Internationalization problems
 
 ** M-{ does not work on a Spanish PC keyboard.
@@ -1462,6 +1492,22 @@ this, you can remove the X resource or put this in your 
init file:
 
   (xterm-remove-modify-other-keys)
 
+** Emacs's xterm-mouse doesn't work well in Evil mode.
+
+Specifically, clicking mouse-1 doesn't work as expected: instead of
+moving point where you click, it highlights the region between the
+line beginning and the click location, and displays error messages
+about unbound keys in the echo area.
+
+To work around this, put this in your .emacs file:
+
+  (with-eval-after-load 'evil-maps
+    (define-key evil-motion-state-map [down-mouse-1] nil))
+
+This appears to be a bug in Evil.
+See discussions in https://github.com/emacs-evil/evil/issues/960
+and https://debbugs.gnu.org/cgi/bugreport.cgi?bug=29143
+
 ** Emacs spontaneously displays "I-search: " at the bottom of the screen.
 
 This means that Control-S/Control-Q (XON/XOFF) "flow control" is being
diff --git a/lisp/calc/calcalg2.el b/lisp/calc/calcalg2.el
index 53e0257..48446c3 100644
--- a/lisp/calc/calcalg2.el
+++ b/lisp/calc/calcalg2.el
@@ -2354,7 +2354,7 @@
 
 ;; The variables math-solve-lhs, math-solve-rhs and math-try-solve-sign
 ;; are local to math-try-solve-for,  but are used by math-try-solve-prod.
-;; (math-solve-lhs and math-solve-rhs are is also local to
+;; (math-solve-lhs and math-solve-rhs are also local to
 ;; math-decompose-poly, but used by math-solve-poly-funny-powers.)
 (defvar math-solve-lhs)
 (defvar math-solve-rhs)
diff --git a/lisp/cedet/semantic/symref/grep.el 
b/lisp/cedet/semantic/symref/grep.el
index bc19cd3..0b263d8 100644
--- a/lisp/cedet/semantic/symref/grep.el
+++ b/lisp/cedet/semantic/symref/grep.el
@@ -38,16 +38,22 @@
   (
    )
   "A symref tool implementation using grep.
-This tool uses EDE to find he root of the project, then executes
-find-grep in the project.  The output is parsed for hits
-and those hits returned.")
+This tool uses EDE to find the root of the project, then executes
+find-grep in the project.  The output is parsed for hits and
+those hits returned.")
 
 (defvar semantic-symref-filepattern-alist
   '((c-mode "*.[ch]")
     (c++-mode "*.[chCH]" "*.[ch]pp" "*.cc" "*.hh")
-    (html-mode "*.s?html" "*.php")
+    (html-mode "*.html" "*.shtml" "*.php")
+    (mhtml-mode "*.html" "*.shtml" "*.php") ; FIXME: remove
+                                            ; duplication of
+                                            ; HTML-related patterns.
+                                            ; Maybe they belong in the
+                                            ; major mode definition?
     (ruby-mode "*.r[bu]" "*.rake" "*.gemspec" "*.erb" "*.haml"
                "Rakefile" "Thorfile" "Capfile" "Guardfile" "Vagrantfile")
+    (python-mode "*.py" "*.pyi" "*.pyw")
     (perl-mode "*.pl" "*.PL")
     (cperl-mode "*.pl" "*.PL")
     (lisp-interaction-mode "*.el" "*.ede" ".emacs" "_emacs")
@@ -58,7 +64,7 @@ See find -name man page for format.")
 (defun semantic-symref-derive-find-filepatterns (&optional mode)
   ;; FIXME: This should be moved to grep.el, where it could be used
   ;; for "C-u M-x grep" as well.
-  "Derive a list of file patterns for the current buffer.
+  "Derive a list of file (glob) patterns for the current buffer.
 Looks first in `semantic-symref-filepattern-alist'.  If it is not
 there, it then looks in `auto-mode-alist', and attempts to derive something
 from that.
@@ -78,7 +84,7 @@ Optional argument MODE specifies the `major-mode' to test."
         (error "Customize `semantic-symref-filepattern-alist' for %S"
                major-mode)
       (let ((args `("-name" ,(car pat))))
-        (if (null (cdr args))
+        (if (null (cdr pat))
             args
           `("(" ,@args
             ,@(mapcan (lambda (s) `("-o" "-name" ,s)) pat)
@@ -149,7 +155,7 @@ This shell should support pipe redirect syntax."
                          (oref tool searchfor))
                         (t
                          ;; Can't use the word boundaries: Grep
-                         ;; doesn't always agrees with the language
+                         ;; doesn't always agree with the language
                          ;; syntax on those.
                          (format "\\(^\\|\\W\\)%s\\(\\W\\|$\\)"
                                  (oref tool searchfor)))))
diff --git a/lisp/dired.el b/lisp/dired.el
index 4691818..0abb521 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -3146,7 +3146,7 @@ non-empty directories is allowed."
                       #'dired-delete-entry fn))
                   (quit (throw '--delete-cancel (message "OK, canceled")))
                  (error ;; catch errors from failed deletions
-                  (dired-log "%s\n" err)
+                  (dired-log "%s: %s\n" (car err) (error-message-string err))
                   (setq failures (cons (car (car l)) failures)))))
              (setq l (cdr l)))
            (if (not failures)
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 410e4ed..ef6cfba 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -718,7 +718,8 @@ is blocked."
   "Loop over values from an iterator.
 Evaluate BODY with VAR bound to each value from ITERATOR.
 Return the value with which ITERATOR finished iteration."
-  (declare (indent 1))
+  (declare (indent 1)
+           (debug ((symbolp form) body)))
   (let ((done-symbol (cps--gensym "iter-do-iterator-done"))
         (condition-symbol (cps--gensym "iter-do-condition"))
         (it-symbol (cps--gensym "iter-do-iterator"))
diff --git a/lisp/emacs-lisp/tabulated-list.el 
b/lisp/emacs-lisp/tabulated-list.el
index 73ddadf..3889ba8 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -603,7 +603,16 @@ With a numeric prefix argument N, sort the Nth column."
       (let ((lnum-width (tabulated-list-line-number-width)))
         (when (not (= tabulated-list--current-lnum-width lnum-width))
           (setq-local tabulated-list--current-lnum-width lnum-width)
-          (tabulated-list-revert)))))
+          (tabulated-list-init-header)))))
+
+(defun tabulated-list-window-scroll-function (window _start)
+  (if display-line-numbers
+      (let ((lnum-width
+             (with-selected-window window
+               (line-number-display-width 'columns))))
+        (when (not (= tabulated-list--current-lnum-width lnum-width))
+          (setq-local tabulated-list--current-lnum-width lnum-width)
+          (tabulated-list-init-header)))))
 
 ;;; The mode definition:
 
@@ -654,7 +663,9 @@ as the ewoc pretty-printer."
   ;; the line-number width needs to change due to scrolling.
   (setq-local tabulated-list--current-lnum-width 0)
   (add-hook 'pre-redisplay-functions
-            #'tabulated-list-watch-line-number-width nil t))
+            #'tabulated-list-watch-line-number-width nil t)
+  (add-hook 'window-scroll-functions
+            #'tabulated-list-window-scroll-function nil t))
 
 (put 'tabulated-list-mode 'mode-class 'special)
 
diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el
index cbb581f..c1aa79ca 100644
--- a/lisp/language/misc-lang.el
+++ b/lisp/language/misc-lang.el
@@ -87,9 +87,7 @@ If the value is `absorb', ZWNJ is absorbed into the previous
 grapheme cluster, and not displayed.
 
 If the value is `as-space', the glyph is displayed by a
-thin (i.e. 1-dot width) space.
-
-Customizing the value takes effect when you start Emacs next time."
+thin (i.e. 1-dot width) space."
   :group 'mule
   :version "26.1"
   :type '(choice
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index c3f77af..77fddc3 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -392,7 +392,7 @@ obeys predicates."
                                   (and (funcall pred1 x) (funcall pred2 x)))))
         ;; If completion failed and we're not applying pred1 strictly, try
         ;; again without pred1.
-        (and (not strict) pred1 pred2
+        (and (not strict) pred1
              (complete-with-action action table string pred2))))))
 
 (defun completion-table-in-turn (&rest tables)
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 51d24cb..709ea46 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -1292,7 +1292,8 @@ file-notify events."
            (when (and user domain)
              (setq user (concat domain ";" user)))
            (url-parse-make-urlobj
-            method (and user (url-hexify-string user)) nil host
+            method (and user (url-hexify-string user))
+            nil (and host (url-hexify-string host))
             (if (stringp port) (string-to-number port) port)
             (and localname (url-hexify-string localname)) nil nil t))
        (url-parse-make-urlobj
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index a23da84..15868bd 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -818,7 +818,7 @@ Used in `tramp-make-tramp-file-name'.")
   "Regexp matching delimiter between user and host names.
 Derived from `tramp-postfix-user-format'.")
 
-(defconst tramp-host-regexp "[a-zA-Z0-9_.-]+"
+(defconst tramp-host-regexp "[a-zA-Z0-9_.%-]+"
   "Regexp matching host names.")
 
 (defconst tramp-prefix-ipv6-format-alist
@@ -2305,8 +2305,10 @@ Falls back to normal file name handler if no Tramp file 
name handler exists."
 ;;;###autoload
 (progn (defun tramp-autoload-file-name-handler (operation &rest args)
   "Load Tramp file name handler, and perform OPERATION."
-  (let ((default-directory temporary-file-directory))
-    (load "tramp" 'noerror 'nomessage))
+  (if tramp-mode
+      (let ((default-directory temporary-file-directory))
+       (load "tramp" 'noerror 'nomessage))
+    (tramp-unload-file-name-handlers))
   (apply operation args)))
 
 ;; `tramp-autoload-file-name-handler' must be registered before
@@ -2422,12 +2424,13 @@ Add operations defined in `HANDLER-alist' to 
`tramp-file-name-handler'."
       (equal (apply operation args) operation))))
 
 ;;;###autoload
-(defun tramp-unload-file-name-handlers ()
+(progn (defun tramp-unload-file-name-handlers ()
   "Unload Tramp file name handlers from `file-name-handler-alist'."
   (dolist (fnh '(tramp-file-name-handler
-                tramp-completion-file-name-handler))
+                tramp-completion-file-name-handler
+                tramp-autoload-file-name-handler))
     (let ((a1 (rassq fnh file-name-handler-alist)))
-      (setq file-name-handler-alist (delq a1 file-name-handler-alist)))))
+      (setq file-name-handler-alist (delq a1 file-name-handler-alist))))))
 
 (add-hook 'tramp-unload-hook 'tramp-unload-file-name-handlers)
 
@@ -4631,9 +4634,6 @@ Only works for Bourne-like shells."
 (provide 'tramp)
 
 ;;; TODO:
-
-;; * In Emacs 21, `insert-directory' shows total number of bytes used
-;;   by the files in that directory.  Add this here.
 ;;
 ;; * Avoid screen blanking when hitting `g' in dired.  (Eli Tziperman)
 ;;
diff --git a/lisp/newcomment.el b/lisp/newcomment.el
index 2e644c3..56ae14d 100644
--- a/lisp/newcomment.el
+++ b/lisp/newcomment.el
@@ -69,6 +69,9 @@
 
 ;;; Code:
 
+(eval-when-compile
+  (require 'subr-x))
+
 ;;;###autoload
 (defalias 'indent-for-comment 'comment-indent)
 ;;;###autoload
@@ -1141,6 +1144,9 @@ the region rather than at left margin."
 
          ;; make the leading and trailing lines if requested
          (when lines
+            ;; Trim trailing whitespace from cs if there's some.
+            (setq cs (string-trim-right cs))
+
            (let ((csce
                   (comment-make-extra-lines
                    cs ce ccs cce min-indent max-indent block)))
@@ -1211,7 +1217,7 @@ changed with `comment-style'."
           (progn (goto-char end) (end-of-line) (skip-syntax-backward " ")
                  (<= (point) end))
           (or block (not (string= "" comment-end)))
-          (or block (progn (goto-char beg) (search-forward "\n" end t)))))
+           (or block (progn (goto-char beg) (re-search-forward "$" end t)))))
 
     ;; don't add end-markers just because the user asked for `block'
     (unless (or lines (string= "" comment-end)) (setq block nil))
diff --git a/lisp/pcomplete.el b/lisp/pcomplete.el
index 745a813..2d2a877 100644
--- a/lisp/pcomplete.el
+++ b/lisp/pcomplete.el
@@ -772,7 +772,7 @@ this is `comint-dynamic-complete-functions'."
                (setq c (cdr c)))
              (setq pcomplete-stub (substring common-stub 0 len)
                    pcomplete-autolist t)
-             (when (and begin (not pcomplete-show-list))
+             (when (and begin (> len 0) (not pcomplete-show-list))
                (delete-region begin (point))
                (pcomplete-insert-entry "" pcomplete-stub))
              (throw 'pcomplete-completions completions))
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index ca64b54..2b66313 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -1821,7 +1821,6 @@ the open-parenthesis that starts a defun; see 
`beginning-of-defun'."
   "Return the name of the current defun, or NIL if there isn't one.
 \"Defun\" here means a function, or other top level construct
 with a brace block."
-  (interactive)
   (c-save-buffer-state
       (beginning-of-defun-function end-of-defun-function
        where pos name-end case-fold-search)
@@ -2048,6 +2047,23 @@ with a brace block."
              (eq (char-after) ?\{)
              (cons (point-min) (point-max))))))))
 
+(defun c-display-defun-name (&optional arg)
+  "Display the name of the current CC mode defun and the position in it.
+With a prefix arg, push the name onto the kill ring too."
+  (interactive "P")
+  (save-restriction
+    (widen)
+    (c-save-buffer-state ((name (c-defun-name))
+                         (limits (c-declaration-limits t))
+                         (point-bol (c-point 'bol)))
+      (when name
+       (message "%s.  Line %s/%s." name
+                (1+ (count-lines (car limits) point-bol))
+                (count-lines (car limits) (cdr limits)))
+       (if arg (kill-new name))
+       (sit-for 3 t)))))
+(put 'c-display-defun-name 'isearch-scroll t)
+
 (defun c-mark-function ()
   "Put mark at end of the current top-level declaration or macro, point at 
beginning.
 If point is not inside any then the closest following one is
@@ -2092,7 +2108,6 @@ function does not require the declaration to contain a 
brace block."
 
 (defun c-cpp-define-name ()
   "Return the name of the current CPP macro, or NIL if we're not in one."
-  (interactive)
   (let (case-fold-search)
     (save-excursion
       (and c-opt-cpp-macro-define-start
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index b0e5fe4..f74e931 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -389,7 +389,8 @@ control).  See \"cc-mode.el\" for more info."
   ;;(define-key c-mode-base-map "\C-c\C-v"  'c-version)
   ;; (define-key c-mode-base-map "\C-c\C-y"  'c-toggle-hungry-state)  
Commented out by ACM, 2005-11-22.
   (define-key c-mode-base-map "\C-c\C-w" 'c-subword-mode)
-  (define-key c-mode-base-map "\C-c\C-k" 'c-toggle-comment-style))
+  (define-key c-mode-base-map "\C-c\C-k" 'c-toggle-comment-style)
+  (define-key c-mode-base-map "\C-c\C-z" 'c-display-defun-name))
 
 ;; We don't require the outline package, but we configure it a bit anyway.
 (cc-bytecomp-defvar outline-level)
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 1681922..e6ab8c4 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -1896,7 +1896,9 @@ or as help on variables `cperl-tips', `cperl-problems',
   (if cperl-pod-here-scan
       (or cperl-syntaxify-by-font-lock
        (progn (or cperl-faces-init (cperl-init-faces-weak))
-             (cperl-find-pods-heres)))))
+             (cperl-find-pods-heres))))
+  ;; Setup Flymake
+  (add-hook 'flymake-diagnostic-functions 'perl-flymake nil t))
 
 ;; Fix for perldb - make default reasonable
 (defun cperl-db ()
diff --git a/lisp/progmodes/flymake-proc.el b/lisp/progmodes/flymake-proc.el
index f504a1c..e28451d 100644
--- a/lisp/progmodes/flymake-proc.el
+++ b/lisp/progmodes/flymake-proc.el
@@ -82,7 +82,7 @@ Overrides `flymake-proc-allowed-file-name-masks'."
     ("\\.xml\\'" flymake-proc-xml-init)
     ("\\.html?\\'" flymake-proc-xml-init)
     ("\\.cs\\'" flymake-proc-simple-make-init)
-    ("\\.p[ml]\\'" flymake-proc-perl-init)
+    ;; ("\\.p[ml]\\'" flymake-proc-perl-init)
     ("\\.php[345]?\\'" flymake-proc-php-init)
     ("\\.h\\'" flymake-proc-master-make-header-init 
flymake-proc-master-cleanup)
     ("\\.java\\'" flymake-proc-simple-make-java-init 
flymake-proc-simple-java-cleanup)
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 19dac81..0d200f0 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -342,7 +342,7 @@ region is invalid."
                 (let* ((beg (fallback-bol))
                        (end (fallback-eol beg)))
                   (cons beg end)))))))
-    (error (flymake-error "Invalid region line=%s col=%s" line col))))
+    (error (flymake-log :warning "Invalid region line=%s col=%s" line col))))
 
 (defvar flymake-diagnostic-functions nil
   "Special hook of Flymake backends that check a buffer.
@@ -522,11 +522,12 @@ associated `flymake-category' return DEFAULT."
         (flymake--fringe-overlay-spec
          (overlay-get ov 'bitmap)))
       (default-maybe 'help-echo
-        (lambda (_window _ov pos)
-          (mapconcat
-           #'flymake--diag-text
-           (flymake-diagnostics pos)
-           "\n")))
+        (lambda (window _ov pos)
+          (with-selected-window window
+            (mapconcat
+             #'flymake--diag-text
+             (flymake-diagnostics pos)
+             "\n"))))
       (default-maybe 'severity (warning-numeric-level :error))
       (default-maybe 'priority (+ 100 (overlay-get ov 'severity))))
     ;; Some properties can't be overridden.
@@ -603,8 +604,8 @@ not expected."
           (null expected-token))
         ;; should never happen
         (flymake-error "Unexpected report from stopped backend %s" backend))
-       ((and (not (eq expected-token token))
-             (not force))
+       ((not (or (eq expected-token token)
+                 force))
         (flymake-error "Obsolete report from backend %s with explanation %s"
                        backend explanation))
        ((eq :panic report-action)
@@ -744,8 +745,11 @@ Interactively, with a prefix arg, FORCE is t."
           ()
           (remove-hook 'post-command-hook #'start-post-command
                        nil)
-          (with-current-buffer buffer
-            (flymake-start (remove 'post-command deferred) force)))
+          ;; The buffer may have disappeared already, e.g. because of
+          ;; code like `(with-temp-buffer (python-mode) ...)'.
+          (when (buffer-live-p buffer)
+            (with-current-buffer buffer
+              (flymake-start (remove 'post-command deferred) force))))
          (start-on-display
           ()
           (remove-hook 'window-configuration-change-hook #'start-on-display
@@ -948,7 +952,7 @@ applied."
              (message
               "%s"
               (funcall (overlay-get target 'help-echo)
-                       nil nil (point)))))
+                       (selected-window) target (point)))))
           (interactive
            (user-error "No more Flymake errors%s"
                        (if filter
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 28d1974..5855275 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -400,14 +400,22 @@ valid signal handlers.")
           (const   :tag "Unlimited" nil))
   :version "22.1")
 
-(defcustom gdb-non-stop-setting t
-  "When in non-stop mode, stopped threads can be examined while
+(defcustom gdb-non-stop-setting (not (eq system-type 'windows-nt))
+  "If non-nil, GDB sessions are expected to support the non-stop mode.
+When in the non-stop mode, stopped threads can be examined while
 other threads continue to execute.
 
+If this is non-nil, GDB will be sent the \"set non-stop 1\" command,
+and if that results in an error, the non-stop setting will be
+turned off automatically.
+
+On MS-Windows, this is off by default, because MS-Windows targets
+don't support the non-stop mode.
+
 GDB session needs to be restarted for this setting to take effect."
   :type 'boolean
   :group 'gdb-non-stop
-  :version "23.2")
+  :version "26.1")
 
 ;; TODO Some commands can't be called with --all (give a notice about
 ;; it in setting doc)
@@ -2188,7 +2196,10 @@ a GDB/MI reply message."
 
 (defun gdbmi-bnf-console-stream-output (c-string)
   "Handler for the console-stream-output GDB/MI output grammar rule."
-  (gdb-console c-string))
+  (gdb-console c-string)
+  ;; We've written to the GUD console, so we should print the prompt
+  ;; after the next result-class or async-class.
+  (setq gdb-first-done-or-error t))
 
 (defun gdbmi-bnf-target-stream-output (_c-string)
   "Handler for the target-stream-output GDB/MI output grammar rule."
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index 24b934c..8e7cd13 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -581,6 +581,73 @@ create a new comment."
        (match-string-no-properties 1))))
 
 
+;;; Flymake support
+(defcustom perl-flymake-command '("perl" "-w" "-c")
+  "External tool used to check Perl source code.
+This is a non empty list of strings, the checker tool possibly
+followed by required arguments.  Once launched it will receive
+the Perl source to be checked as its standard input."
+  :group 'perl
+  :type '(repeat string))
+
+(defvar-local perl--flymake-proc nil)
+
+;;;###autoload
+(defun perl-flymake (report-fn &rest _args)
+  "Perl backend for Flymake.  Launches
+`perl-flymake-command' (which see) and passes to its standard
+input the contents of the current buffer.  The output of this
+command is analysed for error and warning messages."
+  (unless (executable-find (car perl-flymake-command))
+    (error "Cannot find a suitable checker"))
+
+  (when (process-live-p perl--flymake-proc)
+    (kill-process perl--flymake-proc))
+
+  (let ((source (current-buffer)))
+    (save-restriction
+      (widen)
+      (setq
+       perl--flymake-proc
+       (make-process
+        :name "perl-flymake" :noquery t :connection-type 'pipe
+        :buffer (generate-new-buffer " *perl-flymake*")
+        :command perl-flymake-command
+        :sentinel
+        (lambda (proc _event)
+          (when (eq 'exit (process-status proc))
+            (unwind-protect
+                (if (with-current-buffer source (eq proc perl--flymake-proc))
+                    (with-current-buffer (process-buffer proc)
+                      (goto-char (point-min))
+                      (cl-loop
+                       while (search-forward-regexp
+                              "^\\(.+\\) at - line \\([0-9]+\\)"
+                              nil t)
+                       for msg = (match-string 1)
+                       for (beg . end) = (flymake-diag-region
+                                          source
+                                          (string-to-number (match-string 2)))
+                       for type =
+                       (if (string-match
+                            "\\(Scalar value\\|Useless use\\|Unquoted 
string\\)"
+                            msg)
+                           :warning
+                         :error)
+                       collect (flymake-make-diagnostic source
+                                                        beg
+                                                        end
+                                                        type
+                                                        msg)
+                       into diags
+                       finally (funcall report-fn diags)))
+                  (flymake-log :debug "Canceling obsolete check %s"
+                               proc))
+              (kill-buffer (process-buffer proc)))))))
+      (process-send-region perl--flymake-proc (point-min) (point-max))
+      (process-send-eof perl--flymake-proc))))
+
+
 (defvar perl-mode-hook nil
   "Normal hook to run when entering Perl mode.")
 
@@ -665,7 +732,9 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'."
   ;; Setup outline-minor-mode.
   (setq-local outline-regexp perl-outline-regexp)
   (setq-local outline-level 'perl-outline-level)
-  (setq-local add-log-current-defun-function #'perl-current-defun-name))
+  (setq-local add-log-current-defun-function #'perl-current-defun-name)
+  ;; Setup Flymake
+  (add-hook 'flymake-diagnostic-functions #'perl-flymake nil t))
 
 ;; This is used by indent-for-comment
 ;; to decide how much to indent a comment in Perl code
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 895117b..d4226e5 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -2113,20 +2113,25 @@ remote host, the returned value is intended for
 (defun python-shell-calculate-exec-path ()
   "Calculate `exec-path'.
 Prepends `python-shell-exec-path' and adds the binary directory
-for virtualenv if `python-shell-virtualenv-root' is set.  If
-`default-directory' points to a remote host, the returned value
-appends `python-shell-remote-exec-path' instead of `exec-path'."
+for virtualenv if `python-shell-virtualenv-root' is set - this
+will use the python interpreter from inside the virtualenv when
+starting the shell.  If `default-directory' points to a remote host,
+the returned value appends `python-shell-remote-exec-path' instead
+of `exec-path'."
   (let ((new-path (copy-sequence
                    (if (file-remote-p default-directory)
                        python-shell-remote-exec-path
-                     exec-path))))
+                     exec-path)))
+
+        ;; Windows and POSIX systems use different venv directory structures
+        (virtualenv-bin-dir (if (eq system-type 'windows-nt) "Scripts" "bin")))
     (python-shell--add-to-path-with-priority
      new-path python-shell-exec-path)
     (if (not python-shell-virtualenv-root)
         new-path
       (python-shell--add-to-path-with-priority
        new-path
-       (list (expand-file-name "bin" python-shell-virtualenv-root)))
+       (list (expand-file-name virtualenv-bin-dir 
python-shell-virtualenv-root)))
       new-path)))
 
 (defun python-shell-tramp-refresh-remote-path (vec paths)
@@ -5142,6 +5147,138 @@ returned as is."
   (ignore-errors (string-match regexp "") t))
 
 
+;;; Flymake integration
+
+(defgroup python-flymake nil
+  "Integration between Python and Flymake."
+  :group 'python
+  :link '(custom-group-link :tag "Flymake" flymake)
+  :version "26.1")
+
+(defcustom python-flymake-command '("pyflakes")
+  "The external tool that will be used to perform the syntax check.
+This is a non empty list of strings, the checker tool possibly followed by
+required arguments.  Once launched it will receive the Python source to be
+checked as its standard input.
+To use `flake8' you would set this to (\"flake8\" \"-\")."
+  :group 'python-flymake
+  :type '(repeat string))
+
+;; The default regexp accomodates for older pyflakes, which did not
+;; report the column number, and at the same time it's compatible with
+;; flake8 output, although it may be redefined to explicitly match the
+;; TYPE
+(defcustom python-flymake-command-output-pattern
+  (list
+   "^\\(?:<?stdin>?\\):\\(?1:[0-9]+\\):\\(?:\\(?2:[0-9]+\\):\\)? \\(?3:.*\\)$"
+   1 2 nil 3)
+  "Specify how to parse the output of `python-flymake-command'.
+The value has the form (REGEXP LINE COLUMN TYPE MESSAGE): if
+REGEXP matches, the LINE'th subexpression gives the line number,
+the COLUMN'th subexpression gives the column number on that line,
+the TYPE'th subexpression gives the type of the message and the
+MESSAGE'th gives the message text itself.
+
+If COLUMN or TYPE are nil or that index didn't match, that
+information is not present on the matched line and a default will
+be used."
+  :group 'python-flymake
+  :type '(list regexp
+               (integer :tag "Line's index")
+               (choice
+                (const :tag "No column" nil)
+                (integer :tag "Column's index"))
+               (choice
+                (const :tag "No type" nil)
+                (integer :tag "Type's index"))
+               (integer :tag "Message's index")))
+
+(defcustom python-flymake-msg-alist
+  '(("\\(^redefinition\\|.*unused.*\\|used$\\)" . :warning))
+  "Alist used to associate messages to their types.
+Each element should be a cons-cell (REGEXP . TYPE), where TYPE must be
+one defined in the variable `flymake-diagnostic-types-alist'.
+For example, when using `flake8' a possible configuration could be:
+
+  ((\"\\(^redefinition\\|.*unused.*\\|used$\\)\" . :warning)
+   (\"^E999\" . :error)
+   (\"^[EW][0-9]+\" . :note))
+
+By default messages are considered errors."
+  :group 'python-flymake
+  :type `(alist :key-type (regexp)
+                :value-type (symbol)))
+
+(defvar-local python--flymake-proc nil)
+
+(defun python--flymake-parse-output (source proc report-fn)
+  "Collect diagnostics parsing checker tool's output line by line."
+  (let ((rx (nth 0 python-flymake-command-output-pattern))
+        (lineidx (nth 1 python-flymake-command-output-pattern))
+        (colidx (nth 2 python-flymake-command-output-pattern))
+        (typeidx (nth 3 python-flymake-command-output-pattern))
+        (msgidx (nth 4 python-flymake-command-output-pattern)))
+    (with-current-buffer (process-buffer proc)
+      (goto-char (point-min))
+      (cl-loop
+       while (search-forward-regexp rx nil t)
+       for msg = (match-string msgidx)
+       for (beg . end) = (flymake-diag-region
+                          source
+                          (string-to-number
+                           (match-string lineidx))
+                          (and colidx
+                               (match-string colidx)
+                               (string-to-number
+                                (match-string colidx))))
+       for type = (or (and typeidx
+                           (match-string typeidx)
+                           (assoc-default
+                            (match-string typeidx)
+                            python-flymake-msg-alist
+                            #'string-match))
+                      (assoc-default msg
+                                     python-flymake-msg-alist
+                                     #'string-match)
+                      :error)
+       collect (flymake-make-diagnostic
+                source beg end type msg)
+       into diags
+       finally (funcall report-fn diags)))))
+
+(defun python-flymake (report-fn &rest _args)
+  "Flymake backend for Python.
+This backend uses `python-flymake-command' (which see) to launch a process
+that is passed the current buffer's content via stdin.
+REPORT-FN is Flymake's callback function."
+  (unless (executable-find (car python-flymake-command))
+    (error "Cannot find a suitable checker"))
+
+  (when (process-live-p python--flymake-proc)
+    (kill-process python--flymake-proc))
+
+  (let ((source (current-buffer)))
+    (save-restriction
+      (widen)
+      (setq python--flymake-proc
+            (make-process
+             :name "python-flymake"
+             :noquery t
+             :connection-type 'pipe
+             :buffer (generate-new-buffer " *python-flymake*")
+             :command python-flymake-command
+             :sentinel
+             (lambda (proc _event)
+               (when (eq 'exit (process-status proc))
+                 (unwind-protect
+                     (when (with-current-buffer source
+                             (eq proc python--flymake-proc))
+                       (python--flymake-parse-output source proc report-fn))
+                   (kill-buffer (process-buffer proc)))))))
+      (process-send-region python--flymake-proc (point-min) (point-max))
+      (process-send-eof python--flymake-proc))))
+
+
 (defun python-electric-pair-string-delimiter ()
   (when (and electric-pair-mode
              (memq last-command-event '(?\" ?\'))
@@ -5255,7 +5392,9 @@ returned as is."
   (make-local-variable 'python-shell-internal-buffer)
 
   (when python-indent-guess-indent-offset
-    (python-indent-guess-indent-offset)))
+    (python-indent-guess-indent-offset))
+
+  (add-hook 'flymake-diagnostic-functions #'python-flymake nil t))
 
 
 (provide 'python)
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 0024957..1f4aa6d 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -2253,6 +2253,68 @@ See `font-lock-syntax-table'.")
                (progn (set-match-data value) t))
           (ruby-match-expression-expansion limit)))))
 
+;;; Flymake support
+(defcustom ruby-flymake-command '("ruby" "-w" "-c")
+  "External tool used to check Ruby source code.
+This is a non empty list of strings, the checker tool possibly
+followed by required arguments.  Once launched it will receive
+the Ruby source to be checked as its standard input."
+  :group 'ruby
+  :type '(repeat string))
+
+(defvar-local ruby--flymake-proc nil)
+
+(defun ruby-flymake (report-fn &rest _args)
+  "Ruby backend for Flymake.  Launches
+`ruby-flymake-command' (which see) and passes to its standard
+input the contents of the current buffer. The output of this
+command is analysed for error and warning messages."
+  (unless (executable-find (car ruby-flymake-command))
+    (error "Cannot find a suitable checker"))
+
+  (when (process-live-p ruby--flymake-proc)
+    (kill-process ruby--flymake-proc))
+
+  (let ((source (current-buffer)))
+    (save-restriction
+      (widen)
+      (setq
+       ruby--flymake-proc
+       (make-process
+        :name "ruby-flymake" :noquery t :connection-type 'pipe
+        :buffer (generate-new-buffer " *ruby-flymake*")
+        :command ruby-flymake-command
+        :sentinel
+        (lambda (proc _event)
+          (when (eq 'exit (process-status proc))
+            (unwind-protect
+                (if (with-current-buffer source (eq proc ruby--flymake-proc))
+                    (with-current-buffer (process-buffer proc)
+                      (goto-char (point-min))
+                      (cl-loop
+                       while (search-forward-regexp
+                              "^\\(?:.*.rb\\|-\\):\\([0-9]+\\): \\(.*\\)$"
+                              nil t)
+                       for msg = (match-string 2)
+                       for (beg . end) = (flymake-diag-region
+                                          source
+                                          (string-to-number (match-string 1)))
+                       for type = (if (string-match "^warning" msg)
+                                      :warning
+                                    :error)
+                       collect (flymake-make-diagnostic source
+                                                        beg
+                                                        end
+                                                        type
+                                                        msg)
+                       into diags
+                       finally (funcall report-fn diags)))
+                  (flymake-log :debug "Canceling obsolete check %s"
+                               proc))
+              (kill-buffer (process-buffer proc)))))))
+      (process-send-region ruby--flymake-proc (point-min) (point-max))
+      (process-send-eof ruby--flymake-proc))))
+
 ;;;###autoload
 (define-derived-mode ruby-mode prog-mode "Ruby"
   "Major mode for editing Ruby code."
@@ -2265,6 +2327,7 @@ See `font-lock-syntax-table'.")
 
   (add-hook 'after-save-hook 'ruby-mode-set-encoding nil 'local)
   (add-hook 'electric-indent-functions 'ruby--electric-indent-p nil 'local)
+  (add-hook 'flymake-diagnostic-functions 'ruby-flymake nil 'local)
 
   (setq-local font-lock-defaults '((ruby-font-lock-keywords) nil nil))
   (setq-local font-lock-keywords ruby-font-lock-keywords)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 3dbf65e..db025d4 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -448,43 +448,74 @@ If SELECT is non-nil, select the target window."
        (when xref-w
          (set-window-dedicated-p xref-w xref-w-dedicated)))))
 
-(defun xref--show-pos-in-buf (pos buf select)
-  (let ((xref-buf (current-buffer))
-        win)
+(defvar-local xref--original-window-intent nil
+  "Original window-switching intent before xref buffer creation.")
+
+(defvar-local xref--original-window nil
+  "The original window this xref buffer was created from.")
+
+(defun xref--show-pos-in-buf (pos buf)
+  "Goto and display position POS of buffer BUF in a window.
+Honor `xref--original-window-intent', run `xref-after-jump-hook'
+and finally return the window."
+  (let* ((xref-buf (current-buffer))
+         (pop-up-frames
+          (or (eq xref--original-window-intent 'frame)
+              pop-up-frames))
+         (action
+          (cond ((memq
+                  xref--original-window-intent
+                  '(window frame))
+                 t)
+                ((and
+                  (window-live-p xref--original-window)
+                  (or (not (window-dedicated-p xref--original-window))
+                      (eq (window-buffer xref--original-window) buf)))
+                 `(,(lambda (buf _alist)
+                      (set-window-buffer xref--original-window buf)
+                      xref--original-window))))))
     (with-selected-window
-        (xref--with-dedicated-window
-         (display-buffer buf))
+        (with-selected-window
+            ;; Just before `display-buffer', place ourselves in the
+            ;; original window to suggest preserving it. Of course, if
+            ;; user has deleted the original window, all bets are off,
+            ;; just use the selected one.
+            (or (and (window-live-p xref--original-window)
+                     xref--original-window)
+                (selected-window))
+          (display-buffer buf action))
       (xref--goto-char pos)
       (run-hooks 'xref-after-jump-hook)
       (let ((buf (current-buffer)))
-        (setq win (selected-window))
         (with-current-buffer xref-buf
-          (setq-local other-window-scroll-buffer buf))))
-    (when select
-      (select-window win))))
+          (setq-local other-window-scroll-buffer buf)))
+      (selected-window))))
 
 (defun xref--show-location (location &optional select)
+  "Help `xref-show-xref' and `xref-goto-xref' do their job.
+Go to LOCATION and if SELECT is non-nil select its window.  If
+SELECT is `quit', also quit the *xref* window."
   (condition-case err
       (let* ((marker (xref-location-marker location))
-             (buf (marker-buffer marker)))
-        (xref--show-pos-in-buf marker buf select))
+             (buf (marker-buffer marker))
+             (xref-buffer (current-buffer)))
+        (cond (select
+               (if (eq select 'quit) (quit-window nil nil))
+               (with-current-buffer xref-buffer
+                 (select-window (xref--show-pos-in-buf marker buf))))
+              (t
+               (save-selected-window
+                 (xref--with-dedicated-window
+                  (xref--show-pos-in-buf marker buf))))))
     (user-error (message (error-message-string err)))))
 
-(defvar-local xref--window nil
-  "The original window this xref buffer was created from.")
-
 (defun xref-show-location-at-point ()
   "Display the source of xref at point in the appropriate window, if any."
   (interactive)
   (let* ((xref (xref--item-at-point))
          (xref--current-item xref))
     (when xref
-      ;; Try to avoid the window the current xref buffer was
-      ;; originally created from.
-      (if (window-live-p xref--window)
-          (with-selected-window xref--window
-            (xref--show-location (xref-item-location xref)))
-        (xref--show-location (xref-item-location xref))))))
+      (xref--show-location (xref-item-location xref)))))
 
 (defun xref-next-line ()
   "Move to the next xref and display its source in the appropriate window."
@@ -503,12 +534,19 @@ If SELECT is non-nil, select the target window."
     (back-to-indentation)
     (get-text-property (point) 'xref-item)))
 
-(defun xref-goto-xref ()
-  "Jump to the xref on the current line and select its window."
+(defun xref-goto-xref (&optional quit)
+  "Jump to the xref on the current line and select its window.
+Non-interactively, non-nil QUIT means to first quit the *xref*
+buffer."
   (interactive)
   (let ((xref (or (xref--item-at-point)
                   (user-error "No reference at point"))))
-    (xref--show-location (xref-item-location xref) t)))
+    (xref--show-location (xref-item-location xref) (if quit 'quit t))))
+
+(defun xref-quit-and-goto-xref ()
+  "Quit *xref* buffer, then jump to xref on current line."
+  (interactive)
+  (xref-goto-xref t))
 
 (defun xref-query-replace-in-results (from to)
   "Perform interactive replacement of FROM with TO in all displayed xrefs.
@@ -632,6 +670,7 @@ references displayed in the current *xref* buffer."
     (define-key map (kbd "p") #'xref-prev-line)
     (define-key map (kbd "r") #'xref-query-replace-in-results)
     (define-key map (kbd "RET") #'xref-goto-xref)
+    (define-key map (kbd "TAB")  #'xref-quit-and-goto-xref)
     (define-key map (kbd "C-o") #'xref-show-location-at-point)
     ;; suggested by Johan Claesson "to further reduce finger movement":
     (define-key map (kbd ".") #'xref-next-line)
@@ -726,7 +765,8 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
         (xref--xref-buffer-mode)
         (pop-to-buffer (current-buffer))
         (goto-char (point-min))
-        (setq xref--window (assoc-default 'window alist))
+        (setq xref--original-window (assoc-default 'window alist)
+              xref--original-window-intent (assoc-default 'display-action 
alist))
         (current-buffer)))))
 
 
@@ -753,7 +793,8 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
    (t
     (xref-push-marker-stack)
     (funcall xref-show-xrefs-function xrefs
-             `((window . ,(selected-window)))))))
+             `((window . ,(selected-window))
+               (display-action . ,display-action))))))
 
 (defun xref--prompt-p (command)
   (or (eq xref-prompt-for-identifier t)
diff --git a/lisp/simple.el b/lisp/simple.el
index 375a79e..e09ddd2 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3492,10 +3492,11 @@ the use of a shell (with its need to quote arguments)."
        (save-match-data
          (if (string-match "[ \t]*&[ \t]*\\'" command)
              ;; Command ending with ampersand means asynchronous.
-             (let ((buffer (get-buffer-create
-                            (or output-buffer "*Async Shell Command*")))
-                   (directory default-directory)
-                   proc)
+              (let* ((buffer (get-buffer-create
+                              (or output-buffer "*Async Shell Command*")))
+                     (bname (buffer-name buffer))
+                     (directory default-directory)
+                     proc)
                ;; Remove the ampersand.
                (setq command (substring command 0 (match-beginning 0)))
                ;; Ask the user what to do with already running process.
@@ -3510,30 +3511,24 @@ the use of a shell (with its need to quote arguments)."
                   ((eq async-shell-command-buffer 'confirm-new-buffer)
                    ;; If will create a new buffer, query first.
                    (if (yes-or-no-p "A command is running in the default 
buffer.  Use a new buffer? ")
-                       (setq buffer (generate-new-buffer
-                                     (or (and (bufferp output-buffer) 
(buffer-name output-buffer))
-                                         output-buffer "*Async Shell 
Command*")))
+                        (setq buffer (generate-new-buffer bname))
                      (error "Shell command in progress")))
                   ((eq async-shell-command-buffer 'new-buffer)
                    ;; It will create a new buffer.
-                   (setq buffer (generate-new-buffer
-                                 (or (and (bufferp output-buffer) (buffer-name 
output-buffer))
-                                     output-buffer "*Async Shell Command*"))))
+                    (setq buffer (generate-new-buffer bname)))
                   ((eq async-shell-command-buffer 'confirm-rename-buffer)
                    ;; If will rename the buffer, query first.
                    (if (yes-or-no-p "A command is running in the default 
buffer.  Rename it? ")
                        (progn
                          (with-current-buffer buffer
                            (rename-uniquely))
-                         (setq buffer (get-buffer-create
-                                       (or output-buffer "*Async Shell 
Command*"))))
+                          (setq buffer (get-buffer-create bname)))
                      (error "Shell command in progress")))
                   ((eq async-shell-command-buffer 'rename-buffer)
                    ;; It will rename the buffer.
                    (with-current-buffer buffer
                      (rename-uniquely))
-                   (setq buffer (get-buffer-create
-                                 (or output-buffer "*Async Shell 
Command*"))))))
+                    (setq buffer (get-buffer-create bname)))))
                (with-current-buffer buffer
                   (shell-command--save-pos-or-erase)
                  (setq default-directory directory)
@@ -3542,19 +3537,18 @@ the use of a shell (with its need to quote arguments)."
                  (setq mode-line-process '(":%s"))
                  (require 'shell) (shell-mode)
                  (set-process-sentinel proc 'shell-command-sentinel)
-                 ;; Use the comint filter for proper handling of carriage 
motion
-                 ;; (see `comint-inhibit-carriage-motion'),.
+                 ;; Use the comint filter for proper handling of
+                 ;; carriage motion (see comint-inhibit-carriage-motion).
                  (set-process-filter proc 'comint-output-filter)
                   (if async-shell-command-display-buffer
                       (display-buffer buffer '(nil (allow-no-window . t)))
                     (add-function :before (process-filter proc)
-                                  `(lambda (process string)
-                                     (when (and (= 0 (buffer-size 
(process-buffer process)))
-                                                (string= (buffer-name 
(process-buffer process))
-                                                    ,(or output-buffer "*Async 
Shell Command*")))
-                                       (display-buffer (process-buffer 
process))))
-                                  ))
-                  ))
+                                  (lambda (process _string)
+                                    (let ((buf (process-buffer process)))
+                                      (when (and (zerop (buffer-size buf))
+                                                 (string= (buffer-name buf)
+                                                          bname))
+                                        (display-buffer buf))))))))
            ;; Otherwise, command is executed synchronously.
            (shell-command-on-region (point) (point) command
                                     output-buffer nil error-buffer)))))))
diff --git a/lisp/textmodes/reftex-index.el b/lisp/textmodes/reftex-index.el
index 120370a..811d147 100644
--- a/lisp/textmodes/reftex-index.el
+++ b/lisp/textmodes/reftex-index.el
@@ -474,7 +474,7 @@ With prefix 3, restrict index to region."
 
   (interactive)
 
-  ;; Ensure access to scanning info and rescan buffer if prefix are is '(4).
+  ;; Ensure access to scanning info and rescan buffer if prefix arg is '(4).
   (let ((current-prefix-arg current-prefix-arg))
     (reftex-ensure-index-support t)
     (reftex-access-scan-info current-prefix-arg))
diff --git a/lisp/textmodes/reftex-ref.el b/lisp/textmodes/reftex-ref.el
index f9f2320..8d69d8f 100644
--- a/lisp/textmodes/reftex-ref.el
+++ b/lisp/textmodes/reftex-ref.el
@@ -134,7 +134,7 @@ This function is controlled by the settings of 
reftex-insert-label-flags."
 
   (interactive)
 
-  ;; Ensure access to scanning info and rescan buffer if prefix are is '(4).
+  ;; Ensure access to scanning info and rescan buffer if prefix arg is '(4).
   (reftex-access-scan-info current-prefix-arg)
 
   ;; Find out what kind of environment this is and abort if necessary.
diff --git a/lisp/textmodes/reftex-toc.el b/lisp/textmodes/reftex-toc.el
index c7a598c..c694faf 100644
--- a/lisp/textmodes/reftex-toc.el
+++ b/lisp/textmodes/reftex-toc.el
@@ -216,7 +216,7 @@ When called with a raw C-u prefix, rescan the document 
first."
   (or reftex-support-index
       (setq reftex-toc-include-index-entries nil))
 
-  ;; Ensure access to scanning info and rescan buffer if prefix are is '(4)
+  ;; Ensure access to scanning info and rescan buffer if prefix arg is '(4)
   (reftex-access-scan-info current-prefix-arg)
 
   (let* ((this-buf (current-buffer))
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index 3da6e4e..10ee102 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -3512,7 +3512,8 @@ There might be text before point."
              (lambda (process _event)
                (when (eq (process-status process) 'exit)
                  (unwind-protect
-                     (when (eq process tex-chktex--process)
+                     (when (eq process
+                               (with-current-buffer source 
tex-chktex--process))
                        (with-current-buffer (process-buffer process)
                          (goto-char (point-min))
                          (cl-loop
diff --git a/lisp/vc/ediff.el b/lisp/vc/ediff.el
index d0f8e63..0adf513 100644
--- a/lisp/vc/ediff.el
+++ b/lisp/vc/ediff.el
@@ -185,7 +185,9 @@
 
 ;;;###autoload
 (defun ediff-files (file-A file-B &optional startup-hooks)
-  "Run Ediff on a pair of files, FILE-A and FILE-B."
+  "Run Ediff on a pair of files, FILE-A and FILE-B.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive
    (let ((dir-A (if ediff-use-last-dir
                    ediff-last-dir-A
@@ -221,7 +223,9 @@
 
 ;;;###autoload
 (defun ediff-files3 (file-A file-B file-C &optional startup-hooks)
-  "Run Ediff on three files, FILE-A, FILE-B, and FILE-C."
+  "Run Ediff on three files, FILE-A, FILE-B, and FILE-C.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive
    (let ((dir-A (if ediff-use-last-dir
                    ediff-last-dir-A
@@ -419,7 +423,14 @@ If this file is a backup, `ediff' it with its original."
 
 ;;;###autoload
 (defun ediff-buffers (buffer-A buffer-B &optional startup-hooks job-name)
-  "Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B."
+  "Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers.  JOB-NAME is a
+symbol describing the Ediff job type; it defaults to
+`ediff-buffers', but can also be one of
+`ediff-merge-files-with-ancestor', `ediff-last-dir-ancestor',
+`ediff-last-dir-C', `ediff-buffers3', `ediff-merge-buffers', or
+`ediff-merge-buffers-with-ancestor'."
   (interactive
    (let (bf)
      (list (setq bf (read-buffer "Buffer A to compare: "
@@ -441,7 +452,14 @@ If this file is a backup, `ediff' it with its original."
 ;;;###autoload
 (defun ediff-buffers3 (buffer-A buffer-B buffer-C
                                 &optional startup-hooks job-name)
-  "Run Ediff on three buffers, BUFFER-A, BUFFER-B, and BUFFER-C."
+  "Run Ediff on three buffers, BUFFER-A, BUFFER-B, and BUFFER-C.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers.  JOB-NAME is a
+symbol describing the Ediff job type; it defaults to
+`ediff-buffers3', but can also be one of
+`ediff-merge-files-with-ancestor', `ediff-last-dir-ancestor',
+`ediff-last-dir-C', `ediff-buffers', `ediff-merge-buffers', or
+`ediff-merge-buffers-with-ancestor'."
   (interactive
    (let (bf bff)
      (list (setq bf (read-buffer "Buffer A to compare: "
@@ -637,7 +655,8 @@ regular expression; only file names that match the regexp 
are considered."
 (defun ediff-merge-directories (dir1 dir2 regexp &optional merge-autostore-dir)
   "Run Ediff on a pair of directories, DIR1 and DIR2, merging files that have
 the same name in both.  The third argument, REGEXP, is nil or a regular
-expression; only file names that match the regexp are considered."
+expression; only file names that match the regexp are considered.
+MERGE-AUTOSTORE-DIR is the directory in which to store merged files."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
@@ -674,7 +693,8 @@ expression; only file names that match the regexp are 
considered."
 Ediff merges files that have identical names in DIR1, DIR2.  If a pair of files
 in DIR1 and DIR2 doesn't have an ancestor in ANCESTOR-DIR, Ediff will merge
 without ancestor.  The fourth argument, REGEXP, is nil or a regular expression;
-only file names that match the regexp are considered."
+only file names that match the regexp are considered.
+MERGE-AUTOSTORE-DIR is the directory in which to store merged files."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
@@ -710,7 +730,8 @@ only file names that match the regexp are considered."
                                             &optional merge-autostore-dir)
   "Run Ediff on a directory, DIR1, merging its files with their revisions.
 The second argument, REGEXP, is a regular expression that filters the file
-names.  Only the files that are under revision control are taken into account."
+names.  Only the files that are under revision control are taken into account.
+MERGE-AUTOSTORE-DIR is the directory in which to store merged files."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
@@ -740,7 +761,8 @@ names.  Only the files that are under revision control are 
taken into account."
                                                           merge-autostore-dir)
   "Run Ediff on a directory, DIR1, merging its files with their revisions and 
ancestors.
 The second argument, REGEXP, is a regular expression that filters the file
-names.  Only the files that are under revision control are taken into account."
+names.  Only the files that are under revision control are taken into account.
+MERGE-AUTOSTORE-DIR is the directory in which to store merged files."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp))
@@ -908,7 +930,9 @@ names.  Only the files that are under revision control are 
taken into account."
 With prefix argument, DUMB-MODE, or on a non-windowing display, works as
 follows:
 If WIND-A is nil, use selected window.
-If WIND-B is nil, use window next to WIND-A."
+If WIND-B is nil, use window next to WIND-A.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive "P")
   (ediff-windows dumb-mode wind-A wind-B
                 startup-hooks 'ediff-windows-wordwise 'word-mode))
@@ -919,7 +943,9 @@ If WIND-B is nil, use window next to WIND-A."
 With prefix argument, DUMB-MODE, or on a non-windowing display, works as
 follows:
 If WIND-A is nil, use selected window.
-If WIND-B is nil, use window next to WIND-A."
+If WIND-B is nil, use window next to WIND-A.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive "P")
   (ediff-windows dumb-mode wind-A wind-B
                 startup-hooks 'ediff-windows-linewise nil))
@@ -963,9 +989,12 @@ If WIND-B is nil, use window next to WIND-A."
 ;;;###autoload
 (defun ediff-regions-wordwise (buffer-A buffer-B &optional startup-hooks)
   "Run Ediff on a pair of regions in specified buffers.
+BUFFER-A and BUFFER-B are the buffers to be compared.
 Regions (i.e., point and mark) can be set in advance or marked interactively.
 This function is effective only for relatively small regions, up to 200
-lines.  For large regions, use `ediff-regions-linewise'."
+lines.  For large regions, use `ediff-regions-linewise'.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive
    (let (bf)
      (list (setq bf (read-buffer "Region's A buffer: "
@@ -1003,10 +1032,13 @@ lines.  For large regions, use 
`ediff-regions-linewise'."
 ;;;###autoload
 (defun ediff-regions-linewise (buffer-A buffer-B &optional startup-hooks)
   "Run Ediff on a pair of regions in specified buffers.
+BUFFER-A and BUFFER-B are the buffers to be compared.
 Regions (i.e., point and mark) can be set in advance or marked interactively.
 Each region is enlarged to contain full lines.
 This function is effective for large regions, over 100-200
-lines.  For small regions, use `ediff-regions-wordwise'."
+lines.  For small regions, use `ediff-regions-wordwise'.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   (interactive
    (let (bf)
      (list (setq bf (read-buffer "Region A's buffer: "
@@ -1127,7 +1159,11 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                 ;; MERGE-BUFFER-FILE is the file to be
                                 ;; associated with the merge buffer
                                 &optional startup-hooks merge-buffer-file)
-  "Merge two files without ancestor."
+  "Merge two files without ancestor.
+FILE-A and FILE-B are the names of the files to be merged.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers.  MERGE-BUFFER-FILE
+is the name of the file to be associated with the merge buffer.."
   (interactive
    (let ((dir-A (if ediff-use-last-dir
                    ediff-last-dir-A
@@ -1171,7 +1207,12 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                               ;; to be associated with the
                                               ;; merge buffer
                                               merge-buffer-file)
-  "Merge two files with ancestor."
+  "Merge two files with ancestor.
+FILE-A and FILE-B are the names of the files to be merged, and
+FILE-ANCESTOR is the name of the ancestor file.  STARTUP-HOOKS is
+a list of functions that Emacs calls without arguments after
+setting up the Ediff buffers.  MERGE-BUFFER-FILE is the name of
+the file to be associated with the merge buffer."
   (interactive
    (let ((dir-A (if ediff-use-last-dir
                    ediff-last-dir-A
@@ -1229,7 +1270,16 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                     ;; MERGE-BUFFER-FILE is the file to be
                                     ;; associated with the merge buffer
                                     startup-hooks job-name merge-buffer-file)
-  "Merge buffers without ancestor."
+  "Merge buffers without ancestor.
+BUFFER-A and BUFFER-B are the buffers to be merged.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers.  JOB-NAME is a
+symbol describing the Ediff job type; it defaults to
+`ediff-merge-buffers', but can also be one of
+`ediff-merge-files-with-ancestor', `ediff-last-dir-ancestor',
+`ediff-last-dir-C', `ediff-buffers', `ediff-buffers3', or
+`ediff-merge-buffers-with-ancestor'.  MERGE-BUFFER-FILE is the
+name of the file to be associated with the merge buffer."
   (interactive
    (let (bf)
      (list (setq bf (read-buffer "Buffer A to merge: "
@@ -1256,7 +1306,16 @@ lines.  For small regions, use `ediff-regions-wordwise'."
                                                   ;; file to be associated
                                                   ;; with the merge buffer
                                                   merge-buffer-file)
-  "Merge buffers with ancestor."
+  "Merge buffers with ancestor.
+BUFFER-A and BUFFER-B are the buffers to be merged, and
+BUFFER-ANCESTOR is their ancestor.  STARTUP-HOOKS is a list of
+functions that Emacs calls without arguments after setting up the
+Ediff buffers.  JOB-NAME is a symbol describing the Ediff job
+type; it defaults to `ediff-merge-buffers-with-ancestor', but can
+also be one of `ediff-merge-files-with-ancestor',
+`ediff-last-dir-ancestor', `ediff-last-dir-C', `ediff-buffers',
+`ediff-buffers3', or `ediff-merge-buffers'.  MERGE-BUFFER-FILE is
+the name of the file to be associated with the merge buffer."
   (interactive
    (let (bf bff)
      (list (setq bf (read-buffer "Buffer A to merge: "
@@ -1287,8 +1346,11 @@ lines.  For small regions, use `ediff-regions-wordwise'."
 (defun ediff-merge-revisions (&optional file startup-hooks merge-buffer-file)
   ;; MERGE-BUFFER-FILE is the file to be associated with the merge buffer
   "Run Ediff by merging two revisions of a file.
-The file is the optional FILE argument or the file visited by the current
-buffer."
+The file is the optional FILE argument or the file visited by the
+current buffer.  STARTUP-HOOKS is a list of functions that Emacs
+calls without arguments after setting up the Ediff buffers.
+MERGE-BUFFER-FILE is the name of the file to be associated with
+the merge buffer."
   (interactive)
   (if (stringp file) (find-file file))
   (let (rev1 rev2)
@@ -1319,8 +1381,11 @@ buffer."
                                            ;; buffer
                                            merge-buffer-file)
   "Run Ediff by merging two revisions of a file with a common ancestor.
-The file is the optional FILE argument or the file visited by the current
-buffer."
+The file is the optional FILE argument or the file visited by the
+current buffer.  STARTUP-HOOKS is a list of functions that Emacs
+calls without arguments after setting up the Ediff buffers.
+MERGE-BUFFER-FILE is the name of the file to be associated with
+the merge buffer."
   (interactive)
   (if (stringp file) (find-file file))
   (let (rev1 rev2 ancestor-rev)
@@ -1360,8 +1425,8 @@ buffer."
   "Query for a file name, and then run Ediff by patching that file.
 If optional PATCH-BUF is given, use the patch in that buffer
 and don't ask the user.
-If prefix argument, then: if even argument, assume that the patch is in a
-buffer. If odd -- assume it is in a file."
+If prefix argument ARG, then: if even argument, assume that the
+patch is in a buffer.  If odd -- assume it is in a file."
   (interactive "P")
   (let (source-dir source-file)
     (require 'ediff-ptch)
@@ -1394,7 +1459,7 @@ prompts for the buffer or a file, depending on the answer.
 With ARG=1, assumes the patch is in a file and prompts for the file.
 With ARG=2, assumes the patch is in a buffer and prompts for the buffer.
 PATCH-BUF is an optional argument, which specifies the buffer that contains the
-patch. If not given, the user is prompted according to the prefix argument."
+patch.  If not given, the user is prompted according to the prefix argument."
   (interactive "P")
   (require 'ediff-ptch)
   (setq patch-buf
@@ -1421,7 +1486,9 @@ patch. If not given, the user is prompted according to 
the prefix argument."
   "Run Ediff by comparing versions of a file.
 The file is an optional FILE argument or the file entered at the prompt.
 Default: the file visited by the current buffer.
-Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'."
+Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'.
+STARTUP-HOOKS is a list of functions that Emacs calls without
+arguments after setting up the Ediff buffers."
   ;; if buffer is non-nil, use that buffer instead of the current buffer
   (interactive "P")
   (if (not (stringp file))
@@ -1434,7 +1501,7 @@ Uses `vc.el' or `rcs.el' depending on 
`ediff-version-control-package'."
                                'no-dirs)))
   (find-file file)
   (if (and (buffer-modified-p)
-          (y-or-n-p (format "Buffer %s is modified. Save buffer? "
+          (y-or-n-p (format "Buffer %s is modified.  Save buffer? "
                              (buffer-name))))
       (save-buffer (current-buffer)))
   (let (rev1 rev2)
@@ -1517,6 +1584,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-files-command ()
+  "Call `ediff-files' with the next two command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left)))
     (setq command-line-args-left (nthcdr 2 command-line-args-left))
@@ -1524,6 +1592,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff3-files-command ()
+  "Call `ediff3-files' with the next three command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (file-c (nth 2 command-line-args-left)))
@@ -1532,6 +1601,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-merge-command ()
+  "Call `ediff-merge-files' with the next two command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left)))
     (setq command-line-args-left (nthcdr 2 command-line-args-left))
@@ -1539,6 +1609,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-merge-with-ancestor-command ()
+  "Call `ediff-merge-files-with-ancestor' with the next three command line 
arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (ancestor (nth 2 command-line-args-left)))
@@ -1547,6 +1618,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-directories-command ()
+  "Call `ediff-directories' with the next three command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (regexp (nth 2 command-line-args-left)))
@@ -1555,6 +1627,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-directories3-command ()
+  "Call `ediff-directories3' with the next four command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (file-c (nth 2 command-line-args-left))
@@ -1564,6 +1637,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-merge-directories-command ()
+  "Call `ediff-merge-directories' with the next three command line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (regexp (nth 2 command-line-args-left)))
@@ -1572,6 +1646,7 @@ With optional NODE, goes to that node."
 
 ;;;###autoload
 (defun ediff-merge-directories-with-ancestor-command ()
+  "Call `ediff-merge-directories-with-ancestor' with the next four command 
line arguments."
   (let ((file-a (nth 0 command-line-args-left))
        (file-b (nth 1 command-line-args-left))
        (ancestor (nth 2 command-line-args-left))
diff --git a/lisp/window.el b/lisp/window.el
index f87294c..8939e7d 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -6465,8 +6465,9 @@ If this is an integer, `split-window-sensibly' may split 
a window
 vertically only if it has at least this many lines.  If this is
 nil, `split-window-sensibly' is not allowed to split a window
 vertically.  If, however, a window is the only window on its
-frame, `split-window-sensibly' may split it vertically
-disregarding the value of this variable."
+frame, or all the other ones are dedicated,
+`split-window-sensibly' may split it vertically disregarding the
+value of this variable."
   :type '(choice (const nil) (integer :tag "lines"))
   :version "23.1"
   :group 'windows)
@@ -6573,15 +6574,27 @@ split."
             ;; Split window horizontally.
             (with-selected-window window
               (split-window-right)))
-       (and (eq window (frame-root-window (window-frame window)))
-            (not (window-minibuffer-p window))
-            ;; If WINDOW is the only window on its frame and is not the
-            ;; minibuffer window, try to split it vertically disregarding
-            ;; the value of `split-height-threshold'.
-            (let ((split-height-threshold 0))
-              (when (window-splittable-p window)
-                (with-selected-window window
-                  (split-window-below))))))))
+       (and
+         ;; If WINDOW is the only usable window on its frame (it is
+         ;; the only one or, not being the only one, all the other
+         ;; ones are dedicated) and is not the minibuffer window, try
+         ;; to split it vertically disregarding the value of
+         ;; `split-height-threshold'.
+         (let ((frame (window-frame window)))
+           (or
+            (eq window (frame-root-window frame))
+            (catch 'done
+              (walk-window-tree (lambda (w)
+                                  (unless (or (eq w window)
+                                              (window-dedicated-p w))
+                                    (throw 'done nil)))
+                                frame)
+              t)))
+        (not (window-minibuffer-p window))
+        (let ((split-height-threshold 0))
+          (when (window-splittable-p window)
+            (with-selected-window window
+              (split-window-below))))))))
 
 (defun window--try-to-split-window (window &optional alist)
   "Try to split WINDOW.
diff --git a/nt/INSTALL.W64 b/nt/INSTALL.W64
index 4a93dc0..392ecf2 100644
--- a/nt/INSTALL.W64
+++ b/nt/INSTALL.W64
@@ -49,13 +49,13 @@ will also be available at the Windows console.
 
 ** Download and install the necessary packages
 
-Run msys2_shell.bat in your MSYS2 directory and you will see a BASH window
+Run c:/msys64/msys2.exe in your MSYS2 directory and you will see a BASH window
 opened.
 
 In the BASH prompt, use the following command to install the necessary
 packages (you can copy and paste it into the shell with Shift + Insert):
 
-  pacman -S base-devel \
+  pacman -S --needed base-devel \
   mingw-w64-x86_64-toolchain \
   mingw-w64-x86_64-xpm-nox \
   mingw-w64-x86_64-libtiff \
@@ -63,7 +63,7 @@ packages (you can copy and paste it into the shell with Shift 
+ Insert):
   mingw-w64-x86_64-libpng \
   mingw-w64-x86_64-libjpeg-turbo \
   mingw-w64-x86_64-librsvg \
-  mingw-w64-x86_64-liblcms2 \
+  mingw-w64-x86_64-lcms2 \
   mingw-w64-x86_64-libxml2 \
   mingw-w64-x86_64-gnutls \
   mingw-w64-x86_64-zlib
@@ -126,7 +126,7 @@ Now you're ready to build and install Emacs with autogen, 
configure, make,
 and make install.
 
 First we need to switch to the MinGW-w64 environment.  Exit the MSYS2 BASH
-console and run mingw64_shell.bat in the C:\msys64 folder, then cd back to
+console and run mingw64.exe in the C:\msys64 folder, then cd back to
 your Emacs source directory, e.g.:
 
   cd /c/emacs/emacs-26
diff --git a/src/gmalloc.c b/src/gmalloc.c
index 2bda95e..a17d39c 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -1502,17 +1502,18 @@ extern void *__sbrk (ptrdiff_t increment);
 static void *
 gdefault_morecore (ptrdiff_t increment)
 {
-  void *result;
 #ifdef HYBRID_MALLOC
   if (!DUMPED)
     {
       return bss_sbrk (increment);
     }
 #endif
-  result = (void *) __sbrk (increment);
-  if (result == (void *) -1)
-    return NULL;
-  return result;
+#ifdef HAVE_SBRK
+  void *result = (void *) __sbrk (increment);
+  if (result != (void *) -1)
+    return result;
+#endif
+  return NULL;
 }
 
 void *(*__morecore) (ptrdiff_t) = gdefault_morecore;
diff --git a/src/gnutls.c b/src/gnutls.c
index 36f65c4..85cebd0 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -2422,6 +2422,8 @@ GnuTLS AEAD ciphers     : the list will contain 
`AEAD-ciphers'.  */)
 
 #ifdef HAVE_GNUTLS
 
+  capabilities = Fcons (intern("gnutls"), capabilities);
+
 # ifdef HAVE_GNUTLS3
   capabilities = Fcons (intern("gnutls3"), capabilities);
   capabilities = Fcons (intern("digests"), capabilities);
diff --git a/src/window.c b/src/window.c
index 9bb2c43..cc1d2a7 100644
--- a/src/window.c
+++ b/src/window.c
@@ -6661,7 +6661,7 @@ the return value is nil.  Otherwise the value is t.  */)
 
           We have to do this in order to capture the following
           scenario: Suppose our frame contains two live windows W1 and
-          W2 and ‘set-window-configuration’ replaces them by two
+          W2 and 'set-window-configuration' replaces them by two
           windows W3 and W4 that were dead the last time
           run_window_size_change_functions was run.  If W3 and W4 have
           the same values for their old and new pixel sizes but these
@@ -7617,8 +7617,8 @@ on their symbols to be controlled by this variable.  */);
   DEFVAR_LISP ("window-configuration-change-hook",
               Vwindow_configuration_change_hook,
               doc: /* Functions to call when window configuration changes.
-The buffer-local part is run once per window, with the relevant window
-selected; while the global part is run only once for the modified frame,
+The buffer-local value is run once per window, with the relevant window
+selected; while the global value is run only once for the modified frame,
 with the relevant frame selected.  */);
   Vwindow_configuration_change_hook = Qnil;
 
diff --git a/src/xdisp.c b/src/xdisp.c
index 900a8dc..f1a6c62 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -13174,8 +13174,20 @@ hscroll_window_tree (Lisp_Object window)
 
          /* If the position of this window's point has explicitly
             changed, no more suspend auto hscrolling.  */
-         if (NILP (Fequal (Fwindow_point (window), Fwindow_old_point 
(window))))
-           w->suspend_auto_hscroll = false;
+         if (w->suspend_auto_hscroll
+             && NILP (Fequal (Fwindow_point (window),
+                              Fwindow_old_point (window))))
+           {
+             w->suspend_auto_hscroll = false;
+             /* When hscrolling just the current line, and the rest
+                of lines were temporarily hscrolled, but no longer
+                are, force thorough redisplay of this window, to show
+                the effect of disabling hscroll suspension immediately.  */
+             if (w->min_hscroll == 0 && w->hscroll > 0
+                 && EQ (Fbuffer_local_value (Qauto_hscroll_mode, w->contents),
+                        Qcurrent_line))
+               SET_FRAME_GARBAGED (XFRAME (w->frame));
+           }
 
          /* Remember window point.  */
          Fset_marker (w->old_pointm,
@@ -32563,6 +32575,9 @@ display-start position.
 These functions are called whenever the `window-start' marker is modified,
 either to point into another buffer (e.g. via `set-window-buffer') or another
 place in the same buffer.
+When each function is called, the `window-start' marker of its window
+argument has been already set to the new value, and the buffer which that
+window will display is set to be the current buffer.
 Note that the value of `window-end' is not valid when these functions are
 called.
 
diff --git a/test/file-organization.org b/test/file-organization.org
index 4d76c00..6c93c28 100644
--- a/test/file-organization.org
+++ b/test/file-organization.org
@@ -30,7 +30,7 @@ the directory structure of the source tree; so tests for 
files in the
 
 Tests should normally reside in a file with ~-tests.el~ added to the
 base-name of the tested source file; hence ~ert.el~ is tested in
-~ert-tests.el~, and ~pcase.el~ is tested in ~pcase-tests.el~.  As n
+~ert-tests.el~, and ~pcase.el~ is tested in ~pcase-tests.el~.  As an
 exception, tests for a single feature may be placed into multiple
 files of any name which are themselves placed in a directory named
 after the feature with ~-tests~ appended, such as
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index c27b338..2d2ac85 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -42,5 +42,37 @@
         (should (equal (buffer-string)
                        "test: "))))))
 
+(ert-deftest completion-table-with-predicate-test ()
+  (let ((full-collection
+         '("apple"                      ; Has A.
+           "beet"                       ; Has B.
+           "banana"                     ; Has A & B.
+           "cherry"                     ; Has neither.
+           ))
+        (no-A (lambda (x) (not (string-match-p "a" x))))
+        (no-B (lambda (x) (not (string-match-p "b" x)))))
+    (should
+     (member "cherry"
+             (completion-table-with-predicate
+              full-collection no-A t "" no-B t)))
+    (should-not
+     (member "banana"
+             (completion-table-with-predicate
+              full-collection no-A t "" no-B t)))
+    ;; "apple" should still match when strict is nil.
+    (should (eq t (try-completion
+                   "apple"
+                   (apply-partially
+                    'completion-table-with-predicate
+                    full-collection no-A nil)
+                   no-B)))
+    ;; "apple" should still match when strict is nil and pred2 is nil
+    ;; (Bug#27841).
+    (should (eq t (try-completion
+                   "apple"
+                   (apply-partially
+                    'completion-table-with-predicate
+                    full-collection no-A nil))))))
+
 (provide 'completion-tests)
 ;;; completion-tests.el ends here
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index af707f8..5a7134f 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -2290,7 +2290,7 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
 
        ;; Cleanup.
        (ignore-errors
-         (delete-directory tmp-name1))))))
+         (delete-directory tmp-name1 'recursive))))))
 
 (ert-deftest tramp-test17-insert-directory ()
   "Check `insert-directory'."
@@ -4432,23 +4432,27 @@ process sentinels.  They shall not disturb each other."
   "Check that Tramp is loaded lazily, only when needed."
   ;; Tramp is neither loaded at Emacs startup, nor when completing a
   ;; non-Tramp file name like "/foo".  Completing a Tramp-alike file
-  ;; name like "/foo:" autoloads Tramp.
+  ;; name like "/foo:" autoloads Tramp, when `tramp-mode' is t.
   (let ((code
         "(progn \
-          (message \"Tramp loaded: %s\" (featurep 'tramp)) \
+           (setq tramp-mode %s) \
+          (message \"Tramp loaded: %%s\" (featurep 'tramp)) \
           (file-name-all-completions \"/foo\" \"/\") \
-          (message \"Tramp loaded: %s\" (featurep 'tramp)) \
+          (message \"Tramp loaded: %%s\" (featurep 'tramp)) \
           (file-name-all-completions \"/foo:\" \"/\") \
-          (message \"Tramp loaded: %s\" (featurep 'tramp)))"))
-    (should
-     (string-match
-      "Tramp loaded: nil[\n\r]+Tramp loaded: nil[\n\r]+Tramp loaded: t[\n\r]+"
-      (shell-command-to-string
-       (format
-       "%s -batch -Q -L %s --eval %s"
-       (expand-file-name invocation-name invocation-directory)
-       (mapconcat 'shell-quote-argument load-path " -L ")
-       (shell-quote-argument code)))))))
+          (message \"Tramp loaded: %%s\" (featurep 'tramp)))"))
+    (dolist (tm '(t nil))
+      (should
+       (string-match
+       (format
+       "Tramp loaded: nil[\n\r]+Tramp loaded: nil[\n\r]+Tramp loaded: 
%s[\n\r]+"
+        tm)
+       (shell-command-to-string
+        (format
+         "%s -batch -Q -L %s --eval %s"
+         (expand-file-name invocation-name invocation-directory)
+         (mapconcat 'shell-quote-argument load-path " -L ")
+         (shell-quote-argument (format code tm)))))))))
 
 (ert-deftest tramp-test43-unload ()
   "Check that Tramp and its subpackages unload completely.
diff --git a/test/lisp/progmodes/flymake-resources/test.pl 
b/test/lisp/progmodes/flymake-resources/test.pl
index d5abcb4..6f4f1cc 100644
--- a/test/lisp/progmodes/flymake-resources/test.pl
+++ b/test/lisp/progmodes/flymake-resources/test.pl
@@ -1,2 +1,4 @@
 @arr = [1,2,3,4];
+unknown;
 my $b = @arr[1];
+[
diff --git a/test/lisp/progmodes/flymake-resources/test.rb 
b/test/lisp/progmodes/flymake-resources/test.rb
new file mode 100644
index 0000000..1419eaf
--- /dev/null
+++ b/test/lisp/progmodes/flymake-resources/test.rb
@@ -0,0 +1,5 @@
+def bla
+  return 2
+  print "not reached"
+  something
+  oops
diff --git a/test/lisp/progmodes/flymake-tests.el 
b/test/lisp/progmodes/flymake-tests.el
index cfa8100..c60f910 100644
--- a/test/lisp/progmodes/flymake-tests.el
+++ b/test/lisp/progmodes/flymake-tests.el
@@ -108,24 +108,23 @@ SEVERITY-PREDICATE is used to setup
     (should (eq 'flymake-warning
                 (face-at-point)))))
 
-(ert-deftest warning-predicate-rx-perl ()
-  "Test perl warning via regular expression predicate."
+(ert-deftest perl-backend ()
+  "Test the perl backend"
   (skip-unless (executable-find "perl"))
-  (flymake-tests--with-flymake
-      ("test.pl" :severity-predicate "^Scalar value")
+  (flymake-tests--with-flymake ("test.pl")
     (flymake-goto-next-error)
-    (should (eq 'flymake-warning
-                (face-at-point)))))
+    (should (eq 'flymake-warning (face-at-point)))
+    (flymake-goto-next-error)
+    (should (eq 'flymake-error (face-at-point)))))
 
-(ert-deftest warning-predicate-function-perl ()
-  "Test perl warning via function predicate."
-  (skip-unless (executable-find "perl"))
-  (flymake-tests--with-flymake
-      ("test.pl" :severity-predicate
-       (lambda (msg) (string-match "^Scalar value" msg)))
+(ert-deftest ruby-backend ()
+  "Test the ruby backend"
+  (skip-unless (executable-find "ruby"))
+  (flymake-tests--with-flymake ("test.rb")
     (flymake-goto-next-error)
-    (should (eq 'flymake-warning
-                (face-at-point)))))
+    (should (eq 'flymake-warning (face-at-point)))
+    (flymake-goto-next-error)
+    (should (eq 'flymake-error (face-at-point)))))
 
 (ert-deftest different-diagnostic-types ()
   "Test GCC warning via function predicate."



reply via email to

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