]> granicus.if.org Git - vim/commitdiff
Update runtime files.
authorBram Moolenaar <Bram@vim.org>
Sun, 12 Jun 2022 21:15:57 +0000 (22:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 12 Jun 2022 21:15:57 +0000 (22:15 +0100)
runtime/doc/builtin.txt
runtime/doc/index.txt
runtime/doc/syntax.txt
runtime/doc/todo.txt
runtime/doc/usr_41.txt
runtime/doc/vim9.txt
runtime/import/dist/vimhelp.vim
runtime/syntax/m4.vim
runtime/syntax/sh.vim
runtime/syntax/vim.vim

index e24bac80ad04c70b54164129659e5dcba465bfbb..b2e276e5c11fc7ea6d7a67382cb9d47a211dd05e 100644 (file)
@@ -5107,7 +5107,7 @@ len({expr})       The result is a Number, which is the length of the argument.
                When {expr} is a |Blob| the number of bytes is returned.
                When {expr} is a |Dictionary| the number of entries in the
                |Dictionary| is returned.
-               Otherwise an error is given.
+               Otherwise an error is given and returns zero.
 
                Can also be used as a |method|: >
                        mylist->len()
@@ -5200,6 +5200,7 @@ line({expr} [, {winid}])                          *line()*
                |getpos()|.
                With the optional {winid} argument the values are obtained for
                that window instead of the current window.
+               Returns 0 for invalid values of {expr} and {winid}.
                Examples: >
                        line(".")               line number of the cursor
                        line(".", winid)        idem, in window "winid"
@@ -5267,6 +5268,8 @@ list2str({list} [, {utf8}])                               *list2str()*
                With UTF-8 composing characters work as expected: >
                        list2str([97, 769])     returns "á"
 <
+               Returns an empty string on error.
+
                Can also be used as a |method|: >
                        GetList()->list2str()
 
@@ -5339,6 +5342,8 @@ listener_add({callback} [, {buf}])                        *listener_add()*
                The {callback} is also not invoked when the buffer is
                unloaded, use the |BufUnload| autocmd event for that.
 
+               Returns zero if {callback} or {buf} is invalid.
+
                Can also be used as a |method|, the base is passed as the
                second argument: >
                        GetBuffer()->listener_add(callback)
@@ -5371,6 +5376,7 @@ log({expr})                                               *log()*
                Return the natural logarithm (base e) of {expr} as a |Float|.
                {expr} must evaluate to a |Float| or a |Number| in the range
                (0, inf].
+               Returns 0.0 if {expr} is not a |Float| or a |Number|.
                Examples: >
                        :echo log(10)
 <                      2.302585 >
@@ -5386,6 +5392,7 @@ log({expr})                                               *log()*
 log10({expr})                                          *log10()*
                Return the logarithm of Float {expr} to base 10 as a |Float|.
                {expr} must evaluate to a |Float| or a |Number|.
+               Returns 0.0 if {expr} is not a |Float| or a |Number|.
                Examples: >
                        :echo log10(1000)
 <                      3.0 >
@@ -5484,8 +5491,9 @@ maparg({name} [, {mode} [, {abbr} [, {dict}]]])                   *maparg()*
                below. To get a list of all mappings see |maplist()|.
 
                When there is no mapping for {name}, an empty String is
-               returned.  When the mapping for {name} is empty, then "<Nop>"
-               is returned.
+               returned if {dict} is FALSE, otherwise returns an empty Dict.
+               When the mapping for {name} is empty, then "<Nop>" is
+               returned.
 
                The {name} can have special key names, like in the ":map"
                command.
@@ -5778,6 +5786,8 @@ matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
                The number of matches is not limited, as it is the case with
                the |:match| commands.
 
+               Returns -1 on error.
+
                Example: >
                        :highlight MyGroup ctermbg=green guibg=green
                        :let m = matchadd("MyGroup", "TODO")
@@ -5816,6 +5826,8 @@ matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]])
 
                The maximum number of positions in {pos} is 8.
 
+               Returns -1 on error.
+
                Example: >
                        :highlight MyGroup ctermbg=green guibg=green
                        :let m = matchaddpos("MyGroup", [[23, 24], 34])
@@ -6285,6 +6297,7 @@ pathshorten({path} [, {len}])                             *pathshorten()*
                        :echo pathshorten('~/.vim/autoload/myfile.vim', 2)
 <                      ~/.vi/au/myfile.vim ~
                It doesn't matter if the path exists or not.
+               Returns an empty string on error.
 
                Can also be used as a |method|: >
                        GetDirectories()->pathshorten()
@@ -6314,6 +6327,7 @@ popup_ functions are documented here: |popup-functions|
 pow({x}, {y})                                          *pow()*
                Return the power of {x} to the exponent {y} as a |Float|.
                {x} and {y} must evaluate to a |Float| or a |Number|.
+               Returns 0.0 if {x} or {y} is not a |Float| or a |Number|.
                Examples: >
                        :echo pow(3, 3)
 <                      27.0 >
@@ -6690,6 +6704,7 @@ rand([{expr}])                                            *rand()* *random*
                {expr} can be initialized by |srand()| and will be updated by
                rand().  If {expr} is omitted, an internal seed value is used
                and updated.
+               Returns -1 if {expr} is invalid.
 
                Examples: >
                        :echo rand()
@@ -6779,6 +6794,8 @@ readdir({directory} [, {expr} [, {dict}]])                        *readdir()*
                  endfunction
                  echo s:tree(".")
 <
+               Returns an empty List on error.
+
                Can also be used as a |method|: >
                        GetDirName()->readdir()
 <
@@ -6837,7 +6854,6 @@ readdirex({directory} [, {expr} [, {dict}]])                      *readdirex()*
                For example, to get a list of all files in the current
                directory without sorting the individual entries: >
                  readdirex(dirname, '1', #{sort: 'none'})
-
 <
                Can also be used as a |method|: >
                        GetDirName()->readdirex()
@@ -6927,8 +6943,8 @@ reltime([{start} [, {end}]])                              *reltime()*
                and {end}.
 
                The {start} and {end} arguments must be values returned by
-               reltime().  If there is an error zero is returned in legacy
-               script, in Vim9 script an error is given.
+               reltime().  If there is an error an empty List is returned in
+               legacy script, in Vim9 script an error is given.
 
                Can also be used as a |method|: >
                        GetStart()->reltime()
@@ -7047,7 +7063,8 @@ remote_peek({serverid} [, {retvar}])              *remote_peek()*
 remote_read({serverid}, [{timeout}])                   *remote_read()*
                Return the oldest available reply from {serverid} and consume
                it.  Unless a {timeout} in seconds is given, it blocks until a
-               reply is available.
+               reply is available.  Returns an empty string, if a reply is
+               not available or on error.
                See also |clientserver|.
                This function is not available in the |sandbox|.
                {only available when compiled with the |+clientserver| feature}
@@ -7106,6 +7123,7 @@ remove({list}, {idx} [, {end}])                           *remove()*
                item as {end} a list with one item is returned.  When {end}
                points to an item before {idx} this is an error.
                See |list-index| for possible values of {idx} and {end}.
+               Returns zero on error.
                Example: >
                        :echo "last item: " .. remove(mylist, -1)
                        :call remove(mylist, 0, 9)
@@ -7122,6 +7140,7 @@ remove({blob}, {idx} [, {end}])
                return a |Blob| with these bytes.  When {idx} points to the same
                byte as {end} a |Blob| with one byte is returned.  When {end}
                points to a byte before {idx} this is an error.
+               Returns zero on error.
                Example: >
                        :echo "last byte: " .. remove(myblob, -1)
                        :call remove(mylist, 0, 9)
@@ -7131,6 +7150,7 @@ remove({dict}, {key})
                Example: >
                        :echo "removed " .. remove(dict, "one")
 <              If there is no {key} in {dict} this is an error.
+               Returns zero on error.
 
 rename({from}, {to})                                   *rename()*
                Rename the file by the name {from} to the name {to}.  This
@@ -7179,6 +7199,7 @@ reverse({object})                                 *reverse()*
                Reverse the order of items in {object} in-place.
                {object} can be a |List| or a |Blob|.
                Returns {object}.
+               Returns zero if {object} is not a List or a Blob.
                If you want an object to remain unmodified make a copy first: >
                        :let revlist = reverse(copy(mylist))
 <              Can also be used as a |method|: >
@@ -7189,6 +7210,7 @@ round({expr})                                                     *round()*
                as a |Float|.  If {expr} lies halfway between two integral
                values, then use the larger one (away from zero).
                {expr} must evaluate to a |Float| or a |Number|.
+               Returns 0.0 if {expr} is not a |Float| or a |Number|.
                Examples: >
                        echo round(0.456)
 <                      0.0  >
@@ -7223,6 +7245,7 @@ screenattr({row}, {col})                                  *screenattr()*
                Like |screenchar()|, but return the attribute.  This is a rather
                arbitrary number that can only be used to compare to the
                attribute at other positions.
+               Returns -1 when row or col is out of range.
 
                Can also be used as a |method|: >
                        GetRow()->screenattr(col)
@@ -7286,6 +7309,7 @@ screenpos({winid}, {lnum}, {col})                         *screenpos()*
                |conceal| taken into account.
                If the position is in a closed fold the screen position of the
                first character is returned, {col} is not used.
+               Returns an empty Dict if {winid} is invalid.
 
                Can also be used as a |method|: >
                        GetWinid()->screenpos(lnum, col)
@@ -8346,6 +8370,7 @@ simplify({filename})                                      *simplify()*
 sin({expr})                                            *sin()*
                Return the sine of {expr}, measured in radians, as a |Float|.
                {expr} must evaluate to a |Float| or a |Number|.
+               Returns 0.0 if {expr} is not a |Float| or a |Number|.
                Examples: >
                        :echo sin(100)
 <                      -0.506366 >
@@ -8362,6 +8387,7 @@ sinh({expr})                                              *sinh()*
                Return the hyperbolic sine of {expr} as a |Float| in the range
                [-inf, inf].
                {expr} must evaluate to a |Float| or a |Number|.
+               Returns 0.0 if {expr} is not a |Float| or a |Number|.
                Examples: >
                        :echo sinh(0.5)
 <                      0.521095 >
@@ -8381,6 +8407,7 @@ slice({expr}, {start} [, {end}])                  *slice()*
                |vim9script|.  Also, composing characters are not counted.
                When {end} is omitted the slice continues to the last item.
                When {end} is -1 the last item is omitted.
+               Returns an empty value if {start} or {end} are invalid.
 
                Can also be used as a |method|: >
                        GetList()->slice(offset)
@@ -8626,7 +8653,8 @@ sqrt({expr})                                              *sqrt()*
                Return the non-negative square root of Float {expr} as a
                |Float|.
                {expr} must evaluate to a |Float| or a |Number|.  When {expr}
-               is negative the result is NaN (Not a Number).
+               is negative the result is NaN (Not a Number).  Returns 0.0 if
+               {expr} is not a |Float| or a |Number|.
                Examples: >
                        :echo sqrt(100)
 <                      10.0 >
@@ -8707,6 +8735,8 @@ str2float({string} [, {quoted}])                          *str2float()*
                |substitute()|: >
                        let f = str2float(substitute(text, ',', '', 'g'))
 <
+               Returns 0.0 if the conversion fails.
+
                Can also be used as a |method|: >
                        let f = text->substitute(',', '', 'g')->str2float()
 <
@@ -8746,6 +8776,8 @@ str2nr({string} [, {base} [, {quoted}]])                  *str2nr()*
                {base} is 2 a leading "0b" or "0B" is ignored.
                Text after the number is silently ignored.
 
+               Returns 0 if {string} is empty or on error.
+
                Can also be used as a |method|: >
                        GetText()->str2nr()
 
@@ -8756,6 +8788,8 @@ strcharlen({string})                                      *strcharlen()*
                |strchars()| can count the number of characters, counting
                composing characters separately.
 
+               Returns 0 if {string} is empty or on error.
+
                Also see |strlen()|, |strdisplaywidth()| and |strwidth()|.
 
                Can also be used as a |method|: >
index 190ce7c55b0b4c85e9baee9c8897a1e03d2a180b..8be4c627af592cb7381492a6bc04ac76bb272009 100644 (file)
@@ -1,4 +1,4 @@
-*index.txt*     For Vim version 8.2.  Last change: 2022 Mar 05
+*index.txt*     For Vim version 8.2.  Last change: 2022 Jun 11
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -295,7 +295,7 @@ tag         char          note action in Normal mode        ~
 |/|            /{pattern}<CR>  1  search forward for the Nth occurrence of
                                   {pattern}
 |/<CR>|                /<CR>           1  search forward for {pattern} of last search
-|count|                0               1  cursor to the first char of the line
+|0|            0               1  cursor to the first char of the line
 |count|                1                  prepend to command to give a count
 |count|                2                       "
 |count|                3                       "
index 38a4a1c780c2f688dab7e063892f621450c06cca..e75f87060f66748db1184cc6e6955c1115709f7f 100644 (file)
@@ -1,4 +1,4 @@
-*syntax.txt*   For Vim version 8.2.  Last change: 2022 Jun 03
+*syntax.txt*   For Vim version 8.2.  Last change: 2022 Jun 10
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -5395,8 +5395,8 @@ StatusLineNC      status lines of not-current windows
                                                        *hl-StatusLineTerm*
 StatusLineTerm Status line of current window, if it is a |terminal| window.
                                                        *hl-StatusLineTermNC*
-StatusLineTermNC   Status lines of not-current windows that is a |terminal|
-               window.
+StatusLineTermNC       Status lines of not-current windows that is a
+                       |terminal| window.
                                                        *hl-TabLine*
 TabLine                Tab pages line, not active tab page label.
                                                        *hl-TabLineFill*
index bd86b20cbb16c6aea9f8f39bd46bde0da2a77442..d880553c4314d33ad0780fcf2bc51fd716f35506 100644 (file)
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 8.2.  Last change: 2022 Jun 09
+*todo.txt*      For Vim version 8.2.  Last change: 2022 Jun 12
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -38,6 +38,9 @@ browser use: https://github.com/vim/vim/issues/1234
                                                        *known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+searchpair() must call function to set timeout, not pass the time limit down
+(and set it many times).  #10562
+
 Prepare for Vim 9.0 release:
 - Update the user manual:
   - Add more to usr_50.txt as an "advanced section" of usr_41.txt
index ba3cd2eda2bf8253f2e91f65c8cd79d374e88c26..e2dc4636575e7beb4864f50654ea8a6753570fa5 100644 (file)
@@ -1,4 +1,4 @@
-*usr_41.txt*   For Vim version 8.2.  Last change: 2022 Jun 04
+*usr_41.txt*   For Vim version 8.2.  Last change: 2022 Jun 10
 
                     VIM USER MANUAL - by Bram Moolenaar
 
@@ -1509,7 +1509,7 @@ functions: >
        function SetSyn(name) ~
 
 The "<SNR>" prefix means that a function is script-local.  |Vim9| functions
-wil start with "def" and include argument and return types.  Legacy functions
+will start with "def" and include argument and return types.  Legacy functions
 are listed with "function".
 
 To see what a function does, use its name as an argument for `function`: >
@@ -1667,7 +1667,7 @@ Notice that the first item of the List that range() produces is zero, thus the
 last item is one less than the length of the list.  Detail: Internally range()
 does not actually create the list, so that a large range used in a for loop
 works efficiently.  When used elsewhere, the range is turned into an actual
-list, which takes more time for a long ist.
+list, which takes more time for a long list.
 
 You can also specify the maximum value, the stride and even go backwards: >
 
index 9cd90d5bee66ae6f7f59d97d533b66524b49c5ac..9b7c8dce1706a235fc4b386225b4996b59c8b074 100644 (file)
@@ -1,4 +1,4 @@
-*vim9.txt*     For Vim version 8.2.  Last change: 2022 May 21
+*vim9.txt*     For Vim version 8.2.  Last change: 2022 Jun 10
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1612,7 +1612,7 @@ and cannot be accessed by the importing script.
 This mechanism exists for writing a script that can be sourced (imported) by
 other scripts, while making sure these other scripts only have access to what
 you want them to.  This also avoids using the global namespace, which has a
-risc of name collisions.  For example when you have two plugins with similar
+risk of name collisions.  For example when you have two plugins with similar
 functionality.
 
 You can cheat by using the global namespace explicitly.  That should be done
@@ -1758,7 +1758,9 @@ used: >
 
 When the mapping is defined "<SID>name." will be replaced with <SNR> and the
 script ID of the imported script.
-
+An even simpler solution is using |<ScriptCmd>|: >
+       noremap ,a <ScriptCmd>name.Function()<CR>
+<
                                                        *:import-cycle*
 The `import` commands are executed when encountered.  If script A imports
 script B, and B (directly or indirectly) imports A, this will be skipped over.
@@ -2202,7 +2204,7 @@ dictionary.  With some care this can be made to work, but it does not look
 like real classes.  On top of that, it's quite slow, because of the use of
 dictionaries.
 
-It would be good to support real classes, and this is planned for a leter
+It would be good to support real classes, and this is planned for a later
 version.  The support is a "minimal common functionality" of class support in
 most languages.  It will work much like Java, which is the most popular
 programming language.
index e0afd1f97d5226ec11a5a042fbb2d68247e3c54f..d053f63041db249f0b18f59bb81b1b3dd83f2981 100644 (file)
@@ -4,24 +4,28 @@ vim9script
 
 # Called when editing the doc/syntax.txt file
 export def HighlightGroups()
+  var save_cursor = getcurpos()
   var buf: number = bufnr('%')
-  var lnum: number = search('\*highlight-groups\*', 'cn')
-  while getline(lnum) !~ '===' && lnum < line('$')
-    var word: string = getline(lnum)->matchstr('^\w\+\ze\s')
+
+  var start: number = search('\*highlight-groups\*', 'c')
+  var end: number = search('^======')
+  for lnum in range(start, end)
+    var word: string = getline(lnum)->matchstr('^\w\+\ze\t')
     if word->hlexists()
-      var name = 'help-hl-' .. word
-      if prop_type_list({bufnr: buf})->match(name) == -1
-       prop_type_add('help-hl-' .. word, {
-         bufnr: buf,
-         highlight: word,
-         combine: false,
-         })
-      else
+      var type = 'help-hl-' .. word
+      if prop_type_list({bufnr: buf})->index(type) != -1
        # was called before, delete existing properties
-       prop_remove({type: name, bufnr: buf})
+       prop_remove({type: type, bufnr: buf})
+       prop_type_delete(type, {bufnr: buf})
       endif
-      prop_add(lnum, 1, {length: word->strlen(), type: 'help-hl-' .. word})
+      prop_type_add(type, {
+       bufnr: buf,
+       highlight: word,
+       combine: false,
+       })
+      prop_add(lnum, 1, {length: word->strlen(), type: type})
     endif
-    ++lnum
-  endwhile
+  endfor
+
+  setpos('.', save_cursor)
 enddef
index 366f65890c4ed3d7433f346261459c9be8b35adc..f90197aeb05bc7fad9c47d40afba32f130d0f31f 100644 (file)
@@ -2,7 +2,8 @@
 " Language:            M4
 " Maintainer:  Claudio Fleiner (claudio@fleiner.com)
 " URL:                 http://www.fleiner.com/vim/syntax/m4.vim
-" Last Change: 2005 Jan 15
+"                              (outdated)
+" Last Change: 2022 Jun 12
 
 " This file will highlight user function calls if they use only
 " capital letters and have at least one argument (i.e. the '('
index 731a514cb2bcb641a2e94d585a08dec6ae43de7c..a0ff49907dc8a85fad00b77de188728178dfe1ee 100644 (file)
@@ -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:         Oct 26, 2021
-" Version:             199
+" Last Change:         Jun 09, 2022
+" Version:             201
 " 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
@@ -138,7 +138,7 @@ syn cluster shErrorList     contains=shDoError,shIfError,shInError,shCaseError,shEsa
 if exists("b:is_kornshell") || exists("b:is_bash")
  syn cluster ErrorList add=shDTestError
 endif
-syn cluster shArithParenList   contains=shArithmetic,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor,shFunctionKey,shFunctionOne,shFunctionTwo
+syn cluster shArithParenList   contains=shArithmetic,shArithParen,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor,shFunctionKey,shFunctionOne,shFunctionTwo
 syn cluster shArithList        contains=@shArithParenList,shParenError
 syn cluster shCaseEsacList     contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
 syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
@@ -147,8 +147,8 @@ if exists("b:is_kornshell") || exists("b:is_bash")
 endif
 syn cluster shCommandSubList   contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shComment,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
 syn cluster shCurlyList        contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
-" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43
-syn cluster shDblQuoteList     contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
+" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43 -- Jun 09, 2022: I don't see the problem with ksh04, so am reinstating shEscape
+syn cluster shDblQuoteList     contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
 syn cluster shDerefList        contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
 syn cluster shDerefVarList     contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError
 syn cluster shEchoList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
@@ -157,11 +157,12 @@ syn cluster shExprList2   contains=@shExprList1,@shCaseList,shTest
 syn cluster shFunctionList     contains=@shCommandSubList,shCaseEsac,shColon,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
 if exists("b:is_kornshell") || exists("b:is_bash")
  syn cluster shFunctionList    add=shRepeat,shDblBrace,shDblParen,shForPP
+ syn cluster shDerefList       add=shCommandSubList,shEchoDeref
 endif
 syn cluster shHereBeginList    contains=@shCommandSubList
 syn cluster shHereList contains=shBeginHere,shHerePayload
 syn cluster shHereListDQ       contains=shBeginHere,@shDblQuoteList,shHerePayload
-syn cluster shIdList   contains=shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
+syn cluster shIdList   contains=shArithmetic,shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
 syn cluster shIfList   contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
 syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shIf,shOption,shSet,shTest,shTestOpr,shTouch
 if exists("b:is_kornshell") || exists("b:is_bash")
@@ -179,6 +180,10 @@ syn cluster shForList      contains=shTestOpr,shNumber,shDerefSimple,shDeref,shComman
 " This one is needed INSIDE a CommandSub, so that `echo bla` be correct
 syn region shEcho matchgroup=shStatement start="\<echo\>"  skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
 syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
+ syn region shEchoDeref contained matchgroup=shStatement start="\<echo\>"  skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+ syn region shEchoDeref contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+endif
 syn match  shEchoQuote contained       '\%(\\\\\)*\\["`'()]'
 
 " This must be after the strings, so that ... \" will be correct
@@ -291,13 +296,15 @@ syn match shCaseStart     contained skipwhite skipnl "("                  nextgroup=shCase,shCaseBa
 syn match shCaseLabel  contained skipwhite     "\%(\\.\|[-a-zA-Z0-9_*.]\)\+"   contains=shCharClass
 if exists("b:is_bash")
  ShFoldIfDoFor syn region      shCase  contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)"  end=";;" end=";&" end=";;&" end="esac"me=s-1   contains=@shCaseList    nextgroup=shCaseStart,shCase,shComment
+elseif exists("b:is_kornshell")
+ ShFoldIfDoFor syn region      shCase  contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)"  end=";;" end=";&" end="esac"me=s-1     contains=@shCaseList    nextgroup=shCaseStart,shCase,shComment
 else                                                                                                                     
  ShFoldIfDoFor syn region      shCase  contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)"  end=";;" end="esac"me=s-1              contains=@shCaseList    nextgroup=shCaseStart,shCase,shComment
 endif
 ShFoldIfDoFor syn region       shCaseEsac      matchgroup=shConditional start="\<case\>" end="\<esac\>"        contains=@shCaseEsacList
 
 syn keyword shCaseIn   contained skipwhite skipnl in                   nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
-if exists("b:is_bash")
+if exists("b:is_bash") || exists("b:is_kornshell")
  syn region  shCaseExSingleQuote       matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial      skipwhite skipnl nextgroup=shCaseBar    contained
 elseif !exists("g:sh_no_error")
  syn region  shCaseExSingleQuote       matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+   contains=shStringSpecial        skipwhite skipnl nextgroup=shCaseBar    contained
@@ -329,10 +336,11 @@ syn match   shEscape      contained       '\%(^\)\@!\%(\\\\\)*\\.'        nextgroup=shComment
 " 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="\$("  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\+"
+ syn region shArithParen matchgroup=shArithRegion  contained start="(" end=")" contains=@shArithParenList
 elseif !exists("g:sh_no_error")
  syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
 endif
@@ -368,7 +376,7 @@ endif
 syn match   shNumber   "\<\d\+\>#\="
 syn match   shNumber   "\<-\=\.\=\d\+\>#\="
 syn match   shCtrlSeq  "\\\d\d\d\|\\[abcfnrtv0]"                       contained
-if exists("b:is_bash")
+if exists("b:is_bash") || exists("b:is_kornshell")
  syn match   shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]"     contained
  syn match   shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
  syn region  shExSingleQuote   matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial              nextgroup=shSpecialNxt
@@ -441,19 +449,24 @@ syn match  shVar  contained       "\h\w*"
 syn region shAtExpr    contained       start="@(" end=")" contains=@shIdList
 if exists("b:is_bash")
  syn match  shSet "^\s*set\ze\s\+$"
- syn region shSetList oneline matchgroup=shSet start="\<\%(declare\|local\|export\)\>\ze[/a-zA-Z_]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|="    contains=@shIdList
+ syn region shSetList oneline matchgroup=shSet start="\<\%(declare\|local\|export\)\>\ze[/a-zA-Z_]\@!" end="$"         matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|="    contains=@shIdList
  syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\)\>[/a-zA-Z_]\@!" end="\ze[;|#)]\|$"             matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+="       contains=@shIdList nextgroup=shComment
 elseif exists("b:is_kornshell") || exists("b:is_posix")
  syn match  shSet "^\s*set\ze\s\+$"
  if exists("b:is_dash")
-  syn region shSetList oneline matchgroup=shSet start="\<\%(local\)\>\ze[/]\@!" end="$"                         matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"   contains=@shIdList
+  syn region shSetList oneline matchgroup=shSet start="\<\%(local\)\>\ze[/]\@!" end="$"                        matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"    contains=@shIdList
  endif
- syn region shSetList oneline matchgroup=shSet start="\<\(export\)\>\ze[/]\@!" end="$"         matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"    contains=@shIdList
+ syn region shSetList oneline matchgroup=shSet start="\<\(export\)\>\ze[/]\@!" end="$"                 matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"    contains=@shIdList
  syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\>\)\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$"          matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"    contains=@shIdList nextgroup=shComment
 else
  syn region shSetList oneline matchgroup=shSet start="\<\(set\|export\|unset\)\>\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$"   matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"    contains=@shIdList
 endif
 
+" KornShell namespace: {{{1
+if exists("b:is_kornshell")
+ syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shFunctionTwo
+endif
+
 " Functions: {{{1
 if !exists("b:is_posix")
  syn keyword shFunctionKey function    skipwhite skipnl nextgroup=shFunctionTwo
@@ -473,7 +486,7 @@ endif
 
 " Parameter Dereferencing: {{{1
 " ========================
-if !exists("g:sh_no_error")
+if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
  syn match  shDerefWordError   "[^}$[~]"       contained
 endif
 syn match  shDerefSimple       "\$\%(\h\w*\|\d\)"      nextgroup=@shNoZSList
@@ -486,6 +499,13 @@ if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
  syn region shDeref    matchgroup=PreProc start="\${\$\$" end="}"      contains=@shDerefList   nextgroup=@shSpecialNoZS,shSpecialStart
 endif
 
+" ksh: ${.sh.*} variables: {{{1
+" ========================================
+if exists("b:is_kornshell")
+" syn match  shDerefVar        contained       "[.]*"  nextgroup=@shDerefVarList
+ syn match  shDerefVar contained       "\.\+"  nextgroup=@shDerefVarList
+endif
+
 " ksh: ${!var[*]} array index list syntax: {{{1
 " ========================================
 if exists("b:is_kornshell") || exists("b:is_posix")
index af3c2e4b1840df20c5fde3c73a46543469355946..304fdb083e97e57364c7ecf9318e0351d2535e72 100644 (file)
@@ -1,8 +1,8 @@
 " Vim syntax file
 " Language:    Vim 8.2 script
 " Maintainer:  Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
-" Last Change: May 27, 2022
-" Version:     8.2-42
+" Last Change: Jun 12, 2022
+" Version:     8.2-43
 " URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
 " Automatically generated keyword lists: {{{1
 
@@ -328,7 +328,7 @@ syn match   vimPatSep       contained       "\\|"
 syn region     vimPatSepZone   oneline   contained   matchgroup=vimPatSepZ start="\\%\=\ze(" skip="\\\\" end="\\)\|[^\\]['"]"  contains=@vimStringGroup
 syn region     vimPatRegion    contained transparent matchgroup=vimPatSepR start="\\[z%]\=(" end="\\)" contains=@vimSubstList oneline
 syn match      vimNotPatSep    contained       "\\\\"
-syn cluster    vimStringGroup  contains=vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
+syn cluster    vimStringGroup  contains=vimEscape,vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
 syn region     vimString       oneline keepend start=+[^a-zA-Z>!\\@]"+lc=1 skip=+\\\\\|\\"+ matchgroup=vimStringEnd end=+"+    contains=@vimStringGroup
 syn region     vimString       oneline keepend start=+[^a-zA-Z>!\\@]'+lc=1 end=+'+
 syn region     vimString       oneline start=+=!+lc=1  skip=+\\\\\|\\!+ end=+!+        contains=@vimStringGroup
@@ -336,6 +336,7 @@ syn region  vimString       oneline start="=+"lc=1  skip="\\\\\|\\+" end="+"        contains=@v
 "syn region    vimString       oneline start="\s/\s*\A"lc=1 skip="\\\\\|\\+" end="/"   contains=@vimStringGroup  " see tst45.vim
 syn match      vimString       contained       +"[^"]*\\$+     skipnl nextgroup=vimStringCont
 syn match      vimStringCont   contained       +\(\\\\\|.\)\{-}[^\\]"+
+syn match      vimEscape       contained       "\\."
 
 " Substitutions: {{{2
 " =============
@@ -465,7 +466,7 @@ syn case match
 " User Function Highlighting: {{{2
 " (following Gautam Iyer's suggestion)
 " ==========================
-syn match vimFunc              "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*("                contains=vimCommand,vimFuncEcho,vimFuncName,vimUserFunc,vimExecute
+syn match vimFunc              "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*("                contains=vimFuncEcho,vimFuncName,vimUserFunc,vimExecute
 syn match vimUserFunc contained        "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>"  contains=vimCommand,vimNotation
 syn keyword vimFuncEcho contained      ec ech echo
 
@@ -897,6 +898,7 @@ if !exists("skip_vim_syntax_inits")
  hi def link vimElseif vimCondHL
  hi def link vimEnvvar PreProc
  hi def link vimError  Error
+ hi def link vimEscape Special
  hi def link vimFBVar  vimVar
  hi def link vimFgBgAttrib     vimHiAttrib
  hi def link vimFuncEcho       vimCommand