Update runtime files.
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 98c358d..8299597 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt*	For Vim version 8.2.  Last change: 2022 Jan 28
+*builtin.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -1885,12 +1885,13 @@
 		display an error message.
 
 
-digraph_set({chars}, {digraph})				*digraph_set()* *E1205*
+digraph_set({chars}, {digraph})				*digraph_set()*
 		Add digraph {chars} to the list.  {chars} must be a string
 		with two characters.  {digraph} is a string with one UTF-8
-		encoded character. Be careful, composing characters are NOT
-		ignored.  This function is similar to |:digraphs| command, but
-		useful to add digraphs start with a white space.
+		encoded character.  *E1215*
+		Be careful, composing characters are NOT ignored.  This
+		function is similar to |:digraphs| command, but useful to add
+		digraphs start with a white space.
 
 		The function result is v:true if |digraph| is registered.  If
 		this fails an error message is given and v:false is returned.
@@ -1913,7 +1914,7 @@
 		Similar to |digraph_set()| but this function can add multiple
 		digraphs at once.  {digraphlist} is a list composed of lists,
 		where each list contains two strings with {chars} and
-		{digraph} as in |digraph_set()|.
+		{digraph} as in |digraph_set()|. *E1216*
 		Example: >
 		    call digraph_setlist([['aa', 'あ'], ['ii', 'い']])
 <
@@ -2531,7 +2532,7 @@
 		The {list} is changed in place, use |flattennew()| if you do
 		not want that.
 		In Vim9 script flatten() cannot be used, you must always use
-		|flattennew()|. *E1158*
+		|flattennew()|.
 								*E900*
 		{maxdepth} means how deep in nested lists changes are made.
 		{list} is not modified when {maxdepth} is 0.
@@ -3751,7 +3752,7 @@
 			:let cliptext = getreg('*')
 <		When register {regname} was not set the result is an empty
 		string.
-		The {regname} argument must be a string.
+		The {regname} argument must be a string.  *E1162*
 
 		getreg('=') returns the last evaluated value of the expression
 		register.  (For use in maps.)
@@ -4783,7 +4784,7 @@
 		Encode {expr} as JSON and return this as a string.
 		The encoding is specified in:
 		https://tools.ietf.org/html/rfc7159.html
-		Vim values are converted as follows:
+		Vim values are converted as follows:   *E1161*
 		   |Number|		decimal number
 		   |Float|		floating point number
 		   Float nan		"NaN"
@@ -4897,7 +4898,7 @@
 line({expr} [, {winid}])				*line()*
 		The result is a Number, which is the line number of the file
 		position given with {expr}.  The {expr} argument is a string.
-		The accepted positions are:
+		The accepted positions are:			 *E1209*
 		    .	    the cursor position
 		    $	    the last line in the current buffer
 		    'x	    position of mark x (if the mark is not set, 0 is
@@ -7644,10 +7645,12 @@
 		    module	name of a module; if given it will be used in
 				quickfix error window instead of the filename.
 		    lnum	line number in the file
+		    end_lnum	end of lines, if the item spans multiple lines
 		    pattern	search pattern used to locate the error
 		    col		column number
 		    vcol	when non-zero: "col" is visual column
 				when zero: "col" is byte index
+		    end_col	end column, if the item spans multiple columns
 		    nr		error number
 		    text	description of the error
 		    type	single-character error type, 'E', 'W', etc.
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index 7e1030b..d72e689 100644
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -1,4 +1,4 @@
-*change.txt*    For Vim version 8.2.  Last change: 2022 Jan 28
+*change.txt*    For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -782,7 +782,7 @@
 For compatibility with Vi these two exceptions are allowed:
 "\/{string}/" and "\?{string}?" do the same as "//{string}/r".
 "\&{string}&" does the same as "//{string}/".
-						*pattern-delimiter* *E146*
+				*pattern-delimiter* *E146* *E1241* *E1242*
 Instead of the '/' which surrounds the pattern and replacement string, you can
 use another single-byte character.  This is useful if you want to include a
 '/' in the search pattern or replacement string.  Example: >
@@ -1076,7 +1076,7 @@
 			in [range] (default: current line |cmdline-ranges|),
 			[into register x].
 
-							*p* *put* *E353*
+						*p* *put* *E353* *E1240*
 ["x]p			Put the text [from register x] after the cursor
 			[count] times.
 
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index c68c161..ad862bf 100644
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -1,4 +1,4 @@
-*cmdline.txt*   For Vim version 8.2.  Last change: 2022 Jan 08
+*cmdline.txt*   For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -730,7 +730,7 @@
 one(s) will be ignored.
 
 Line numbers may be specified with:		*:range* *{address}*
-	{number}	an absolute line number
+	{number}	an absolute line number  *E1247*
 	.		the current line			  *:.*
 	$		the last line in the file		  *:$*
 	%		equal to 1,$ (the entire file)		  *:%*
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
index 00deef1..371450f 100644
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1,4 +1,4 @@
-*editing.txt*   For Vim version 8.2.  Last change: 2022 Jan 21
+*editing.txt*   For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -633,7 +633,7 @@
 			Also see |++opt| and |+cmd|.
 
 :[count]arga[dd] {name} ..			*:arga* *:argadd* *E479*
-:[count]arga[dd]
+:[count]arga[dd]						*E1156*
 			Add the {name}s to the argument list.  When {name} is
 			omitted add the current buffer name to the argument
 			list.
@@ -1772,10 +1772,8 @@
 	/u/user_x/include
 
 <   Note: If your 'path' setting includes a non-existing directory, Vim will
-   skip the non-existing directory, but continues searching in the parent of
-   the non-existing directory if upwards searching is used.  E.g. when
-   searching "../include" and that doesn't exist, and upward searching is
-   used, also searches in "..".
+   skip the non-existing directory, and also does not search in the parent of
+   the non-existing directory if upwards searching is used.
 
 3) Combined up/downward search:
    If Vim's current path is /u/user_x/work/release and you do >
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 258d0a1..9e1425b 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.2.  Last change: 2022 Jan 24
+*eval.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -181,7 +181,7 @@
 
 
 1.2 Function references ~
-					*Funcref* *E695* *E718* *E1086*
+				*Funcref* *E695* *E718* *E1086* *E1192*
 A Funcref variable is obtained with the |function()| function, the |funcref()|
 function or created with the lambda expression |expr-lambda|.  It can be used
 in an expression in the place of a function name, before the parenthesis
@@ -765,7 +765,7 @@
 
 
 Blob modification ~
-							*blob-modification*
+					*blob-modification* *E1182* *E1184*
 To change a specific byte of a blob use |:let| this way: >
 	:let blob[4] = 0x44
 
@@ -1018,7 +1018,7 @@
 only be evaluated if "b" has been defined.
 
 
-expr4							*expr4*
+expr4							*expr4* *E1153*
 -----
 
 expr5 {cmp} expr5
@@ -1176,6 +1176,7 @@
 	 >0 / 0  =  0x7fffffff	(like positive infinity)
 	 <0 / 0  = -0x7fffffff	(like negative infinity)
 	(before Vim 7.2 it was always 0x7fffffff)
+In |Vim9| script dividing a number by zero is an error.	*E1154*
 
 When 64-bit Number support is enabled:
 	  0 / 0  = -0x8000000000000000	(like NaN for Float)
@@ -1243,7 +1244,7 @@
 byte under the cursor: >
 	:let c = getline(".")[col(".") - 1]
 
-In |Vim9| script:
+In |Vim9| script:					*E1147* *E1148*
 If expr9 is a String this results in a String that contains the expr1'th
 single character (including any composing characters) from expr9.  To use byte
 indexes use |strpart()|.
@@ -1323,7 +1324,7 @@
 
 
 expr9.name		entry in a |Dictionary|		*expr-entry*
-
+							*E1203* *E1229*
 If expr9 is a |Dictionary| and it is followed by a dot, then the following
 name will be used as a key in the |Dictionary|.  This is just like:
 expr9[name].
@@ -1350,7 +1351,7 @@
 
 expr9->name([args])	method call			*method* *->*
 expr9->{lambda}([args])
-							*E260* *E276*
+							*E260* *E276* *E1265*
 For methods that are also available as global functions this is the same as: >
 	name(expr9 [, args])
 There can also be methods specifically for the type of "expr9".
@@ -1550,7 +1551,7 @@
 evaluates to.  Use |eval()| to evaluate it.
 
 
-nesting							*expr-nesting* *E110*
+nesting						*expr-nesting* *E110*
 -------
 (expr1)			nested expression
 
@@ -2694,7 +2695,7 @@
 			implies that the effect of |:nohlsearch| is undone
 			when the function returns.
 
-				*:endf* *:endfunction* *E126* *E193* *W22*
+			*:endf* *:endfunction* *E126* *E193* *W22* *E1151*
 :endf[unction] [argument]
 			The end of a function definition.  Best is to put it
 			on a line by its own, without [argument].
@@ -3074,7 +3075,7 @@
 			length of the blob, in which case one byte is
 			appended.
 
-							*E711* *E719*
+					*E711* *E719* *E1165* *E1166* *E1183*
 :let {var-name}[{idx1}:{idx2}] = {expr1}		*E708* *E709* *E710*
 			Set a sequence of items in a |List| to the result of
 			the expression {expr1}, which must be a list with the
@@ -3410,7 +3411,7 @@
 			See |deepcopy()|.
 
 
-:unlo[ckvar][!] [depth] {name} ...			*:unlockvar* *:unlo*
+:unlo[ckvar][!] [depth] {name} ...		*:unlockvar* *:unlo* *E1246*
 			Unlock the internal variable {name}.  Does the
 			opposite of |:lockvar|.
 
@@ -3471,7 +3472,7 @@
 :endfo[r]						*:endfo* *:endfor*
 			Repeat the commands between ":for" and ":endfor" for
 			each item in {object}.  {object} can be a |List| or
-			a |Blob|.
+			a |Blob|. *E1177*
 
 			Variable {var} is set to the value of each item.
 			In |Vim9| script the loop variable must not have been
@@ -3725,6 +3726,9 @@
 			the `append()` call appends the List with text to the
 			buffer.  This is similar to `:call` but works with any
 			expression.
+			In |Vim9| script an expression without an effect will
+			result in error *E1207* .  This should help noticing
+			mistakes.
 
 			The command can be shortened to `:ev` or `:eva`, but
 			these are hard to recognize and therefore not to be
@@ -4892,6 +4896,9 @@
 compatible with older versions of Vim this will give an explicit error,
 instead of failing in mysterious ways.
 
+When using a legacy function, defined with `:function`, in |Vim9| script then
+scriptversion 4 is used.
+
 							*scriptversion-1*  >
  :scriptversion 1
 <	This is the original Vim script, same as not using a |:scriptversion|
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
index 9a614e2..d52103e 100644
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -142,7 +142,8 @@
 	*.asm		g:asmsyntax	|ft-asm-syntax|
 	*.asp		g:filetype_asp	|ft-aspvbs-syntax| |ft-aspperl-syntax|
 	*.bas		g:filetype_bas	|ft-basic-syntax|
-	*.fs		g:filetype_fs   |ft-forth-syntax|
+	*.frm		g:filetype_frm	|ft-form-syntax|
+	*.fs		g:filetype_fs	|ft-forth-syntax|
 	*.i		g:filetype_i	|ft-progress-syntax|
 	*.inc		g:filetype_inc
 	*.m		g:filetype_m	|ft-mathematica-syntax|
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 8c9ff3d..732e5a7 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 Jan 29
+*options.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -800,6 +800,7 @@
 	need proper setting-up, so whenever the shell's pwd changes an OSC 7
 	escape sequence will be emitted. For example, on Linux, you can source
 	/etc/profile.d/vte.sh in your shell profile if you use bash or zsh.
+	When the parsing of the OSC sequence fails you get *E1179* .
 
 				*'arabic'* *'arab'* *'noarabic'* *'noarab'*
 'arabic' 'arab'		boolean (default off)
@@ -2476,7 +2477,7 @@
 			you write the file the encrypted bytes will be
 			different.  The whole undo file is encrypted, not just
 			the pieces of text.
-					*E1193* *E1194* *E1195* *E1196*
+					*E1193* *E1194* *E1195* *E1196* *E1230*
 					*E1197* *E1198* *E1199* *E1200* *E1201*
 	   xchacha20	XChaCha20 Cipher with Poly1305 Message Authentication
 			Code.  Medium strong till strong encryption.
@@ -6723,6 +6724,9 @@
 	See |option-backslash| about including spaces and backslashes.
 	Environment variables are expanded |:set_env|.
 
+	In |restricted-mode| shell commands will not be possible.  This mode
+	is used if the value of $SHELL ends in "false" or "nologin".
+
 	If the name of the shell contains a space, you need to enclose it in
 	quotes and escape the space.  Example with quotes: >
 		:set shell=\"c:\program\ files\unix\sh.exe\"\ -f
diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt
index ce1d0f4..819975d 100644
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt*   For Vim version 8.2.  Last change: 2022 Jan 08
+*pattern.txt*   For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -925,7 +925,7 @@
 	becomes invalid.  Vim doesn't automatically update the matches.
 	Similar to moving the cursor for "\%#" |/\%#|.
 
-						*/\%l* */\%>l* */\%<l* *E951*
+					*/\%l* */\%>l* */\%<l* *E951* *E1204*
 \%23l	Matches in a specific line.
 \%<23l	Matches above a specific line (lower line number).
 \%>23l	Matches below a specific line (higher line number).
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index bca2f97..84f3a75 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -1,4 +1,4 @@
-*starting.txt*  For Vim version 8.2.  Last change: 2022 Jan 20
+*starting.txt*  For Vim version 8.2.  Last change: 2022 Feb 01
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 6b114a7..a23ac88 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*	For Vim version 8.2.  Last change: 2021 Nov 20
+*syntax.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -215,7 +215,8 @@
 
 The name for a highlight or syntax group must consist of ASCII letters, digits
 and the underscore.  As a regexp: "[a-zA-Z0-9_]*".  However, Vim does not give
-an error when using other characters.
+an error when using other characters.  The maxium length of a group name is
+about 200 bytes.  *E1249*
 
 To be able to allow each user to pick their favorite set of colors, there must
 be preferred names for highlight groups that are common for many languages.
@@ -1536,6 +1537,14 @@
 gvim display.  Here, statements are colored LightYellow instead of Yellow, and
 conditionals are LightBlue for better distinction.
 
+Both Visual Basic and FORM use the extension ".frm".  To detect which one
+should be used, Vim checks for the string "VB_Name" in the first five lines of
+the file.  If it is found, filetype will be "vb", otherwise "form".
+
+If the automatic detection doesn't work for you or you only edit, for
+example, FORM files, use this in your startup vimrc: >
+   :let filetype_frm = "form"
+
 
 FORTH						*forth.vim* *ft-forth-syntax*
 
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index 7512d0c..cb2f7ad 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -1,4 +1,4 @@
-*tabpage.txt*   For Vim version 8.2.  Last change: 2020 Oct 14
+*tabpage.txt*   For Vim version 8.2.  Last change: 2022 Feb 02
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -143,7 +143,9 @@
 		    :tabclose 3	    " close the third tab page
 		    :tabclose $	    " close the last tab page
 		    :tabclose #     " close the last accessed tab page
-<
+
+When a tab is closed the next tab page will become the current one.
+
 							*:tabo* *:tabonly*
 :tabo[nly][!]	Close all other tab pages.
 		When the 'hidden' option is set, all buffers in closed windows
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 0016643..a15371e 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -4041,6 +4041,7 @@
 E109	eval.txt	/*E109*
 E1090	eval.txt	/*E1090*
 E1091	vim9.txt	/*E1091*
+E1092	various.txt	/*E1092*
 E1093	eval.txt	/*E1093*
 E1094	vim9.txt	/*E1094*
 E1095	eval.txt	/*E1095*
@@ -4096,19 +4097,62 @@
 E114	eval.txt	/*E114*
 E1140	eval.txt	/*E1140*
 E1141	eval.txt	/*E1141*
+E1142	testing.txt	/*E1142*
 E1143	eval.txt	/*E1143*
 E1144	vim9.txt	/*E1144*
 E1145	eval.txt	/*E1145*
+E1146	vim9.txt	/*E1146*
+E1147	eval.txt	/*E1147*
+E1148	eval.txt	/*E1148*
+E1149	vim9.txt	/*E1149*
 E115	eval.txt	/*E115*
+E1150	vim9.txt	/*E1150*
+E1151	eval.txt	/*E1151*
+E1152	vim9.txt	/*E1152*
+E1153	eval.txt	/*E1153*
+E1154	eval.txt	/*E1154*
 E1155	autocmd.txt	/*E1155*
-E1158	builtin.txt	/*E1158*
+E1156	editing.txt	/*E1156*
+E1157	vim9.txt	/*E1157*
+E1158	vim9.txt	/*E1158*
+E1159	windows.txt	/*E1159*
 E116	eval.txt	/*E116*
+E1160	vim9.txt	/*E1160*
+E1161	builtin.txt	/*E1161*
+E1162	builtin.txt	/*E1162*
+E1163	vim9.txt	/*E1163*
+E1164	vim9.txt	/*E1164*
+E1165	eval.txt	/*E1165*
+E1166	eval.txt	/*E1166*
+E1167	vim9.txt	/*E1167*
+E1168	vim9.txt	/*E1168*
 E1169	eval.txt	/*E1169*
 E117	eval.txt	/*E117*
+E1170	vim9.txt	/*E1170*
+E1171	vim9.txt	/*E1171*
+E1172	vim9.txt	/*E1172*
+E1173	vim9.txt	/*E1173*
+E1174	vim9.txt	/*E1174*
+E1175	vim9.txt	/*E1175*
+E1176	vim9.txt	/*E1176*
+E1177	eval.txt	/*E1177*
+E1178	vim9.txt	/*E1178*
+E1179	options.txt	/*E1179*
 E118	eval.txt	/*E118*
+E1180	vim9.txt	/*E1180*
+E1181	vim9.txt	/*E1181*
+E1182	eval.txt	/*E1182*
+E1183	eval.txt	/*E1183*
+E1184	eval.txt	/*E1184*
+E1185	various.txt	/*E1185*
+E1186	vim9.txt	/*E1186*
 E1187	starting.txt	/*E1187*
 E1188	cmdline.txt	/*E1188*
+E1189	vim9.txt	/*E1189*
 E119	eval.txt	/*E119*
+E1190	vim9.txt	/*E1190*
+E1191	vim9.txt	/*E1191*
+E1192	eval.txt	/*E1192*
 E1193	options.txt	/*E1193*
 E1194	options.txt	/*E1194*
 E1195	options.txt	/*E1195*
@@ -4120,25 +4164,76 @@
 E120	eval.txt	/*E120*
 E1200	options.txt	/*E1200*
 E1201	options.txt	/*E1201*
-E1205	builtin.txt	/*E1205*
+E1202	vim9.txt	/*E1202*
+E1203	eval.txt	/*E1203*
+E1204	pattern.txt	/*E1204*
+E1205	vim9.txt	/*E1205*
+E1206	vim9.txt	/*E1206*
+E1207	eval.txt	/*E1207*
 E1208	map.txt	/*E1208*
+E1209	builtin.txt	/*E1209*
 E121	eval.txt	/*E121*
+E1210	vim9.txt	/*E1210*
+E1211	vim9.txt	/*E1211*
+E1212	vim9.txt	/*E1212*
+E1213	vim9.txt	/*E1213*
 E1214	builtin.txt	/*E1214*
+E1215	builtin.txt	/*E1215*
+E1216	builtin.txt	/*E1216*
+E1217	vim9.txt	/*E1217*
+E1218	vim9.txt	/*E1218*
+E1219	vim9.txt	/*E1219*
 E122	eval.txt	/*E122*
+E1220	vim9.txt	/*E1220*
+E1221	vim9.txt	/*E1221*
+E1222	vim9.txt	/*E1222*
+E1223	vim9.txt	/*E1223*
+E1224	vim9.txt	/*E1224*
+E1225	vim9.txt	/*E1225*
+E1226	vim9.txt	/*E1226*
+E1227	vim9.txt	/*E1227*
+E1228	vim9.txt	/*E1228*
+E1229	eval.txt	/*E1229*
 E123	eval.txt	/*E123*
+E1230	options.txt	/*E1230*
 E1231	map.txt	/*E1231*
 E1232	builtin.txt	/*E1232*
 E1233	builtin.txt	/*E1233*
+E1234	vim9.txt	/*E1234*
+E1235	vim9.txt	/*E1235*
+E1236	vim9.txt	/*E1236*
 E1237	map.txt	/*E1237*
+E1238	vim9.txt	/*E1238*
 E1239	builtin.txt	/*E1239*
 E124	eval.txt	/*E124*
+E1240	change.txt	/*E1240*
+E1241	change.txt	/*E1241*
+E1242	change.txt	/*E1242*
 E1243	options.txt	/*E1243*
 E1244	message.txt	/*E1244*
 E1245	cmdline.txt	/*E1245*
+E1246	eval.txt	/*E1246*
+E1247	cmdline.txt	/*E1247*
+E1248	vim9.txt	/*E1248*
+E1249	syntax.txt	/*E1249*
 E125	eval.txt	/*E125*
+E1250	vim9.txt	/*E1250*
+E1251	vim9.txt	/*E1251*
+E1252	vim9.txt	/*E1252*
+E1253	vim9.txt	/*E1253*
+E1254	vim9.txt	/*E1254*
 E1255	map.txt	/*E1255*
+E1256	vim9.txt	/*E1256*
+E1257	vim9.txt	/*E1257*
+E1258	vim9.txt	/*E1258*
+E1259	vim9.txt	/*E1259*
 E126	eval.txt	/*E126*
+E1260	vim9.txt	/*E1260*
+E1261	vim9.txt	/*E1261*
+E1262	vim9.txt	/*E1262*
 E1263	eval.txt	/*E1263*
+E1264	vim9.txt	/*E1264*
+E1265	eval.txt	/*E1265*
 E127	eval.txt	/*E127*
 E128	eval.txt	/*E128*
 E129	eval.txt	/*E129*
@@ -6125,6 +6220,7 @@
 convert-to-HTML	syntax.txt	/*convert-to-HTML*
 convert-to-XHTML	syntax.txt	/*convert-to-XHTML*
 convert-to-XML	syntax.txt	/*convert-to-XML*
+convert_legacy_function_to_vim9	vim9.txt	/*convert_legacy_function_to_vim9*
 copy()	builtin.txt	/*copy()*
 copy-diffs	diff.txt	/*copy-diffs*
 copy-move	change.txt	/*copy-move*
@@ -9931,7 +10027,6 @@
 test_option_not_set()	testing.txt	/*test_option_not_set()*
 test_override()	testing.txt	/*test_override()*
 test_refcount()	testing.txt	/*test_refcount()*
-test_scrollbar()	testing.txt	/*test_scrollbar()*
 test_setmouse()	testing.txt	/*test_setmouse()*
 test_settime()	testing.txt	/*test_settime()*
 test_srand_seed()	testing.txt	/*test_srand_seed()*
diff --git a/runtime/doc/testing.txt b/runtime/doc/testing.txt
index 8bd3cc9..c77d594 100644
--- a/runtime/doc/testing.txt
+++ b/runtime/doc/testing.txt
@@ -1,4 +1,4 @@
-*testing.txt*	For Vim version 8.2.  Last change: 2022 Jan 23
+*testing.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -65,8 +65,9 @@
 		Like garbagecollect(), but executed right away.  This must
 		only be called directly to avoid any structure to exist
 		internally, and |v:testing| must have been set before calling
-		any function.  This will not work when called from a :def
-		function, because variables on the stack will be freed.
+		any function.   *E1142*
+		This will not work when called from a :def function, because
+		variables on the stack will be freed.
 
 
 test_garbagecollect_soon()			 *test_garbagecollect_soon()*
@@ -92,6 +93,7 @@
 		    "dropfiles"	drop one or more files in a window.
 		    "findrepl"  search and replace text
 		    "mouse"	mouse button click event.
+		    "scrollbar" move or drag the scrollbar
 		    "tabline"	select a tab page by mouse click.
 		    "tabmenu"	select a tabline menu entry.
 
@@ -113,6 +115,7 @@
 		  |drop_file| feature is present.
 
 		"findrepl":
+		  {only available when the GUI has a find/replace dialog}
 		  Perform a search and replace of text.  The supported items
 		  in {args} are:
 		    find_text:	string to find.
@@ -149,6 +152,22 @@
 				    8	alt is pressed
 				   16	ctrl is pressed
 
+		"scrollbar":
+		  Set or drag the left, right or horizontal scrollbar.  Only
+		  works when the scrollbar actually exists.  The supported
+		  items in {args} are:
+		    which:	scrollbar. The supported values are:
+				    left  Left scrollbar of the current window
+				    right Right scrollbar of the current window
+				    hor   Horizontal scrollbar
+		    value:	amount to scroll.  For the vertical scrollbars
+				the value can be 1 to the line-count of the
+				buffer.  For the horizontal scrollbar the
+				value can be between 1 and the maximum line
+				length, assuming 'wrap' is not set.
+		    dragging:	1 to drag the scrollbar and 0 to click in the
+				scrollbar.
+
 		"tabline":
 		  Inject a mouse click event on the tabline to select a
 		  tabpage. The supported items in {args} are:
@@ -284,27 +303,6 @@
 			GetVarname()->test_refcount()
 
 
-test_scrollbar({which}, {value}, {dragging})		*test_scrollbar()*
-		Pretend using scrollbar {which} to move it to position
-		{value}.  {which} can be:
-			left	Left scrollbar of the current window
-			right	Right scrollbar of the current window
-			hor	Horizontal scrollbar
-
-		For the vertical scrollbars {value} can be 1 to the
-		line-count of the buffer.  For the horizontal scrollbar the
-		{value} can be between 1 and the maximum line length, assuming
-		'wrap' is not set.
-
-		When {dragging} is non-zero it's like dragging the scrollbar,
-		otherwise it's like clicking in the scrollbar.
-		Only works when the {which} scrollbar actually exists,
-		obviously only when using the GUI.
-
-		Can also be used as a |method|: >
-			GetValue()->test_scrollbar('right', 0)
-
-
 test_setmouse({row}, {col})				*test_setmouse()*
 		Set the mouse position to be used for the next mouse action.
 		{row} and {col} are one based.
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 5861fa8..c74bce6 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 Jan 31
+*todo.txt*      For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -38,19 +38,7 @@
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Cannot use command modifier for "import 'name.vim' as vim9"
-
-range() returns list<number>, but it's OK if map() changes the type.
-#9665  Change internal_func_ret_type() to return current and declared type?
-
-When making a copy of a list or dict, do not keep the type? #9644
-    With deepcopy() all, with copy() this still fails:
-    var l: list<list<number>> = [[1], [2]]
-    l->copy()[0][0] = 'x'
-
 Once Vim9 is stable:
-- Add all the error numbers in a good place in documentation.
-    done until E1145
 - Check code coverage, add more tests if needed.
 - Use Vim9 for runtime files.
 
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index fb0a357..5b35dca 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -1,4 +1,4 @@
-*various.txt*   For Vim version 8.2.  Last change: 2022 Jan 15
+*various.txt*   For Vim version 8.2.  Last change: 2022 Feb 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -424,7 +424,7 @@
 m  *+mzscheme/dyn*	Mzscheme interface |mzscheme-dynamic| |/dyn|
 m  *+netbeans_intg*	|netbeans|
 T  *+num64*		64-bit Number support |Number|
-   			Always enabled since 8.2.0271, use v:numbersize to
+			Always enabled since 8.2.0271, use v:numbersize to
 			check the actual size of a Number.
 m  *+ole*		Win32 GUI only: |ole-interface|
 N  *+packages*		Loading |packages|
@@ -549,7 +549,7 @@
 			backward compatibility, the ">" after the register
 			name can be omitted.
 :redi[r] @">>		Append messages to the unnamed register.
-
+							*E1092*
 :redi[r] => {var}	Redirect messages to a variable.
 			In legacy script: If the variable doesn't exist, then
 			it is created.  If the variable exists, then it is
@@ -566,7 +566,7 @@
 
 :redi[r] =>> {var}	Append messages to an existing variable.  Only string
 			variables can be used.
-
+								 *E1185*
 :redi[r] END		End redirecting messages.
 
 							*:filt* *:filter*
@@ -649,7 +649,7 @@
 			used.  In this example |:silent| is used to avoid the
 			message about reading the file and |:unsilent| to be
 			able to list the first line of each file. >
-    		:silent argdo unsilent echo expand('%') . ": " . getline(1)
+		:silent argdo unsilent echo expand('%') . ": " . getline(1)
 <
 
 						*:verb* *:verbose*
diff --git a/runtime/doc/version8.txt b/runtime/doc/version8.txt
index 225dee0..f0a5290 100644
--- a/runtime/doc/version8.txt
+++ b/runtime/doc/version8.txt
@@ -1,4 +1,4 @@
-*version8.txt*  For Vim version 8.2.  Last change: 2021 Jul 24
+*version8.txt*  For Vim version 8.2.  Last change: 2022 Feb 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -25971,7 +25971,7 @@
 	|test_getvalue()|
 	|test_null_blob()|
 	|test_refcount()|
-	|test_scrollbar()|
+	test_scrollbar() (later replaced with |test_gui_event()|)
 	|test_setmouse()|
 	|win_execute()|
 	|win_splitmove()|
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index 06f8925..afa3239 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 Jan 30
+*vim9.txt*	For Vim version 8.2.  Last change: 2022 Feb 04
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -56,12 +56,12 @@
 rewrite old scripts, they keep working as before.  You may want to use a few
 `:def` functions for code that needs to be fast.
 
-:vim9[cmd] {cmd}				*:vim9* *:vim9cmd*
+:vim9[cmd] {cmd}				*:vim9* *:vim9cmd* *E1164*
 		Execute {cmd} using Vim9 script syntax and semantics.
 		Useful when typing a command and in a legacy script or
 		function.
 
-:leg[acy] {cmd}					*:leg* *:legacy*
+:leg[acy] {cmd}					*:leg* *:legacy* *E1189* *E1234*
 		Execute {cmd} using legacy script syntax and semantics.  Only
 		useful in a Vim9 script or a :def function.
 		Note that {cmd} cannot use local variables, since it is parsed
@@ -72,7 +72,7 @@
 2. Differences from legacy Vim script			*vim9-differences*
 
 Overview ~
-
+							*E1146*
 Brief summary of the differences you will most often encounter when using Vim9
 script and `:def` functions; details are below:
 - Comments start with #, not ": >
@@ -128,7 +128,7 @@
 that starts a comment: >
 	var name = value # comment
 	var name = value# error!
-
+<							*E1170*
 Do not start a comment with #{, it looks like the legacy dictionary literal
 and produces an error where this might be confusing.  #{{ or #{{{ are OK,
 these can be used to start a fold.
@@ -153,7 +153,7 @@
 - `:disassemble` is used for the function.
 - a function that is compiled calls the function or uses it as a function
   reference (so that the argument and return types can be checked)
-							*E1091*
+						*E1091* *E1191*
 If compilation fails it is not tried again on the next call, instead this
 error is given: "E1091: Function is not compiled: {name}".
 Compilation will fail when encountering a user command that has not been
@@ -183,14 +183,14 @@
 	  var d = {func: Legacy, value: 'text'}
 	  d.func()
 	enddef
-<							*E1096*
+<						*E1096* *E1174* *E1175*
 The argument types and return type need to be specified.  The "any" type can
 be used, type checking will then be done at runtime, like with legacy
 functions.
 							*E1106*
 Arguments are accessed by name, without "a:", just like any other language.
 There is no "a:" dictionary or "a:000" list.
-					*vim9-variable-arguments* *E1055*
+			*vim9-variable-arguments* *E1055* *E1160* *E1180*
 Variable arguments are defined as the last argument, with a name and have a
 list type, similar to TypeScript.  For example, a list of numbers: >
 	def MyFunc(...itemlist: list<number>)
@@ -206,7 +206,7 @@
 	enddef
 	MyFunc(v:none, 'LAST')  # first argument uses default value 'one'
 <
-						*vim9-ignored-argument*
+					*vim9-ignored-argument* *E1181*
 The argument "_" (an underscore) can be used to ignore the argument.  This is
 most useful in callbacks where you don't need it, but do need to give an
 argument to match the call.  E.g. when using map() two arguments are passed,
@@ -264,7 +264,7 @@
 
 
 Reloading a Vim9 script clears functions and variables by default ~
-							*vim9-reload*
+						*vim9-reload* *E1149* *E1150*
 When loading a legacy Vim script a second time nothing is removed, the
 commands will replace existing variables and functions and create new ones.
 
@@ -345,7 +345,8 @@
 	   }
 
 Although using a :def function probably works better.
-				*E1022* *E1103* *E1130* *E1131* *E1133* *E1134*
+				*E1022* *E1103* *E1130* *E1131* *E1133*
+				*E1134* *E1235*
 Declaring a variable with a type but without an initializer will initialize to
 false (for bool), empty (for string, list, dict, etc.) or zero (for number,
 any, etc.).  This matters especially when using the "any" type, the value will
@@ -355,13 +356,13 @@
 without any command.  The same for global, window, tab, buffer and Vim
 variables, because they are not really declared.  Those can also be deleted
 with `:unlet`.
-
+							*E1178*
 `:lockvar` does not work on local variables.  Use `:const` and `:final`
 instead.
 
 The `exists()` and `exists_compiled()` functions do not work on local variables
 or arguments.
-						*E1006* *E1041*
+				*E1006* *E1041* *E1167* *E1168* *E1213*
 Variables, functions and function arguments cannot shadow previously defined
 or imported variables and functions in the same script file.
 Variables may shadow Ex commands, rename the variable if needed.
@@ -414,7 +415,7 @@
 	[a, _, c] = theList
 To ignore any remaining items: >
 	[a, b; _] = longList
-
+<							*E1163*
 Declaring more than one variable at a time, using the unpack notation, is
 possible.  Each variable can have a type or infer it from the value: >
 	var [v1: number, v2] = GetValues()
@@ -456,7 +457,7 @@
 
 
 Omitting :call and :eval ~
-
+							*E1190*
 Functions can be called without `:call`: >
 	writefile(lines, 'file')
 Using `:call` is still possible, but this is discouraged.
@@ -516,7 +517,8 @@
 To avoid these problems Vim9 script uses a different syntax for a lambda,
 which is similar to JavaScript: >
 	var Lambda = (arg) => expression
-
+	var Lambda = (arg): type => expression
+<							*E1157*
 No line break is allowed in the arguments of a lambda up to and including the
 "=>" (so that Vim can tell the difference between an expression in parentheses
 and lambda arguments).  This is OK: >
@@ -532,7 +534,7 @@
 	filter(list, (k,
 		\	v)
 		\	=> v > 0)
-<							*vim9-lambda-arguments*
+<					*vim9-lambda-arguments* *E1172*
 In legacy script a lambda could be called with any number of extra arguments,
 there was no way to warn for not using them.  In Vim9 script the number of
 arguments must match.  If you do want to accept any arguments, or any further
@@ -541,7 +543,7 @@
 	var Callback = (..._) => 'anything'
 	echo Callback(1, 2, 3)  # displays "anything"
 
-<							*inline-function*
+<						*inline-function* *E1171*
 Additionally, a lambda can contain statements in {}: >
 	var Lambda = (arg) => {
 		g:was_called = 'yes'
@@ -735,7 +737,7 @@
 
 
 White space ~
-				*E1004* *E1068* *E1069* *E1074* *E1127*
+			*E1004* *E1068* *E1069* *E1074* *E1127* *E1202*
 Vim9 script enforces proper use of white space.  This is no longer allowed: >
 	var name=234	# Error!
 	var name= 234	# Error!
@@ -769,7 +771,7 @@
 	Func(
 	      arg	   # OK
 	      )
-
+<							*E1205*
 White space is not allowed in a `:set` command between the option name and a
 following "&", "!", "<", "=", "+=", "-=" or "^=".
 
@@ -779,6 +781,11 @@
 |curly-braces-names| cannot be used.
 
 
+Command modifiers are not ignored ~
+								*E1176*
+Using a command modifier for a command that does not use it gives an error.
+
+
 Dictionary literals ~
 						*vim9-literal-dict* *E1014*
 Traditionally Vim has supported dictionary literals with a {} syntax: >
@@ -837,7 +844,7 @@
 
 
 For loop ~
-
+							*E1254*
 The loop variable must not be declared yet: >
 	var i = 1
 	for i in [1, 2, 3]   # Error!
@@ -1103,7 +1110,7 @@
 			later in Vim9 script.  They can only be removed by
 			reloading the same script.
 
-							*:enddef* *E1057*
+					*:enddef* *E1057* *E1152* *E1173*
 :enddef			End of a function defined with `:def`. It should be on
 			a line by its own.
 
@@ -1182,6 +1189,67 @@
 	echo range(5)->map((i, _) => flist[i]())
 	# Result: [0, 1, 2, 3, 4]
 
+In some situations, especially when calling a Vim9 closure from legacy
+context, the evaluation will fail.  *E1248*
+
+
+Converting a function from legacy to Vim9 ~
+					*convert_legacy_function_to_vim9*
+These are the most changes that need to be made to convert a legacy function
+to a Vim9 function:
+
+- Change `func` or `function` to `def`.
+- Change `endfunc` or `endfunction` to `enddef`.
+- Add types to the function arguments.
+- If the function returns something, add the return type.
+- Change comments to start with # instead of ".
+
+  For example, a legacy function: >
+	func MyFunc(text)
+	  " function body
+	endfunc
+<  Becomes: >
+	def MyFunc(text: string): number
+	  # function body
+	enddef
+
+- Remove "a:" used for arguments. E.g.: >
+	return len(a:text)
+<  Becomes: >
+	return len(text)
+
+- Change `let` used to declare a variable to `var`.
+- Remove `let` used to assign a value to a variable.  This is for local
+  variables already declared and b: w: g: and t: variables.
+
+  For example, legacy function: >
+	  let lnum = 1
+	  let lnum += 3
+	  let b:result = 42
+<  Becomes: >
+	  var lnum = 1
+	  lnum += 3
+	  b:result = 42
+
+- Insert white space in expressions where needed.
+- Change "." used for concatenation to "..".
+
+  For example, legacy function: >
+	  echo line(1).line(2)
+<  Becomes: >
+	  echo line(1) .. line(2)
+
+- line continuation does not always require a backslash: >
+  	echo ['one',
+		\ 'two',
+		\ 'three'
+		\ ]
+<  Becomes: >
+	echo ['one',
+		'two',
+		'three'
+		]
+
 ==============================================================================
 
 4. Types					*vim9-types*
@@ -1208,7 +1276,7 @@
 
 These types can be used in declarations, but no simple value will actually
 have the "void" type.  Trying to use a void (e.g. a function without a
-return value) results in error *E1031* .
+return value) results in error *E1031*  *E1186* .
 
 There is no array type, use list<{type}> instead.  For a list constant an
 efficient implementation is used that avoids allocating lot of small pieces of
@@ -1346,7 +1414,7 @@
 such as "123", but leads to unexpected problems (and no error message) if the
 string doesn't start with a number.  Quite often this leads to hard-to-find
 bugs.
-
+							*E1206* *E1210* *E1212*
 In Vim9 script this has been made stricter.  In most places it works just as
 before, if the value used matches the expected type.  There will sometimes be
 an error, thus breaking backwards compatibility.  For example:
@@ -1368,9 +1436,15 @@
 	# typename(mylist) == "list<any>"
 	map(mylist, (i, v) => 'item ' .. i)
 	# typename(mylist) == "list<string>", no error
-
+<								*E1158*
 Same for |extend()|, use |extendnew()| instead, and for |flatten()|, use
 |flattennew()| instead.
+			 *E1211* *E1217* *E1218* *E1219* *E1220* *E1221*
+			 *E1222* *E1223* *E1224* *E1225* *E1226* *E1227*
+			 *E1228* *E1238* *E1250* *E1251* *E1252* *E1253*
+			 *E1256*
+Types are checked for most builtin functions to make it easier to spot
+mistakes.
 
 ==============================================================================
 
@@ -1459,16 +1533,16 @@
 
 
 Import ~
-					*:import* *:imp* *E1094* *E1047*
-					*E1048* *E1049* *E1053* *E1071*
+					*:import* *:imp* *E1094* *E1047* *E1262*
+					*E1048* *E1049* *E1053* *E1071* *E1236*
 The exported items can be imported in another Vim9 script: >
 	import "myscript.vim"
 
 This makes each item available as "myscript.item".
-							*:import-as*
+						*:import-as* *E1257* *E1261*
 In case the name is long or ambiguous, another name can be specified: >
 	import "thatscript.vim" as that
-<							*E1060*
+<						*E1060* *E1258* *E1259* *E1260*
 Then you can use "that.EXPORTED_CONST", "that.someValue", etc.  You are free
 to choose the name "that".  Use something that will be recognized as referring
 to the imported script.  Avoid command names, command modifiers and builtin
@@ -1526,17 +1600,19 @@
 	echo that
 		.name  # Error!
 <							*:import-cycle*
-The `import` commands are executed when encountered.  If that script (directly
-or indirectly) imports the current script, then items defined after the
-`import` won't be processed yet.  Therefore cyclic imports can exist, but may
-result in undefined items.
+The `import` commands are executed when encountered.  If script A imports
+script B, and B (directly or indirectly) imports A, this will be skipped over.
+At this point items in A after "import B" will not have been processed and
+defined yet.  Therefore cyclic imports can exist and not result in an error
+directly, but may result in an error for items in A after "import B" not being
+defined.  This does not apply to autoload imports, see the next section.
 
 
 Importing an autoload script ~
 							*vim9-autoload*
 For optimal startup speed, loading scripts should be postponed until they are
 actually needed.  Using the autoload mechanism is recommended:
-
+							*E1264*
 1. In the plugin define user commands, functions and/or mappings that refer to
    items imported from an autoload script. >
 	import autoload 'for/search.vim'
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index 79d00a7..2906298 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -1,4 +1,4 @@
-*windows.txt*   For Vim version 8.2.  Last change: 2022 Jan 08
+*windows.txt*   For Vim version 8.2.  Last change: 2022 Feb 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -168,7 +168,7 @@
 		Note: CTRL-S does not work on all terminals and might block
 		further input, use CTRL-Q to get going again.
 		Also see |++opt| and |+cmd|.
-							*E242*
+							*E242* *E1159*
 		Be careful when splitting a window in an autocommand, it may
 		mess up the window layout if this happens while making other
 		window layout changes.