Mercurial > vim
comparison src/testdir/test_ins_complete.vim @ 26441:65ab0b035dd8 v8.2.3751
patch 8.2.3751: cannot assign a lambda to an option that takes a function
Commit: https://github.com/vim/vim/commit/6409553b6e3b4de4e1d72b8ee5445595214581ff
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Mon Dec 6 11:03:55 2021 +0000
patch 8.2.3751: cannot assign a lambda to an option that takes a function
Problem: Cannot assign a lambda to an option that takes a function.
Solution: Automatically convert the lambda to a string. (Yegappan
Lakshmanan, closes #9286)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 06 Dec 2021 12:15:04 +0100 |
parents | 8f17f8f327f3 |
children | 65b4109a4297 |
comparison
equal
deleted
inserted
replaced
26440:f6f5f604c17c | 26441:65ab0b035dd8 |
---|---|
883 call assert_equal([[1, ''], [0, 'one']], g:MycompleteFunc1_args) | 883 call assert_equal([[1, ''], [0, 'one']], g:MycompleteFunc1_args) |
884 bw! | 884 bw! |
885 | 885 |
886 " Using a funcref variable to set 'completefunc' | 886 " Using a funcref variable to set 'completefunc' |
887 let Fn = function('MycompleteFunc1') | 887 let Fn = function('MycompleteFunc1') |
888 let &completefunc = string(Fn) | 888 let &completefunc = Fn |
889 new | only | 889 new | only |
890 call setline(1, 'two') | 890 call setline(1, 'two') |
891 let g:MycompleteFunc1_args = [] | 891 let g:MycompleteFunc1_args = [] |
892 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 892 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
893 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args) | 893 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args) |
894 call assert_fails('let &completefunc = Fn', 'E729:') | 894 bw! |
895 | |
896 " Using string(funcref_variable) to set 'completefunc' | |
897 let Fn = function('MycompleteFunc1') | |
898 let &completefunc = string(Fn) | |
899 new | only | |
900 call setline(1, 'two') | |
901 let g:MycompleteFunc1_args = [] | |
902 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
903 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args) | |
895 bw! | 904 bw! |
896 | 905 |
897 " Test for using a funcref() | 906 " Test for using a funcref() |
898 func MycompleteFunc2(findstart, base) | 907 func MycompleteFunc2(findstart, base) |
899 call add(g:MycompleteFunc2_args, [a:findstart, a:base]) | 908 call add(g:MycompleteFunc2_args, [a:findstart, a:base]) |
907 call assert_equal([[1, ''], [0, 'three']], g:MycompleteFunc2_args) | 916 call assert_equal([[1, ''], [0, 'three']], g:MycompleteFunc2_args) |
908 bw! | 917 bw! |
909 | 918 |
910 " Using a funcref variable to set 'completefunc' | 919 " Using a funcref variable to set 'completefunc' |
911 let Fn = funcref('MycompleteFunc2') | 920 let Fn = funcref('MycompleteFunc2') |
912 let &completefunc = string(Fn) | 921 let &completefunc = Fn |
913 new | only | 922 new | only |
914 call setline(1, 'four') | 923 call setline(1, 'four') |
915 let g:MycompleteFunc2_args = [] | 924 let g:MycompleteFunc2_args = [] |
916 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 925 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
917 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args) | 926 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args) |
918 call assert_fails('let &completefunc = Fn', 'E729:') | 927 bw! |
928 | |
929 " Using a string(funcref_variable) to set 'completefunc' | |
930 let Fn = funcref('MycompleteFunc2') | |
931 let &completefunc = string(Fn) | |
932 new | only | |
933 call setline(1, 'four') | |
934 let g:MycompleteFunc2_args = [] | |
935 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
936 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args) | |
919 bw! | 937 bw! |
920 | 938 |
921 " Test for using a lambda function | 939 " Test for using a lambda function |
922 func MycompleteFunc3(findstart, base) | 940 func MycompleteFunc3(findstart, base) |
923 call add(g:MycompleteFunc3_args, [a:findstart, a:base]) | 941 call add(g:MycompleteFunc3_args, [a:findstart, a:base]) |
930 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 948 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
931 call assert_equal([[1, ''], [0, 'five']], g:MycompleteFunc3_args) | 949 call assert_equal([[1, ''], [0, 'five']], g:MycompleteFunc3_args) |
932 bw! | 950 bw! |
933 | 951 |
934 " Set 'completefunc' to a lambda expression | 952 " Set 'completefunc' to a lambda expression |
935 let &completefunc = '{a, b -> MycompleteFunc3(a, b)}' | 953 let &completefunc = {a, b -> MycompleteFunc3(a, b)} |
936 new | only | 954 new | only |
937 call setline(1, 'six') | 955 call setline(1, 'six') |
938 let g:MycompleteFunc3_args = [] | 956 let g:MycompleteFunc3_args = [] |
939 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 957 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
940 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args) | 958 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args) |
941 bw! | 959 bw! |
942 | 960 |
961 " Set 'completefunc' to string(lambda_expression) | |
962 let &completefunc = '{a, b -> MycompleteFunc3(a, b)}' | |
963 new | only | |
964 call setline(1, 'six') | |
965 let g:MycompleteFunc3_args = [] | |
966 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
967 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args) | |
968 bw! | |
969 | |
943 " Set 'completefunc' to a variable with a lambda expression | 970 " Set 'completefunc' to a variable with a lambda expression |
944 let Lambda = {a, b -> MycompleteFunc3(a, b)} | 971 let Lambda = {a, b -> MycompleteFunc3(a, b)} |
945 let &completefunc = string(Lambda) | 972 let &completefunc = Lambda |
946 new | only | 973 new | only |
947 call setline(1, 'seven') | 974 call setline(1, 'seven') |
948 let g:MycompleteFunc3_args = [] | 975 let g:MycompleteFunc3_args = [] |
949 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 976 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
950 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args) | 977 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args) |
951 call assert_fails('let &completefunc = Lambda', 'E729:') | 978 bw! |
979 | |
980 " Set 'completefunc' to a string(variable with a lambda expression) | |
981 let Lambda = {a, b -> MycompleteFunc3(a, b)} | |
982 let &completefunc = string(Lambda) | |
983 new | only | |
984 call setline(1, 'seven') | |
985 let g:MycompleteFunc3_args = [] | |
986 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
987 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args) | |
952 bw! | 988 bw! |
953 | 989 |
954 " Test for using a lambda function with incorrect return value | 990 " Test for using a lambda function with incorrect return value |
955 let Lambda = {s -> strlen(s)} | 991 let Lambda = {s -> strlen(s)} |
956 let &completefunc = string(Lambda) | 992 let &completefunc = Lambda |
957 new | only | 993 new | only |
958 call setline(1, 'eight') | 994 call setline(1, 'eight') |
959 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 995 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
960 bw! | 996 bw! |
961 | 997 |
963 set completefunc='' | 999 set completefunc='' |
964 set completefunc& | 1000 set completefunc& |
965 | 1001 |
966 call assert_fails("set completefunc=function('abc')", "E700:") | 1002 call assert_fails("set completefunc=function('abc')", "E700:") |
967 call assert_fails("set completefunc=funcref('abc')", "E700:") | 1003 call assert_fails("set completefunc=funcref('abc')", "E700:") |
968 let &completefunc = "{a -> 'abc'}" | 1004 let &completefunc = {a -> 'abc'} |
969 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 1005 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
970 | 1006 |
971 " Vim9 tests | 1007 " Vim9 tests |
972 let lines =<< trim END | 1008 let lines =<< trim END |
973 vim9script | 1009 vim9script |
988 # Test for using a lambda | 1024 # Test for using a lambda |
989 def LambdaComplete1(findstart: number, base: string): any | 1025 def LambdaComplete1(findstart: number, base: string): any |
990 add(g:LambdaComplete1_args, [findstart, base]) | 1026 add(g:LambdaComplete1_args, [findstart, base]) |
991 return findstart ? 0 : [] | 1027 return findstart ? 0 : [] |
992 enddef | 1028 enddef |
1029 &completefunc = (a, b) => LambdaComplete1(a, b) | |
1030 new | only | |
1031 setline(1, 'two') | |
1032 g:LambdaComplete1_args = [] | |
1033 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1034 assert_equal([[1, ''], [0, 'two']], g:LambdaComplete1_args) | |
1035 bw! | |
1036 | |
1037 # Test for using a string(lambda) | |
993 &completefunc = '(a, b) => LambdaComplete1(a, b)' | 1038 &completefunc = '(a, b) => LambdaComplete1(a, b)' |
994 new | only | 1039 new | only |
995 setline(1, 'two') | 1040 setline(1, 'two') |
996 g:LambdaComplete1_args = [] | 1041 g:LambdaComplete1_args = [] |
997 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 1042 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
1001 # Test for using a variable with a lambda expression | 1046 # Test for using a variable with a lambda expression |
1002 var Fn: func = (findstart, base) => { | 1047 var Fn: func = (findstart, base) => { |
1003 add(g:LambdaComplete2_args, [findstart, base]) | 1048 add(g:LambdaComplete2_args, [findstart, base]) |
1004 return findstart ? 0 : [] | 1049 return findstart ? 0 : [] |
1005 } | 1050 } |
1051 &completefunc = Fn | |
1052 new | only | |
1053 setline(1, 'three') | |
1054 g:LambdaComplete2_args = [] | |
1055 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | |
1056 assert_equal([[1, ''], [0, 'three']], g:LambdaComplete2_args) | |
1057 bw! | |
1058 | |
1059 # Test for using a string(variable with a lambda expression) | |
1006 &completefunc = string(Fn) | 1060 &completefunc = string(Fn) |
1007 new | only | 1061 new | only |
1008 setline(1, 'three') | 1062 setline(1, 'three') |
1009 g:LambdaComplete2_args = [] | 1063 g:LambdaComplete2_args = [] |
1010 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') | 1064 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') |
1043 call assert_equal([[1, ''], [0, 'one']], g:MyomniFunc1_args) | 1097 call assert_equal([[1, ''], [0, 'one']], g:MyomniFunc1_args) |
1044 bw! | 1098 bw! |
1045 | 1099 |
1046 " Using a funcref variable to set 'omnifunc' | 1100 " Using a funcref variable to set 'omnifunc' |
1047 let Fn = function('MyomniFunc1') | 1101 let Fn = function('MyomniFunc1') |
1048 let &omnifunc = string(Fn) | 1102 let &omnifunc = Fn |
1049 new | only | 1103 new | only |
1050 call setline(1, 'two') | 1104 call setline(1, 'two') |
1051 let g:MyomniFunc1_args = [] | 1105 let g:MyomniFunc1_args = [] |
1052 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1106 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1053 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args) | 1107 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args) |
1054 call assert_fails('let &omnifunc = Fn', 'E729:') | 1108 bw! |
1109 | |
1110 " Using a string(funcref_variable) to set 'omnifunc' | |
1111 let Fn = function('MyomniFunc1') | |
1112 let &omnifunc = string(Fn) | |
1113 new | only | |
1114 call setline(1, 'two') | |
1115 let g:MyomniFunc1_args = [] | |
1116 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1117 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args) | |
1055 bw! | 1118 bw! |
1056 | 1119 |
1057 " Test for using a funcref() | 1120 " Test for using a funcref() |
1058 func MyomniFunc2(findstart, base) | 1121 func MyomniFunc2(findstart, base) |
1059 call add(g:MyomniFunc2_args, [a:findstart, a:base]) | 1122 call add(g:MyomniFunc2_args, [a:findstart, a:base]) |
1067 call assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args) | 1130 call assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args) |
1068 bw! | 1131 bw! |
1069 | 1132 |
1070 " Using a funcref variable to set 'omnifunc' | 1133 " Using a funcref variable to set 'omnifunc' |
1071 let Fn = funcref('MyomniFunc2') | 1134 let Fn = funcref('MyomniFunc2') |
1072 let &omnifunc = string(Fn) | 1135 let &omnifunc = Fn |
1073 new | only | 1136 new | only |
1074 call setline(1, 'four') | 1137 call setline(1, 'four') |
1075 let g:MyomniFunc2_args = [] | 1138 let g:MyomniFunc2_args = [] |
1076 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1139 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1077 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args) | 1140 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args) |
1078 call assert_fails('let &omnifunc = Fn', 'E729:') | 1141 bw! |
1142 | |
1143 " Using a string(funcref_variable) to set 'omnifunc' | |
1144 let Fn = funcref('MyomniFunc2') | |
1145 let &omnifunc = string(Fn) | |
1146 new | only | |
1147 call setline(1, 'four') | |
1148 let g:MyomniFunc2_args = [] | |
1149 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1150 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args) | |
1079 bw! | 1151 bw! |
1080 | 1152 |
1081 " Test for using a lambda function | 1153 " Test for using a lambda function |
1082 func MyomniFunc3(findstart, base) | 1154 func MyomniFunc3(findstart, base) |
1083 call add(g:MyomniFunc3_args, [a:findstart, a:base]) | 1155 call add(g:MyomniFunc3_args, [a:findstart, a:base]) |
1090 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1162 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1091 call assert_equal([[1, ''], [0, 'five']], g:MyomniFunc3_args) | 1163 call assert_equal([[1, ''], [0, 'five']], g:MyomniFunc3_args) |
1092 bw! | 1164 bw! |
1093 | 1165 |
1094 " Set 'omnifunc' to a lambda expression | 1166 " Set 'omnifunc' to a lambda expression |
1095 let &omnifunc = '{a, b -> MyomniFunc3(a, b)}' | 1167 let &omnifunc = {a, b -> MyomniFunc3(a, b)} |
1096 new | only | 1168 new | only |
1097 call setline(1, 'six') | 1169 call setline(1, 'six') |
1098 let g:MyomniFunc3_args = [] | 1170 let g:MyomniFunc3_args = [] |
1099 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1171 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1100 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args) | 1172 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args) |
1101 bw! | 1173 bw! |
1102 | 1174 |
1175 " Set 'omnifunc' to a string(lambda_expression) | |
1176 let &omnifunc = '{a, b -> MyomniFunc3(a, b)}' | |
1177 new | only | |
1178 call setline(1, 'six') | |
1179 let g:MyomniFunc3_args = [] | |
1180 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1181 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args) | |
1182 bw! | |
1183 | |
1103 " Set 'omnifunc' to a variable with a lambda expression | 1184 " Set 'omnifunc' to a variable with a lambda expression |
1104 let Lambda = {a, b -> MyomniFunc3(a, b)} | 1185 let Lambda = {a, b -> MyomniFunc3(a, b)} |
1105 let &omnifunc = string(Lambda) | 1186 let &omnifunc = Lambda |
1106 new | only | 1187 new | only |
1107 call setline(1, 'seven') | 1188 call setline(1, 'seven') |
1108 let g:MyomniFunc3_args = [] | 1189 let g:MyomniFunc3_args = [] |
1109 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1190 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1110 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args) | 1191 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args) |
1111 call assert_fails('let &omnifunc = Lambda', 'E729:') | 1192 bw! |
1193 | |
1194 " Set 'omnifunc' to a string(variable with a lambda expression) | |
1195 let Lambda = {a, b -> MyomniFunc3(a, b)} | |
1196 let &omnifunc = string(Lambda) | |
1197 new | only | |
1198 call setline(1, 'seven') | |
1199 let g:MyomniFunc3_args = [] | |
1200 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1201 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args) | |
1112 bw! | 1202 bw! |
1113 | 1203 |
1114 " Test for using a lambda function with incorrect return value | 1204 " Test for using a lambda function with incorrect return value |
1115 let Lambda = {s -> strlen(s)} | 1205 let Lambda = {s -> strlen(s)} |
1116 let &omnifunc = string(Lambda) | 1206 let &omnifunc = Lambda |
1117 new | only | 1207 new | only |
1118 call setline(1, 'eight') | 1208 call setline(1, 'eight') |
1119 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1209 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1120 bw! | 1210 bw! |
1121 | 1211 |
1123 set omnifunc='' | 1213 set omnifunc='' |
1124 set omnifunc& | 1214 set omnifunc& |
1125 | 1215 |
1126 call assert_fails("set omnifunc=function('abc')", "E700:") | 1216 call assert_fails("set omnifunc=function('abc')", "E700:") |
1127 call assert_fails("set omnifunc=funcref('abc')", "E700:") | 1217 call assert_fails("set omnifunc=funcref('abc')", "E700:") |
1128 let &omnifunc = "{a -> 'abc'}" | 1218 let &omnifunc = {a -> 'abc'} |
1129 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1219 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1130 | 1220 |
1131 " Vim9 tests | 1221 " Vim9 tests |
1132 let lines =<< trim END | 1222 let lines =<< trim END |
1133 vim9script | 1223 vim9script |
1148 # Test for using a lambda | 1238 # Test for using a lambda |
1149 def MyomniFunc2(findstart: number, base: string): any | 1239 def MyomniFunc2(findstart: number, base: string): any |
1150 add(g:MyomniFunc2_args, [findstart, base]) | 1240 add(g:MyomniFunc2_args, [findstart, base]) |
1151 return findstart ? 0 : [] | 1241 return findstart ? 0 : [] |
1152 enddef | 1242 enddef |
1243 &omnifunc = (a, b) => MyomniFunc2(a, b) | |
1244 new | only | |
1245 setline(1, 'two') | |
1246 g:MyomniFunc2_args = [] | |
1247 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1248 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args) | |
1249 bw! | |
1250 | |
1251 # Test for using a string(lambda) | |
1153 &omnifunc = '(a, b) => MyomniFunc2(a, b)' | 1252 &omnifunc = '(a, b) => MyomniFunc2(a, b)' |
1154 new | only | 1253 new | only |
1155 setline(1, 'two') | 1254 setline(1, 'two') |
1156 g:MyomniFunc2_args = [] | 1255 g:MyomniFunc2_args = [] |
1157 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1256 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1158 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args) | 1257 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args) |
1159 bw! | 1258 bw! |
1160 | 1259 |
1161 # Test for using a variable with a lambda expression | 1260 # Test for using a variable with a lambda expression |
1162 var Fn: func = (a, b) => MyomniFunc2(a, b) | 1261 var Fn: func = (a, b) => MyomniFunc2(a, b) |
1262 &omnifunc = Fn | |
1263 new | only | |
1264 setline(1, 'three') | |
1265 g:MyomniFunc2_args = [] | |
1266 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | |
1267 assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args) | |
1268 bw! | |
1269 | |
1270 # Test for using a string(variable with a lambda expression) | |
1163 &omnifunc = string(Fn) | 1271 &omnifunc = string(Fn) |
1164 new | only | 1272 new | only |
1165 setline(1, 'three') | 1273 setline(1, 'three') |
1166 g:MyomniFunc2_args = [] | 1274 g:MyomniFunc2_args = [] |
1167 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') | 1275 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') |
1200 call assert_equal([[1, ''], [0, 'one']], g:MytsrFunc1_args) | 1308 call assert_equal([[1, ''], [0, 'one']], g:MytsrFunc1_args) |
1201 bw! | 1309 bw! |
1202 | 1310 |
1203 " Using a funcref variable to set 'thesaurusfunc' | 1311 " Using a funcref variable to set 'thesaurusfunc' |
1204 let Fn = function('MytsrFunc1') | 1312 let Fn = function('MytsrFunc1') |
1205 let &thesaurusfunc = string(Fn) | 1313 let &thesaurusfunc = Fn |
1206 new | only | 1314 new | only |
1207 call setline(1, 'two') | 1315 call setline(1, 'two') |
1208 let g:MytsrFunc1_args = [] | 1316 let g:MytsrFunc1_args = [] |
1209 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1317 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1210 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args) | 1318 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args) |
1211 call assert_fails('let &thesaurusfunc = Fn', 'E729:') | 1319 bw! |
1320 | |
1321 " Using a string(funcref_variable) to set 'thesaurusfunc' | |
1322 let Fn = function('MytsrFunc1') | |
1323 let &thesaurusfunc = string(Fn) | |
1324 new | only | |
1325 call setline(1, 'two') | |
1326 let g:MytsrFunc1_args = [] | |
1327 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1328 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args) | |
1212 bw! | 1329 bw! |
1213 | 1330 |
1214 " Test for using a funcref() | 1331 " Test for using a funcref() |
1215 func MytsrFunc2(findstart, base) | 1332 func MytsrFunc2(findstart, base) |
1216 call add(g:MytsrFunc2_args, [a:findstart, a:base]) | 1333 call add(g:MytsrFunc2_args, [a:findstart, a:base]) |
1224 call assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args) | 1341 call assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args) |
1225 bw! | 1342 bw! |
1226 | 1343 |
1227 " Using a funcref variable to set 'thesaurusfunc' | 1344 " Using a funcref variable to set 'thesaurusfunc' |
1228 let Fn = funcref('MytsrFunc2') | 1345 let Fn = funcref('MytsrFunc2') |
1229 let &thesaurusfunc = string(Fn) | 1346 let &thesaurusfunc = Fn |
1230 new | only | 1347 new | only |
1231 call setline(1, 'four') | 1348 call setline(1, 'four') |
1232 let g:MytsrFunc2_args = [] | 1349 let g:MytsrFunc2_args = [] |
1233 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1350 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1234 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args) | 1351 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args) |
1235 call assert_fails('let &thesaurusfunc = Fn', 'E729:') | 1352 bw! |
1353 | |
1354 " Using a string(funcref_variable) to set 'thesaurusfunc' | |
1355 let Fn = funcref('MytsrFunc2') | |
1356 let &thesaurusfunc = string(Fn) | |
1357 new | only | |
1358 call setline(1, 'four') | |
1359 let g:MytsrFunc2_args = [] | |
1360 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1361 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args) | |
1236 bw! | 1362 bw! |
1237 | 1363 |
1238 " Test for using a lambda function | 1364 " Test for using a lambda function |
1239 func MytsrFunc3(findstart, base) | 1365 func MytsrFunc3(findstart, base) |
1240 call add(g:MytsrFunc3_args, [a:findstart, a:base]) | 1366 call add(g:MytsrFunc3_args, [a:findstart, a:base]) |
1247 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1373 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1248 call assert_equal([[1, ''], [0, 'five']], g:MytsrFunc3_args) | 1374 call assert_equal([[1, ''], [0, 'five']], g:MytsrFunc3_args) |
1249 bw! | 1375 bw! |
1250 | 1376 |
1251 " Set 'thesaurusfunc' to a lambda expression | 1377 " Set 'thesaurusfunc' to a lambda expression |
1252 let &thesaurusfunc = '{a, b -> MytsrFunc3(a, b)}' | 1378 let &thesaurusfunc = {a, b -> MytsrFunc3(a, b)} |
1253 new | only | 1379 new | only |
1254 call setline(1, 'six') | 1380 call setline(1, 'six') |
1255 let g:MytsrFunc3_args = [] | 1381 let g:MytsrFunc3_args = [] |
1256 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1382 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1257 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args) | 1383 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args) |
1258 bw! | 1384 bw! |
1259 | 1385 |
1386 " Set 'thesaurusfunc' to a string(lambda expression) | |
1387 let &thesaurusfunc = '{a, b -> MytsrFunc3(a, b)}' | |
1388 new | only | |
1389 call setline(1, 'six') | |
1390 let g:MytsrFunc3_args = [] | |
1391 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1392 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args) | |
1393 bw! | |
1394 | |
1260 " Set 'thesaurusfunc' to a variable with a lambda expression | 1395 " Set 'thesaurusfunc' to a variable with a lambda expression |
1261 let Lambda = {a, b -> MytsrFunc3(a, b)} | 1396 let Lambda = {a, b -> MytsrFunc3(a, b)} |
1262 let &thesaurusfunc = string(Lambda) | 1397 let &thesaurusfunc = Lambda |
1263 new | only | 1398 new | only |
1264 call setline(1, 'seven') | 1399 call setline(1, 'seven') |
1265 let g:MytsrFunc3_args = [] | 1400 let g:MytsrFunc3_args = [] |
1266 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1401 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1267 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args) | 1402 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args) |
1268 call assert_fails('let &thesaurusfunc = Lambda', 'E729:') | 1403 bw! |
1404 | |
1405 " Set 'thesaurusfunc' to a string(variable with a lambda expression) | |
1406 let Lambda = {a, b -> MytsrFunc3(a, b)} | |
1407 let &thesaurusfunc = string(Lambda) | |
1408 new | only | |
1409 call setline(1, 'seven') | |
1410 let g:MytsrFunc3_args = [] | |
1411 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1412 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args) | |
1269 bw! | 1413 bw! |
1270 | 1414 |
1271 " Test for using a lambda function with incorrect return value | 1415 " Test for using a lambda function with incorrect return value |
1272 let Lambda = {s -> strlen(s)} | 1416 let Lambda = {s -> strlen(s)} |
1273 let &thesaurusfunc = string(Lambda) | 1417 let &thesaurusfunc = Lambda |
1274 new | only | 1418 new | only |
1275 call setline(1, 'eight') | 1419 call setline(1, 'eight') |
1276 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1420 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1277 bw! | 1421 bw! |
1278 | 1422 |
1280 set thesaurusfunc='' | 1424 set thesaurusfunc='' |
1281 set thesaurusfunc& | 1425 set thesaurusfunc& |
1282 | 1426 |
1283 call assert_fails("set thesaurusfunc=function('abc')", "E700:") | 1427 call assert_fails("set thesaurusfunc=function('abc')", "E700:") |
1284 call assert_fails("set thesaurusfunc=funcref('abc')", "E700:") | 1428 call assert_fails("set thesaurusfunc=funcref('abc')", "E700:") |
1285 let &thesaurusfunc = "{a -> 'abc'}" | 1429 let &thesaurusfunc = {a -> 'abc'} |
1286 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1430 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1287 | 1431 |
1288 " Vim9 tests | 1432 " Vim9 tests |
1289 let lines =<< trim END | 1433 let lines =<< trim END |
1290 vim9script | 1434 vim9script |
1305 # Test for using a lambda | 1449 # Test for using a lambda |
1306 def MytsrFunc2(findstart: number, base: string): any | 1450 def MytsrFunc2(findstart: number, base: string): any |
1307 add(g:MytsrFunc2_args, [findstart, base]) | 1451 add(g:MytsrFunc2_args, [findstart, base]) |
1308 return findstart ? 0 : [] | 1452 return findstart ? 0 : [] |
1309 enddef | 1453 enddef |
1454 &thesaurusfunc = (a, b) => MytsrFunc2(a, b) | |
1455 new | only | |
1456 setline(1, 'two') | |
1457 g:MytsrFunc2_args = [] | |
1458 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1459 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args) | |
1460 bw! | |
1461 | |
1462 # Test for using a string(lambda) | |
1310 &thesaurusfunc = '(a, b) => MytsrFunc2(a, b)' | 1463 &thesaurusfunc = '(a, b) => MytsrFunc2(a, b)' |
1311 new | only | 1464 new | only |
1312 setline(1, 'two') | 1465 setline(1, 'two') |
1313 g:MytsrFunc2_args = [] | 1466 g:MytsrFunc2_args = [] |
1314 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1467 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |
1315 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args) | 1468 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args) |
1316 bw! | 1469 bw! |
1317 | 1470 |
1318 # Test for using a variable with a lambda expression | 1471 # Test for using a variable with a lambda expression |
1319 var Fn: func = (a, b) => MytsrFunc2(a, b) | 1472 var Fn: func = (a, b) => MytsrFunc2(a, b) |
1473 &thesaurusfunc = Fn | |
1474 new | only | |
1475 setline(1, 'three') | |
1476 g:MytsrFunc2_args = [] | |
1477 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | |
1478 assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args) | |
1479 bw! | |
1480 | |
1481 # Test for using a string(variable with a lambda expression) | |
1320 &thesaurusfunc = string(Fn) | 1482 &thesaurusfunc = string(Fn) |
1321 new | only | 1483 new | only |
1322 setline(1, 'three') | 1484 setline(1, 'three') |
1323 g:MytsrFunc2_args = [] | 1485 g:MytsrFunc2_args = [] |
1324 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') | 1486 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') |