summaryrefslogtreecommitdiffstats
path: root/src/ex_getln.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-04 12:42:13 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-04 12:42:13 +0100
commitd93a7fc1a98a58f8101ee780d4735079ad99ae35 (patch)
tree15445b4ab17588d6786645d1ff1235dfd4bb9fb6 /src/ex_getln.c
parent82c38fe508155c11a904e6111b5bfb6adde3fb9a (diff)
patch 8.2.2295: incsearch does not detect empty pattern properlyv8.2.2295
Problem: Incsearch does not detect empty pattern properly. Solution: Return magic state when skipping over a pattern. (Christian Brabandt, closes #7612, closes #6420)
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 04b10ead46..a3e1f4995c 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -52,6 +52,9 @@ static void restore_cmdline(cmdline_info_T *ccp);
static int cmdline_paste(int regname, int literally, int remcr);
static void redrawcmdprompt(void);
static int ccheck_abbr(int);
+#ifdef FEAT_SEARCH_EXTRA
+static int empty_pattern_magic(char_u *pat, size_t len, magic_T magic_val);
+#endif
#ifdef FEAT_CMDWIN
static int open_cmdwin(void);
@@ -89,15 +92,34 @@ abandon_cmdline(void)
* as a trailing \|, which can happen while typing a pattern.
*/
static int
-empty_pattern(char_u *p)
+empty_pattern(char_u *p, int delim)
{
- size_t n = STRLEN(p);
+ size_t n = STRLEN(p);
+ magic_T magic_val = MAGIC_ON;
+
+ if (n > 0)
+ (void) skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic_val);
+ else
+ return TRUE;
+ return empty_pattern_magic(p, n, magic_val);
+}
+
+ static int
+empty_pattern_magic(char_u *p, size_t len, magic_T magic_val)
+{
// remove trailing \v and the like
- while (n >= 2 && p[n - 2] == '\\'
- && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL)
- n -= 2;
- return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|');
+ while (len >= 2 && p[len - 2] == '\\'
+ && vim_strchr((char_u *)"mMvVcCZ", p[len - 1]) != NULL)
+ len -= 2;
+
+ // true, if the pattern is empty, or the pattern ends with \| and magic is
+ // set (or it ends with '|' and very magic is set)
+ return len == 0 || (len > 1
+ && ((p[len - 2] == '\\'
+ && p[len - 1] == '|' && magic_val == MAGIC_ON)
+ || (p[len - 2] != '\\'
+ && p[len - 1] == '|' && magic_val == MAGIC_ALL)));
}
// Struct to store the viewstate during 'incsearch' highlighting.
@@ -149,7 +171,7 @@ typedef struct {
pos_T match_end;
int did_incsearch;
int incsearch_postponed;
- magic_T magic_overruled_save;
+ optmagic_T magic_overruled_save;
} incsearch_state_T;
static void
@@ -207,6 +229,7 @@ do_incsearch_highlighting(
pos_T save_cursor;
int use_last_pat;
int retval = FALSE;
+ magic_T magic = 0;
*skiplen = 0;
*patlen = ccline.cmdlen;
@@ -252,9 +275,9 @@ do_incsearch_highlighting(
|| STRNCMP(cmd, "vglobal", p - cmd) == 0)
{
if (*cmd == 's' && cmd[1] == 'm')
- magic_overruled = MAGIC_ON;
+ magic_overruled = OPTION_MAGIC_ON;
else if (*cmd == 's' && cmd[1] == 'n')
- magic_overruled = MAGIC_OFF;
+ magic_overruled = OPTION_MAGIC_OFF;
}
else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0)
{
@@ -288,7 +311,7 @@ do_incsearch_highlighting(
p = skipwhite(p);
delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++;
*search_delim = delim;
- end = skip_regexp(p, delim, magic_isset());
+ end = skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic);
use_last_pat = end == p && *end == delim;
@@ -302,7 +325,7 @@ do_incsearch_highlighting(
int empty;
*end = NUL;
- empty = empty_pattern(p);
+ empty = empty_pattern_magic(p, STRLEN(p), magic);
*end = c;
if (empty)
goto theend;
@@ -535,7 +558,8 @@ may_do_incsearch_highlighting(
{
next_char = ccline.cmdbuff[skiplen + patlen];
ccline.cmdbuff[skiplen + patlen] = NUL;
- if (empty_pattern(ccline.cmdbuff) && !no_hlsearch)
+ if (empty_pattern(ccline.cmdbuff + skiplen, search_delim)
+ && !no_hlsearch)
{
redraw_all_later(SOME_VALID);
set_no_hlsearch(TRUE);