To: vim_dev@googlegroups.com Subject: Patch 8.1.1124 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1124 Problem: Insert completion flags are mixed up. Solution: Clean up flags use of ins_compl_add() and cp_flags. Files: src/insexpand.c, src/proto/insexpand.pro, src/search.c, src/spell.c *** ../vim-8.1.1123/src/insexpand.c 2019-04-06 13:45:51.568756943 +0200 --- src/insexpand.c 2019-04-06 14:14:19.712671221 +0200 *************** *** 102,119 **** compl_T *cp_next; compl_T *cp_prev; char_u *cp_str; // matched text - char cp_icase; // TRUE or FALSE: ignore case - char cp_equal; // TRUE or FALSE: ins_compl_equal always ok char_u *(cp_text[CPT_COUNT]); // text for the menu char_u *cp_fname; // file containing the match, allocated when ! // cp_flags has FREE_FNAME ! int cp_flags; // ORIGINAL_TEXT, CONT_S_IPOS or FREE_FNAME int cp_number; // sequence number }; ! // flags for ins_compl_add() ! # define ORIGINAL_TEXT (1) // the original text when the expansion begun ! # define FREE_FNAME (2) static char e_hitend[] = N_("Hit end of paragraph"); # ifdef FEAT_COMPL_FUNC --- 102,120 ---- compl_T *cp_next; compl_T *cp_prev; char_u *cp_str; // matched text char_u *(cp_text[CPT_COUNT]); // text for the menu char_u *cp_fname; // file containing the match, allocated when ! // cp_flags has CP_FREE_FNAME ! int cp_flags; // CP_ values int cp_number; // sequence number }; ! // values for cp_flags ! # define CP_ORIGINAL_TEXT 1 // the original text when the expansion begun ! # define CP_FREE_FNAME 2 // cp_fname is allocated ! # define CP_CONT_S_IPOS 4 // use CONT_S_IPOS for compl_cont_status ! # define CP_EQUAL 8 // ins_compl_equal() always returns TRUE ! # define CP_ICASE 16 // ins_compl_equal() ignores case static char e_hitend[] = N_("Hit end of paragraph"); # ifdef FEAT_COMPL_FUNC *************** *** 185,191 **** static int compl_opt_refresh_always = FALSE; static int compl_opt_suppress_empty = FALSE; ! static int ins_compl_add(char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup, int equal); static void ins_compl_longest_match(compl_T *match); static void ins_compl_del_pum(void); static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir); --- 186,192 ---- static int compl_opt_refresh_always = FALSE; static int compl_opt_suppress_empty = FALSE; ! static int ins_compl_add(char_u *str, int len, char_u *fname, char_u **cptext, int cdir, int flags, int adup); static void ins_compl_longest_match(compl_T *match); static void ins_compl_del_pum(void); static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir); *************** *** 420,426 **** int icase, char_u *fname, int dir, ! int flags) { char_u *str = str_arg; char_u *p; --- 421,427 ---- int icase, char_u *fname, int dir, ! int cont_s_ipos) // next ^X<> will set initial_pos { char_u *str = str_arg; char_u *p; *************** *** 431,436 **** --- 432,438 ---- int *wca; // Wide character array. int has_lower = FALSE; int was_letter = FALSE; + int flags = 0; if (p_ic && curbuf->b_p_inf && len > 0) { *************** *** 555,563 **** str = IObuff; } ! return ins_compl_add(str, len, icase, fname, NULL, dir, ! flags, FALSE, FALSE); } /* --- 557,568 ---- str = IObuff; } + if (cont_s_ipos) + flags |= CP_CONT_S_IPOS; + if (icase) + flags |= CP_ICASE; ! return ins_compl_add(str, len, fname, NULL, dir, flags, FALSE); } /* *************** *** 570,585 **** ins_compl_add( char_u *str, int len, - int icase, char_u *fname, char_u **cptext, // extra text for popup menu or NULL int cdir, ! int flags, ! int adup, // accept duplicate match ! int equal) // match is always accepted by ins_compl_equal { compl_T *match; int dir = (cdir == 0 ? compl_direction : cdir); ui_breakcheck(); if (got_int) --- 575,589 ---- ins_compl_add( char_u *str, int len, char_u *fname, char_u **cptext, // extra text for popup menu or NULL int cdir, ! int flags_arg, ! int adup) // accept duplicate match { compl_T *match; int dir = (cdir == 0 ? compl_direction : cdir); + int flags = flags_arg; ui_breakcheck(); if (got_int) *************** *** 593,599 **** match = compl_first_match; do { ! if ( !(match->cp_flags & ORIGINAL_TEXT) && STRNCMP(match->cp_str, str, len) == 0 && match->cp_str[len] == NUL) return NOTDONE; --- 597,603 ---- match = compl_first_match; do { ! if ( !(match->cp_flags & CP_ORIGINAL_TEXT) && STRNCMP(match->cp_str, str, len) == 0 && match->cp_str[len] == NUL) return NOTDONE; *************** *** 610,628 **** if (match == NULL) return FAIL; match->cp_number = -1; ! if (flags & ORIGINAL_TEXT) match->cp_number = 0; if ((match->cp_str = vim_strnsave(str, len)) == NULL) { vim_free(match); return FAIL; } - match->cp_icase = icase; - match->cp_equal = equal; // match-fname is: // - compl_curr_match->cp_fname if it is a string equal to fname. ! // - a copy of fname, FREE_FNAME is set to free later THE allocated mem. // - NULL otherwise. --Acevedo if (fname != NULL && compl_curr_match != NULL --- 614,630 ---- if (match == NULL) return FAIL; match->cp_number = -1; ! if (flags & CP_ORIGINAL_TEXT) match->cp_number = 0; if ((match->cp_str = vim_strnsave(str, len)) == NULL) { vim_free(match); return FAIL; } // match-fname is: // - compl_curr_match->cp_fname if it is a string equal to fname. ! // - a copy of fname, CP_FREE_FNAME is set to free later THE allocated mem. // - NULL otherwise. --Acevedo if (fname != NULL && compl_curr_match != NULL *************** *** 632,638 **** else if (fname != NULL) { match->cp_fname = vim_strsave(fname); ! flags |= FREE_FNAME; } else match->cp_fname = NULL; --- 634,640 ---- else if (fname != NULL) { match->cp_fname = vim_strsave(fname); ! flags |= CP_FREE_FNAME; } else match->cp_fname = NULL; *************** *** 669,675 **** compl_curr_match = match; // Find the longest common string if still doing that. ! if (compl_get_longest && (flags & ORIGINAL_TEXT) == 0) ins_compl_longest_match(match); return OK; --- 671,677 ---- compl_curr_match = match; // Find the longest common string if still doing that. ! if (compl_get_longest && (flags & CP_ORIGINAL_TEXT) == 0) ins_compl_longest_match(match); return OK; *************** *** 677,690 **** /* * Return TRUE if "str[len]" matches with match->cp_str, considering ! * match->cp_icase. */ static int ins_compl_equal(compl_T *match, char_u *str, int len) { ! if (match->cp_equal) return TRUE; ! if (match->cp_icase) return STRNICMP(match->cp_str, str, (size_t)len) == 0; return STRNCMP(match->cp_str, str, (size_t)len) == 0; } --- 679,692 ---- /* * Return TRUE if "str[len]" matches with match->cp_str, considering ! * match->cp_flags. */ static int ins_compl_equal(compl_T *match, char_u *str, int len) { ! if (match->cp_flags & CP_EQUAL) return TRUE; ! if (match->cp_flags & CP_ICASE) return STRNICMP(match->cp_str, str, (size_t)len) == 0; return STRNCMP(match->cp_str, str, (size_t)len) == 0; } *************** *** 734,741 **** c1 = *p; c2 = *s; } ! if (match->cp_icase ? (MB_TOLOWER(c1) != MB_TOLOWER(c2)) ! : (c1 != c2)) break; if (has_mbyte) { --- 736,743 ---- c1 = *p; c2 = *s; } ! if ((match->cp_flags & CP_ICASE) ! ? (MB_TOLOWER(c1) != MB_TOLOWER(c2)) : (c1 != c2)) break; if (has_mbyte) { *************** *** 783,790 **** int dir = compl_direction; for (i = 0; i < num_matches && add_r != FAIL; i++) ! if ((add_r = ins_compl_add(matches[i], -1, icase, ! NULL, NULL, dir, 0, FALSE, FALSE)) == OK) // if dir was BACKWARD then honor it just once dir = FORWARD; FreeWild(num_matches, matches); --- 785,792 ---- int dir = compl_direction; for (i = 0; i < num_matches && add_r != FAIL; i++) ! if ((add_r = ins_compl_add(matches[i], -1, NULL, NULL, dir, ! icase ? CP_ICASE : 0, FALSE)) == OK) // if dir was BACKWARD then honor it just once dir = FORWARD; FreeWild(num_matches, matches); *************** *** 861,866 **** --- 863,869 ---- { int save_w_wrow = curwin->w_wrow; int save_w_leftcol = curwin->w_leftcol; + int flags = CP_ORIGINAL_TEXT; // If already doing completions stop it. if (ctrl_x_mode != CTRL_X_NORMAL) *************** *** 875,882 **** compl_length = (int)curwin->w_cursor.col - (int)startcol; // compl_pattern doesn't need to be set compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length); if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, ! -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE, FALSE) != OK) return; ctrl_x_mode = CTRL_X_EVAL; --- 878,887 ---- compl_length = (int)curwin->w_cursor.col - (int)startcol; // compl_pattern doesn't need to be set compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length); + if (p_ic) + flags |= CP_ICASE; if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, ! -1, NULL, NULL, 0, flags, FALSE) != OK) return; ctrl_x_mode = CTRL_X_EVAL; *************** *** 979,985 **** do { if (compl == NULL ! || ((compl->cp_flags & ORIGINAL_TEXT) == 0 && ++i == 2)) break; compl = compl->cp_next; } while (compl != compl_first_match); --- 984,990 ---- do { if (compl == NULL ! || ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0 && ++i == 2)) break; compl = compl->cp_next; } while (compl != compl_first_match); *************** *** 1025,1031 **** lead_len = (int)STRLEN(compl_leader); do { ! if ((compl->cp_flags & ORIGINAL_TEXT) == 0 && (compl_leader == NULL || ins_compl_equal(compl, compl_leader, lead_len))) ++compl_match_arraysize; --- 1030,1036 ---- lead_len = (int)STRLEN(compl_leader); do { ! if ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0 && (compl_leader == NULL || ins_compl_equal(compl, compl_leader, lead_len))) ++compl_match_arraysize; *************** *** 1040,1053 **** { // If the current match is the original text don't find the first // match after it, don't highlight anything. ! if (compl_shown_match->cp_flags & ORIGINAL_TEXT) shown_match_ok = TRUE; i = 0; compl = compl_first_match; do { ! if ((compl->cp_flags & ORIGINAL_TEXT) == 0 && (compl_leader == NULL || ins_compl_equal(compl, compl_leader, lead_len))) { --- 1045,1058 ---- { // If the current match is the original text don't find the first // match after it, don't highlight anything. ! if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) shown_match_ok = TRUE; i = 0; compl = compl_first_match; do { ! if ((compl->cp_flags & CP_ORIGINAL_TEXT) == 0 && (compl_leader == NULL || ins_compl_equal(compl, compl_leader, lead_len))) { *************** *** 1088,1094 **** // When the original text is the shown match don't set // compl_shown_match. ! if (compl->cp_flags & ORIGINAL_TEXT) shown_match_ok = TRUE; if (!shown_match_ok && shown_compl != NULL) --- 1093,1099 ---- // When the original text is the shown match don't set // compl_shown_match. ! if (compl->cp_flags & CP_ORIGINAL_TEXT) shown_match_ok = TRUE; if (!shown_match_ok && shown_compl != NULL) *************** *** 1307,1313 **** ptr = find_word_end(ptr); add_r = ins_compl_add_infercase(regmatch->startp[0], (int)(ptr - regmatch->startp[0]), ! p_ic, files[i], *dir, 0); if (thesaurus) { char_u *wstart; --- 1312,1318 ---- ptr = find_word_end(ptr); add_r = ins_compl_add_infercase(regmatch->startp[0], (int)(ptr - regmatch->startp[0]), ! p_ic, files[i], *dir, FALSE); if (thesaurus) { char_u *wstart; *************** *** 1343,1349 **** if (wstart != regmatch->startp[0]) add_r = ins_compl_add_infercase(wstart, (int)(ptr - wstart), ! p_ic, files[i], *dir, 0); } } if (add_r == OK) --- 1348,1354 ---- if (wstart != regmatch->startp[0]) add_r = ins_compl_add_infercase(wstart, (int)(ptr - wstart), ! p_ic, files[i], *dir, FALSE); } } if (add_r == OK) *************** *** 1446,1452 **** compl_curr_match = compl_curr_match->cp_next; vim_free(match->cp_str); // several entries may use the same fname, free it just once. ! if (match->cp_flags & FREE_FNAME) vim_free(match->cp_fname); for (i = 0; i < CPT_COUNT; ++i) vim_free(match->cp_text[i]); --- 1451,1457 ---- compl_curr_match = compl_curr_match->cp_next; vim_free(match->cp_str); // several entries may use the same fname, free it just once. ! if (match->cp_flags & CP_FREE_FNAME) vim_free(match->cp_fname); for (i = 0; i < CPT_COUNT; ++i) vim_free(match->cp_text[i]); *************** *** 1540,1546 **** match = compl_first_match; do { ! if (!(match->cp_flags & ORIGINAL_TEXT)) { di = dict_alloc(); if (di == NULL) --- 1545,1551 ---- match = compl_first_match; do { ! if (!(match->cp_flags & CP_ORIGINAL_TEXT)) { di = dict_alloc(); if (di == NULL) *************** *** 1818,1826 **** char_u *p; // Replace the original text entry. ! // The ORIGINAL_TEXT flag is either at the first item or might possibly be // at the last item for backward completion ! if (compl_first_match->cp_flags & ORIGINAL_TEXT) // safety check { p = vim_strsave(str); if (p != NULL) --- 1823,1831 ---- char_u *p; // Replace the original text entry. ! // The CP_ORIGINAL_TEXT flag is either at the first item or might possibly be // at the last item for backward completion ! if (compl_first_match->cp_flags & CP_ORIGINAL_TEXT) // safety check { p = vim_strsave(str); if (p != NULL) *************** *** 1830,1836 **** } } else if (compl_first_match->cp_prev != NULL ! && (compl_first_match->cp_prev->cp_flags & ORIGINAL_TEXT)) { p = vim_strsave(str); if (p != NULL) --- 1835,1841 ---- } } else if (compl_first_match->cp_prev != NULL ! && (compl_first_match->cp_prev->cp_flags & CP_ORIGINAL_TEXT)) { p = vim_strsave(str); if (p != NULL) *************** *** 1858,1864 **** { // When still at the original match use the first entry that matches // the leader. ! if (compl_shown_match->cp_flags & ORIGINAL_TEXT) { p = NULL; for (cp = compl_shown_match->cp_next; cp != NULL --- 1863,1869 ---- { // When still at the original match use the first entry that matches // the leader. ! if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) { p = NULL; for (cp = compl_shown_match->cp_next; cp != NULL *************** *** 2370,2379 **** ins_compl_add_tv(typval_T *tv, int dir) { char_u *word; ! int icase = FALSE; ! int adup = FALSE; ! int aempty = FALSE; ! int aequal = FALSE; char_u *(cptext[CPT_COUNT]); if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) --- 2375,2383 ---- ins_compl_add_tv(typval_T *tv, int dir) { char_u *word; ! int dup = FALSE; ! int empty = FALSE; ! int flags = 0; char_u *(cptext[CPT_COUNT]); if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) *************** *** 2389,2411 **** (char_u *)"info", FALSE); cptext[CPT_USER_DATA] = dict_get_string(tv->vval.v_dict, (char_u *)"user_data", FALSE); ! if (dict_get_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL) ! icase = dict_get_number(tv->vval.v_dict, (char_u *)"icase"); if (dict_get_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL) ! adup = dict_get_number(tv->vval.v_dict, (char_u *)"dup"); if (dict_get_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL) ! aempty = dict_get_number(tv->vval.v_dict, (char_u *)"empty"); ! if (dict_get_string(tv->vval.v_dict, (char_u *)"equal", FALSE) != NULL) ! aequal = dict_get_number(tv->vval.v_dict, (char_u *)"equal"); } else { word = tv_get_string_chk(tv); vim_memset(cptext, 0, sizeof(cptext)); } ! if (word == NULL || (!aempty && *word == NUL)) return FAIL; ! return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup, aequal); } #endif --- 2393,2417 ---- (char_u *)"info", FALSE); cptext[CPT_USER_DATA] = dict_get_string(tv->vval.v_dict, (char_u *)"user_data", FALSE); ! if (dict_get_string(tv->vval.v_dict, (char_u *)"icase", FALSE) != NULL ! && dict_get_number(tv->vval.v_dict, (char_u *)"icase")) ! flags |= CP_ICASE; if (dict_get_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL) ! dup = dict_get_number(tv->vval.v_dict, (char_u *)"dup"); if (dict_get_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL) ! empty = dict_get_number(tv->vval.v_dict, (char_u *)"empty"); ! if (dict_get_string(tv->vval.v_dict, (char_u *)"equal", FALSE) != NULL ! && dict_get_number(tv->vval.v_dict, (char_u *)"equal")) ! flags |= CP_EQUAL; } else { word = tv_get_string_chk(tv); vim_memset(cptext, 0, sizeof(cptext)); } ! if (word == NULL || (!empty && *word == NUL)) return FAIL; ! return ins_compl_add(word, -1, NULL, cptext, dir, flags, dup); } #endif *************** *** 2672,2678 **** p_ws = TRUE; for (;;) { ! int flags = 0; ++msg_silent; // Don't want messages for wrapscan. --- 2678,2684 ---- p_ws = TRUE; for (;;) { ! int cont_s_ipos = FALSE; ++msg_silent; // Don't want messages for wrapscan. *************** *** 2778,2784 **** tmp_ptr = ptr + IOSIZE - len - 1; STRNCPY(IObuff + len, ptr, tmp_ptr - ptr); len += (int)(tmp_ptr - ptr); ! flags |= CONT_S_IPOS; } IObuff[len] = NUL; ptr = IObuff; --- 2784,2790 ---- tmp_ptr = ptr + IOSIZE - len - 1; STRNCPY(IObuff + len, ptr, tmp_ptr - ptr); len += (int)(tmp_ptr - ptr); ! cont_s_ipos = TRUE; } IObuff[len] = NUL; ptr = IObuff; *************** *** 2789,2795 **** } if (ins_compl_add_infercase(ptr, len, p_ic, ins_buf == curbuf ? NULL : ins_buf->b_sfname, ! 0, flags) != NOTDONE) { found_new_match = OK; break; --- 2795,2801 ---- } if (ins_compl_add_infercase(ptr, len, p_ic, ins_buf == curbuf ? NULL : ins_buf->b_sfname, ! 0, cont_s_ipos) != NOTDONE) { found_new_match = OK; break; *************** *** 2889,2895 **** dict_T *dict; ins_bytes(compl_shown_match->cp_str + ins_compl_len()); ! if (compl_shown_match->cp_flags & ORIGINAL_TEXT) compl_used_match = FALSE; else compl_used_match = TRUE; --- 2895,2901 ---- dict_T *dict; ins_bytes(compl_shown_match->cp_str + ins_compl_len()); ! if (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) compl_used_match = FALSE; else compl_used_match = TRUE; *************** *** 2949,2955 **** return -1; if (compl_leader != NULL ! && (compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0) { // Set "compl_shown_match" to the actually shown match, it may differ // when "compl_leader" is used to omit some of the matches. --- 2955,2961 ---- return -1; if (compl_leader != NULL ! && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0) { // Set "compl_shown_match" to the actually shown match, it may differ // when "compl_leader" is used to omit some of the matches. *************** *** 3053,3059 **** } found_end = FALSE; } ! if ((compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0 && compl_leader != NULL && !ins_compl_equal(compl_shown_match, compl_leader, (int)STRLEN(compl_leader))) --- 3059,3065 ---- } found_end = FALSE; } ! if ((compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0 && compl_leader != NULL && !ins_compl_equal(compl_shown_match, compl_leader, (int)STRLEN(compl_leader))) *************** *** 3304,3309 **** --- 3310,3316 ---- int save_w_leftcol; int insert_match; int save_did_ai = did_ai; + int flags = CP_ORIGINAL_TEXT; compl_direction = ins_compl_key2dir(c); insert_match = ins_compl_use_match(c); *************** *** 3704,3711 **** // Always add completion for the original text. vim_free(compl_orig_text); compl_orig_text = vim_strnsave(line + compl_col, compl_length); if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, ! -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE, FALSE) != OK) { VIM_CLEAR(compl_pattern); VIM_CLEAR(compl_orig_text); --- 3711,3720 ---- // Always add completion for the original text. vim_free(compl_orig_text); compl_orig_text = vim_strnsave(line + compl_col, compl_length); + if (p_ic) + flags |= CP_ICASE; if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, ! -1, NULL, NULL, 0, flags, FALSE) != OK) { VIM_CLEAR(compl_pattern); VIM_CLEAR(compl_orig_text); *************** *** 3767,3780 **** compl_cont_status &= ~CONT_N_ADDS; } ! if (compl_curr_match->cp_flags & CONT_S_IPOS) compl_cont_status |= CONT_S_IPOS; else compl_cont_status &= ~CONT_S_IPOS; if (edit_submode_extra == NULL) { ! if (compl_curr_match->cp_flags & ORIGINAL_TEXT) { edit_submode_extra = (char_u *)_("Back at original"); edit_submode_highl = HLF_W; --- 3776,3789 ---- compl_cont_status &= ~CONT_N_ADDS; } ! if (compl_curr_match->cp_flags & CP_CONT_S_IPOS) compl_cont_status |= CONT_S_IPOS; else compl_cont_status &= ~CONT_S_IPOS; if (edit_submode_extra == NULL) { ! if (compl_curr_match->cp_flags & CP_ORIGINAL_TEXT) { edit_submode_extra = (char_u *)_("Back at original"); edit_submode_highl = HLF_W; *** ../vim-8.1.1123/src/proto/insexpand.pro 2019-03-30 13:53:26.174425093 +0100 --- src/proto/insexpand.pro 2019-04-06 14:06:24.070288598 +0200 *************** *** 20,26 **** int has_compl_option(int dict_opt); int vim_is_ctrl_x_key(int c); int ins_compl_accept_char(int c); ! int ins_compl_add_infercase(char_u *str, int len, int icase, char_u *fname, int dir, int flags); int ins_compl_has_shown_match(void); int ins_compl_long_shown_match(void); void completeopt_was_set(void); --- 20,26 ---- int has_compl_option(int dict_opt); int vim_is_ctrl_x_key(int c); int ins_compl_accept_char(int c); ! int ins_compl_add_infercase(char_u *str_arg, int len, int icase, char_u *fname, int dir, int cont_s_ipos); int ins_compl_has_shown_match(void); int ins_compl_long_shown_match(void); void completeopt_was_set(void); *** ../vim-8.1.1123/src/search.c 2019-03-30 13:53:26.174425093 +0100 --- src/search.c 2019-04-06 13:52:12.762824629 +0200 *************** *** 5272,5278 **** #ifdef FEAT_INS_EXPAND if (action == ACTION_EXPAND) { ! int reuse = 0; int add_r; char_u *aux; --- 5272,5278 ---- #ifdef FEAT_INS_EXPAND if (action == ACTION_EXPAND) { ! int cont_s_ipos = FALSE; int add_r; char_u *aux; *************** *** 5333,5339 **** p = aux + IOSIZE - i - 1; STRNCPY(IObuff + i, aux, p - aux); i += (int)(p - aux); ! reuse |= CONT_S_IPOS; } IObuff[i] = NUL; aux = IObuff; --- 5333,5339 ---- p = aux + IOSIZE - i - 1; STRNCPY(IObuff + i, aux, p - aux); i += (int)(p - aux); ! cont_s_ipos = TRUE; } IObuff[i] = NUL; aux = IObuff; *************** *** 5344,5350 **** add_r = ins_compl_add_infercase(aux, i, p_ic, curr_fname == curbuf->b_fname ? NULL : curr_fname, ! dir, reuse); if (add_r == OK) /* if dir was BACKWARD then honor it just once */ dir = FORWARD; --- 5344,5350 ---- add_r = ins_compl_add_infercase(aux, i, p_ic, curr_fname == curbuf->b_fname ? NULL : curr_fname, ! dir, cont_s_ipos); if (add_r == OK) /* if dir was BACKWARD then honor it just once */ dir = FORWARD; *** ../vim-8.1.1123/src/spell.c 2019-03-30 18:46:57.360077328 +0100 --- src/spell.c 2019-04-06 13:52:21.666778351 +0200 *************** *** 8627,8633 **** ? MB_STRNICMP(p, pat, STRLEN(pat)) == 0 : STRNCMP(p, pat, STRLEN(pat)) == 0) && ins_compl_add_infercase(p, (int)STRLEN(p), ! p_ic, NULL, *dir, 0) == OK) /* if dir was BACKWARD then honor it just once */ *dir = FORWARD; } --- 8627,8633 ---- ? MB_STRNICMP(p, pat, STRLEN(pat)) == 0 : STRNCMP(p, pat, STRLEN(pat)) == 0) && ins_compl_add_infercase(p, (int)STRLEN(p), ! p_ic, NULL, *dir, FALSE) == OK) /* if dir was BACKWARD then honor it just once */ *dir = FORWARD; } *** ../vim-8.1.1123/src/version.c 2019-04-06 13:45:51.568756943 +0200 --- src/version.c 2019-04-06 14:19:37.271357326 +0200 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1124, /**/ -- hundred-and-one symptoms of being an internet addict: 211. Your husband leaves you...taking the computer with him and you call him crying, and beg him to bring the computer back. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///