Mercurial > vim
comparison src/testdir/test_ins_complete.vim @ 26618:b531c26f728b v8.2.3838
patch 8.2.3838: cannot use script-local function for setting *func options
Commit: https://github.com/vim/vim/commit/db1a410b610b2c1941311acc57dcc4afec20720e
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Fri Dec 17 16:21:20 2021 +0000
patch 8.2.3838: cannot use script-local function for setting *func options
Problem: Cannot use script-local function for setting *func options.
Solution: Use the script context. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/9362)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 17 Dec 2021 17:30:04 +0100 |
parents | 33d680d372aa |
children | 80e134cbee4b |
comparison
equal
deleted
inserted
replaced
26617:86ca0d6a6a34 | 26618:b531c26f728b |
---|---|
878 call add(g:CompleteFunc2Args, [a:findstart, a:base]) | 878 call add(g:CompleteFunc2Args, [a:findstart, a:base]) |
879 return a:findstart ? 0 : [] | 879 return a:findstart ? 0 : [] |
880 endfunc | 880 endfunc |
881 | 881 |
882 let lines =<< trim END | 882 let lines =<< trim END |
883 #" Test for using a function name | 883 #" Test for using a global function name |
884 LET &completefunc = 'g:CompleteFunc2' | 884 LET &completefunc = 'g:CompleteFunc2' |
885 new | 885 new |
886 call setline(1, 'zero') | 886 call setline(1, 'global') |
887 LET g:CompleteFunc2Args = [] | 887 LET g:CompleteFunc2Args = [] |
888 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 888 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
889 call assert_equal([[1, ''], [0, 'zero']], g:CompleteFunc2Args) | 889 call assert_equal([[1, ''], [0, 'global']], g:CompleteFunc2Args) |
890 bw! | 890 bw! |
891 | 891 |
892 #" Test for using a function() | 892 #" Test for using a function() |
893 set completefunc=function('g:CompleteFunc1',\ [10]) | 893 set completefunc=function('g:CompleteFunc1',\ [10]) |
894 new | 894 new |
1020 call assert_equal([[1, ''], [0, 'five']], g:CompleteFunc2Args) | 1020 call assert_equal([[1, ''], [0, 'five']], g:CompleteFunc2Args) |
1021 bw! | 1021 bw! |
1022 END | 1022 END |
1023 call CheckLegacyAndVim9Success(lines) | 1023 call CheckLegacyAndVim9Success(lines) |
1024 | 1024 |
1025 " Test for using a script-local function name | |
1026 func s:CompleteFunc3(findstart, base) | |
1027 call add(g:CompleteFunc3Args, [a:findstart, a:base]) | |
1028 return a:findstart ? 0 : [] | |
1029 endfunc | |
1030 set completefunc=s:CompleteFunc3 | |
1031 new | |
1032 call setline(1, 'script1') | |
1033 let g:CompleteFunc3Args = [] | |
1034 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1035 call assert_equal([[1, ''], [0, 'script1']], g:CompleteFunc3Args) | |
1036 bw! | |
1037 | |
1038 let &completefunc = 's:CompleteFunc3' | |
1039 new | |
1040 call setline(1, 'script2') | |
1041 let g:CompleteFunc3Args = [] | |
1042 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1043 call assert_equal([[1, ''], [0, 'script2']], g:CompleteFunc3Args) | |
1044 bw! | |
1045 delfunc s:CompleteFunc3 | |
1046 | |
1047 " invalid return value | |
1025 let &completefunc = {a -> 'abc'} | 1048 let &completefunc = {a -> 'abc'} |
1026 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 1049 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
1027 | 1050 |
1028 " Using Vim9 lambda expression in legacy context should fail | 1051 " Using Vim9 lambda expression in legacy context should fail |
1029 set completefunc=(a,\ b)\ =>\ CompleteFunc1(21,\ a,\ b) | 1052 set completefunc=(a,\ b)\ =>\ CompleteFunc1(21,\ a,\ b) |
1054 | 1077 |
1055 " Vim9 tests | 1078 " Vim9 tests |
1056 let lines =<< trim END | 1079 let lines =<< trim END |
1057 vim9script | 1080 vim9script |
1058 | 1081 |
1059 # Test for using a def function with completefunc | 1082 def Vim9CompleteFunc(callnr: number, findstart: number, base: string): any |
1060 def Vim9CompleteFunc(val: number, findstart: number, base: string): any | 1083 add(g:Vim9completeFuncArgs, [callnr, findstart, base]) |
1061 add(g:Vim9completeFuncArgs, [val, findstart, base]) | |
1062 return findstart ? 0 : [] | 1084 return findstart ? 0 : [] |
1063 enddef | 1085 enddef |
1086 | |
1087 # Test for using a def function with completefunc | |
1064 set completefunc=function('Vim9CompleteFunc',\ [60]) | 1088 set completefunc=function('Vim9CompleteFunc',\ [60]) |
1065 new | only | 1089 new | only |
1066 setline(1, 'one') | 1090 setline(1, 'one') |
1067 g:Vim9completeFuncArgs = [] | 1091 g:Vim9completeFuncArgs = [] |
1068 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 1092 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
1069 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9completeFuncArgs) | 1093 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9completeFuncArgs) |
1094 bw! | |
1095 | |
1096 # Test for using a global function name | |
1097 &completefunc = g:CompleteFunc2 | |
1098 new | only | |
1099 setline(1, 'two') | |
1100 g:CompleteFunc2Args = [] | |
1101 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1102 assert_equal([[1, ''], [0, 'two']], g:CompleteFunc2Args) | |
1103 bw! | |
1104 | |
1105 # Test for using a script-local function name | |
1106 def s:LocalCompleteFunc(findstart: number, base: string): any | |
1107 add(g:LocalCompleteFuncArgs, [findstart, base]) | |
1108 return findstart ? 0 : [] | |
1109 enddef | |
1110 &completefunc = s:LocalCompleteFunc | |
1111 new | only | |
1112 setline(1, 'three') | |
1113 g:LocalCompleteFuncArgs = [] | |
1114 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1115 assert_equal([[1, ''], [0, 'three']], g:LocalCompleteFuncArgs) | |
1070 bw! | 1116 bw! |
1071 END | 1117 END |
1072 call CheckScriptSuccess(lines) | 1118 call CheckScriptSuccess(lines) |
1073 | 1119 |
1074 " cleanup | 1120 " cleanup |
1231 call assert_equal([[1, ''], [0, 'nine']], g:OmniFunc2Args) | 1277 call assert_equal([[1, ''], [0, 'nine']], g:OmniFunc2Args) |
1232 bw! | 1278 bw! |
1233 END | 1279 END |
1234 call CheckLegacyAndVim9Success(lines) | 1280 call CheckLegacyAndVim9Success(lines) |
1235 | 1281 |
1282 " Test for using a script-local function name | |
1283 func s:OmniFunc3(findstart, base) | |
1284 call add(g:OmniFunc3Args, [a:findstart, a:base]) | |
1285 return a:findstart ? 0 : [] | |
1286 endfunc | |
1287 set omnifunc=s:OmniFunc3 | |
1288 new | |
1289 call setline(1, 'script1') | |
1290 let g:OmniFunc3Args = [] | |
1291 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1292 call assert_equal([[1, ''], [0, 'script1']], g:OmniFunc3Args) | |
1293 bw! | |
1294 | |
1295 let &omnifunc = 's:OmniFunc3' | |
1296 new | |
1297 call setline(1, 'script2') | |
1298 let g:OmniFunc3Args = [] | |
1299 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1300 call assert_equal([[1, ''], [0, 'script2']], g:OmniFunc3Args) | |
1301 bw! | |
1302 delfunc s:OmniFunc3 | |
1303 | |
1304 " invalid return value | |
1236 let &omnifunc = {a -> 'abc'} | 1305 let &omnifunc = {a -> 'abc'} |
1237 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1306 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1238 | 1307 |
1239 " Using Vim9 lambda expression in legacy context should fail | 1308 " Using Vim9 lambda expression in legacy context should fail |
1240 set omnifunc=(a,\ b)\ =>\ OmniFunc1(21,\ a,\ b) | 1309 set omnifunc=(a,\ b)\ =>\ OmniFunc1(21,\ a,\ b) |
1265 | 1334 |
1266 " Vim9 tests | 1335 " Vim9 tests |
1267 let lines =<< trim END | 1336 let lines =<< trim END |
1268 vim9script | 1337 vim9script |
1269 | 1338 |
1270 # Test for using a def function with omnifunc | 1339 def Vim9omniFunc(callnr: number, findstart: number, base: string): any |
1271 def Vim9omniFunc(val: number, findstart: number, base: string): any | 1340 add(g:Vim9omniFunc_Args, [callnr, findstart, base]) |
1272 add(g:Vim9omniFunc_Args, [val, findstart, base]) | |
1273 return findstart ? 0 : [] | 1341 return findstart ? 0 : [] |
1274 enddef | 1342 enddef |
1343 | |
1344 # Test for using a def function with omnifunc | |
1275 set omnifunc=function('Vim9omniFunc',\ [60]) | 1345 set omnifunc=function('Vim9omniFunc',\ [60]) |
1276 new | only | 1346 new | only |
1277 setline(1, 'one') | 1347 setline(1, 'one') |
1278 g:Vim9omniFunc_Args = [] | 1348 g:Vim9omniFunc_Args = [] |
1279 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1349 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1280 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9omniFunc_Args) | 1350 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9omniFunc_Args) |
1351 bw! | |
1352 | |
1353 # Test for using a global function name | |
1354 &omnifunc = g:OmniFunc2 | |
1355 new | only | |
1356 setline(1, 'two') | |
1357 g:OmniFunc2Args = [] | |
1358 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1359 assert_equal([[1, ''], [0, 'two']], g:OmniFunc2Args) | |
1360 bw! | |
1361 | |
1362 # Test for using a script-local function name | |
1363 def s:LocalOmniFunc(findstart: number, base: string): any | |
1364 add(g:LocalOmniFuncArgs, [findstart, base]) | |
1365 return findstart ? 0 : [] | |
1366 enddef | |
1367 &omnifunc = s:LocalOmniFunc | |
1368 new | only | |
1369 setline(1, 'three') | |
1370 g:LocalOmniFuncArgs = [] | |
1371 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1372 assert_equal([[1, ''], [0, 'three']], g:LocalOmniFuncArgs) | |
1281 bw! | 1373 bw! |
1282 END | 1374 END |
1283 call CheckScriptSuccess(lines) | 1375 call CheckScriptSuccess(lines) |
1284 | 1376 |
1285 " cleanup | 1377 " cleanup |
1465 call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:TsrFunc1Args) | 1557 call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:TsrFunc1Args) |
1466 :%bw! | 1558 :%bw! |
1467 END | 1559 END |
1468 call CheckLegacyAndVim9Success(lines) | 1560 call CheckLegacyAndVim9Success(lines) |
1469 | 1561 |
1562 " Test for using a script-local function name | |
1563 func s:TsrFunc3(findstart, base) | |
1564 call add(g:TsrFunc3Args, [a:findstart, a:base]) | |
1565 return a:findstart ? 0 : [] | |
1566 endfunc | |
1567 set tsrfu=s:TsrFunc3 | |
1568 new | |
1569 call setline(1, 'script1') | |
1570 let g:TsrFunc3Args = [] | |
1571 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1572 call assert_equal([[1, ''], [0, 'script1']], g:TsrFunc3Args) | |
1573 bw! | |
1574 | |
1575 let &tsrfu = 's:TsrFunc3' | |
1576 new | |
1577 call setline(1, 'script2') | |
1578 let g:TsrFunc3Args = [] | |
1579 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1580 call assert_equal([[1, ''], [0, 'script2']], g:TsrFunc3Args) | |
1581 bw! | |
1582 delfunc s:TsrFunc3 | |
1583 | |
1584 " invalid return value | |
1470 let &thesaurusfunc = {a -> 'abc'} | 1585 let &thesaurusfunc = {a -> 'abc'} |
1471 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1586 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1472 | 1587 |
1473 " Using Vim9 lambda expression in legacy context should fail | 1588 " Using Vim9 lambda expression in legacy context should fail |
1474 set thesaurusfunc=(a,\ b)\ =>\ TsrFunc1(21,\ a,\ b) | 1589 set thesaurusfunc=(a,\ b)\ =>\ TsrFunc1(21,\ a,\ b) |
1512 | 1627 |
1513 " Vim9 tests | 1628 " Vim9 tests |
1514 let lines =<< trim END | 1629 let lines =<< trim END |
1515 vim9script | 1630 vim9script |
1516 | 1631 |
1517 # Test for using a def function with thesaurusfunc | 1632 def Vim9tsrFunc(callnr: number, findstart: number, base: string): any |
1518 def Vim9tsrFunc(val: number, findstart: number, base: string): any | 1633 add(g:Vim9tsrFunc_Args, [callnr, findstart, base]) |
1519 add(g:Vim9tsrFunc_Args, [val, findstart, base]) | |
1520 return findstart ? 0 : [] | 1634 return findstart ? 0 : [] |
1521 enddef | 1635 enddef |
1636 | |
1637 # Test for using a def function with thesaurusfunc | |
1522 set thesaurusfunc=function('Vim9tsrFunc',\ [60]) | 1638 set thesaurusfunc=function('Vim9tsrFunc',\ [60]) |
1523 new | only | 1639 new | only |
1524 setline(1, 'one') | 1640 setline(1, 'one') |
1525 g:Vim9tsrFunc_Args = [] | 1641 g:Vim9tsrFunc_Args = [] |
1526 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1642 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1527 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9tsrFunc_Args) | 1643 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9tsrFunc_Args) |
1528 bw! | 1644 bw! |
1645 | |
1646 # Test for using a global function name | |
1647 &thesaurusfunc = g:TsrFunc2 | |
1648 new | only | |
1649 setline(1, 'two') | |
1650 g:TsrFunc2Args = [] | |
1651 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1652 assert_equal([[1, ''], [0, 'two']], g:TsrFunc2Args) | |
1653 bw! | |
1654 | |
1655 # Test for using a script-local function name | |
1656 def s:LocalTsrFunc(findstart: number, base: string): any | |
1657 add(g:LocalTsrFuncArgs, [findstart, base]) | |
1658 return findstart ? 0 : [] | |
1659 enddef | |
1660 &thesaurusfunc = s:LocalTsrFunc | |
1661 new | only | |
1662 setline(1, 'three') | |
1663 g:LocalTsrFuncArgs = [] | |
1664 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1665 assert_equal([[1, ''], [0, 'three']], g:LocalTsrFuncArgs) | |
1666 bw! | |
1529 END | 1667 END |
1530 call CheckScriptSuccess(lines) | 1668 call CheckScriptSuccess(lines) |
1531 | 1669 |
1532 " cleanup | 1670 " cleanup |
1533 set thesaurusfunc& | 1671 set thesaurusfunc& |