@@ -2122,21 +2122,94 @@ 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
+ 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
2130
2208
call self .reader.getn (1 )
2131
2209
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
2210
endif
2138
- call self .reader.getn (1 )
2139
2211
endwhile
2212
+
2140
2213
let node = s: Node (s: NODE_EXCMD )
2141
2214
let node.pos = self .ea .cmdpos
2142
2215
let node.ea = self .ea
0 commit comments