patch 9.1.1409: using f-flag in 'complete' conflicts with Neovim

Commit: 
https://github.com/vim/vim/commit/14f6da5ba8d602263fc7bf6cb899c8520f4c3060
Author: Girish Palya <giris...@gmail.com>
Date:   Mon May 26 19:04:25 2025 +0200

    patch 9.1.1409: using f-flag in 'complete' conflicts with Neovim
    
    Problem:  using f-flag in 'complete' conflicts with Neovims filename
              completion (glepnir, after v9.1.1301).
    Solution: use upper-case "F" flag for completion functions
              (Girish Palya).
    
    fixes: #17347
    closes: #17378
    
    Signed-off-by: Girish Palya <giris...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index f0a7e9eef..b1f3e1506 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2085,7 +2085,7 @@ A jump table for the options with a short description can 
be found at |Q_op|.
                |i_CTRL-X_CTRL-D|
        ]       tag completion
        t       same as "]"
-       f{func} call the function {func}.  Multiple "f" flags may be specified.
+       F{func} call the function {func}.  Multiple "F" flags may be specified.
                Refer to |complete-functions| for details on how the function
                is invoked and what it should return.  The value can be the
                name of a function or a |Funcref|.  For |Funcref| values,
@@ -2103,9 +2103,9 @@ A jump table for the options with a short description can 
be found at |Q_op|.
                If generating matches is potentially slow, |complete_check()|
                should be used to avoid blocking and preserve editor
                responsiveness.
-       f       equivalent to using "f{func}", where the function is taken from
+       F       equivalent to using "F{func}", where the function is taken from
                the 'completefunc' option.
-       o       equivalent to using "f{func}", where the function is taken from
+       o       equivalent to using "F{func}", where the function is taken from
                the 'omnifunc' option.
 
        Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index 662cb1771..5cffb6351 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -41624,8 +41624,8 @@ Completion: ~
 - New option value for 'wildmode':
        "noselect"      - do not auto select an entry in the wildmenu
 - New flags for 'complete':
-       "f{func}"       - complete using given function
-       "f"             - complete using 'completefunc'
+       "F{func}"       - complete using given function
+       "F"             - complete using 'completefunc'
        "o"             - complete using 'omnifunc'
 - allow to limit matches for the 'complete' sources by using the
   "{flag}^<limit>" notation
diff --git a/src/insexpand.c b/src/insexpand.c
index c7d6fd428..700f734cb 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -4091,7 +4091,7 @@ process_next_cpt_value(
            }
        }
 #ifdef FEAT_COMPL_FUNC
-       else if (*st->e_cpt == 'f' || *st->e_cpt == 'o')
+       else if (*st->e_cpt == 'F' || *st->e_cpt == 'o')
        {
            compl_type = CTRL_X_FUNCTION;
            if (*st->e_cpt == 'o')
@@ -6916,7 +6916,7 @@ cpt_compl_refresh(void)
        {
            if (*p == 'o')
                cb = &curbuf->b_ofu_cb;
-           else if (*p == 'f')
+           else if (*p == 'F')
                cb = (*(p + 1) != ',' && *(p + 1) != NUL)
                    ? get_cpt_func_callback(p + 1) : &curbuf->b_cfu_cb;
            if (cb)
diff --git a/src/optionstr.c b/src/optionstr.c
index b286767e3..603d0f425 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -1594,10 +1594,10 @@ did_set_complete(optset_T *args)
        }
        *buf_ptr = NUL;
 
-       if (vim_strchr((char_u *)".wbuksid]tUfo", *buffer) == NULL)
+       if (vim_strchr((char_u *)".wbuksid]tUFo", *buffer) == NULL)
            return illegal_char(args->os_errbuf, args->os_errbuflen, *buffer);
 
-       if (vim_strchr((char_u *)"ksf", *buffer) == NULL && *(buffer + 1) != NUL
+       if (vim_strchr((char_u *)"ksF", *buffer) == NULL && *(buffer + 1) != NUL
                && *(buffer + 1) != '^')
            char_before = *buffer;
        else
@@ -1642,7 +1642,7 @@ did_set_complete(optset_T *args)
 expand_set_complete(optexpand_T *args, int *numMatches, char_u ***matches)
 {
     static char *(p_cpt_values[]) = {
-       ".", "w", "b", "u", "k", "kspell", "s", "i", "d", "]", "t", "U", "f", 
"o",
+       ".", "w", "b", "u", "k", "kspell", "s", "i", "d", "]", "t", "U", "F", 
"o",
        NULL};
     return expand_set_opt_string(
            args,
diff --git a/src/testdir/test_ins_complete.vim 
b/src/testdir/test_ins_complete.vim
index 2a2df5177..06ab6cfa9 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -225,7 +225,7 @@ func Test_completefunc_args()
   call assert_equal(0, s:args[1][0])
   set omnifunc=
 
-  set complete=fCompleteFunc
+  set complete=FCompleteFunc
   call feedkeys("i\<C-N>\<Esc>", 'x')
   call assert_equal([1, 1], s:args[0])
   call assert_equal(0, s:args[1][0])
@@ -299,7 +299,7 @@ func Test_CompleteDoneNone()
   call assert_equal(oldline, newline)
   let s:called_completedone = 0
 
-  set complete=f<SID>CompleteDone_CompleteFuncNone
+  set complete=F<SID>CompleteDone_CompleteFuncNone
   execute "normal a\<C-N>\<C-Y>"
   set complete&
   let newline = join(map(range(&columns), 'nr2char(screenchar(&lines-1, 
v:val+1))'), '')
@@ -326,7 +326,7 @@ func Test_CompleteDone_vevent_keys()
   endfunc
   set omnifunc=CompleteFunc
   set completefunc=CompleteFunc
-  set complete=.,fCompleteFunc
+  set complete=.,FCompleteFunc
   set completeopt+=menuone
 
   new
@@ -418,7 +418,7 @@ func Test_CompleteDoneDict()
   au CompleteDonePre * :call <SID>CompleteDone_CheckCompletedItemDict(2)
   au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDict(0)
 
-  set complete=.,f<SID>CompleteDone_CompleteFuncDict
+  set complete=.,F<SID>CompleteDone_CompleteFuncDict
   execute "normal a\<C-N>\<C-Y>"
   set complete&
 
@@ -471,7 +471,7 @@ func Test_CompleteDoneDictNoUserData()
 
   let s:called_completedone = 0
 
-  set complete=.,f<SID>CompleteDone_CompleteFuncDictNoUserData
+  set complete=.,F<SID>CompleteDone_CompleteFuncDictNoUserData
   execute "normal a\<C-N>\<C-Y>"
   set complete&
 
@@ -513,7 +513,7 @@ func Test_CompleteDoneList()
 
   let s:called_completedone = 0
 
-  set complete=.,f<SID>CompleteDone_CompleteFuncList
+  set complete=.,F<SID>CompleteDone_CompleteFuncList
   execute "normal a\<C-N>\<C-Y>"
   set complete&
 
@@ -522,7 +522,7 @@ func Test_CompleteDoneList()
 
   let s:called_completedone = 0
 
-  set complete=.,f
+  set complete=.,F
   execute "normal a\<C-N>\<C-Y>"
   set complete&
 
@@ -573,11 +573,11 @@ func Test_completefunc_info()
   call 
feedkeys("i\<C-X>\<C-U>\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
   call assert_equal("matched{'pum_visible': 1, 'mode': 'function', 'selected': 
0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''}]}", getline(1))
   %d
-  set complete=.,fCompleteTest
+  set complete=.,FCompleteTest
   call feedkeys("i\<C-N>\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
   call assert_equal("matched{'pum_visible': 1, 'mode': 'keyword', 'selected': 
0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''}]}", getline(1))
   %d
-  set complete=.,f
+  set complete=.,F
   call feedkeys("i\<C-N>\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
   call assert_equal("matched{'pum_visible': 1, 'mode': 'keyword', 'selected': 
0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''}]}", getline(1))
   set completeopt&
@@ -597,7 +597,7 @@ func Test_cpt_func_cursorcol()
     return v:none
   endfunc
 
-  set complete=fCptColTest
+  set complete=FCptColTest
   new
   call feedkeys("ifoo bar\<C-N>", "tx")
   bwipe!
@@ -689,12 +689,12 @@ func CompleteInfoTestUserDefinedFn(mvmt, idx, noselect)
   let completed = a:idx != -1 ? ['foo', 'bar', 'baz', 'qux']->get(a:idx) : ''
   call assert_equal(completed. "{'pum_visible': 1, 'mode': 'function', 
'selected': " . a:idx . ", 'items': " . items . "}", getline(1))
   %d
-  set complete=.,fCompleteInfoUserDefinedFn
+  set complete=.,FCompleteInfoUserDefinedFn
   call feedkeys("i\<C-N>" . a:mvmt . 
"\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
   let completed = a:idx != -1 ? ['foo', 'bar', 'baz', 'qux']->get(a:idx) : ''
   call assert_equal(completed. "{'pum_visible': 1, 'mode': 'keyword', 
'selected': " . a:idx . ", 'items': " . items . "}", getline(1))
   %d
-  set complete=.,f
+  set complete=.,F
   call feedkeys("i\<C-N>" . a:mvmt . 
"\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
   let completed = a:idx != -1 ? ['foo', 'bar', 'baz', 'qux']->get(a:idx) : ''
   call assert_equal(completed. "{'pum_visible': 1, 'mode': 'keyword', 
'selected': " . a:idx . ", 'items': " . items . "}", getline(1))
@@ -969,9 +969,9 @@ func Test_completefunc_error()
   set completefunc=CompleteFunc
   call setline(1, ['', 'abcd', ''])
   call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E565:')
-  set complete=fCompleteFunc
+  set complete=FCompleteFunc
   call assert_fails('exe "normal 2G$a\<C-N>"', 'E565:')
-  set complete=f
+  set complete=F
   call assert_fails('exe "normal 2G$a\<C-N>"', 'E565:')
 
   " delete text when called for the second time
@@ -985,9 +985,9 @@ func Test_completefunc_error()
   set completefunc=CompleteFunc2
   call setline(1, ['', 'abcd', ''])
   call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E565:')
-  set complete=fCompleteFunc2
+  set complete=FCompleteFunc2
   call assert_fails('exe "normal 2G$a\<C-N>"', 'E565:')
-  set complete=f
+  set complete=F
   call assert_fails('exe "normal 2G$a\<C-N>"', 'E565:')
 
   " Jump to a different window from the complete function
@@ -1002,10 +1002,10 @@ func Test_completefunc_error()
   new
   call assert_fails('exe "normal a\<C-X>\<C-U>"', 'E565:')
   %d
-  set complete=fCompleteFunc3
+  set complete=FCompleteFunc3
   call assert_fails('exe "normal a\<C-N>"', 'E565:')
   %d
-  set complete=f
+  set complete=F
   call assert_fails('exe "normal a\<C-N>"', 'E565:')
   close!
 
@@ -1029,11 +1029,11 @@ func Test_completefunc_invalid_data()
   exe "normal i\<C-X>\<C-U>"
   call assert_equal('moon', getline(1))
   %d
-  set complete=fCompleteFunc
+  set complete=FCompleteFunc
   exe "normal i\<C-N>"
   call assert_equal('moon', getline(1))
   %d
-  set complete=f
+  set complete=F
   exe "normal i\<C-N>"
   call assert_equal('moon', getline(1))
   set completefunc& complete&
@@ -1717,13 +1717,13 @@ func Test_complete_item_refresh_always()
   call assert_equal(6, g:CallCount)
   %d
   let g:CallCount = 0
-  set complete=fTcomplete
+  set complete=FTcomplete
   exe "normal! iup\<C-N>\<BS>\<BS>\<BS>\<BS>\<BS>"
   call assert_equal('up', getline(1))
   call assert_equal(6, g:CallCount)
   %d
   let g:CallCount = 0
-  set complete=f
+  set complete=F
   exe "normal! iup\<C-N>\<BS>\<BS>\<BS>\<BS>\<BS>"
   call assert_equal('up', getline(1))
   call assert_equal(6, g:CallCount)
@@ -1750,10 +1750,10 @@ func Test_cpt_func_refresh_always_fail()
     call assert_equal(-999, a:findstart) " Should not reach here
   endfunc
   new
-  set complete=ffunction('CompleteFail'\,\ [-2])
+  set complete=Ffunction('CompleteFail'\,\ [-2])
   exe "normal! ia\<C-N>"
   %d
-  set complete=ffunction('CompleteFail'\,\ [-3])
+  set complete=Ffunction('CompleteFail'\,\ [-3])
   exe "normal! ia\<C-N>"
   bw!
 
@@ -1771,7 +1771,7 @@ func Test_cpt_func_refresh_always_fail()
   endfunc
   new
   set completeopt=menuone,noselect
-  set complete=ffunction('CompleteFailIntermittent'\,\ [-2])
+  set complete=Ffunction('CompleteFailIntermittent'\,\ [-2])
   let g:CallCount = 0
   exe "normal! if\<C-N>\<c-r>=complete_info([\"items\"])\<cr>"
   call assert_match('''word'': ''foo''.*''word'': ''fbar''', getline(1))
@@ -1782,13 +1782,13 @@ func Test_cpt_func_refresh_always_fail()
   call assert_match('''selected'': -1.*''word'': ''foo1''.*''word'': 
''foo2''', getline(1))
   call assert_equal(2, g:CallCount)
   %d
-  set complete=ffunction('CompleteFailIntermittent'\,\ [-3])
+  set complete=Ffunction('CompleteFailIntermittent'\,\ [-3])
   let g:CallCount = 0
   exe "normal! if\<C-N>o\<c-r>=complete_info([\"items\", \"selected\"])\<cr>"
   call assert_match('''selected'': -1.*''word'': ''foo1''.*''word'': 
''foo2''', getline(1))
   call assert_equal(2, g:CallCount)
   %d
-  set complete=ffunction('CompleteFailIntermittent'\,\ [-2])
+  set complete=Ffunction('CompleteFailIntermittent'\,\ [-2])
   " completion mode is dismissed when there are no matches in list
   let g:CallCount = 0
   exe "normal! if\<C-N>oo\<c-r>=complete_info([\"items\"])\<cr>"
@@ -1801,7 +1801,7 @@ func Test_cpt_func_refresh_always_fail()
   call assert_equal(3, g:CallCount)
   %d
   " completion mode continues when matches from other sources present
-  set complete=.,ffunction('CompleteFailIntermittent'\,\ [-2])
+  set complete=.,Ffunction('CompleteFailIntermittent'\,\ [-2])
   call setline(1, 'fooo1')
   let g:CallCount = 0
   exe "normal! Gof\<C-N>oo\<c-r>=complete_info([\"items\", \"selected\"])\<cr>"
@@ -1817,7 +1817,7 @@ func Test_cpt_func_refresh_always_fail()
   call assert_equal(4, g:CallCount)
   %d
   " refresh will stop when -3 is returned
-  set complete=.,,\ ffunction('CompleteFailIntermittent'\,\ [-3])
+  set complete=.,,\ Ffunction('CompleteFailIntermittent'\,\ [-3])
   call setline(1, 'fooo1')
   let g:CallCount = 0
   exe "normal! Gof\<C-N>o\<bs>\<c-r>=complete_info([\"items\", 
\"selected\"])\<cr>"
@@ -1862,7 +1862,7 @@ func Test_cpt_select_item_refresh_always()
   endfunc
 
   new
-  set complete=.,ffunction('CompleteItemsSelect'\,\ [[]])
+  set complete=.,Ffunction('CompleteItemsSelect'\,\ [[]])
   call setline(1, "foobarbar")
   let g:CallCount = 0
   exe "normal! Gof\<c-n>\<c-n>\<c-r>=CompleteMenuWords()\<cr>"
@@ -1894,7 +1894,7 @@ func Test_cpt_select_item_refresh_always()
   call assert_equal(2, g:CallCount)
 
   %d
-  set complete=.,ffunction('CompleteItemsSelect'\,\ [['foonext']])
+  set complete=.,Ffunction('CompleteItemsSelect'\,\ [['foonext']])
   call setline(1, "foobarbar")
   let g:CallCount = 0
   exe "normal! Gof\<c-n>\<c-n>\<bs>\<c-r>=CompleteMenuWords()\<cr>"
@@ -1934,7 +1934,7 @@ func Test_cpt_select_item_refresh_always()
   call assert_equal(3, g:CallCount)
 
   %d
-  set complete=.,ffunction('CompleteItemsSelect'\,\ [['fo'\,\ 'foonext']])
+  set complete=.,Ffunction('CompleteItemsSelect'\,\ [['fo'\,\ 'foonext']])
   call setline(1, "foobarbar")
   let g:CallCount = 0
   exe "normal! Gof\<c-n>\<c-n>\<bs>\<c-r>=CompleteMenuWords()\<cr>"
@@ -1986,7 +1986,7 @@ func Test_cpt_multi_func_refresh_always()
   call assert_equal("f\x0e" . '{''matches'': [], ''selected'': -1}', 
getline(1))
 
   set completeopt=menuone,noselect
-  set complete=fCompleteItems1,fCompleteItems2
+  set complete=FCompleteItems1,FCompleteItems2
 
   new
   let g:CallCount1 = 0
@@ -2118,7 +2118,7 @@ func Test_cpt_func_callback()
 
   let lines =<< trim END
     #" Test for using a global function name
-    set complete=fg:CompleteFunc2
+    set complete=Fg:CompleteFunc2
     new
     call setline(1, 'global')
     LET g:CompleteFunc2Args = []
@@ -2128,7 +2128,7 @@ func Test_cpt_func_callback()
     bw!
 
     #" Test for using a function()
-    set complete=ffunction('g:CompleteFunc1'\,\ [10])
+    set complete=Ffunction('g:CompleteFunc1'\,\ [10])
     new
     call setline(1, 'one')
     LET g:CompleteFunc1Args = []
@@ -2138,7 +2138,7 @@ func Test_cpt_func_callback()
     bw!
 
     #" Using a funcref variable
-    set complete=ffuncref('g:CompleteFunc1'\,\ [11])
+    set complete=Ffuncref('g:CompleteFunc1'\,\ [11])
     new
     call setline(1, 'two')
     LET g:CompleteFunc1Args = []
@@ -2155,7 +2155,7 @@ func Test_cpt_func_callback()
     call add(g:CompleteFunc3Args, [a:findstart, a:base])
     return a:findstart ? 0 : []
   endfunc
-  set complete=fs:CompleteFunc3
+  set complete=Fs:CompleteFunc3
   new
   call setline(1, 'script1')
   let g:CompleteFunc3Args = []
@@ -2164,7 +2164,7 @@ func Test_cpt_func_callback()
   set complete&
   bw!
 
-  let &complete = 'fs:CompleteFunc3'
+  let &complete = 'Fs:CompleteFunc3'
   new
   call setline(1, 'script2')
   let g:CompleteFunc3Args = []
@@ -2182,7 +2182,7 @@ func Test_cpt_func_callback()
         add(CompleteFunc4Args, [findstart, base])
         return findstart ? 0 : []
       enddef
-      set complete=fCompleteFunc4
+      set complete=FCompleteFunc4
       new
       setline(1, 'script1')
       feedkeys("A\<C-N>\<Esc>", 'x')
@@ -2202,7 +2202,7 @@ func Test_cpt_func_callback()
     enddef
 
     # Test for using a def function with completefunc
-    set complete=ffunction('Vim9CompleteFunc'\,\ [60])
+    set complete=Ffunction('Vim9CompleteFunc'\,\ [60])
     new | only
     setline(1, 'one')
     g:Vim9completeFuncArgs = []
@@ -2211,7 +2211,7 @@ func Test_cpt_func_callback()
     bw!
 
     # Test for using a global function name
-    &complete = 'fg:CompleteFunc2'
+    &complete = 'Fg:CompleteFunc2'
     new | only
     setline(1, 'two')
     g:CompleteFunc2Args = []
@@ -2224,7 +2224,7 @@ func Test_cpt_func_callback()
       add(g:LocalCompleteFuncArgs, [findstart, base])
       return findstart ? 0 : []
     enddef
-    &complete = 'fLocalCompleteFunc'
+    &complete = 'FLocalCompleteFunc'
     new | only
     setline(1, 'three')
     g:LocalCompleteFuncArgs = []
@@ -3122,12 +3122,12 @@ func Test_complete_smartindent()
   let result = getline(1,'$')
   call assert_equal(['', '{','}',''], result)
   %d
-  setlocal complete=fFooBarComplete
+  setlocal complete=FFooBarComplete
   exe "norm! o{\<cr>\<c-n>\<c-p>}\<cr>\<esc>"
   let result = getline(1,'$')
   call assert_equal(['', '{','}',''], result)
   %d
-  setlocal complete=f
+  setlocal complete=F
   exe "norm! o{\<cr>\<c-n>\<c-p>}\<cr>\<esc>"
   let result = getline(1,'$')
   call assert_equal(['', '{','}',''], result)
@@ -4121,7 +4121,7 @@ func Test_complete_match_count()
 
   %d
   set completefunc=ComplFunc
-  set cpt=.^1,f^2
+  set cpt=.^1,F^2
   call setline(1, ["fo", "foo", "foobar", "fobarbaz"])
   exe "normal! Gof\<c-n>\<c-r>=PrintMenuWords()\<cr>"
   call assert_equal('fo{''matches'': [''fo'', ''foo1'', ''foo2''], 
''selected'': 0}', getline(5))
@@ -4156,7 +4156,7 @@ func Test_complete_match_count()
 
   %d
   call setline(1, ["foo"])
-  set cpt=fComplFunc^2,.
+  set cpt=FComplFunc^2,.
   exe "normal! Gof\<c-n>\<c-r>=PrintMenuWords()\<cr>"
   call assert_equal('foo1{''matches'': [''foo1'', ''foo2'', ''foo''], 
''selected'': 0}', getline(2))
   bw!
@@ -4173,7 +4173,7 @@ func Test_complete_match_count()
   endfunc
 
   new
-  set complete=.,ffunction('CompleteItemsSelect')^2
+  set complete=.,Ffunction('CompleteItemsSelect')^2
   call setline(1, "foobarbar")
   let g:CallCount = 0
   exe "normal! Gof\<c-n>\<c-n>\<c-r>=PrintMenuWords()\<cr>"
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 1f71e1f5d..867919872 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -274,7 +274,7 @@ func Test_complete()
   call assert_fails('set complete=ix', 'E535:')
   call assert_fails('set complete=x', 'E539:')
   call assert_fails('set complete=..', 'E535:')
-  set complete=.,w,b,u,k,\ s,i,d,],t,U,f,o
+  set complete=.,w,b,u,k,\ s,i,d,],t,U,F,o
   call assert_fails('set complete=i^-10', 'E535:')
   call assert_fails('set complete=i^x', 'E535:')
   call assert_fails('set complete=k^2,t^-1,s^', 'E535:')
@@ -282,13 +282,13 @@ func Test_complete()
   call assert_fails('set complete=kfoo^foo2', 'E535:')
   call assert_fails('set complete=kfoo^', 'E535:')
   call assert_fails('set complete=.^', 'E535:')
-  set complete=.,w,b,u,k,s,i,d,],t,U,f,o
+  set complete=.,w,b,u,k,s,i,d,],t,U,F,o
   set complete=.
   set complete=.^10,t^0
-  set complete+=ffuncref('foo'\,\ [10])
-  set complete=ffuncref('foo'\,\ [10])^10
+  set complete+=Ffuncref('foo'\,\ [10])
+  set complete=Ffuncref('foo'\,\ [10])^10
   set complete&
-  set complete+=ffunction('g:foo'\,\ [10\,\ 20])
+  set complete+=Ffunction('g:foo'\,\ [10\,\ 20])
   set complete&
 endfun
 
diff --git a/src/version.c b/src/version.c
index ceedc5f7e..a9d95e3fe 100644
--- a/src/version.c
+++ b/src/version.c
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1409,
 /**/
     1408,
 /**/

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1uJbPk-00H0VA-EJ%40256bit.org.

Raspunde prin e-mail lui