changeset 31885:cc751d944b7e

Update runtime files. Commit: https://github.com/vim/vim/commit/be4e01637e71c8d5095c33b9861fd70b41476732 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Feb 2 13:59:48 2023 +0000 Update runtime files.
author Bram Moolenaar <Bram@vim.org>
date Thu, 02 Feb 2023 15:15:06 +0100
parents 27f905bc04df
children b741e5243e58
files README_VIM9.md runtime/autoload/dist/vimindent.vim runtime/autoload/tohtml.vim runtime/doc/builtin.txt runtime/doc/diff.txt runtime/doc/eval.txt runtime/doc/fold.txt runtime/doc/ft_context.txt runtime/doc/ft_mp.txt runtime/doc/options.txt runtime/doc/quickfix.txt runtime/doc/tags runtime/doc/term.txt runtime/doc/testing.txt runtime/doc/textprop.txt runtime/doc/todo.txt runtime/doc/usr_41.txt runtime/doc/vim9.txt runtime/doc/vim9class.txt runtime/filetype.vim runtime/ftplugin/debchangelog.vim runtime/ftplugin/debcontrol.vim runtime/ftplugin/logcheck.vim runtime/indent/testdir/vim.in runtime/indent/testdir/vim.ok runtime/plugin/tohtml.vim runtime/syntax/2html.vim runtime/syntax/automake.vim runtime/syntax/debchangelog.vim runtime/syntax/debcontrol.vim runtime/syntax/debcopyright.vim runtime/syntax/debsources.vim runtime/syntax/dep3patch.vim runtime/syntax/forth.vim runtime/syntax/gpg.vim runtime/syntax/lc.vim runtime/syntax/nginx.vim runtime/syntax/sh.vim runtime/syntax/shared/README.txt runtime/syntax/tpp.vim runtime/syntax/vim.vim runtime/syntax/xf86conf.vim runtime/tutor/tutor runtime/tutor/tutor.utf-8 src/po/ca.po src/po/de.po src/po/eo.po src/po/es.po src/po/fi.po src/po/ga.po src/po/it.po src/po/ja.euc-jp.po src/po/ja.po src/po/ja.sjis.po src/po/ru.cp1251.po src/po/ru.po src/po/sr.po src/po/tr.po src/po/uk.cp1251.po src/po/uk.po src/po/zh_CN.UTF-8.po src/po/zh_CN.cp936.po src/po/zh_CN.po
diffstat 63 files changed, 1246 insertions(+), 694 deletions(-) [+]
line wrap: on
line diff
--- a/README_VIM9.md
+++ b/README_VIM9.md
@@ -2,18 +2,17 @@
 
 # What is Vim9?
 
-This is an experimental side of [Vim](https://github.com/vim/vim).
-It explores ways of making Vim script faster and better.
+This is a new syntax for Vim script that was introduced with Vim 9.0.
+It intends making Vim script faster and better.
 
-WARNING: The Vim9 script features are still under development, anything can
-break!
 
 # Why Vim9?
 
 ## 1. FASTER VIM SCRIPT
 
 The third item on the poll results of 2018, after popup windows and text
-properties, is faster Vim script.  So how do we do that?
+properties, both of which have been implemented, is faster Vim script.
+So how do we do that?
 
 I have been throwing some ideas around, and soon came to the conclusion
 that the current way functions are called and executed, with
@@ -53,7 +52,7 @@ we can gain, and also that Vim script ca
 interfaces.
 
 LuaJit is much faster at Lua-only instructions.  In practice the script would
-not do something useless as counting but change the text.  For example,
+not do something useless counting, but change the text.  For example,
 reindent all the lines:
 
 ``` vim
--- a/runtime/autoload/dist/vimindent.vim
+++ b/runtime/autoload/dist/vimindent.vim
@@ -2,12 +2,12 @@ vim9script
 
 # Language:     Vim script
 # Maintainer:   github user lacygoill
-# Last Change:  2023 Jan 03
+# Last Change:  2023 Feb 01
 
 # NOTE: Whenever you change the code, make sure the tests are still passing:
 #
 #     $ cd runtime/indent/
-#     $ make clean; make test || vimdiff testdir/vim.{fail,ok}
+#     $ make clean; make test || vimdiff testdir/vim.{ok,fail}
 
 # Config {{{1
 
@@ -112,6 +112,10 @@ const DICT_KEY: string = '^\s*\%('
     .. '\)'
     .. ':\%(\s\|$\)'
 
+# NOT_A_DICT_KEY {{{3
+
+const NOT_A_DICT_KEY: string = ':\@!'
+
 # END_OF_COMMAND {{{3
 
 const END_OF_COMMAND: string = $'\s*\%($\|||\@!\|{INLINE_COMMENT}\)'
@@ -144,19 +148,43 @@ const HEREDOC_OPERATOR: string = '\s=<<\
 #
 # But sometimes, it can be too costly and cause `E363` to be given.
 const PATTERN_DELIMITER: string = '[-+*/%]\%(=\s\)\@!'
-
-# QUOTE {{{3
-
-const QUOTE: string = '["'']'
 # }}}2
 # Syntaxes {{{2
-# ASSIGNS_HEREDOC {{{3
+# BLOCKS {{{3
 
-const ASSIGNS_HEREDOC: string = $'^\%({COMMENT}\)\@!.*\%({HEREDOC_OPERATOR}\)\s\+\zs[A-Z]\+{END_OF_LINE}'
+const BLOCKS: list<list<string>> = [
+    ['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
+    ['for', 'endfor\='],
+    ['wh\%[ile]', 'endw\%[hile]'],
+    ['try', 'cat\%[ch]', 'fina\|finally\=', 'endt\%[ry]'],
+    ['def', 'enddef'],
+    ['fu\%[nction](\@!', 'endf\%[unction]'],
+    ['class', 'endclass'],
+    ['interface', 'endinterface'],
+    ['enum', 'endenum'],
+    ['aug\%[roup]\%(\s\+[eE][nN][dD]\)\@!\s\+\S\+', 'aug\%[roup]\s\+[eE][nN][dD]'],
+]
+
+# MODIFIERS {{{3
 
-# CD_COMMAND {{{3
-
-const CD_COMMAND: string = $'\<[lt]\=cd!\=\s\+-{END_OF_COMMAND}'
+# some keywords can be prefixed by modifiers (e.g. `def` can be prefixed by `export`)
+const MODIFIERS: dict<string> = {
+    def: ['export', 'static'],
+    class: ['export', 'abstract', 'export abstract'],
+    interface: ['export'],
+}
+#     ...
+#     class: ['export', 'abstract', 'export abstract'],
+#     ...
+#     →
+#     ...
+#     class: '\%(export\|abstract\|export\s\+abstract\)\s\+',
+#     ...
+->map((_, mods: list<string>): string =>
+    '\%(' .. mods
+    ->join('\|')
+    ->substitute('\s\+', '\\s\\+', 'g')
+    .. '\)' .. '\s\+')
 
 # HIGHER_ORDER_COMMAND {{{3
 
@@ -174,58 +202,102 @@ patterns =<< trim eval END
     g\%[lobal]!\={PATTERN_DELIMITER}.*
     v\%[global]!\={PATTERN_DELIMITER}.*
 END
-const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%(' .. patterns->join('\|') .. '\):\@!'
 
-# MAPPING_COMMAND {{{3
+const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%({patterns->join('\|')}\){NOT_A_DICT_KEY}'
+
+# START_MIDDLE_END {{{3
 
-const MAPPING_COMMAND: string = '\%(\<sil\%[ent]!\=\s\+\)\=\<[nvxsoilct]\=\%(nore\|un\)map!\=\s'
+# Let's derive this constant from `BLOCKS`:
+#
+#     [['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
+#      ['for', 'endfor\='],
+#      ...,
+#      [...]]
+#     →
+#     {
+#      'for': ['for', '', 'endfor\='],
+#      'endfor': ['for', '', 'endfor\='],
+#      'if': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+#      'else': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+#      'elseif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+#      'endif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+#      ...
+#     }
+var START_MIDDLE_END: dict<list<string>>
 
-# NORMAL_COMMAND {{{3
+def Unshorten(kwd: string): string
+    return BlockStartKeyword(kwd)
+enddef
 
-const NORMAL_COMMAND: string = '\<norm\%[al]!\=\s*\S\+$'
-
-# PLUS_MINUS_COMMAND {{{3
+def BlockStartKeyword(line: string): string
+    var kwd: string = line->matchstr('\l\+')
+    return fullcommand(kwd, false)
+enddef
 
-# In legacy, the `:+` and `:-` commands are not required to be preceded by a colon.
-# As a result, when `+` or `-` is alone on a line, there is ambiguity.
-# It might be an operator or a command.
-# To not break the indentation in legacy scripts, we might need to consider such
-# lines as commands.
-const PLUS_MINUS_COMMAND: string = '^\s*[+-]\s*$'
+{
+    for kwds: list<string> in BLOCKS
+        var [start: string, middle: string, end: string] = [kwds[0], '', kwds[-1]]
+        if MODIFIERS->has_key(start->Unshorten())
+            start = $'\%({MODIFIERS[start]}\)\={start}'
+        endif
+        if kwds->len() > 2
+            middle = kwds[1 : -2]->join('\|')
+        endif
+        for kwd: string in kwds
+            START_MIDDLE_END->extend({[kwd->Unshorten()]: [start, middle, end]})
+        endfor
+    endfor
+}
+
+START_MIDDLE_END = START_MIDDLE_END
+    ->map((_, kwds: list<string>) =>
+        kwds->map((_, kwd: string) => kwd == ''
+        ? ''
+        : $'\%(^\|{BAR_SEPARATION}\|\<sil\%[ent]\|{HIGHER_ORDER_COMMAND}\)\s*'
+        .. $'\<\%({kwd}\)\>\%(\s*{OPERATOR}\)\@!'))
+
+lockvar! START_MIDDLE_END
 
 # ENDS_BLOCK {{{3
 
 const ENDS_BLOCK: string = '^\s*\%('
-    .. 'en\%[dif]'
-    .. '\|' .. 'endfor\='
-    .. '\|' .. 'endw\%[hile]'
-    .. '\|' .. 'endt\%[ry]'
-    .. '\|' .. 'enddef'
-    .. '\|' .. 'endclass'
-    .. '\|' .. 'endf\%[unction]'
-    .. '\|' .. 'aug\%[roup]\s\+[eE][nN][dD]'
+    .. BLOCKS
+    ->copy()
+    ->map((_, kwds: list<string>): string => kwds[-1])
+    ->join('\|')
     .. '\|' .. CLOSING_BRACKET
     .. $'\){END_OF_COMMAND}'
 
 # ENDS_BLOCK_OR_CLAUSE {{{3
 
-patterns =<< trim END
-    en\%[dif]
-    el\%[se]
-    endfor\=
-    endclass
-    endw\%[hile]
-    endt\%[ry]
-    fina\|finally\=
-    enddef
-    endf\%[unction]
-    aug\%[roup]\s\+[eE][nN][dD]
-END
+patterns = BLOCKS
+    ->copy()
+    ->map((_, kwds: list<string>) => kwds[1 :])
+    ->flattennew()
+    # `catch` and `elseif` need to be handled as special cases
+    ->filter((_, pat: string): bool => pat->Unshorten() !~ '^\%(catch\|elseif\)\>')
 
 const ENDS_BLOCK_OR_CLAUSE: string = '^\s*\%(' .. patterns->join('\|') .. $'\){END_OF_COMMAND}'
     .. $'\|^\s*cat\%[ch]\%(\s\+\({PATTERN_DELIMITER}\).*\1\)\={END_OF_COMMAND}'
     .. $'\|^\s*elseif\=\>\%({OPERATOR}\)\@!'
 
+# STARTS_NAMED_BLOCK {{{3
+
+patterns = []
+{
+    for kwds: list<string> in BLOCKS
+        for kwd: string in kwds[0 : -2]
+            if MODIFIERS->has_key(kwd->Unshorten())
+                patterns += [$'\%({MODIFIERS[kwd]}\)\={kwd}']
+            else
+                patterns += [kwd]
+            endif
+        endfor
+    endfor
+}
+
+const STARTS_NAMED_BLOCK: string = $'^\s*\%(sil\%[ent]\s\+\)\=\%({patterns->join('\|')}\)\>{NOT_A_DICT_KEY}'
+
 # STARTS_CURLY_BLOCK {{{3
 
 # TODO: `{` alone on a line is not necessarily the start of a block.
@@ -238,73 +310,57 @@ const STARTS_CURLY_BLOCK: string = '\%('
     .. '\|' ..  $'^\%(\s*\|.*{BAR_SEPARATION}\s*\)\%(com\%[mand]\|au\%[tocmd]\).*\zs\s{{'
     .. '\)' .. END_OF_COMMAND
 
-# STARTS_NAMED_BLOCK {{{3
-
-# All of these will be used at the start of a line (or after a bar).
-# NOTE: Don't replace `\%x28` with `(`.{{{
-#
-# Otherwise, the paren would be unbalanced which might cause syntax highlighting
-# issues much  later in the  code of the  current script (sometimes,  the syntax
-# highlighting plugin fails  to correctly recognize a heredoc which  is far away
-# and/or not displayed because inside a fold).
-# }}}
-patterns =<< trim END
-    if
-    el\%[se]
-    elseif\=
-    for
-    class
-    wh\%[ile]
-    try
-    cat\%[ch]
-    fina\|finally\=
-    fu\%[nction]\%x28\@!
-    \%(export\s\+\)\=def
-    aug\%[roup]\%(\s\+[eE][nN][dD]\)\@!\s\+\S\+
-END
-const STARTS_NAMED_BLOCK: string = '^\s*\%(sil\%[ent]\s\+\)\=\%(' .. patterns->join('\|') .. '\)\>:\@!'
-
 # STARTS_FUNCTION {{{3
 
-const STARTS_FUNCTION: string = '^\s*\%(export\s\+\)\=def\>:\@!'
+const STARTS_FUNCTION: string = $'^\s*\%({MODIFIERS.def}\)\=def\>{NOT_A_DICT_KEY}'
 
 # ENDS_FUNCTION {{{3
 
-const ENDS_FUNCTION: string = $'^\s*enddef\>:\@!{END_OF_COMMAND}'
+const ENDS_FUNCTION: string = $'^\s*enddef\>{END_OF_COMMAND}'
+
+# ASSIGNS_HEREDOC {{{3
+
+const ASSIGNS_HEREDOC: string = $'^\%({COMMENT}\)\@!.*\%({HEREDOC_OPERATOR}\)\s\+\zs[A-Z]\+{END_OF_LINE}'
+
+# PLUS_MINUS_COMMAND {{{3
 
-# START_MIDDLE_END {{{3
+# In legacy, the `:+` and `:-` commands are not required to be preceded by a colon.
+# As a result, when `+` or `-` is alone on a line, there is ambiguity.
+# It might be an operator or a command.
+# To not break the indentation in legacy scripts, we might need to consider such
+# lines as commands.
+const PLUS_MINUS_COMMAND: string = '^\s*[+-]\s*$'
+
+# TRICKY_COMMANDS {{{3
 
-const START_MIDDLE_END: dict<list<string>> = {
-    if: ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
-    else: ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
-    elseif: ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
-    endif: ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
-    for: ['for', '', 'endfor\='],
-    endfor: ['for', '', 'endfor\='],
-    class: ['class', '', 'endclass'],
-    endclass: ['class', '', 'endclass'],
-    while: ['wh\%[ile]', '', 'endw\%[hile]'],
-    endwhile: ['wh\%[ile]', '', 'endw\%[hile]'],
-    try: ['try', 'cat\%[ch]\|fina\|finally\=', 'endt\%[ry]'],
-    catch: ['try', 'cat\%[ch]\|fina\|finally\=', 'endt\%[ry]'],
-    finally: ['try', 'cat\%[ch]\|fina\|finally\=', 'endt\%[ry]'],
-    endtry: ['try', 'cat\%[ch]\|fina\|finally\=', 'endt\%[ry]'],
-    def: ['\%(export\s\+\)\=def', '', 'enddef'],
-    enddef: ['\%(export\s\+\)\=def', '', 'enddef'],
-    function: ['fu\%[nction]', '', 'endf\%[unction]'],
-    endfunction: ['fu\%[nction]', '', 'endf\%[unction]'],
-    augroup: ['aug\%[roup]\%(\s\+[eE][nN][dD]\)\@!\s\+\S\+', '', 'aug\%[roup]\s\+[eE][nN][dD]'],
-}->map((_, kwds: list<string>) =>
-    kwds->map((_, kwd: string) => kwd == ''
-    ? ''
-    : $'\%(^\|{BAR_SEPARATION}\|\<sil\%[ent]\|{HIGHER_ORDER_COMMAND}\)\s*'
-    .. $'\%({printf('\C\<\%%(%s\)\>:\@!\%%(\s*%s\)\@!', kwd, OPERATOR)}\)'))
+# Some  commands  are tricky  because  they  accept  an  argument which  can  be
+# conflated with an operator.  Examples:
+#
+#     argdelete *
+#     cd -
+#     normal! ==
+#     nunmap <buffer> (
+#
+# TODO: Other commands might accept operators as argument.  Handle them too.
+patterns =<< trim eval END
+    {'\'}<argd\%[elete]\s\+\*\s*$
+    \<[lt]\=cd!\=\s\+-\s*$
+    \<norm\%[al]!\=\s*\S\+$
+    \%(\<sil\%[ent]!\=\s\+\)\=\<[nvxsoilct]\=\%(nore\|un\)map!\=\s
+    {PLUS_MINUS_COMMAND}
+END
+
+const TRICKY_COMMANDS: string = patterns->join('\|')
 # }}}2
 # EOL {{{2
 # OPENING_BRACKET_AT_EOL {{{3
 
 const OPENING_BRACKET_AT_EOL: string = OPENING_BRACKET .. END_OF_VIM9_LINE
 
+# CLOSING_BRACKET_AT_EOL {{{3
+
+const CLOSING_BRACKET_AT_EOL: string = CLOSING_BRACKET .. END_OF_VIM9_LINE
+
 # COMMA_AT_EOL {{{3
 
 const COMMA_AT_EOL: string = $',{END_OF_VIM9_LINE}'
@@ -392,6 +448,7 @@ export def Expr(lnum = v:lnum): number #
     endif
 
     if line_A->AtStartOf('FuncHeader')
+            && !IsInInterface()
         line_A.lnum->CacheFuncHeader()
     elseif line_A.lnum->IsInside('FuncHeader')
         return b:vimindent.startindent + 2 * shiftwidth()
@@ -430,6 +487,7 @@ export def Expr(lnum = v:lnum): number #
     if line_A.text->ContinuesBelowBracketBlock(line_B, past_bracket_block)
             && line_A.text !~ CLOSING_BRACKET_AT_SOL
         return past_bracket_block.startindent
+            + (past_bracket_block.startline =~ STARTS_NAMED_BLOCK ? 2 * shiftwidth() : 0)
     endif
 
     # Problem: If we press `==` on the line right below the start of a multiline
@@ -438,6 +496,18 @@ export def Expr(lnum = v:lnum): number #
     if line_B->EndsWithLambdaArrow()
         return Indent(line_B.lnum) + shiftwidth() + IndentMoreInBracketBlock()
     endif
+    # FIXME: Similar issue here:
+    #
+    #     var x = []
+    #         ->filter((_, _) =>
+    #             true)
+    #         ->items()
+    #
+    # Press `==` on last line.
+    # Expected: The `->items()` line is indented like `->filter(...)`.
+    # Actual: It's indented like `true)`.
+    # Is it worth fixing? `=ip` gives  the correct indentation, because then the
+    # cache is used.
 
     # Don't move this block before the heredoc one.{{{
     #
@@ -536,8 +606,13 @@ def Offset( # {{{2
         line_B: dict<any>,
         ): number
 
+    if line_B->AtStartOf('FuncHeader')
+            && IsInInterface()
+        return 0
+
     # increase indentation inside a block
-    if line_B.text =~ STARTS_NAMED_BLOCK || line_B->EndsWithCurlyBlock()
+    elseif line_B.text =~ STARTS_NAMED_BLOCK
+            || line_B->EndsWithCurlyBlock()
         # But don't indent if the line starting the block also closes it.
         if line_B->AlsoClosesBlock()
             return 0
@@ -807,11 +882,6 @@ def Indent(lnum: number): number # {{{3
     return indent(lnum)
 enddef
 
-def BlockStartKeyword(line: string): string # {{{3
-    var kwd: string = line->matchstr('\l\+')
-    return fullcommand(kwd, false)
-enddef
-
 def MatchingOpenBracket(line: dict<any>): number # {{{3
     var end: string = line.text->matchstr(CLOSING_BRACKET)
     var start: string = {']': '[', '}': '{', ')': '('}[end]
@@ -908,7 +978,8 @@ def SearchPair( # {{{3
     if end == '[' || end == ']'
         e = e->escape('[]')
     endif
-    return searchpair(s, middle, e, flags, (): bool => InCommentOrString(), stopline, TIMEOUT)
+    return searchpair('\C' .. s, (middle == '' ? '' : '\C' .. middle), '\C' .. e,
+        flags, (): bool => InCommentOrString(), stopline, TIMEOUT)
 enddef
 
 def SearchPairStart( # {{{3
@@ -1016,6 +1087,10 @@ def IsInThisBlock(line_A: dict<any>, lnu
     return line_A.lnum <= end
 enddef
 
+def IsInInterface(): bool # {{{3
+    return SearchPair('interface', '', 'endinterface', 'nW') > 0
+enddef
+
 def IsFirstLineOfCommand(line_1: dict<any>, line_2: dict<any>): bool # {{{3
     if line_1.text->Is_IN_KeywordForLoop(line_2.text)
         return false
@@ -1096,6 +1171,10 @@ def EndsWithOpeningBracket(line: dict<an
     return NonCommentedMatch(line, OPENING_BRACKET_AT_EOL)
 enddef
 
+def EndsWithClosingBracket(line: dict<any>): bool # {{{3
+    return NonCommentedMatch(line, CLOSING_BRACKET_AT_EOL)
+enddef
+
 def NonCommentedMatch(line: dict<any>, pat: string): bool # {{{3
     # Could happen if there is no code above us, and we're not on the 1st line.
     # In that case, `PrevCodeLine()` returns `{lnum: 0, line: ''}`.
@@ -1103,16 +1182,6 @@ def NonCommentedMatch(line: dict<any>, p
         return false
     endif
 
-    if line.text =~ PLUS_MINUS_COMMAND
-        return false
-    endif
-
-    # In `argdelete *`, `*` is not a multiplication operator.
-    # TODO: Other commands can accept `*` as an argument.  Handle them too.
-    if line.text =~ '\<argd\%[elete]\s\+\*\s*$'
-        return false
-    endif
-
     # Technically, that's wrong.  A  line might start with a range  and end with a
     # line continuation symbol.  But it's unlikely.  And it's useful to assume the
     # opposite because it  prevents us from conflating a mark  with an operator or
@@ -1179,24 +1248,7 @@ def NonCommentedMatch(line: dict<any>, p
         return false
     endif
 
-    # `:help cd-`
-    if line.text =~ CD_COMMAND
-        return false
-    endif
-
-    # At the end of a mapping, any character might appear; e.g. a paren:
-    #
-    #     nunmap <buffer> (
-    #
-    # Don't conflate this with a line continuation symbol.
-    if line.text =~ MAPPING_COMMAND
-        return false
-    endif
-
-    #             not a comparison operator
-    #             vv
-    #     normal! ==
-    if line.text =~ NORMAL_COMMAND
+    if line.text =~ TRICKY_COMMANDS
         return false
     endif
 
--- a/runtime/autoload/tohtml.vim
+++ b/runtime/autoload/tohtml.vim
@@ -1,6 +1,6 @@
 " Vim autoload file for the tohtml plugin.
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2019 Aug 16
+" Last Change: 2023 Jan 01
 "
 " Additional contributors:
 "
@@ -351,63 +351,65 @@ func! tohtml#Diff2HTML(win_list, buf_lis
   let s:old_magic = &magic
   set magic
 
-  if s:settings.use_xhtml
-    if s:settings.encoding != ""
-      let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
-    else
-      let xml_line = "<?xml version=\"1.0\"?>"
+  let html = []
+  if !s:settings.no_doc
+    if s:settings.use_xhtml
+      if s:settings.encoding != ""
+	let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
+      else
+	let xml_line = "<?xml version=\"1.0\"?>"
+      endif
+      let tag_close = ' />'
     endif
-    let tag_close = ' />'
-  endif
 
-  let style = [s:settings.use_xhtml ? "" : '-->']
-  let body_line = ''
+    let style = [s:settings.use_xhtml ? "" : '-->']
+    let body_line = ''
 
-  let html = []
-  let s:html5 = 0
-  if s:settings.use_xhtml
-    call add(html, xml_line)
-  endif
-  if s:settings.use_xhtml
-    call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
-    call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
-  elseif s:settings.use_css && !s:settings.no_pre
-    call add(html, "<!DOCTYPE html>")
-    call add(html, '<html>')
-    let s:html5 = 1
-  else
-    call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
-    call add(html, '  "http://www.w3.org/TR/html4/loose.dtd">')
-    call add(html, '<html>')
+    let s:html5 = 0
+    if s:settings.use_xhtml
+      call add(html, xml_line)
+    endif
+    if s:settings.use_xhtml
+      call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
+      call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
+    elseif s:settings.use_css && !s:settings.no_pre
+      call add(html, "<!DOCTYPE html>")
+      call add(html, '<html>')
+      let s:html5 = 1
+    else
+      call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
+      call add(html, '  "http://www.w3.org/TR/html4/loose.dtd">')
+      call add(html, '<html>')
+    endif
+    call add(html, '<head>')
+
+    " include encoding as close to the top as possible, but only if not already
+    " contained in XML information
+    if s:settings.encoding != "" && !s:settings.use_xhtml
+      if s:html5
+	call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
+      else
+	call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
+      endif
+    endif
+
+    call add(html, '<title>diff</title>')
+    call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
+    call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
+    call add(html, '<meta name="settings" content="'.
+	  \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
+	  \ ',prevent_copy='.s:settings.prevent_copy.
+	  \ ',use_input_for_pc='.s:settings.use_input_for_pc.
+	  \ '"'.tag_close)
+    call add(html, '<meta name="colorscheme" content="'.
+	  \ (exists('g:colors_name')
+	  \ ? g:colors_name
+	  \ : 'none'). '"'.tag_close)
+
+    call add(html, '</head>')
+    let body_line_num = len(html)
+    call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
   endif
-  call add(html, '<head>')
-
-  " include encoding as close to the top as possible, but only if not already
-  " contained in XML information
-  if s:settings.encoding != "" && !s:settings.use_xhtml
-    if s:html5
-      call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
-    else
-      call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
-    endif
-  endif
-
-  call add(html, '<title>diff</title>')
-  call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
-  call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
-  call add(html, '<meta name="settings" content="'.
-	\ join(filter(keys(s:settings),'s:settings[v:val]'),',').
-	\ ',prevent_copy='.s:settings.prevent_copy.
-	\ ',use_input_for_pc='.s:settings.use_input_for_pc.
-	\ '"'.tag_close)
-  call add(html, '<meta name="colorscheme" content="'.
-	\ (exists('g:colors_name')
-	\ ? g:colors_name
-	\ : 'none'). '"'.tag_close)
-
-  call add(html, '</head>')
-  let body_line_num = len(html)
-  call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
   call add(html, "<table ".(s:settings.use_css? "" : "border='1' width='100%' ")."id='vimCodeElement".s:settings.id_suffix."'>")
 
   call add(html, '<tr>')
@@ -430,47 +432,53 @@ func! tohtml#Diff2HTML(win_list, buf_lis
     " When not using CSS or when using xhtml, the <body> line can be important.
     " Assume it will be the same for all buffers and grab it from the first
     " buffer. Similarly, need to grab the body end line as well.
-    if body_line == ''
-      1
-      call search('<body')
-      let body_line = getline('.')
-      $
-      call search('</body>', 'b')
-      let s:body_end_line = getline('.')
-    endif
+    if !s:settings.no_doc
+      if body_line == ''
+	1
+	call search('<body')
+	let body_line = getline('.')
+	$
+	call search('</body>', 'b')
+	let s:body_end_line = getline('.')
+      endif
 
-    " Grab the style information. Some of this will be duplicated so only insert
-    " it if it's not already there. {{{
-    1
-    let style_start = search('^<style\( type="text/css"\)\?>')
-    1
-    let style_end = search('^</style>')
-    if style_start > 0 && style_end > 0
-      let buf_styles = getline(style_start + 1, style_end - 1)
-      for a_style in buf_styles
-	if index(style, a_style) == -1
-	  if diff_style_start == 0
-	    if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
-	      let diff_style_start = len(style)-1
+      " Grab the style information. Some of this will be duplicated so only insert
+      " it if it's not already there. {{{
+      1
+      let style_start = search('^<style\( type="text/css"\)\?>')
+      1
+      let style_end = search('^</style>')
+      if style_start > 0 && style_end > 0
+	let buf_styles = getline(style_start + 1, style_end - 1)
+	for a_style in buf_styles
+	  if index(style, a_style) == -1
+	    if diff_style_start == 0
+	      if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
+		let diff_style_start = len(style)-1
+	      endif
 	    endif
+	    call insert(style, a_style, insert_index)
+	    let insert_index += 1
 	  endif
-	  call insert(style, a_style, insert_index)
-	  let insert_index += 1
-	endif
-      endfor
-    endif " }}}
+	endfor
+      endif " }}}
+
+      " everything new will get added before the diff styles so diff highlight
+      " properly overrides normal highlight
+      if diff_style_start != 0
+	let insert_index = diff_style_start
+      endif
 
-    " everything new will get added before the diff styles so diff highlight
-    " properly overrides normal highlight
-    if diff_style_start != 0
-      let insert_index = diff_style_start
+      " Delete those parts that are not needed so we can include the rest into the
+      " resulting table.
+      1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
+      $
+      ?</body>?,$d_
+    elseif !s:settings.no_modeline
+      " remove modeline from source files if it is included and we haven't deleted
+      " due to removing html footer already
+      $d
     endif
-
-    " Delete those parts that are not needed so we can include the rest into the
-    " resulting table.
-    1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
-    $
-    ?</body>?,$d_
     let temp = getline(1,'$')
     " clean out id on the main content container because we already set it on
     " the table
@@ -478,7 +486,11 @@ func! tohtml#Diff2HTML(win_list, buf_lis
     " undo deletion of start and end part
     " so we can later save the file as valid html
     " TODO: restore using grabbed lines if undolevel is 1?
-    normal! 2u
+    if !s:settings.no_doc
+      normal! 2u
+    elseif !s:settings.no_modeline
+      normal! u
+    endif
     if s:settings.use_css
       call add(html, '<td><div>')
     elseif s:settings.use_xhtml
@@ -495,17 +507,23 @@ func! tohtml#Diff2HTML(win_list, buf_lis
     quit!
   endfor
 
-  let html[body_line_num] = body_line
+  if !s:settings.no_doc
+    let html[body_line_num] = body_line
+  endif
 
   call add(html, '</tr>')
   call add(html, '</table>')
-  call add(html, s:body_end_line)
-  call add(html, '</html>')
+  if !s:settings.no_doc
+    call add(html, s:body_end_line)
+    call add(html, '</html>')
+  endif
 
   " The generated HTML is admittedly ugly and takes a LONG time to fold.
   " Make sure the user doesn't do syntax folding when loading a generated file,
   " using a modeline.
-  call add(html, '<!-- vim: set foldmethod=manual : -->')
+  if !s:settings.no_modeline
+    call add(html, '<!-- vim: set foldmethod=manual : -->')
+  endif
 
   let i = 1
   let name = "Diff" . (s:settings.use_xhtml ? ".xhtml" : ".html")
@@ -542,129 +560,131 @@ func! tohtml#Diff2HTML(win_list, buf_lis
 
   call append(0, html)
 
-  if len(style) > 0
-    1
-    let style_start = search('^</head>')-1
-
-    " add required javascript in reverse order so we can just call append again
-    " and again without adjusting {{{
-
-    let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
+  if !s:settings.no_doc
+    if len(style) > 0
+      1
+      let style_start = search('^</head>')-1
 
-    " insert script closing tag if needed
-    if s:uses_script
-      call append(style_start, [
-	    \ '',
-	    \ s:settings.use_xhtml ? '//]]>' : '-->',
-	    \ "</script>"
-	    \ ])
-    endif
+      " add required javascript in reverse order so we can just call append again
+      " and again without adjusting {{{
 
-    " insert javascript to get IDs from line numbers, and to open a fold before
-    " jumping to any lines contained therein
-    if s:settings.line_ids
-      call append(style_start, [
-	    \ "  /* Always jump to new location even if the line was hidden inside a fold, or",
-	    \ "   * we corrected the raw number to a line ID.",
-	    \ "   */",
-	    \ "  if (lineElem) {",
-	    \ "    lineElem.scrollIntoView(true);",
-	    \ "  }",
-	    \ "  return true;",
-	    \ "}",
-	    \ "if ('onhashchange' in window) {",
-	    \ "  window.onhashchange = JumpToLine;",
-	    \ "}"
-	    \ ])
+      let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
 
-      if s:settings.dynamic_folds
+      " insert script closing tag if needed
+      if s:uses_script
 	call append(style_start, [
-	      \ "",
-	      \ "  /* navigate upwards in the DOM tree to open all folds containing the line */",
-	      \ "  var node = lineElem;",
-	      \ "  while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
-	      \ "  {",
-	      \ "    if (node.className == 'closed-fold')",
-	      \ "    {",
-	      \ "      /* toggle open the fold ID (remove window ID) */",
-	      \ "      toggleFold(node.id.substr(4));",
-	      \ "    }",
-	      \ "    node = node.parentNode;",
-	      \ "  }",
+	      \ '',
+	      \ s:settings.use_xhtml ? '//]]>' : '-->',
+	      \ "</script>"
 	      \ ])
       endif
-    endif
+
+      " insert javascript to get IDs from line numbers, and to open a fold before
+      " jumping to any lines contained therein
+      if s:settings.line_ids
+	call append(style_start, [
+	      \ "  /* Always jump to new location even if the line was hidden inside a fold, or",
+	      \ "   * we corrected the raw number to a line ID.",
+	      \ "   */",
+	      \ "  if (lineElem) {",
+	      \ "    lineElem.scrollIntoView(true);",
+	      \ "  }",
+	      \ "  return true;",
+	      \ "}",
+	      \ "if ('onhashchange' in window) {",
+	      \ "  window.onhashchange = JumpToLine;",
+	      \ "}"
+	      \ ])
 
-    if s:settings.line_ids
-      call append(style_start, [
-	    \ "",
-	    \ "/* function to open any folds containing a jumped-to line before jumping to it */",
-	    \ "function JumpToLine()",
-	    \ "{",
-	    \ "  var lineNum;",
-	    \ "  lineNum = window.location.hash;",
-	    \ "  lineNum = lineNum.substr(1); /* strip off '#' */",
-	    \ "",
-	    \ "  if (lineNum.indexOf('L') == -1) {",
-	    \ "    lineNum = 'L'+lineNum;",
-	    \ "  }",
-	    \ "  if (lineNum.indexOf('W') == -1) {",
-	    \ "    lineNum = 'W1'+lineNum;",
-	    \ "  }",
-	    \ "  var lineElem = document.getElementById(lineNum);"
-	    \ ])
-    endif
+	if s:settings.dynamic_folds
+	  call append(style_start, [
+		\ "",
+		\ "  /* navigate upwards in the DOM tree to open all folds containing the line */",
+		\ "  var node = lineElem;",
+		\ "  while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
+		\ "  {",
+		\ "    if (node.className == 'closed-fold')",
+		\ "    {",
+		\ "      /* toggle open the fold ID (remove window ID) */",
+		\ "      toggleFold(node.id.substr(4));",
+		\ "    }",
+		\ "    node = node.parentNode;",
+		\ "  }",
+		\ ])
+	endif
+      endif
 
-    " Insert javascript to toggle matching folds open and closed in all windows,
-    " if dynamic folding is active.
-    if s:settings.dynamic_folds
-      call append(style_start, [
-	    \  "  function toggleFold(objID)",
-	    \  "  {",
-	    \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
-	    \  "    {",
-	    \  "      var fold;",
-	    \  '      fold = document.getElementById("win"+win_num+objID);',
-	    \  "      if(fold.className == 'closed-fold')",
-	    \  "      {",
-	    \  "        fold.className = 'open-fold';",
-	    \  "      }",
-	    \  "      else if (fold.className == 'open-fold')",
-	    \  "      {",
-	    \  "        fold.className = 'closed-fold';",
-	    \  "      }",
-	    \  "    }",
-	    \  "  }",
-	    \ ])
-    endif
+      if s:settings.line_ids
+	call append(style_start, [
+	      \ "",
+	      \ "/* function to open any folds containing a jumped-to line before jumping to it */",
+	      \ "function JumpToLine()",
+	      \ "{",
+	      \ "  var lineNum;",
+	      \ "  lineNum = window.location.hash;",
+	      \ "  lineNum = lineNum.substr(1); /* strip off '#' */",
+	      \ "",
+	      \ "  if (lineNum.indexOf('L') == -1) {",
+	      \ "    lineNum = 'L'+lineNum;",
+	      \ "  }",
+	      \ "  if (lineNum.indexOf('W') == -1) {",
+	      \ "    lineNum = 'W1'+lineNum;",
+	      \ "  }",
+	      \ "  var lineElem = document.getElementById(lineNum);"
+	      \ ])
+      endif
 
-    if s:uses_script
-      " insert script tag if needed
-      call append(style_start, [
-	    \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
-	    \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
-    endif
+      " Insert javascript to toggle matching folds open and closed in all windows,
+      " if dynamic folding is active.
+      if s:settings.dynamic_folds
+	call append(style_start, [
+	      \  "  function toggleFold(objID)",
+	      \  "  {",
+	      \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
+	      \  "    {",
+	      \  "      var fold;",
+	      \  '      fold = document.getElementById("win"+win_num+objID);',
+	      \  "      if(fold.className == 'closed-fold')",
+	      \  "      {",
+	      \  "        fold.className = 'open-fold';",
+	      \  "      }",
+	      \  "      else if (fold.className == 'open-fold')",
+	      \  "      {",
+	      \  "        fold.className = 'closed-fold';",
+	      \  "      }",
+	      \  "    }",
+	      \  "  }",
+	      \ ])
+      endif
 
-    " Insert styles from all the generated html documents and additional styles
-    " for the table-based layout of the side-by-side diff. The diff should take
-    " up the full browser window (but not more), and be static in size,
-    " horizontally scrollable when the lines are too long. Otherwise, the diff
-    " is pretty useless for really long lines. {{{
-    if s:settings.use_css
-      call append(style_start,
-	    \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
-	    \ style+
-	    \ [ s:settings.use_xhtml ? '' : '<!--',
-	    \   'table { table-layout: fixed; }',
-	    \   'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
-	    \   'table, td, th { border: 1px solid; }',
-	    \   'td { vertical-align: top; }',
-	    \   'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
-	    \   'td div { overflow: auto; }',
-	    \   s:settings.use_xhtml ? '' : '-->',
-	    \   '</style>'
-	    \])
-    endif "}}}
+      if s:uses_script
+	" insert script tag if needed
+	call append(style_start, [
+	      \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
+	      \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+      endif
+
+      " Insert styles from all the generated html documents and additional styles
+      " for the table-based layout of the side-by-side diff. The diff should take
+      " up the full browser window (but not more), and be static in size,
+      " horizontally scrollable when the lines are too long. Otherwise, the diff
+      " is pretty useless for really long lines. {{{
+      if s:settings.use_css
+	call append(style_start,
+	      \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
+	      \ style+
+	      \ [ s:settings.use_xhtml ? '' : '<!--',
+	      \   'table { table-layout: fixed; }',
+	      \   'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
+	      \   'table, td, th { border: 1px solid; }',
+	      \   'td { vertical-align: top; }',
+	      \   'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
+	      \   'td div { overflow: auto; }',
+	      \   s:settings.use_xhtml ? '' : '-->',
+	      \   '</style>'
+	      \])
+      endif "}}}
+    endif
   endif
 
   let &paste = s:old_paste
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt*	For Vim version 9.0.  Last change: 2022 Dec 23
+*builtin.txt*	For Vim version 9.0.  Last change: 2023 Jan 17
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
--- a/runtime/doc/diff.txt
+++ b/runtime/doc/diff.txt
@@ -1,4 +1,4 @@
-*diff.txt*      For Vim version 9.0.  Last change: 2022 Dec 24
+*diff.txt*      For Vim version 9.0.  Last change: 2023 Jan 21
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -136,7 +136,7 @@ file for a moment and come back to the s
 		buffers.
 
 The `:diffoff` command resets the relevant options to the values they had when
-using `:diffsplit`, `:diffpatch` , `:diffthis`. or starting Vim in diff mode.
+using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode.
 When using `:diffoff` twice the last saved values are restored.
 Otherwise they are set to their default value:
 
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 9.0.  Last change: 2023 Jan 03
+*eval.txt*	For Vim version 9.0.  Last change: 2023 Jan 12
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
--- a/runtime/doc/fold.txt
+++ b/runtime/doc/fold.txt
@@ -1,4 +1,4 @@
-*fold.txt*      For Vim version 9.0.  Last change: 2022 Nov 26
+*fold.txt*      For Vim version 9.0.  Last change: 2023 Jan 29
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -202,7 +202,7 @@ non-matching marker pairs.  Example: >
 
 	/* funcB() {{{2 */
 	void funcB() {}
-
+<							*{{{* *}}}*
 A fold starts at a "{{{" marker.  The following number specifies the fold
 level.  What happens depends on the difference between the current fold level
 and the level given by the marker:
--- a/runtime/doc/ft_context.txt
+++ b/runtime/doc/ft_context.txt
@@ -48,7 +48,7 @@ typesetting command. That must be a func
 command as a List. For example:
 >
 	def ConTeXtCustomCommand(path: string): list<string>
-	  return ['mtxrun', '--script', 'context', '--nonstopmode, path]
+	  return ['mtxrun', '--script', 'context', '--nonstopmode', path]
 	enddef
 
 	context.ConTeXtTypeset("%", v:none, ConTeXtCustomCommand)
--- a/runtime/doc/ft_mp.txt
+++ b/runtime/doc/ft_mp.txt
@@ -84,7 +84,7 @@ METAFONT buffers, and it is set to 0 by 
 Define additional keywords that end indented blocks. For instance, if you
 define:
 >
-	g:mp_end_tag = ['\<endfoo\>']
+	g:mp_close_tag = ['\<endfoo\>']
 <
 any line starting with `endfoo` will be de-indented compared to its previous
 line.
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 9.0.  Last change: 2023 Jan 02
+*options.txt*	For Vim version 9.0.  Last change: 2023 Feb 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -1899,7 +1899,7 @@ A jump table for the options with a shor
 
 	'allowrevins'	+ off		no CTRL-_ command
 	'antialias'	+ off		don't use antialiased fonts
-	'arabic'	+ off	 	reset arabic-related options
+	'arabic'	+ off		reset arabic-related options
 	'arabicshape'	+ on		correct character shapes
 	'backspace'	+ ""		normal backspace
 	'backup'	+ off		no backup file
@@ -4943,7 +4943,7 @@ A jump table for the options with a shor
 	empty.  Then set the 'term' option to have it take effect: >
 		set keyprotocol=
 		let &term = &term
-
+<
 
 					*'keywordprg'* *'kp'*
 'keywordprg' 'kp'	string	(default "man" or "man -s",  DOS: ":help",
@@ -5201,8 +5201,8 @@ A jump table for the options with a shor
 			are left blank.
 							*lcs-multispace*
 	  multispace:c...
-	 		One or more characters to use cyclically to show for
-	 		multiple consecutive spaces.  Overrides the "space"
+			One or more characters to use cyclically to show for
+			multiple consecutive spaces.  Overrides the "space"
 			setting, except for single spaces.  When omitted, the
 			"space" setting is used.  For example,
 			`:set listchars=multispace:---+` shows ten consecutive
@@ -7784,8 +7784,8 @@ A jump table for the options with a shor
 	      windows.
 	* -   Set highlight group to User{N}, where {N} is taken from the
 	      minwid field, e.g. %1*.  Restore normal highlight with %* or %0*.
-	      The difference between User{N} and StatusLine  will be applied
-	      to StatusLineNC for the statusline of non-current windows.
+	      The difference between User{N} and StatusLine will be applied to
+	      StatusLineNC for the statusline of non-current windows.
 	      The number N must be between 1 and 9.  See |hl-User1..9|
 
 	When displaying a flag, Vim removes the leading comma, if any, when
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -1,4 +1,4 @@
-*quickfix.txt*  For Vim version 9.0.  Last change: 2022 Sep 26
+*quickfix.txt*  For Vim version 9.0.  Last change: 2023 Jan 18
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -365,8 +365,6 @@ processing a quickfix or location list c
 			If numbers [from] and/or [to] are given, the respective
 			range of errors is listed.  A negative number counts
 			from the last error backwards, -1 being the last error.
-			The 'switchbuf' settings are respected when jumping
-			to a buffer.
 			The |:filter| command can be used to display only the
 			quickfix entries matching a supplied pattern. The
 			pattern is matched against the filename, module name,
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -438,8 +438,10 @@
 'keymap'	options.txt	/*'keymap'*
 'keymodel'	options.txt	/*'keymodel'*
 'keyprotocol'	options.txt	/*'keyprotocol'*
+'keywordprg'	options.txt	/*'keywordprg'*
 'km'	options.txt	/*'km'*
 'kmp'	options.txt	/*'kmp'*
+'kp'	options.txt	/*'kp'*
 'kpc'	options.txt	/*'kpc'*
 'langmap'	options.txt	/*'langmap'*
 'langmenu'	options.txt	/*'langmenu'*
@@ -4416,6 +4418,11 @@ E1351	vim9class.txt	/*E1351*
 E1352	vim9class.txt	/*E1352*
 E1353	vim9class.txt	/*E1353*
 E1354	vim9class.txt	/*E1354*
+E1355	vim9class.txt	/*E1355*
+E1356	vim9class.txt	/*E1356*
+E1357	vim9class.txt	/*E1357*
+E1358	vim9class.txt	/*E1358*
+E1359	vim9class.txt	/*E1359*
 E136	starting.txt	/*E136*
 E137	starting.txt	/*E137*
 E138	starting.txt	/*E138*
@@ -5633,6 +5640,7 @@ View	starting.txt	/*View*
 Vim9	vim9.txt	/*Vim9*
 Vim9-abstract-class	vim9class.txt	/*Vim9-abstract-class*
 Vim9-class	vim9class.txt	/*Vim9-class*
+Vim9-class-member	vim9class.txt	/*Vim9-class-member*
 Vim9-class-overview	vim9class.txt	/*Vim9-class-overview*
 Vim9-enum	vim9class.txt	/*Vim9-enum*
 Vim9-script	vim9.txt	/*Vim9-script*
@@ -6311,7 +6319,6 @@ cino-}	indent.txt	/*cino-}*
 cinoptions-values	indent.txt	/*cinoptions-values*
 class	vim9class.txt	/*class*
 class-function	vim9class.txt	/*class-function*
-class-member	vim9class.txt	/*class-member*
 clear-undo	undo.txt	/*clear-undo*
 clearmatches()	builtin.txt	/*clearmatches()*
 client-server	remote.txt	/*client-server*
@@ -7558,6 +7565,7 @@ getbufinfo()	builtin.txt	/*getbufinfo()*
 getbufline()	builtin.txt	/*getbufline()*
 getbufoneline()	builtin.txt	/*getbufoneline()*
 getbufvar()	builtin.txt	/*getbufvar()*
+getcellwidths()	builtin.txt	/*getcellwidths()*
 getchangelist()	builtin.txt	/*getchangelist()*
 getchar()	builtin.txt	/*getchar()*
 getcharmod()	builtin.txt	/*getcharmod()*
@@ -10042,6 +10050,7 @@ t_channel-variable	eval.txt	/*t_channel-
 t_ci	version4.txt	/*t_ci*
 t_cil	version4.txt	/*t_cil*
 t_cl	term.txt	/*t_cl*
+t_class-variable	eval.txt	/*t_class-variable*
 t_cm	term.txt	/*t_cm*
 t_cri	version4.txt	/*t_cri*
 t_cs	term.txt	/*t_cs*
@@ -10106,6 +10115,7 @@ t_ms	term.txt	/*t_ms*
 t_nd	term.txt	/*t_nd*
 t_none-variable	eval.txt	/*t_none-variable*
 t_number-variable	eval.txt	/*t_number-variable*
+t_object-variable	eval.txt	/*t_object-variable*
 t_op	term.txt	/*t_op*
 t_se	term.txt	/*t_se*
 t_sf1	version4.txt	/*t_sf1*
@@ -10614,6 +10624,7 @@ v:t_TYPE	eval.txt	/*v:t_TYPE*
 v:t_blob	eval.txt	/*v:t_blob*
 v:t_bool	eval.txt	/*v:t_bool*
 v:t_channel	eval.txt	/*v:t_channel*
+v:t_class	eval.txt	/*v:t_class*
 v:t_dict	eval.txt	/*v:t_dict*
 v:t_float	eval.txt	/*v:t_float*
 v:t_func	eval.txt	/*v:t_func*
@@ -10621,6 +10632,7 @@ v:t_job	eval.txt	/*v:t_job*
 v:t_list	eval.txt	/*v:t_list*
 v:t_none	eval.txt	/*v:t_none*
 v:t_number	eval.txt	/*v:t_number*
+v:t_object	eval.txt	/*v:t_object*
 v:t_string	eval.txt	/*v:t_string*
 v:termblinkresp	eval.txt	/*v:termblinkresp*
 v:termrbgresp	eval.txt	/*v:termrbgresp*
@@ -11208,6 +11220,8 @@ zz	scroll.txt	/*zz*
 {rhs}	map.txt	/*{rhs}*
 {server}	remote.txt	/*{server}*
 {subject}	helphelp.txt	/*{subject}*
+{{{	fold.txt	/*{{{*
 {}	intro.txt	/*{}*
 }	motion.txt	/*}*
+}}}	fold.txt	/*}}}*
 ~	change.txt	/*~*
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -1,4 +1,4 @@
-*term.txt*      For Vim version 9.0.  Last change: 2023 Jan 09
+*term.txt*      For Vim version 9.0.  Last change: 2023 Jan 15
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -322,9 +322,14 @@ using the "xterm" workaround.  These are
 	PS	"\033[200~"	pasted text start |t_PS|
 	PE	"\033[201~"	pasted text end |t_PE|
 
-	XM	"\033[?1006;1000%?%p1%{1}%=%th%el%;"
+	XM	"\033[?1006;1004;1000%?%p1%{1}%=%th%el%;"
 				mouse enable / disable |t_XM|
 
+The "XM" entry includes "1006" to enable SGR style mouse reporting.  This
+supports columns above 223.  It also includes "1004" which enables focus
+reporting.  The t_fe and t_fd entries can be left empty (they don't have
+entries in terminfo/termcap anyway).
+
 						*xterm-kitty* *kitty-terminal*
 The Kitty terminal is a special case.  Mainly because it works differently
 from most other terminals, but also because, instead of trying the fit in and
--- a/runtime/doc/testing.txt
+++ b/runtime/doc/testing.txt
@@ -223,12 +223,12 @@ test_ignore_error({expr})			 *test_ignor
 		Can also be used as a |method|: >
 			GetErrorText()->test_ignore_error()
 
-				
+
 test_mswin_event({event}, {args})		*test_mswin_event()*
 		Generate a low-level MS-Windows {event} with arguments {args}
-		for testing Vim functionality.  It works for MS-Windows GUI 
+		for testing Vim functionality.  It works for MS-Windows GUI
 		and for the console.
-		
+
 		{event} is a String and the supported values are:
 		    "mouse"	mouse event.
 		    "key"	keyboard event.
--- a/runtime/doc/textprop.txt
+++ b/runtime/doc/textprop.txt
@@ -108,7 +108,7 @@ prop_type_list([{props}])		get list of p
 Manipulating text properties:
 
 prop_add({lnum}, {col}, {props})  	add a text property
-prop_add_list({props}, [[{lnum}, {col}, {end-lnum}, {end-col}], ...])
+prop_add_list({props}, [{item}, ...])
 					add a text property at multiple
 					positions.
 prop_clear({lnum} [, {lnum-end} [, {bufnr}]])
@@ -263,12 +263,12 @@ prop_add_list({props}, [{item}, ...])
 		It is not possible to add a text property with a "text" field
 		here.
 
-		Example:
+		Example: >
 			call prop_add_list(#{type: 'MyProp', id: 2},
 					\ [[1, 4, 1, 7],
 					\  [1, 15, 1, 20],
 					\  [2, 30, 3, 30]]
-
+<
 		Can also be used as a |method|: >
 			GetProp()->prop_add_list([[1, 1, 1, 2], [1, 4, 1, 8]])
 
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 9.0.  Last change: 2023 Jan 09
+*todo.txt*      For Vim version 9.0.  Last change: 2023 Feb 02
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -38,6 +38,13 @@ browser use: https://github.com/vim/vim/
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+Errors when running tests with valgrind:
+- test_codestyle.vim:  e.g.:
+    command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7
+    command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 10: setup.vim: trailing white space: Expected 0 but got 23
+- test_gui.vim:
+    Found errors in Test_gui_mouse_event():
+
 Upcoming larger works:
 - Make spell checking work with recent .dic/.aff files, e.g. French.  #4916
     Make Vim understand the format somehow?   Search for "spell" below.
@@ -53,18 +60,29 @@ Upcoming larger works:
 
 
 Further Vim9 improvements, possibly after launch:
-- implement :class and :interface: See |vim9-classes|  #11544
-    inheritance: how about super()?
-    inheritance: new() method from parent used in child?
-    import/export of a class
-    type() should return different type for each class?
-    give error for shadowing (variable and argument) when defining a class or
-    interface, not later when compiling it.
-    object empty(), len() - can class define a method to be used for them?
-    how about lock/unlock?
-    When checking "implements" also check types of members and function args.
+- implement :class and :interface: See |vim9-classes
+  - Change access: public by default, private by prefixing "_".
+	Check for error: can't have same name twice (ignoring "_" prefix).
+  - Private methods?
+	either: private def Func()
+	    or: def _Func()
+    Perhaps use "private" keyword instead of "_" prefix?
+  - "final" object members - can only be set in the constructor.
+  - object empty(), len() - can class define a method to be used for them?
+  - how about lock/unlock?
+  - When checking "implements" also check types of members and function args.
+  - For chaining, allow using the class name as type for function return
+    value.
+  - Implement generics
+  - Add "instanceof"
+  - More efficient way for interface member index than iterating over list?
+  - a variant of type() that returns a different type for each class?
+      list<number> and list<string> should also differ.
+  - Issue #11822: any.Func() can be a dict or an object call, need to handle
+    this at runtime.
 - implement :type
 - implement :enum
+- class local to a function
 - Use Vim9 for more runtime files.
 - Inline call to map() and filter(), better type checking.
 - When evaluating constants for script variables, some functions could work:
@@ -72,16 +90,19 @@ Further Vim9 improvements, possibly afte
 - Implement as part of an expression: ++expr, --expr, expr++, expr--.
 
 Information missing in terminfo:
-Priority:
 - t_RV	request terminal version string; xterm:	"\033[>c"
-    change in terminfo for "RV" uses the wrong escape sequence... ?
-Mouse support:
-    on/off: hard coded in mch_setmouse() - use "XM" terminfo/termcap entry;
-       If it starts with "\E[?1006;1000%" then set 'ttymouse' to "sgr".
+    change in terminfo for "RV" uses the wrong escape sequence 7 - 14 Jan only
 Codes used for focus gained and lost (currently using use_xterm_like_mouse())
   termcodes are hard-coded in set_termname(), not named.
+    Use the XF flag?  enables recognizing the focus in/out events.
+    Check if t_fe is not empty.
+    Check for "1004" in t_XM. (disadvantage: only focus events when mouse is
+    used)
 - t_fe	enable focus-event tracking
 - t_fd	disable focus-event tracking
+Modifiers for various keys
+- Decode kitty key protocol Meta and use MOD_MASK_META.  Document <T-k>
+- flag to indicate "xterm compatible modifiers" ?
 Underline and similar:
 - t_AU - Set underline color: like "AF" and "AB" entries.
 - t_Ce	undercurl and underline end
@@ -124,6 +145,8 @@ Probably Vim internal, not in terminfo:
 - t_RK	request terminal keyboard protocol state; sent after |t_TI|
 Already working, not properly documented:
 - t_u7	request cursor position
+Also, with Alt-b we get â, with Alt-Shift-b we should bet another character.
+That does not appear to work with Kitty.  #11913
 
 Popup windows:
 - Add a function to redraw a specific popup window.  Esp. to be used when
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1,4 +1,4 @@
-*usr_41.txt*	For Vim version 9.0.  Last change: 2022 Dec 20
+*usr_41.txt*	For Vim version 9.0.  Last change: 2023 Jan 17
 
 		     VIM USER MANUAL - by Bram Moolenaar
 
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -105,7 +105,7 @@ script and `:def` functions; details are
 	`:open`
 	`:s`  with only flags
 	`:t`
-  	`:xit`
+	`:xit`
 - Some commands, especially those used for flow control, cannot be shortened.
   E.g., `:throw` cannot be written as `:th`.  *vim9-no-shorten*
 - You cannot use curly-braces names.
@@ -265,7 +265,7 @@ Detail: this is because "Inner" will act
 function with a generated name.
 
 It is not possible to define a script-local function in a function.  You can
-define a local function and assign it to a script-local funcref (it must have
+define a local function and assign it to a script-local Funcref (it must have
 been declared at the script level).  It is possible to define a global
 function by using the "g:" prefix.
 
@@ -388,7 +388,6 @@ used: >
 	echo temp  # Error!
 
 This is especially useful in a user command: >
-
 	command -range Rename {
 		 var save = @a
 		 @a = 'some expression'
@@ -397,7 +396,6 @@ This is especially useful in a user comm
 	    }
 
 And with autocommands: >
-
    au BufWritePre *.go {
 		 var save = winsaveview()
 		 silent! exe ':%! some formatting command'
@@ -746,7 +744,7 @@ continuation is used without a backslash
 							*E1050*
 To make it possible for the operator at the start of the line to be
 recognized, it is required to put a colon before a range.  This example will
-add "start" and print: >
+add "start" and "print": >
 	var result = start
 	+ print
 Like this: >
@@ -805,7 +803,7 @@ Notes:
 	echo [1, 2]
 		[3, 4]
 - In some cases it is difficult for Vim to parse a command, especially when
-  commands are used as an argument to another command, such as `windo`.  In
+  commands are used as an argument to another command, such as `:windo`.  In
   those cases the line continuation with a backslash has to be used.
 
 
@@ -1311,7 +1309,7 @@ Closures defined in a loop will share th
 <							*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.
+when a function is marked for debugging with `:breakadd` after it was compiled.
 Make sure to define the breakpoint before compiling the outer function.
 
 The "inloop" variable will exist only once, all closures put in the list refer
@@ -1353,7 +1351,7 @@ closure: >
 	}
 	endfor
 
-Using `echowindow` is useful in a timer, the messages go into a popup and will
+Using `:echowindow` is useful in a timer, the messages go into a popup and will
 not interfere with what the user is doing when it triggers.
 
 
@@ -1594,7 +1592,7 @@ That is because the declaration looks li
 equivalent to: >
 	var ll: list<number> = [1, 2, 3]
 If you do want a more permissive list you need to declare the type: >
-	var ll: list<any = [1, 2, 3]
+	var ll: list<any> = [1, 2, 3]
 	ll->extend(['x'])  # OK
 
 
--- a/runtime/doc/vim9class.txt
+++ b/runtime/doc/vim9class.txt
@@ -1,21 +1,22 @@
-*vim9class.txt*	For Vim version 9.0.  Last change: 2023 Jan 09
+*vim9class.txt*	For Vim version 9.0.  Last change: 2023 Jan 17
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
 
 
-NOTE - This is under development, anything can still change! - NOTE
+NOTE - This is not finished yet, anything can still change! - NOTE
 
 
 Vim9 classes, objects, interfaces, types and enums.
 
 1.  Overview			|Vim9-class-overview|
 2.  A simple class		|Vim9-simple-class|
-3.  Using an abstract class	|Vim9-abstract-class|
-4.  Using an interface		|Vim9-using-interface|
-5.  More class details		|Vim9-class|
-6.  Type definition		|Vim9-type|
-7.  Enum			|Vim9-enum|
+3.  Class members and functions	|Vim9-class-member|
+4.  Using an abstract class	|Vim9-abstract-class|
+5.  Using an interface		|Vim9-using-interface|
+6.  More class details		|Vim9-class|
+7.  Type definition		|Vim9-type|
+8.  Enum			|Vim9-enum|
 
 9.  Rationale
 10. To be done later
@@ -25,25 +26,25 @@ 10. To be done later
 1. Overview					*Vim9-class-overview*
 
 The fancy term is "object-oriented programming".  You can find lots of study
-material about this subject.  Here we document what |Vim9| script provides,
-assuming you know the basics already.  Added are helpful hints about how
-to use this functionality effectively.
+material on this subject.  Here we document what |Vim9| script provides,
+assuming you know the basics already.  Added are helpful hints about how to
+use this functionality effectively.
 
 The basic item is an object:
 - An object stores state.  It contains one or more variables that can each
   have a value.
-- An object usually provides functions that manipulate its state.  These
+- An object provides functions that use and manipulate its state.  These
   functions are invoked "on the object", which is what sets it apart from the
   traditional separation of data and code that manipulates the data.
 - An object has a well defined interface, with typed member variables and
   member functions.
-- Objects are created by a class and all objects have the same interface.
-  This never changes, it is not dynamic.
+- Objects are created from a class and all objects have the same interface.
+  This does not change at runtime, it is not dynamic.
 
 An object can only be created by a class.  A class provides:
 - A new() method, the constructor, which returns an object for the class.
   This method is invoked on the class name: MyClass.new().
-- State shared by all objects of the class: class variables and constants.
+- State shared by all objects of the class: class variables (class members).
 - A hierarchy of classes, with super-classes and sub-classes, inheritance.
 
 An interface is used to specify properties of an object:
@@ -62,17 +63,18 @@ teachers use real-world objects to expla
 your model should therefore reflect the real world.  It doesn't!  The model
 should match your purpose.
 
-You will soon find that composition is often better than inheritance.  Don't
-waste time trying to find the optimal class model.  Or waste time discussing
-whether a square is a rectangle or that a rectangle is a square.  It doesn't
-matter.
+Keep in mind that composition (an object contains other objects) is often
+better than inheritance (an object extends another object).  Don't waste time
+trying to find the optimal class model.  Or waste time discussing whether a
+square is a rectangle or that a rectangle is a square.  It doesn't matter.
 
 
 ==============================================================================
 
 2.  A simple class				*Vim9-simple-class*
 
-Let's start with a simple example: a class that stores a text position: >
+Let's start with a simple example: a class that stores a text position (see
+below for how to do this more efficiently): >
 
 	class TextPosition
 	   this.lnum: number
@@ -107,7 +109,7 @@ The object members "lnum" and "col" can 
 <							*E1317* *E1327*
 If you have been using other object-oriented languages you will notice that
 in Vim the object members are consistently referred to with the "this."
-prefix.  This is different from languages like Java and TypeScript.  This
+prefix.  This is different from languages like Java and TypeScript.  The
 naming convention makes the object members easy to spot.  Also, when a
 variable does not have the "this." prefix you know it is not an object member.
 
@@ -117,9 +119,9 @@ Member write access ~
 Now try to change an object member directly: >
 
 	pos.lnum = 9
-<								*E1335*
+<							*E1335*
 This will give you an error!  That is because by default object members can be
-read but not set.  That's why the class provides a method for it: >
+read but not set.  That's why the TextPosition class provides a method for it: >
 
 	pos.SetLnum(9)
 
@@ -128,12 +130,12 @@ way.  Most often there is no problem usi
 have side effects that need to be taken care of.  In this case, the SetLnum()
 method could check if the line number is valid and either give an error or use
 the closest valid value.
-						*:public* *E1331*
+							*:public* *E1331*
 If you don't care about side effects and want to allow the object member to be
 changed at any time, you can make it public: >
 
 	public this.lnum: number
-	public this.col number
+	public this.col: number
 
 Now you don't need the SetLnum(), SetCol() and SetPosition() methods, setting
 "pos.lnum" directly above will no longer give an error.
@@ -153,7 +155,7 @@ name: >
 	this._col number
 
 Now you need to provide methods to get the value of the private members.
-These are commonly call getters.  We recommend using a name that starts with
+These are commonly called getters.  We recommend using a name that starts with
 "Get": >
 
 	def GetLnum(): number
@@ -181,6 +183,7 @@ Simplifying the new() method ~
 Many constructors take values for the object members.  Thus you very often see
 this pattern: >
 
+	 class SomeClass
 	   this.lnum: number
 	   this.col: number
 
@@ -188,6 +191,7 @@ this pattern: >
 	      this.lnum = lnum
 	      this.col = col
 	   enddef
+	 endclass
 
 Not only is this text you need to write, it also has the type of each member
 twice.  Since this is so common a shorter way to write new() is provided: >
@@ -197,8 +201,24 @@ twice.  Since this is so common a shorte
 
 The semantics are easy to understand: Providing the object member name,
 including "this.", as the argument to new() means the value provided in the
-new() call is assigned to that object member.  This mechanism is coming from
-the Dart language.
+new() call is assigned to that object member.  This mechanism comes from the
+Dart language.
+
+Putting together this way of using new() and making the members public results
+in a much shorter class definition as what we started with: >
+
+	class TextPosition
+	   public this.lnum: number
+	   public this.col: number
+
+	   def new(this.lnum, this.col)
+	   enddef
+
+	   def SetPosition(lnum: number, col: number)
+	      this.lnum = lnum
+	      this.col = col
+	   enddef
+	 endclass
 
 The sequence of constructing a new object is:
 1. Memory is allocated and cleared.  All values are zero/false/empty.
@@ -208,22 +228,69 @@ 2. For each declared member that has an 
 3. Arguments in the new() method in the "this.name" form are assigned.
 4. The body of the new() method is executed.
 
-TODO: for a sub-class the constructor of the parent class will be invoked
-somewhere.
-
+If the class extends a parent class, the same thing happens.  In the second
+step the members of the parent class are done first.  There is no need to call
+"super()" or "new()" on the parent.
 
 ==============================================================================
 
-3.  Using an abstract class			*Vim9-abstract-class*
+3.  class members and functions			*Vim9-class-member*
+
+						*:static* *E1337* *E1338*
+Class members are declared with "static".  They are used by the name without a
+prefix: >
+
+	class OtherThing
+	   this.size: number
+	   static totalSize: number
+
+	   def new(this.size)
+	      totalSize += this.size
+	   enddef
+	endclass
+<							*E1340* *E1341*
+Since the name is used as-is, shadowing the name by a function argument name
+or local variable name is not allowed.
+
+Just like object members the access can be made private by using an underscore
+as the first character in the name, and it can be made public by prefixing
+"public": >
+
+    class OtherThing
+	static total: number	      # anybody can read, only class can write
+	static _sum: number	      # only class can read and write
+	public static result: number  # anybody can read and write
+    endclass
+<
+							*class-function*
+Class functions are also declared with "static".  They have no access to
+object members, they cannot use the "this" keyword. >
+
+	class OtherThing
+	   this.size: number
+	   static totalSize: number
+
+	   # Clear the total size and return the value it had before.
+	   static def ClearTotalSize(): number
+	      var prev = totalSize
+	      totalSize = 0
+	      return prev
+	   enddef
+	endclass
+
+Inside the class the function can be called by name directly, outside the
+class the class name must be prefixed: `OtherThing.ClearTotalSize()`.
+
+==============================================================================
+
+4.  Using an abstract class			*Vim9-abstract-class*
 
 An abstract class forms the base for at least one sub-class.  In the class
 model one often finds that a few classes have the same properties that can be
-shared, but a class with those properties does not have enough state to create
+shared, but a class with these properties does not have enough state to create
 an object from.  A sub-class must extend the abstract class and add the
 missing state and/or methods before it can be used to create objects for.
 
-An abstract class does not have a new() method.
-
 For example, a Shape class could store a color and thickness.  You cannot
 create a Shape object, it is missing the information about what kind of shape
 it is.  The Shape class functions as the base for a Square and a Triangle
@@ -249,51 +316,13 @@ class, for which objects can be created.
 	   enddef
 	endclass
 <
-					*class-member* *:static* *E1337* *E1338*
-Class members are declared with "static".  They are used by the name without a
-prefix: >
-
-	class OtherThing
-	   this.size: number
-	   static totalSize: number
-
-	   def new(this.size)
-	      totalSize += this.size
-	   enddef
-	endclass
-<							*E1340* *E1341*
-Since the name is used as-is, shadowing the name by a function argument name
-or variable name is not allowed.
-
-Just like object members the access can be made private by using an underscore
-as the first character in the name, and it can be made public by prefixing
-"public": >
-	class OtherThing
-	   static total: number	# anybody can read, only class can write
-	   static _sum: number		# only class can read and write
-	   public static result: number	# anybody can read and write
-	endclass
-<
-						*class-function*
-Class functions are also declared with "static".  They have no access to
-object members, they cannot use the "this" keyword. >
-
-	class OtherThing
-	   this.size: number
-	   static totalSize: number
-
-	   " Clear the total size and return the value it had before. 
-	   static def ClearTotalSize(): number
-	      var prev = totalSize
-	      totalSize = 0
-	      return prev
-	   enddef
-	endclass
+An abstract class is defined the same way as a normal class, except that it
+does not have any new() method. *E1359*
 
 
 ==============================================================================
 
-4.  Using an interface				*Vim9-using-interface*
+5.  Using an interface				*Vim9-using-interface*
 
 The example above with Shape, Square and Triangle can be made more useful if
 we add a method to compute the surface of the object.  For that we create the
@@ -348,7 +377,7 @@ The interface name can be used as a type
 
 ==============================================================================
 
-5.  More class details				*Vim9-class* *Class* *class*
+6.  More class details				*Vim9-class* *Class* *class*
 
 Defining a class ~
 					*:class* *:endclass* *:abstract*
@@ -386,12 +415,52 @@ once.  They can appear in any order, alt
 	extends ClassName
 	implements InterfaceName, OtherInterface
 	specifies SomeInterface
-<							*extends*
+<							*E1355*
+Each member and function name can be used only once.  It is not possible to
+define a function with the same name and different type of arguments.
+
+
+Extending a class ~
+							*extends*
 A class can extend one other class. *E1352* *E1353* *E1354*
+The basic idea is to build on top of an existing class, add properties to it.
+
+The extended class is called the "base class" or "super class".  The new class
+is called the "child class".
+
+Object members from the base class are all taken over by the child class.  It
+is not possible to override them (unlike some other languages).
+
+						*E1356* *E1357* *E1358*
+Object methods of the base class can be overruled.  The signature (arguments,
+argument types and return type) must be exactly the same.  The method of the
+base class can be called by prefixing "super.".
+
+Other object methods of the base class are taken over by the child class.
+
+Class functions, including functions starting with "new", can be overruled,
+like with object methods.  The function on the base class can be called by
+prefixing the name of the class (for class functions) or "super.".
+
+Unlike other languages, the constructor of the base class does not need to be
+invoked.  In fact, it cannot be invoked.  If some initialization from the base
+class also needs to be done in a child class, put it in an object method and
+call that method from every constructor().
+
+If the base class did not specify a new() function then one was automatically
+created.  This function will not be taken over by the child class.  The child
+class can define its own new() function, or, if there isn't one, a new()
+function will be added automatically.
+
+
+A class implementing an interface ~
 						*implements* *E1346* *E1347*
 A class can implement one or more interfaces.  The "implements" keyword can
 only appear once *E1350* .  Multiple interfaces can be specified, separated by
 commas.  Each interface name can appear only once. *E1351*
+
+
+A class defining an interface ~
 							*specifies*
 A class can declare its interface, the object members and methods, with a
 named interface.  This avoids the need for separately specifying the
@@ -528,7 +597,7 @@ constructor methods.
 
 ==============================================================================
 
-6.  Type definition					*Vim9-type* *:type*
+7.  Type definition					*Vim9-type* *:type*
 
 A type definition is giving a name to a type specification.  For Example: >
 
@@ -539,7 +608,7 @@ TODO: more explanation
 
 ==============================================================================
 
-7.  Enum					*Vim9-enum* *:enum* *:endenum*
+8.  Enum					*Vim9-enum* *:enum* *:endenum*
 
 An enum is a type that can have one of a list of values.  Example: >
 
@@ -639,7 +708,7 @@ Some languages support multiple inherita
 some cases, it makes the rules of how a class works quite complicated.
 Instead, using interfaces to declare what is supported is much simpler.  The
 very popular Java language does it this way, and it should be good enough for
-Vim.  The "keep it simple" rule applies here.  
+Vim.  The "keep it simple" rule applies here.
 
 Explicitly declaring that a class supports an interface makes it easy to see
 what a class is intended for.  It also makes it possible to do proper type
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2022 Dec 19
+" Last Change:	2023 Feb 02
 
 " Listen very carefully, I will say this only once
 if exists("did_load_filetypes")
--- a/runtime/ftplugin/debchangelog.vim
+++ b/runtime/ftplugin/debchangelog.vim
@@ -3,9 +3,9 @@
 " Maintainer:   Debian Vim Maintainers <team+vim@tracker.debian.org>
 " Former Maintainers:   Michael Piefel <piefel@informatik.hu-berlin.de>
 "                       Stefano Zacchiroli <zack@debian.org>
-" Last Change:  2022 Jul 25
+" Last Change:  2023 Jan 16
 " License:      Vim License
-" URL:          https://salsa.debian.org/vim-team/vim-debian/blob/master/ftplugin/debchangelog.vim
+" URL:          https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debchangelog.vim
 
 " Bug completion requires apt-listbugs installed for Debian packages or
 " python-launchpadlib installed for Ubuntu packages
@@ -35,14 +35,14 @@ if exists('g:did_changelog_ftplugin')
   finish
 endif
 
+" Don't load another plugin (this is global)
+let g:did_changelog_ftplugin = 1
+
 " Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
 " <CR> would not be recognized.  See ":help 'cpoptions'".
 let s:cpo_save = &cpo
 set cpo&vim
 
-" Don't load another plugin (this is global)
-let g:did_changelog_ftplugin = 1
-
 " {{{1 GUI menu
 
 " Helper functions returning various data.
--- a/runtime/ftplugin/debcontrol.vim
+++ b/runtime/ftplugin/debcontrol.vim
@@ -2,8 +2,8 @@
 " Language:     Debian control files
 " Maintainer:   Debian Vim Maintainers
 " Former Maintainer:    Pierre Habouzit <madcoder@debian.org>
-" Last Change:  2018-01-28
-" URL:          https://salsa.debian.org/vim-team/vim-debian/blob/master/ftplugin/debcontrol.vim
+" Last Change:  2023 Jan 16
+" URL:          https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debcontrol.vim
 
 " Do these settings once per buffer
 if exists('b:did_ftplugin')
--- a/runtime/ftplugin/logcheck.vim
+++ b/runtime/ftplugin/logcheck.vim
@@ -1,9 +1,9 @@
 " Vim filetype plugin file
 " Language:    Logcheck
 " Maintainer:  Debian Vim Maintainers
-" Last Change: 2018 Dec 27
+" Last Change: 2023 Jan 16
 " License:     Vim License
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/ftplugin/logcheck.vim
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/logcheck.vim
 
 if exists('b:did_ftplugin')
     finish
--- a/runtime/indent/testdir/vim.in
+++ b/runtime/indent/testdir/vim.in
@@ -887,3 +887,55 @@ if true
 elseif
 endif
 " END_INDENT
+
+" START_INDENT
+if (
+true)
+&& true
+echo
+endif
+" END_INDENT
+
+" START_INDENT
+abstract class Shape
+this.color = Color.Black
+this.thickness = 10
+endclass
+" END_INDENT
+
+" START_INDENT
+class OtherThing
+this.size: number
+static totalSize: number
+
+static def ClearTotalSize(): number
+var prev = totalSize
+totalSize = 0
+return prev
+enddef
+endclass
+" END_INDENT
+
+" START_INDENT
+interface HasSurface
+this.size: number
+def Surface(): number
+endinterface
+" END_INDENT
+
+" START_INDENT
+interface EnterExit
+def Enter(): void
+def Exit(): void
+endinterface
+" END_INDENT
+
+" START_INDENT
+enum Color
+White
+Red
+Green
+Blue
+Black
+endenum
+" END_INDENT
--- a/runtime/indent/testdir/vim.ok
+++ b/runtime/indent/testdir/vim.ok
@@ -887,3 +887,55 @@ if true
 elseif
 endif
 " END_INDENT
+
+" START_INDENT
+if (
+	true)
+	&& true
+    echo
+endif
+" END_INDENT
+
+" START_INDENT
+abstract class Shape
+    this.color = Color.Black
+    this.thickness = 10
+endclass
+" END_INDENT
+
+" START_INDENT
+class OtherThing
+    this.size: number
+    static totalSize: number
+
+    static def ClearTotalSize(): number
+	var prev = totalSize
+	totalSize = 0
+	return prev
+    enddef
+endclass
+" END_INDENT
+
+" START_INDENT
+interface HasSurface
+    this.size: number
+    def Surface(): number
+endinterface
+" END_INDENT
+
+" START_INDENT
+interface EnterExit
+    def Enter(): void
+    def Exit(): void
+endinterface
+" END_INDENT
+
+" START_INDENT
+enum Color
+    White
+    Red
+    Green
+    Blue
+    Black
+endenum
+" END_INDENT
--- a/runtime/plugin/tohtml.vim
+++ b/runtime/plugin/tohtml.vim
@@ -1,6 +1,6 @@
 " Vim plugin for converting a syntax highlighted file to HTML.
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2019 Nov 13
+" Last Change: 2023 Jan 01
 "
 " The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
 " $VIMRUNTIME/syntax/2html.vim
@@ -8,11 +8,23 @@
 if exists('g:loaded_2html_plugin')
   finish
 endif
-let g:loaded_2html_plugin = 'vim8.1_v2'
+let g:loaded_2html_plugin = 'vim9.0_v1'
 
 "
 " Changelog: {{{
-"   8.1_v2  (this version): - Fix Bitbucket issue #19: fix calculation of tab
+"   9.0_v1  (this version): - Implement g:html_no_doc and g:html_no_modeline
+"                             for diff mode. Add tests.
+"           (Vim 9.0.1122): NOTE: no version string update for this version!
+"                           - Bugfix for variable name in g:html_no_doc
+"           (Vim 9.0.0819): NOTE: no version string update for this version!
+"                           - Add options g:html_no_doc, g:html_no_lines,
+"                             and g:html_no_modeline (partially included in Vim
+"                             runtime prior to version string update).
+"                           - Updates for new Vim9 string append style (i.e. use
+"                             ".." instead of ".")
+"
+"   8.1 updates: {{{
+"   8.1_v2  (Vim 8.1.2312): - Fix SourceForge issue #19: fix calculation of tab
 "                             stop position to use in expanding a tab, when that
 "                             tab occurs after a syntax match which in turn
 "                             comes after previously expanded tabs.
@@ -20,17 +32,17 @@ let g:loaded_2html_plugin = 'vim8.1_v2'
 "                             destination file to ignore FileType events;
 "                             speeds up processing when the destination file
 "                             already exists and HTML highlight takes too long.
-"                           - Fix Bitbucket issue #20: progress bar could not be
+"                           - Fix SourceForge issue #20: progress bar could not be
 "                             seen when DiffDelete background color matched
 "                             StatusLine background color. Added TOhtmlProgress
 "                             highlight group for manual user override, but
 "                             calculate it to be visible compared to StatusLine
 "                             by default.
-"                           - Fix Bitbucket issue #1: Remove workaround for old
+"                           - Fix SourceForge issue #1: Remove workaround for old
 "                             browsers which don't support 'ch' CSS unit, since
 "                             all modern browsers, including IE>=9, support it.
-"                           - Fix Bitbucket issue #10: support termguicolors
-"                           - Fix Bitbucket issue #21: default to using
+"                           - Fix SourceForge issue #10: support termguicolors
+"                           - Fix SourceForge issue #21: default to using
 "                             generated content instead of <input> tags for
 "                             uncopyable text, so that text is correctly
 "                             prevented from being copied in chrome. Use
@@ -41,13 +53,14 @@ let g:loaded_2html_plugin = 'vim8.1_v2'
 "                           - Fix fallback sizing of <input> tags for browsers
 "                             without "ch" support.
 "                           - Fix cursor on unselectable diff filler text.
-"   8.1_v1  (Vim 8.1.0528): - Fix Bitbucket issue #6: Don't generate empty
+"   8.1_v1  (Vim 8.1.0528): - Fix SourceForge issue #6: Don't generate empty
 "                             script tag.
-"                           - Fix Bitbucket issue #5: javascript should
+"                           - Fix SourceForge issue #5: javascript should
 "                             declare variables with "var".
-"                           - Fix Bitbucket issue #13: errors thrown sourcing
+"                           - Fix SourceForge issue #13: errors thrown sourcing
 "                             2html.vim directly when plugins not loaded.
-"                           - Fix Bitbucket issue #16: support 'vartabstop'.
+"                           - Fix SourceForge issue #16: support 'vartabstop'.
+"}}}
 "
 "   7.4 updates: {{{
 "   7.4_v2  (Vim 7.4.0899): Fix error raised when converting a diff containing
@@ -152,7 +165,7 @@ let g:loaded_2html_plugin = 'vim8.1_v2'
 
 " TODO: {{{
 "   * Check the issue tracker:
-"     https://bitbucket.org/fritzophrenic/vim-tohtml/issues?status=new&status=open
+"     https://sourceforge.net/p/vim-tohtml/issues/search/?q=%21status%3Aclosed
 "   * Options for generating the CSS in external style sheets. New :TOcss
 "     command to convert the current color scheme into a (mostly) generic CSS
 "     stylesheet which can be re-used. Alternate stylesheet support? Good start
--- a/runtime/syntax/2html.vim
+++ b/runtime/syntax/2html.vim
@@ -1,6 +1,6 @@
 " Vim syntax support file
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2022 Dec 26
+" Last Change: 2023 Jan 01
 "
 " Additional contributors:
 "
--- a/runtime/syntax/automake.vim
+++ b/runtime/syntax/automake.vim
@@ -2,8 +2,8 @@
 " Language: automake Makefile.am
 " Maintainer: Debian Vim Maintainers
 " Former Maintainer: John Williams <jrw@pobox.com>
-" Last Change: 2018 Dec 27
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/automake.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/automake.vim
 "
 " XXX This file is in need of a new maintainer, Debian VIM Maintainers maintain
 "     it only because patches have been submitted for it by Debian users and the
--- a/runtime/syntax/debchangelog.vim
+++ b/runtime/syntax/debchangelog.vim
@@ -3,8 +3,8 @@
 " Maintainer:  Debian Vim Maintainers
 " Former Maintainers: Gerfried Fuchs <alfie@ist.org>
 "                     Wichert Akkerman <wakkerma@debian.org>
-" Last Change: 2022 Oct 29
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debchangelog.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debchangelog.vim
 
 " Standard syntax initialization
 if exists('b:current_syntax')
--- a/runtime/syntax/debcontrol.vim
+++ b/runtime/syntax/debcontrol.vim
@@ -3,8 +3,8 @@
 " Maintainer:  Debian Vim Maintainers
 " Former Maintainers: Gerfried Fuchs <alfie@ist.org>
 "                     Wichert Akkerman <wakkerma@debian.org>
-" Last Change: 2022 May 11
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debcontrol.vim
 
 " Standard syntax initialization
 if exists('b:current_syntax')
--- a/runtime/syntax/debcopyright.vim
+++ b/runtime/syntax/debcopyright.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:    Debian copyright file
 " Maintainer:  Debian Vim Maintainers
-" Last Change: 2019 Sep 07
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcopyright.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debcopyright.vim
 
 " Standard syntax initialization
 if exists('b:current_syntax')
--- a/runtime/syntax/debsources.vim
+++ b/runtime/syntax/debsources.vim
@@ -2,8 +2,8 @@
 " Language:     Debian sources.list
 " Maintainer:   Debian Vim Maintainers
 " Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl>
-" Last Change: 2022 Oct 29
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debsources.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debsources.vim
 
 " Standard syntax initialization
 if exists('b:current_syntax')
@@ -14,7 +14,7 @@ endif
 syn case match
 
 " A bunch of useful keywords
-syn match debsourcesKeyword        /\(deb-src\|deb\|main\|contrib\|non-free\|restricted\|universe\|multiverse\)/
+syn match debsourcesKeyword        /\(deb-src\|deb\|main\|contrib\|non-free\|non-free-firmware\|restricted\|universe\|multiverse\)/
 
 " Match comments
 syn match debsourcesComment        /#.*/  contains=@Spell
--- a/runtime/syntax/dep3patch.vim
+++ b/runtime/syntax/dep3patch.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:    Debian DEP3 Patch headers
 " Maintainer:  Gabriel Filion <gabster@lelutin.ca>
-" Last Change: 2022 Apr 06
-" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/dep3patch.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/dep3patch.vim
 "
 " Specification of the DEP3 patch header format is available at:
 "   https://dep-team.pages.debian.net/deps/dep3/
--- a/runtime/syntax/forth.vim
+++ b/runtime/syntax/forth.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:    FORTH
 " Current Maintainer:  Johan Kotlinski <kotlinski@gmail.com>
-" Previous Maintainer:  Christian V. J. Brüssow <cvjb@cvjb.de>
-" Last Change: 2018-03-29
+" Previous Maintainer:  Christian V. J. Br�ssow <cvjb@cvjb.de>
+" Last Change: 2023-01-12
 " Filenames:   *.fs,*.ft
 " URL:	       https://github.com/jkotlinski/forth.vim
 
@@ -23,7 +23,6 @@ syn case ignore
 
 " Some special, non-FORTH keywords
 syn keyword forthTodo contained TODO FIXME XXX
-syn match forthTodo contained 'Copyright\(\s([Cc])\)\=\(\s[0-9]\{2,4}\)\='
 
 " Characters allowed in keywords
 " I don't know if 128-255 are allowed in ANS-FORTH
@@ -98,13 +97,16 @@ syn keyword forthEndOfColonDef ; ;M ;m
 syn keyword forthEndOfClassDef ;class
 syn keyword forthEndOfObjectDef ;object
 syn keyword forthDefine CONSTANT 2CONSTANT FCONSTANT VARIABLE 2VARIABLE
-syn keyword forthDefine FVARIABLE CREATE USER VALUE TO DEFER IS DOES> IMMEDIATE
+syn keyword forthDefine FVARIABLE CREATE USER VALUE TO DEFER IS <BUILDS DOES> IMMEDIATE
 syn keyword forthDefine COMPILE-ONLY COMPILE RESTRICT INTERPRET POSTPONE EXECUTE
 syn keyword forthDefine LITERAL CREATE-INTERPRET/COMPILE INTERPRETATION>
 syn keyword forthDefine <INTERPRETATION COMPILATION> <COMPILATION ] LASTXT
 syn keyword forthDefine COMP' POSTPONE, FIND-NAME NAME>INT NAME?INT NAME>COMP
 syn keyword forthDefine NAME>STRING STATE C; CVARIABLE BUFFER: MARKER
 syn keyword forthDefine , 2, F, C, COMPILE,
+syn match forthDefine "\[DEFINED]"
+syn match forthDefine "\[UNDEFINED]"
+syn match forthDefine "\[IF]"
 syn match forthDefine "\[IFDEF]"
 syn match forthDefine "\[IFUNDEF]"
 syn match forthDefine "\[THEN]"
@@ -180,6 +182,7 @@ syn keyword forthBlocks BLOCK-INCLUDED B
 syn keyword forthMath DECIMAL HEX BASE
 syn match forthInteger '\<-\=[0-9]\+.\=\>'
 syn match forthInteger '\<&-\=[0-9]\+.\=\>'
+syn match forthInteger '\<#-\=[0-9]\+.\=\>'
 " recognize hex and binary numbers, the '$' and '%' notation is for gforth
 syn match forthInteger '\<\$\x*\x\+\>' " *1* --- don't mess
 syn match forthInteger '\<\x*\d\x*\>'  " *2* --- this order!
@@ -192,18 +195,18 @@ syn match forthFloat '\<-\=\d*[.]\=\d\+[
 syn region forthComment start='0 \[if\]' end='\[endif\]' end='\[then\]' contains=forthTodo
 
 " Strings
-syn region forthString start=+\.*\"+ end=+"+ end=+$+
+syn region forthString start=+\.*\"+ end=+"+ end=+$+ contains=@Spell
 " XXX
-syn region forthString start=+s\"+ end=+"+ end=+$+
-syn region forthString start=+s\\\"+ end=+"+ end=+$+
-syn region forthString start=+c\"+ end=+"+ end=+$+
+syn region forthString start=+s\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+s\\\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+c\"+ end=+"+ end=+$+ contains=@Spell
 
 " Comments
-syn match forthComment '\\\s.*$' contains=forthTodo,forthSpaceError
-syn region forthComment start='\\S\s' end='.*' contains=forthTodo,forthSpaceError
-syn match forthComment '\.(\s[^)]*)' contains=forthTodo,forthSpaceError
-syn region forthComment start='\(^\|\s\)\zs(\s' skip='\\)' end=')' contains=forthTodo,forthSpaceError
-syn region forthComment start='/\*' end='\*/' contains=forthTodo,forthSpaceError
+syn match forthComment '\\\%(\s.*\)\=$' contains=@Spell,forthTodo,forthSpaceError
+syn region forthComment start='\\S\s' end='.*' contains=@Spell,forthTodo,forthSpaceError
+syn match forthComment '\.(\s[^)]*)' contains=@Spell,forthTodo,forthSpaceError
+syn region forthComment start='\(^\|\s\)\zs(\s' skip='\\)' end=')' contains=@Spell,forthTodo,forthSpaceError
+syn region forthComment start='/\*' end='\*/' contains=@Spell,forthTodo,forthSpaceError
 
 " Include files
 syn match forthInclude '^INCLUDE\s\+\k\+'
@@ -260,3 +263,4 @@ let b:current_syntax = "forth"
 let &cpo = s:cpo_save
 unlet s:cpo_save
 " vim:ts=8:sw=4:nocindent:smartindent:
+
--- a/runtime/syntax/gpg.vim
+++ b/runtime/syntax/gpg.vim
@@ -1,7 +1,8 @@
 " Vim syntax file
-" Language:             gpg(1) configuration file
-" Previous Maintainer:  Nikolai Weibull <now@bitwi.se>
-" Latest Revision:      2010-10-14
+" Language:		gpg(1) configuration file
+" Previous Maintainer:	Nikolai Weibull <now@bitwi.se>
+" Latest Revision:	2010-10-14
+" Updated:		2023-01-23 @ObserverOfTime: added a couple of keywords
 
 if exists("b:current_syntax")
   finish
@@ -12,91 +13,92 @@ set cpo&vim
 
 setlocal iskeyword+=-
 
-syn keyword gpgTodo     contained FIXME TODO XXX NOTE
+syn keyword gpgTodo	contained FIXME TODO XXX NOTE
 
-syn region  gpgComment  contained display oneline start='#' end='$'
-                        \ contains=gpgTodo,gpgID,@Spell
+syn region  gpgComment	contained display oneline start='#' end='$'
+			\ contains=gpgTodo,gpgID,@Spell
 
-syn match   gpgID       contained display '\<\(0x\)\=\x\{8,}\>'
+syn match   gpgID	contained display '\<\(0x\)\=\x\{8,}\>'
 
-syn match   gpgBegin    display '^' skipwhite nextgroup=gpgComment,gpgOption,gpgCommand
+syn match   gpgBegin	display '^' skipwhite nextgroup=gpgComment,gpgOption,gpgCommand
 
-syn keyword gpgCommand  contained skipwhite nextgroup=gpgArg
-                        \ check-sigs decrypt decrypt-files delete-key
-                        \ delete-secret-and-public-key delete-secret-key
-                        \ edit-key encrypt-files export export-all
-                        \ export-ownertrust export-secret-keys
-                        \ export-secret-subkeys fast-import fingerprint
-                        \ gen-prime gen-random import import-ownertrust
-                        \ list-keys list-public-keys list-secret-keys
-                        \ list-sigs lsign-key nrsign-key print-md print-mds
-                        \ recv-keys search-keys send-keys sign-key verify
-                        \ verify-files
-syn keyword gpgCommand  contained skipwhite nextgroup=gpgArgError
-                        \ check-trustdb clearsign desig-revoke detach-sign
-                        \ encrypt gen-key gen-revoke help list-packets
-                        \ rebuild-keydb-caches sign store symmetric
-                        \ update-trustdb version warranty
+syn keyword gpgCommand	contained skipwhite nextgroup=gpgArg
+			\ check-sigs decrypt decrypt-files delete-key
+			\ delete-secret-and-public-key delete-secret-key
+			\ edit-key encrypt-files export export-all
+			\ export-ownertrust export-secret-keys
+			\ export-secret-subkeys fast-import fingerprint
+			\ gen-prime gen-random import import-ownertrust
+			\ list-keys list-public-keys list-secret-keys
+			\ list-sigs lsign-key nrsign-key print-md print-mds
+			\ recv-keys search-keys send-keys sign-key verify
+			\ verify-files
+syn keyword gpgCommand	contained skipwhite nextgroup=gpgArgError
+			\ check-trustdb clearsign desig-revoke detach-sign
+			\ encrypt gen-key gen-revoke help list-packets
+			\ rebuild-keydb-caches sign store symmetric
+			\ update-trustdb version warranty
 
-syn keyword gpgOption   contained skipwhite nextgroup=gpgArg
-                        \ attribute-fd cert-digest-algo charset cipher-algo
-                        \ command-fd comment completes-needed compress
-                        \ compress-algo debug default-cert-check-level
-                        \ default-key default-preference-list
-                        \ default-recipient digest-algo disable-cipher-algo
-                        \ disable-pubkey-algo encrypt-to exec-path
-                        \ export-options group homedir import-options
-                        \ keyring keyserver keyserver-options load-extension
-                        \ local-user logger-fd marginals-needed max-cert-depth
-                        \ notation-data options output override-session-key
-                        \ passphrase-fd personal-cipher-preferences
-                        \ personal-compress-preferences
-                        \ personal-digest-preferences photo-viewer
-                        \ recipient s2k-cipher-algo s2k-digest-algo s2k-mode
-                        \ secret-keyring set-filename set-policy-url status-fd
-                        \ trusted-key verify-options keyid-format list-options
-syn keyword gpgOption   contained skipwhite nextgroup=gpgArgError
-                        \ allow-freeform-uid allow-non-selfsigned-uid
-                        \ allow-secret-key-import always-trust
-                        \ armor ask-cert-expire ask-sig-expire
-                        \ auto-check-trustdb batch debug-all default-comment
-                        \ default-recipient-self dry-run emit-version
-                        \ emulate-md-encode-bug enable-special-filenames
-                        \ escape-from-lines expert fast-list-mode
-                        \ fixed-list-mode for-your-eyes-only
-                        \ force-mdc force-v3-sigs force-v4-certs
-                        \ gpg-agent-info ignore-crc-error ignore-mdc-error
-                        \ ignore-time-conflict ignore-valid-from interactive
-                        \ list-only lock-multiple lock-never lock-once
-                        \ merge-only no no-allow-non-selfsigned-uid
-                        \ no-armor no-ask-cert-expire no-ask-sig-expire
-                        \ no-auto-check-trustdb no-batch no-comment
-                        \ no-default-keyring no-default-recipient
-                        \ no-encrypt-to no-expensive-trust-checks
-                        \ no-expert no-for-your-eyes-only no-force-v3-sigs
-                        \ no-force-v4-certs no-greeting no-literal
-                        \ no-mdc-warning no-options no-permission-warning
-                        \ no-pgp2 no-pgp6 no-pgp7 no-random-seed-file
-                        \ no-secmem-warning no-show-notation no-show-photos
-                        \ no-show-policy-url no-sig-cache no-sig-create-check
-                        \ no-sk-comments no-tty no-utf8-strings no-verbose
-                        \ no-version not-dash-escaped openpgp pgp2
-                        \ pgp6 pgp7 preserve-permissions quiet rfc1991
-                        \ set-filesize show-keyring show-notation show-photos
-                        \ show-policy-url show-session-key simple-sk-checksum
-                        \ sk-comments skip-verify textmode throw-keyid
-                        \ try-all-secrets use-agent use-embedded-filename
-                        \ utf8-strings verbose with-colons with-fingerprint
-                        \ with-key-data yes
+syn keyword gpgOption	contained skipwhite nextgroup=gpgArg
+			\ attribute-fd cert-digest-algo charset cipher-algo
+			\ command-fd comment completes-needed compress
+			\ compress-algo debug default-cert-check-level
+			\ default-key default-preference-list
+			\ default-recipient digest-algo disable-cipher-algo
+			\ disable-pubkey-algo encrypt-to exec-path
+			\ export-options group homedir import-options
+			\ keyring keyserver keyserver-options load-extension
+			\ local-user logger-fd marginals-needed max-cert-depth
+			\ notation-data options output override-session-key
+			\ passphrase-fd personal-cipher-preferences
+			\ personal-compress-preferences
+			\ personal-digest-preferences photo-viewer
+			\ recipient s2k-cipher-algo s2k-digest-algo s2k-mode
+			\ secret-keyring set-filename set-policy-url status-fd
+			\ trusted-key verify-options keyid-format list-options
+			\ default-new-key-algo weak-digest
+syn keyword gpgOption	contained skipwhite nextgroup=gpgArgError
+			\ allow-freeform-uid allow-non-selfsigned-uid
+			\ allow-secret-key-import always-trust
+			\ armor ask-cert-expire ask-sig-expire
+			\ auto-check-trustdb batch debug-all default-comment
+			\ default-recipient-self dry-run emit-version
+			\ emulate-md-encode-bug enable-special-filenames
+			\ escape-from-lines expert fast-list-mode
+			\ fixed-list-mode for-your-eyes-only
+			\ force-mdc force-v3-sigs force-v4-certs
+			\ gpg-agent-info ignore-crc-error ignore-mdc-error
+			\ ignore-time-conflict ignore-valid-from interactive
+			\ list-only lock-multiple lock-never lock-once
+			\ merge-only no no-allow-non-selfsigned-uid
+			\ no-armor no-ask-cert-expire no-ask-sig-expire
+			\ no-auto-check-trustdb no-batch no-comment
+			\ no-default-keyring no-default-recipient
+			\ no-encrypt-to no-expensive-trust-checks
+			\ no-expert no-for-your-eyes-only no-force-v3-sigs
+			\ no-force-v4-certs no-greeting no-literal
+			\ no-mdc-warning no-options no-permission-warning
+			\ no-pgp2 no-pgp6 no-pgp7 no-random-seed-file
+			\ no-secmem-warning no-show-notation no-show-photos
+			\ no-show-policy-url no-sig-cache no-sig-create-check
+			\ no-sk-comments no-tty no-utf8-strings no-verbose
+			\ no-version not-dash-escaped openpgp pgp2
+			\ pgp6 pgp7 preserve-permissions quiet rfc1991
+			\ set-filesize show-keyring show-notation show-photos
+			\ show-policy-url show-session-key simple-sk-checksum
+			\ sk-comments skip-verify textmode throw-keyid
+			\ try-all-secrets use-agent use-embedded-filename
+			\ utf8-strings verbose with-colons with-fingerprint
+			\ with-key-data yes
 
-syn match   gpgArg      contained display '\S\+\(\s\+\S\+\)*' contains=gpgID
+syn match   gpgArg	contained display '\S\+\(\s\+\S\+\)*' contains=gpgID
 syn match   gpgArgError contained display '\S\+\(\s\+\S\+\)*'
 
-hi def link gpgComment  Comment
-hi def link gpgTodo     Todo
-hi def link gpgID       Number
-hi def link gpgOption   Keyword
-hi def link gpgCommand  Error
+hi def link gpgComment	Comment
+hi def link gpgTodo	Todo
+hi def link gpgID	Number
+hi def link gpgOption	Keyword
+hi def link gpgCommand	Error
 hi def link gpgArgError Error
 
 let b:current_syntax = "gpg"
new file mode 100644
--- /dev/null
+++ b/runtime/syntax/lc.vim
@@ -0,0 +1,31 @@
+" Vim syntax file
+" Language:     Elsa
+" Maintainer:   Miles Glapa-Grossklag <miles@glapa-grossklag.com>
+" Last Change:  2023-01-29
+
+if exists('b:current_syntax')
+  finish
+endif
+
+" Keywords
+syntax keyword elsaKeyword let eval
+syntax match elsaKeyword "\v:"
+highlight link elsaKeyword Keyword
+
+" Comments
+setlocal commentstring=--%s
+syntax match elsaComment "\v--.*$"
+highlight link elsaComment Comment
+
+" Operators
+syntax match elsaOperator "\v\="
+syntax match elsaOperator "\v\=[abd*~]\>"
+syntax match elsaOperator "\v-\>"
+syntax match elsaOperator "\v\\"
+highlight link elsaOperator Operator
+
+" Definitions
+syntax match elsaConstant "\v[A-Z]+[A-Z_0-9]*"
+highlight link elsaConstant Constant
+
+let b:current_syntax = 'elsa'
--- a/runtime/syntax/nginx.vim
+++ b/runtime/syntax/nginx.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language: nginx.conf
 " Maintainer: Chris Aumann <me@chr4.org>
-" Last Change: Apr 15, 2017
+" Last Change: Jan 25, 2023
 
 if exists("b:current_syntax")
   finish
@@ -84,6 +84,8 @@ syn keyword ngxListenOptions default_ser
 syn keyword ngxListenOptions ssl            contained
 syn keyword ngxListenOptions http2          contained
 syn keyword ngxListenOptions spdy           contained
+syn keyword ngxListenOptions http3          contained
+syn keyword ngxListenOptions quic           contained
 syn keyword ngxListenOptions proxy_protocol contained
 syn keyword ngxListenOptions setfib         contained
 syn keyword ngxListenOptions fastopen       contained
@@ -265,8 +267,16 @@ syn keyword ngxDirective http2_max_concu
 syn keyword ngxDirective http2_max_field_size
 syn keyword ngxDirective http2_max_header_size
 syn keyword ngxDirective http2_max_requests
+syn keyword ngxDirective http2_push
+syn keyword ngxDirective http2_push_preload
 syn keyword ngxDirective http2_recv_buffer_size
 syn keyword ngxDirective http2_recv_timeout
+syn keyword ngxDirective http3_hq
+syn keyword ngxDirective http3_max_concurrent_pushes
+syn keyword ngxDirective http3_max_concurrent_streams
+syn keyword ngxDirective http3_push
+syn keyword ngxDirective http3_push_preload
+syn keyword ngxDirective http3_stream_buffer_size
 syn keyword ngxDirective if_modified_since
 syn keyword ngxDirective ignore_invalid_headers
 syn keyword ngxDirective image_filter
@@ -444,6 +454,10 @@ syn keyword ngxDirective proxy_temp_path
 syn keyword ngxDirective proxy_timeout
 syn keyword ngxDirective proxy_upload_rate
 syn keyword ngxDirective queue
+syn keyword ngxDirective quic_gso
+syn keyword ngxDirective quic_host_key
+syn keyword ngxDirective quic_mtu
+syn keyword ngxDirective quic_retry
 syn keyword ngxDirective random_index
 syn keyword ngxDirective read_ahead
 syn keyword ngxDirective real_ip_header
@@ -545,8 +559,10 @@ syn keyword ngxDirective ssl_certificate
 syn keyword ngxDirective ssl_certificate_key
 syn keyword ngxDirective ssl_ciphers
 syn keyword ngxDirective ssl_client_certificate
+syn keyword ngxDirective ssl_conf_command
 syn keyword ngxDirective ssl_crl
 syn keyword ngxDirective ssl_dhparam
+syn keyword ngxDirective ssl_early_data
 syn keyword ngxDirective ssl_ecdh_curve
 syn keyword ngxDirective ssl_engine
 syn keyword ngxDirective ssl_handshake_timeout
@@ -556,6 +572,7 @@ syn keyword ngxSSLPreferServerCiphersOn 
 syn keyword ngxSSLPreferServerCiphersOff off contained
 syn keyword ngxDirective ssl_preread
 syn keyword ngxDirective ssl_protocols nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+syn keyword ngxDirective ssl_reject_handshake
 syn match ngxSSLProtocol 'TLSv1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
 syn match ngxSSLProtocol 'TLSv1\.1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
 syn match ngxSSLProtocol 'TLSv1\.2' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
@@ -622,6 +639,7 @@ syn keyword ngxDirective uwsgi_buffering
 syn keyword ngxDirective uwsgi_buffers
 syn keyword ngxDirective uwsgi_busy_buffers_size
 syn keyword ngxDirective uwsgi_cache
+syn keyword ngxDirective uwsgi_cache_background_update
 syn keyword ngxDirective uwsgi_cache_bypass
 syn keyword ngxDirective uwsgi_cache_key
 syn keyword ngxDirective uwsgi_cache_lock
@@ -2225,6 +2243,19 @@ syn keyword ngxDirectiveThirdParty xss_o
 syn keyword ngxDirectiveThirdParty xss_check_status
 syn keyword ngxDirectiveThirdParty xss_input_types
 
+" CT Module <https://github.com/grahamedgecombe/nginx-ct>
+" Certificate Transparency module for nginx
+syn keyword ngxDirectiveThirdParty ssl_ct
+syn keyword ngxDirectiveThirdParty ssl_ct_static_scts
+
+" Dynamic TLS records patch <https://github.com/cloudflare/sslconfig/blob/master/patches/nginx__dynamic_tls_records.patch>
+" TLS Dynamic Record Resizing
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_enable
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_hi
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_lo
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_threshold
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_timeout
+
 " ZIP Module <https://www.nginx.com/resources/wiki/modules/zip/>
 " ZIP archiver for nginx
 
--- a/runtime/syntax/sh.vim
+++ b/runtime/syntax/sh.vim
@@ -2,8 +2,8 @@
 " Language:		shell (sh) Korn shell (ksh) bash (sh)
 " Maintainer:		Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
 " Previous Maintainer:	Lennart Schultz <Lennart.Schultz@ecmwf.int>
-" Last Change:		Nov 25, 2022
-" Version:		204
+" Last Change:		Dec 20, 2022
+" Version:		205
 " URL:		http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
 " For options and settings, please use:      :help ft-sh-syntax
 " This file includes many ideas from Eric Brunet (eric.brunet@ens.fr) and heredoc fixes from Felipe Contreras
@@ -190,8 +190,10 @@ syn region shEmbeddedEcho contained matc
 " =====
 if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
  syn match shStatement "\<alias\>"
- syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@="  skip="\\$" end="\>\|`"
- syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
+ syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*\)\@="  skip="\\$" end="\>\|`"
+ syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*=\)\@=" skip="\\$" end="="
+" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@="  skip="\\$" end="\>\|`"
+" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
 
  " Touch: {{{1
  " =====
@@ -333,7 +335,7 @@ syn match   shEscape	contained	'\%(^\)\@
 " systems too, however, so the following syntax will flag $(..) as
 " an Error under /bin/sh.  By consensus of vimdev'ers!
 if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
- syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]"  skip='\\\\\|\\.' end=")"  contains=@shCommandSubList
+ syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]\|$"  skip='\\\\\|\\.' end=")"  contains=@shCommandSubList
  syn region shArithmetic matchgroup=shArithRegion  start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
  syn region shArithmetic matchgroup=shArithRegion  start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
  syn match  shSkipInitWS contained	"^\s\+"
@@ -483,7 +485,9 @@ endif
 
 " Parameter Dereferencing: {{{1
 " ========================
-if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
+" Note: sh04 failure with following line
+"if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
+if !exists("g:sh_no_error")
  syn match  shDerefWordError	"[^}$[~]"	contained
 endif
 syn match  shDerefSimple	"\$\%(\h\w*\|\d\)"	nextgroup=@shNoZSList
--- a/runtime/syntax/shared/README.txt
+++ b/runtime/syntax/shared/README.txt
@@ -1,2 +1,2 @@
 This directory "runtime/syntax/shared" contains Vim script files that are
-generated or used by more then one syntax file.
+generated or used by more than one syntax file.
--- a/runtime/syntax/tpp.vim
+++ b/runtime/syntax/tpp.vim
@@ -2,8 +2,8 @@
 " Language: tpp - Text Presentation Program
 " Maintainer: Debian Vim Maintainers
 " Former Maintainer: Gerfried Fuchs <alfie@ist.org>
-" Last Change: 2018 Dec 27
-" URL: https://salsa.debian.org/vim-team/vim-debian/master/syntax/tpp.vim
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/tpp.vim
 " Filenames: *.tpp
 " License: BSD
 "
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:	Vim 9.0 script
 " Maintainer:	Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
-" Last Change:	Jan 08, 2023
-" Version:	9.0-18
+" Last Change:	January 18, 2023
+" Version:	9.0-21
 " URL:	http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
 " Automatically generated keyword lists: {{{1
 
@@ -19,12 +19,13 @@ syn keyword vimTodo contained	COMBAK	FIX
 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] defer deletl dep diffpu[t] dj[ump] dp earlier echow[indow] endf[unction] ex files fini[sh] folddoc[losed] grepa[dd] helpf[ind] hor[izontal] 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] 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] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec el[se] endfo[r] exi[t] filet fir[st] foldo[pen] gui helpg[rep] 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] wn[ext] 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 delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] elsei[f] endt[ry] exp filetype fix[del] for gvim helpt[ags] 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] wp[revious] 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] delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] em[enu] endw[hile] export filt[er] fo[ld] fu[nction] h[elp] hi 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] wq 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 deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] en[dif] ene[w] exu[sage] fin[d] foldc[lose] go[to] ha[rdcopy] hid[e] 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] wqa[ll] 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] deletep delp diffp[atch] disa[ssemble] doaut ea echon enddef eval f[ile] fina[lly] foldd[oopen] gr[ep] helpc[lose] his[tory] 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 wundo
+syn keyword vimCommand contained	a ar[gs] argl[ocal] bad[d] 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] delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] em[enu] endfo[r] eval f[ile] fina[lly] foldd[oopen] gr[ep] helpc[lose] his[tory] 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] 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] argu[ment] balt bo[tright] breakl[ist] cN[ext] cad[dbuffer] cb[uffer] cd cfir[st] che[ckpath] cle[arjumps] cnor comp[iler] cpf[ile] cun def deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] en[dif] endinterface ex files fini[sh] folddoc[losed] grepa[dd] helpf[ind] hor[izontal] 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] public 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] as[cii] bd[elete] 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] deletep delp diffp[atch] disa[ssemble] doaut ea echon endclass endt[ry] exi[t] filet fir[st] foldo[pen] gui helpg[rep] 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] 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] au bel[owright] 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] defer deletl dep diffpu[t] dj[ump] dp earlier echow[indow] enddef endw[hile] exp filetype fix[del] for gvim helpt[ags] 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] 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 bN[ext] bf[irst] brea[k] buffers ca caf[ter] cbo[ttom] cex[pr] cgete[xpr] cl[ist] cn[ext] colo[rscheme] cons[t] cs d[elete] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec el[se] endenum ene[w] export filt[er] fo[ld] fu[nction] h[elp] hi 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] 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] b[uffer] bl[ast] breaka[dd] bun[load] cabc[lear] cal[l] cc cf[ile] changes cla[st] cnew[er] com cope[n] cscope debug delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] elsei[f] endf[unction] enum exu[sage] fin[d] foldc[lose] go[to] ha[rdcopy] hid[e] 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] 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] argg[lobal] ba[ll] bm[odified]
 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 Until Winbar XMLent XMLns
 
@@ -49,8 +50,8 @@ syn keyword vimOption contained	invai in
 syn keyword vimOption contained	invakm invanti invarab invari invautochdir invautoshelldir invaw invballooneval invbevalterm invbk invbreakindent invcf invcindent invcopyindent invcscoperelative invcsre invcuc invcursorcolumn invdelcombine invdigraph inved invemo invendofline invequalalways invet invexrc invfileignorecase invfk invfs invgdefault invhidden invhkmapp invhlsearch invignorecase invimcmdline invincsearch invinsertmode invjs invlazyredraw invlisp invloadplugins invlz invmagic invmle invmodelineexpr invmore invmousehide invodev invpi
 
 " termcap codes (which can also be set) {{{2
-syn keyword vimOption contained	t_8b t_8u t_AF t_AL t_bc t_BE t_ce t_cl t_Co t_Cs t_CV t_db t_DL t_Ds t_EI t_F2 t_F4 t_F6 t_F8 t_fd t_fs t_IE t_k1 t_k2 t_K3 t_K4 t_K5 t_K6 t_K7 t_K8 t_K9 t_kb t_KB t_kd t_KD t_KE t_KG t_KH t_KI t_KK t_kl t_KL t_kN t_kP t_kr t_ks t_ku t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_PE t_PS t_RB t_RC t_RF t_Ri t_RI t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf t_SH t_Si t_SI t_so t_sr t_SR t_ST t_te t_Te t_TE t_ti t_TI t_ts t_Ts t_u7 t_ue t_us t_Us t_ut t_vb t_ve t_vi t_vs t_VS t_WP t_WS t_xn t_xs t_ZH t_ZR
-syn keyword vimOption contained	t_8f t_AB t_al t_AU t_BD t_cd t_Ce t_cm t_cs t_CS t_da t_dl t_ds t_EC t_F1 t_F3 t_F5 t_F7 t_F9 t_fe t_GP t_IS t_K1 t_k3 t_k4 t_k5 t_k6 t_k7 t_k8 t_k9 t_KA t_kB t_KC t_kD t_ke t_KF t_kh t_kI t_KJ
+syn keyword vimOption contained	t_8b t_8u t_AF t_AL t_bc t_BE t_ce t_cl t_Co t_Cs t_CV t_db t_DL t_Ds t_EI t_F2 t_F4 t_F6 t_F8 t_fd t_fs t_IE t_k1 t_k2 t_K3 t_K4 t_K5 t_K6 t_K7 t_K8 t_K9 t_kb t_KB t_kd t_KD t_KE t_KG t_KH t_KI t_KK t_KL t_kN t_kP t_kr t_ks t_ku t_le t_mb t_md t_me t_mr t_ms t_nd t_op t_PE t_PS t_RB t_RC t_RF t_Ri t_RI t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf t_SH t_Si t_SI t_so t_sr t_SR t_ST t_te t_Te t_TE t_ti t_TI t_ts t_Ts t_u7 t_ue t_us t_Us t_ut t_vb t_ve t_vi t_vs t_VS t_WP t_WS t_XM t_xn t_xs t_ZH t_ZR
+syn keyword vimOption contained	t_8f t_AB t_al t_AU t_BD t_cd t_Ce t_cm t_cs t_CS t_da t_dl t_ds t_EC t_F1 t_F3 t_F5 t_F7 t_F9 t_fe t_GP t_IS t_K1 t_k3 t_k4 t_k5 t_k6 t_k7 t_k8 t_k9 t_KA t_kB t_KC t_kD t_ke t_KF t_kh t_kI t_KJ t_kl
 syn match   vimOption contained	"t_%1"
 syn match   vimOption contained	"t_#2"
 syn match   vimOption contained	"t_#4"
@@ -78,12 +79,12 @@ syn match vimHLGroup contained	"Conceal"
 syn case match
 
 " Function Names {{{2
-syn keyword vimFuncName contained	abs argc assert_equal assert_match atan balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled extendnew findfile fnameescape foldtextresult get getchar getcmdline getcurpos getfsize getloclist getpos gettabinfo getwinpos globpath histdel hlset input insert islocked job_start json_decode libcallnr listener_add luaeval mapset matchend max nextnonblank popup_atcursor popup_dialog popup_findpreview popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdline setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart submatch synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_channel test_null_partial test_setmouse timer_info tolower type values winbufnr win_getid win_id2win winnr win_splitmove
-syn keyword vimFuncName contained	acos argidx assert_equalfile assert_nobeep atan2 balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp feedkeys flatten fnamemodify foreground getbufinfo getcharmod getcmdpos getcursorcharpos getftime getmarklist getqflist gettabvar getwinposx has histget hostname inputdialog interrupt isnan job_status json_encode line listener_flush map match matchfuzzy menu_info nr2char popup_beval popup_filter_menu popup_getoptions popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime substitute synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_event test_null_dict test_null_string test_settime timer_pause toupper typename virtcol wincol win_gettype winlayout winrestcmd winwidth
-syn keyword vimFuncName contained	add arglistid assert_exception assert_notequal autocmd_add blob2list bufload byte2line char2nr ch_close_in ch_info ch_readraw clearmatches confirm cursor diff_filler echoraw executable expand filereadable flattennew foldclosed fullcommand getbufline getcharpos getcmdscreenpos getcwd getftype getmatches getreg gettabwinvar getwinposy has_key histnr iconv inputlist invert items job_stop keys line2byte listener_remove maparg matchadd matchfuzzypos min or popup_clear popup_filter_yesno popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx swapfilelist synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_ignore_error test_null_function test_option_not_set test_srand_seed timer_start tr undofile virtcol2col windowsversion win_gotoid winline winrestview wordcount
-syn keyword vimFuncName contained	and argv assert_fails assert_notmatch autocmd_delete browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filewritable float2nr foldclosedend funcref getbufoneline getcharsearch getcmdtype getenv getimstatus getmousepos getreginfo gettagstack getwinvar haslocaldir hlexists indent inputrestore isabsolutepath job_getchannel join keytrans lispindent localtime mapcheck matchaddpos matchlist mkdir pathshorten popup_close popup_findecho popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_mswin_event test_null_job test_override test_unknown timer_stop trim undotree visualmode win_execute winheight win_move_separator winsaveview writefile
-syn keyword vimFuncName contained	append asin assert_false assert_report autocmd_get browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath expr10 filter floor foldlevel function getbufvar getcharstr getcmdwintype getfontname getjumplist getmouseshape getregtype gettext glob hasmapto hlget index inputsave isdirectory job_info js_decode len list2blob log maplist matcharg matchstr mode perleval popup_create popup_findinfo popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strwidth swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_blob test_null_list test_refcount test_void timer_stopall trunc uniq wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor
-syn keyword vimFuncName contained	appendbufline assert_beeps assert_inrange assert_true balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extend finddir fmod foldtext garbagecollect getchangelist getcmdcompltype getcompletion getfperm getline getpid getscriptinfo getwininfo glob2regpat histadd hlID indexof inputsecret isinf job_setoptions js_encode libcall list2str log10 mapnew matchdelete matchstrpos mzeval
+syn keyword vimFuncName contained	abs argc assert_equal assert_match atan balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled extendnew findfile fnameescape foldtextresult get getchangelist getcmdcompltype getcompletion getfperm getline getpid getscriptinfo getwininfo glob2regpat histadd hlID indexof inputsecret isinf job_setoptions js_encode libcall list2str log10 mapnew matchdelete matchstrpos mzeval popup_atcursor popup_dialog popup_findpreview popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdline setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart submatch synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_channel test_null_partial test_setmouse timer_info tolower type values winbufnr win_getid win_id2win winnr win_splitmove
+syn keyword vimFuncName contained	acos argidx assert_equalfile assert_nobeep atan2 balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp feedkeys flatten fnamemodify foreground getbufinfo getchar getcmdline getcurpos getfsize getloclist getpos gettabinfo getwinpos globpath histdel hlset input insert islocked job_start json_decode libcallnr listener_add luaeval mapset matchend max nextnonblank popup_beval popup_filter_menu popup_getoptions popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime substitute synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_event test_null_dict test_null_string test_settime timer_pause toupper typename virtcol wincol win_gettype winlayout winrestcmd winwidth
+syn keyword vimFuncName contained	add arglistid assert_exception assert_notequal autocmd_add blob2list bufload byte2line char2nr ch_close_in ch_info ch_readraw clearmatches confirm cursor diff_filler echoraw executable expand filereadable flattennew foldclosed fullcommand getbufline getcharmod getcmdpos getcursorcharpos getftime getmarklist getqflist gettabvar getwinposx has histget hostname inputdialog interrupt isnan job_status json_encode line listener_flush map match matchfuzzy menu_info nr2char popup_clear popup_filter_yesno popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx swapfilelist synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_ignore_error test_null_function test_option_not_set test_srand_seed timer_start tr undofile virtcol2col windowsversion win_gotoid winline winrestview wordcount
+syn keyword vimFuncName contained	and argv assert_fails assert_notmatch autocmd_delete browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filewritable float2nr foldclosedend funcref getbufoneline getcharpos getcmdscreenpos getcwd getftype getmatches getreg gettabwinvar getwinposy has_key histnr iconv inputlist invert items job_stop keys line2byte listener_remove maparg matchadd matchfuzzypos min or popup_close popup_findecho popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_mswin_event test_null_job test_override test_unknown timer_stop trim undotree visualmode win_execute winheight win_move_separator winsaveview writefile
+syn keyword vimFuncName contained	append asin assert_false assert_report autocmd_get browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath expr10 filter floor foldlevel function getbufvar getcharsearch getcmdtype getenv getimstatus getmousepos getreginfo gettagstack getwinvar haslocaldir hlexists indent inputrestore isabsolutepath job_getchannel join keytrans lispindent localtime mapcheck matchaddpos matchlist mkdir pathshorten popup_create popup_findinfo popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strwidth swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_blob test_null_list test_refcount test_void timer_stopall trunc uniq wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor
+syn keyword vimFuncName contained	appendbufline assert_beeps assert_inrange assert_true balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extend finddir fmod foldtext garbagecollect getcellwidths getcharstr getcmdwintype getfontname getjumplist getmouseshape getregtype gettext glob hasmapto hlget index inputsave isdirectory job_info js_decode len list2blob log maplist matcharg matchstr mode perleval
 
 "--- syntax here and above generated by mkvimvim ---
 " Special Vim Highlighting (not automatic) {{{1
--- a/runtime/syntax/xf86conf.vim
+++ b/runtime/syntax/xf86conf.vim
@@ -1,13 +1,12 @@
 " Vim syntax file
-" This is a GENERATED FILE. Please always refer to source file at the URI below.
 " Language: XF86Config (XFree86 configuration file)
 " Former Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
-" Last Change: 2010 Nov 01
-" URL: http://trific.ath.cx/Ftp/vim/syntax/xf86conf.vim
+" Last Change By David: 2010 Nov 01
+" Last Change: 2023 Jan 23
 " Required Vim Version: 6.0
 "
 " Options: let xf86conf_xfree86_version = 3 or 4
-"							 to force XFree86 3.x or 4.x XF86Config syntax
+"          to force XFree86 3.x or 4.x XF86Config syntax
 
 " Setup
 " quit when a syntax file was already loaded
@@ -147,6 +146,8 @@ syn keyword xf86confKeyword Hskew HTimin
 syn keyword xf86confKeyword Modes Ramdac Screen TextClockFreq UseModes VendorName nextgroup=xf86confComment,xf86confValue
 syn keyword xf86confKeyword VertRefresh VideoRam ViewPort Virtual VScan VTimings nextgroup=xf86confComment,xf86confValue
 syn keyword xf86confKeyword Weight White nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confMatch MatchDevicePath MatchDriver MatchLayout MatchOS MatchPnPID MatchProduct MatchTag MatchUSBID MatchVendor nextgroup=xf86confComment,xf86confString skipwhite
+syn keyword xf86confMatch MatchIsPointer MatchIsKeyboard MatchIsTouchpad MatchIsTouchscreen MatchIsJoystick nextgroup=xf86confComment,xf86confValue skipwhite
 syn keyword xf86confModeLine ModeLine nextgroup=xf86confComment,xf86confModeLineValue skipwhite skipnl
 
 " Constants
@@ -185,6 +186,7 @@ hi def link xf86confOctalNumberError xf8
 hi def link xf86confError Error
 
 hi def link xf86confOption xf86confKeyword
+hi def link xf86confMatch xf86confKeyword
 hi def link xf86confModeLine xf86confKeyword
 hi def link xf86confKeyword Type
 
--- a/runtime/tutor/tutor
+++ b/runtime/tutor/tutor
@@ -335,7 +335,7 @@ Doubling to operate on a line also works
   5. Now type a capital  U  to return the line to its original state.
   6. Now type  u  a few times to undo the  U  and preceding commands.
   7. Now type CTRL-R (keeping CTRL key pressed while hitting R) a few times
-     to redo the commands (undo the undo's).
+     to redo the commands (undo the undos).
 
 ---> Fiix the errors oon thhis line and reeplace them witth undo.
 
@@ -365,7 +365,7 @@ Doubling to operate on a line also works
 
   8. To undo previous actions, type:           u  (lowercase u)
      To undo all the changes on a line, type:  U  (capital U)
-     To undo the undo's, type:                 CTRL-R
+     To undo the undos, type:                  CTRL-R
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 			 Lesson 3.1: THE PUT COMMAND
--- a/runtime/tutor/tutor.utf-8
+++ b/runtime/tutor/tutor.utf-8
@@ -335,7 +335,7 @@ Doubling to operate on a line also works
   5. Now type a capital  U  to return the line to its original state.
   6. Now type  u  a few times to undo the  U  and preceding commands.
   7. Now type CTRL-R (keeping CTRL key pressed while hitting R) a few times
-     to redo the commands (undo the undo's).
+     to redo the commands (undo the undos).
 
 ---> Fiix the errors oon thhis line and reeplace them witth undo.
 
@@ -365,7 +365,7 @@ Doubling to operate on a line also works
 
   8. To undo previous actions, type:           u  (lowercase u)
      To undo all the changes on a line, type:  U  (capital U)
-     To undo the undo's, type:                 CTRL-R
+     To undo the undos, type:                  CTRL-R
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 			 Lesson 3.1: THE PUT COMMAND
--- a/src/po/ca.po
+++ b/src/po/ca.po
@@ -7729,8 +7729,8 @@ msgstr "E1112: L'element de la llista %d no t una amplada vlida"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Intervals solapats per a 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Noms es suporten valors de 0x100 o superiors"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Noms es suporten valors de 0x80 o superiors"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: el quart argument a \"assert_fails()\" ha de ser un nmero"
--- a/src/po/de.po
+++ b/src/po/de.po
@@ -7836,8 +7836,8 @@ msgstr "E1112: Listenwert %d Zellbreite ungltig"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: berlappender Bereich fr 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Nur Werte oberhalb 0x100 untersttzt"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Nur Werte oberhalb 0x80 untersttzt"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" viertes Argument muss eine Zahl sein"
--- a/src/po/eo.po
+++ b/src/po/eo.po
@@ -7346,8 +7346,8 @@ msgstr "E1110: Listero %d ne enhavas 3 n
 msgid "E1111: List item %d range invalid"
 msgstr "E1111: Listero %d havas nevalidan amplekson"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Nur valoroj 0x100 kaj pli altaj estas subtenataj"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Nur valoroj 0x80 kaj pli altaj estas subtenataj"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: la 4-a argumento de \"assert_fails()\" devas esti nombro"
--- a/src/po/es.po
+++ b/src/po/es.po
@@ -7809,8 +7809,8 @@ msgstr "E1112: Elemento %d de lista, ancho de celda no válido"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Rangos superpuestos para 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Solo se admiten valores de 0x100 y superiores"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Solo se admiten valores de 0x80 y superiores"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: El cuarto argumento \"assert_fails()\" debe ser un número"
--- a/src/po/fi.po
+++ b/src/po/fi.po
@@ -7759,8 +7759,8 @@ msgstr "E1112: Listan kohdan %d soluleve
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Päällekkäiset arvoalueet osoitteessa 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Vain arvot 0x100:sta eteenpäin kelpaavat"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Vain arvot 0x80:sta eteenpäin kelpaavat"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: assert_fails()-funktion neljännen argumentin tulee olla numero"
--- a/src/po/ga.po
+++ b/src/po/ga.po
@@ -7768,8 +7768,8 @@ msgstr "E1112: Leithead cille neamhbhail i mr %d sa liosta"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Raonta forluiteacha ar 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: N thacatear ach le luachanna 0x100 agus nos airde"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: N thacatear ach le luachanna 0x80 agus nos airde"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: N mr don cheathr hargint ar \"assert_fails()\" a bheith ina huimhir"
--- a/src/po/it.po
+++ b/src/po/it.po
@@ -6995,8 +6995,8 @@ msgstr "E1112: Elemento di Lista %d con 
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Intervalli sovrapposti per 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Solo valori 0x100 o più elevati sono supportati"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Solo valori 0x80 o più elevati sono supportati"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: Il quarto argomento di \"assert_fails()\" dev'essere un Numero"
--- a/src/po/ja.euc-jp.po
+++ b/src/po/ja.euc-jp.po
@@ -7702,8 +7702,8 @@ msgstr "E1112: ꥹȤ %d ΥǤ"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: 0x%lx ϰϤʣƤޤ"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: 0x100 ʾͤݡȤƤޤ"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: 0x80 ʾͤݡȤƤޤ"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" 4ϿǤʤФʤޤ"
--- a/src/po/ja.po
+++ b/src/po/ja.po
@@ -7702,8 +7702,8 @@ msgstr "E1112: リストの要素 %d のセル幅が不正です"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: 0x%lx の範囲が重複しています"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: 0x100 以上の値しかサポートされていません"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: 0x80 以上の値しかサポートされていません"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" の第4引数は数字でなければなりません"
--- a/src/po/ja.sjis.po
+++ b/src/po/ja.sjis.po
@@ -7702,8 +7702,8 @@ msgstr "E1112: Xg̗vf %d ̃Zsł"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: 0x%lx ͈̔͂dĂ܂"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: 0x100 ȏ̒lT|[gĂ܂"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: 0x80 ȏ̒lT|[gĂ܂"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" ̑4͐łȂ΂Ȃ܂"
--- a/src/po/ru.cp1251.po
+++ b/src/po/ru.cp1251.po
@@ -7696,8 +7696,8 @@ msgstr "E1112:  %d      "
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113:    0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114:     0x100  "
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114:     0x80  "
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr ""
--- a/src/po/ru.po
+++ b/src/po/ru.po
@@ -7696,8 +7696,8 @@ msgstr "E1112: Элемент %d в списке задаёт неправильную ширину ячейки"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Перекрывающиеся диапазоны для 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Поддерживаются только значения от 0x100 и выше"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Поддерживаются только значения от 0x80 и выше"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr ""
--- a/src/po/sr.po
+++ b/src/po/sr.po
@@ -10,16 +10,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Vim(Serbian)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-11-25 15:38+0400\n"
-"PO-Revision-Date: 2022-11-25 15:40+0400\n"
+"POT-Creation-Date: 2023-02-02 10:20+0400\n"
+"PO-Revision-Date: 2023-02-02 10:54+0400\n"
 "Last-Translator: Ivan Pešić <ivan.pesic@gmail.com>\n"
 "Language-Team: Serbian\n"
 "Language: sr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 msgid "ERROR: "
 msgstr "ГРЕШКА: "
@@ -1817,8 +1817,8 @@ msgstr "-P <назив родитеља>\tОтвори Vim унутар родитељске апликације"
 msgid "--windowid <HWND>\tOpen Vim inside another win32 widget"
 msgstr "--windowid <HWND>\tОтвори Vim унутар другог win32 виџета"
 
-msgid "Seen modifyOtherKeys: true"
-msgstr "Уочено modifyOtherKeys: да"
+msgid "Seen modifyOtherKeys: true\n"
+msgstr "Уочено modifyOtherKeys: да\n"
 
 msgid "Unknown"
 msgstr "Непознато"
@@ -1836,8 +1836,12 @@ msgid "Cleared"
 msgstr "Обрисано"
 
 #, c-format
-msgid "Kitty keyboard protocol: %s"
-msgstr "Kitty протокол тастатуре: %s"
+msgid "modifyOtherKeys detected: %s\n"
+msgstr "Откривено modifyOtherKeys: %s\n"
+
+#, c-format
+msgid "Kitty keyboard protocol: %s\n"
+msgstr "Kitty протокол тастатуре: %s\n"
 
 msgid "No abbreviation found"
 msgstr "Скраћеница није пронађена"
@@ -7635,8 +7639,8 @@ msgstr "E1112: Ширина ћелије ставке листе %d је неважећа"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Опсези за 0x%lx се преклапају"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Подржавају се само вредности од 0x100 и веће"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Подржавају се само вредности од 0x80 и веће"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: „assert_fails()” четврти аргумент мора бити број"
@@ -8362,6 +8366,184 @@ msgstr "E1311: Током исписа не може да се врши измена корисничких команди"
 msgid "E1312: Not allowed to change the window layout in this autocmd"
 msgstr "E1312: У овој аутокоманди није дозвољено мењање распореда прозора"
 
+#, c-format
+msgid "E1313: Not allowed to add or remove entries (%s)"
+msgstr "E1313: Није дозвољено додавање или уклањање ставки (%s)"
+
+#, c-format
+msgid "E1314: Class name must start with an uppercase letter: %s"
+msgstr "E1314: Име класе мора да почне великим словом: %s"
+
+#, c-format
+msgid "E1315: White space required after name: %s"
+msgstr "E1315: Након имена мора да стоји празан простор: %s"
+
+msgid "E1316: Class can only be defined in Vim9 script"
+msgstr "E1316: Класа може да се дефинише само у Vim9 скрипти"
+
+#, c-format
+msgid "E1317: Invalid object member declaration: %s"
+msgstr "E1317: Неисправна декларација члана објекта: %s"
+
+#, c-format
+msgid "E1318: Not a valid command in a class: %s"
+msgstr "E1318: Команда не важи у класи: %s"
+
+msgid "E1319: Using a class as a Number"
+msgstr "E1319: Класа се користи као Број"
+
+msgid "E1320: Using an object as a Number"
+msgstr "E1320: Објекат се користи као Број"
+
+msgid "E1321: Using a class as a Float"
+msgstr "E1321: Класа се користи као Покретни"
+
+msgid "E1322: Using an object as a Float"
+msgstr "E1322: Објекат се користи као Покретни"
+
+msgid "E1323: Using a class as a String"
+msgstr "E1323: Класа се користи као Стринг"
+
+msgid "E1324: Using an object as a String"
+msgstr "E1324: Објекат се користи као Стринг"
+
+#, c-format
+msgid "E1325: Method not found on class \"%s\": %s"
+msgstr "E1325: Није пронађена метода класе „%s”: %s"
+
+#, c-format
+msgid "E1326: Member not found on object \"%s\": %s"
+msgstr "E1326: Члан није пронађен у објекту „%s”: %s"
+
+#, c-format
+msgid "E1327: Object required, found %s"
+msgstr "E1327: Потребан је објекат, пронађено %s"
+
+#, c-format
+msgid "E1328: Constructor default value must be v:none: %s"
+msgstr "E1328: Подразумевана вредност конструктора мора бити v:none: %s"
+
+#, c-format
+msgid "E1329: Cannot get object member type from initializer: %s"
+msgstr "E1329: Тип члана објекта не може да се одреди из иницијализатора: %s"
+
+#, c-format
+msgid "E1330: Invalid type for object member: %s"
+msgstr "E1330: Неисправан тип члана објекта: %s"
+
+msgid "E1331: Public must be followed by \"this\" or \"static\""
+msgstr "E1331: Након Public мора да следи „this” или „static”"
+
+#, c-format
+msgid "E1332: Public member name cannot start with underscore: %s"
+msgstr "E1332: Име Public члана не може почити доњом цртом: %s"
+
+#, c-format
+msgid "E1333: Cannot access private member: %s"
+msgstr "E1333: Не може да се приступи приватном члану: %s"
+
+#, c-format
+msgid "E1334: Object member not found: %s"
+msgstr "E1334: Члан објекта није пронађен: %s"
+
+#, c-format
+msgid "E1335: Member is not writable: %s"
+msgstr "E1335: У члан не може да се уписује: %s"
+
+msgid "E1336: Internal error: shortmess too long"
+msgstr "E1336: Интерна грешка: shortmess сувише дугачко"
+
+#, c-format
+msgid "E1337: Class member not found: %s"
+msgstr "E1337: Није пронађен члан класе: %s"
+
+#, c-format
+msgid "E1338: Member not found on class \"%s\": %s"
+msgstr "E1338: Није шронаћен члан над класом „%s”: %s"
+
+msgid ""
+"E1339: Cannot add a textprop with text after using a textprop with a "
+"negative id"
+msgstr ""
+"E1339: Текст особина са текстом не може да се додан након употребе "
+"текст особине са негативним id"
+
+#, c-format
+msgid "E1340: Argument already declared in the class: %s"
+msgstr "E1340: Аргумент је већ дефинисан у класи: %s"
+
+#, c-format
+msgid "E1341: Variable already declared in the class: %s"
+msgstr "E1341: Променљива је већ декларисана у класи: %s"
+
+msgid "E1342: Interface can only be defined in Vim9 script"
+msgstr "E1342: Интерфејс може да се дефинише само у Vim9 скрипти"
+
+#, c-format
+msgid "E1343: Interface name must start with an uppercase letter: %s"
+msgstr "E1343: Име интерфејса мора да почне великим словом: %s"
+
+msgid "E1344: Cannot initialize a member in an interface"
+msgstr "E1344: Члан не може да се иницијализује у интерфејсу"
+
+#, c-format
+msgid "E1345: Not a valid command in an interface: %s"
+msgstr "E1345: Команда не важи у интерфејсу: %s"
+
+#, c-format
+msgid "E1346: Interface name not found: %s"
+msgstr "E1346: Није пронађено име интерфејса: %s"
+
+#, c-format
+msgid "E1347: Not a valid interface: %s"
+msgstr "E1347: Неважећи интерфејс: %s"
+
+#, c-format
+msgid "E1348: Member \"%s\" of interface \"%s\" not implemented"
+msgstr "E1348: Члан „%s” интерфејса „%s” није имплементиран"
+
+#, c-format
+msgid "E1349: Function \"%s\" of interface \"%s\" not implemented"
+msgstr "E1349: Функција „%s” интерфејса „%s” није имплементирана"
+
+msgid "E1350: Duplicate \"implements\""
+msgstr "E1350: Дупликат „implements”"
+
+#, c-format
+msgid "E1351: Duplicate interface after \"implements\": %s"
+msgstr "E1351: Дуплирани интерфејс након „implements”: %s"
+
+msgid "E1352: Duplicate \"extends\""
+msgstr "E1352: Дупликат „extends”"
+
+#, c-format
+msgid "E1353: Class name not found: %s"
+msgstr "E1353: Име класе није пронађено: %s"
+
+#, c-format
+msgid "E1354: Cannot extend %s"
+msgstr "E1354: Не може да се прошири %s"
+
+#, c-format
+msgid "E1355: Duplicate function: %s"
+msgstr "E1355: Дуплирана функција: %s"
+
+msgid "E1356: \"super\" must be followed by a dot"
+msgstr "E1356: Након „super” мора да следи тачка"
+
+msgid "E1357: Using \"super\" not in a class function"
+msgstr "E1357:„super” се користи ван функције класе"
+
+msgid "E1358: Using \"super\" not in a child class"
+msgstr "E1358: „super” се не користи у изведеној класи"
+
+msgid "E1359: Cannot define a \"new\" function in an abstract class"
+msgstr "E1359: Функција „new” не може да се дефинише у апстрактној класи"
+
+#, c-format
+msgid "E476: Invalid command: %s, expected %s"
+msgstr "E476: Неважећа команда: %s, очекује се %s"
+
 msgid "--No lines in buffer--"
 msgstr "--У баферу нема линија--"
 
@@ -8686,9 +8868,6 @@ msgstr "Уређујте текст фајлове"
 msgid "Text;editor;"
 msgstr "Текст;едитор;"
 
-msgid "gvim"
-msgstr "gvim"
-
 msgid "Vim"
 msgstr "Vim"
 
@@ -9360,8 +9539,11 @@ msgstr ""
 msgid "list of flags to make messages shorter"
 msgstr "листа заставица за скраћивање порука"
 
-msgid "show (partial) command keys in the status line"
-msgstr "у статусној линији се приказују (делимични) тастери команде"
+msgid "show (partial) command keys in location given by 'showcmdloc'"
+msgstr "приказује (делимичне) тастере команде на месту наведеном у 'showcmdloc'"
+
+msgid "location where to show the (partial) command keys for 'showcmd'"
+msgstr "место на којем треба да се прикажу (делимични) тастери команде за 'showcmd'"
 
 msgid "display the current mode in the status line"
 msgstr "у статусној линији се приказује текући режим"
--- a/src/po/tr.po
+++ b/src/po/tr.po
@@ -7562,8 +7562,8 @@ msgstr "E1112: Liste ögesi %d hücre genişliği geçersiz"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: 0x%lx için üst üste binen erimler"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Yalnızca 0x100 ve daha yüksek değerler destekleniyor"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Yalnızca 0x80 ve daha yüksek değerler destekleniyor"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" dördüncü argüman bir sayı olmalıdır"
--- a/src/po/uk.cp1251.po
+++ b/src/po/uk.cp1251.po
@@ -7869,8 +7869,8 @@ msgstr "E1112:    %d  "
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113:    0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: ϳ   0x100  "
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: ϳ   0x80  "
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115:   assert_fails()   "
--- a/src/po/uk.po
+++ b/src/po/uk.po
@@ -7869,8 +7869,8 @@ msgstr "E1112: Ширина комірки елементу %d списку некоректна"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: Перекриття діапазонів у 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: Підтримуються тільки значення 0x100 і вищі"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: Підтримуються тільки значення 0x80 і вищі"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: Четвертий аргумент «assert_fails()» має бути числом"
--- a/src/po/zh_CN.UTF-8.po
+++ b/src/po/zh_CN.UTF-8.po
@@ -7511,8 +7511,8 @@ msgstr "E1112: 列表项 %d 单元格宽度无效"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: 重叠范围为 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: 只支持 0x100 或更高的值"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: 只支持 0x80 或更高的值"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" 第四个参数必须是一个整数"
--- a/src/po/zh_CN.cp936.po
+++ b/src/po/zh_CN.cp936.po
@@ -7511,8 +7511,8 @@ msgstr "E1112: б %d ԪЧ"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: صΧΪ 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: ֻ֧ 0x100 ߵֵ"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: ֻ֧ 0x80 ߵֵ"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" ĸһ"
--- a/src/po/zh_CN.po
+++ b/src/po/zh_CN.po
@@ -7511,8 +7511,8 @@ msgstr "E1112: б %d ԪЧ"
 msgid "E1113: Overlapping ranges for 0x%lx"
 msgstr "E1113: صΧΪ 0x%lx"
 
-msgid "E1114: Only values of 0x100 and higher supported"
-msgstr "E1114: ֻ֧ 0x100 ߵֵ"
+msgid "E1114: Only values of 0x80 and higher supported"
+msgstr "E1114: ֻ֧ 0x80 ߵֵ"
 
 msgid "E1115: \"assert_fails()\" fourth argument must be a number"
 msgstr "E1115: \"assert_fails()\" ĸһ"