Patch 8.2.3989
Problem: Some insert completion code is not tested.
Solution: Add a few tests. Refactor thesaurus completion. (Yegappan
Lakshmanan, closes #9460)
Files: src/insexpand.c, src/testdir/test_edit.vim,
src/testdir/test_ins_complete.vim
*** ../vim-8.2.3988/src/insexpand.c 2022-01-01 15:58:19.114486366 +0000
--- src/insexpand.c 2022-01-03 11:02:39.358931895 +0000
***************
*** 1017,1022 ****
--- 1017,1026 ----
return dict;
}
+ /*
+ * Trigger the CompleteChanged autocmd event. Invoked each time the Insert
mode
+ * completion menu is changed.
+ */
static void
trigger_complete_changed_event(int cur)
{
***************
*** 1219,1226 ****
#define DICT_EXACT (2) // "dict" is the exact name of a file
/*
! * Add any identifiers that match the given pattern in the list of dictionary
! * files "dict_start" to the list of completions.
*/
static void
ins_compl_dictionaries(
--- 1223,1230 ----
#define DICT_EXACT (2) // "dict" is the exact name of a file
/*
! * Add any identifiers that match the given pattern "pat" in the list of
! * dictionary files "dict_start" to the list of completions.
*/
static void
ins_compl_dictionaries(
***************
*** 1346,1351 ****
--- 1350,1415 ----
vim_free(buf);
}
+ /*
+ * Add all the words in the line "*buf_arg" from the thesaurus file "fname"
+ * skipping the word at 'skip_word'. Returns OK on success.
+ */
+ static int
+ thesarurs_add_words_in_line(
+ char_u *fname,
+ char_u **buf_arg,
+ int dir,
+ char_u *skip_word)
+ {
+ int status = OK;
+ char_u *ptr;
+ char_u *wstart;
+
+ // Add the other matches on the line
+ ptr = *buf_arg;
+ while (!got_int)
+ {
+ // Find start of the next word. Skip white
+ // space and punctuation.
+ ptr = find_word_start(ptr);
+ if (*ptr == NUL || *ptr == NL)
+ break;
+ wstart = ptr;
+
+ // Find end of the word.
+ if (has_mbyte)
+ // Japanese words may have characters in
+ // different classes, only separate words
+ // with single-byte non-word characters.
+ while (*ptr != NUL)
+ {
+ int l = (*mb_ptr2len)(ptr);
+
+ if (l < 2 && !vim_iswordc(*ptr))
+ break;
+ ptr += l;
+ }
+ else
+ ptr = find_word_end(ptr);
+
+ // Add the word. Skip the regexp match.
+ if (wstart != skip_word)
+ {
+ status = ins_compl_add_infercase(wstart, (int)(ptr - wstart), p_ic,
+ fname, dir, FALSE);
+ if (status == FAIL)
+ break;
+ }
+ }
+
+ *buf_arg = ptr;
+ return status;
+ }
+
+ /*
+ * Process "count" dictionary/thesaurus "files" and add the text matching
+ * "regmatch".
+ */
static void
ins_compl_files(
int count,
***************
*** 1392,1432 ****
p_ic, files[i], *dir, FALSE);
if (thesaurus)
{
! char_u *wstart;
!
! // Add the other matches on the line
ptr = buf;
! while (!got_int)
! {
! // Find start of the next word. Skip white
! // space and punctuation.
! ptr = find_word_start(ptr);
! if (*ptr == NUL || *ptr == NL)
! break;
! wstart = ptr;
!
! // Find end of the word.
! if (has_mbyte)
! // Japanese words may have characters in
! // different classes, only separate words
! // with single-byte non-word characters.
! while (*ptr != NUL)
! {
! int l = (*mb_ptr2len)(ptr);
!
! if (l < 2 && !vim_iswordc(*ptr))
! break;
! ptr += l;
! }
! else
! ptr = find_word_end(ptr);
!
! // Add the word. Skip the regexp match.
! 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)
// if dir was BACKWARD then honor it just once
--- 1456,1465 ----
p_ic, files[i], *dir, FALSE);
if (thesaurus)
{
! // For a thesaurus, add all the words in the line
ptr = buf;
! add_r = thesarurs_add_words_in_line(files[i], &ptr, *dir,
! regmatch->startp[0]);
}
if (add_r == OK)
// if dir was BACKWARD then honor it just once
***************
*** 1649,1663 ****
vim_free(compl_leader);
compl_leader = vim_strnsave(line + compl_col, (p - line) - compl_col);
! if (compl_leader != NULL)
! {
! ins_compl_new_leader();
! if (compl_shown_match != NULL)
! // Make sure current match is not a hidden item.
! compl_curr_match = compl_shown_match;
! return NUL;
! }
! return K_BS;
}
/*
--- 1682,1695 ----
vim_free(compl_leader);
compl_leader = vim_strnsave(line + compl_col, (p - line) - compl_col);
! if (compl_leader == NULL)
! return K_BS;
!
! ins_compl_new_leader();
! if (compl_shown_match != NULL)
! // Make sure current match is not a hidden item.
! compl_curr_match = compl_shown_match;
! return NUL;
}
/*
***************
*** 2795,2800 ****
--- 2827,2836 ----
return (char_u *)"";
}
+ /*
+ * Assign the sequence number to all the completion matches which don't have
+ * one assigned yet.
+ */
static void
ins_compl_update_sequence_numbers()
{
***************
*** 4853,4858 ****
--- 4889,4897 ----
return OK;
}
+ /*
+ * Remove (if needed) and show the popup menu
+ */
static void
show_pum(int prev_w_wrow, int prev_w_leftcol)
{
*** ../vim-8.2.3988/src/testdir/test_edit.vim 2021-12-26 10:51:33.711079465
+0000
--- src/testdir/test_edit.vim 2022-01-03 10:57:35.071793788 +0000
***************
*** 733,740 ****
call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''],
getline(1, '$'), e)
!
! set noignorecase noinfercase complete&
bw!
endfor
endfunc
--- 733,745 ----
call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''],
getline(1, '$'), e)
! set noignorecase noinfercase
! %d
! call setline(1, ['one word', 'two word'])
! exe "normal! Goo\<C-P>\<C-X>\<C-P>"
! call assert_equal('one word', getline(3))
! %d
! set complete&
bw!
endfor
endfunc
***************
*** 900,905 ****
--- 905,927 ----
bw!
endfunc
+ " Test thesaurus completion with different encodings
+ func Test_thesaurus_complete_with_encoding()
+ call writefile(['angry furious mad enraged'], 'Xthesaurus')
+ set thesaurus=Xthesaurus
+ for e in ['latin1', 'utf-8']
+ exe 'set encoding=' .. e
+ new
+ call setline(1, 'mad')
+ call cursor(1, 1)
+ call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix')
+ call assert_equal(['mad', ''], getline(1, '$'))
+ bw!
+ endfor
+ set thesaurus=
+ call delete('Xthesaurus')
+ endfunc
+
" Test 'thesaurusfunc'
func MyThesaurus(findstart, base)
let mythesaurus = [
*** ../vim-8.2.3988/src/testdir/test_ins_complete.vim 2021-12-30
11:40:49.936654054 +0000
--- src/testdir/test_ins_complete.vim 2022-01-03 10:57:35.071793788 +0000
***************
*** 709,714 ****
--- 709,729 ----
call assert_equal([], complete_info(['items']).items)
endfunc
+ " Test for recursively starting completion mode using complete()
+ func Test_recursive_complete_func()
+ func ListColors()
+ call complete(5, ["red", "blue"])
+ return ''
+ endfunc
+ new
+ call setline(1, ['a1', 'a2'])
+ set complete=.
+ exe "normal Goa\<C-X>\<C-L>\<C-R>=ListColors()\<CR>\<C-N>"
+ call assert_equal('a2blue', getline(3))
+ delfunc ListColors
+ bw!
+ endfunc
+
" Test for completing words following a completed word in a line
func Test_complete_wrapscan()
" complete words from another buffer
***************
*** 932,937 ****
--- 947,1037 ----
set completeslash=
endfunc
+ " Test for 'longest' setting in 'completeopt' with latin1 and utf-8 encodings
+ func Test_complete_longest_match()
+ for e in ['latin1', 'utf-8']
+ exe 'set encoding=' .. e
+ new
+ set complete=.
+ set completeopt=menu,longest
+ call setline(1, ['pfx_a1', 'pfx_a12', 'pfx_a123', 'pfx_b1'])
+ exe "normal Gopfx\<C-P>"
+ call assert_equal('pfx_', getline(5))
+ bw!
+ endfor
+
+ " Test for completing additional words with longest match set
+ new
+ call setline(1, ['abc1', 'abd2'])
+ exe "normal Goab\<C-P>\<C-X>\<C-P>"
+ call assert_equal('ab', getline(3))
+ bw!
+ set complete& completeopt&
+ endfunc
+
+ " Test for removing the first displayed completion match and selecting the
+ " match just before that.
+ func Test_complete_erase_firstmatch()
+ new
+ call setline(1, ['a12', 'a34', 'a56'])
+ set complete=.
+ exe "normal Goa\<C-P>\<BS>\<BS>3\<CR>"
+ call assert_equal('a34', getline('$'))
+ set complete&
+ bw!
+ endfunc
+
+ " Test for completing whole lines from unloaded buffers
+ func Test_complete_wholeline_unloadedbuf()
+ call writefile(['a line1', 'a line2', 'a line3'], "Xfile1")
+ edit Xfile1
+ enew
+ set complete=u
+ exe "normal! ia\<C-X>\<C-L>\<C-P>"
+ call assert_equal('a line2', getline(1))
+ %d
+ " completing from an unlisted buffer should fail
+ bdel Xfile1
+ exe "normal! ia\<C-X>\<C-L>\<C-P>"
+ call assert_equal('a', getline(1))
+ set complete&
+ %bw!
+ call delete("Xfile1")
+ endfunc
+
+ " Test for completing whole lines from unlisted buffers
+ func Test_complete_wholeline_unlistedbuf()
+ call writefile(['a line1', 'a line2', 'a line3'], "Xfile1")
+ edit Xfile1
+ enew
+ set complete=U
+ " completing from a unloaded buffer should fail
+ exe "normal! ia\<C-X>\<C-L>\<C-P>"
+ call assert_equal('a', getline(1))
+ %d
+ bdel Xfile1
+ exe "normal! ia\<C-X>\<C-L>\<C-P>"
+ call assert_equal('a line2', getline(1))
+ set complete&
+ %bw!
+ call delete("Xfile1")
+ endfunc
+
+ " Test for adding a multibyte character using CTRL-L in completion mode
+ func Test_complete_mbyte_char_add()
+ new
+ set complete=.
+ call setline(1, 'abė')
+ exe "normal! oa\<C-P>\<BS>\<BS>\<C-L>\<C-L>"
+ call assert_equal('abė', getline(2))
+ " Test for a leader with multibyte character
+ %d
+ call setline(1, 'abėĕ')
+ exe "normal! oabė\<C-P>"
+ call assert_equal('abėĕ', getline(2))
+ bw!
+ endfunc
+
" Test to ensure 'Scanning...' messages are not recorded in messages history
func Test_z1_complete_no_history()
new
*** ../vim-8.2.3988/src/version.c 2022-01-02 21:46:25.313652743 +0000
--- src/version.c 2022-01-03 11:01:06.183196311 +0000
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 3989,
/**/
--
hundred-and-one symptoms of being an internet addict:
199. You read this entire list of symptoms, looking for something
that doesn't describe you.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ 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].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20220103110432.661561C11B3%40moolenaar.net.