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