diff options
Diffstat (limited to 'start/cmp/lua/cmp/utils/autocmd.lua')
-rw-r--r-- | start/cmp/lua/cmp/utils/autocmd.lua | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/start/cmp/lua/cmp/utils/autocmd.lua b/start/cmp/lua/cmp/utils/autocmd.lua new file mode 100644 index 0000000..438e231 --- /dev/null +++ b/start/cmp/lua/cmp/utils/autocmd.lua @@ -0,0 +1,53 @@ +local debug = require('cmp.utils.debug') + +local autocmd = {} + +autocmd.group = vim.api.nvim_create_augroup('___cmp___', { clear = true }) + +autocmd.events = {} + +---Subscribe autocmd +---@param events string|string[] +---@param callback function +---@return function +autocmd.subscribe = function(events, callback) + events = type(events) == 'string' and { events } or events + + for _, event in ipairs(events) do + if not autocmd.events[event] then + autocmd.events[event] = {} + vim.api.nvim_create_autocmd(event, { + desc = ('nvim-cmp: autocmd: %s'):format(event), + group = autocmd.group, + callback = function() + autocmd.emit(event) + end, + }) + end + table.insert(autocmd.events[event], callback) + end + + return function() + for _, event in ipairs(events) do + for i, callback_ in ipairs(autocmd.events[event]) do + if callback_ == callback then + table.remove(autocmd.events[event], i) + break + end + end + end + end +end + +---Emit autocmd +---@param event string +autocmd.emit = function(event) + debug.log(' ') + debug.log(string.format('>>> %s', event)) + autocmd.events[event] = autocmd.events[event] or {} + for _, callback in ipairs(autocmd.events[event]) do + callback() + end +end + +return autocmd |