Patch 8.1.0296
Problem: Command parsing for 'incsearch' is a bit ugly.
Solution: Return when there is no pattern. Put common checks together.
Files: src/ex_getln.c
*** ../vim-8.1.0295/src/ex_getln.c 2018-08-18 21:04:57.743864534 +0200
--- src/ex_getln.c 2018-08-18 21:20:59.041314761 +0200
***************
*** 276,415 ****
do_incsearch_highlighting(int firstc, incsearch_state_T *is_state,
int *skiplen, int *patlen)
{
*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 == ':')
{
! 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;
! }
! }
! }
}
}
! return FALSE;
}
static void
--- 276,400 ----
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)
! 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 == '!')
{
! p++;
! if (*skipwhite(p) == NUL)
! 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
*** ../vim-8.1.0295/src/version.c 2018-08-18 21:04:57.743864534 +0200
--- src/version.c 2018-08-18 21:22:23.748034012 +0200
***************
*** 796,797 ****
--- 796,799 ----
{ /* Add new patch number below this line */
+ /**/
+ 296,
/**/
--
The Characters and incidents portrayed and the names used are fictitious and
any similarity to the names, characters, or history of any person is entirely
accidental and unintentional.
Signed RICHARD M. NIXON
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.