@@ -2,9 +2,12 @@ local vim = vim
2
2
local api = vim .api
3
3
local util = require ' completion.util'
4
4
local ins = require ' completion.source.ins_complete'
5
+ local match = require ' completion.matching'
5
6
6
7
local M = {}
7
8
9
+ local cache_complete_items = {}
10
+
8
11
local function checkCallback (callback_array )
9
12
for _ ,val in ipairs (callback_array ) do
10
13
if not val then return false end
18
21
local function getCompletionItems (items_array , prefix )
19
22
local complete_items = {}
20
23
for _ ,func in ipairs (items_array ) do
21
- vim .list_extend (complete_items , func (prefix , util . fuzzy_score ))
24
+ vim .list_extend (complete_items , func (prefix ))
22
25
end
23
26
return complete_items
24
27
end
25
28
29
+ M .clearCache = function ()
30
+ cache_complete_items = {}
31
+ end
32
+
26
33
-- perform completion
27
34
M .performComplete = function (complete_source , complete_items_map , manager , bufnr , prefix , textMatch )
28
35
@@ -31,48 +38,67 @@ M.performComplete = function(complete_source, complete_items_map, manager, bufnr
31
38
-- ins-complete source
32
39
ins .triggerCompletion (manager , complete_source .mode )
33
40
elseif vim .fn .has_key (complete_source , " complete_items" ) > 0 then
34
- -- use callback_array to handle async behavior
35
- local callback_array = {}
36
- local items_array = {}
37
- -- collect getCompleteItems function of current completion source
38
- for _ , item in ipairs (complete_source .complete_items ) do
39
- local complete_items = complete_items_map [item ]
40
- if complete_items ~= nil then
41
- if complete_items .callback == nil then
42
- table.insert (callback_array , true )
43
- else
44
- table.insert (callback_array , complete_items .callback )
45
- complete_items .trigger (prefix , textMatch , bufnr , manager )
41
+ if # cache_complete_items == 0 then
42
+ -- use callback_array to handle async behavior
43
+ local callback_array = {}
44
+ local items_array = {}
45
+ -- collect getCompleteItems function of current completion source
46
+ for _ , item in ipairs (complete_source .complete_items ) do
47
+ local complete_items = complete_items_map [item ]
48
+ if complete_items ~= nil then
49
+ if complete_items .callback == nil then
50
+ table.insert (callback_array , true )
51
+ else
52
+ table.insert (callback_array , complete_items .callback )
53
+ complete_items .trigger (prefix , textMatch , bufnr , manager )
54
+ end
55
+ table.insert (items_array , complete_items .item )
46
56
end
47
- table.insert (items_array , complete_items .item )
48
57
end
49
- end
50
58
51
- local timer = vim .loop .new_timer ()
52
- timer :start (20 , 50 , vim .schedule_wrap (function ()
53
- if manager .insertChar == true and not timer :is_closing () then
54
- timer :stop ()
55
- timer :close ()
56
- end
57
- -- only perform complete when callback_array are all true
58
- if checkCallback (callback_array ) == true and timer :is_closing () == false then
59
- if api .nvim_get_mode ()[' mode' ] == ' i' or api .nvim_get_mode ()[' mode' ] == ' ic' then
60
- local items = getCompletionItems (items_array , prefix )
61
- if vim .g .completion_sorting ~= " none" then
62
- util .sort_completion_items (items )
63
- end
64
- if # items ~= 0 then
65
- -- reset insertChar and handle auto changing source
66
- vim .fn .complete (textMatch + 1 , items )
67
- manager .changeSource = false
68
- else
69
- manager .changeSource = true
59
+ local timer = vim .loop .new_timer ()
60
+ timer :start (20 , 50 , vim .schedule_wrap (function ()
61
+ if manager .insertChar == true and not timer :is_closing () then
62
+ timer :stop ()
63
+ timer :close ()
64
+ end
65
+ -- only perform complete when callback_array are all true
66
+ if checkCallback (callback_array ) == true and timer :is_closing () == false then
67
+ if api .nvim_get_mode ()[' mode' ] == ' i' or api .nvim_get_mode ()[' mode' ] == ' ic' then
68
+ local items = getCompletionItems (items_array , prefix )
69
+ if vim .g .completion_sorting ~= " none" then
70
+ util .sort_completion_items (items )
71
+ end
72
+ if # items ~= 0 then
73
+ -- reset insertChar and handle auto changing source
74
+ cache_complete_items = items
75
+ vim .fn .complete (textMatch + 1 , items )
76
+ manager .changeSource = false
77
+ else
78
+ manager .changeSource = true
79
+ end
70
80
end
81
+ timer :stop ()
82
+ timer :close ()
83
+ end
84
+ end ))
85
+ else
86
+ if api .nvim_get_mode ()[' mode' ] == ' i' or api .nvim_get_mode ()[' mode' ] == ' ic' then
87
+ local items = {}
88
+ for _ , item in ipairs (cache_complete_items ) do
89
+ match .matching (items , prefix , item )
90
+ end
91
+ if # items ~= 0 then
92
+ -- reset insertChar and handle auto changing source
93
+ cache_complete_items = items
94
+ vim .fn .complete (textMatch + 1 , items )
95
+ manager .changeSource = false
96
+ else
97
+ cache_complete_items = {}
98
+ manager .changeSource = true
71
99
end
72
- timer :stop ()
73
- timer :close ()
74
100
end
75
- end ))
101
+ end
76
102
end
77
103
end
78
104
0 commit comments