summaryrefslogtreecommitdiff
path: root/start/cmp/lua/cmp/utils/autocmd.lua
diff options
context:
space:
mode:
Diffstat (limited to 'start/cmp/lua/cmp/utils/autocmd.lua')
-rw-r--r--start/cmp/lua/cmp/utils/autocmd.lua53
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