@@ -2122,21 +2122,95 @@ endfunction
2122
2122
2123
2123
" FIXME: validate argument
2124
2124
function ! 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
+
2126
2135
while s: TRUE
2127
2136
let end = self .reader.getpos ()
2137
+ let pattern = s: FALSE
2138
+
2139
+ " Read non-alpha
2128
2140
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
2130
2209
call self .reader.getn (1 )
2131
2210
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
2137
2211
endif
2138
- call self .reader.getn (1 )
2139
2212
endwhile
2213
+
2140
2214
let node = s: Node (s: NODE_EXCMD )
2141
2215
let node.pos = self .ea .cmdpos
2142
2216
let node.ea = self .ea
0 commit comments