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,