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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui