@@ -2,9 +2,12 @@ local vim = vim
22local api = vim .api
33local util = require ' completion.util'
44local ins = require ' completion.source.ins_complete'
5+ local match = require ' completion.matching'
56
67local M = {}
78
9+ local cache_complete_items = {}
10+
811local function checkCallback (callback_array )
912 for _ ,val in ipairs (callback_array ) do
1013 if not val then return false end
1821local function getCompletionItems (items_array , prefix )
1922 local complete_items = {}
2023 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 ))
2225 end
2326 return complete_items
2427end
2528
29+ M .clearCache = function ()
30+ cache_complete_items = {}
31+ end
32+
2633-- perform completion
2734M .performComplete = function (complete_source , complete_items_map , manager , bufnr , prefix , textMatch )
2835
@@ -31,48 +38,67 @@ M.performComplete = function(complete_source, complete_items_map, manager, bufnr
3138 -- ins-complete source
3239 ins .triggerCompletion (manager , complete_source .mode )
3340 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 )
4656 end
47- table.insert (items_array , complete_items .item )
4857 end
49- end
5058
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
7080 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
7199 end
72- timer :stop ()
73- timer :close ()
74100 end
75- end ))
101+ end
76102 end
77103end
78104
0 commit comments