Update runtime files
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 9e5b6f2..062ccc3 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -9034,7 +9034,7 @@
 					entry depends on the language specific
 					kind values.  Only available when
 					using a tags file generated by
-					Exuberant ctags or hdrtag.
+					Universal/Exuberant ctags or hdrtag.
 			static		A file specific tag.  Refer to
 					|static-tag| for more information.
 		More entries may be present, depending on the content of the
diff --git a/runtime/doc/ft_ada.txt b/runtime/doc/ft_ada.txt
index 9adfea9..8645ad9 100644
--- a/runtime/doc/ft_ada.txt
+++ b/runtime/doc/ft_ada.txt
@@ -1,4 +1,4 @@
-*ft_ada.txt*	For Vim version 8.2.  Last change: 2010 Jul 20
+*ft_ada.txt*	For Vim version 8.2.  Last change: 2022 Mar 13
 
 
 		    ADA FILE TYPE PLUG-INS REFERENCE MANUAL~
@@ -89,9 +89,9 @@
 								 *ft-ada-omni*
 
 The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either
-by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net).  The
-complete function will automatically detect which tool was used to create the
-tags file.
+by "gnat xref -v" or the "Universal Ctags" (https://ctags.io).  The complete
+function will automatically detect which tool was used to create the tags
+file.
 
 ------------------------------------------------------------------------------
 3.1 Omni Completion with "gnat xref" ~
@@ -125,18 +125,18 @@
 3.2 Omni Completion with "ctags"~
 								   *ada-ctags*
 
-Exuberant Ctags uses its own multi-language code parser. The parser is quite
-fast, produces a lot of extra information (hence the name "Exuberant Ctags")
-and can run on files which currently do not compile.
+Universal/Exuberant Ctags use their own multi-language code parser.  The
+parser is quite fast, produces a lot of extra information and can run on files
+which currently do not compile.
 
-There are also lots of other Vim-tools which use exuberant Ctags.
+There are also lots of other Vim-tools which use Universal/Exuberant Ctags.
+Universal Ctags is preferred, Exuberant Ctags is no longer being developed.
 
-You will need to install a version of the Exuberant Ctags which has Ada
-support patched in. Such a version is available from the GNU Ada Project
-(http://gnuada.sourceforge.net).
+You will need to install Universal Ctags which is available from
+https://ctags.io
 
-The Ada parser for Exuberant Ctags is fairly new - don't expect complete
-support yet.
+The Ada parser for Universal/Exuberant Ctags is fairly new - don't expect
+complete support yet.
 
 ==============================================================================
 4. Compiler Support ~
diff --git a/runtime/doc/gui_w32.txt b/runtime/doc/gui_w32.txt
index e434286..93f68bd 100644
--- a/runtime/doc/gui_w32.txt
+++ b/runtime/doc/gui_w32.txt
@@ -1,4 +1,4 @@
-*gui_w32.txt*   For Vim version 8.2.  Last change: 2021 Oct 24
+*gui_w32.txt*   For Vim version 8.2.  Last change: 2022 Mar 09
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -236,7 +236,8 @@
 
 When the "unnamed" string is included in the 'clipboard' option, the unnamed
 register is the same.  Thus you can yank to and paste from the clipboard
-without prepending "* to commands.
+without prepending "* to commands. If this doesn't work use the "unnamedplus"
+string in the 'clipboard' option.
 
 The 'a' flag in 'guioptions' is not included by default.  This means that text
 is only put on the clipboard when an operation is performed on it.  Just
diff --git a/runtime/doc/if_perl.txt b/runtime/doc/if_perl.txt
index f1060e8..61ad7c9 100644
--- a/runtime/doc/if_perl.txt
+++ b/runtime/doc/if_perl.txt
@@ -1,4 +1,4 @@
-*if_perl.txt*   For Vim version 8.2.  Last change: 2022 Jan 28
+*if_perl.txt*   For Vim version 8.2.  Last change: 2022 Mar 13
 
 
 		  VIM REFERENCE MANUAL    by Sven Verdoolaege
@@ -22,9 +22,9 @@
 Perl script (see scripts.vim in Vim's syntax directory).  Vim assumes a file
 is POD text if the filename has a .POD suffix.
 
-To use tags with Perl, you need a recent version of Exuberant ctags.  Look
-here:
-	http://ctags.sourceforge.net
+To use tags with Perl, you need Universal/Exuberant Ctags.  Look here:
+	Universal Ctags (preferred): https://ctags.io
+	Exuberant Ctags: http://ctags.sourceforge.net
 
 Alternatively, you can use the Perl script pltags.pl, which is shipped with
 Vim in the $VIMRUNTIME/tools directory.  This script has currently more
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index 3153d46..5dc3348 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 8.2.  Last change: 2022 Mar 06
+*insert.txt*    For Vim version 8.2.  Last change: 2022 Mar 13
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1409,11 +1409,16 @@
 
 C							*ft-c-omni*
 
-Completion of C code requires a tags file.  You should use Exuberant ctags,
-because it adds extra information that is needed for completion.  You can find
-it here: http://ctags.sourceforge.net/  Version 5.6 or later is recommended.
+Completion of C code requires a tags file.  You should use Universal/
+Exuberant ctags, because it adds extra information that is needed for
+completion.  You can find it here:
+	Universal Ctags: https://ctags.io
+	Exuberant Ctags: http://ctags.sourceforge.net
 
-For version 5.5.4 you should add a patch that adds the "typename:" field:
+Universal Ctags is preferred, Exuberant Ctags is no longer being developed.
+
+For Exuberant ctags, version 5.6 or later is recommended.  For version 5.5.4
+you should add a patch that adds the "typename:" field:
 	ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch
 A compiled .exe for MS-Windows can be found at:
 	http://ctags.sourceforge.net/
@@ -1534,8 +1539,11 @@
 PHP							*ft-php-omni*
 
 Completion of PHP code requires a tags file for completion of data from
-external files and for class aware completion. You should use Exuberant ctags
-version 5.5.4 or newer. You can find it here: http://ctags.sourceforge.net/
+external files and for class aware completion. You should use Universal/
+Exuberant ctags version 5.5.4 or newer. You can find it here:
+
+	Universal Ctags: https://ctags.io
+	Exuberant Ctags: http://ctags.sourceforge.net
 
 Script completes:
 
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 9d353ac..5bafaff 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 8.2.  Last change: 2022 Feb 18
+*options.txt*	For Vim version 8.2.  Last change: 2022 Mar 13
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -7859,9 +7859,10 @@
 	linear search can be avoided when case is ignored.  Use a value of '2'
 	in the "!_TAG_FILE_SORTED" line for this.  A tag file can be case-fold
 	sorted with the -f switch to "sort" in most unices, as in the command:
-	"sort -f -o tags tags".  For "Exuberant ctags" version 5.x or higher
-	(at least 5.5) the --sort=foldcase switch can be used for this as
-	well.  Note that case must be folded to uppercase for this to work.
+	"sort -f -o tags tags".  For Universal ctags and Exuberant ctags
+	version 5.x or higher (at least 5.5) the --sort=foldcase switch can be
+	used for this as well.  Note that case must be folded to uppercase for
+	this to work.
 
 	By default, tag searches are case-sensitive.  Case is ignored when
 	'ignorecase' is set and 'tagcase' is "followic", or when 'tagcase' is
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index f43ab7c..9451ff2 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -5553,11 +5553,12 @@
 memory Vim will consume.
 
 Only highlighting typedefs, unions and structs can be done too.  For this you
-must use Exuberant ctags (found at http://ctags.sf.net).
+must use Universal Ctags (found at https://ctags.io) or Exuberant ctags (found
+at http://ctags.sf.net).
 
 Put these lines in your Makefile:
 
-# Make a highlight file for types.  Requires Exuberant ctags and awk
+# Make a highlight file for types.  Requires Universal/Exuberant ctags and awk
 types: types.vim
 types.vim: *.[ch]
 	ctags --c-kinds=gstu -o- *.[ch] |\
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 81ba7d9..e64bdd5 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -4254,6 +4254,7 @@
 E1266	if_pyth.txt	/*E1266*
 E127	eval.txt	/*E127*
 E1270	change.txt	/*E1270*
+E1271	vim9.txt	/*E1271*
 E128	eval.txt	/*E128*
 E129	eval.txt	/*E129*
 E13	message.txt	/*E13*
diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt
index b53131b..e239119 100644
--- a/runtime/doc/tagsrch.txt
+++ b/runtime/doc/tagsrch.txt
@@ -561,7 +561,8 @@
 
 The second format is new.  It includes additional information in optional
 fields at the end of each line.  It is backwards compatible with Vi.  It is
-only supported by new versions of ctags (such as Exuberant ctags).
+only supported by new versions of ctags (such as Universal ctags or Exuberant
+ctags).
 
 {tagname}	The identifier.  Normally the name of a function, but it can
 		be any identifier.  It cannot contain a <Tab>.
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 57a84e5..fd0817d 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 8.2.  Last change: 2022 Mar 08
+*todo.txt*      For Vim version 8.2.  Last change: 2022 Mar 18
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -38,27 +38,10 @@
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Allow for assigning v:null to job/channel/funcref etc.
-- Check that the declared type is not lost.
-- Check: var d: dict<func> = {a: function('tr'), b: null}
-
-Fix that with s being an empty string, this returns TRUE:
-    echo s is null_string
-
-Make sure null types work to:
-- assign to a variable
-- use as an argument
-- use as default value of optional argument
-- use as return value
-- use in a list/dict constant, type is correct
-- revert comparing with null?
-
-TODO item in eval.c
-
-Really drop the Athena GUI?  And NeXtaw?
+Really drop the Athena and NeXtaw GUI?  Decide end of March.
 
 Once Vim9 is stable:
-- Use Vim9 for runtime files.
+- Use Vim9 for more runtime files.
 - Check code coverage, add more tests if needed.
 	vim9execute.c  line 1900
 	vim9expr.c
@@ -123,7 +106,6 @@
 - Should popup_getoptions() also return the mask?  #7774
 - Add a way to use popup_menu() synchronously: instead of invoking the
   callback, return the choice. (Ben Jackson, #6534)
-- Use popup (or popup menu) for command line completion
 - When using a popup for the info of a completion menu, and there is not
   enough space, let the popup overlap with the menu. (#4544)
 - Implement flip option.
@@ -2231,10 +2213,6 @@
 
 Problem with editing file in binary mode. (Ingo Krabbe, 2009 Oct 8)
 
-With 'wildmode' set to "longest:full,full" and pressing Tab once the first
-entry in wildmenu is highlighted, that shouldn't happen. (Yuki Watanabe, 2011
-Feb 12)
-
 Display error when 'tabline' that includes a file name with double-width
 characters. (2010 Aug 14, bootleq)
 
@@ -2437,10 +2415,6 @@
 first line. (Ingo Karkat, 2008 Jul 1)  Ian Kelling is working on this.
 Similar problem with ":e". (Marc Montu, 2014 Apr 22)
 
-Wildmenu not deleted: "gvim -u NONE", ":set nocp wildmenu cmdheight=3
-laststatus=2", CTRL-D CTRL-H CTRL-H CTRL-H. (A.Politz, 2008 April 1)
-Works OK with Vim in an xterm.
-
 Cursor line moves in other window when using CTRL-W J that doesn't change
 anything.  (Dasn, 2009 Apr 7)
 
@@ -2473,10 +2447,6 @@
 When 'rightleft' is set, cursorcolumn isn't highlighted after the end of a
 line.  It's also wrong in folds. (Dominique Pelle, 2010 Aug 21)
 
-After using <Tab> for command line completion after ":ta blah" and getting E33
-(no tags file), further editing the command to e.g., ":echo 'blah'", the
-command is not executed.  Fix by Ian Kelling?
-
 ":help s/~" jumps to *s/\~*, while ":help s/\~" doesn't find anything. (Tim
 Chase)  Fix by Ian Kelling, 2008 Jul 14.
 
@@ -2652,16 +2622,6 @@
 When a register contains illegal bytes, writing viminfo in utf-8 and reading
 it back doesn't result in utf-8. (Devin Bayer)
 
-Command line completion: Scanning for tags doesn't check for typed key now and
-then?  Hangs for about 5 seconds.  Appears to be caused by finding include
-files with "foo/**" in 'path'.  (Kalisiak, 2006 July 15)
-Additional info: When using the |wildcards| ** globing, vim hangs
-indefinitely on lots of directories. The |file-searching| globing, like in
-":set path=/**" does not hang as often as with globing with |wildcards|, like
-in ":1find /**/file".  This is for files that unix "find" can find very
-quickly. Merging the 2 kinds of globing might make this an easier fix. (Ian
-Kelling, 2008 July 4)
-
 When the file name has parenthesis, e.g., "foo (bar).txt", ":!ls '%'" has the
 parenthesis escaped but not the space.  That's inconsistent.  Either escape
 neither or both.  No escaping might be best, because it doesn't depend on
@@ -2740,8 +2700,6 @@
 When $VAR contains a backslash expand('$VAR') removes it. (Teemu Likonen, 2008
 Jun 18)
 
-If the variable "g:x#y#z" exists completion after ":echo g:x#" doesn't work.
-
 In debug mode, using CTRL-R = to evaluate a function causes stepping through
 the function. (Hari Krishna Dara, 2006 Jun 28)
 
@@ -2850,13 +2808,6 @@
 
 For Aap: include a config.arg.example file with hints how to use config.arg.
 
-Command line completion when 'cmdheight' is maximum and 'wildmenu' is set,
-only one buffer line displayed, causes display errors.
-
-Completing with 'wildmenu' and using <Up> and <Down> to move through directory
-tree stops unexpectedly when using ":cd " and entering a directory that
-doesn't contain other directories.
-
 Default for 'background' is wrong when using xterm with 256 colors.
 Table with estimates from Matteo Cavalleri, 2014 Jan 10.
 
@@ -3538,8 +3489,6 @@
 8   When doing Insert mode completion a mapping cannot recursively call
     edit(), because the completion information is global.  Put everything in
     an allocated structure?
-8   Command line completion: buffers "foo.txt" and "../b/foo.txt", completing
-    ":buf foo<Tab>" doesn't find the second one. (George V. Reilly)
 7   mb_off2cells() doesn't work correctly on the tail byte of a double-byte
     character. (Yasuhiro Matsumoto)  It should return 1 when used on a tail
     byte, like for utf-8.  Store second byte of double-byte in ScreenLines2[]
@@ -4274,8 +4223,6 @@
 7   CTRL-] checks the highlight group for finding out what the tag is.
 7   Add an explanation how a list of words can be used to highlight misspelled
     words.
-8   Add more command line completion for :syntax.
-8   Add more command line completion for :highlight.
 7   Should find a better way to parse the :syntax and :highlight commands.
     Use tables or lists that can be shared by parsing for execution and
     completion?
@@ -5061,6 +5008,35 @@
 -   Add 'wildlongest' option: Key to use to find longest common match for
     command line completion (default CTRL-L), like 'wildchar'. (Cregut)
     Also: when there are several matches, show them line a CTRL-D.
+-   With 'wildmode' set to "longest:full,full" and pressing Tab once the first
+    entry in wildmenu is highlighted, that shouldn't happen. (Yuki Watanabe,
+    2011 Feb 12)
+-   After using <Tab> for command line completion after ":ta blah" and getting
+    E33 (no tags file), further editing the command to e.g., ":echo 'blah'",
+    the command is not executed.  Fix by Ian Kelling?
+-   Command line completion: Scanning for tags doesn't check for typed key now
+    and then?  Hangs for about 5 seconds.  Appears to be caused by finding
+    include files with "foo/**" in 'path'.  (Kalisiak, 2006 July 15)
+    Additional info: When using the |wildcards| ** globing, vim hangs
+    indefinitely on lots of directories. The |file-searching| globing, like in
+    ":set path=/**" does not hang as often as with globing with |wildcards|,
+    like in ":1find /**/file".  This is for files that unix "find" can find
+    very quickly. Merging the 2 kinds of globing might make this an easier
+    fix. (Ian Kelling, 2008 July 4)
+-   Command line completion when 'cmdheight' is maximum and 'wildmenu' is set,
+    only one buffer line displayed, causes display errors.
+-   Completing with 'wildmenu' and using <Up> and <Down> to move through
+    directory tree stops unexpectedly when using ":cd " and entering a
+    directory that doesn't contain other directories.
+8   Command line completion: buffers "foo.txt" and "../b/foo.txt", completing
+    ":buf foo<Tab>" doesn't find the second one. (George V. Reilly)
+8   Add more command line completion for :syntax.
+8   Add more command line completion for :highlight.
+-   Wildmenu not deleted: "gvim -u NONE", ":set nocp wildmenu cmdheight=3
+    laststatus=2", CTRL-D CTRL-H CTRL-H CTRL-H. (A.Politz, 2008 April 1) Works
+    OK with Vim in an xterm.
+-   If the variable "g:x#y#z" exists completion after ":echo g:x#" doesn't
+    work.
 
 
 Command line history:
diff --git a/runtime/doc/usr_29.txt b/runtime/doc/usr_29.txt
index 5940206..de1b911 100644
--- a/runtime/doc/usr_29.txt
+++ b/runtime/doc/usr_29.txt
@@ -1,4 +1,4 @@
-*usr_29.txt*	For Vim version 8.2.  Last change: 2016 Feb 27
+*usr_29.txt*	For Vim version 8.2.  Last change: 2022 Mar 13
 
 		     VIM USER MANUAL - by Bram Moolenaar
 
@@ -33,10 +33,12 @@
 	ctags *.c
 
 "ctags" is a separate program.  Most Unix systems already have it installed.
-If you do not have it yet, you can find Exuberant ctags here:
-
+If you do not have it yet, you can find Universal/Exuberant ctags at:
+	http://ctags.io ~
 	http://ctags.sf.net ~
 
+Universal ctags is preferred, Exuberant ctags is no longer being developed.
+
 Now when you are in Vim and you want to go to a function definition, you can
 jump to it by using the following command: >
 
@@ -142,15 +144,15 @@
 When Vim has to search many places for tags files, you can hear the disk
 rattling.  It may get a bit slow.  In that case it's better to spend this
 time while generating one big tags file.  You might do this overnight.
-   This requires the Exuberant ctags program, mentioned above.  It offers an
-argument to search a whole directory tree: >
+   This requires the Universal or Exuberant ctags program, mentioned above.
+It offers an argument to search a whole directory tree: >
 
 	cd ~/proj
 	ctags -R .
 
-The nice thing about this is that Exuberant ctags recognizes various file
-types.  Thus this doesn't work just for C and C++ programs, also for Eiffel
-and even Vim scripts.  See the ctags documentation to tune this.
+The nice thing about this is that Universal/Exuberant ctags recognizes various
+file types.  Thus this doesn't work just for C and C++ programs, also for
+Eiffel and even Vim scripts.  See the ctags documentation to tune this.
    Now you only need to tell Vim where your big tags file is: >
 
 	:set tags=~/proj/tags
@@ -232,7 +234,8 @@
 Since CTRL-] takes you to the definition of the identifier under the cursor,
 you can use a list of identifier names as a table of contents.  Here is an
 example.
-   First create a list of identifiers (this requires Exuberant ctags): >
+   First create a list of identifiers (this requires Universal or Exuberant
+ctags): >
 
 	ctags --c-types=f -f functions *.c
 
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index 0e1ecf5..7d5c258 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -837,7 +837,7 @@
 Patch 8.2.0107
 Problem:    Hgignore is out of sync from gitignore.
 Solution:   Add lines to hgignore. (Ken Takata)
-Files:      .hgigmore
+Files:      .hgignore
 
 Patch 8.2.0108
 Problem:    When sign text is changed a manual redraw is needed. (Pontus
@@ -2474,7 +2474,7 @@
 Patch 8.2.0367
 Problem:    Can use :pedit in a popup window.
 Solution:   Disallow it.
-Files:      src/ex_docmd.c, src/testdir/test_popuwin.vim
+Files:      src/ex_docmd.c, src/testdir/test_popupwin.vim
 
 Patch 8.2.0368
 Problem:    Vim9: import that redefines local variable does not fail.
@@ -2513,7 +2513,7 @@
 Problem:    Prop_find() may not find text property at start of the line.
 Solution:   Adjust the loop to find properties. (Axel Forsman, closes #5761,
             closes #5663)
-Files:      src/testprop.c, src/testdir/test_textprop.vim
+Files:      src/textprop.c, src/testdir/test_textprop.vim
 
 Patch 8.2.0373
 Problem:    Type of term_sendkeys() is unknown.
@@ -3743,7 +3743,7 @@
 Problem:    Vim9: no error when omitting type from argument.
 Solution:   Enforce specifying argument types.
 Files:      src/userfunc.c, src/ex_eval.c, src/testdir/test_vim9_script.vim,
-            src/testdir/test_vim9_func.vim, src/testdir/test_vim9_expr.vim
+            src/testdir/test_vim9_func.vim, src/testdir/test_vim9_expr.vim,
             src/testdir/test_vim9_disassemble.vim
 
 Patch 8.2.0571
@@ -3921,7 +3921,7 @@
 Patch 8.2.0600
 Problem:    Vim9: cannot read or write w:, t: and b: variables.
 Solution:   Implement load and store for w:, t: and b: variables.
-            (closes #5950) 
+            (closes #5950)
 Files:      src/testdir/test_vim9_disassemble.vim,
             src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim,
             src/vim9.h, src/vim9compile.c, src/vim9execute.c
@@ -4042,7 +4042,7 @@
 
 Patch 8.2.0618
 Problem:    Echoing a null list results in no output. (Yegappan Lakshmanan)
-Solution:   Return "[]" instead of NULL in echo_string_core(). 
+Solution:   Return "[]" instead of NULL in echo_string_core().
 Files:      src/eval.c, src/testdir/test_messages.vim
 
 Patch 8.2.0619
@@ -4095,7 +4095,7 @@
             (closes #5670)
 Files:      src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/userfunc.c,
             src/eval.c, src/globals.h, src/testdir/test_vim9_func.vim,
-            src/testdir/test_vim9_disassemble.vim
+            src/testdir/test_vim9_disassemble.vim,
             src/testdir/test_vim9_script.vim
 
 Patch 8.2.0627
@@ -5205,8 +5205,9 @@
 Solution:   Include revision 727, but add the index instead of switching
             between RGB and indexed.
 Files:      src/terminal.c, src/term.c, src/libvterm/include/vterm.h,
-            src/libvterm/src/pen.c src/libvterm/src/screen.c
-            src/libvterm/src/vterm_internal.h src/libvterm/t/30state_pen.test
+            src/libvterm/src/pen.c, src/libvterm/src/screen.c,
+            src/libvterm/src/vterm_internal.h,
+            src/libvterm/t/30state_pen.test,
             src/libvterm/t/harness.c, src/libvterm/src/state.c,
             src/libvterm/t/26state_query.test,
             src/libvterm/t/64screen_pen.test
@@ -5299,7 +5300,7 @@
             src/evalvars.c, src/proto/evalvars.pro, src/vim9compile.c,
             src/proto/vim9compile.pro, src/vim9execute.c, src/ex_cmds.h,
             src/ex_docmd.c, src/ex_cmdidxs.h, src/vim.h, src/testdir/vim9.vim,
-            src/testdir/test_vim9_disassemble.vim
+            src/testdir/test_vim9_disassemble.vim,
             src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
 
 Patch 8.2.0819
@@ -5667,7 +5668,7 @@
 Problem:    Getting attributes for directory entries is slow.
 Solution:   Add readdirex(). (Ken Takata, closes #5619)
 Files:      runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
-            src/fileio.c, src/filepath.c src/proto/fileio.pro,
+            src/fileio.c, src/filepath.c, src/proto/fileio.pro,
             src/proto/filepath.pro, src/testdir/test_functions.vim
 
 Patch 8.2.0876
@@ -6292,7 +6293,7 @@
 Problem:    Vim9: cannot compile "[var, var] = list".
 Solution:   Implement list assignment.
 Files:      src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/evalvars.c,
-            src/proto/evalvars.pro src/eval.c, src/testdir/test_vim9_script.vim
+            src/proto/evalvars.pro, src/eval.c, src/testdir/test_vim9_script.vim
 
 Patch 8.2.0982
 Problem:    Insufficient testing for reading/writing files.
@@ -6335,7 +6336,7 @@
             src/cmdexpand.c, src/config.h.in, src/configure.ac,
             src/evalfunc.c, src/evalvars.c, src/ex_cmds2.c, src/fileio.c,
             src/filepath.c, src/globals.h, src/proto/fileio.pro,
-            src/testdir/test_cmdline.vim, src/testdir/test_functions.vim
+            src/testdir/test_cmdline.vim, src/testdir/test_functions.vim,
             src/vim.h
 
 Patch 8.2.0989
@@ -9545,7 +9546,7 @@
 Problem:    Vim9: cannot assign to local option.
 Solution:   Skip over "&l:" and "&g:". (closes #6749)
 Files:      src/ex_docmd.c, src/proto/ex_docmd.pro, src/testdir/vim9.vim,
-            src/vim9compile.c src/testdir/test_vim9_script.vim
+            src/vim9compile.c, src/testdir/test_vim9_script.vim
 
 Patch 8.2.1519
 Problem:    Vim9: Ex command default range is not set.
@@ -11740,7 +11741,7 @@
 Patch 8.2.1898
 Problem:    Command modifier parsing always uses global cmdmod.
 Solution:   Pass in cmdmod_T to use.  Rename struct fields consistently.
-Files:      src/structs.h, src/arglist.c src/buffer.c, src/bufwrite.c,
+Files:      src/structs.h, src/arglist.c, src/buffer.c, src/bufwrite.c,
             src/diff.c, src/change.c, src/cmdhist.c, src/edit.c,
             src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
             src/fileio.c, src/filepath.c, src/gui.c, src/gui_gtk_x11.c,
@@ -13549,7 +13550,7 @@
 Problem:    Vim9: return type of => lambda not parsed.
 Solution:   Parse and use the return type.
 Files:      src/vim9compile.c, src/userfunc.c, src/vim9type.c,
-            src/proto/vim9type.pro, src/vim9script.c, src/eval.c
+            src/proto/vim9type.pro, src/vim9script.c, src/eval.c,
             src/testdir/test_vim9_expr.vim
 
 Patch 8.2.2210
@@ -13776,7 +13777,7 @@
 Files:      src/term.c
 
 Patch 8.2.2249
-Problem:    Termcodes test is flaky when used over ssh with X forwarding. 
+Problem:    Termcodes test is flaky when used over ssh with X forwarding.
 Solution:   Set 'mousetime' to a larger value. (Dominique Pellé, closes #7576,
             closes #7563)
 Files:      src/testdir/test_termcodes.vim
@@ -15482,7 +15483,7 @@
 Solution:   Implement ISN_UNLETRANGE.
 Files:      src/errors.h, src/eval.c, src/evalvars.c, src/list.c,
             src/proto/evalvars.pro, src/proto/list.pro, src/vim9.h,
-            src/vim9compile.c, src/vim9execute.c
+            src/vim9compile.c, src/vim9execute.c,
             src/testdir/test_vim9_assign.vim
 
 Patch 8.2.2534
@@ -15518,7 +15519,7 @@
 Solution:   Store both the finally and endtry indexes. (closes #7885)
 Files:      src/vim9execute.c, src/vim9compile.c, src/vim9.h,
             src/testdir/test_vim9_script.vim,
- 
+
 Patch 8.2.2540
 Problem:    Vim9: no error for using script var name for argument.
 Solution:   Check for this error. (closes #7868)
@@ -17249,7 +17250,7 @@
 
 Patch 8.2.2841
 Problem:    MS-Windows: cursor in wrong position when 'lazyredraw' and
-            'statusline' are set. 
+            'statusline' are set.
 Solution:   Call compute_cmdrow(). (closes #8170, closes #8184)
 Files:      src/os_win32.c
 
@@ -17936,7 +17937,7 @@
 Problem:    Using getchar() in Vim9 script is problematic.
 Solution:   Add getcharstr(). (closes #8343)
 Files:      runtime/doc/eval.txt, src/evalfunc.c, src/getchar.c,
-            src/proto/getchar.pro, src/testdir/test_getchar.vim
+            src/proto/getchar.pro, src/testdir/test_functions.vim
 
 Patch 8.2.2958 (after 8.2.2957)
 Problem:    Function list test fails.
@@ -18849,7 +18850,7 @@
 Files:      src/testdir/check.vim
 
 Patch 8.2.3110
-Problem:    A pattern that matches the cursor position is bit complicated.
+Problem:    A pattern that matches the cursor position is a bit complicated.
 Solution:   Use a dot to indicate the cursor line and column. (Christian
             Brabandt, closes #8497, closes #8179)
 Files:      runtime/doc/pattern.txt, src/errors.h, src/regexp_bt.c,
@@ -18864,7 +18865,7 @@
 Problem:    With concealing enabled and indirectly closing a fold the cursor
             may be somewhere in a folded line when it is not on the first line
             of the fold.
-Solution:   Check if he cursor is somewhere in the folded text.
+Solution:   Check if the cursor is somewhere in the folded text.
 Files:      src/drawscreen.c
 
 Patch 8.2.3113
@@ -23950,7 +23951,7 @@
 Problem:    Error messages are spread out.
 Solution:   Move more errors to errors.h.
 Files:      src/errors.h, src/globals.h, src/arglist.c, src/bufwrite.c,
-            src/evalvars.c, src/ex_cmds2.c, src/ex_docmd.c src/ex_eval.c,
+            src/evalvars.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
             src/help.c, src/scriptfile.c, src/usercmd.c, src/userfunc.c,
             src/vim9cmds.c, src/vim9compile.c
 
@@ -23975,7 +23976,7 @@
 Patch 8.2.3961
 Problem:    Error messages are spread out.
 Solution:   Move more errors to errors.h.
-Files:      src/errors.h, src/globals.h src/arglist.c, src/autocmd.c,
+Files:      src/errors.h, src/globals.h, src/arglist.c, src/autocmd.c,
             src/blob.c, src/bufwrite.c, src/channel.c, src/clipboard.c,
             src/cmdexpand.c, src/debugger.c, src/dict.c, src/eval.c,
             src/evalfunc.c, src/evalvars.c, src/evalwindow.c, src/ex_cmds.c,
@@ -24291,7 +24292,7 @@
 
 Patch 8.2.4004
 Problem:    Old compiler complains about struct init with variable.
-Solution:   Set the struct member later. (John Marriott) 
+Solution:   Set the struct member later. (John Marriott)
 Files:      src/evalfunc.c
 
 Patch 8.2.4005
@@ -24494,7 +24495,7 @@
 Patch 8.2.4036
 Problem:    Vim9: script test file is getting too long.
 Solution:   Split the import/export functionality to a separate file.
-Files:      src/testdir/test_vim9_script.vim src/testdir/test_vim9_import.vim,
+Files:      src/testdir/test_vim9_script.vim, src/testdir/test_vim9_import.vim,
             src/testdir/Make_all.mak
 
 Patch 8.2.4037
@@ -25457,7 +25458,7 @@
 Problem:    Vim9: cannot export function that exists globally.
 Solution:   When checking if a function already exists only check for
             script-local functions. (closes #9615)
-Files:      src/userfunc.c, src/proto/userfunc.pro, src/vim.h, 
+Files:      src/userfunc.c, src/proto/userfunc.pro, src/vim.h,
             src/vim9compile.c, src/vim9instr.c,
             src/testdir/test_vim9_import.vim
 
@@ -25853,7 +25854,7 @@
 Problem:    Autoload tests fails.
 Solution:   Use export instead of name with #.
 Files:      src/testdir/sautest/autoload/auto9.vim,
-            src/testdir/test_autoload.vim src/testdir/test_ins_complete.vim
+            src/testdir/test_autoload.vim, src/testdir/test_ins_complete.vim
 
 Patch 8.2.4266
 Problem:    Compiler warning for uninitialized variable.
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index 54e02ae..f494880 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -1,4 +1,4 @@
-*vim9.txt*	For Vim version 8.2.  Last change: 2022 Mar 08
+*vim9.txt*	For Vim version 8.2.  Last change: 2022 Mar 18
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -995,6 +995,11 @@
 	   if b == null_blob
 	      # b argument was not given
 
+It is possible to compare `null`  with any value, this will not give a type
+error.  However, comparing `null` with a number, float or bool will always
+result in `false`.  This is different from legacy script, where comparing
+`null` with zero or `false` would return `true`.
+
 When converting a boolean to a string `false` and `true` are used, not
 `v:false` and `v:true` like in legacy script.  `v:none` has no `none`
 replacement, it has no equivalent in other languages.
@@ -1234,6 +1239,11 @@
 	endfor
 	echo range(5)->map((i, _) => flist[i]())
 	# Result: [4, 4, 4, 4, 4]
+<							*E1271*
+A closure must be compiled in the context that it is defined in, so that
+variables in that context can be found.  This mostly happens correctly, except
+when a function is marked for debugging with `breakadd` after it was compiled.
+Make sure the define the breakpoint before compiling the outerh function.
 
 The "inloop" variable will exist only once, all closures put in the list refer
 to the same instance, which in the end will have the value 4.  This is
@@ -1739,7 +1749,8 @@
    prefix is obtained from the file name, as you would to manually in a
    legacy autoload script.  Thus the exported function can be found with
    "for#search#Stuff", but you would normally use `import autoload` and not
-   use the prefix.
+   use the prefix (which has the side effect of loading the autoload script
+   when compiling a function that encounters this name).
 
    You can split up the functionality and import other scripts from the
    autoload script as you like.  This way you can share code between plugins.
@@ -1751,7 +1762,17 @@
 When compiling a `:def` function and a function in an autoload script is
 encountered, the script is not loaded until the `:def` function is called.
 This also means you get any errors only at runtime, since the argument and
-return types are not known yet.
+return types are not known yet.  If you would use the name with '#' characters
+then the autoload script IS loaded.
+
+Be careful to not refer to an item in an autoload script that does trigger
+loading it unintentionally.  For example, when setting an option that takes a
+function name, make sure to use a string, not a function reference: >
+	import autoload 'qftf.vim'
+	&quickfixtextfunc = 'qftf.Func'  # autoload script NOT loaded
+	&quickfixtextfunc = qftf.Func    # autoload script IS loaded
+On the other hand, it can be useful to load the script early, at a time when
+any errors should be given.
 
 For testing the |test_override()| function can be used to have the
 `import autoload` load the script right away, so that the items and types can
diff --git a/runtime/ftplugin/liquid.vim b/runtime/ftplugin/liquid.vim
index b211a88..f24ec4c 100644
--- a/runtime/ftplugin/liquid.vim
+++ b/runtime/ftplugin/liquid.vim
@@ -1,7 +1,7 @@
 " Vim filetype plugin
 " Language:     Liquid
 " Maintainer:   Tim Pope <vimNOSPAM@tpope.org>
-" Last Change:	2010 May 21
+" Last Change:	2022 Mar 15
 
 if exists('b:did_ftplugin')
   finish
@@ -53,7 +53,7 @@
 endif
 
 if exists('loaded_matchit')
-  let b:match_words .= '\<\%(if\w*\|unless\|case\)\>:\<\%(elsif\|else\|when\)\>:\<end\%(if\w*\|unless\|case\)\>,\<\%(for\|tablerow\)\>:\%({%\s*\)\@<=empty\>:\<end\%(for\|tablerow\)\>,<\(capture\|comment\|highlight\)\>:\<end\1\>'
+  let b:match_words .= '\<\%(if\w*\|unless\|case\)\>:\<\%(elsif\|else\|when\)\>:\<end\%(if\w*\|unless\|case\)\>,\<\%(for\|tablerow\)\>:\%({%\s*\)\@<=empty\>:\<end\%(for\|tablerow\)\>,\<\(capture\|comment\|highlight\)\>:\<end\1\>'
 endif
 
 setlocal commentstring={%\ comment\ %}%s{%\ endcomment\ %}
diff --git a/runtime/ftplugin/php.vim b/runtime/ftplugin/php.vim
index 3ff0828..2824a58 100644
--- a/runtime/ftplugin/php.vim
+++ b/runtime/ftplugin/php.vim
@@ -73,10 +73,11 @@
 exe 'ono <buffer> <silent> [[ ?' . escape(s:section, '|') . '?<CR>:nohls<CR>'
 exe 'ono <buffer> <silent> ]] /' . escape(s:section, '|') . '/<CR>:nohls<CR>'
 
+setlocal suffixesadd=.php
 setlocal commentstring=/*%s*/
 
 " Undo the stuff we changed.
-let b:undo_ftplugin = "setlocal commentstring< include< omnifunc<" .
+let b:undo_ftplugin = "setlocal suffixesadd< commentstring< include< omnifunc<" .
 	    \	      " | unlet! b:browsefilter b:match_words | " .
 	    \	      s:undo_ftplugin
 
diff --git a/runtime/gvim.desktop b/runtime/gvim.desktop
index 2fc06c2..3c5ff1c 100644
--- a/runtime/gvim.desktop
+++ b/runtime/gvim.desktop
@@ -2,6 +2,7 @@
 # Edit the src/po/gvim.desktop.in file instead.
 [Desktop Entry]
 # Translators: This is the Application Name used in the GVim desktop file
+Name[ca]=GVim
 Name[de]=GVim
 Name[eo]=GVim
 Name[fi]=GVim
@@ -13,6 +14,7 @@
 Name[tr]=GVim
 Name=GVim
 # Translators: This is the Generic Application Name used in the Vim desktop file
+GenericName[ca]=Editor de text
 GenericName[de]=Texteditor
 GenericName[eo]=Tekstoredaktilo
 GenericName[fi]=Tekstinmuokkain
@@ -25,6 +27,7 @@
 GenericName[tr]=Metin Düzenleyici
 GenericName=Text Editor
 # Translators: This is the comment used in the Vim desktop file
+Comment[ca]=Edita fitxers de text
 Comment[de]=Textdateien bearbeiten
 Comment[eo]=Redakti tekstajn dosierojn
 Comment[fi]=Muokkaa tekstitiedostoja
@@ -49,7 +52,6 @@
 Comment[bg]=Редактиране на текстови файлове
 Comment[bn]=টেক্স্ট ফাইল এডিট করুন
 Comment[bs]=Izmijeni tekstualne datoteke
-Comment[ca]=Edita fitxers de text
 Comment[cs]=Úprava textových souborů
 Comment[cy]=Golygu ffeiliau testun
 Comment[da]=Rediger tekstfiler
@@ -105,6 +107,7 @@
 Terminal=false
 Type=Application
 # Translators: Search terms to find this application. Do NOT change the semicolons! The list MUST also end with a semicolon!
+Keywords[ca]=Text;editor;
 Keywords[de]=Text;Editor;
 Keywords[eo]=Teksto;redaktilo;
 Keywords[fi]=Teksti;muokkain;editori;
diff --git a/runtime/indent/bst.vim b/runtime/indent/bst.vim
index 47e3058..3dd8d71 100644
--- a/runtime/indent/bst.vim
+++ b/runtime/indent/bst.vim
@@ -1,20 +1,18 @@
 " Vim indent file
 " Language:	bst
 " Author:	Tim Pope <vimNOSPAM@tpope.info>
-" $Id: bst.vim,v 1.1 2007/05/05 18:11:12 vimboss Exp $
+" Last Change:	2022 Mar 15
 
 if exists("b:did_indent")
     finish
 endif
 let b:did_indent = 1
 
-setlocal expandtab
 setlocal indentexpr=GetBstIndent(v:lnum)
-"setlocal smartindent
 setlocal cinkeys&
 setlocal cinkeys-=0#
 setlocal indentkeys&
-"setlocal indentkeys+=0%
+let b:undo_indent = 'setlocal indentexpr< cinkeys< indentkeys<'
 
 " Only define the function once.
 if exists("*GetBstIndent")
diff --git a/runtime/indent/haml.vim b/runtime/indent/haml.vim
index baca1d4..acd99d9 100644
--- a/runtime/indent/haml.vim
+++ b/runtime/indent/haml.vim
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:	Haml
 " Maintainer:	Tim Pope <vimNOSPAM@tpope.org>
-" Last Change:	2019 Dec 05
+" Last Change:	2022 Mar 15
 
 if exists("b:did_indent")
   finish
@@ -14,6 +14,8 @@
 setlocal indentexpr=GetHamlIndent()
 setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when
 
+let b:undo_indent = "setl ai< inde< indk<"
+
 " Only define the function once.
 if exists("*GetHamlIndent")
   finish
diff --git a/runtime/indent/liquid.vim b/runtime/indent/liquid.vim
index 7beb038..6fc9337 100644
--- a/runtime/indent/liquid.vim
+++ b/runtime/indent/liquid.vim
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:     Liquid
 " Maintainer:   Tim Pope <vimNOSPAM@tpope.org>
-" Last Change:	2017 Jun 13
+" Last Change:	2022 Mar 15
 
 if exists('b:did_indent')
   finish
@@ -29,17 +29,19 @@
 setlocal indentexpr=GetLiquidIndent()
 setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=endif,=endunless,=endifchanged,=endcase,=endfor,=endtablerow,=endcapture,=else,=elsif,=when,=empty
 
+let b:undo_indent = "setl inde< indk<"
+
 " Only define the function once.
 if exists('*GetLiquidIndent')
   finish
 endif
 
-function! s:count(string,pattern)
+function! s:count(string, pattern) abort
   let string = substitute(a:string,'\C'.a:pattern,"\n",'g')
   return strlen(substitute(string,"[^\n]",'','g'))
 endfunction
 
-function! GetLiquidIndent(...)
+function! GetLiquidIndent(...) abort
   if a:0 && a:1 == '.'
     let v:lnum = line('.')
   elseif a:0 && a:1 =~ '^\d'
@@ -51,13 +53,14 @@
   let lnum = prevnonblank(v:lnum-1)
   let line = getline(lnum)
   let cline = getline(v:lnum)
-  let line  = substitute(line,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
-  let line .= matchstr(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+')
-  let cline = substitute(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
+  let line  = substitute(line,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+','','')
+  let line  = substitute(line,'\C\%(\s*{%-\=\s*if.\+-\=%}.\+{%-\=\s*endif\s*-\=%}\)\+','','g')
+  let line .= matchstr(cline,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+')
+  let cline = substitute(cline,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+','','')
   let sw = shiftwidth()
-  let ind += sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>')
-  let ind -= sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>')
-  let ind -= sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>')
-  let ind -= sw * s:count(cline,'{%\s*end\w*$')
+  let ind += sw * s:count(line,'{%-\=\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>')
+  let ind -= sw * s:count(line,'{%-\=\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>')
+  let ind -= sw * s:count(cline,'{%-\=\s*\%(elsif\|else\|when\|empty\)\>')
+  let ind -= sw * s:count(cline,'{%-\=\s*end\w*$')
   return ind
 endfunction
diff --git a/runtime/indent/sass.vim b/runtime/indent/sass.vim
index d6dbf3a..8c0ecd0 100644
--- a/runtime/indent/sass.vim
+++ b/runtime/indent/sass.vim
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:	Sass
 " Maintainer:	Tim Pope <vimNOSPAM@tpope.org>
-" Last Change:	2017 Jun 13
+" Last Change:	2022 Mar 15
 
 if exists("b:did_indent")
   finish
@@ -12,6 +12,8 @@
 setlocal indentexpr=GetSassIndent()
 setlocal indentkeys=o,O,*<Return>,<:>,!^F
 
+let b:undo_indent = "setl ai< inde< indk<"
+
 " Only define the function once.
 if exists("*GetSassIndent")
   finish
diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
index bde9140..00a9ca9 100644
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -4,10 +4,11 @@
 " Copyright: Vim license applies, see ":help license"
 " Last Change: 2022 Jan 17
 "
-" WORK IN PROGRESS - Only the basics work
-" Note: On MS-Windows you need a recent version of gdb.  The one included with
-" MingW is too old (7.6.1).
-" I used version 7.12 from http://www.equation.com/servlet/equation.cmd?fa=gdb
+" WORK IN PROGRESS - The basics works stable, more to come
+" Note: In general you need at least GDB 7.12 because this provides the
+" frame= response in MI thread-selected events we need to sync stack to file.
+" The one included with "old" MingW is too old (7.6.1), you may upgrade it or
+" use a newer version from http://www.equation.com/servlet/equation.cmd?fa=gdb
 "
 " There are two ways to run gdb:
 " - In a terminal window; used if possible, does not work on MS-Windows
@@ -313,7 +314,7 @@
         let response = line1 . line2
         if response =~ 'Undefined command'
           echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
-	  " CHECKME: possibly send a "server show version" here
+          " CHECKME: possibly send a "server show version" here
           call s:CloseBuffers()
           return
         endif
@@ -396,7 +397,7 @@
   endif
   " Mark the buffer modified so that it's not easy to close.
   set modified
-  let s:gdb_channel = job_getchannel(s:gdbjob)  
+  let s:gdb_channel = job_getchannel(s:gdbjob)
 
   let s:ptybuf = 0
   if has('win32')
@@ -662,8 +663,8 @@
     if bufexists(bufnr)
       exe bufnr .. "buf"
       if exists('b:save_signcolumn')
-	let &signcolumn = b:save_signcolumn
-	unlet b:save_signcolumn
+        let &signcolumn = b:save_signcolumn
+        unlet b:save_signcolumn
       endif
     endif
   endfor
@@ -739,8 +740,8 @@
 
       let lnum = search('^' . s:asm_addr)
       if lnum != 0
-	exe 'sign unplace ' . s:asm_id
-	exe 'sign place ' . s:asm_id . ' line=' . lnum . ' name=debugPC'
+        exe 'sign unplace ' . s:asm_id
+        exe 'sign place ' . s:asm_id . ' line=' . lnum . ' name=debugPC'
       endif
 
       call win_gotoid(curwinid)
@@ -789,22 +790,22 @@
       call s:HandleDisasmMsg(msg)
     elseif msg != ''
       if msg =~ '^\(\*stopped\|\*running\|=thread-selected\)'
-	call s:HandleCursor(msg)
+        call s:HandleCursor(msg)
       elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
         call s:HandleNewBreakpoint(msg, 0)
       elseif msg =~ '^=breakpoint-modified,'
         call s:HandleNewBreakpoint(msg, 1)
       elseif msg =~ '^=breakpoint-deleted,'
-	call s:HandleBreakpointDelete(msg)
+        call s:HandleBreakpointDelete(msg)
       elseif msg =~ '^=thread-group-started'
-	call s:HandleProgramRun(msg)
+        call s:HandleProgramRun(msg)
       elseif msg =~ '^\^done,value='
-	call s:HandleEvaluate(msg)
+        call s:HandleEvaluate(msg)
       elseif msg =~ '^\^error,msg='
-	call s:HandleError(msg)
+        call s:HandleError(msg)
       elseif msg =~ '^disassemble'
-	let s:parsing_disasm_msg = 1
-	let s:asm_lines = []
+        let s:parsing_disasm_msg = 1
+        let s:asm_lines = []
       endif
     endif
   endfor
@@ -986,22 +987,22 @@
     let nr = 0
     for id in s:breakpoint_locations[bploc]
       if has_key(s:breakpoints, id)
-	" Assume this always works, the reply is simply "^done".
-	call s:SendCommand('-break-delete ' . id)
-	for subid in keys(s:breakpoints[id])
-	  exe 'sign unplace ' . s:Breakpoint2SignNumber(id, subid)
-	endfor
-	unlet s:breakpoints[id]
-	unlet s:breakpoint_locations[bploc][idx]
-	let nr = id
-	break
+        " Assume this always works, the reply is simply "^done".
+        call s:SendCommand('-break-delete ' . id)
+        for subid in keys(s:breakpoints[id])
+          exe 'sign unplace ' . s:Breakpoint2SignNumber(id, subid)
+        endfor
+        unlet s:breakpoints[id]
+        unlet s:breakpoint_locations[bploc][idx]
+        let nr = id
+        break
       else
-	let idx += 1
+        let idx += 1
       endif
     endfor
     if nr != 0
       if empty(s:breakpoint_locations[bploc])
-	unlet s:breakpoint_locations[bploc]
+        unlet s:breakpoint_locations[bploc]
       endif
       echomsg 'Breakpoint ' . id . ' cleared from line ' . lnum . '.'
     else
@@ -1027,7 +1028,7 @@
     " remove text that is likely an assignment
     let exprLHS = substitute(a:expr, ' *=.*', '', '')
   endif
-  
+
   " encoding expression to prevent bad errors
   let expr = a:expr
   let expr = substitute(expr, '\\', '\\\\', 'g')
@@ -1036,14 +1037,14 @@
   let s:evalexpr = exprLHS
 endfunc
 
-" :Evaluate - evaluate what is specified / under the cursor 
+" :Evaluate - evaluate what is specified / under the cursor
 func s:Evaluate(range, arg)
   let expr = s:GetEvaluationExpression(a:range, a:arg)
   let s:ignoreEvalError = 0
   call s:SendEval(expr)
 endfunc
 
-" get what is specified / under the cursor 
+" get what is specified / under the cursor
 func s:GetEvaluationExpression(range, arg)
   if a:arg != ''
     " user supplied evaluation
@@ -1192,7 +1193,7 @@
 
     if exists('g:termdebug_disasm_window')
       if g:termdebug_disasm_window > 1
-	exe 'resize ' . g:termdebug_disasm_window
+        exe 'resize ' . g:termdebug_disasm_window
       endif
     endif
   endif
@@ -1201,7 +1202,7 @@
     let lnum = search('^' . s:asm_addr)
     if lnum == 0
       if s:stopped
-	call s:SendCommand('disassemble $pc')
+        call s:SendCommand('disassemble $pc')
       endif
     else
       exe 'sign unplace ' . s:asm_id
@@ -1236,15 +1237,15 @@
 
       let curwinid = win_getid(winnr())
       if win_gotoid(s:asmwin)
-	let lnum = search('^' . s:asm_addr)
-	if lnum == 0
-	  call s:SendCommand('disassemble $pc')
-	else
-	  exe 'sign unplace ' . s:asm_id
-	  exe 'sign place ' . s:asm_id . ' line=' . lnum . ' name=debugPC'
-	endif
+        let lnum = search('^' . s:asm_addr)
+        if lnum == 0
+          call s:SendCommand('disassemble $pc')
+        else
+          exe 'sign unplace ' . s:asm_id
+          exe 'sign place ' . s:asm_id . ' line=' . lnum . ' name=debugPC'
+        endif
 
-	call win_gotoid(curwinid)
+        call win_gotoid(curwinid)
       endif
     endif
   endif
@@ -1263,26 +1264,26 @@
 		\ | echo 'Warning: file is being edited elsewhere'
 		\ | echohl None
 		\ | let v:swapchoice = '0'
-	augroup END
-	if &modified
-	  " TODO: find existing window
-	  exe 'split ' . fnameescape(fname)
-	  let s:sourcewin = win_getid(winnr())
-	  call s:InstallWinbar()
-	else
-	  exe 'edit ' . fnameescape(fname)
-	endif
-	augroup Termdebug
-	  au! SwapExists
-	augroup END
+        augroup END
+        if &modified
+          " TODO: find existing window
+          exe 'split ' . fnameescape(fname)
+          let s:sourcewin = win_getid(winnr())
+          call s:InstallWinbar()
+        else
+          exe 'edit ' . fnameescape(fname)
+        endif
+        augroup Termdebug
+          au! SwapExists
+        augroup END
       endif
       exe lnum
       normal! zv
       exe 'sign unplace ' . s:pc_id
       exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC priority=110 file=' . fname
       if !exists('b:save_signcolumn')
-	let b:save_signcolumn = &signcolumn
-	call add(s:signcolumn_buflist, bufnr())
+        let b:save_signcolumn = &signcolumn
+        call add(s:signcolumn_buflist, bufnr())
       endif
       setlocal signcolumn=yes
     endif
@@ -1396,8 +1397,8 @@
   if has_key(s:breakpoints, id)
     for [subid, entry] in items(s:breakpoints[id])
       if has_key(entry, 'placed')
-	exe 'sign unplace ' . s:Breakpoint2SignNumber(id, subid)
-	unlet entry['placed']
+        exe 'sign unplace ' . s:Breakpoint2SignNumber(id, subid)
+        unlet entry['placed']
       endif
     endfor
     unlet s:breakpoints[id]
@@ -1422,7 +1423,7 @@
   for [id, entries] in items(s:breakpoints)
     for [subid, entry] in items(entries)
       if entry['fname'] == fname
-	call s:PlaceSign(id, subid, entry)
+        call s:PlaceSign(id, subid, entry)
       endif
     endfor
   endfor
@@ -1434,7 +1435,7 @@
   for [id, entries] in items(s:breakpoints)
     for [subid, entry] in items(entries)
       if entry['fname'] == fname
-	let entry['placed'] = 0
+        let entry['placed'] = 0
       endif
     endfor
   endfor
diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim
index e86e1b8..2dc21f0 100644
--- a/runtime/syntax/c.vim
+++ b/runtime/syntax/c.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:	C
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2021 Dec 07
+" Last Change:	2022 Mar 17
 
 " Quit when a (custom) syntax file was already loaded
 if exists("b:current_syntax")
@@ -245,8 +245,14 @@
 
 syn keyword	cOperator	sizeof
 if exists("c_gnu")
+  syn keyword	cType		__label__ __complex__
   syn keyword	cStatement	__asm__
-  syn keyword	cOperator	typeof __real__ __imag__
+  syn keyword	cOperator	__alignof__
+  syn keyword	cOperator	typeof __typeof__
+  syn keyword	cOperator	__real__ __imag__
+  syn keyword	cStorageClass	__attribute__ __const__ __extension__
+  syn keyword	cStorageClass	inline __inline__
+  syn keyword	cStorageClass	__restrict__ __volatile__ __noreturn__
 endif
 syn keyword	cType		int long short char void
 syn keyword	cType		signed unsigned float double
@@ -270,16 +276,10 @@
   syn keyword	cType		intptr_t uintptr_t
   syn keyword	cType		intmax_t uintmax_t
 endif
-if exists("c_gnu")
-  syn keyword	cType		__label__ __complex__ __volatile__
-endif
 
 syn keyword	cTypedef	typedef
 syn keyword	cStructure	struct union enum
 syn keyword	cStorageClass	static register auto volatile extern const
-if exists("c_gnu")
-  syn keyword	cStorageClass	inline __attribute__
-endif
 if !exists("c_no_c99") && !s:in_cpp_family
   syn keyword	cStorageClass	inline restrict
 endif
@@ -292,6 +292,7 @@
   syn keyword	cOperator	_Static_assert static_assert
   syn keyword	cStorageClass	_Thread_local thread_local
   syn keyword   cType		char16_t char32_t
+  syn keyword   cType		max_align_t
   " C11 atomics (take down the shield wall!)
   syn keyword	cType		atomic_bool atomic_char atomic_schar atomic_uchar
   syn keyword	Ctype		atomic_short atomic_ushort atomic_int atomic_uint
diff --git a/runtime/syntax/liquid.vim b/runtime/syntax/liquid.vim
index 295a917..966b60f 100644
--- a/runtime/syntax/liquid.vim
+++ b/runtime/syntax/liquid.vim
@@ -2,7 +2,7 @@
 " Language:     Liquid
 " Maintainer:   Tim Pope <vimNOSPAM@tpope.org>
 " Filenames:    *.liquid
-" Last Change:	2013 May 30
+" Last Change:	2022 Mar 15
 
 if exists('b:current_syntax')
   finish
@@ -68,10 +68,10 @@
   unlet s:subtype
 endif
 
-syn region  liquidStatement  matchgroup=liquidDelimiter start="{%" end="%}" contains=@liquidStatement containedin=ALLBUT,@liquidExempt keepend
-syn region  liquidExpression matchgroup=liquidDelimiter start="{{" end="}}" contains=@liquidExpression  containedin=ALLBUT,@liquidExempt keepend
-syn region  liquidComment    matchgroup=liquidDelimiter start="{%\s*comment\s*%}" end="{%\s*endcomment\s*%}" contains=liquidTodo,@Spell containedin=ALLBUT,@liquidExempt keepend
-syn region  liquidRaw        matchgroup=liquidDelimiter start="{%\s*raw\s*%}" end="{%\s*endraw\s*%}" contains=TOP,@liquidExempt containedin=ALLBUT,@liquidExempt keepend
+syn region  liquidStatement  matchgroup=liquidDelimiter start="{%-\=" end="-\=%}" contains=@liquidStatement containedin=ALLBUT,@liquidExempt keepend
+syn region  liquidExpression matchgroup=liquidDelimiter start="{{-\=" end="-\=}}" contains=@liquidExpression  containedin=ALLBUT,@liquidExempt keepend
+syn region  liquidComment    matchgroup=liquidDelimiter start="{%-\=\s*comment\s*-\=%}" end="{%-\=\s*endcomment\s*-\=%}" contains=liquidTodo,@Spell containedin=ALLBUT,@liquidExempt keepend
+syn region  liquidRaw        matchgroup=liquidDelimiter start="{%-\=\s*raw\s*-\=%}" end="{%-\=\s*endraw\s*-\=%}" contains=TOP,@liquidExempt containedin=ALLBUT,@liquidExempt keepend
 
 syn cluster liquidExempt contains=liquidStatement,liquidExpression,liquidComment,liquidRaw,@liquidStatement,liquidYamlHead
 syn cluster liquidStatement contains=liquidConditional,liquidRepeat,liquidKeyword,@liquidExpression
@@ -79,11 +79,11 @@
 
 syn keyword liquidKeyword highlight nextgroup=liquidTypeHighlight skipwhite contained
 syn keyword liquidKeyword endhighlight contained
-syn region liquidHighlight start="{%\s*highlight\s\+\w\+\s*%}" end="{% endhighlight %}" keepend
+syn region liquidHighlight start="{%-\=\s*highlight\s\+\w\+\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend
 
 for s:type in g:liquid_highlight_types
   exe 'syn match liquidTypeHighlight "\<'.matchstr(s:type,'[^=]*').'\>" contained'
-  exe 'syn region liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' start="{%\s*highlight\s\+'.matchstr(s:type,'[^=]*').'\s*%}" end="{% endhighlight %}" keepend contains=@liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g')
+  exe 'syn region liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' start="{%-\=\s*highlight\s\+'.matchstr(s:type,'[^=]*').'\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend contains=@liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g')
 endfor
 unlet! s:type
 
@@ -92,18 +92,18 @@
 syn match liquidNumber "-\=\<\d\+\>" contained
 syn match liquidFloat "-\=\<\d\+\>\.\.\@!\%(\d\+\>\)\=" contained
 syn keyword liquidBoolean true false contained
-syn keyword liquidNull null nil contained
+syn keyword liquidNull null nil blank contained
 syn match liquidEmpty "\<empty\>" contained
 
 syn keyword liquidOperator and or not contained
 syn match liquidPipe '|' contained skipwhite nextgroup=liquidFilter
 
-syn keyword liquidFilter date capitalize downcase upcase first last join sort size strip_html strip_newlines newline_to_br replace replace_first remove remove_first truncate truncatewords prepend append minus plus times divided_by contained
+syn keyword liquidFilter date capitalize downcase upcase escape escape_once first last join sort size where uniq strip_html strip_newlines newline_to_br replace replace_first remove remove_first slice split strip truncate truncatewords prepend append url_encode url_decode abs at_most at_least ceil divided_by floor minus plus round times modulo contained
 
 syn keyword liquidConditional if elsif else endif unless endunless case when endcase ifchanged endifchanged contained
-syn keyword liquidRepeat      for endfor tablerow endtablerow in contained
-syn match   liquidRepeat      "\%({%\s*\)\@<=empty\>" contained
-syn keyword liquidKeyword     assign cycle include with contained
+syn keyword liquidRepeat      for endfor tablerow endtablerow in break continue limit offset reversed contained
+syn match   liquidRepeat      "\%({%-\=\s*\)\@<=empty\>" contained
+syn keyword liquidKeyword     assign capture endcapture increasement decreasement cycle include with render contained
 
 syn keyword liquidForloop forloop nextgroup=liquidForloopDot contained
 syn match liquidForloopDot "\." nextgroup=liquidForloopAttribute contained
diff --git a/runtime/syntax/sass.vim b/runtime/syntax/sass.vim
index b51a0ae..8f41aba 100644
--- a/runtime/syntax/sass.vim
+++ b/runtime/syntax/sass.vim
@@ -2,7 +2,7 @@
 " Language:	Sass
 " Maintainer:	Tim Pope <vimNOSPAM@tpope.org>
 " Filenames:	*.sass
-" Last Change:	2019 Dec 05
+" Last Change:	2022 Mar 15
 
 if exists("b:current_syntax")
   finish
@@ -58,6 +58,7 @@
 " TODO: Arithmetic (including strings and concatenation)
 
 syn region sassMediaQuery matchgroup=sassMedia start="@media" end="[{};]\@=\|$" contains=sassMediaOperators
+syn region sassKeyframe matchgroup=cssAtKeyword start=/@\(-[a-z]\+-\)\=keyframes\>/ end=";\|$" contains=cssVendor,cssComment nextgroup=cssDefinition
 syn keyword sassMediaOperators and not only contained
 syn region sassCharset start="@charset" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType
 syn region sassInclude start="@import" end=";\|$" contains=scssComment,cssStringQ,cssStringQQ,cssURL,cssUnicodeEscape,cssMediaType
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index e42c270..dfa5e43 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:	Vim 8.2 script
 " Maintainer:	Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
-" Last Change:	February 09, 2022
-" Version:	8.2-28
+" Last Change:	March 14, 2022
+" Version:	8.2-29
 " URL:	http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
 " Automatically generated keyword lists: {{{1
 
@@ -19,12 +19,13 @@
 syn cluster vimCommentGroup	contains=vimTodo,@Spell
 
 " regular vim commands {{{2
-syn keyword vimCommand contained	a ar[gs] argg[lobal] b[uffer] bf[irst] br[ewind] bufdo c[hange] caddf[ile] cbel[ow] ce[nter] cgetb[uffer] chi[story] cmapc[lear] col[der] conf[irm] cr[ewind] cw[indow] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec elsei[f] endt[ry] exp filetype fix[del] for gui helpg[rep] ia imp is[earch] kee[pmarks] lNf[ile] laddf[ile] lbe[fore] lcs lex[pr] lgete[xpr] lla[st] lnew[er] lockv[ar] ls lvimgrepa[dd] mat[ch] mkv[imrc] nb[key] noautocmd o[pen] p[rint] perld[o] pro ptN[ext] ptp[revious] py3do python3 qa[ll] redr[aw] retu[rn] rubyd[o] sIe sN[ext] sb[uffer] sbp[revious] sci scs sf[ind] sgi si sim[alt] sm[agic] sno[magic] spe[llgood] spellu[ndo] sre[wind] st[op] stopi[nsert] sunmenu sync tab tabfir[st] tabp[revious] tcl th[row] tlnoremenu tn[ext] ts[elect] undoj[oin] up[date] vi[sual] viu[sage] wh[ile] wn[ext] wv[iminfo] xmenu xunme
-syn keyword vimCommand contained	ab arga[dd] argl[ocal] ba[ll] bl[ast] brea[k] buffers ca caf[ter] cbo[ttom] cex[pr] cgete[xpr] cl[ist] cn[ext] colo[rscheme] cons[t] cs d[elete] delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] em[enu] endw[hile] export filt[er] fo[ld] fu[nction] gvim helpt[ags] iabc[lear] import isp[lit] keepa l[ist] laf[ter] lbel[ow] lcscope lf[ile] lgr[ep] lli[st] lnf[ile] lol[der] lt[ag] lw[indow] menut[ranslate] mkvie[w] nbc[lose] noh[lsearch] ol[dfiles] pa[ckadd] po[p] prof[ile] pta[g] ptr[ewind] py3f[ile] pythonx quita[ll] redraws[tatus] rew[ind] rubyf[ile] sIg sa[rgument] sba[ll] sbr[ewind] scl scscope sfir[st] sgl sic sin sm[ap] snoreme spelld[ump] spellw[rong] srg sta[g] sts[elect] sus[pend] syncbind tabN[ext] tabl[ast] tabr[ewind] tcld[o] tj[ump] tlu tno[remap] tu[nmenu] undol[ist] v vie[w] vne[w] win[size] wp[revious] x[it] xnoreme xunmenu
-syn keyword vimCommand contained	abc[lear] argd[elete] argu[ment] bad[d] bm[odified] breaka[dd] bun[load] cabc[lear] cal[l] cc cf[ile] changes cla[st] cnew[er] com cope[n] cscope debug delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] en[dif] ene[w] exu[sage] fin[d] foldc[lose] g h[elp] hi if in iuna[bbrev] keepalt la[st] lan[guage] lbo[ttom] ld[o] lfdo lgrepa[dd] lma lo[adview] lop[en] lua m[ove] mes[sages] mod[e] nbs[tart] nor omapc[lear] packl[oadall] popu[p] profd[el] ptf[irst] pts[elect] py3f[ile] pyx r[ead] redrawt[abline] ri[ght] rundo sIl sal[l] sbf[irst] sc scp se[t] sg sgn sie sip sme snoremenu spelli[nfo] spr[evious] sri star[tinsert] substitutepattern sv[iew] syntime tabc[lose] tabm[ove] tabs tclf[ile] tl[ast] tlunmenu to[pleft] tunma[p] unh[ide] var vim9[cmd] vs[plit] winc[md] wq xa[ll] xnoremenu xwininfo
-syn keyword vimCommand contained	abo[veleft] argded[upe] as[cii] balt bn[ext] breakd[el] bw[ipeout] cabo[ve] cat[ch] ccl[ose] cfdo chd[ir] class cnf[ile] comc[lear] cp[revious] cstag debugg[reedy] deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] enddef eval f[ile] fina[lly] foldd[oopen] go[to] ha[rdcopy] hid[e] ij[ump] inor j[oin] keepj[umps] lab[ove] lat lc[d] le[ft] lfir[st] lh[elpgrep] lmak[e] loadk lp[revious] luado ma[rk] mk[exrc] mz[scheme] new nore on[ly] pc[lose] pp[op] promptf[ind] ptj[ump] pu[t] py[thon] pyxdo rec[over] reg[isters] rightb[elow] rv[iminfo] sIn san[dbox] sbl[ast] scI scr[iptnames] setf[iletype] sgI sgp sig sir smenu so[urce] spellr[are] sr srl startg[replace] substituterepeat sw[apname] t tabd[o] tabn[ext] tags te[aroff] tlm tm[enu] tp[revious] type unl ve[rsion] vim9s[cript] wN[ext] windo wqa[ll] xmapc[lear] xprop y[ank]
-syn keyword vimCommand contained	addd argdo au bd[elete] bo[tright] breakl[ist] cN[ext] cad[dbuffer] cb[uffer] cd cfir[st] che[ckpath] cle[arjumps] cnor comp[iler] cpf[ile] cun def deletep delp diffp[atch] disa[ssemble] doaut ea echon endf[unction] ex files fini[sh] folddoc[losed] gr[ep] helpc[lose] his[tory] il[ist] interface ju[mps] keepp[atterns] lad[dexpr] later lch[dir] lefta[bove] lg[etfile] lhi[story] lmapc[lear] loadkeymap lpf[ile] luafile mak[e] mks[ession] mzf[ile] nmapc[lear] nos[wapfile] opt[ions] pe[rl] pre[serve] promptr[epl] ptl[ast] pw[d] pydo pyxfile red[o] res[ize] ru[ntime] sI sIp sav[eas] sbm[odified] sce scripte[ncoding] setg[lobal] sgc sgr sign sl[eep] smile sor[t] spellr[epall] srI srn startr[eplace] sun[hide] sy tN[ext] tabe[dit] tabnew tc[d] ter[minal] tlmenu tma[p] tr[ewind] u[ndo] unlo[ckvar] verb[ose] vim[grep] w[rite] winp[os] wundo xme xr[estore] z[^.=]
-syn keyword vimCommand contained	al[l] arge[dit] bN[ext] bel[owright] bp[revious] bro[wse] cNf[ile] cadde[xpr] cbe[fore] cdo cg[etfile] checkt[ime] clo[se] co[py] con[tinue] cq[uit] cuna[bbrev] defc[ompile] deletl dep diffpu[t] dj[ump] dp earlier el[se] endfo[r] exi[t] filet fir[st] foldo[pen] grepa[dd] helpf[ind] i imapc[lear] intro k lN[ext] laddb[uffer] lb[uffer] lcl[ose] leg[acy] lgetb[uffer] ll lne[xt] loc[kmarks] lr[ewind] lv[imgrep] marks mksp[ell] n[ext] noa nu[mber] ownsyntax ped[it] prev[ious] ps[earch] ptn[ext] py3 pyf[ile] q[uit] redi[r] ret[ab] rub[y] sIc sIr sbN[ext] sbn[ext] scg scriptv[ersion] setl[ocal] sge sh[ell] sil[ent] sla[st] sn[ext] sp[lit] spellr[rare] src srp stj[ump] sunme syn ta[g] tabf[ind] tabo[nly] tch[dir] tf[irst] tln tmapc[lear] try una[bbreviate] uns[ilent] vert[ical] vimgrepa[dd] wa[ll]
+syn keyword vimCommand contained	a ar[gs] argg[lobal] b[uffer] bf[irst] br[ewind] bufdo c[hange] caddf[ile] cbel[ow] ce[nter] cgetb[uffer] chi[story] cmapc[lear] col[der] conf[irm] cr[ewind] cw[indow] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec elsei[f] endf[unction] enum exu[sage] fin[d] foldc[lose] g h[elp] hi if in iuna[bbrev] keepalt la[st] lan[guage] lbo[ttom] ld[o] lfdo lgrepa[dd] lma lo[adview] lop[en] lua m[ove] mes[sages] mod[e] nbs[tart] nor omapc[lear] packl[oadall] popu[p] profd[el] ptf[irst] pts[elect] py3f[ile] pyx r[ead] redrawt[abline] ri[ght] rundo sIl sal[l] sbf[irst] sc scp se[t] sg sgn sie sip sme snoremenu spelli[nfo] spr[evious] sri star[tinsert] sts[elect] sus[pend] syncbind tabN[ext] tabl[ast] tabr[ewind] tcld[o] tj[ump] tlu tno[remap] tu[nmenu] undol[ist] v vie[w] vne[w] win[size] wq xmapc[lear] xr[estore]
+syn keyword vimCommand contained	ab arga[dd] argl[ocal] ba[ll] bl[ast] brea[k] buffers ca caf[ter] cbo[ttom] cex[pr] cgete[xpr] cl[ist] cn[ext] colo[rscheme] cons[t] cs d[elete] delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] em[enu] endfo[r] eval f[ile] fina[lly] foldd[oopen] go[to] ha[rdcopy] hid[e] ij[ump] inor j[oin] keepj[umps] lab[ove] lat lc[d] le[ft] lfir[st] lh[elpgrep] lmak[e] loadk lp[revious] luado ma[rk] mk[exrc] mz[scheme] new nore on[ly] pc[lose] pp[op] promptf[ind] ptj[ump] pu[t] py[thon] pyxdo rec[over] reg[isters] rightb[elow] rv[iminfo] sIn san[dbox] sbl[ast] scI scr[iptnames] setf[iletype] sgI sgp sig sir smenu so[urce] spellr[are] sr srl startg[replace] substitutepattern sv[iew] syntime tabc[lose] tabm[ove] tabs tclf[ile] tl[ast] tlunmenu to[pleft] tunma[p] unh[ide] var vim9[cmd] vs[plit] winc[md] wqa[ll] xme xunme
+syn keyword vimCommand contained	abc[lear] argd[elete] argu[ment] bad[d] bm[odified] breaka[dd] bun[load] cabc[lear] cal[l] cc cf[ile] changes cla[st] cnew[er] com cope[n] cscope debug delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] en[dif] endinterface ex files fini[sh] folddoc[losed] gr[ep] helpc[lose] his[tory] il[ist] interface ju[mps] keepp[atterns] lad[dexpr] later lch[dir] lefta[bove] lg[etfile] lhi[story] lmapc[lear] loadkeymap lpf[ile] luafile mak[e] mks[ession] mzf[ile] nmapc[lear] nos[wapfile] opt[ions] pe[rl] pre[serve] promptr[epl] ptl[ast] pw[d] pydo pyxfile red[o] res[ize] ru[ntime] sI sIp sav[eas] sbm[odified] sce scripte[ncoding] setg[lobal] sgc sgr sign sl[eep] smile sor[t] spellr[epall] srI srn startr[eplace] substituterepeat sw[apname] t tabd[o] tabn[ext] tags te[aroff] tlm tm[enu] tp[revious] type unl ve[rsion] vim9s[cript] wN[ext] windo wundo xmenu xunmenu
+syn keyword vimCommand contained	abo[veleft] argded[upe] as[cii] balt bn[ext] breakd[el] bw[ipeout] cabo[ve] cat[ch] ccl[ose] cfdo chd[ir] class cnf[ile] comc[lear] cp[revious] cstag debugg[reedy] deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] endclass endt[ry] exi[t] filet fir[st] foldo[pen] grepa[dd] helpf[ind] i imapc[lear] intro k lN[ext] laddb[uffer] lb[uffer] lcl[ose] leg[acy] lgetb[uffer] ll lne[xt] loc[kmarks] lr[ewind] lv[imgrep] marks mksp[ell] n[ext] noa nu[mber] ownsyntax ped[it] prev[ious] ps[earch] ptn[ext] py3 pyf[ile] q[uit] redi[r] ret[ab] rub[y] sIc sIr sbN[ext] sbn[ext] scg scriptv[ersion] setl[ocal] sge sh[ell] sil[ent] sla[st] sn[ext] sp[lit] spellr[rare] src srp static sun[hide] sy tN[ext] tabe[dit] tabnew tc[d] ter[minal] tlmenu tma[p] tr[ewind] u[ndo] unlo[ckvar] verb[ose] vim[grep] w[rite] winp[os] wv[iminfo] xnoreme xwininfo
+syn keyword vimCommand contained	abstract argdo au bd[elete] bo[tright] breakl[ist] cN[ext] cad[dbuffer] cb[uffer] cd cfir[st] che[ckpath] cle[arjumps] cnor comp[iler] cpf[ile] cun def deletep delp diffp[atch] disa[ssemble] doaut ea echon enddef endw[hile] exp filetype fix[del] for gui helpg[rep] ia imp is[earch] kee[pmarks] lNf[ile] laddf[ile] lbe[fore] lcs lex[pr] lgete[xpr] lla[st] lnew[er] lockv[ar] ls lvimgrepa[dd] mat[ch] mkv[imrc] nb[key] noautocmd o[pen] p[rint] perld[o] pro ptN[ext] ptp[revious] py3do python3 qa[ll] redr[aw] retu[rn] rubyd[o] sIe sN[ext] sb[uffer] sbp[revious] sci scs sf[ind] sgi si sim[alt] sm[agic] sno[magic] spe[llgood] spellu[ndo] sre[wind] st[op] stj[ump] sunme syn ta[g] tabf[ind] tabo[nly] tch[dir] tf[irst] tln tmapc[lear] try una[bbreviate] uns[ilent] vert[ical] vimgrepa[dd] wa[ll] wn[ext] x[it] xnoremenu y[ank]
+syn keyword vimCommand contained	addd arge[dit] bN[ext] bel[owright] bp[revious] bro[wse] cNf[ile] cadde[xpr] cbe[fore] cdo cg[etfile] checkt[ime] clo[se] co[py] con[tinue] cq[uit] cuna[bbrev] defc[ompile] deletl dep diffpu[t] dj[ump] dp earlier el[se] endenum ene[w] export filt[er] fo[ld] fu[nction] gvim helpt[ags] iabc[lear] import isp[lit] keepa l[ist] laf[ter] lbel[ow] lcscope lf[ile] lgr[ep] lli[st] lnf[ile] lol[der] lt[ag] lw[indow] menut[ranslate] mkvie[w] nbc[lose] noh[lsearch] ol[dfiles] pa[ckadd] po[p] prof[ile] pta[g] ptr[ewind] py3f[ile] pythonx quita[ll] redraws[tatus] rew[ind] rubyf[ile] sIg sa[rgument] sba[ll] sbr[ewind] scl scscope sfir[st] sgl sic sin sm[ap] snoreme spelld[ump] spellw[rong] srg sta[g] stopi[nsert] sunmenu sync tab tabfir[st] tabp[revious] tcl th[row] tlnoremenu tn[ext] ts[elect] undoj[oin] up[date] vi[sual] viu[sage] wh[ile] wp[revious] xa[ll] xprop z[^.=]
+syn keyword vimCommand contained	al[l]
 syn match   vimCommand contained	"\<z[-+^.=]\=\>"
 syn keyword vimStdPlugin contained	Arguments Asm Break Cfilter Clear Continue DiffOrig Evaluate Finish Gdb Lfilter Man N[ext] Over P[rint] Program Run S Source Step Stop Termdebug TermdebugCommand TOhtml Winbar XMLent XMLns
 
diff --git a/runtime/tools/demoserver.py b/runtime/tools/demoserver.py
index 150ddbe..2667aed 100644
--- a/runtime/tools/demoserver.py
+++ b/runtime/tools/demoserver.py
@@ -44,9 +44,6 @@
             except socket.error:
                 print("=== socket error ===")
                 break
-            except IOError:
-                print("=== socket closed ===")
-                break
             if data == '':
                 print("=== socket closed ===")
                 break
diff --git a/runtime/vim.desktop b/runtime/vim.desktop
index 2d6e7c1..cd3bdef 100644
--- a/runtime/vim.desktop
+++ b/runtime/vim.desktop
@@ -2,6 +2,7 @@
 # Edit the src/po/vim.desktop.in file instead.
 [Desktop Entry]
 # Translators: This is the Application Name used in the Vim desktop file
+Name[ca]=Vim
 Name[de]=Vim
 Name[eo]=Vim
 Name[fi]=Vim
@@ -13,6 +14,7 @@
 Name[tr]=Vim
 Name=Vim
 # Translators: This is the Generic Application Name used in the Vim desktop file
+GenericName[ca]=Editor de text
 GenericName[de]=Texteditor
 GenericName[eo]=Tekstoredaktilo
 GenericName[fi]=Tekstinmuokkain
@@ -25,6 +27,7 @@
 GenericName[tr]=Metin Düzenleyici
 GenericName=Text Editor
 # Translators: This is the comment used in the Vim desktop file
+Comment[ca]=Edita fitxers de text
 Comment[de]=Textdateien bearbeiten
 Comment[eo]=Redakti tekstajn dosierojn
 Comment[fi]=Muokkaa tekstitiedostoja
@@ -49,7 +52,6 @@
 Comment[bg]=Редактиране на текстови файлове
 Comment[bn]=টেক্স্ট ফাইল এডিট করুন
 Comment[bs]=Izmijeni tekstualne datoteke
-Comment[ca]=Edita fitxers de text
 Comment[cs]=Úprava textových souborů
 Comment[cy]=Golygu ffeiliau testun
 Comment[da]=Rediger tekstfiler
@@ -105,6 +107,7 @@
 Terminal=true
 Type=Application
 # Translators: Search terms to find this application. Do NOT change the semicolons! The list MUST also end with a semicolon!
+Keywords[ca]=Text;editor;
 Keywords[de]=Text;Editor;
 Keywords[eo]=Teksto;redaktilo;
 Keywords[fi]=Teksti;muokkain;editori;