@@ -2122,21 +2122,95 @@ 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+ let c = self .reader.peek ()
2179+ if c !=# ' ='
2180+ continue
2181+ endif
2182+ call self .reader.getn (1 )
2183+ let pattern = s: TRUE
2184+ elseif self .reader.peek () == # ' ='
2185+ " Read arg value
2186+ call self .reader.getn (1 )
2187+ if arg == # ' cchar'
2188+ call self .reader.getn (1 )
2189+ else
2190+ while s: TRUE
2191+ call self .reader.read_alpha ()
2192+ let c = self .reader.peek ()
2193+ if c == # ' ,' || c == # ' @'
2194+ call self .reader.getn (1 )
2195+ else
2196+ break
2197+ endif
2198+ endwhile
2199+ endif
2200+ endif
2201+ endif
2202+
2203+ " Read pattern
2204+ if pattern
2205+ let c = self .reader.peek ()
2206+ if c == # ' ' || c == # ' <EOF>' || c == # ' <EOL>'
2207+ continue
2208+ endif
21302209 call self .reader.getn (1 )
21312210 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
21372211 endif
2138- call self .reader.getn (1 )
21392212 endwhile
2213+
21402214 let node = s: Node (s: NODE_EXCMD )
21412215 let node.pos = self .ea .cmdpos
21422216 let node.ea = self .ea
0 commit comments