# HG changeset patch # User Christian Brabandt # Date 1534620605 -7200 # Node ID 5e038972cafadfd13977eb3e35113702990aa55a # Parent e14b93bae817e7159cf254112fb65398c5dcb004 patch 8.1.0296: command parsing for 'incsearch' is a bit ugly commit https://github.com/vim/vim/commit/111bbd61e96d1d3ee4bc07ae435fd97b88413aba Author: Bram Moolenaar 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. diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -276,140 +276,125 @@ set_search_match(pos_T *t) do_incsearch_highlighting(int firstc, incsearch_state_T *is_state, int *skiplen, int *patlen) { + char_u *cmd; + cmdmod_T save_cmdmod = cmdmod; + char_u *p; + int delim_optional = FALSE; + int delim; + char_u *end; + char_u *dummy; + exarg_T ea; + pos_T save_cursor; + *skiplen = 0; *patlen = ccline.cmdlen; - if (p_is && !cmd_silent) - { - // by default search all lines - search_first_line = 0; - search_last_line = MAXLNUM; - - if (firstc == '/' || firstc == '?') - return TRUE; - if (firstc == ':') + if (!p_is || cmd_silent) + return FALSE; + + // by default search all lines + search_first_line = 0; + search_last_line = MAXLNUM; + + if (firstc == '/' || firstc == '?') + return TRUE; + if (firstc != ':') + return FALSE; + + vim_memset(&ea, 0, sizeof(ea)); + ea.line1 = 1; + ea.line2 = 1; + ea.cmd = ccline.cmdbuff; + ea.addr_type = ADDR_LINES; + + parse_command_modifiers(&ea, &dummy, TRUE); + cmdmod = save_cmdmod; + + cmd = skip_range(ea.cmd, NULL); + if (vim_strchr((char_u *)"sgvl", *cmd) == NULL) + return FALSE; + + // Skip over "substitute" to find the pattern separator. + for (p = cmd; ASCII_ISALPHA(*p); ++p) + ; + if (*skipwhite(p) == NUL) + return FALSE; + + if (STRNCMP(cmd, "substitute", p - cmd) == 0 + || STRNCMP(cmd, "smagic", p - cmd) == 0 + || STRNCMP(cmd, "snomagic", MAX(p - cmd, 3)) == 0 + || STRNCMP(cmd, "vglobal", p - cmd) == 0) + { + if (*cmd == 's' && cmd[1] == 'm') + p_magic = TRUE; + else if (*cmd == 's' && cmd[1] == 'n') + p_magic = FALSE; + } + else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) + { + // skip over flags + while (ASCII_ISALPHA(*(p = skipwhite(p)))) + ++p; + if (*p == NUL) + return FALSE; + } + else if (STRNCMP(cmd, "vimgrep", MAX(p - cmd, 3)) == 0 + || STRNCMP(cmd, "vimgrepadd", MAX(p - cmd, 8)) == 0 + || STRNCMP(cmd, "lvimgrep", MAX(p - cmd, 2)) == 0 + || STRNCMP(cmd, "lvimgrepadd", MAX(p - cmd, 9)) == 0 + || STRNCMP(cmd, "global", p - cmd) == 0) + { + // skip over "!" + if (*p == '!') { - char_u *cmd; - cmdmod_T save_cmdmod = cmdmod; - char_u *p; - int delim; - char_u *end; - char_u *dummy; - exarg_T ea; - - vim_memset(&ea, 0, sizeof(ea)); - ea.line1 = 1; - ea.line2 = 1; - ea.cmd = ccline.cmdbuff; - ea.addr_type = ADDR_LINES; - - parse_command_modifiers(&ea, &dummy, TRUE); - cmdmod = save_cmdmod; - - cmd = skip_range(ea.cmd, NULL); - if (*cmd == 's' || *cmd == 'g' || *cmd == 'v' || *cmd == 'l') - { - // Skip over "substitute" to find the pattern separator. - for (p = cmd; ASCII_ISALPHA(*p); ++p) - ; - if (*skipwhite(p) != NUL) - { - if (STRNCMP(cmd, "substitute", p - cmd) == 0 - || STRNCMP(cmd, "smagic", p - cmd) == 0 - || STRNCMP(cmd, "snomagic", MAX(p - cmd, 3)) == 0 - || STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0 - || STRNCMP(cmd, "global", p - cmd) == 0 - || STRNCMP(cmd, "vglobal", p - cmd) == 0) - { - if (*cmd == 's' && cmd[1] == 'm') - p_magic = TRUE; - else if (*cmd == 's' && cmd[1] == 'n') - p_magic = FALSE; - - // Check for "global!/". - if (*cmd == 'g' && *p == '!') - { - p++; - if (*skipwhite(p) == NUL) - return FALSE; - } - - // For ":sort" skip over flags. - if (cmd[0] == 's' && cmd[1] == 'o') - { - while (ASCII_ISALPHA(*(p = skipwhite(p)))) - ++p; - if (*p == NUL) - return FALSE; - } - - p = skipwhite(p); - delim = *p++; - end = skip_regexp(p, delim, p_magic, NULL); - } - else if (STRNCMP(cmd, "vimgrep", MAX(p - cmd, 3)) == 0 - || STRNCMP(cmd, "vimgrepadd", MAX(p - cmd, 8)) == 0 - || STRNCMP(cmd, "lvimgrep", MAX(p - cmd, 2)) == 0 - || STRNCMP(cmd, "lvimgrepadd", MAX(p - cmd, 9)) == 0) - { - // Check for "!/". - if (*p == '!') - { - p++; - if (*skipwhite(p) == NUL) - return FALSE; - } - p = skipwhite(p); - delim = (vim_isIDc(*p)) ? ' ' : *p++; - end = skip_regexp(p, delim, p_magic, NULL); - } - else - { - end = p; - delim = -1; - } - - if (end > p || *end == delim) - { - pos_T save_cursor = curwin->w_cursor; - - // found a non-empty pattern or // - *skiplen = (int)(p - ccline.cmdbuff); - *patlen = (int)(end - p); - - // parse the address range - curwin->w_cursor = is_state->search_start; - parse_cmd_address(&ea, &dummy); - if (ea.addr_count > 0) - { - // Allow for reverse match. - if (ea.line2 < ea.line1) - { - search_first_line = ea.line2; - search_last_line = ea.line1; - } - else - { - search_first_line = ea.line1; - search_last_line = ea.line2; - } - } - else if (cmd[0] == 's' && cmd[1] != 'o') - { - // :s defaults to the current line - search_first_line = curwin->w_cursor.lnum; - search_last_line = curwin->w_cursor.lnum; - } - - curwin->w_cursor = save_cursor; - return TRUE; - } - } - } + p++; + if (*skipwhite(p) == NUL) + return FALSE; } - } - - return FALSE; + if (*cmd != 'g') + delim_optional = TRUE; + } + else + return FALSE; + + p = skipwhite(p); + delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; + end = skip_regexp(p, delim, p_magic, NULL); + + if (end == p && *end != delim) + return FALSE; + // found a non-empty pattern or // + + *skiplen = (int)(p - ccline.cmdbuff); + *patlen = (int)(end - p); + + // parse the address range + save_cursor = curwin->w_cursor; + curwin->w_cursor = is_state->search_start; + parse_cmd_address(&ea, &dummy); + if (ea.addr_count > 0) + { + // Allow for reverse match. + if (ea.line2 < ea.line1) + { + search_first_line = ea.line2; + search_last_line = ea.line1; + } + else + { + search_first_line = ea.line1; + search_last_line = ea.line2; + } + } + else if (cmd[0] == 's' && cmd[1] != 'o') + { + // :s defaults to the current line + search_first_line = curwin->w_cursor.lnum; + search_last_line = curwin->w_cursor.lnum; + } + + curwin->w_cursor = save_cursor; + return TRUE; } static void diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 296, +/**/ 295, /**/ 294,