To: vim_dev@googlegroups.com Subject: Patch 8.2.1907 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1907 Problem: Complete_info().selected may be wrong. Solution: Update cp_number if it was never set. (issue #6945) Files: src/insexpand.c, src/testdir/test_ins_complete.vim *** ../vim-8.2.1906/src/insexpand.c 2020-09-12 22:52:53.582315764 +0200 --- src/insexpand.c 2020-10-26 19:18:42.470503841 +0100 *************** *** 2498,2503 **** --- 2498,2553 ---- return (char_u *)""; } + static void + ins_compl_update_sequence_numbers() + { + int number = 0; + compl_T *match; + + if (compl_direction == FORWARD) + { + // search backwards for the first valid (!= -1) number. + // This should normally succeed already at the first loop + // cycle, so it's fast! + for (match = compl_curr_match->cp_prev; match != NULL + && match != compl_first_match; + match = match->cp_prev) + if (match->cp_number != -1) + { + number = match->cp_number; + break; + } + if (match != NULL) + // go up and assign all numbers which are not assigned + // yet + for (match = match->cp_next; + match != NULL && match->cp_number == -1; + match = match->cp_next) + match->cp_number = ++number; + } + else // BACKWARD + { + // search forwards (upwards) for the first valid (!= -1) + // number. This should normally succeed already at the + // first loop cycle, so it's fast! + for (match = compl_curr_match->cp_next; match != NULL + && match != compl_first_match; + match = match->cp_next) + if (match->cp_number != -1) + { + number = match->cp_number; + break; + } + if (match != NULL) + // go down and assign all numbers which are not + // assigned yet + for (match = match->cp_prev; match + && match->cp_number == -1; + match = match->cp_prev) + match->cp_number = ++number; + } + } + /* * Get complete information */ *************** *** 2584,2591 **** } if (ret == OK && (what_flag & CI_WHAT_SELECTED)) ! ret = dict_add_number(retdict, "selected", (compl_curr_match != NULL) ? ! compl_curr_match->cp_number - 1 : -1); // TODO // if (ret == OK && (what_flag & CI_WHAT_INSERTED)) --- 2634,2645 ---- } if (ret == OK && (what_flag & CI_WHAT_SELECTED)) ! { ! if (compl_curr_match != NULL && compl_curr_match->cp_number == -1) ! ins_compl_update_sequence_numbers(); ! ret = dict_add_number(retdict, "selected", compl_curr_match != NULL ! ? compl_curr_match->cp_number - 1 : -1); ! } // TODO // if (ret == OK && (what_flag & CI_WHAT_INSERTED)) *************** *** 4009,4067 **** { edit_submode_extra = (char_u *)_("The only match"); edit_submode_highl = HLF_COUNT; ! compl_curr_match->cp_number = 0; } else { // Update completion sequence number when needed. if (compl_curr_match->cp_number == -1) ! { ! int number = 0; ! compl_T *match; ! ! if (compl_direction == FORWARD) ! { ! // search backwards for the first valid (!= -1) number. ! // This should normally succeed already at the first loop ! // cycle, so it's fast! ! for (match = compl_curr_match->cp_prev; match != NULL ! && match != compl_first_match; ! match = match->cp_prev) ! if (match->cp_number != -1) ! { ! number = match->cp_number; ! break; ! } ! if (match != NULL) ! // go up and assign all numbers which are not assigned ! // yet ! for (match = match->cp_next; ! match != NULL && match->cp_number == -1; ! match = match->cp_next) ! match->cp_number = ++number; ! } ! else // BACKWARD ! { ! // search forwards (upwards) for the first valid (!= -1) ! // number. This should normally succeed already at the ! // first loop cycle, so it's fast! ! for (match = compl_curr_match->cp_next; match != NULL ! && match != compl_first_match; ! match = match->cp_next) ! if (match->cp_number != -1) ! { ! number = match->cp_number; ! break; ! } ! if (match != NULL) ! // go down and assign all numbers which are not ! // assigned yet ! for (match = match->cp_prev; match ! && match->cp_number == -1; ! match = match->cp_prev) ! match->cp_number = ++number; ! } ! } // The match should always have a sequence number now, this is // just a safety check. --- 4063,4075 ---- { edit_submode_extra = (char_u *)_("The only match"); edit_submode_highl = HLF_COUNT; ! compl_curr_match->cp_number = 1; } else { // Update completion sequence number when needed. if (compl_curr_match->cp_number == -1) ! ins_compl_update_sequence_numbers(); // The match should always have a sequence number now, this is // just a safety check. *** ../vim-8.2.1906/src/testdir/test_ins_complete.vim 2020-10-25 13:22:38.216253317 +0100 --- src/testdir/test_ins_complete.vim 2020-10-26 19:20:40.934106723 +0100 *************** *** 325,331 **** set completeopt=menuone set completefunc=CompleteTest call feedkeys("i\\\\=string(complete_info())\\", "tx") ! call assert_equal("matched{'pum_visible': 1, 'mode': 'function', 'selected': -1, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) bwipe! set completeopt& set completefunc& --- 325,331 ---- set completeopt=menuone set completefunc=CompleteTest call feedkeys("i\\\\=string(complete_info())\\", "tx") ! call assert_equal("matched{'pum_visible': 1, 'mode': 'function', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1)) bwipe! set completeopt& set completefunc& *** ../vim-8.2.1906/src/version.c 2020-10-26 18:46:49.480589241 +0100 --- src/version.c 2020-10-26 19:21:13.489999378 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 1907, /**/ -- Don't drink and drive. You might hit a bump and spill your beer. /// 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 ///