diff --git a/src/insexpand.c b/src/insexpand.c index 49c7ee27f2..41aa3f9990 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -2541,6 +2541,10 @@ ins_compl_stop(int c, int prev_mode, int retval) int want_cindent; char_u *word = NULL; + // Remove pre-inserted text when present. + if (ins_compl_preinsert_effect()) + ins_compl_delete(); + // Get here when we have finished typing a sequence of ^N and // ^P or other completion characters in CTRL-X mode. Free up // memory that was used, and make sure we can redo the insert. diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 5d0e54038c..88d1c16616 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -3202,53 +3202,55 @@ function Test_completeopt_preinsert() endfunc set omnifunc=Omni_test set completeopt=menu,menuone,preinsert + func GetLine() + let g:line = getline('.') + let g:col = col('.') + endfunc new - call feedkeys("S\\f", 'tx') - call assert_equal("fobar", getline('.')) - call feedkeys("\\", 'tx') + inoremap =GetLine() + call feedkeys("S\\f\\", 'tx') + call assert_equal("fobar", g:line) + call assert_equal(2, g:col) - call feedkeys("S\\foo", 'tx') - call assert_equal("foobar", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("S\\foo\", 'tx') + call assert_equal("foobar", g:line) call feedkeys("S\\foo\\\", 'tx') call assert_equal("", getline('.')) - call feedkeys("\\", 'tx') " delete a character and input new leader - call feedkeys("S\\foo\b", 'tx') - call assert_equal("fobar", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("S\\foo\b\\", 'tx') + call assert_equal("fobar", g:line) + call assert_equal(4, g:col) " delete preinsert when prepare completion call feedkeys("S\\f\", 'tx') call assert_equal("f ", getline('.')) - call feedkeys("\\", 'tx') - call feedkeys("S\\你", 'tx') - call assert_equal("你的", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("S\\你\\", 'tx') + call assert_equal("你的", g:line) + call assert_equal(4, g:col) - call feedkeys("S\\你好", 'tx') - call assert_equal("你好世界", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("S\\你好\\", 'tx') + call assert_equal("你好世界", g:line) + call assert_equal(7, g:col) - call feedkeys("Shello wo\\\\\f", 'tx') - call assert_equal("hello fobar wo", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("Shello wo\\\\\f\\", 'tx') + call assert_equal("hello fobar wo", g:line) + call assert_equal(9, g:col) - call feedkeys("Shello wo\\\\\f\", 'tx') - call assert_equal("hello wo", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("Shello wo\\\\\f\\\", 'tx') + call assert_equal("hello wo", g:line) + call assert_equal(8, g:col) - call feedkeys("Shello wo\\\\\foo", 'tx') - call assert_equal("hello foobar wo", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("Shello wo\\\\\foo\\", 'tx') + call assert_equal("hello foobar wo", g:line) + call assert_equal(11, g:col) - call feedkeys("Shello wo\\\\\foo\b", 'tx') - call assert_equal("hello fobar wo", getline('.')) - call feedkeys("\\", 'tx') + call feedkeys("Shello wo\\\\\foo\b\\", 'tx') + call assert_equal("hello fobar wo", g:line) + call assert_equal(11, g:col) " confirm call feedkeys("S\\f\", 'tx') @@ -3260,9 +3262,9 @@ function Test_completeopt_preinsert() call assert_equal("fo", getline('.')) call assert_equal(2, col('.')) - call feedkeys("S hello hero\h\\", 'tx') - call assert_equal("hello", getline('.')) - call assert_equal(1, col('.')) + call feedkeys("S hello hero\h\\\\", 'tx') + call assert_equal("hello", g:line) + call assert_equal(2, col('.')) call feedkeys("Sh\\\", 'tx') call assert_equal("hello", getline('.')) @@ -3282,17 +3284,17 @@ function Test_completeopt_preinsert() call assert_equal(1, col('.')) " whole line - call feedkeys("Shello hero\\\", 'tx') - call assert_equal("hello hero", getline('.')) - call assert_equal(1, col('.')) + call feedkeys("Shello hero\\\\\", 'tx') + call assert_equal("hello hero", g:line) + call assert_equal(1, g:col) - call feedkeys("Shello hero\he\\", 'tx') - call assert_equal("hello hero", getline('.')) - call assert_equal(2, col('.')) + call feedkeys("Shello hero\he\\\\", 'tx') + call assert_equal("hello hero", g:line) + call assert_equal(3, g:col) - call feedkeys("Shello hero\h\\er", 'tx') - call assert_equal("hero", getline('.')) - call assert_equal(3, col('.')) + call feedkeys("Shello hero\h\\er\\", 'tx') + call assert_equal("hero", g:line) + call assert_equal(4, g:col) " can not work with fuzzy set cot+=fuzzy @@ -3302,13 +3304,13 @@ function Test_completeopt_preinsert() " test for fuzzy and noinsert set cot+=noinsert - call feedkeys("S\\fb", 'tx') - call assert_equal("fb", getline('.')) - call assert_equal(2, col('.')) + call feedkeys("S\\fb\\", 'tx') + call assert_equal("fb", g:line) + call assert_equal(3, g:col) - call feedkeys("S\\你", 'tx') - call assert_equal("你", getline('.')) - call assert_equal(1, col('.')) + call feedkeys("S\\你\\", 'tx') + call assert_equal("你", g:line) + call assert_equal(4, g:col) call feedkeys("S\\fb\", 'tx') call assert_equal("fobar", getline('.')) @@ -3321,9 +3323,15 @@ function Test_completeopt_preinsert() call assert_equal(7, col('.')) set cot=preinsert,menuone - call feedkeys("Sfoo1 foo2\f\\", 'tx') - call assert_equal("foo1", getline('.')) - call assert_equal(1, col('.')) + call feedkeys("Sfoo1 foo2\f\\\\", 'tx') + call assert_equal("foo1", g:line) + call assert_equal(2, g:col) + + inoremap call complete(4, [{'word': "fobar"}, {'word': "foobar"}]) + call feedkeys("Swp.\\\\", 'tx') + call assert_equal("wp.fobar", g:line) + call assert_equal(4, g:col) + call assert_equal("wp.", getline('.')) bw! set cot& diff --git a/src/version.c b/src/version.c index fe8dceba75..a5833422c3 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1205, /**/ 1204, /**/