xref: /vim-8.2.3635/src/insexpand.c (revision 3075a455)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 
10 /*
11  * insexpand.c: functions for Insert mode completion
12  */
13 
14 #include "vim.h"
15 
16 /*
17  * Definitions used for CTRL-X submode.
18  * Note: If you change CTRL-X submode, you must also maintain ctrl_x_msgs[] and
19  * ctrl_x_mode_names[] below.
20  */
21 # define CTRL_X_WANT_IDENT	0x100
22 
23 # define CTRL_X_NORMAL		0  // CTRL-N CTRL-P completion, default
24 # define CTRL_X_NOT_DEFINED_YET	1
25 # define CTRL_X_SCROLL		2
26 # define CTRL_X_WHOLE_LINE	3
27 # define CTRL_X_FILES		4
28 # define CTRL_X_TAGS		(5 + CTRL_X_WANT_IDENT)
29 # define CTRL_X_PATH_PATTERNS	(6 + CTRL_X_WANT_IDENT)
30 # define CTRL_X_PATH_DEFINES	(7 + CTRL_X_WANT_IDENT)
31 # define CTRL_X_FINISHED		8
32 # define CTRL_X_DICTIONARY	(9 + CTRL_X_WANT_IDENT)
33 # define CTRL_X_THESAURUS	(10 + CTRL_X_WANT_IDENT)
34 # define CTRL_X_CMDLINE		11
35 # define CTRL_X_FUNCTION	12
36 # define CTRL_X_OMNI		13
37 # define CTRL_X_SPELL		14
38 # define CTRL_X_LOCAL_MSG	15	// only used in "ctrl_x_msgs"
39 # define CTRL_X_EVAL		16	// for builtin function complete()
40 # define CTRL_X_CMDLINE_CTRL_X	17	// CTRL-X typed in CTRL_X_CMDLINE
41 
42 # define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
43 
44 // Message for CTRL-X mode, index is ctrl_x_mode.
45 static char *ctrl_x_msgs[] =
46 {
47     N_(" Keyword completion (^N^P)"), // CTRL_X_NORMAL, ^P/^N compl.
48     N_(" ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"),
49     NULL, // CTRL_X_SCROLL: depends on state
50     N_(" Whole line completion (^L^N^P)"),
51     N_(" File name completion (^F^N^P)"),
52     N_(" Tag completion (^]^N^P)"),
53     N_(" Path pattern completion (^N^P)"),
54     N_(" Definition completion (^D^N^P)"),
55     NULL, // CTRL_X_FINISHED
56     N_(" Dictionary completion (^K^N^P)"),
57     N_(" Thesaurus completion (^T^N^P)"),
58     N_(" Command-line completion (^V^N^P)"),
59     N_(" User defined completion (^U^N^P)"),
60     N_(" Omni completion (^O^N^P)"),
61     N_(" Spelling suggestion (s^N^P)"),
62     N_(" Keyword Local completion (^N^P)"),
63     NULL,   // CTRL_X_EVAL doesn't use msg.
64     N_(" Command-line completion (^V^N^P)"),
65 };
66 
67 #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL)
68 static char *ctrl_x_mode_names[] = {
69 	"keyword",
70 	"ctrl_x",
71 	"scroll",
72 	"whole_line",
73 	"files",
74 	"tags",
75 	"path_patterns",
76 	"path_defines",
77 	"unknown",	    // CTRL_X_FINISHED
78 	"dictionary",
79 	"thesaurus",
80 	"cmdline",
81 	"function",
82 	"omni",
83 	"spell",
84 	NULL,		    // CTRL_X_LOCAL_MSG only used in "ctrl_x_msgs"
85 	"eval",
86 	"cmdline",
87 };
88 #endif
89 
90 /*
91  * Array indexes used for cp_text[].
92  */
93 #define CPT_ABBR	0	// "abbr"
94 #define CPT_MENU	1	// "menu"
95 #define CPT_KIND	2	// "kind"
96 #define CPT_INFO	3	// "info"
97 #define CPT_COUNT	4	// Number of entries
98 
99 /*
100  * Structure used to store one match for insert completion.
101  */
102 typedef struct compl_S compl_T;
103 struct compl_S
104 {
105     compl_T	*cp_next;
106     compl_T	*cp_prev;
107     char_u	*cp_str;	// matched text
108     char_u	*(cp_text[CPT_COUNT]);	// text for the menu
109 #ifdef FEAT_EVAL
110     typval_T	cp_user_data;
111 #endif
112     char_u	*cp_fname;	// file containing the match, allocated when
113 				// cp_flags has CP_FREE_FNAME
114     int		cp_flags;	// CP_ values
115     int		cp_number;	// sequence number
116 };
117 
118 // values for cp_flags
119 # define CP_ORIGINAL_TEXT   1	// the original text when the expansion begun
120 # define CP_FREE_FNAME	    2	// cp_fname is allocated
121 # define CP_CONT_S_IPOS	    4	// use CONT_S_IPOS for compl_cont_status
122 # define CP_EQUAL	    8	// ins_compl_equal() always returns TRUE
123 # define CP_ICASE	    16	// ins_compl_equal() ignores case
124 # define CP_FAST	    32	// use fast_breakcheck instead of ui_breakcheck
125 
126 static char e_hitend[] = N_("Hit end of paragraph");
127 # ifdef FEAT_COMPL_FUNC
128 static char e_compldel[] = N_("E840: Completion function deleted text");
129 # endif
130 
131 /*
132  * All the current matches are stored in a list.
133  * "compl_first_match" points to the start of the list.
134  * "compl_curr_match" points to the currently selected entry.
135  * "compl_shown_match" is different from compl_curr_match during
136  * ins_compl_get_exp().
137  */
138 static compl_T    *compl_first_match = NULL;
139 static compl_T    *compl_curr_match = NULL;
140 static compl_T    *compl_shown_match = NULL;
141 static compl_T    *compl_old_match = NULL;
142 
143 // After using a cursor key <Enter> selects a match in the popup menu,
144 // otherwise it inserts a line break.
145 static int	  compl_enter_selects = FALSE;
146 
147 // When "compl_leader" is not NULL only matches that start with this string
148 // are used.
149 static char_u	  *compl_leader = NULL;
150 
151 static int	  compl_get_longest = FALSE;	// put longest common string
152 						// in compl_leader
153 
154 static int	  compl_no_insert = FALSE;	// FALSE: select & insert
155 						// TRUE: noinsert
156 static int	  compl_no_select = FALSE;	// FALSE: select & insert
157 						// TRUE: noselect
158 
159 // Selected one of the matches.  When FALSE the match was edited or using the
160 // longest common string.
161 static int	  compl_used_match;
162 
163 // didn't finish finding completions.
164 static int	  compl_was_interrupted = FALSE;
165 
166 // Set when character typed while looking for matches and it means we should
167 // stop looking for matches.
168 static int	  compl_interrupted = FALSE;
169 
170 static int	  compl_restarting = FALSE;	// don't insert match
171 
172 // When the first completion is done "compl_started" is set.  When it's
173 // FALSE the word to be completed must be located.
174 static int	  compl_started = FALSE;
175 
176 // Which Ctrl-X mode are we in?
177 static int	  ctrl_x_mode = CTRL_X_NORMAL;
178 
179 static int	  compl_matches = 0;
180 static char_u	  *compl_pattern = NULL;
181 static int	  compl_direction = FORWARD;
182 static int	  compl_shows_dir = FORWARD;
183 static int	  compl_pending = 0;	    // > 1 for postponed CTRL-N
184 static pos_T	  compl_startpos;
185 static colnr_T	  compl_col = 0;	    // column where the text starts
186 					    // that is being completed
187 static char_u	  *compl_orig_text = NULL;  // text as it was before
188 					    // completion started
189 static int	  compl_cont_mode = 0;
190 static expand_T	  compl_xp;
191 
192 static int	  compl_opt_refresh_always = FALSE;
193 static int	  compl_opt_suppress_empty = FALSE;
194 
195 static int ins_compl_add(char_u *str, int len, char_u *fname, char_u **cptext, typval_T *user_data, int cdir, int flags, int adup);
196 static void ins_compl_longest_match(compl_T *match);
197 static void ins_compl_del_pum(void);
198 static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir);
199 static char_u *find_line_end(char_u *ptr);
200 static void ins_compl_free(void);
201 static int  ins_compl_need_restart(void);
202 static void ins_compl_new_leader(void);
203 static int  ins_compl_len(void);
204 static void ins_compl_restart(void);
205 static void ins_compl_set_original_text(char_u *str);
206 static void ins_compl_fixRedoBufForLeader(char_u *ptr_arg);
207 # if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL)
208 static void ins_compl_add_list(list_T *list);
209 static void ins_compl_add_dict(dict_T *dict);
210 # endif
211 static int  ins_compl_key2dir(int c);
212 static int  ins_compl_pum_key(int c);
213 static int  ins_compl_key2count(int c);
214 static void show_pum(int prev_w_wrow, int prev_w_leftcol);
215 static unsigned  quote_meta(char_u *dest, char_u *str, int len);
216 
217 #ifdef FEAT_SPELL
218 static void spell_back_to_badword(void);
219 static int  spell_bad_len = 0;	// length of located bad word
220 #endif
221 
222 /*
223  * CTRL-X pressed in Insert mode.
224  */
225     void
ins_ctrl_x(void)226 ins_ctrl_x(void)
227 {
228     if (!ctrl_x_mode_cmdline())
229     {
230 	// if the next ^X<> won't ADD nothing, then reset
231 	// compl_cont_status
232 	if (compl_cont_status & CONT_N_ADDS)
233 	    compl_cont_status |= CONT_INTRPT;
234 	else
235 	    compl_cont_status = 0;
236 	// We're not sure which CTRL-X mode it will be yet
237 	ctrl_x_mode = CTRL_X_NOT_DEFINED_YET;
238 	edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode));
239 	edit_submode_pre = NULL;
240 	showmode();
241     }
242     else
243 	// CTRL-X in CTRL-X CTRL-V mode behaves differently to make CTRL-X
244 	// CTRL-V look like CTRL-N
245 	ctrl_x_mode = CTRL_X_CMDLINE_CTRL_X;
246 
247     trigger_modechanged();
248 }
249 
250 /*
251  * Functions to check the current CTRL-X mode.
252  */
ctrl_x_mode_none(void)253 int ctrl_x_mode_none(void) { return ctrl_x_mode == 0; }
ctrl_x_mode_normal(void)254 int ctrl_x_mode_normal(void) { return ctrl_x_mode == CTRL_X_NORMAL; }
ctrl_x_mode_scroll(void)255 int ctrl_x_mode_scroll(void) { return ctrl_x_mode == CTRL_X_SCROLL; }
ctrl_x_mode_whole_line(void)256 int ctrl_x_mode_whole_line(void) { return ctrl_x_mode == CTRL_X_WHOLE_LINE; }
ctrl_x_mode_files(void)257 int ctrl_x_mode_files(void) { return ctrl_x_mode == CTRL_X_FILES; }
ctrl_x_mode_tags(void)258 int ctrl_x_mode_tags(void) { return ctrl_x_mode == CTRL_X_TAGS; }
ctrl_x_mode_path_patterns(void)259 int ctrl_x_mode_path_patterns(void) {
260 				  return ctrl_x_mode == CTRL_X_PATH_PATTERNS; }
ctrl_x_mode_path_defines(void)261 int ctrl_x_mode_path_defines(void) {
262 				   return ctrl_x_mode == CTRL_X_PATH_DEFINES; }
ctrl_x_mode_dictionary(void)263 int ctrl_x_mode_dictionary(void) { return ctrl_x_mode == CTRL_X_DICTIONARY; }
ctrl_x_mode_thesaurus(void)264 int ctrl_x_mode_thesaurus(void) { return ctrl_x_mode == CTRL_X_THESAURUS; }
ctrl_x_mode_cmdline(void)265 int ctrl_x_mode_cmdline(void) {
266 	return ctrl_x_mode == CTRL_X_CMDLINE
267 		|| ctrl_x_mode == CTRL_X_CMDLINE_CTRL_X; }
ctrl_x_mode_function(void)268 int ctrl_x_mode_function(void) { return ctrl_x_mode == CTRL_X_FUNCTION; }
ctrl_x_mode_omni(void)269 int ctrl_x_mode_omni(void) { return ctrl_x_mode == CTRL_X_OMNI; }
ctrl_x_mode_spell(void)270 int ctrl_x_mode_spell(void) { return ctrl_x_mode == CTRL_X_SPELL; }
ctrl_x_mode_line_or_eval(void)271 int ctrl_x_mode_line_or_eval(void) {
272        return ctrl_x_mode == CTRL_X_WHOLE_LINE || ctrl_x_mode == CTRL_X_EVAL; }
273 
274 /*
275  * Whether other than default completion has been selected.
276  */
277     int
ctrl_x_mode_not_default(void)278 ctrl_x_mode_not_default(void)
279 {
280     return ctrl_x_mode != CTRL_X_NORMAL;
281 }
282 
283 /*
284  * Whether CTRL-X was typed without a following character,
285  * not including when in CTRL-X CTRL-V mode.
286  */
287     int
ctrl_x_mode_not_defined_yet(void)288 ctrl_x_mode_not_defined_yet(void)
289 {
290     return ctrl_x_mode == CTRL_X_NOT_DEFINED_YET;
291 }
292 
293 /*
294  * Return TRUE if the 'dict' or 'tsr' option can be used.
295  */
296     int
has_compl_option(int dict_opt)297 has_compl_option(int dict_opt)
298 {
299     if (dict_opt ? (*curbuf->b_p_dict == NUL && *p_dict == NUL
300 #ifdef FEAT_SPELL
301 							&& !curwin->w_p_spell
302 #endif
303 							)
304 		 : (*curbuf->b_p_tsr == NUL && *p_tsr == NUL
305 #ifdef FEAT_COMPL_FUNC
306 		     && *curbuf->b_p_tsrfu == NUL && *p_tsrfu == NUL
307 #endif
308 		   ))
309     {
310 	ctrl_x_mode = CTRL_X_NORMAL;
311 	edit_submode = NULL;
312 	msg_attr(dict_opt ? _("'dictionary' option is empty")
313 			  : _("'thesaurus' option is empty"),
314 							      HL_ATTR(HLF_E));
315 	if (emsg_silent == 0 && !in_assert_fails)
316 	{
317 	    vim_beep(BO_COMPL);
318 	    setcursor();
319 	    out_flush();
320 #ifdef FEAT_EVAL
321 	    if (!get_vim_var_nr(VV_TESTING))
322 #endif
323 		ui_delay(2004L, FALSE);
324 	}
325 	return FALSE;
326     }
327     return TRUE;
328 }
329 
330 /*
331  * Is the character 'c' a valid key to go to or keep us in CTRL-X mode?
332  * This depends on the current mode.
333  */
334     int
vim_is_ctrl_x_key(int c)335 vim_is_ctrl_x_key(int c)
336 {
337     // Always allow ^R - let its results then be checked
338     if (c == Ctrl_R)
339 	return TRUE;
340 
341     // Accept <PageUp> and <PageDown> if the popup menu is visible.
342     if (ins_compl_pum_key(c))
343 	return TRUE;
344 
345     switch (ctrl_x_mode)
346     {
347 	case 0:		    // Not in any CTRL-X mode
348 	    return (c == Ctrl_N || c == Ctrl_P || c == Ctrl_X);
349 	case CTRL_X_NOT_DEFINED_YET:
350 	case CTRL_X_CMDLINE_CTRL_X:
351 	    return (   c == Ctrl_X || c == Ctrl_Y || c == Ctrl_E
352 		    || c == Ctrl_L || c == Ctrl_F || c == Ctrl_RSB
353 		    || c == Ctrl_I || c == Ctrl_D || c == Ctrl_P
354 		    || c == Ctrl_N || c == Ctrl_T || c == Ctrl_V
355 		    || c == Ctrl_Q || c == Ctrl_U || c == Ctrl_O
356 		    || c == Ctrl_S || c == Ctrl_K || c == 's'
357 		    || c == Ctrl_Z);
358 	case CTRL_X_SCROLL:
359 	    return (c == Ctrl_Y || c == Ctrl_E);
360 	case CTRL_X_WHOLE_LINE:
361 	    return (c == Ctrl_L || c == Ctrl_P || c == Ctrl_N);
362 	case CTRL_X_FILES:
363 	    return (c == Ctrl_F || c == Ctrl_P || c == Ctrl_N);
364 	case CTRL_X_DICTIONARY:
365 	    return (c == Ctrl_K || c == Ctrl_P || c == Ctrl_N);
366 	case CTRL_X_THESAURUS:
367 	    return (c == Ctrl_T || c == Ctrl_P || c == Ctrl_N);
368 	case CTRL_X_TAGS:
369 	    return (c == Ctrl_RSB || c == Ctrl_P || c == Ctrl_N);
370 #ifdef FEAT_FIND_ID
371 	case CTRL_X_PATH_PATTERNS:
372 	    return (c == Ctrl_P || c == Ctrl_N);
373 	case CTRL_X_PATH_DEFINES:
374 	    return (c == Ctrl_D || c == Ctrl_P || c == Ctrl_N);
375 #endif
376 	case CTRL_X_CMDLINE:
377 	    return (c == Ctrl_V || c == Ctrl_Q || c == Ctrl_P || c == Ctrl_N
378 		    || c == Ctrl_X);
379 #ifdef FEAT_COMPL_FUNC
380 	case CTRL_X_FUNCTION:
381 	    return (c == Ctrl_U || c == Ctrl_P || c == Ctrl_N);
382 	case CTRL_X_OMNI:
383 	    return (c == Ctrl_O || c == Ctrl_P || c == Ctrl_N);
384 #endif
385 	case CTRL_X_SPELL:
386 	    return (c == Ctrl_S || c == Ctrl_P || c == Ctrl_N);
387 	case CTRL_X_EVAL:
388 	    return (c == Ctrl_P || c == Ctrl_N);
389     }
390     internal_error("vim_is_ctrl_x_key()");
391     return FALSE;
392 }
393 
394 /*
395  * Return TRUE when character "c" is part of the item currently being
396  * completed.  Used to decide whether to abandon complete mode when the menu
397  * is visible.
398  */
399     int
ins_compl_accept_char(int c)400 ins_compl_accept_char(int c)
401 {
402     if (ctrl_x_mode & CTRL_X_WANT_IDENT)
403 	// When expanding an identifier only accept identifier chars.
404 	return vim_isIDc(c);
405 
406     switch (ctrl_x_mode)
407     {
408 	case CTRL_X_FILES:
409 	    // When expanding file name only accept file name chars. But not
410 	    // path separators, so that "proto/<Tab>" expands files in
411 	    // "proto", not "proto/" as a whole
412 	    return vim_isfilec(c) && !vim_ispathsep(c);
413 
414 	case CTRL_X_CMDLINE:
415 	case CTRL_X_CMDLINE_CTRL_X:
416 	case CTRL_X_OMNI:
417 	    // Command line and Omni completion can work with just about any
418 	    // printable character, but do stop at white space.
419 	    return vim_isprintc(c) && !VIM_ISWHITE(c);
420 
421 	case CTRL_X_WHOLE_LINE:
422 	    // For while line completion a space can be part of the line.
423 	    return vim_isprintc(c);
424     }
425     return vim_iswordc(c);
426 }
427 
428 /*
429  * This is like ins_compl_add(), but if 'ic' and 'inf' are set, then the
430  * case of the originally typed text is used, and the case of the completed
431  * text is inferred, ie this tries to work out what case you probably wanted
432  * the rest of the word to be in -- webb
433  */
434     int
ins_compl_add_infercase(char_u * str_arg,int len,int icase,char_u * fname,int dir,int cont_s_ipos)435 ins_compl_add_infercase(
436     char_u	*str_arg,
437     int		len,
438     int		icase,
439     char_u	*fname,
440     int		dir,
441     int		cont_s_ipos)  // next ^X<> will set initial_pos
442 {
443     char_u	*str = str_arg;
444     char_u	*p;
445     int		i, c;
446     int		actual_len;		// Take multi-byte characters
447     int		actual_compl_length;	// into account.
448     int		min_len;
449     int		*wca;			// Wide character array.
450     int		has_lower = FALSE;
451     int		was_letter = FALSE;
452     int		flags = 0;
453 
454     if (p_ic && curbuf->b_p_inf && len > 0)
455     {
456 	// Infer case of completed part.
457 
458 	// Find actual length of completion.
459 	if (has_mbyte)
460 	{
461 	    p = str;
462 	    actual_len = 0;
463 	    while (*p != NUL)
464 	    {
465 		MB_PTR_ADV(p);
466 		++actual_len;
467 	    }
468 	}
469 	else
470 	    actual_len = len;
471 
472 	// Find actual length of original text.
473 	if (has_mbyte)
474 	{
475 	    p = compl_orig_text;
476 	    actual_compl_length = 0;
477 	    while (*p != NUL)
478 	    {
479 		MB_PTR_ADV(p);
480 		++actual_compl_length;
481 	    }
482 	}
483 	else
484 	    actual_compl_length = compl_length;
485 
486 	// "actual_len" may be smaller than "actual_compl_length" when using
487 	// thesaurus, only use the minimum when comparing.
488 	min_len = actual_len < actual_compl_length
489 					   ? actual_len : actual_compl_length;
490 
491 	// Allocate wide character array for the completion and fill it.
492 	wca = ALLOC_MULT(int, actual_len);
493 	if (wca != NULL)
494 	{
495 	    p = str;
496 	    for (i = 0; i < actual_len; ++i)
497 		if (has_mbyte)
498 		    wca[i] = mb_ptr2char_adv(&p);
499 		else
500 		    wca[i] = *(p++);
501 
502 	    // Rule 1: Were any chars converted to lower?
503 	    p = compl_orig_text;
504 	    for (i = 0; i < min_len; ++i)
505 	    {
506 		if (has_mbyte)
507 		    c = mb_ptr2char_adv(&p);
508 		else
509 		    c = *(p++);
510 		if (MB_ISLOWER(c))
511 		{
512 		    has_lower = TRUE;
513 		    if (MB_ISUPPER(wca[i]))
514 		    {
515 			// Rule 1 is satisfied.
516 			for (i = actual_compl_length; i < actual_len; ++i)
517 			    wca[i] = MB_TOLOWER(wca[i]);
518 			break;
519 		    }
520 		}
521 	    }
522 
523 	    // Rule 2: No lower case, 2nd consecutive letter converted to
524 	    // upper case.
525 	    if (!has_lower)
526 	    {
527 		p = compl_orig_text;
528 		for (i = 0; i < min_len; ++i)
529 		{
530 		    if (has_mbyte)
531 			c = mb_ptr2char_adv(&p);
532 		    else
533 			c = *(p++);
534 		    if (was_letter && MB_ISUPPER(c) && MB_ISLOWER(wca[i]))
535 		    {
536 			// Rule 2 is satisfied.
537 			for (i = actual_compl_length; i < actual_len; ++i)
538 			    wca[i] = MB_TOUPPER(wca[i]);
539 			break;
540 		    }
541 		    was_letter = MB_ISLOWER(c) || MB_ISUPPER(c);
542 		}
543 	    }
544 
545 	    // Copy the original case of the part we typed.
546 	    p = compl_orig_text;
547 	    for (i = 0; i < min_len; ++i)
548 	    {
549 		if (has_mbyte)
550 		    c = mb_ptr2char_adv(&p);
551 		else
552 		    c = *(p++);
553 		if (MB_ISLOWER(c))
554 		    wca[i] = MB_TOLOWER(wca[i]);
555 		else if (MB_ISUPPER(c))
556 		    wca[i] = MB_TOUPPER(wca[i]);
557 	    }
558 
559 	    // Generate encoding specific output from wide character array.
560 	    // Multi-byte characters can occupy up to five bytes more than
561 	    // ASCII characters, and we also need one byte for NUL, so stay
562 	    // six bytes away from the edge of IObuff.
563 	    p = IObuff;
564 	    i = 0;
565 	    while (i < actual_len && (p - IObuff + 6) < IOSIZE)
566 		if (has_mbyte)
567 		    p += (*mb_char2bytes)(wca[i++], p);
568 		else
569 		    *(p++) = wca[i++];
570 	    *p = NUL;
571 
572 	    vim_free(wca);
573 	}
574 
575 	str = IObuff;
576     }
577     if (cont_s_ipos)
578 	flags |= CP_CONT_S_IPOS;
579     if (icase)
580 	flags |= CP_ICASE;
581 
582     return ins_compl_add(str, len, fname, NULL, NULL, dir, flags, FALSE);
583 }
584 
585 /*
586  * Add a match to the list of matches.
587  * If the given string is already in the list of completions, then return
588  * NOTDONE, otherwise add it to the list and return OK.  If there is an error,
589  * maybe because alloc() returns NULL, then FAIL is returned.
590  */
591     static int
ins_compl_add(char_u * str,int len,char_u * fname,char_u ** cptext,typval_T * user_data UNUSED,int cdir,int flags_arg,int adup)592 ins_compl_add(
593     char_u	*str,
594     int		len,
595     char_u	*fname,
596     char_u	**cptext,	    // extra text for popup menu or NULL
597     typval_T	*user_data UNUSED,  // "user_data" entry or NULL
598     int		cdir,
599     int		flags_arg,
600     int		adup)		// accept duplicate match
601 {
602     compl_T	*match;
603     int		dir = (cdir == 0 ? compl_direction : cdir);
604     int		flags = flags_arg;
605 
606     if (flags & CP_FAST)
607 	fast_breakcheck();
608     else
609 	ui_breakcheck();
610     if (got_int)
611 	return FAIL;
612     if (len < 0)
613 	len = (int)STRLEN(str);
614 
615     // If the same match is already present, don't add it.
616     if (compl_first_match != NULL && !adup)
617     {
618 	match = compl_first_match;
619 	do
620 	{
621 	    if (    !(match->cp_flags & CP_ORIGINAL_TEXT)
622 		    && STRNCMP(match->cp_str, str, len) == 0
623 		    && match->cp_str[len] == NUL)
624 		return NOTDONE;
625 	    match = match->cp_next;
626 	} while (match != NULL && match != compl_first_match);
627     }
628 
629     // Remove any popup menu before changing the list of matches.
630     ins_compl_del_pum();
631 
632     // Allocate a new match structure.
633     // Copy the values to the new match structure.
634     match = ALLOC_CLEAR_ONE(compl_T);
635     if (match == NULL)
636 	return FAIL;
637     match->cp_number = -1;
638     if (flags & CP_ORIGINAL_TEXT)
639 	match->cp_number = 0;
640     if ((match->cp_str = vim_strnsave(str, len)) == NULL)
641     {
642 	vim_free(match);
643 	return FAIL;
644     }
645 
646     // match-fname is:
647     // - compl_curr_match->cp_fname if it is a string equal to fname.
648     // - a copy of fname, CP_FREE_FNAME is set to free later THE allocated mem.
649     // - NULL otherwise.	--Acevedo
650     if (fname != NULL
651 	    && compl_curr_match != NULL
652 	    && compl_curr_match->cp_fname != NULL
653 	    && STRCMP(fname, compl_curr_match->cp_fname) == 0)
654 	match->cp_fname = compl_curr_match->cp_fname;
655     else if (fname != NULL)
656     {
657 	match->cp_fname = vim_strsave(fname);
658 	flags |= CP_FREE_FNAME;
659     }
660     else
661 	match->cp_fname = NULL;
662     match->cp_flags = flags;
663 
664     if (cptext != NULL)
665     {
666 	int i;
667 
668 	for (i = 0; i < CPT_COUNT; ++i)
669 	    if (cptext[i] != NULL && *cptext[i] != NUL)
670 		match->cp_text[i] = vim_strsave(cptext[i]);
671     }
672 #ifdef FEAT_EVAL
673     if (user_data != NULL)
674 	match->cp_user_data = *user_data;
675 #endif
676 
677     // Link the new match structure in the list of matches.
678     if (compl_first_match == NULL)
679 	match->cp_next = match->cp_prev = NULL;
680     else if (dir == FORWARD)
681     {
682 	match->cp_next = compl_curr_match->cp_next;
683 	match->cp_prev = compl_curr_match;
684     }
685     else	// BACKWARD
686     {
687 	match->cp_next = compl_curr_match;
688 	match->cp_prev = compl_curr_match->cp_prev;
689     }
690     if (match->cp_next)
691 	match->cp_next->cp_prev = match;
692     if (match->cp_prev)
693 	match->cp_prev->cp_next = match;
694     else	// if there's nothing before, it is the first match
695 	compl_first_match = match;
696     compl_curr_match = match;
697 
698     // Find the longest common string if still doing that.
699     if (compl_get_longest && (flags & CP_ORIGINAL_TEXT) == 0)
700 	ins_compl_longest_match(match);
701 
702     return OK;
703 }
704 
705 /*
706  * Return TRUE if "str[len]" matches with match->cp_str, considering
707  * match->cp_flags.
708  */
709     static int
ins_compl_equal(compl_T * match,char_u * str,int len)710 ins_compl_equal(compl_T *match, char_u *str, int len)
711 {
712     if (match->cp_flags & CP_EQUAL)
713 	return TRUE;
714     if (match->cp_flags & CP_ICASE)
715 	return STRNICMP(match->cp_str, str, (size_t)len) == 0;
716     return STRNCMP(match->cp_str, str, (size_t)len) == 0;
717 }
718 
719 /*
720  * Reduce the longest common string for match "match".
721  */
722     static void
ins_compl_longest_match(compl_T * match)723 ins_compl_longest_match(compl_T *match)
724 {
725     char_u	*p, *s;
726     int		c1, c2;
727     int		had_match;
728 
729     if (compl_leader == NULL)
730     {
731 	// First match, use it as a whole.
732 	compl_leader = vim_strsave(match->cp_str);
733 	if (compl_leader != NULL)
734 	{
735 	    had_match = (curwin->w_cursor.col > compl_col);
736 	    ins_compl_delete();
737 	    ins_bytes(compl_leader + ins_compl_len());
738 	    ins_redraw(FALSE);
739 
740 	    // When the match isn't there (to avoid matching itself) remove it
741 	    // again after redrawing.
742 	    if (!had_match)
743 		ins_compl_delete();
744 	    compl_used_match = FALSE;
745 	}
746     }
747     else
748     {
749 	// Reduce the text if this match differs from compl_leader.
750 	p = compl_leader;
751 	s = match->cp_str;
752 	while (*p != NUL)
753 	{
754 	    if (has_mbyte)
755 	    {
756 		c1 = mb_ptr2char(p);
757 		c2 = mb_ptr2char(s);
758 	    }
759 	    else
760 	    {
761 		c1 = *p;
762 		c2 = *s;
763 	    }
764 	    if ((match->cp_flags & CP_ICASE)
765 			     ? (MB_TOLOWER(c1) != MB_TOLOWER(c2)) : (c1 != c2))
766 		break;
767 	    if (has_mbyte)
768 	    {
769 		MB_PTR_ADV(p);
770 		MB_PTR_ADV(s);
771 	    }
772 	    else
773 	    {
774 		++p;
775 		++s;
776 	    }
777 	}
778 
779 	if (*p != NUL)
780 	{
781 	    // Leader was shortened, need to change the inserted text.
782 	    *p = NUL;
783 	    had_match = (curwin->w_cursor.col > compl_col);
784 	    ins_compl_delete();
785 	    ins_bytes(compl_leader + ins_compl_len());
786 	    ins_redraw(FALSE);
787 
788 	    // When the match isn't there (to avoid matching itself) remove it
789 	    // again after redrawing.
790 	    if (!had_match)
791 		ins_compl_delete();
792 	}
793 
794 	compl_used_match = FALSE;
795     }
796 }
797 
798 /*
799  * Add an array of matches to the list of matches.
800  * Frees matches[].
801  */
802     static void
ins_compl_add_matches(int num_matches,char_u ** matches,int icase)803 ins_compl_add_matches(
804     int		num_matches,
805     char_u	**matches,
806     int		icase)
807 {
808     int		i;
809     int		add_r = OK;
810     int		dir = compl_direction;
811 
812     for (i = 0; i < num_matches && add_r != FAIL; i++)
813 	if ((add_r = ins_compl_add(matches[i], -1, NULL, NULL, NULL, dir,
814 			       CP_FAST | (icase ? CP_ICASE : 0), FALSE)) == OK)
815 	    // if dir was BACKWARD then honor it just once
816 	    dir = FORWARD;
817     FreeWild(num_matches, matches);
818 }
819 
820 /*
821  * Make the completion list cyclic.
822  * Return the number of matches (excluding the original).
823  */
824     static int
ins_compl_make_cyclic(void)825 ins_compl_make_cyclic(void)
826 {
827     compl_T *match;
828     int	    count = 0;
829 
830     if (compl_first_match != NULL)
831     {
832 	// Find the end of the list.
833 	match = compl_first_match;
834 	// there's always an entry for the compl_orig_text, it doesn't count.
835 	while (match->cp_next != NULL && match->cp_next != compl_first_match)
836 	{
837 	    match = match->cp_next;
838 	    ++count;
839 	}
840 	match->cp_next = compl_first_match;
841 	compl_first_match->cp_prev = match;
842     }
843     return count;
844 }
845 
846 /*
847  * Return whether there currently is a shown match.
848  */
849     int
ins_compl_has_shown_match(void)850 ins_compl_has_shown_match(void)
851 {
852     return compl_shown_match == NULL
853 	|| compl_shown_match != compl_shown_match->cp_next;
854 }
855 
856 /*
857  * Return whether the shown match is long enough.
858  */
859     int
ins_compl_long_shown_match(void)860 ins_compl_long_shown_match(void)
861 {
862     return (int)STRLEN(compl_shown_match->cp_str)
863 					    > curwin->w_cursor.col - compl_col;
864 }
865 
866 /*
867  * Set variables that store noselect and noinsert behavior from the
868  * 'completeopt' value.
869  */
870     void
completeopt_was_set(void)871 completeopt_was_set(void)
872 {
873     compl_no_insert = FALSE;
874     compl_no_select = FALSE;
875     if (strstr((char *)p_cot, "noselect") != NULL)
876 	compl_no_select = TRUE;
877     if (strstr((char *)p_cot, "noinsert") != NULL)
878 	compl_no_insert = TRUE;
879 }
880 
881 
882 // "compl_match_array" points the currently displayed list of entries in the
883 // popup menu.  It is NULL when there is no popup menu.
884 static pumitem_T *compl_match_array = NULL;
885 static int compl_match_arraysize;
886 
887 /*
888  * Update the screen and when there is any scrolling remove the popup menu.
889  */
890     static void
ins_compl_upd_pum(void)891 ins_compl_upd_pum(void)
892 {
893     int		h;
894 
895     if (compl_match_array != NULL)
896     {
897 	h = curwin->w_cline_height;
898 	// Update the screen later, before drawing the popup menu over it.
899 	pum_call_update_screen();
900 	if (h != curwin->w_cline_height)
901 	    ins_compl_del_pum();
902     }
903 }
904 
905 /*
906  * Remove any popup menu.
907  */
908     static void
ins_compl_del_pum(void)909 ins_compl_del_pum(void)
910 {
911     if (compl_match_array != NULL)
912     {
913 	pum_undisplay();
914 	VIM_CLEAR(compl_match_array);
915     }
916 }
917 
918 /*
919  * Return TRUE if the popup menu should be displayed.
920  */
921     int
pum_wanted(void)922 pum_wanted(void)
923 {
924     // 'completeopt' must contain "menu" or "menuone"
925     if (vim_strchr(p_cot, 'm') == NULL)
926 	return FALSE;
927 
928     // The display looks bad on a B&W display.
929     if (t_colors < 8
930 #ifdef FEAT_GUI
931 	    && !gui.in_use
932 #endif
933 	    )
934 	return FALSE;
935     return TRUE;
936 }
937 
938 /*
939  * Return TRUE if there are two or more matches to be shown in the popup menu.
940  * One if 'completopt' contains "menuone".
941  */
942     static int
pum_enough_matches(void)943 pum_enough_matches(void)
944 {
945     compl_T     *compl;
946     int		i;
947 
948     // Don't display the popup menu if there are no matches or there is only
949     // one (ignoring the original text).
950     compl = compl_first_match;
951     i = 0;
952     do
953     {
954 	if (compl == NULL
955 		      || ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0 && ++i == 2))
956 	    break;
957 	compl = compl->cp_next;
958     } while (compl != compl_first_match);
959 
960     if (strstr((char *)p_cot, "menuone") != NULL)
961 	return (i >= 1);
962     return (i >= 2);
963 }
964 
965 #if defined(FEAT_EVAL) || defined(PROTO)
966 /*
967  * Allocate Dict for the completed item.
968  * { word, abbr, menu, kind, info }
969  */
970     static dict_T *
ins_compl_dict_alloc(compl_T * match)971 ins_compl_dict_alloc(compl_T *match)
972 {
973     dict_T *dict = dict_alloc_lock(VAR_FIXED);
974 
975     if (dict != NULL)
976     {
977 	dict_add_string(dict, "word", match->cp_str);
978 	dict_add_string(dict, "abbr", match->cp_text[CPT_ABBR]);
979 	dict_add_string(dict, "menu", match->cp_text[CPT_MENU]);
980 	dict_add_string(dict, "kind", match->cp_text[CPT_KIND]);
981 	dict_add_string(dict, "info", match->cp_text[CPT_INFO]);
982 	if (match->cp_user_data.v_type == VAR_UNKNOWN)
983 	    dict_add_string(dict, "user_data", (char_u *)"");
984 	else
985 	    dict_add_tv(dict, "user_data", &match->cp_user_data);
986     }
987     return dict;
988 }
989 
990     static void
trigger_complete_changed_event(int cur)991 trigger_complete_changed_event(int cur)
992 {
993     dict_T	    *v_event;
994     dict_T	    *item;
995     static int	    recursive = FALSE;
996     save_v_event_T  save_v_event;
997 
998     if (recursive)
999 	return;
1000 
1001     if (cur < 0)
1002 	item = dict_alloc();
1003     else
1004 	item = ins_compl_dict_alloc(compl_curr_match);
1005     if (item == NULL)
1006 	return;
1007     v_event = get_v_event(&save_v_event);
1008     dict_add_dict(v_event, "completed_item", item);
1009     pum_set_event_info(v_event);
1010     dict_set_items_ro(v_event);
1011 
1012     recursive = TRUE;
1013     textwinlock++;
1014     apply_autocmds(EVENT_COMPLETECHANGED, NULL, NULL, FALSE, curbuf);
1015     textwinlock--;
1016     recursive = FALSE;
1017 
1018     restore_v_event(v_event, &save_v_event);
1019 }
1020 #endif
1021 
1022 /*
1023  * Show the popup menu for the list of matches.
1024  * Also adjusts "compl_shown_match" to an entry that is actually displayed.
1025  */
1026     void
ins_compl_show_pum(void)1027 ins_compl_show_pum(void)
1028 {
1029     compl_T     *compl;
1030     compl_T     *shown_compl = NULL;
1031     int		did_find_shown_match = FALSE;
1032     int		shown_match_ok = FALSE;
1033     int		i;
1034     int		cur = -1;
1035     colnr_T	col;
1036     int		lead_len = 0;
1037 
1038     if (!pum_wanted() || !pum_enough_matches())
1039 	return;
1040 
1041 #if defined(FEAT_EVAL)
1042     // Dirty hard-coded hack: remove any matchparen highlighting.
1043     do_cmdline_cmd((char_u *)"if exists('g:loaded_matchparen')|:3match none|endif");
1044 #endif
1045 
1046     // Update the screen later, before drawing the popup menu over it.
1047     pum_call_update_screen();
1048 
1049     if (compl_match_array == NULL)
1050     {
1051 	// Need to build the popup menu list.
1052 	compl_match_arraysize = 0;
1053 	compl = compl_first_match;
1054 	if (compl_leader != NULL)
1055 	    lead_len = (int)STRLEN(compl_leader);
1056 	do
1057 	{
1058 	    if ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0
1059 		    && (compl_leader == NULL
1060 			|| ins_compl_equal(compl, compl_leader, lead_len)))
1061 		++compl_match_arraysize;
1062 	    compl = compl->cp_next;
1063 	} while (compl != NULL && compl != compl_first_match);
1064 	if (compl_match_arraysize == 0)
1065 	    return;
1066 	compl_match_array = ALLOC_CLEAR_MULT(pumitem_T, compl_match_arraysize);
1067 	if (compl_match_array != NULL)
1068 	{
1069 	    // If the current match is the original text don't find the first
1070 	    // match after it, don't highlight anything.
1071 	    if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT)
1072 		shown_match_ok = TRUE;
1073 
1074 	    i = 0;
1075 	    compl = compl_first_match;
1076 	    do
1077 	    {
1078 		if ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0
1079 			&& (compl_leader == NULL
1080 			    || ins_compl_equal(compl, compl_leader, lead_len)))
1081 		{
1082 		    if (!shown_match_ok)
1083 		    {
1084 			if (compl == compl_shown_match || did_find_shown_match)
1085 			{
1086 			    // This item is the shown match or this is the
1087 			    // first displayed item after the shown match.
1088 			    compl_shown_match = compl;
1089 			    did_find_shown_match = TRUE;
1090 			    shown_match_ok = TRUE;
1091 			}
1092 			else
1093 			    // Remember this displayed match for when the
1094 			    // shown match is just below it.
1095 			    shown_compl = compl;
1096 			cur = i;
1097 		    }
1098 
1099 		    if (compl->cp_text[CPT_ABBR] != NULL)
1100 			compl_match_array[i].pum_text =
1101 						     compl->cp_text[CPT_ABBR];
1102 		    else
1103 			compl_match_array[i].pum_text = compl->cp_str;
1104 		    compl_match_array[i].pum_kind = compl->cp_text[CPT_KIND];
1105 		    compl_match_array[i].pum_info = compl->cp_text[CPT_INFO];
1106 		    if (compl->cp_text[CPT_MENU] != NULL)
1107 			compl_match_array[i++].pum_extra =
1108 						     compl->cp_text[CPT_MENU];
1109 		    else
1110 			compl_match_array[i++].pum_extra = compl->cp_fname;
1111 		}
1112 
1113 		if (compl == compl_shown_match)
1114 		{
1115 		    did_find_shown_match = TRUE;
1116 
1117 		    // When the original text is the shown match don't set
1118 		    // compl_shown_match.
1119 		    if (compl->cp_flags & CP_ORIGINAL_TEXT)
1120 			shown_match_ok = TRUE;
1121 
1122 		    if (!shown_match_ok && shown_compl != NULL)
1123 		    {
1124 			// The shown match isn't displayed, set it to the
1125 			// previously displayed match.
1126 			compl_shown_match = shown_compl;
1127 			shown_match_ok = TRUE;
1128 		    }
1129 		}
1130 		compl = compl->cp_next;
1131 	    } while (compl != NULL && compl != compl_first_match);
1132 
1133 	    if (!shown_match_ok)    // no displayed match at all
1134 		cur = -1;
1135 	}
1136     }
1137     else
1138     {
1139 	// popup menu already exists, only need to find the current item.
1140 	for (i = 0; i < compl_match_arraysize; ++i)
1141 	    if (compl_match_array[i].pum_text == compl_shown_match->cp_str
1142 		    || compl_match_array[i].pum_text
1143 				      == compl_shown_match->cp_text[CPT_ABBR])
1144 	    {
1145 		cur = i;
1146 		break;
1147 	    }
1148     }
1149 
1150     if (compl_match_array != NULL)
1151     {
1152 	// In Replace mode when a $ is displayed at the end of the line only
1153 	// part of the screen would be updated.  We do need to redraw here.
1154 	dollar_vcol = -1;
1155 
1156 	// Compute the screen column of the start of the completed text.
1157 	// Use the cursor to get all wrapping and other settings right.
1158 	col = curwin->w_cursor.col;
1159 	curwin->w_cursor.col = compl_col;
1160 	pum_display(compl_match_array, compl_match_arraysize, cur);
1161 	curwin->w_cursor.col = col;
1162 
1163 #ifdef FEAT_EVAL
1164 	if (has_completechanged())
1165 	    trigger_complete_changed_event(cur);
1166 #endif
1167     }
1168 }
1169 
1170 #define DICT_FIRST	(1)	// use just first element in "dict"
1171 #define DICT_EXACT	(2)	// "dict" is the exact name of a file
1172 
1173 /*
1174  * Add any identifiers that match the given pattern in the list of dictionary
1175  * files "dict_start" to the list of completions.
1176  */
1177     static void
ins_compl_dictionaries(char_u * dict_start,char_u * pat,int flags,int thesaurus)1178 ins_compl_dictionaries(
1179     char_u	*dict_start,
1180     char_u	*pat,
1181     int		flags,		// DICT_FIRST and/or DICT_EXACT
1182     int		thesaurus)	// Thesaurus completion
1183 {
1184     char_u	*dict = dict_start;
1185     char_u	*ptr;
1186     char_u	*buf;
1187     regmatch_T	regmatch;
1188     char_u	**files;
1189     int		count;
1190     int		save_p_scs;
1191     int		dir = compl_direction;
1192 
1193     if (*dict == NUL)
1194     {
1195 #ifdef FEAT_SPELL
1196 	// When 'dictionary' is empty and spell checking is enabled use
1197 	// "spell".
1198 	if (!thesaurus && curwin->w_p_spell)
1199 	    dict = (char_u *)"spell";
1200 	else
1201 #endif
1202 	    return;
1203     }
1204 
1205     buf = alloc(LSIZE);
1206     if (buf == NULL)
1207 	return;
1208     regmatch.regprog = NULL;	// so that we can goto theend
1209 
1210     // If 'infercase' is set, don't use 'smartcase' here
1211     save_p_scs = p_scs;
1212     if (curbuf->b_p_inf)
1213 	p_scs = FALSE;
1214 
1215     // When invoked to match whole lines for CTRL-X CTRL-L adjust the pattern
1216     // to only match at the start of a line.  Otherwise just match the
1217     // pattern. Also need to double backslashes.
1218     if (ctrl_x_mode_line_or_eval())
1219     {
1220 	char_u *pat_esc = vim_strsave_escaped(pat, (char_u *)"\\");
1221 	size_t len;
1222 
1223 	if (pat_esc == NULL)
1224 	    goto theend;
1225 	len = STRLEN(pat_esc) + 10;
1226 	ptr = alloc(len);
1227 	if (ptr == NULL)
1228 	{
1229 	    vim_free(pat_esc);
1230 	    goto theend;
1231 	}
1232 	vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc);
1233 	regmatch.regprog = vim_regcomp(ptr, RE_MAGIC);
1234 	vim_free(pat_esc);
1235 	vim_free(ptr);
1236     }
1237     else
1238     {
1239 	regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0);
1240 	if (regmatch.regprog == NULL)
1241 	    goto theend;
1242     }
1243 
1244     // ignore case depends on 'ignorecase', 'smartcase' and "pat"
1245     regmatch.rm_ic = ignorecase(pat);
1246     while (*dict != NUL && !got_int && !compl_interrupted)
1247     {
1248 	// copy one dictionary file name into buf
1249 	if (flags == DICT_EXACT)
1250 	{
1251 	    count = 1;
1252 	    files = &dict;
1253 	}
1254 	else
1255 	{
1256 	    // Expand wildcards in the dictionary name, but do not allow
1257 	    // backticks (for security, the 'dict' option may have been set in
1258 	    // a modeline).
1259 	    copy_option_part(&dict, buf, LSIZE, ",");
1260 # ifdef FEAT_SPELL
1261 	    if (!thesaurus && STRCMP(buf, "spell") == 0)
1262 		count = -1;
1263 	    else
1264 # endif
1265 		if (vim_strchr(buf, '`') != NULL
1266 		    || expand_wildcards(1, &buf, &count, &files,
1267 						     EW_FILE|EW_SILENT) != OK)
1268 		count = 0;
1269 	}
1270 
1271 # ifdef FEAT_SPELL
1272 	if (count == -1)
1273 	{
1274 	    // Complete from active spelling.  Skip "\<" in the pattern, we
1275 	    // don't use it as a RE.
1276 	    if (pat[0] == '\\' && pat[1] == '<')
1277 		ptr = pat + 2;
1278 	    else
1279 		ptr = pat;
1280 	    spell_dump_compl(ptr, regmatch.rm_ic, &dir, 0);
1281 	}
1282 	else
1283 # endif
1284 	    if (count > 0)	// avoid warning for using "files" uninit
1285 	{
1286 	    ins_compl_files(count, files, thesaurus, flags,
1287 							&regmatch, buf, &dir);
1288 	    if (flags != DICT_EXACT)
1289 		FreeWild(count, files);
1290 	}
1291 	if (flags != 0)
1292 	    break;
1293     }
1294 
1295 theend:
1296     p_scs = save_p_scs;
1297     vim_regfree(regmatch.regprog);
1298     vim_free(buf);
1299 }
1300 
1301     static void
ins_compl_files(int count,char_u ** files,int thesaurus,int flags,regmatch_T * regmatch,char_u * buf,int * dir)1302 ins_compl_files(
1303     int		count,
1304     char_u	**files,
1305     int		thesaurus,
1306     int		flags,
1307     regmatch_T	*regmatch,
1308     char_u	*buf,
1309     int		*dir)
1310 {
1311     char_u	*ptr;
1312     int		i;
1313     FILE	*fp;
1314     int		add_r;
1315 
1316     for (i = 0; i < count && !got_int && !compl_interrupted; i++)
1317     {
1318 	fp = mch_fopen((char *)files[i], "r");  // open dictionary file
1319 	if (flags != DICT_EXACT)
1320 	{
1321 	    msg_hist_off = TRUE;	// reset in msg_trunc_attr()
1322 	    vim_snprintf((char *)IObuff, IOSIZE,
1323 			      _("Scanning dictionary: %s"), (char *)files[i]);
1324 	    (void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R));
1325 	}
1326 
1327 	if (fp != NULL)
1328 	{
1329 	    // Read dictionary file line by line.
1330 	    // Check each line for a match.
1331 	    while (!got_int && !compl_interrupted
1332 					    && !vim_fgets(buf, LSIZE, fp))
1333 	    {
1334 		ptr = buf;
1335 		while (vim_regexec(regmatch, buf, (colnr_T)(ptr - buf)))
1336 		{
1337 		    ptr = regmatch->startp[0];
1338 		    if (ctrl_x_mode_line_or_eval())
1339 			ptr = find_line_end(ptr);
1340 		    else
1341 			ptr = find_word_end(ptr);
1342 		    add_r = ins_compl_add_infercase(regmatch->startp[0],
1343 					  (int)(ptr - regmatch->startp[0]),
1344 						  p_ic, files[i], *dir, FALSE);
1345 		    if (thesaurus)
1346 		    {
1347 			char_u *wstart;
1348 
1349 			// Add the other matches on the line
1350 			ptr = buf;
1351 			while (!got_int)
1352 			{
1353 			    // Find start of the next word.  Skip white
1354 			    // space and punctuation.
1355 			    ptr = find_word_start(ptr);
1356 			    if (*ptr == NUL || *ptr == NL)
1357 				break;
1358 			    wstart = ptr;
1359 
1360 			    // Find end of the word.
1361 			    if (has_mbyte)
1362 				// Japanese words may have characters in
1363 				// different classes, only separate words
1364 				// with single-byte non-word characters.
1365 				while (*ptr != NUL)
1366 				{
1367 				    int l = (*mb_ptr2len)(ptr);
1368 
1369 				    if (l < 2 && !vim_iswordc(*ptr))
1370 					break;
1371 				    ptr += l;
1372 				}
1373 			    else
1374 				ptr = find_word_end(ptr);
1375 
1376 			    // Add the word. Skip the regexp match.
1377 			    if (wstart != regmatch->startp[0])
1378 				add_r = ins_compl_add_infercase(wstart,
1379 					(int)(ptr - wstart),
1380 					p_ic, files[i], *dir, FALSE);
1381 			}
1382 		    }
1383 		    if (add_r == OK)
1384 			// if dir was BACKWARD then honor it just once
1385 			*dir = FORWARD;
1386 		    else if (add_r == FAIL)
1387 			break;
1388 		    // avoid expensive call to vim_regexec() when at end
1389 		    // of line
1390 		    if (*ptr == '\n' || got_int)
1391 			break;
1392 		}
1393 		line_breakcheck();
1394 		ins_compl_check_keys(50, FALSE);
1395 	    }
1396 	    fclose(fp);
1397 	}
1398     }
1399 }
1400 
1401 /*
1402  * Find the start of the next word.
1403  * Returns a pointer to the first char of the word.  Also stops at a NUL.
1404  */
1405     char_u *
find_word_start(char_u * ptr)1406 find_word_start(char_u *ptr)
1407 {
1408     if (has_mbyte)
1409 	while (*ptr != NUL && *ptr != '\n' && mb_get_class(ptr) <= 1)
1410 	    ptr += (*mb_ptr2len)(ptr);
1411     else
1412 	while (*ptr != NUL && *ptr != '\n' && !vim_iswordc(*ptr))
1413 	    ++ptr;
1414     return ptr;
1415 }
1416 
1417 /*
1418  * Find the end of the word.  Assumes it starts inside a word.
1419  * Returns a pointer to just after the word.
1420  */
1421     char_u *
find_word_end(char_u * ptr)1422 find_word_end(char_u *ptr)
1423 {
1424     int		start_class;
1425 
1426     if (has_mbyte)
1427     {
1428 	start_class = mb_get_class(ptr);
1429 	if (start_class > 1)
1430 	    while (*ptr != NUL)
1431 	    {
1432 		ptr += (*mb_ptr2len)(ptr);
1433 		if (mb_get_class(ptr) != start_class)
1434 		    break;
1435 	    }
1436     }
1437     else
1438 	while (vim_iswordc(*ptr))
1439 	    ++ptr;
1440     return ptr;
1441 }
1442 
1443 /*
1444  * Find the end of the line, omitting CR and NL at the end.
1445  * Returns a pointer to just after the line.
1446  */
1447     static char_u *
find_line_end(char_u * ptr)1448 find_line_end(char_u *ptr)
1449 {
1450     char_u	*s;
1451 
1452     s = ptr + STRLEN(ptr);
1453     while (s > ptr && (s[-1] == CAR || s[-1] == NL))
1454 	--s;
1455     return s;
1456 }
1457 
1458 /*
1459  * Free the list of completions
1460  */
1461     static void
ins_compl_free(void)1462 ins_compl_free(void)
1463 {
1464     compl_T *match;
1465     int	    i;
1466 
1467     VIM_CLEAR(compl_pattern);
1468     VIM_CLEAR(compl_leader);
1469 
1470     if (compl_first_match == NULL)
1471 	return;
1472 
1473     ins_compl_del_pum();
1474     pum_clear();
1475 
1476     compl_curr_match = compl_first_match;
1477     do
1478     {
1479 	match = compl_curr_match;
1480 	compl_curr_match = compl_curr_match->cp_next;
1481 	vim_free(match->cp_str);
1482 	// several entries may use the same fname, free it just once.
1483 	if (match->cp_flags & CP_FREE_FNAME)
1484 	    vim_free(match->cp_fname);
1485 	for (i = 0; i < CPT_COUNT; ++i)
1486 	    vim_free(match->cp_text[i]);
1487 #ifdef FEAT_EVAL
1488 	clear_tv(&match->cp_user_data);
1489 #endif
1490 	vim_free(match);
1491     } while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
1492     compl_first_match = compl_curr_match = NULL;
1493     compl_shown_match = NULL;
1494     compl_old_match = NULL;
1495 }
1496 
1497     void
ins_compl_clear(void)1498 ins_compl_clear(void)
1499 {
1500     compl_cont_status = 0;
1501     compl_started = FALSE;
1502     compl_matches = 0;
1503     VIM_CLEAR(compl_pattern);
1504     VIM_CLEAR(compl_leader);
1505     edit_submode_extra = NULL;
1506     VIM_CLEAR(compl_orig_text);
1507     compl_enter_selects = FALSE;
1508 #ifdef FEAT_EVAL
1509     // clear v:completed_item
1510     set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc_lock(VAR_FIXED));
1511 #endif
1512 }
1513 
1514 /*
1515  * Return TRUE when Insert completion is active.
1516  */
1517     int
ins_compl_active(void)1518 ins_compl_active(void)
1519 {
1520     return compl_started;
1521 }
1522 
1523 /*
1524  * Selected one of the matches.  When FALSE the match was edited or using the
1525  * longest common string.
1526  */
1527     int
ins_compl_used_match(void)1528 ins_compl_used_match(void)
1529 {
1530     return compl_used_match;
1531 }
1532 
1533 /*
1534  * Initialize get longest common string.
1535  */
1536     void
ins_compl_init_get_longest(void)1537 ins_compl_init_get_longest(void)
1538 {
1539     compl_get_longest = FALSE;
1540 }
1541 
1542 /*
1543  * Returns TRUE when insert completion is interrupted.
1544  */
1545     int
ins_compl_interrupted(void)1546 ins_compl_interrupted(void)
1547 {
1548     return compl_interrupted;
1549 }
1550 
1551 /*
1552  * Returns TRUE if the <Enter> key selects a match in the completion popup
1553  * menu.
1554  */
1555     int
ins_compl_enter_selects(void)1556 ins_compl_enter_selects(void)
1557 {
1558     return compl_enter_selects;
1559 }
1560 
1561 /*
1562  * Return the column where the text starts that is being completed
1563  */
1564     colnr_T
ins_compl_col(void)1565 ins_compl_col(void)
1566 {
1567     return compl_col;
1568 }
1569 
1570 /*
1571  * Delete one character before the cursor and show the subset of the matches
1572  * that match the word that is now before the cursor.
1573  * Returns the character to be used, NUL if the work is done and another char
1574  * to be got from the user.
1575  */
1576     int
ins_compl_bs(void)1577 ins_compl_bs(void)
1578 {
1579     char_u	*line;
1580     char_u	*p;
1581 
1582     line = ml_get_curline();
1583     p = line + curwin->w_cursor.col;
1584     MB_PTR_BACK(line, p);
1585 
1586     // Stop completion when the whole word was deleted.  For Omni completion
1587     // allow the word to be deleted, we won't match everything.
1588     // Respect the 'backspace' option.
1589     if ((int)(p - line) - (int)compl_col < 0
1590 	    || ((int)(p - line) - (int)compl_col == 0
1591 						 && ctrl_x_mode != CTRL_X_OMNI)
1592 	    || ctrl_x_mode == CTRL_X_EVAL
1593 	    || (!can_bs(BS_START) && (int)(p - line) - (int)compl_col
1594 							- compl_length < 0))
1595 	return K_BS;
1596 
1597     // Deleted more than what was used to find matches or didn't finish
1598     // finding all matches: need to look for matches all over again.
1599     if (curwin->w_cursor.col <= compl_col + compl_length
1600 						  || ins_compl_need_restart())
1601 	ins_compl_restart();
1602 
1603     vim_free(compl_leader);
1604     compl_leader = vim_strnsave(line + compl_col, (p - line) - compl_col);
1605     if (compl_leader != NULL)
1606     {
1607 	ins_compl_new_leader();
1608 	if (compl_shown_match != NULL)
1609 	    // Make sure current match is not a hidden item.
1610 	    compl_curr_match = compl_shown_match;
1611 	return NUL;
1612     }
1613     return K_BS;
1614 }
1615 
1616 /*
1617  * Return TRUE when we need to find matches again, ins_compl_restart() is to
1618  * be called.
1619  */
1620     static int
ins_compl_need_restart(void)1621 ins_compl_need_restart(void)
1622 {
1623     // Return TRUE if we didn't complete finding matches or when the
1624     // 'completefunc' returned "always" in the "refresh" dictionary item.
1625     return compl_was_interrupted
1626 	|| ((ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI)
1627 						  && compl_opt_refresh_always);
1628 }
1629 
1630 /*
1631  * Called after changing "compl_leader".
1632  * Show the popup menu with a different set of matches.
1633  * May also search for matches again if the previous search was interrupted.
1634  */
1635     static void
ins_compl_new_leader(void)1636 ins_compl_new_leader(void)
1637 {
1638     ins_compl_del_pum();
1639     ins_compl_delete();
1640     ins_bytes(compl_leader + ins_compl_len());
1641     compl_used_match = FALSE;
1642 
1643     if (compl_started)
1644 	ins_compl_set_original_text(compl_leader);
1645     else
1646     {
1647 #ifdef FEAT_SPELL
1648 	spell_bad_len = 0;	// need to redetect bad word
1649 #endif
1650 	// Matches were cleared, need to search for them now.  Before drawing
1651 	// the popup menu display the changed text before the cursor.  Set
1652 	// "compl_restarting" to avoid that the first match is inserted.
1653 	pum_call_update_screen();
1654 #ifdef FEAT_GUI
1655 	if (gui.in_use)
1656 	{
1657 	    // Show the cursor after the match, not after the redrawn text.
1658 	    setcursor();
1659 	    out_flush_cursor(FALSE, FALSE);
1660 	}
1661 #endif
1662 	compl_restarting = TRUE;
1663 	if (ins_complete(Ctrl_N, TRUE) == FAIL)
1664 	    compl_cont_status = 0;
1665 	compl_restarting = FALSE;
1666     }
1667 
1668     compl_enter_selects = !compl_used_match;
1669 
1670     // Show the popup menu with a different set of matches.
1671     ins_compl_show_pum();
1672 
1673     // Don't let Enter select the original text when there is no popup menu.
1674     if (compl_match_array == NULL)
1675 	compl_enter_selects = FALSE;
1676 }
1677 
1678 /*
1679  * Return the length of the completion, from the completion start column to
1680  * the cursor column.  Making sure it never goes below zero.
1681  */
1682     static int
ins_compl_len(void)1683 ins_compl_len(void)
1684 {
1685     int off = (int)curwin->w_cursor.col - (int)compl_col;
1686 
1687     if (off < 0)
1688 	return 0;
1689     return off;
1690 }
1691 
1692 /*
1693  * Append one character to the match leader.  May reduce the number of
1694  * matches.
1695  */
1696     void
ins_compl_addleader(int c)1697 ins_compl_addleader(int c)
1698 {
1699     int		cc;
1700 
1701     if (stop_arrow() == FAIL)
1702 	return;
1703     if (has_mbyte && (cc = (*mb_char2len)(c)) > 1)
1704     {
1705 	char_u	buf[MB_MAXBYTES + 1];
1706 
1707 	(*mb_char2bytes)(c, buf);
1708 	buf[cc] = NUL;
1709 	ins_char_bytes(buf, cc);
1710 	if (compl_opt_refresh_always)
1711 	    AppendToRedobuff(buf);
1712     }
1713     else
1714     {
1715 	ins_char(c);
1716 	if (compl_opt_refresh_always)
1717 	    AppendCharToRedobuff(c);
1718     }
1719 
1720     // If we didn't complete finding matches we must search again.
1721     if (ins_compl_need_restart())
1722 	ins_compl_restart();
1723 
1724     // When 'always' is set, don't reset compl_leader. While completing,
1725     // cursor doesn't point original position, changing compl_leader would
1726     // break redo.
1727     if (!compl_opt_refresh_always)
1728     {
1729 	vim_free(compl_leader);
1730 	compl_leader = vim_strnsave(ml_get_curline() + compl_col,
1731 					     curwin->w_cursor.col - compl_col);
1732 	if (compl_leader != NULL)
1733 	    ins_compl_new_leader();
1734     }
1735 }
1736 
1737 /*
1738  * Setup for finding completions again without leaving CTRL-X mode.  Used when
1739  * BS or a key was typed while still searching for matches.
1740  */
1741     static void
ins_compl_restart(void)1742 ins_compl_restart(void)
1743 {
1744     ins_compl_free();
1745     compl_started = FALSE;
1746     compl_matches = 0;
1747     compl_cont_status = 0;
1748     compl_cont_mode = 0;
1749 }
1750 
1751 /*
1752  * Set the first match, the original text.
1753  */
1754     static void
ins_compl_set_original_text(char_u * str)1755 ins_compl_set_original_text(char_u *str)
1756 {
1757     char_u	*p;
1758 
1759     // Replace the original text entry.
1760     // The CP_ORIGINAL_TEXT flag is either at the first item or might possibly be
1761     // at the last item for backward completion
1762     if (compl_first_match->cp_flags & CP_ORIGINAL_TEXT)	// safety check
1763     {
1764 	p = vim_strsave(str);
1765 	if (p != NULL)
1766 	{
1767 	    vim_free(compl_first_match->cp_str);
1768 	    compl_first_match->cp_str = p;
1769 	}
1770     }
1771     else if (compl_first_match->cp_prev != NULL
1772 	    && (compl_first_match->cp_prev->cp_flags & CP_ORIGINAL_TEXT))
1773     {
1774        p = vim_strsave(str);
1775        if (p != NULL)
1776        {
1777            vim_free(compl_first_match->cp_prev->cp_str);
1778            compl_first_match->cp_prev->cp_str = p;
1779        }
1780     }
1781 }
1782 
1783 /*
1784  * Append one character to the match leader.  May reduce the number of
1785  * matches.
1786  */
1787     void
ins_compl_addfrommatch(void)1788 ins_compl_addfrommatch(void)
1789 {
1790     char_u	*p;
1791     int		len = (int)curwin->w_cursor.col - (int)compl_col;
1792     int		c;
1793     compl_T	*cp;
1794 
1795     p = compl_shown_match->cp_str;
1796     if ((int)STRLEN(p) <= len)   // the match is too short
1797     {
1798 	// When still at the original match use the first entry that matches
1799 	// the leader.
1800 	if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT)
1801 	{
1802 	    p = NULL;
1803 	    for (cp = compl_shown_match->cp_next; cp != NULL
1804 				 && cp != compl_first_match; cp = cp->cp_next)
1805 	    {
1806 		if (compl_leader == NULL
1807 			|| ins_compl_equal(cp, compl_leader,
1808 						   (int)STRLEN(compl_leader)))
1809 		{
1810 		    p = cp->cp_str;
1811 		    break;
1812 		}
1813 	    }
1814 	    if (p == NULL || (int)STRLEN(p) <= len)
1815 		return;
1816 	}
1817 	else
1818 	    return;
1819     }
1820     p += len;
1821     c = PTR2CHAR(p);
1822     ins_compl_addleader(c);
1823 }
1824 
1825 /*
1826  * Prepare for Insert mode completion, or stop it.
1827  * Called just after typing a character in Insert mode.
1828  * Returns TRUE when the character is not to be inserted;
1829  */
1830     int
ins_compl_prep(int c)1831 ins_compl_prep(int c)
1832 {
1833     char_u	*ptr;
1834 #ifdef FEAT_CINDENT
1835     int		want_cindent;
1836 #endif
1837     int		retval = FALSE;
1838     int		prev_mode = ctrl_x_mode;
1839 
1840     // Forget any previous 'special' messages if this is actually
1841     // a ^X mode key - bar ^R, in which case we wait to see what it gives us.
1842     if (c != Ctrl_R && vim_is_ctrl_x_key(c))
1843 	edit_submode_extra = NULL;
1844 
1845     // Ignore end of Select mode mapping and mouse scroll buttons.
1846     if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP
1847 	    || c == K_MOUSELEFT || c == K_MOUSERIGHT || c == K_COMMAND)
1848 	return retval;
1849 
1850 #ifdef FEAT_PROP_POPUP
1851     // Ignore mouse events in a popup window
1852     if (is_mouse_key(c))
1853     {
1854 	// Ignore drag and release events, the position does not need to be in
1855 	// the popup and it may have just closed.
1856 	if (c == K_LEFTRELEASE
1857 		|| c == K_LEFTRELEASE_NM
1858 		|| c == K_MIDDLERELEASE
1859 		|| c == K_RIGHTRELEASE
1860 		|| c == K_X1RELEASE
1861 		|| c == K_X2RELEASE
1862 		|| c == K_LEFTDRAG
1863 		|| c == K_MIDDLEDRAG
1864 		|| c == K_RIGHTDRAG
1865 		|| c == K_X1DRAG
1866 		|| c == K_X2DRAG)
1867 	    return retval;
1868 	if (popup_visible)
1869 	{
1870 	    int	    row = mouse_row;
1871 	    int	    col = mouse_col;
1872 	    win_T   *wp = mouse_find_win(&row, &col, FIND_POPUP);
1873 
1874 	    if (wp != NULL && WIN_IS_POPUP(wp))
1875 		return retval;
1876 	}
1877     }
1878 #endif
1879 
1880     if (ctrl_x_mode == CTRL_X_CMDLINE_CTRL_X && c != Ctrl_X)
1881     {
1882 	if (c == Ctrl_V || c == Ctrl_Q || c == Ctrl_Z || ins_compl_pum_key(c)
1883 		|| !vim_is_ctrl_x_key(c))
1884 	{
1885 	    // Not starting another completion mode.
1886 	    ctrl_x_mode = CTRL_X_CMDLINE;
1887 
1888 	    // CTRL-X CTRL-Z should stop completion without inserting anything
1889 	    if (c == Ctrl_Z)
1890 		retval = TRUE;
1891 	}
1892 	else
1893 	{
1894 	    ctrl_x_mode = CTRL_X_CMDLINE;
1895 
1896 	    // Other CTRL-X keys first stop completion, then start another
1897 	    // completion mode.
1898 	    ins_compl_prep(' ');
1899 	    ctrl_x_mode = CTRL_X_NOT_DEFINED_YET;
1900 	}
1901     }
1902 
1903     // Set "compl_get_longest" when finding the first matches.
1904     if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET
1905 			   || (ctrl_x_mode == CTRL_X_NORMAL && !compl_started))
1906     {
1907 	compl_get_longest = (strstr((char *)p_cot, "longest") != NULL);
1908 	compl_used_match = TRUE;
1909 
1910     }
1911 
1912     if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET)
1913     {
1914 	// We have just typed CTRL-X and aren't quite sure which CTRL-X mode
1915 	// it will be yet.  Now we decide.
1916 	switch (c)
1917 	{
1918 	    case Ctrl_E:
1919 	    case Ctrl_Y:
1920 		ctrl_x_mode = CTRL_X_SCROLL;
1921 		if (!(State & REPLACE_FLAG))
1922 		    edit_submode = (char_u *)_(" (insert) Scroll (^E/^Y)");
1923 		else
1924 		    edit_submode = (char_u *)_(" (replace) Scroll (^E/^Y)");
1925 		edit_submode_pre = NULL;
1926 		showmode();
1927 		break;
1928 	    case Ctrl_L:
1929 		ctrl_x_mode = CTRL_X_WHOLE_LINE;
1930 		break;
1931 	    case Ctrl_F:
1932 		ctrl_x_mode = CTRL_X_FILES;
1933 		break;
1934 	    case Ctrl_K:
1935 		ctrl_x_mode = CTRL_X_DICTIONARY;
1936 		break;
1937 	    case Ctrl_R:
1938 		// Simply allow ^R to happen without affecting ^X mode
1939 		break;
1940 	    case Ctrl_T:
1941 		ctrl_x_mode = CTRL_X_THESAURUS;
1942 		break;
1943 #ifdef FEAT_COMPL_FUNC
1944 	    case Ctrl_U:
1945 		ctrl_x_mode = CTRL_X_FUNCTION;
1946 		break;
1947 	    case Ctrl_O:
1948 		ctrl_x_mode = CTRL_X_OMNI;
1949 		break;
1950 #endif
1951 	    case 's':
1952 	    case Ctrl_S:
1953 		ctrl_x_mode = CTRL_X_SPELL;
1954 #ifdef FEAT_SPELL
1955 		++emsg_off;	// Avoid getting the E756 error twice.
1956 		spell_back_to_badword();
1957 		--emsg_off;
1958 #endif
1959 		break;
1960 	    case Ctrl_RSB:
1961 		ctrl_x_mode = CTRL_X_TAGS;
1962 		break;
1963 #ifdef FEAT_FIND_ID
1964 	    case Ctrl_I:
1965 	    case K_S_TAB:
1966 		ctrl_x_mode = CTRL_X_PATH_PATTERNS;
1967 		break;
1968 	    case Ctrl_D:
1969 		ctrl_x_mode = CTRL_X_PATH_DEFINES;
1970 		break;
1971 #endif
1972 	    case Ctrl_V:
1973 	    case Ctrl_Q:
1974 		ctrl_x_mode = CTRL_X_CMDLINE;
1975 		break;
1976 	    case Ctrl_Z:
1977 		ctrl_x_mode = CTRL_X_NORMAL;
1978 		edit_submode = NULL;
1979 		showmode();
1980 		retval = TRUE;
1981 		break;
1982 	    case Ctrl_P:
1983 	    case Ctrl_N:
1984 		// ^X^P means LOCAL expansion if nothing interrupted (eg we
1985 		// just started ^X mode, or there were enough ^X's to cancel
1986 		// the previous mode, say ^X^F^X^X^P or ^P^X^X^X^P, see below)
1987 		// do normal expansion when interrupting a different mode (say
1988 		// ^X^F^X^P or ^P^X^X^P, see below)
1989 		// nothing changes if interrupting mode 0, (eg, the flag
1990 		// doesn't change when going to ADDING mode  -- Acevedo
1991 		if (!(compl_cont_status & CONT_INTRPT))
1992 		    compl_cont_status |= CONT_LOCAL;
1993 		else if (compl_cont_mode != 0)
1994 		    compl_cont_status &= ~CONT_LOCAL;
1995 		// FALLTHROUGH
1996 	    default:
1997 		// If we have typed at least 2 ^X's... for modes != 0, we set
1998 		// compl_cont_status = 0 (eg, as if we had just started ^X
1999 		// mode).
2000 		// For mode 0, we set "compl_cont_mode" to an impossible
2001 		// value, in both cases ^X^X can be used to restart the same
2002 		// mode (avoiding ADDING mode).
2003 		// Undocumented feature: In a mode != 0 ^X^P and ^X^X^P start
2004 		// 'complete' and local ^P expansions respectively.
2005 		// In mode 0 an extra ^X is needed since ^X^P goes to ADDING
2006 		// mode  -- Acevedo
2007 		if (c == Ctrl_X)
2008 		{
2009 		    if (compl_cont_mode != 0)
2010 			compl_cont_status = 0;
2011 		    else
2012 			compl_cont_mode = CTRL_X_NOT_DEFINED_YET;
2013 		}
2014 		ctrl_x_mode = CTRL_X_NORMAL;
2015 		edit_submode = NULL;
2016 		showmode();
2017 		break;
2018 	}
2019     }
2020     else if (ctrl_x_mode != CTRL_X_NORMAL)
2021     {
2022 	// We're already in CTRL-X mode, do we stay in it?
2023 	if (!vim_is_ctrl_x_key(c))
2024 	{
2025 	    if (ctrl_x_mode == CTRL_X_SCROLL)
2026 		ctrl_x_mode = CTRL_X_NORMAL;
2027 	    else
2028 		ctrl_x_mode = CTRL_X_FINISHED;
2029 	    edit_submode = NULL;
2030 	}
2031 	showmode();
2032     }
2033 
2034     if (compl_started || ctrl_x_mode == CTRL_X_FINISHED)
2035     {
2036 	// Show error message from attempted keyword completion (probably
2037 	// 'Pattern not found') until another key is hit, then go back to
2038 	// showing what mode we are in.
2039 	showmode();
2040 	if ((ctrl_x_mode == CTRL_X_NORMAL && c != Ctrl_N && c != Ctrl_P
2041 				       && c != Ctrl_R && !ins_compl_pum_key(c))
2042 		|| ctrl_x_mode == CTRL_X_FINISHED)
2043 	{
2044 	    // Get here when we have finished typing a sequence of ^N and
2045 	    // ^P or other completion characters in CTRL-X mode.  Free up
2046 	    // memory that was used, and make sure we can redo the insert.
2047 	    if (compl_curr_match != NULL || compl_leader != NULL || c == Ctrl_E)
2048 	    {
2049 		// If any of the original typed text has been changed, eg when
2050 		// ignorecase is set, we must add back-spaces to the redo
2051 		// buffer.  We add as few as necessary to delete just the part
2052 		// of the original text that has changed.
2053 		// When using the longest match, edited the match or used
2054 		// CTRL-E then don't use the current match.
2055 		if (compl_curr_match != NULL && compl_used_match && c != Ctrl_E)
2056 		    ptr = compl_curr_match->cp_str;
2057 		else
2058 		    ptr = NULL;
2059 		ins_compl_fixRedoBufForLeader(ptr);
2060 	    }
2061 
2062 #ifdef FEAT_CINDENT
2063 	    want_cindent = (get_can_cindent() && cindent_on());
2064 #endif
2065 	    // When completing whole lines: fix indent for 'cindent'.
2066 	    // Otherwise, break line if it's too long.
2067 	    if (compl_cont_mode == CTRL_X_WHOLE_LINE)
2068 	    {
2069 #ifdef FEAT_CINDENT
2070 		// re-indent the current line
2071 		if (want_cindent)
2072 		{
2073 		    do_c_expr_indent();
2074 		    want_cindent = FALSE;	// don't do it again
2075 		}
2076 #endif
2077 	    }
2078 	    else
2079 	    {
2080 		int prev_col = curwin->w_cursor.col;
2081 
2082 		// put the cursor on the last char, for 'tw' formatting
2083 		if (prev_col > 0)
2084 		    dec_cursor();
2085 		// only format when something was inserted
2086 		if (!arrow_used && !ins_need_undo_get() && c != Ctrl_E)
2087 		    insertchar(NUL, 0, -1);
2088 		if (prev_col > 0
2089 			     && ml_get_curline()[curwin->w_cursor.col] != NUL)
2090 		    inc_cursor();
2091 	    }
2092 
2093 	    // If the popup menu is displayed pressing CTRL-Y means accepting
2094 	    // the selection without inserting anything.  When
2095 	    // compl_enter_selects is set the Enter key does the same.
2096 	    if ((c == Ctrl_Y || (compl_enter_selects
2097 				   && (c == CAR || c == K_KENTER || c == NL)))
2098 		    && pum_visible())
2099 		retval = TRUE;
2100 
2101 	    // CTRL-E means completion is Ended, go back to the typed text.
2102 	    // but only do this, if the Popup is still visible
2103 	    if (c == Ctrl_E)
2104 	    {
2105 		ins_compl_delete();
2106 		if (compl_leader != NULL)
2107 		    ins_bytes(compl_leader + ins_compl_len());
2108 		else if (compl_first_match != NULL)
2109 		    ins_bytes(compl_orig_text + ins_compl_len());
2110 		retval = TRUE;
2111 	    }
2112 
2113 	    auto_format(FALSE, TRUE);
2114 
2115 	    // Trigger the CompleteDonePre event to give scripts a chance to
2116 	    // act upon the completion before clearing the info, and restore
2117 	    // ctrl_x_mode, so that complete_info() can be used.
2118 	    ctrl_x_mode = prev_mode;
2119 	    ins_apply_autocmds(EVENT_COMPLETEDONEPRE);
2120 
2121 	    ins_compl_free();
2122 	    compl_started = FALSE;
2123 	    compl_matches = 0;
2124 	    if (!shortmess(SHM_COMPLETIONMENU))
2125 		msg_clr_cmdline();	// necessary for "noshowmode"
2126 	    ctrl_x_mode = CTRL_X_NORMAL;
2127 	    compl_enter_selects = FALSE;
2128 	    if (edit_submode != NULL)
2129 	    {
2130 		edit_submode = NULL;
2131 		showmode();
2132 	    }
2133 
2134 #ifdef FEAT_CMDWIN
2135 	    if (c == Ctrl_C && cmdwin_type != 0)
2136 		// Avoid the popup menu remains displayed when leaving the
2137 		// command line window.
2138 		update_screen(0);
2139 #endif
2140 #ifdef FEAT_CINDENT
2141 	    // Indent now if a key was typed that is in 'cinkeys'.
2142 	    if (want_cindent && in_cinkeys(KEY_COMPLETE, ' ', inindent(0)))
2143 		do_c_expr_indent();
2144 #endif
2145 	    // Trigger the CompleteDone event to give scripts a chance to act
2146 	    // upon the end of completion.
2147 	    ins_apply_autocmds(EVENT_COMPLETEDONE);
2148 	}
2149     }
2150     else if (ctrl_x_mode == CTRL_X_LOCAL_MSG)
2151 	// Trigger the CompleteDone event to give scripts a chance to act
2152 	// upon the (possibly failed) completion.
2153 	ins_apply_autocmds(EVENT_COMPLETEDONE);
2154 
2155     trigger_modechanged();
2156 
2157     // reset continue_* if we left expansion-mode, if we stay they'll be
2158     // (re)set properly in ins_complete()
2159     if (!vim_is_ctrl_x_key(c))
2160     {
2161 	compl_cont_status = 0;
2162 	compl_cont_mode = 0;
2163     }
2164 
2165     return retval;
2166 }
2167 
2168 /*
2169  * Fix the redo buffer for the completion leader replacing some of the typed
2170  * text.  This inserts backspaces and appends the changed text.
2171  * "ptr" is the known leader text or NUL.
2172  */
2173     static void
ins_compl_fixRedoBufForLeader(char_u * ptr_arg)2174 ins_compl_fixRedoBufForLeader(char_u *ptr_arg)
2175 {
2176     int	    len;
2177     char_u  *p;
2178     char_u  *ptr = ptr_arg;
2179 
2180     if (ptr == NULL)
2181     {
2182 	if (compl_leader != NULL)
2183 	    ptr = compl_leader;
2184 	else
2185 	    return;  // nothing to do
2186     }
2187     if (compl_orig_text != NULL)
2188     {
2189 	p = compl_orig_text;
2190 	for (len = 0; p[len] != NUL && p[len] == ptr[len]; ++len)
2191 	    ;
2192 	if (len > 0)
2193 	    len -= (*mb_head_off)(p, p + len);
2194 	for (p += len; *p != NUL; MB_PTR_ADV(p))
2195 	    AppendCharToRedobuff(K_BS);
2196     }
2197     else
2198 	len = 0;
2199     if (ptr != NULL)
2200 	AppendToRedobuffLit(ptr + len, -1);
2201 }
2202 
2203 /*
2204  * Loops through the list of windows, loaded-buffers or non-loaded-buffers
2205  * (depending on flag) starting from buf and looking for a non-scanned
2206  * buffer (other than curbuf).	curbuf is special, if it is called with
2207  * buf=curbuf then it has to be the first call for a given flag/expansion.
2208  *
2209  * Returns the buffer to scan, if any, otherwise returns curbuf -- Acevedo
2210  */
2211     static buf_T *
ins_compl_next_buf(buf_T * buf,int flag)2212 ins_compl_next_buf(buf_T *buf, int flag)
2213 {
2214     static win_T *wp = NULL;
2215 
2216     if (flag == 'w')		// just windows
2217     {
2218 	if (buf == curbuf || wp == NULL)  // first call for this flag/expansion
2219 	    wp = curwin;
2220 	while ((wp = (wp->w_next != NULL ? wp->w_next : firstwin)) != curwin
2221 		&& wp->w_buffer->b_scanned)
2222 	    ;
2223 	buf = wp->w_buffer;
2224     }
2225     else
2226 	// 'b' (just loaded buffers), 'u' (just non-loaded buffers) or 'U'
2227 	// (unlisted buffers)
2228 	// When completing whole lines skip unloaded buffers.
2229 	while ((buf = (buf->b_next != NULL ? buf->b_next : firstbuf)) != curbuf
2230 		&& ((flag == 'U'
2231 			? buf->b_p_bl
2232 			: (!buf->b_p_bl
2233 			    || (buf->b_ml.ml_mfp == NULL) != (flag == 'u')))
2234 		    || buf->b_scanned))
2235 	    ;
2236     return buf;
2237 }
2238 
2239 #ifdef FEAT_COMPL_FUNC
2240 /*
2241  * Get the user-defined completion function name for completion 'type'
2242  */
2243     static char_u *
get_complete_funcname(int type)2244 get_complete_funcname(int type)
2245 {
2246     switch (type)
2247     {
2248 	case CTRL_X_FUNCTION:
2249 	    return curbuf->b_p_cfu;
2250 	case CTRL_X_OMNI:
2251 	    return curbuf->b_p_ofu;
2252 	case CTRL_X_THESAURUS:
2253 	    return *curbuf->b_p_tsrfu == NUL ? p_tsrfu : curbuf->b_p_tsrfu;
2254 	default:
2255 	    return (char_u *)"";
2256     }
2257 }
2258 
2259 /*
2260  * Execute user defined complete function 'completefunc' or 'omnifunc', and
2261  * get matches in "matches".
2262  */
2263     static void
expand_by_function(int type,char_u * base)2264 expand_by_function(
2265     int		type,	    // CTRL_X_OMNI or CTRL_X_FUNCTION
2266     char_u	*base)
2267 {
2268     list_T      *matchlist = NULL;
2269     dict_T	*matchdict = NULL;
2270     typval_T	args[3];
2271     char_u	*funcname;
2272     pos_T	pos;
2273     typval_T	rettv;
2274     int		save_State = State;
2275 
2276     funcname = get_complete_funcname(type);
2277     if (*funcname == NUL)
2278 	return;
2279 
2280     // Call 'completefunc' to obtain the list of matches.
2281     args[0].v_type = VAR_NUMBER;
2282     args[0].vval.v_number = 0;
2283     args[1].v_type = VAR_STRING;
2284     args[1].vval.v_string = base != NULL ? base : (char_u *)"";
2285     args[2].v_type = VAR_UNKNOWN;
2286 
2287     pos = curwin->w_cursor;
2288     // Lock the text to avoid weird things from happening.  Also disallow
2289     // switching to another window, it should not be needed and may end up in
2290     // Insert mode in another buffer.
2291     ++textwinlock;
2292 
2293     // Call a function, which returns a list or dict.
2294     if (call_vim_function(funcname, 2, args, &rettv) == OK)
2295     {
2296 	switch (rettv.v_type)
2297 	{
2298 	    case VAR_LIST:
2299 		matchlist = rettv.vval.v_list;
2300 		break;
2301 	    case VAR_DICT:
2302 		matchdict = rettv.vval.v_dict;
2303 		break;
2304 	    case VAR_SPECIAL:
2305 		if (rettv.vval.v_number == VVAL_NONE)
2306 		    compl_opt_suppress_empty = TRUE;
2307 		// FALLTHROUGH
2308 	    default:
2309 		// TODO: Give error message?
2310 		clear_tv(&rettv);
2311 		break;
2312 	}
2313     }
2314     --textwinlock;
2315 
2316     curwin->w_cursor = pos;	// restore the cursor position
2317     validate_cursor();
2318     if (!EQUAL_POS(curwin->w_cursor, pos))
2319     {
2320 	emsg(_(e_compldel));
2321 	goto theend;
2322     }
2323 
2324     if (matchlist != NULL)
2325 	ins_compl_add_list(matchlist);
2326     else if (matchdict != NULL)
2327 	ins_compl_add_dict(matchdict);
2328 
2329 theend:
2330     // Restore State, it might have been changed.
2331     State = save_State;
2332 
2333     if (matchdict != NULL)
2334 	dict_unref(matchdict);
2335     if (matchlist != NULL)
2336 	list_unref(matchlist);
2337 }
2338 #endif // FEAT_COMPL_FUNC
2339 
2340 #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL) || defined(PROTO)
2341 /*
2342  * Add a match to the list of matches from a typeval_T.
2343  * If the given string is already in the list of completions, then return
2344  * NOTDONE, otherwise add it to the list and return OK.  If there is an error,
2345  * maybe because alloc() returns NULL, then FAIL is returned.
2346  * When "fast" is TRUE use fast_breakcheck() instead of ui_breakcheck().
2347  */
2348     static int
ins_compl_add_tv(typval_T * tv,int dir,int fast)2349 ins_compl_add_tv(typval_T *tv, int dir, int fast)
2350 {
2351     char_u	*word;
2352     int		dup = FALSE;
2353     int		empty = FALSE;
2354     int		flags = fast ? CP_FAST : 0;
2355     char_u	*(cptext[CPT_COUNT]);
2356     typval_T	user_data;
2357 
2358     user_data.v_type = VAR_UNKNOWN;
2359     if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL)
2360     {
2361 	word = dict_get_string(tv->vval.v_dict, (char_u *)"word", FALSE);
2362 	cptext[CPT_ABBR] = dict_get_string(tv->vval.v_dict,
2363 						     (char_u *)"abbr", FALSE);
2364 	cptext[CPT_MENU] = dict_get_string(tv->vval.v_dict,
2365 						     (char_u *)"menu", FALSE);
2366 	cptext[CPT_KIND] = dict_get_string(tv->vval.v_dict,
2367 						     (char_u *)"kind", FALSE);
2368 	cptext[CPT_INFO] = dict_get_string(tv->vval.v_dict,
2369 						     (char_u *)"info", FALSE);
2370 	dict_get_tv(tv->vval.v_dict, (char_u *)"user_data", &user_data);
2371 	if (dict_get_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL
2372 			&& dict_get_number(tv->vval.v_dict, (char_u *)"icase"))
2373 	    flags |= CP_ICASE;
2374 	if (dict_get_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL)
2375 	    dup = dict_get_number(tv->vval.v_dict, (char_u *)"dup");
2376 	if (dict_get_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL)
2377 	    empty = dict_get_number(tv->vval.v_dict, (char_u *)"empty");
2378 	if (dict_get_string(tv->vval.v_dict, (char_u *)"equal", FALSE) != NULL
2379 			&& dict_get_number(tv->vval.v_dict, (char_u *)"equal"))
2380 	    flags |= CP_EQUAL;
2381     }
2382     else
2383     {
2384 	word = tv_get_string_chk(tv);
2385 	CLEAR_FIELD(cptext);
2386     }
2387     if (word == NULL || (!empty && *word == NUL))
2388 	return FAIL;
2389     return ins_compl_add(word, -1, NULL, cptext, &user_data, dir, flags, dup);
2390 }
2391 
2392 /*
2393  * Add completions from a list.
2394  */
2395     static void
ins_compl_add_list(list_T * list)2396 ins_compl_add_list(list_T *list)
2397 {
2398     listitem_T	*li;
2399     int		dir = compl_direction;
2400 
2401     // Go through the List with matches and add each of them.
2402     CHECK_LIST_MATERIALIZE(list);
2403     FOR_ALL_LIST_ITEMS(list, li)
2404     {
2405 	if (ins_compl_add_tv(&li->li_tv, dir, TRUE) == OK)
2406 	    // if dir was BACKWARD then honor it just once
2407 	    dir = FORWARD;
2408 	else if (did_emsg)
2409 	    break;
2410     }
2411 }
2412 
2413 /*
2414  * Add completions from a dict.
2415  */
2416     static void
ins_compl_add_dict(dict_T * dict)2417 ins_compl_add_dict(dict_T *dict)
2418 {
2419     dictitem_T	*di_refresh;
2420     dictitem_T	*di_words;
2421 
2422     // Check for optional "refresh" item.
2423     compl_opt_refresh_always = FALSE;
2424     di_refresh = dict_find(dict, (char_u *)"refresh", 7);
2425     if (di_refresh != NULL && di_refresh->di_tv.v_type == VAR_STRING)
2426     {
2427 	char_u	*v = di_refresh->di_tv.vval.v_string;
2428 
2429 	if (v != NULL && STRCMP(v, (char_u *)"always") == 0)
2430 	    compl_opt_refresh_always = TRUE;
2431     }
2432 
2433     // Add completions from a "words" list.
2434     di_words = dict_find(dict, (char_u *)"words", 5);
2435     if (di_words != NULL && di_words->di_tv.v_type == VAR_LIST)
2436 	ins_compl_add_list(di_words->di_tv.vval.v_list);
2437 }
2438 
2439 /*
2440  * Start completion for the complete() function.
2441  * "startcol" is where the matched text starts (1 is first column).
2442  * "list" is the list of matches.
2443  */
2444     static void
set_completion(colnr_T startcol,list_T * list)2445 set_completion(colnr_T startcol, list_T *list)
2446 {
2447     int save_w_wrow = curwin->w_wrow;
2448     int save_w_leftcol = curwin->w_leftcol;
2449     int flags = CP_ORIGINAL_TEXT;
2450 
2451     // If already doing completions stop it.
2452     if (ctrl_x_mode != CTRL_X_NORMAL)
2453 	ins_compl_prep(' ');
2454     ins_compl_clear();
2455     ins_compl_free();
2456 
2457     compl_direction = FORWARD;
2458     if (startcol > curwin->w_cursor.col)
2459 	startcol = curwin->w_cursor.col;
2460     compl_col = startcol;
2461     compl_length = (int)curwin->w_cursor.col - (int)startcol;
2462     // compl_pattern doesn't need to be set
2463     compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length);
2464     if (p_ic)
2465 	flags |= CP_ICASE;
2466     if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
2467 					      -1, NULL, NULL, NULL, 0,
2468 					      flags | CP_FAST, FALSE) != OK)
2469 	return;
2470 
2471     ctrl_x_mode = CTRL_X_EVAL;
2472 
2473     ins_compl_add_list(list);
2474     compl_matches = ins_compl_make_cyclic();
2475     compl_started = TRUE;
2476     compl_used_match = TRUE;
2477     compl_cont_status = 0;
2478 
2479     compl_curr_match = compl_first_match;
2480     if (compl_no_insert || compl_no_select)
2481     {
2482 	ins_complete(K_DOWN, FALSE);
2483 	if (compl_no_select)
2484 	    // Down/Up has no real effect.
2485 	    ins_complete(K_UP, FALSE);
2486     }
2487     else
2488 	ins_complete(Ctrl_N, FALSE);
2489     compl_enter_selects = compl_no_insert;
2490 
2491     // Lazily show the popup menu, unless we got interrupted.
2492     if (!compl_interrupted)
2493 	show_pum(save_w_wrow, save_w_leftcol);
2494     trigger_modechanged();
2495     out_flush();
2496 }
2497 
2498 /*
2499  * "complete()" function
2500  */
2501     void
f_complete(typval_T * argvars,typval_T * rettv UNUSED)2502 f_complete(typval_T *argvars, typval_T *rettv UNUSED)
2503 {
2504     int	    startcol;
2505     int	    save_textlock = textlock;
2506 
2507     if (in_vim9script()
2508 	    && (check_for_number_arg(argvars, 0) == FAIL
2509 		|| check_for_list_arg(argvars, 1) == FAIL))
2510 	return;
2511 
2512     if ((State & INSERT) == 0)
2513     {
2514 	emsg(_("E785: complete() can only be used in Insert mode"));
2515 	return;
2516     }
2517 
2518     // "textlock" is set when evaluating 'completefunc' but we can change
2519     // text here.
2520     textlock = 0;
2521 
2522     // Check for undo allowed here, because if something was already inserted
2523     // the line was already saved for undo and this check isn't done.
2524     if (!undo_allowed())
2525 	return;
2526 
2527     if (argvars[1].v_type != VAR_LIST || argvars[1].vval.v_list == NULL)
2528 	emsg(_(e_invarg));
2529     else
2530     {
2531 	startcol = (int)tv_get_number_chk(&argvars[0], NULL);
2532 	if (startcol > 0)
2533 	    set_completion(startcol - 1, argvars[1].vval.v_list);
2534     }
2535     textlock = save_textlock;
2536 }
2537 
2538 /*
2539  * "complete_add()" function
2540  */
2541     void
f_complete_add(typval_T * argvars,typval_T * rettv)2542 f_complete_add(typval_T *argvars, typval_T *rettv)
2543 {
2544     if (in_vim9script() && check_for_string_or_dict_arg(argvars, 0) == FAIL)
2545 	return;
2546 
2547     rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0, FALSE);
2548 }
2549 
2550 /*
2551  * "complete_check()" function
2552  */
2553     void
f_complete_check(typval_T * argvars UNUSED,typval_T * rettv)2554 f_complete_check(typval_T *argvars UNUSED, typval_T *rettv)
2555 {
2556     int		saved = RedrawingDisabled;
2557 
2558     RedrawingDisabled = 0;
2559     ins_compl_check_keys(0, TRUE);
2560     rettv->vval.v_number = ins_compl_interrupted();
2561     RedrawingDisabled = saved;
2562 }
2563 
2564 /*
2565  * Return Insert completion mode name string
2566  */
2567     static char_u *
ins_compl_mode(void)2568 ins_compl_mode(void)
2569 {
2570     if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET || ctrl_x_mode == CTRL_X_SCROLL
2571 	    || compl_started)
2572 	return (char_u *)ctrl_x_mode_names[ctrl_x_mode & ~CTRL_X_WANT_IDENT];
2573 
2574     return (char_u *)"";
2575 }
2576 
2577     static void
ins_compl_update_sequence_numbers()2578 ins_compl_update_sequence_numbers()
2579 {
2580     int		number = 0;
2581     compl_T	*match;
2582 
2583     if (compl_direction == FORWARD)
2584     {
2585 	// search backwards for the first valid (!= -1) number.
2586 	// This should normally succeed already at the first loop
2587 	// cycle, so it's fast!
2588 	for (match = compl_curr_match->cp_prev; match != NULL
2589 		&& match != compl_first_match;
2590 					   match = match->cp_prev)
2591 	    if (match->cp_number != -1)
2592 	    {
2593 		number = match->cp_number;
2594 		break;
2595 	    }
2596 	if (match != NULL)
2597 	    // go up and assign all numbers which are not assigned
2598 	    // yet
2599 	    for (match = match->cp_next;
2600 		    match != NULL && match->cp_number == -1;
2601 					   match = match->cp_next)
2602 		match->cp_number = ++number;
2603     }
2604     else // BACKWARD
2605     {
2606 	// search forwards (upwards) for the first valid (!= -1)
2607 	// number.  This should normally succeed already at the
2608 	// first loop cycle, so it's fast!
2609 	for (match = compl_curr_match->cp_next; match != NULL
2610 		&& match != compl_first_match;
2611 					   match = match->cp_next)
2612 	    if (match->cp_number != -1)
2613 	    {
2614 		number = match->cp_number;
2615 		break;
2616 	    }
2617 	if (match != NULL)
2618 	    // go down and assign all numbers which are not
2619 	    // assigned yet
2620 	    for (match = match->cp_prev; match
2621 		    && match->cp_number == -1;
2622 					   match = match->cp_prev)
2623 		match->cp_number = ++number;
2624     }
2625 }
2626 
2627 /*
2628  * Get complete information
2629  */
2630     static void
get_complete_info(list_T * what_list,dict_T * retdict)2631 get_complete_info(list_T *what_list, dict_T *retdict)
2632 {
2633     int		ret = OK;
2634     listitem_T	*item;
2635 #define CI_WHAT_MODE		0x01
2636 #define CI_WHAT_PUM_VISIBLE	0x02
2637 #define CI_WHAT_ITEMS		0x04
2638 #define CI_WHAT_SELECTED	0x08
2639 #define CI_WHAT_INSERTED	0x10
2640 #define CI_WHAT_ALL		0xff
2641     int		what_flag;
2642 
2643     if (what_list == NULL)
2644 	what_flag = CI_WHAT_ALL;
2645     else
2646     {
2647 	what_flag = 0;
2648 	CHECK_LIST_MATERIALIZE(what_list);
2649 	FOR_ALL_LIST_ITEMS(what_list, item)
2650 	{
2651 	    char_u *what = tv_get_string(&item->li_tv);
2652 
2653 	    if (STRCMP(what, "mode") == 0)
2654 		what_flag |= CI_WHAT_MODE;
2655 	    else if (STRCMP(what, "pum_visible") == 0)
2656 		what_flag |= CI_WHAT_PUM_VISIBLE;
2657 	    else if (STRCMP(what, "items") == 0)
2658 		what_flag |= CI_WHAT_ITEMS;
2659 	    else if (STRCMP(what, "selected") == 0)
2660 		what_flag |= CI_WHAT_SELECTED;
2661 	    else if (STRCMP(what, "inserted") == 0)
2662 		what_flag |= CI_WHAT_INSERTED;
2663 	}
2664     }
2665 
2666     if (ret == OK && (what_flag & CI_WHAT_MODE))
2667 	ret = dict_add_string(retdict, "mode", ins_compl_mode());
2668 
2669     if (ret == OK && (what_flag & CI_WHAT_PUM_VISIBLE))
2670 	ret = dict_add_number(retdict, "pum_visible", pum_visible());
2671 
2672     if (ret == OK && (what_flag & CI_WHAT_ITEMS))
2673     {
2674 	list_T	    *li;
2675 	dict_T	    *di;
2676 	compl_T     *match;
2677 
2678 	li = list_alloc();
2679 	if (li == NULL)
2680 	    return;
2681 	ret = dict_add_list(retdict, "items", li);
2682 	if (ret == OK && compl_first_match != NULL)
2683 	{
2684 	    match = compl_first_match;
2685 	    do
2686 	    {
2687 		if (!(match->cp_flags & CP_ORIGINAL_TEXT))
2688 		{
2689 		    di = dict_alloc();
2690 		    if (di == NULL)
2691 			return;
2692 		    ret = list_append_dict(li, di);
2693 		    if (ret != OK)
2694 			return;
2695 		    dict_add_string(di, "word", match->cp_str);
2696 		    dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
2697 		    dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
2698 		    dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
2699 		    dict_add_string(di, "info", match->cp_text[CPT_INFO]);
2700 		    if (match->cp_user_data.v_type == VAR_UNKNOWN)
2701 			// Add an empty string for backwards compatibility
2702 			dict_add_string(di, "user_data", (char_u *)"");
2703 		    else
2704 			dict_add_tv(di, "user_data", &match->cp_user_data);
2705 		}
2706 		match = match->cp_next;
2707 	    }
2708 	    while (match != NULL && match != compl_first_match);
2709 	}
2710     }
2711 
2712     if (ret == OK && (what_flag & CI_WHAT_SELECTED))
2713     {
2714 	if (compl_curr_match != NULL && compl_curr_match->cp_number == -1)
2715 	    ins_compl_update_sequence_numbers();
2716 	ret = dict_add_number(retdict, "selected", compl_curr_match != NULL
2717 				      ? compl_curr_match->cp_number - 1 : -1);
2718     }
2719 
2720     // TODO
2721     // if (ret == OK && (what_flag & CI_WHAT_INSERTED))
2722 }
2723 
2724 /*
2725  * "complete_info()" function
2726  */
2727     void
f_complete_info(typval_T * argvars,typval_T * rettv)2728 f_complete_info(typval_T *argvars, typval_T *rettv)
2729 {
2730     list_T	*what_list = NULL;
2731 
2732     if (rettv_dict_alloc(rettv) != OK)
2733 	return;
2734 
2735     if (in_vim9script() && check_for_opt_list_arg(argvars, 0) == FAIL)
2736 	return;
2737 
2738     if (argvars[0].v_type != VAR_UNKNOWN)
2739     {
2740 	if (argvars[0].v_type != VAR_LIST)
2741 	{
2742 	    emsg(_(e_listreq));
2743 	    return;
2744 	}
2745 	what_list = argvars[0].vval.v_list;
2746     }
2747     get_complete_info(what_list, rettv->vval.v_dict);
2748 }
2749 #endif
2750 
2751 /*
2752  * Returns TRUE when using a user-defined function for thesaurus completion.
2753  */
2754     static int
thesaurus_func_complete(int type UNUSED)2755 thesaurus_func_complete(int type UNUSED)
2756 {
2757 #ifdef FEAT_COMPL_FUNC
2758     return type == CTRL_X_THESAURUS
2759 		&& (*curbuf->b_p_tsrfu != NUL || *p_tsrfu != NUL);
2760 #else
2761     return FALSE;
2762 #endif
2763 }
2764 
2765 /*
2766  * Get the next expansion(s), using "compl_pattern".
2767  * The search starts at position "ini" in curbuf and in the direction
2768  * compl_direction.
2769  * When "compl_started" is FALSE start at that position, otherwise continue
2770  * where we stopped searching before.
2771  * This may return before finding all the matches.
2772  * Return the total number of matches or -1 if still unknown -- Acevedo
2773  */
2774     static int
ins_compl_get_exp(pos_T * ini)2775 ins_compl_get_exp(pos_T *ini)
2776 {
2777     static pos_T	first_match_pos;
2778     static pos_T	last_match_pos;
2779     static char_u	*e_cpt = (char_u *)"";	// curr. entry in 'complete'
2780     static int		found_all = FALSE;	// Found all matches of a
2781 						// certain type.
2782     static buf_T	*ins_buf = NULL;	// buffer being scanned
2783 
2784     pos_T	*pos;
2785     char_u	**matches;
2786     int		save_p_scs;
2787     int		save_p_ws;
2788     int		save_p_ic;
2789     int		i;
2790     int		num_matches;
2791     int		len;
2792     int		found_new_match;
2793     int		type = ctrl_x_mode;
2794     char_u	*ptr;
2795     char_u	*dict = NULL;
2796     int		dict_f = 0;
2797     int		set_match_pos;
2798     pos_T	prev_pos = {0, 0, 0};
2799     int		looped_around = FALSE;
2800 
2801     if (!compl_started)
2802     {
2803 	FOR_ALL_BUFFERS(ins_buf)
2804 	    ins_buf->b_scanned = 0;
2805 	found_all = FALSE;
2806 	ins_buf = curbuf;
2807 	e_cpt = (compl_cont_status & CONT_LOCAL)
2808 					    ? (char_u *)"." : curbuf->b_p_cpt;
2809 	last_match_pos = first_match_pos = *ini;
2810     }
2811     else if (ins_buf != curbuf && !buf_valid(ins_buf))
2812 	ins_buf = curbuf;  // In case the buffer was wiped out.
2813 
2814     compl_old_match = compl_curr_match;	// remember the last current match
2815     pos = (compl_direction == FORWARD) ? &last_match_pos : &first_match_pos;
2816 
2817     // For ^N/^P loop over all the flags/windows/buffers in 'complete'.
2818     for (;;)
2819     {
2820 	found_new_match = FAIL;
2821 	set_match_pos = FALSE;
2822 
2823 	// For ^N/^P pick a new entry from e_cpt if compl_started is off,
2824 	// or if found_all says this entry is done.  For ^X^L only use the
2825 	// entries from 'complete' that look in loaded buffers.
2826 	if ((ctrl_x_mode == CTRL_X_NORMAL
2827 		    || ctrl_x_mode_line_or_eval())
2828 					&& (!compl_started || found_all))
2829 	{
2830 	    found_all = FALSE;
2831 	    while (*e_cpt == ',' || *e_cpt == ' ')
2832 		e_cpt++;
2833 	    if (*e_cpt == '.' && !curbuf->b_scanned)
2834 	    {
2835 		ins_buf = curbuf;
2836 		first_match_pos = *ini;
2837 		// Move the cursor back one character so that ^N can match the
2838 		// word immediately after the cursor.
2839 		if (ctrl_x_mode == CTRL_X_NORMAL && dec(&first_match_pos) < 0)
2840 		{
2841 		    // Move the cursor to after the last character in the
2842 		    // buffer, so that word at start of buffer is found
2843 		    // correctly.
2844 		    first_match_pos.lnum = ins_buf->b_ml.ml_line_count;
2845 		    first_match_pos.col =
2846 				 (colnr_T)STRLEN(ml_get(first_match_pos.lnum));
2847 		}
2848 		last_match_pos = first_match_pos;
2849 		type = 0;
2850 
2851 		// Remember the first match so that the loop stops when we
2852 		// wrap and come back there a second time.
2853 		set_match_pos = TRUE;
2854 	    }
2855 	    else if (vim_strchr((char_u *)"buwU", *e_cpt) != NULL
2856 		 && (ins_buf = ins_compl_next_buf(ins_buf, *e_cpt)) != curbuf)
2857 	    {
2858 		// Scan a buffer, but not the current one.
2859 		if (ins_buf->b_ml.ml_mfp != NULL)   // loaded buffer
2860 		{
2861 		    compl_started = TRUE;
2862 		    first_match_pos.col = last_match_pos.col = 0;
2863 		    first_match_pos.lnum = ins_buf->b_ml.ml_line_count + 1;
2864 		    last_match_pos.lnum = 0;
2865 		    type = 0;
2866 		}
2867 		else	// unloaded buffer, scan like dictionary
2868 		{
2869 		    found_all = TRUE;
2870 		    if (ins_buf->b_fname == NULL)
2871 			continue;
2872 		    type = CTRL_X_DICTIONARY;
2873 		    dict = ins_buf->b_fname;
2874 		    dict_f = DICT_EXACT;
2875 		}
2876 		msg_hist_off = TRUE;	// reset in msg_trunc_attr()
2877 		vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"),
2878 			ins_buf->b_fname == NULL
2879 			    ? buf_spname(ins_buf)
2880 			    : ins_buf->b_sfname == NULL
2881 				? ins_buf->b_fname
2882 				: ins_buf->b_sfname);
2883 		(void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R));
2884 	    }
2885 	    else if (*e_cpt == NUL)
2886 		break;
2887 	    else
2888 	    {
2889 		if (ctrl_x_mode_line_or_eval())
2890 		    type = -1;
2891 		else if (*e_cpt == 'k' || *e_cpt == 's')
2892 		{
2893 		    if (*e_cpt == 'k')
2894 			type = CTRL_X_DICTIONARY;
2895 		    else
2896 			type = CTRL_X_THESAURUS;
2897 		    if (*++e_cpt != ',' && *e_cpt != NUL)
2898 		    {
2899 			dict = e_cpt;
2900 			dict_f = DICT_FIRST;
2901 		    }
2902 		}
2903 #ifdef FEAT_FIND_ID
2904 		else if (*e_cpt == 'i')
2905 		    type = CTRL_X_PATH_PATTERNS;
2906 		else if (*e_cpt == 'd')
2907 		    type = CTRL_X_PATH_DEFINES;
2908 #endif
2909 		else if (*e_cpt == ']' || *e_cpt == 't')
2910 		{
2911 		    msg_hist_off = TRUE;	// reset in msg_trunc_attr()
2912 		    type = CTRL_X_TAGS;
2913 		    vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
2914 		    (void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R));
2915 		}
2916 		else
2917 		    type = -1;
2918 
2919 		// in any case e_cpt is advanced to the next entry
2920 		(void)copy_option_part(&e_cpt, IObuff, IOSIZE, ",");
2921 
2922 		found_all = TRUE;
2923 		if (type == -1)
2924 		    continue;
2925 	    }
2926 	}
2927 
2928 	// If complete() was called then compl_pattern has been reset.  The
2929 	// following won't work then, bail out.
2930 	if (compl_pattern == NULL)
2931 	    break;
2932 
2933 	switch (type)
2934 	{
2935 	case -1:
2936 	    break;
2937 #ifdef FEAT_FIND_ID
2938 	case CTRL_X_PATH_PATTERNS:
2939 	case CTRL_X_PATH_DEFINES:
2940 	    find_pattern_in_path(compl_pattern, compl_direction,
2941 				 (int)STRLEN(compl_pattern), FALSE, FALSE,
2942 				 (type == CTRL_X_PATH_DEFINES
2943 				  && !(compl_cont_status & CONT_SOL))
2944 				 ? FIND_DEFINE : FIND_ANY, 1L, ACTION_EXPAND,
2945 				 (linenr_T)1, (linenr_T)MAXLNUM);
2946 	    break;
2947 #endif
2948 
2949 	case CTRL_X_DICTIONARY:
2950 	case CTRL_X_THESAURUS:
2951 #ifdef FEAT_COMPL_FUNC
2952 	    if (thesaurus_func_complete(type))
2953 		expand_by_function(type, compl_pattern);
2954 	    else
2955 #endif
2956 		ins_compl_dictionaries(
2957 		    dict != NULL ? dict
2958 			 : (type == CTRL_X_THESAURUS
2959 			     ? (*curbuf->b_p_tsr == NUL
2960 				 ? p_tsr
2961 				 : curbuf->b_p_tsr)
2962 			     : (*curbuf->b_p_dict == NUL
2963 				 ? p_dict
2964 				 : curbuf->b_p_dict)),
2965 			    compl_pattern,
2966 				 dict != NULL ? dict_f
2967 					       : 0, type == CTRL_X_THESAURUS);
2968 	    dict = NULL;
2969 	    break;
2970 
2971 	case CTRL_X_TAGS:
2972 	    // set p_ic according to p_ic, p_scs and pat for find_tags().
2973 	    save_p_ic = p_ic;
2974 	    p_ic = ignorecase(compl_pattern);
2975 
2976 	    // Find up to TAG_MANY matches.  Avoids that an enormous number
2977 	    // of matches is found when compl_pattern is empty
2978 	    g_tag_at_cursor = TRUE;
2979 	    if (find_tags(compl_pattern, &num_matches, &matches,
2980 		    TAG_REGEXP | TAG_NAMES | TAG_NOIC | TAG_INS_COMP
2981 		    | (ctrl_x_mode != CTRL_X_NORMAL ? TAG_VERBOSE : 0),
2982 		    TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0)
2983 		ins_compl_add_matches(num_matches, matches, p_ic);
2984 	    g_tag_at_cursor = FALSE;
2985 	    p_ic = save_p_ic;
2986 	    break;
2987 
2988 	case CTRL_X_FILES:
2989 	    if (expand_wildcards(1, &compl_pattern, &num_matches, &matches,
2990 				  EW_FILE|EW_DIR|EW_ADDSLASH|EW_SILENT) == OK)
2991 	    {
2992 
2993 		// May change home directory back to "~".
2994 		tilde_replace(compl_pattern, num_matches, matches);
2995 #ifdef BACKSLASH_IN_FILENAME
2996 		if (curbuf->b_p_csl[0] != NUL)
2997 		{
2998 		    int	    i;
2999 
3000 		    for (i = 0; i < num_matches; ++i)
3001 		    {
3002 			char_u	*ptr = matches[i];
3003 
3004 			while (*ptr != NUL)
3005 			{
3006 			    if (curbuf->b_p_csl[0] == 's' && *ptr == '\\')
3007 				*ptr = '/';
3008 			    else if (curbuf->b_p_csl[0] == 'b' && *ptr == '/')
3009 				*ptr = '\\';
3010 			    ptr += (*mb_ptr2len)(ptr);
3011 			}
3012 		    }
3013 		}
3014 #endif
3015 		ins_compl_add_matches(num_matches, matches, p_fic || p_wic);
3016 	    }
3017 	    break;
3018 
3019 	case CTRL_X_CMDLINE:
3020 	case CTRL_X_CMDLINE_CTRL_X:
3021 	    if (expand_cmdline(&compl_xp, compl_pattern,
3022 			(int)STRLEN(compl_pattern),
3023 					 &num_matches, &matches) == EXPAND_OK)
3024 		ins_compl_add_matches(num_matches, matches, FALSE);
3025 	    break;
3026 
3027 #ifdef FEAT_COMPL_FUNC
3028 	case CTRL_X_FUNCTION:
3029 	case CTRL_X_OMNI:
3030 	    expand_by_function(type, compl_pattern);
3031 	    break;
3032 #endif
3033 
3034 	case CTRL_X_SPELL:
3035 #ifdef FEAT_SPELL
3036 	    num_matches = expand_spelling(first_match_pos.lnum,
3037 						     compl_pattern, &matches);
3038 	    if (num_matches > 0)
3039 		ins_compl_add_matches(num_matches, matches, p_ic);
3040 #endif
3041 	    break;
3042 
3043 	default:	// normal ^P/^N and ^X^L
3044 	    // If 'infercase' is set, don't use 'smartcase' here
3045 	    save_p_scs = p_scs;
3046 	    if (ins_buf->b_p_inf)
3047 		p_scs = FALSE;
3048 
3049 	    //	Buffers other than curbuf are scanned from the beginning or the
3050 	    //	end but never from the middle, thus setting nowrapscan in this
3051 	    //	buffer is a good idea, on the other hand, we always set
3052 	    //	wrapscan for curbuf to avoid missing matches -- Acevedo,Webb
3053 	    save_p_ws = p_ws;
3054 	    if (ins_buf != curbuf)
3055 		p_ws = FALSE;
3056 	    else if (*e_cpt == '.')
3057 		p_ws = TRUE;
3058 	    looped_around = FALSE;
3059 	    for (;;)
3060 	    {
3061 		int	cont_s_ipos = FALSE;
3062 
3063 		++msg_silent;  // Don't want messages for wrapscan.
3064 
3065 		// ctrl_x_mode_line_or_eval() || word-wise search that
3066 		// has added a word that was at the beginning of the line
3067 		if (ctrl_x_mode_line_or_eval()
3068 			|| (compl_cont_status & CONT_SOL))
3069 		    found_new_match = search_for_exact_line(ins_buf, pos,
3070 					      compl_direction, compl_pattern);
3071 		else
3072 		    found_new_match = searchit(NULL, ins_buf, pos, NULL,
3073 							      compl_direction,
3074 				 compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
3075 								RE_LAST, NULL);
3076 		--msg_silent;
3077 		if (!compl_started || set_match_pos)
3078 		{
3079 		    // set "compl_started" even on fail
3080 		    compl_started = TRUE;
3081 		    first_match_pos = *pos;
3082 		    last_match_pos = *pos;
3083 		    set_match_pos = FALSE;
3084 		}
3085 		else if (first_match_pos.lnum == last_match_pos.lnum
3086                                 && first_match_pos.col == last_match_pos.col)
3087 		{
3088 		    found_new_match = FAIL;
3089 		}
3090 		else if ((compl_direction == FORWARD)
3091 			&& (prev_pos.lnum > pos->lnum
3092 			    || (prev_pos.lnum == pos->lnum
3093 				&& prev_pos.col >= pos->col)))
3094 		{
3095 		    if (looped_around)
3096 			found_new_match = FAIL;
3097 		    else
3098 			looped_around = TRUE;
3099 		}
3100 		else if ((compl_direction != FORWARD)
3101 			&& (prev_pos.lnum < pos->lnum
3102 			    || (prev_pos.lnum == pos->lnum
3103 				&& prev_pos.col <= pos->col)))
3104 		{
3105 		    if (looped_around)
3106 			found_new_match = FAIL;
3107 		    else
3108 			looped_around = TRUE;
3109 		}
3110 		prev_pos = *pos;
3111 		if (found_new_match == FAIL)
3112 		{
3113 		    if (ins_buf == curbuf)
3114 			found_all = TRUE;
3115 		    break;
3116 		}
3117 
3118 		// when ADDING, the text before the cursor matches, skip it
3119 		if (	(compl_cont_status & CONT_ADDING) && ins_buf == curbuf
3120 			&& ini->lnum == pos->lnum
3121 			&& ini->col  == pos->col)
3122 		    continue;
3123 		ptr = ml_get_buf(ins_buf, pos->lnum, FALSE) + pos->col;
3124 		if (ctrl_x_mode_line_or_eval())
3125 		{
3126 		    if (compl_cont_status & CONT_ADDING)
3127 		    {
3128 			if (pos->lnum >= ins_buf->b_ml.ml_line_count)
3129 			    continue;
3130 			ptr = ml_get_buf(ins_buf, pos->lnum + 1, FALSE);
3131 			if (!p_paste)
3132 			    ptr = skipwhite(ptr);
3133 		    }
3134 		    len = (int)STRLEN(ptr);
3135 		}
3136 		else
3137 		{
3138 		    char_u	*tmp_ptr = ptr;
3139 
3140 		    if (compl_cont_status & CONT_ADDING)
3141 		    {
3142 			tmp_ptr += compl_length;
3143 			// Skip if already inside a word.
3144 			if (vim_iswordp(tmp_ptr))
3145 			    continue;
3146 			// Find start of next word.
3147 			tmp_ptr = find_word_start(tmp_ptr);
3148 		    }
3149 		    // Find end of this word.
3150 		    tmp_ptr = find_word_end(tmp_ptr);
3151 		    len = (int)(tmp_ptr - ptr);
3152 
3153 		    if ((compl_cont_status & CONT_ADDING)
3154 						       && len == compl_length)
3155 		    {
3156 			if (pos->lnum < ins_buf->b_ml.ml_line_count)
3157 			{
3158 			    // Try next line, if any. the new word will be
3159 			    // "join" as if the normal command "J" was used.
3160 			    // IOSIZE is always greater than
3161 			    // compl_length, so the next STRNCPY always
3162 			    // works -- Acevedo
3163 			    STRNCPY(IObuff, ptr, len);
3164 			    ptr = ml_get_buf(ins_buf, pos->lnum + 1, FALSE);
3165 			    tmp_ptr = ptr = skipwhite(ptr);
3166 			    // Find start of next word.
3167 			    tmp_ptr = find_word_start(tmp_ptr);
3168 			    // Find end of next word.
3169 			    tmp_ptr = find_word_end(tmp_ptr);
3170 			    if (tmp_ptr > ptr)
3171 			    {
3172 				if (*ptr != ')' && IObuff[len - 1] != TAB)
3173 				{
3174 				    if (IObuff[len - 1] != ' ')
3175 					IObuff[len++] = ' ';
3176 				    // IObuf =~ "\k.* ", thus len >= 2
3177 				    if (p_js
3178 					&& (IObuff[len - 2] == '.'
3179 					    || (vim_strchr(p_cpo, CPO_JOINSP)
3180 								       == NULL
3181 						&& (IObuff[len - 2] == '?'
3182 						 || IObuff[len - 2] == '!'))))
3183 					IObuff[len++] = ' ';
3184 				}
3185 				// copy as much as possible of the new word
3186 				if (tmp_ptr - ptr >= IOSIZE - len)
3187 				    tmp_ptr = ptr + IOSIZE - len - 1;
3188 				STRNCPY(IObuff + len, ptr, tmp_ptr - ptr);
3189 				len += (int)(tmp_ptr - ptr);
3190 				cont_s_ipos = TRUE;
3191 			    }
3192 			    IObuff[len] = NUL;
3193 			    ptr = IObuff;
3194 			}
3195 			if (len == compl_length)
3196 			    continue;
3197 		    }
3198 		}
3199 		if (ins_compl_add_infercase(ptr, len, p_ic,
3200 				 ins_buf == curbuf ? NULL : ins_buf->b_sfname,
3201 					   0, cont_s_ipos) != NOTDONE)
3202 		{
3203 		    found_new_match = OK;
3204 		    break;
3205 		}
3206 	    }
3207 	    p_scs = save_p_scs;
3208 	    p_ws = save_p_ws;
3209 	}
3210 
3211 	// check if compl_curr_match has changed, (e.g. other type of
3212 	// expansion added something)
3213 	if (type != 0 && compl_curr_match != compl_old_match)
3214 	    found_new_match = OK;
3215 
3216 	// break the loop for specialized modes (use 'complete' just for the
3217 	// generic ctrl_x_mode == CTRL_X_NORMAL) or when we've found a new
3218 	// match
3219 	if ((ctrl_x_mode != CTRL_X_NORMAL
3220 		    && !ctrl_x_mode_line_or_eval()) || found_new_match != FAIL)
3221 	{
3222 	    if (got_int)
3223 		break;
3224 	    // Fill the popup menu as soon as possible.
3225 	    if (type != -1)
3226 		ins_compl_check_keys(0, FALSE);
3227 
3228 	    if ((ctrl_x_mode != CTRL_X_NORMAL
3229 			&& !ctrl_x_mode_line_or_eval()) || compl_interrupted)
3230 		break;
3231 	    compl_started = TRUE;
3232 	}
3233 	else
3234 	{
3235 	    // Mark a buffer scanned when it has been scanned completely
3236 	    if (type == 0 || type == CTRL_X_PATH_PATTERNS)
3237 		ins_buf->b_scanned = TRUE;
3238 
3239 	    compl_started = FALSE;
3240 	}
3241     }
3242     compl_started = TRUE;
3243 
3244     if ((ctrl_x_mode == CTRL_X_NORMAL || ctrl_x_mode_line_or_eval())
3245 	    && *e_cpt == NUL)		// Got to end of 'complete'
3246 	found_new_match = FAIL;
3247 
3248     i = -1;		// total of matches, unknown
3249     if (found_new_match == FAIL || (ctrl_x_mode != CTRL_X_NORMAL
3250 					       && !ctrl_x_mode_line_or_eval()))
3251 	i = ins_compl_make_cyclic();
3252 
3253     if (compl_old_match != NULL)
3254     {
3255 	// If several matches were added (FORWARD) or the search failed and has
3256 	// just been made cyclic then we have to move compl_curr_match to the
3257 	// next or previous entry (if any) -- Acevedo
3258 	compl_curr_match = compl_direction == FORWARD ? compl_old_match->cp_next
3259 						    : compl_old_match->cp_prev;
3260 	if (compl_curr_match == NULL)
3261 	    compl_curr_match = compl_old_match;
3262     }
3263     trigger_modechanged();
3264 
3265     return i;
3266 }
3267 
3268 /*
3269  * Delete the old text being completed.
3270  */
3271     void
ins_compl_delete(void)3272 ins_compl_delete(void)
3273 {
3274     int	    col;
3275 
3276     // In insert mode: Delete the typed part.
3277     // In replace mode: Put the old characters back, if any.
3278     col = compl_col + (compl_cont_status & CONT_ADDING ? compl_length : 0);
3279     if ((int)curwin->w_cursor.col > col)
3280     {
3281 	if (stop_arrow() == FAIL)
3282 	    return;
3283 	backspace_until_column(col);
3284     }
3285 
3286     // TODO: is this sufficient for redrawing?  Redrawing everything causes
3287     // flicker, thus we can't do that.
3288     changed_cline_bef_curs();
3289 #ifdef FEAT_EVAL
3290     // clear v:completed_item
3291     set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc_lock(VAR_FIXED));
3292 #endif
3293 }
3294 
3295 /*
3296  * Insert the new text being completed.
3297  * "in_compl_func" is TRUE when called from complete_check().
3298  */
3299     void
ins_compl_insert(int in_compl_func)3300 ins_compl_insert(int in_compl_func)
3301 {
3302     ins_bytes(compl_shown_match->cp_str + ins_compl_len());
3303     if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT)
3304 	compl_used_match = FALSE;
3305     else
3306 	compl_used_match = TRUE;
3307 #ifdef FEAT_EVAL
3308     {
3309 	dict_T *dict = ins_compl_dict_alloc(compl_shown_match);
3310 
3311 	set_vim_var_dict(VV_COMPLETED_ITEM, dict);
3312     }
3313 #endif
3314     if (!in_compl_func)
3315 	compl_curr_match = compl_shown_match;
3316 }
3317 
3318 /*
3319  * Fill in the next completion in the current direction.
3320  * If "allow_get_expansion" is TRUE, then we may call ins_compl_get_exp() to
3321  * get more completions.  If it is FALSE, then we just do nothing when there
3322  * are no more completions in a given direction.  The latter case is used when
3323  * we are still in the middle of finding completions, to allow browsing
3324  * through the ones found so far.
3325  * Return the total number of matches, or -1 if still unknown -- webb.
3326  *
3327  * compl_curr_match is currently being used by ins_compl_get_exp(), so we use
3328  * compl_shown_match here.
3329  *
3330  * Note that this function may be called recursively once only.  First with
3331  * "allow_get_expansion" TRUE, which calls ins_compl_get_exp(), which in turn
3332  * calls this function with "allow_get_expansion" FALSE.
3333  */
3334     static int
ins_compl_next(int allow_get_expansion,int count,int insert_match,int in_compl_func)3335 ins_compl_next(
3336     int	    allow_get_expansion,
3337     int	    count,		// repeat completion this many times; should
3338 				// be at least 1
3339     int	    insert_match,	// Insert the newly selected match
3340     int	    in_compl_func)	// called from complete_check()
3341 {
3342     int	    num_matches = -1;
3343     int	    todo = count;
3344     compl_T *found_compl = NULL;
3345     int	    found_end = FALSE;
3346     int	    advance;
3347     int	    started = compl_started;
3348 
3349     // When user complete function return -1 for findstart which is next
3350     // time of 'always', compl_shown_match become NULL.
3351     if (compl_shown_match == NULL)
3352 	return -1;
3353 
3354     if (compl_leader != NULL
3355 		      && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0)
3356     {
3357 	// Set "compl_shown_match" to the actually shown match, it may differ
3358 	// when "compl_leader" is used to omit some of the matches.
3359 	while (!ins_compl_equal(compl_shown_match,
3360 				      compl_leader, (int)STRLEN(compl_leader))
3361 		&& compl_shown_match->cp_next != NULL
3362 		&& compl_shown_match->cp_next != compl_first_match)
3363 	    compl_shown_match = compl_shown_match->cp_next;
3364 
3365 	// If we didn't find it searching forward, and compl_shows_dir is
3366 	// backward, find the last match.
3367 	if (compl_shows_dir == BACKWARD
3368 		&& !ins_compl_equal(compl_shown_match,
3369 				      compl_leader, (int)STRLEN(compl_leader))
3370 		&& (compl_shown_match->cp_next == NULL
3371 		    || compl_shown_match->cp_next == compl_first_match))
3372 	{
3373 	    while (!ins_compl_equal(compl_shown_match,
3374 				      compl_leader, (int)STRLEN(compl_leader))
3375 		    && compl_shown_match->cp_prev != NULL
3376 		    && compl_shown_match->cp_prev != compl_first_match)
3377 		compl_shown_match = compl_shown_match->cp_prev;
3378 	}
3379     }
3380 
3381     if (allow_get_expansion && insert_match
3382 	    && (!(compl_get_longest || compl_restarting) || compl_used_match))
3383 	// Delete old text to be replaced
3384 	ins_compl_delete();
3385 
3386     // When finding the longest common text we stick at the original text,
3387     // don't let CTRL-N or CTRL-P move to the first match.
3388     advance = count != 1 || !allow_get_expansion || !compl_get_longest;
3389 
3390     // When restarting the search don't insert the first match either.
3391     if (compl_restarting)
3392     {
3393 	advance = FALSE;
3394 	compl_restarting = FALSE;
3395     }
3396 
3397     // Repeat this for when <PageUp> or <PageDown> is typed.  But don't wrap
3398     // around.
3399     while (--todo >= 0)
3400     {
3401 	if (compl_shows_dir == FORWARD && compl_shown_match->cp_next != NULL)
3402 	{
3403 	    compl_shown_match = compl_shown_match->cp_next;
3404 	    found_end = (compl_first_match != NULL
3405 			   && (compl_shown_match->cp_next == compl_first_match
3406 			       || compl_shown_match == compl_first_match));
3407 	}
3408 	else if (compl_shows_dir == BACKWARD
3409 					&& compl_shown_match->cp_prev != NULL)
3410 	{
3411 	    found_end = (compl_shown_match == compl_first_match);
3412 	    compl_shown_match = compl_shown_match->cp_prev;
3413 	    found_end |= (compl_shown_match == compl_first_match);
3414 	}
3415 	else
3416 	{
3417 	    if (!allow_get_expansion)
3418 	    {
3419 		if (advance)
3420 		{
3421 		    if (compl_shows_dir == BACKWARD)
3422 			compl_pending -= todo + 1;
3423 		    else
3424 			compl_pending += todo + 1;
3425 		}
3426 		return -1;
3427 	    }
3428 
3429 	    if (!compl_no_select && advance)
3430 	    {
3431 		if (compl_shows_dir == BACKWARD)
3432 		    --compl_pending;
3433 		else
3434 		    ++compl_pending;
3435 	    }
3436 
3437 	    // Find matches.
3438 	    num_matches = ins_compl_get_exp(&compl_startpos);
3439 
3440 	    // handle any pending completions
3441 	    while (compl_pending != 0 && compl_direction == compl_shows_dir
3442 								   && advance)
3443 	    {
3444 		if (compl_pending > 0 && compl_shown_match->cp_next != NULL)
3445 		{
3446 		    compl_shown_match = compl_shown_match->cp_next;
3447 		    --compl_pending;
3448 		}
3449 		if (compl_pending < 0 && compl_shown_match->cp_prev != NULL)
3450 		{
3451 		    compl_shown_match = compl_shown_match->cp_prev;
3452 		    ++compl_pending;
3453 		}
3454 		else
3455 		    break;
3456 	    }
3457 	    found_end = FALSE;
3458 	}
3459 	if ((compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0
3460 		&& compl_leader != NULL
3461 		&& !ins_compl_equal(compl_shown_match,
3462 				     compl_leader, (int)STRLEN(compl_leader)))
3463 	    ++todo;
3464 	else
3465 	    // Remember a matching item.
3466 	    found_compl = compl_shown_match;
3467 
3468 	// Stop at the end of the list when we found a usable match.
3469 	if (found_end)
3470 	{
3471 	    if (found_compl != NULL)
3472 	    {
3473 		compl_shown_match = found_compl;
3474 		break;
3475 	    }
3476 	    todo = 1;	    // use first usable match after wrapping around
3477 	}
3478     }
3479 
3480     // Insert the text of the new completion, or the compl_leader.
3481     if (compl_no_insert && !started)
3482     {
3483 	ins_bytes(compl_orig_text + ins_compl_len());
3484 	compl_used_match = FALSE;
3485     }
3486     else if (insert_match)
3487     {
3488 	if (!compl_get_longest || compl_used_match)
3489 	    ins_compl_insert(in_compl_func);
3490 	else
3491 	    ins_bytes(compl_leader + ins_compl_len());
3492     }
3493     else
3494 	compl_used_match = FALSE;
3495 
3496     if (!allow_get_expansion)
3497     {
3498 	// may undisplay the popup menu first
3499 	ins_compl_upd_pum();
3500 
3501 	if (pum_enough_matches())
3502 	    // Will display the popup menu, don't redraw yet to avoid flicker.
3503 	    pum_call_update_screen();
3504 	else
3505 	    // Not showing the popup menu yet, redraw to show the user what was
3506 	    // inserted.
3507 	    update_screen(0);
3508 
3509 	// display the updated popup menu
3510 	ins_compl_show_pum();
3511 #ifdef FEAT_GUI
3512 	if (gui.in_use)
3513 	{
3514 	    // Show the cursor after the match, not after the redrawn text.
3515 	    setcursor();
3516 	    out_flush_cursor(FALSE, FALSE);
3517 	}
3518 #endif
3519 
3520 	// Delete old text to be replaced, since we're still searching and
3521 	// don't want to match ourselves!
3522 	ins_compl_delete();
3523     }
3524 
3525     // Enter will select a match when the match wasn't inserted and the popup
3526     // menu is visible.
3527     if (compl_no_insert && !started)
3528 	compl_enter_selects = TRUE;
3529     else
3530 	compl_enter_selects = !insert_match && compl_match_array != NULL;
3531 
3532     // Show the file name for the match (if any)
3533     // Truncate the file name to avoid a wait for return.
3534     if (compl_shown_match->cp_fname != NULL)
3535     {
3536 	char	*lead = _("match in file");
3537 	int	space = sc_col - vim_strsize((char_u *)lead) - 2;
3538 	char_u	*s;
3539 	char_u	*e;
3540 
3541 	if (space > 0)
3542 	{
3543 	    // We need the tail that fits.  With double-byte encoding going
3544 	    // back from the end is very slow, thus go from the start and keep
3545 	    // the text that fits in "space" between "s" and "e".
3546 	    for (s = e = compl_shown_match->cp_fname; *e != NUL; MB_PTR_ADV(e))
3547 	    {
3548 		space -= ptr2cells(e);
3549 		while (space < 0)
3550 		{
3551 		    space += ptr2cells(s);
3552 		    MB_PTR_ADV(s);
3553 		}
3554 	    }
3555 	    msg_hist_off = TRUE;
3556 	    vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead,
3557 				s > compl_shown_match->cp_fname ? "<" : "", s);
3558 	    msg((char *)IObuff);
3559 	    msg_hist_off = FALSE;
3560 	    redraw_cmdline = FALSE;	    // don't overwrite!
3561 	}
3562     }
3563 
3564     return num_matches;
3565 }
3566 
3567 /*
3568  * Call this while finding completions, to check whether the user has hit a key
3569  * that should change the currently displayed completion, or exit completion
3570  * mode.  Also, when compl_pending is not zero, show a completion as soon as
3571  * possible. -- webb
3572  * "frequency" specifies out of how many calls we actually check.
3573  * "in_compl_func" is TRUE when called from complete_check(), don't set
3574  * compl_curr_match.
3575  */
3576     void
ins_compl_check_keys(int frequency,int in_compl_func)3577 ins_compl_check_keys(int frequency, int in_compl_func)
3578 {
3579     static int	count = 0;
3580     int		c;
3581 
3582     // Don't check when reading keys from a script, :normal or feedkeys().
3583     // That would break the test scripts.  But do check for keys when called
3584     // from complete_check().
3585     if (!in_compl_func && (using_script() || ex_normal_busy))
3586 	return;
3587 
3588     // Only do this at regular intervals
3589     if (++count < frequency)
3590 	return;
3591     count = 0;
3592 
3593     // Check for a typed key.  Do use mappings, otherwise vim_is_ctrl_x_key()
3594     // can't do its work correctly.
3595     c = vpeekc_any();
3596     if (c != NUL)
3597     {
3598 	if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R)
3599 	{
3600 	    c = safe_vgetc();	// Eat the character
3601 	    compl_shows_dir = ins_compl_key2dir(c);
3602 	    (void)ins_compl_next(FALSE, ins_compl_key2count(c),
3603 				      c != K_UP && c != K_DOWN, in_compl_func);
3604 	}
3605 	else
3606 	{
3607 	    // Need to get the character to have KeyTyped set.  We'll put it
3608 	    // back with vungetc() below.  But skip K_IGNORE.
3609 	    c = safe_vgetc();
3610 	    if (c != K_IGNORE)
3611 	    {
3612 		// Don't interrupt completion when the character wasn't typed,
3613 		// e.g., when doing @q to replay keys.
3614 		if (c != Ctrl_R && KeyTyped)
3615 		    compl_interrupted = TRUE;
3616 
3617 		vungetc(c);
3618 	    }
3619 	}
3620     }
3621     if (compl_pending != 0 && !got_int && !compl_no_insert)
3622     {
3623 	int todo = compl_pending > 0 ? compl_pending : -compl_pending;
3624 
3625 	compl_pending = 0;
3626 	(void)ins_compl_next(FALSE, todo, TRUE, in_compl_func);
3627     }
3628 }
3629 
3630 /*
3631  * Decide the direction of Insert mode complete from the key typed.
3632  * Returns BACKWARD or FORWARD.
3633  */
3634     static int
ins_compl_key2dir(int c)3635 ins_compl_key2dir(int c)
3636 {
3637     if (c == Ctrl_P || c == Ctrl_L
3638 	    || c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP || c == K_UP)
3639 	return BACKWARD;
3640     return FORWARD;
3641 }
3642 
3643 /*
3644  * Return TRUE for keys that are used for completion only when the popup menu
3645  * is visible.
3646  */
3647     static int
ins_compl_pum_key(int c)3648 ins_compl_pum_key(int c)
3649 {
3650     return pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
3651 		     || c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN
3652 		     || c == K_UP || c == K_DOWN);
3653 }
3654 
3655 /*
3656  * Decide the number of completions to move forward.
3657  * Returns 1 for most keys, height of the popup menu for page-up/down keys.
3658  */
3659     static int
ins_compl_key2count(int c)3660 ins_compl_key2count(int c)
3661 {
3662     int		h;
3663 
3664     if (ins_compl_pum_key(c) && c != K_UP && c != K_DOWN)
3665     {
3666 	h = pum_get_height();
3667 	if (h > 3)
3668 	    h -= 2; // keep some context
3669 	return h;
3670     }
3671     return 1;
3672 }
3673 
3674 /*
3675  * Return TRUE if completion with "c" should insert the match, FALSE if only
3676  * to change the currently selected completion.
3677  */
3678     static int
ins_compl_use_match(int c)3679 ins_compl_use_match(int c)
3680 {
3681     switch (c)
3682     {
3683 	case K_UP:
3684 	case K_DOWN:
3685 	case K_PAGEDOWN:
3686 	case K_KPAGEDOWN:
3687 	case K_S_DOWN:
3688 	case K_PAGEUP:
3689 	case K_KPAGEUP:
3690 	case K_S_UP:
3691 	    return FALSE;
3692     }
3693     return TRUE;
3694 }
3695 
3696 /*
3697  * Do Insert mode completion.
3698  * Called when character "c" was typed, which has a meaning for completion.
3699  * Returns OK if completion was done, FAIL if something failed (out of mem).
3700  */
3701     int
ins_complete(int c,int enable_pum)3702 ins_complete(int c, int enable_pum)
3703 {
3704     char_u	*line;
3705     int		startcol = 0;	    // column where searched text starts
3706     colnr_T	curs_col;	    // cursor column
3707     int		n;
3708     int		save_w_wrow;
3709     int		save_w_leftcol;
3710     int		insert_match;
3711 #ifdef FEAT_COMPL_FUNC
3712     int		save_did_ai = did_ai;
3713 #endif
3714     int		flags = CP_ORIGINAL_TEXT;
3715 
3716     compl_direction = ins_compl_key2dir(c);
3717     insert_match = ins_compl_use_match(c);
3718 
3719     if (!compl_started)
3720     {
3721 	// First time we hit ^N or ^P (in a row, I mean)
3722 
3723 	did_ai = FALSE;
3724 #ifdef FEAT_SMARTINDENT
3725 	did_si = FALSE;
3726 	can_si = FALSE;
3727 	can_si_back = FALSE;
3728 #endif
3729 	if (stop_arrow() == FAIL)
3730 	    return FAIL;
3731 
3732 	line = ml_get(curwin->w_cursor.lnum);
3733 	curs_col = curwin->w_cursor.col;
3734 	compl_pending = 0;
3735 
3736 	// If this same ctrl_x_mode has been interrupted use the text from
3737 	// "compl_startpos" to the cursor as a pattern to add a new word
3738 	// instead of expand the one before the cursor, in word-wise if
3739 	// "compl_startpos" is not in the same line as the cursor then fix it
3740 	// (the line has been split because it was longer than 'tw').  if SOL
3741 	// is set then skip the previous pattern, a word at the beginning of
3742 	// the line has been inserted, we'll look for that  -- Acevedo.
3743 	if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT
3744 					    && compl_cont_mode == ctrl_x_mode)
3745 	{
3746 	    // it is a continued search
3747 	    compl_cont_status &= ~CONT_INTRPT;	// remove INTRPT
3748 	    if (ctrl_x_mode == CTRL_X_NORMAL
3749 		    || ctrl_x_mode == CTRL_X_PATH_PATTERNS
3750 		    || ctrl_x_mode == CTRL_X_PATH_DEFINES)
3751 	    {
3752 		if (compl_startpos.lnum != curwin->w_cursor.lnum)
3753 		{
3754 		    // line (probably) wrapped, set compl_startpos to the
3755 		    // first non_blank in the line, if it is not a wordchar
3756 		    // include it to get a better pattern, but then we don't
3757 		    // want the "\\<" prefix, check it below
3758 		    compl_col = (colnr_T)getwhitecols(line);
3759 		    compl_startpos.col = compl_col;
3760 		    compl_startpos.lnum = curwin->w_cursor.lnum;
3761 		    compl_cont_status &= ~CONT_SOL;   // clear SOL if present
3762 		}
3763 		else
3764 		{
3765 		    // S_IPOS was set when we inserted a word that was at the
3766 		    // beginning of the line, which means that we'll go to SOL
3767 		    // mode but first we need to redefine compl_startpos
3768 		    if (compl_cont_status & CONT_S_IPOS)
3769 		    {
3770 			compl_cont_status |= CONT_SOL;
3771 			compl_startpos.col = (colnr_T)(skipwhite(
3772 						line + compl_length
3773 						+ compl_startpos.col) - line);
3774 		    }
3775 		    compl_col = compl_startpos.col;
3776 		}
3777 		compl_length = curwin->w_cursor.col - (int)compl_col;
3778 		// IObuff is used to add a "word from the next line" would we
3779 		// have enough space?  just being paranoid
3780 #define	MIN_SPACE 75
3781 		if (compl_length > (IOSIZE - MIN_SPACE))
3782 		{
3783 		    compl_cont_status &= ~CONT_SOL;
3784 		    compl_length = (IOSIZE - MIN_SPACE);
3785 		    compl_col = curwin->w_cursor.col - compl_length;
3786 		}
3787 		compl_cont_status |= CONT_ADDING | CONT_N_ADDS;
3788 		if (compl_length < 1)
3789 		    compl_cont_status &= CONT_LOCAL;
3790 	    }
3791 	    else if (ctrl_x_mode_line_or_eval())
3792 		compl_cont_status = CONT_ADDING | CONT_N_ADDS;
3793 	    else
3794 		compl_cont_status = 0;
3795 	}
3796 	else
3797 	    compl_cont_status &= CONT_LOCAL;
3798 
3799 	if (!(compl_cont_status & CONT_ADDING))	// normal expansion
3800 	{
3801 	    compl_cont_mode = ctrl_x_mode;
3802 	    if (ctrl_x_mode != CTRL_X_NORMAL)
3803 		// Remove LOCAL if ctrl_x_mode != CTRL_X_NORMAL
3804 		compl_cont_status = 0;
3805 	    compl_cont_status |= CONT_N_ADDS;
3806 	    compl_startpos = curwin->w_cursor;
3807 	    startcol = (int)curs_col;
3808 	    compl_col = 0;
3809 	}
3810 
3811 	// Work out completion pattern and original text -- webb
3812 	if (ctrl_x_mode == CTRL_X_NORMAL
3813 		|| (ctrl_x_mode & CTRL_X_WANT_IDENT
3814 		    && !thesaurus_func_complete(ctrl_x_mode)))
3815 	{
3816 	    if ((compl_cont_status & CONT_SOL)
3817 		    || ctrl_x_mode == CTRL_X_PATH_DEFINES)
3818 	    {
3819 		if (!(compl_cont_status & CONT_ADDING))
3820 		{
3821 		    while (--startcol >= 0 && vim_isIDc(line[startcol]))
3822 			;
3823 		    compl_col += ++startcol;
3824 		    compl_length = curs_col - startcol;
3825 		}
3826 		if (p_ic)
3827 		    compl_pattern = str_foldcase(line + compl_col,
3828 						       compl_length, NULL, 0);
3829 		else
3830 		    compl_pattern = vim_strnsave(line + compl_col,
3831 								compl_length);
3832 		if (compl_pattern == NULL)
3833 		    return FAIL;
3834 	    }
3835 	    else if (compl_cont_status & CONT_ADDING)
3836 	    {
3837 		char_u	    *prefix = (char_u *)"\\<";
3838 
3839 		// we need up to 2 extra chars for the prefix
3840 		compl_pattern = alloc(quote_meta(NULL, line + compl_col,
3841 							   compl_length) + 2);
3842 		if (compl_pattern == NULL)
3843 		    return FAIL;
3844 		if (!vim_iswordp(line + compl_col)
3845 			|| (compl_col > 0
3846 			 && (vim_iswordp(mb_prevptr(line, line + compl_col)))))
3847 		    prefix = (char_u *)"";
3848 		STRCPY((char *)compl_pattern, prefix);
3849 		(void)quote_meta(compl_pattern + STRLEN(prefix),
3850 					      line + compl_col, compl_length);
3851 	    }
3852 	    else if (--startcol < 0
3853 		    || !vim_iswordp(mb_prevptr(line, line + startcol + 1)))
3854 	    {
3855 		// Match any word of at least two chars
3856 		compl_pattern = vim_strsave((char_u *)"\\<\\k\\k");
3857 		if (compl_pattern == NULL)
3858 		    return FAIL;
3859 		compl_col += curs_col;
3860 		compl_length = 0;
3861 	    }
3862 	    else
3863 	    {
3864 		// Search the point of change class of multibyte character
3865 		// or not a word single byte character backward.
3866 		if (has_mbyte)
3867 		{
3868 		    int base_class;
3869 		    int head_off;
3870 
3871 		    startcol -= (*mb_head_off)(line, line + startcol);
3872 		    base_class = mb_get_class(line + startcol);
3873 		    while (--startcol >= 0)
3874 		    {
3875 			head_off = (*mb_head_off)(line, line + startcol);
3876 			if (base_class != mb_get_class(line + startcol
3877 								  - head_off))
3878 			    break;
3879 			startcol -= head_off;
3880 		    }
3881 		}
3882 		else
3883 		    while (--startcol >= 0 && vim_iswordc(line[startcol]))
3884 			;
3885 		compl_col += ++startcol;
3886 		compl_length = (int)curs_col - startcol;
3887 		if (compl_length == 1)
3888 		{
3889 		    // Only match word with at least two chars -- webb
3890 		    // there's no need to call quote_meta,
3891 		    // alloc(7) is enough  -- Acevedo
3892 		    compl_pattern = alloc(7);
3893 		    if (compl_pattern == NULL)
3894 			return FAIL;
3895 		    STRCPY((char *)compl_pattern, "\\<");
3896 		    (void)quote_meta(compl_pattern + 2, line + compl_col, 1);
3897 		    STRCAT((char *)compl_pattern, "\\k");
3898 		}
3899 		else
3900 		{
3901 		    compl_pattern = alloc(quote_meta(NULL, line + compl_col,
3902 							   compl_length) + 2);
3903 		    if (compl_pattern == NULL)
3904 			return FAIL;
3905 		    STRCPY((char *)compl_pattern, "\\<");
3906 		    (void)quote_meta(compl_pattern + 2, line + compl_col,
3907 								compl_length);
3908 		}
3909 	    }
3910 	}
3911 	else if (ctrl_x_mode_line_or_eval())
3912 	{
3913 	    compl_col = (colnr_T)getwhitecols(line);
3914 	    compl_length = (int)curs_col - (int)compl_col;
3915 	    if (compl_length < 0)	// cursor in indent: empty pattern
3916 		compl_length = 0;
3917 	    if (p_ic)
3918 		compl_pattern = str_foldcase(line + compl_col, compl_length,
3919 								     NULL, 0);
3920 	    else
3921 		compl_pattern = vim_strnsave(line + compl_col, compl_length);
3922 	    if (compl_pattern == NULL)
3923 		return FAIL;
3924 	}
3925 	else if (ctrl_x_mode == CTRL_X_FILES)
3926 	{
3927 	    // Go back to just before the first filename character.
3928 	    if (startcol > 0)
3929 	    {
3930 		char_u	*p = line + startcol;
3931 
3932 		MB_PTR_BACK(line, p);
3933 		while (p > line && vim_isfilec(PTR2CHAR(p)))
3934 		    MB_PTR_BACK(line, p);
3935 		if (p == line && vim_isfilec(PTR2CHAR(p)))
3936 		    startcol = 0;
3937 		else
3938 		    startcol = (int)(p - line) + 1;
3939 	    }
3940 
3941 	    compl_col += startcol;
3942 	    compl_length = (int)curs_col - startcol;
3943 	    compl_pattern = addstar(line + compl_col, compl_length,
3944 								EXPAND_FILES);
3945 	    if (compl_pattern == NULL)
3946 		return FAIL;
3947 	}
3948 	else if (ctrl_x_mode == CTRL_X_CMDLINE)
3949 	{
3950 	    compl_pattern = vim_strnsave(line, curs_col);
3951 	    if (compl_pattern == NULL)
3952 		return FAIL;
3953 	    set_cmd_context(&compl_xp, compl_pattern,
3954 				  (int)STRLEN(compl_pattern), curs_col, FALSE);
3955 	    if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL
3956 		    || compl_xp.xp_context == EXPAND_NOTHING)
3957 		// No completion possible, use an empty pattern to get a
3958 		// "pattern not found" message.
3959 		compl_col = curs_col;
3960 	    else
3961 		compl_col = (int)(compl_xp.xp_pattern - compl_pattern);
3962 	    compl_length = curs_col - compl_col;
3963 	}
3964 	else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI
3965 		|| thesaurus_func_complete(ctrl_x_mode))
3966 	{
3967 #ifdef FEAT_COMPL_FUNC
3968 	    // Call user defined function 'completefunc' with "a:findstart"
3969 	    // set to 1 to obtain the length of text to use for completion.
3970 	    typval_T	args[3];
3971 	    int		col;
3972 	    char_u	*funcname;
3973 	    pos_T	pos;
3974 	    int		save_State = State;
3975 
3976 	    // Call 'completefunc' or 'omnifunc' and get pattern length as a
3977 	    // string
3978 	    funcname = get_complete_funcname(ctrl_x_mode);
3979 	    if (*funcname == NUL)
3980 	    {
3981 		semsg(_(e_notset), ctrl_x_mode == CTRL_X_FUNCTION
3982 					     ? "completefunc" : "omnifunc");
3983 		// restore did_ai, so that adding comment leader works
3984 		did_ai = save_did_ai;
3985 		return FAIL;
3986 	    }
3987 
3988 	    args[0].v_type = VAR_NUMBER;
3989 	    args[0].vval.v_number = 1;
3990 	    args[1].v_type = VAR_STRING;
3991 	    args[1].vval.v_string = (char_u *)"";
3992 	    args[2].v_type = VAR_UNKNOWN;
3993 	    pos = curwin->w_cursor;
3994 	    ++textwinlock;
3995 	    col = call_func_retnr(funcname, 2, args);
3996 	    --textwinlock;
3997 
3998 	    State = save_State;
3999 	    curwin->w_cursor = pos;	// restore the cursor position
4000 	    validate_cursor();
4001 	    if (!EQUAL_POS(curwin->w_cursor, pos))
4002 	    {
4003 		emsg(_(e_compldel));
4004 		return FAIL;
4005 	    }
4006 
4007 	    // Return value -2 means the user complete function wants to
4008 	    // cancel the complete without an error.
4009 	    // Return value -3 does the same as -2 and leaves CTRL-X mode.
4010 	    if (col == -2)
4011 		return FAIL;
4012 	    if (col == -3)
4013 	    {
4014 		ctrl_x_mode = CTRL_X_NORMAL;
4015 		edit_submode = NULL;
4016 		if (!shortmess(SHM_COMPLETIONMENU))
4017 		    msg_clr_cmdline();
4018 		return FAIL;
4019 	    }
4020 
4021 	    // Reset extended parameters of completion, when start new
4022 	    // completion.
4023 	    compl_opt_refresh_always = FALSE;
4024 	    compl_opt_suppress_empty = FALSE;
4025 
4026 	    if (col < 0)
4027 		col = curs_col;
4028 	    compl_col = col;
4029 	    if (compl_col > curs_col)
4030 		compl_col = curs_col;
4031 
4032 	    // Setup variables for completion.  Need to obtain "line" again,
4033 	    // it may have become invalid.
4034 	    line = ml_get(curwin->w_cursor.lnum);
4035 	    compl_length = curs_col - compl_col;
4036 	    compl_pattern = vim_strnsave(line + compl_col, compl_length);
4037 	    if (compl_pattern == NULL)
4038 #endif
4039 		return FAIL;
4040 	}
4041 	else if (ctrl_x_mode == CTRL_X_SPELL)
4042 	{
4043 #ifdef FEAT_SPELL
4044 	    if (spell_bad_len > 0)
4045 		compl_col = curs_col - spell_bad_len;
4046 	    else
4047 		compl_col = spell_word_start(startcol);
4048 	    if (compl_col >= (colnr_T)startcol)
4049 	    {
4050 		compl_length = 0;
4051 		compl_col = curs_col;
4052 	    }
4053 	    else
4054 	    {
4055 		spell_expand_check_cap(compl_col);
4056 		compl_length = (int)curs_col - compl_col;
4057 	    }
4058 	    // Need to obtain "line" again, it may have become invalid.
4059 	    line = ml_get(curwin->w_cursor.lnum);
4060 	    compl_pattern = vim_strnsave(line + compl_col, compl_length);
4061 	    if (compl_pattern == NULL)
4062 #endif
4063 		return FAIL;
4064 	}
4065 	else
4066 	{
4067 	    internal_error("ins_complete()");
4068 	    return FAIL;
4069 	}
4070 
4071 	if (compl_cont_status & CONT_ADDING)
4072 	{
4073 	    edit_submode_pre = (char_u *)_(" Adding");
4074 	    if (ctrl_x_mode_line_or_eval())
4075 	    {
4076 		// Insert a new line, keep indentation but ignore 'comments'
4077 		char_u *old = curbuf->b_p_com;
4078 
4079 		curbuf->b_p_com = (char_u *)"";
4080 		compl_startpos.lnum = curwin->w_cursor.lnum;
4081 		compl_startpos.col = compl_col;
4082 		ins_eol('\r');
4083 		curbuf->b_p_com = old;
4084 		compl_length = 0;
4085 		compl_col = curwin->w_cursor.col;
4086 	    }
4087 	}
4088 	else
4089 	{
4090 	    edit_submode_pre = NULL;
4091 	    compl_startpos.col = compl_col;
4092 	}
4093 
4094 	if (compl_cont_status & CONT_LOCAL)
4095 	    edit_submode = (char_u *)_(ctrl_x_msgs[CTRL_X_LOCAL_MSG]);
4096 	else
4097 	    edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode));
4098 
4099 	// If any of the original typed text has been changed we need to fix
4100 	// the redo buffer.
4101 	ins_compl_fixRedoBufForLeader(NULL);
4102 
4103 	// Always add completion for the original text.
4104 	vim_free(compl_orig_text);
4105 	compl_orig_text = vim_strnsave(line + compl_col, compl_length);
4106 	if (p_ic)
4107 	    flags |= CP_ICASE;
4108 	if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
4109 				  -1, NULL, NULL, NULL, 0, flags, FALSE) != OK)
4110 	{
4111 	    VIM_CLEAR(compl_pattern);
4112 	    VIM_CLEAR(compl_orig_text);
4113 	    return FAIL;
4114 	}
4115 
4116 	// showmode might reset the internal line pointers, so it must
4117 	// be called before line = ml_get(), or when this address is no
4118 	// longer needed.  -- Acevedo.
4119 	edit_submode_extra = (char_u *)_("-- Searching...");
4120 	edit_submode_highl = HLF_COUNT;
4121 	showmode();
4122 	edit_submode_extra = NULL;
4123 	out_flush();
4124     }
4125     else if (insert_match && stop_arrow() == FAIL)
4126 	return FAIL;
4127 
4128     compl_shown_match = compl_curr_match;
4129     compl_shows_dir = compl_direction;
4130 
4131     // Find next match (and following matches).
4132     save_w_wrow = curwin->w_wrow;
4133     save_w_leftcol = curwin->w_leftcol;
4134     n = ins_compl_next(TRUE, ins_compl_key2count(c), insert_match, FALSE);
4135 
4136     // may undisplay the popup menu
4137     ins_compl_upd_pum();
4138 
4139     if (n > 1)		// all matches have been found
4140 	compl_matches = n;
4141     compl_curr_match = compl_shown_match;
4142     compl_direction = compl_shows_dir;
4143 
4144     // Eat the ESC that vgetc() returns after a CTRL-C to avoid leaving Insert
4145     // mode.
4146     if (got_int && !global_busy)
4147     {
4148 	(void)vgetc();
4149 	got_int = FALSE;
4150     }
4151 
4152     // we found no match if the list has only the "compl_orig_text"-entry
4153     if (compl_first_match == compl_first_match->cp_next)
4154     {
4155 	edit_submode_extra = (compl_cont_status & CONT_ADDING)
4156 			&& compl_length > 1
4157 			     ? (char_u *)_(e_hitend) : (char_u *)_(e_patnotf);
4158 	edit_submode_highl = HLF_E;
4159 	// remove N_ADDS flag, so next ^X<> won't try to go to ADDING mode,
4160 	// because we couldn't expand anything at first place, but if we used
4161 	// ^P, ^N, ^X^I or ^X^D we might want to add-expand a single-char-word
4162 	// (such as M in M'exico) if not tried already.  -- Acevedo
4163 	if (	   compl_length > 1
4164 		|| (compl_cont_status & CONT_ADDING)
4165 		|| (ctrl_x_mode != CTRL_X_NORMAL
4166 		    && ctrl_x_mode != CTRL_X_PATH_PATTERNS
4167 		    && ctrl_x_mode != CTRL_X_PATH_DEFINES))
4168 	    compl_cont_status &= ~CONT_N_ADDS;
4169     }
4170 
4171     if (compl_curr_match->cp_flags & CP_CONT_S_IPOS)
4172 	compl_cont_status |= CONT_S_IPOS;
4173     else
4174 	compl_cont_status &= ~CONT_S_IPOS;
4175 
4176     if (edit_submode_extra == NULL)
4177     {
4178 	if (compl_curr_match->cp_flags & CP_ORIGINAL_TEXT)
4179 	{
4180 	    edit_submode_extra = (char_u *)_("Back at original");
4181 	    edit_submode_highl = HLF_W;
4182 	}
4183 	else if (compl_cont_status & CONT_S_IPOS)
4184 	{
4185 	    edit_submode_extra = (char_u *)_("Word from other line");
4186 	    edit_submode_highl = HLF_COUNT;
4187 	}
4188 	else if (compl_curr_match->cp_next == compl_curr_match->cp_prev)
4189 	{
4190 	    edit_submode_extra = (char_u *)_("The only match");
4191 	    edit_submode_highl = HLF_COUNT;
4192 	    compl_curr_match->cp_number = 1;
4193 	}
4194 	else
4195 	{
4196 #if defined(FEAT_COMPL_FUNC) || defined(FEAT_EVAL)
4197 	    // Update completion sequence number when needed.
4198 	    if (compl_curr_match->cp_number == -1)
4199 		ins_compl_update_sequence_numbers();
4200 #endif
4201 	    // The match should always have a sequence number now, this is
4202 	    // just a safety check.
4203 	    if (compl_curr_match->cp_number != -1)
4204 	    {
4205 		// Space for 10 text chars. + 2x10-digit no.s = 31.
4206 		// Translations may need more than twice that.
4207 		static char_u match_ref[81];
4208 
4209 		if (compl_matches > 0)
4210 		    vim_snprintf((char *)match_ref, sizeof(match_ref),
4211 				_("match %d of %d"),
4212 				compl_curr_match->cp_number, compl_matches);
4213 		else
4214 		    vim_snprintf((char *)match_ref, sizeof(match_ref),
4215 				_("match %d"),
4216 				compl_curr_match->cp_number);
4217 		edit_submode_extra = match_ref;
4218 		edit_submode_highl = HLF_R;
4219 		if (dollar_vcol >= 0)
4220 		    curs_columns(FALSE);
4221 	    }
4222 	}
4223     }
4224 
4225     // Show a message about what (completion) mode we're in.
4226     if (!compl_opt_suppress_empty)
4227     {
4228 	showmode();
4229 	if (!shortmess(SHM_COMPLETIONMENU))
4230 	{
4231 	    if (edit_submode_extra != NULL)
4232 	    {
4233 		if (!p_smd)
4234 		{
4235 		    msg_hist_off = TRUE;
4236 		    msg_attr((char *)edit_submode_extra,
4237 			    edit_submode_highl < HLF_COUNT
4238 			    ? HL_ATTR(edit_submode_highl) : 0);
4239 		    msg_hist_off = FALSE;
4240 		}
4241 	    }
4242 	    else
4243 		msg_clr_cmdline();	// necessary for "noshowmode"
4244 	}
4245     }
4246 
4247     // Show the popup menu, unless we got interrupted.
4248     if (enable_pum && !compl_interrupted)
4249 	show_pum(save_w_wrow, save_w_leftcol);
4250 
4251     compl_was_interrupted = compl_interrupted;
4252     compl_interrupted = FALSE;
4253 
4254     return OK;
4255 }
4256 
4257     static void
show_pum(int prev_w_wrow,int prev_w_leftcol)4258 show_pum(int prev_w_wrow, int prev_w_leftcol)
4259 {
4260     // RedrawingDisabled may be set when invoked through complete().
4261     int n = RedrawingDisabled;
4262 
4263     RedrawingDisabled = 0;
4264 
4265     // If the cursor moved or the display scrolled we need to remove the pum
4266     // first.
4267     setcursor();
4268     if (prev_w_wrow != curwin->w_wrow || prev_w_leftcol != curwin->w_leftcol)
4269 	ins_compl_del_pum();
4270 
4271     ins_compl_show_pum();
4272     setcursor();
4273     RedrawingDisabled = n;
4274 }
4275 
4276 /*
4277  * Looks in the first "len" chars. of "src" for search-metachars.
4278  * If dest is not NULL the chars. are copied there quoting (with
4279  * a backslash) the metachars, and dest would be NUL terminated.
4280  * Returns the length (needed) of dest
4281  */
4282     static unsigned
quote_meta(char_u * dest,char_u * src,int len)4283 quote_meta(char_u *dest, char_u *src, int len)
4284 {
4285     unsigned	m = (unsigned)len + 1;  // one extra for the NUL
4286 
4287     for ( ; --len >= 0; src++)
4288     {
4289 	switch (*src)
4290 	{
4291 	    case '.':
4292 	    case '*':
4293 	    case '[':
4294 		if (ctrl_x_mode == CTRL_X_DICTIONARY
4295 					   || ctrl_x_mode == CTRL_X_THESAURUS)
4296 		    break;
4297 		// FALLTHROUGH
4298 	    case '~':
4299 		if (!magic_isset())	// quote these only if magic is set
4300 		    break;
4301 		// FALLTHROUGH
4302 	    case '\\':
4303 		if (ctrl_x_mode == CTRL_X_DICTIONARY
4304 					   || ctrl_x_mode == CTRL_X_THESAURUS)
4305 		    break;
4306 		// FALLTHROUGH
4307 	    case '^':		// currently it's not needed.
4308 	    case '$':
4309 		m++;
4310 		if (dest != NULL)
4311 		    *dest++ = '\\';
4312 		break;
4313 	}
4314 	if (dest != NULL)
4315 	    *dest++ = *src;
4316 	// Copy remaining bytes of a multibyte character.
4317 	if (has_mbyte)
4318 	{
4319 	    int i, mb_len;
4320 
4321 	    mb_len = (*mb_ptr2len)(src) - 1;
4322 	    if (mb_len > 0 && len >= mb_len)
4323 		for (i = 0; i < mb_len; ++i)
4324 		{
4325 		    --len;
4326 		    ++src;
4327 		    if (dest != NULL)
4328 			*dest++ = *src;
4329 		}
4330 	}
4331     }
4332     if (dest != NULL)
4333 	*dest = NUL;
4334 
4335     return m;
4336 }
4337 
4338 #if defined(EXITFREE) || defined(PROTO)
4339     void
free_insexpand_stuff(void)4340 free_insexpand_stuff(void)
4341 {
4342     VIM_CLEAR(compl_orig_text);
4343 }
4344 #endif
4345 
4346 #ifdef FEAT_SPELL
4347 /*
4348  * Called when starting CTRL_X_SPELL mode: Move backwards to a previous badly
4349  * spelled word, if there is one.
4350  */
4351     static void
spell_back_to_badword(void)4352 spell_back_to_badword(void)
4353 {
4354     pos_T	tpos = curwin->w_cursor;
4355 
4356     spell_bad_len = spell_move_to(curwin, BACKWARD, TRUE, TRUE, NULL);
4357     if (curwin->w_cursor.col != tpos.col)
4358 	start_arrow(&tpos);
4359 }
4360 #endif
4361