@@ -2122,21 +2122,94 @@ endfunction
21222122
21232123" FIXME: validate argument
21242124function ! s: VimLParser .parse_cmd_syntax () abort
2125- let end = self .reader.getpos ()
2125+ let subcmd = self .reader.read_alpha ()
2126+
2127+ " Read name
2128+ if subcmd == # ' region' || subcmd == # ' match'
2129+ call self .reader.read_white ()
2130+ call self .reader.read_alpha ()
2131+ endif
2132+
2133+ let match_pattern = subcmd !=# ' match'
2134+
21262135 while s: TRUE
21272136 let end = self .reader.getpos ()
2137+ let pattern = s: FALSE
2138+
2139+ " Read non-alpha
21282140 let c = self .reader.peek ()
2129- if c == # ' /' || c == # " '" || c == # ' "'
2141+ if self .ends_excmds (c )
2142+ if ! match_pattern && (c == # ' |' || c == # ' "' )
2143+ let pattern = s: TRUE
2144+ let match_pattern = s: TRUE
2145+ else
2146+ break
2147+ endif
2148+ elseif ! s: isalpha (c )
2149+ if ! match_pattern && ! s: iswhite (c )
2150+ let pattern = s: TRUE
2151+ let match_pattern = s: TRUE
2152+ else
2153+ call self .reader.getn (1 )
2154+ continue
2155+ endif
2156+ endif
2157+
2158+ " Read arg
2159+ if ! pattern
2160+ let arg_pos = self .reader.tell ()
2161+ let arg = self .reader.read_alpha ()
2162+
2163+ if ! match_pattern
2164+ \ && arg !=# ' keepend'
2165+ \ && arg !=# ' conceal'
2166+ \ && arg !=# ' cchar'
2167+ \ && arg !=# ' contained'
2168+ \ && arg !=# ' containedin'
2169+ \ && arg !=# ' nextgroup'
2170+ \ && arg !=# ' transparent'
2171+ \ && arg !=# ' skipwhite'
2172+ \ && arg !=# ' skipnl'
2173+ \ && arg !=# ' skipempty'
2174+ let match_pattern = s: TRUE
2175+ let pattern = s: TRUE
2176+ call self .reader.seek_set (arg_pos)
2177+ elseif subcmd == # ' region' && (arg == # ' start' || arg == # ' skip' || arg == # ' end' )
2178+ if self .reader.peek () !=# ' ='
2179+ continue
2180+ endif
2181+ call self .reader.getn (1 )
2182+ let pattern = s: TRUE
2183+ elseif self .reader.peek () == # ' ='
2184+ " Read arg value
2185+ call self .reader.getn (1 )
2186+ if arg == # ' cchar'
2187+ call self .reader.getn (1 )
2188+ else
2189+ while s: TRUE
2190+ call self .reader.read_alpha ()
2191+ let c = self .reader.peek ()
2192+ if c == # ' ,' || c == # ' @'
2193+ call self .reader.getn (1 )
2194+ else
2195+ break
2196+ endif
2197+ endwhile
2198+ endif
2199+ endif
2200+ endif
2201+
2202+ " Read pattern
2203+ if pattern
2204+ let c = self .reader.peek ()
2205+ if self .ends_excmds (c ) && c !=# ' |' && c !=# ' "'
2206+ continue
2207+ endif
21302208 call self .reader.getn (1 )
21312209 call self .parse_pattern (c )
2132- elseif c == # ' ='
2133- call self .reader.getn (1 )
2134- call self .parse_pattern (' ' )
2135- elseif self .ends_excmds (c )
2136- break
21372210 endif
2138- call self .reader.getn (1 )
21392211 endwhile
2212+
21402213 let node = s: Node (s: NODE_EXCMD )
21412214 let node.pos = self .ea .cmdpos
21422215 let node.ea = self .ea
0 commit comments