@@ -52,6 +52,9 @@ static void restore_cmdline(cmdline_info_T *ccp);
5252static int cmdline_paste (int regname , int literally , int remcr );
5353static void redrawcmdprompt (void );
5454static int ccheck_abbr (int );
55+ #ifdef FEAT_SEARCH_EXTRA
56+ static int empty_pattern_magic (char_u * pat , size_t len , magic_T magic_val );
57+ #endif
5558
5659#ifdef FEAT_CMDWIN
5760static int open_cmdwin (void );
@@ -89,15 +92,34 @@ abandon_cmdline(void)
8992 * as a trailing \|, which can happen while typing a pattern.
9093 */
9194 static int
92- empty_pattern (char_u * p )
95+ empty_pattern (char_u * p , int delim )
9396{
94- size_t n = STRLEN (p );
97+ size_t n = STRLEN (p );
98+ magic_T magic_val = MAGIC_ON ;
99+
100+ if (n > 0 )
101+ (void ) skip_regexp_ex (p , delim , magic_isset (), NULL , NULL , & magic_val );
102+ else
103+ return TRUE;
95104
105+ return empty_pattern_magic (p , n , magic_val );
106+ }
107+
108+ static int
109+ empty_pattern_magic (char_u * p , size_t len , magic_T magic_val )
110+ {
96111 // remove trailing \v and the like
97- while (n >= 2 && p [n - 2 ] == '\\'
98- && vim_strchr ((char_u * )"mMvVcCZ" , p [n - 1 ]) != NULL )
99- n -= 2 ;
100- return n == 0 || (n >= 2 && p [n - 2 ] == '\\' && p [n - 1 ] == '|' );
112+ while (len >= 2 && p [len - 2 ] == '\\'
113+ && vim_strchr ((char_u * )"mMvVcCZ" , p [len - 1 ]) != NULL )
114+ len -= 2 ;
115+
116+ // true, if the pattern is empty, or the pattern ends with \| and magic is
117+ // set (or it ends with '|' and very magic is set)
118+ return len == 0 || (len > 1
119+ && ((p [len - 2 ] == '\\'
120+ && p [len - 1 ] == '|' && magic_val == MAGIC_ON )
121+ || (p [len - 2 ] != '\\'
122+ && p [len - 1 ] == '|' && magic_val == MAGIC_ALL )));
101123}
102124
103125// Struct to store the viewstate during 'incsearch' highlighting.
@@ -149,7 +171,7 @@ typedef struct {
149171 pos_T match_end ;
150172 int did_incsearch ;
151173 int incsearch_postponed ;
152- magic_T magic_overruled_save ;
174+ optmagic_T magic_overruled_save ;
153175} incsearch_state_T ;
154176
155177 static void
@@ -207,6 +229,7 @@ do_incsearch_highlighting(
207229 pos_T save_cursor ;
208230 int use_last_pat ;
209231 int retval = FALSE;
232+ magic_T magic = 0 ;
210233
211234 * skiplen = 0 ;
212235 * patlen = ccline .cmdlen ;
@@ -252,9 +275,9 @@ do_incsearch_highlighting(
252275 || STRNCMP (cmd , "vglobal" , p - cmd ) == 0 )
253276 {
254277 if (* cmd == 's' && cmd [1 ] == 'm' )
255- magic_overruled = MAGIC_ON ;
278+ magic_overruled = OPTION_MAGIC_ON ;
256279 else if (* cmd == 's' && cmd [1 ] == 'n' )
257- magic_overruled = MAGIC_OFF ;
280+ magic_overruled = OPTION_MAGIC_OFF ;
258281 }
259282 else if (STRNCMP (cmd , "sort" , MAX (p - cmd , 3 )) == 0 )
260283 {
@@ -288,7 +311,7 @@ do_incsearch_highlighting(
288311 p = skipwhite (p );
289312 delim = (delim_optional && vim_isIDc (* p )) ? ' ' : * p ++ ;
290313 * search_delim = delim ;
291- end = skip_regexp (p , delim , magic_isset ());
314+ end = skip_regexp_ex (p , delim , magic_isset (), NULL , NULL , & magic );
292315
293316 use_last_pat = end == p && * end == delim ;
294317
@@ -302,7 +325,7 @@ do_incsearch_highlighting(
302325 int empty ;
303326
304327 * end = NUL ;
305- empty = empty_pattern ( p );
328+ empty = empty_pattern_magic ( p , STRLEN ( p ), magic );
306329 * end = c ;
307330 if (empty )
308331 goto theend ;
@@ -535,7 +558,8 @@ may_do_incsearch_highlighting(
535558 {
536559 next_char = ccline .cmdbuff [skiplen + patlen ];
537560 ccline .cmdbuff [skiplen + patlen ] = NUL ;
538- if (empty_pattern (ccline .cmdbuff ) && !no_hlsearch )
561+ if (empty_pattern (ccline .cmdbuff + skiplen , search_delim )
562+ && !no_hlsearch )
539563 {
540564 redraw_all_later (SOME_VALID );
541565 set_no_hlsearch (TRUE);
0 commit comments