Mercurial > vim
comparison src/ex_getln.c @ 14565:5e038972cafa v8.1.0296
patch 8.1.0296: command parsing for 'incsearch' is a bit ugly
commit https://github.com/vim/vim/commit/111bbd61e96d1d3ee4bc07ae435fd97b88413aba
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Aug 18 21:23:05 2018 +0200
patch 8.1.0296: command parsing for 'incsearch' is a bit ugly
Problem: Command parsing for 'incsearch' is a bit ugly.
Solution: Return when there is no pattern. Put common checks together.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 18 Aug 2018 21:30:05 +0200 |
parents | d84e67a12671 |
children | 3f9b73cc8adb |
comparison
equal
deleted
inserted
replaced
14564:e14b93bae817 | 14565:5e038972cafa |
---|---|
274 */ | 274 */ |
275 static int | 275 static int |
276 do_incsearch_highlighting(int firstc, incsearch_state_T *is_state, | 276 do_incsearch_highlighting(int firstc, incsearch_state_T *is_state, |
277 int *skiplen, int *patlen) | 277 int *skiplen, int *patlen) |
278 { | 278 { |
279 char_u *cmd; | |
280 cmdmod_T save_cmdmod = cmdmod; | |
281 char_u *p; | |
282 int delim_optional = FALSE; | |
283 int delim; | |
284 char_u *end; | |
285 char_u *dummy; | |
286 exarg_T ea; | |
287 pos_T save_cursor; | |
288 | |
279 *skiplen = 0; | 289 *skiplen = 0; |
280 *patlen = ccline.cmdlen; | 290 *patlen = ccline.cmdlen; |
281 | 291 |
282 if (p_is && !cmd_silent) | 292 if (!p_is || cmd_silent) |
283 { | 293 return FALSE; |
284 // by default search all lines | 294 |
285 search_first_line = 0; | 295 // by default search all lines |
286 search_last_line = MAXLNUM; | 296 search_first_line = 0; |
287 | 297 search_last_line = MAXLNUM; |
288 if (firstc == '/' || firstc == '?') | 298 |
289 return TRUE; | 299 if (firstc == '/' || firstc == '?') |
290 if (firstc == ':') | 300 return TRUE; |
291 { | 301 if (firstc != ':') |
292 char_u *cmd; | 302 return FALSE; |
293 cmdmod_T save_cmdmod = cmdmod; | 303 |
294 char_u *p; | 304 vim_memset(&ea, 0, sizeof(ea)); |
295 int delim; | 305 ea.line1 = 1; |
296 char_u *end; | 306 ea.line2 = 1; |
297 char_u *dummy; | 307 ea.cmd = ccline.cmdbuff; |
298 exarg_T ea; | 308 ea.addr_type = ADDR_LINES; |
299 | 309 |
300 vim_memset(&ea, 0, sizeof(ea)); | 310 parse_command_modifiers(&ea, &dummy, TRUE); |
301 ea.line1 = 1; | 311 cmdmod = save_cmdmod; |
302 ea.line2 = 1; | 312 |
303 ea.cmd = ccline.cmdbuff; | 313 cmd = skip_range(ea.cmd, NULL); |
304 ea.addr_type = ADDR_LINES; | 314 if (vim_strchr((char_u *)"sgvl", *cmd) == NULL) |
305 | 315 return FALSE; |
306 parse_command_modifiers(&ea, &dummy, TRUE); | 316 |
307 cmdmod = save_cmdmod; | 317 // Skip over "substitute" to find the pattern separator. |
308 | 318 for (p = cmd; ASCII_ISALPHA(*p); ++p) |
309 cmd = skip_range(ea.cmd, NULL); | 319 ; |
310 if (*cmd == 's' || *cmd == 'g' || *cmd == 'v' || *cmd == 'l') | 320 if (*skipwhite(p) == NUL) |
311 { | 321 return FALSE; |
312 // Skip over "substitute" to find the pattern separator. | 322 |
313 for (p = cmd; ASCII_ISALPHA(*p); ++p) | 323 if (STRNCMP(cmd, "substitute", p - cmd) == 0 |
314 ; | 324 || STRNCMP(cmd, "smagic", p - cmd) == 0 |
315 if (*skipwhite(p) != NUL) | 325 || STRNCMP(cmd, "snomagic", MAX(p - cmd, 3)) == 0 |
316 { | 326 || STRNCMP(cmd, "vglobal", p - cmd) == 0) |
317 if (STRNCMP(cmd, "substitute", p - cmd) == 0 | 327 { |
318 || STRNCMP(cmd, "smagic", p - cmd) == 0 | 328 if (*cmd == 's' && cmd[1] == 'm') |
319 || STRNCMP(cmd, "snomagic", MAX(p - cmd, 3)) == 0 | 329 p_magic = TRUE; |
320 || STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0 | 330 else if (*cmd == 's' && cmd[1] == 'n') |
321 || STRNCMP(cmd, "global", p - cmd) == 0 | 331 p_magic = FALSE; |
322 || STRNCMP(cmd, "vglobal", p - cmd) == 0) | 332 } |
323 { | 333 else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) |
324 if (*cmd == 's' && cmd[1] == 'm') | 334 { |
325 p_magic = TRUE; | 335 // skip over flags |
326 else if (*cmd == 's' && cmd[1] == 'n') | 336 while (ASCII_ISALPHA(*(p = skipwhite(p)))) |
327 p_magic = FALSE; | 337 ++p; |
328 | 338 if (*p == NUL) |
329 // Check for "global!/". | 339 return FALSE; |
330 if (*cmd == 'g' && *p == '!') | 340 } |
331 { | 341 else if (STRNCMP(cmd, "vimgrep", MAX(p - cmd, 3)) == 0 |
332 p++; | 342 || STRNCMP(cmd, "vimgrepadd", MAX(p - cmd, 8)) == 0 |
333 if (*skipwhite(p) == NUL) | 343 || STRNCMP(cmd, "lvimgrep", MAX(p - cmd, 2)) == 0 |
334 return FALSE; | 344 || STRNCMP(cmd, "lvimgrepadd", MAX(p - cmd, 9)) == 0 |
335 } | 345 || STRNCMP(cmd, "global", p - cmd) == 0) |
336 | 346 { |
337 // For ":sort" skip over flags. | 347 // skip over "!" |
338 if (cmd[0] == 's' && cmd[1] == 'o') | 348 if (*p == '!') |
339 { | 349 { |
340 while (ASCII_ISALPHA(*(p = skipwhite(p)))) | 350 p++; |
341 ++p; | 351 if (*skipwhite(p) == NUL) |
342 if (*p == NUL) | 352 return FALSE; |
343 return FALSE; | 353 } |
344 } | 354 if (*cmd != 'g') |
345 | 355 delim_optional = TRUE; |
346 p = skipwhite(p); | 356 } |
347 delim = *p++; | 357 else |
348 end = skip_regexp(p, delim, p_magic, NULL); | 358 return FALSE; |
349 } | 359 |
350 else if (STRNCMP(cmd, "vimgrep", MAX(p - cmd, 3)) == 0 | 360 p = skipwhite(p); |
351 || STRNCMP(cmd, "vimgrepadd", MAX(p - cmd, 8)) == 0 | 361 delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; |
352 || STRNCMP(cmd, "lvimgrep", MAX(p - cmd, 2)) == 0 | 362 end = skip_regexp(p, delim, p_magic, NULL); |
353 || STRNCMP(cmd, "lvimgrepadd", MAX(p - cmd, 9)) == 0) | 363 |
354 { | 364 if (end == p && *end != delim) |
355 // Check for "!/". | 365 return FALSE; |
356 if (*p == '!') | 366 // found a non-empty pattern or // |
357 { | 367 |
358 p++; | 368 *skiplen = (int)(p - ccline.cmdbuff); |
359 if (*skipwhite(p) == NUL) | 369 *patlen = (int)(end - p); |
360 return FALSE; | 370 |
361 } | 371 // parse the address range |
362 p = skipwhite(p); | 372 save_cursor = curwin->w_cursor; |
363 delim = (vim_isIDc(*p)) ? ' ' : *p++; | 373 curwin->w_cursor = is_state->search_start; |
364 end = skip_regexp(p, delim, p_magic, NULL); | 374 parse_cmd_address(&ea, &dummy); |
365 } | 375 if (ea.addr_count > 0) |
366 else | 376 { |
367 { | 377 // Allow for reverse match. |
368 end = p; | 378 if (ea.line2 < ea.line1) |
369 delim = -1; | 379 { |
370 } | 380 search_first_line = ea.line2; |
371 | 381 search_last_line = ea.line1; |
372 if (end > p || *end == delim) | 382 } |
373 { | 383 else |
374 pos_T save_cursor = curwin->w_cursor; | 384 { |
375 | 385 search_first_line = ea.line1; |
376 // found a non-empty pattern or // | 386 search_last_line = ea.line2; |
377 *skiplen = (int)(p - ccline.cmdbuff); | 387 } |
378 *patlen = (int)(end - p); | 388 } |
379 | 389 else if (cmd[0] == 's' && cmd[1] != 'o') |
380 // parse the address range | 390 { |
381 curwin->w_cursor = is_state->search_start; | 391 // :s defaults to the current line |
382 parse_cmd_address(&ea, &dummy); | 392 search_first_line = curwin->w_cursor.lnum; |
383 if (ea.addr_count > 0) | 393 search_last_line = curwin->w_cursor.lnum; |
384 { | 394 } |
385 // Allow for reverse match. | 395 |
386 if (ea.line2 < ea.line1) | 396 curwin->w_cursor = save_cursor; |
387 { | 397 return TRUE; |
388 search_first_line = ea.line2; | |
389 search_last_line = ea.line1; | |
390 } | |
391 else | |
392 { | |
393 search_first_line = ea.line1; | |
394 search_last_line = ea.line2; | |
395 } | |
396 } | |
397 else if (cmd[0] == 's' && cmd[1] != 'o') | |
398 { | |
399 // :s defaults to the current line | |
400 search_first_line = curwin->w_cursor.lnum; | |
401 search_last_line = curwin->w_cursor.lnum; | |
402 } | |
403 | |
404 curwin->w_cursor = save_cursor; | |
405 return TRUE; | |
406 } | |
407 } | |
408 } | |
409 } | |
410 } | |
411 | |
412 return FALSE; | |
413 } | 398 } |
414 | 399 |
415 static void | 400 static void |
416 finish_incsearch_highlighting( | 401 finish_incsearch_highlighting( |
417 int gotesc, | 402 int gotesc, |