Skip to content

Commit

Permalink
Create dedicated events module
Browse files Browse the repository at this point in the history
  • Loading branch information
monkoose committed Sep 13, 2024
1 parent bca8208 commit 4243519
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 102 deletions.
9 changes: 5 additions & 4 deletions lua/neocodeium/commands.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ local options = require("neocodeium.options").options
local api_key = require("neocodeium.api_key")
local stdio = require("neocodeium.utils.stdio")
local server = require("neocodeium.server")
local events = require("neocodeium.events")

local fn = vim.fn
local json = vim.json
Expand Down Expand Up @@ -147,12 +148,12 @@ function M.disable(bang)
server:stop()
echo.info("the server has been halted")
end
utils.event("NeoCodeiumDisabled")
events.emit("NeoCodeiumDisabled")
end

function M.enable()
options.enabled = true
utils.event("NeoCodeiumEnabled")
events.emit("NeoCodeiumEnabled")
if not server.pid then
server:run()
end
Expand All @@ -168,12 +169,12 @@ end

function M.disable_buffer()
vim.b.neocodeium_enabled = false
utils.event("NeoCodeiumBufDisabled")
events.emit("NeoCodeiumBufDisabled")
end

function M.enable_buffer()
vim.b.neocodeium_enabled = true
utils.event("NeoCodeiumBufEnabled")
events.emit("NeoCodeiumBufEnabled")
end

function M.toggle_buffer()
Expand Down
49 changes: 14 additions & 35 deletions lua/neocodeium/completer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ local options = require("neocodeium.options").options
local types = require("neocodeium._types")
local server = require("neocodeium.server")
local renderer = require("neocodeium.renderer")
local events = require("neocodeium.events")
local event = events.event

local fn = vim.fn
local uv = vim.uv
Expand All @@ -15,10 +17,6 @@ local json = vim.json
local nvim_feedkeys = vim.api.nvim_feedkeys
local nvim_get_current_buf = vim.api.nvim_get_current_buf
local nvim_replace_termcodes = vim.api.nvim_replace_termcodes
local nvim_create_autocmd = vim.api.nvim_create_autocmd
local nvim_create_augroup = vim.api.nvim_create_augroup

local augroup = nvim_create_augroup("neocodeium_completer", {})

-- Completer ----------------------------------------------- {{{1

Expand Down Expand Up @@ -80,22 +78,6 @@ function Completer:enabled()
return self.allowed_encoding and options.status() == 0
end

function Completer:emit_display(items, index)
utils.event("_NeoCodeiumCompleterDisplay", { items = items, index = index }, true)
end

function Completer:emit_clear(with_reset)
utils.event("_NeoCodeiumCompleterClear", with_reset)
end

function Completer:emit_update()
utils.event("_NeoCodeiumCompleterUpdate")
end

function Completer:emit_status()
utils.event("_NeoCodeiumCompleterStatus", self.status, true)
end

---Cycles completions by amount `n`, wraps around if necessary.
---Use negative value to cycle backwards.
---@param n integer amount to cycle
Expand All @@ -114,7 +96,7 @@ function Completer:cycle(n)
self.data.index = items_len
end

self:emit_display(self.data.items, self.data.index)
events.emit(event.display, { items = self.data.items, index = self.data.index }, true)
end

---Cycles completions or request to complete if there isn't one.
Expand Down Expand Up @@ -151,7 +133,7 @@ function Completer:handle_response(r)
self.data.items = response.completionItems
self.data.index = 1

self:emit_display(self.data.items or {}, 1)
events.emit(event.display, { items = self.data.items or {}, index = 1 }, true)
end

---Accepts a suggestion till regex match end.
Expand Down Expand Up @@ -231,7 +213,8 @@ function Completer:request()
end

self.status = status.pending
self:emit_status()
events.emit(event.status, self.status, true)

self.request_id = self.request_id + 1
local curr_bufnr = nvim_get_current_buf()
local pos = renderer.pos
Expand All @@ -246,7 +229,7 @@ function Completer:request()

server:request("GetCompletions", data, function(r)
self.status = status.completed
self:emit_status()
events.emit(event.status, self.status, true)
self:handle_response(r)
end)

Expand Down Expand Up @@ -274,18 +257,18 @@ function Completer:clear(force)
end

if force then
self:emit_clear(true)
events.emit(event.clear, true)
end
end

---Initiates a completion.
---@param omit_manual? boolean
function Completer:initiate(omit_manual)
self:emit_update()
events.emit(event.update)
self:clear()

if options.manual and not omit_manual then
self:emit_clear()
events.emit(event.clear)
return
end

Expand Down Expand Up @@ -358,7 +341,7 @@ function Completer:accept()
end
-- defer to prevent pasting block before accept_line()
vim.defer_fn(function()
self:emit_clear(true)
events.emit(event.clear, true)
if block then
utils.set_lines(lnum, lnum, block)
utils.set_cursor(pos)
Expand All @@ -370,13 +353,9 @@ end

-- Subscribed events --------------------------------------- {{{1

nvim_create_autocmd("User", {
pattern = "_NeoCodeiumRendererRequest",
group = augroup,
callback = function()
Completer:request()
end,
})
events.subscribe(event.request, function()
Completer:request()
end)
-- }}}1

return Completer
Expand Down
46 changes: 46 additions & 0 deletions lua/neocodeium/events.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
local events = {}

local nvim_exec_autocmds = vim.api.nvim_exec_autocmds
local nvim_create_autocmd = vim.api.nvim_create_autocmd
local nvim_create_augroup = vim.api.nvim_create_augroup

local augroup = nvim_create_augroup("neocodeium_events", {})

---@enum event
events.event = {
display = "_NeoCodeiumDisplay",
clear = "_NeoCodeiumClear",
update = "_NeoCodeiumUpdate",
status = "_NeoCodeiumStatus",
request = "_NeoCodeiumRequest",
}

---Trigger an event
---@param event string The event pattern
---@param data? any The event data
---@param scheduled? boolean Whether or not to schedule the event
function events.emit(event, data, scheduled)
local event_opts = { pattern = event, data = data, modeline = false }
if scheduled then
vim.schedule(function()
nvim_exec_autocmds("User", event_opts)
end)
else
nvim_exec_autocmds("User", event_opts)
end
end

---Subscribes to an event
---@param event string The event pattern
---@param callback fun(data: any) The callback function
function events.subscribe(event, callback)
nvim_create_autocmd("User", {
pattern = event,
group = augroup,
callback = function(ev)
callback(ev.data)
end,
})
end

return events
4 changes: 3 additions & 1 deletion lua/neocodeium/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ local function enable_autocmds()
local completer = require("neocodeium.completer")
local renderer = require("neocodeium.renderer")
local doc = require("neocodeium.doc")
local events = require("neocodeium.events")
local event = events.event

local function utf8_or_latin1()
local encoding = vim.o.fileencoding
Expand Down Expand Up @@ -122,7 +124,7 @@ local function enable_autocmds()
create_autocmd("InsertEnter", {
callback = function()
if completer:enabled() then
completer:emit_status()
events.emit(event.status, completer.status, true)
end
completer:initiate()
end,
Expand Down
66 changes: 24 additions & 42 deletions lua/neocodeium/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
local utils = require("neocodeium.utils")
local types = require("neocodeium._types")
local options = require("neocodeium.options").options
local events = require("neocodeium.events")
local event = events.event

local fn = vim.fn
local uv = vim.uv
Expand All @@ -13,12 +15,9 @@ local nvim_get_hl_id_by_name = vim.api.nvim_get_hl_id_by_name
local nvim_create_namespace = vim.api.nvim_create_namespace
local nvim_buf_del_extmark = vim.api.nvim_buf_del_extmark
local nvim_buf_clear_namespace = vim.api.nvim_buf_clear_namespace
local nvim_create_autocmd = vim.api.nvim_create_autocmd
local nvim_create_augroup = vim.api.nvim_create_augroup

local hlgroup = nvim_get_hl_id_by_name("NeoCodeiumSuggestion")
local ns = nvim_create_namespace("neocodeium_compl")
local augroup = nvim_create_augroup("neocodeium_renderer", {})

-- Renderer ------------------------------------------------- {{{1

Expand Down Expand Up @@ -232,7 +231,7 @@ function Renderer:display(items, index)
-- When only block part is present and text was changed compared to when
-- request was sent, return false, so it will dispatch new request
if not self.fulltext:match("^%s*$") and item.completion.text:match("^\n") then
utils.event("_NeoCodeiumCompleterRequest", nil, true)
events.emit(event.request)
return
end

Expand All @@ -258,7 +257,7 @@ function Renderer:display(items, index)
-- When actual text doesn't match prefix return false, so it will
-- dispatch new request for the completion
if match_prefix_idx ~= col then
utils.event("_NeoCodeiumCompleterRequest", nil, true)
events.emit(event.request)
return
end

Expand Down Expand Up @@ -286,7 +285,7 @@ function Renderer:display(items, index)
if block_text or #inline_contents > 0 then
self:display_label(items, index)
end
utils.event("NeoCodeiumCompletionDisplayed", nil, true)
events.emit("NeoCodeiumCompletionDisplayed", nil, true)
end

---@private
Expand Down Expand Up @@ -450,7 +449,7 @@ function Renderer:clear(with_reset)
self.block.id = nil
self.block.text = nil
self.fulltext = ""
utils.event("NeoCodeiumCompletionCleared", nil, true)
events.emit("NeoCodeiumCompletionCleared", nil, true)
else
-- self:clear_label()
self:clear_inline()
Expand All @@ -460,41 +459,24 @@ end

-- Subscribed events --------------------------------------- {{{1

nvim_create_autocmd("User", {
pattern = "_NeoCodeiumCompleterDisplay",
group = augroup,
callback = function(ev)
local data = ev.data
Renderer:display(data.items, data.index)
end,
})

nvim_create_autocmd("User", {
pattern = "_NeoCodeiumCompleterClear",
group = augroup,
callback = function(ev)
Renderer:clear(ev.data)
end,
})

nvim_create_autocmd("User", {
pattern = "_NeoCodeiumCompleterUpdate",
group = augroup,
callback = function(_)
Renderer:update()
end,
})

nvim_create_autocmd("User", {
pattern = "_NeoCodeiumCompleterStatus",
group = augroup,
callback = function(ev)
if utils.is_insert() and utils.is_empty(Renderer.inline) and not Renderer.block.text then
local pending = ev.data == 1
Renderer:display_label({}, 1, pending)
end
end,
})
events.subscribe(event.display, function(data)
Renderer:display(data.items, data.index)
end)

events.subscribe(event.clear, function(data)
Renderer:clear(data)
end)

events.subscribe(event.update, function(_)
Renderer:update()
end)

events.subscribe(event.status, function(data)
if utils.is_insert() and utils.is_empty(Renderer.inline) and not Renderer.block.text then
local pending = data == 1
Renderer:display_label({}, 1, pending)
end
end)
-- }}}1

return Renderer
Expand Down
10 changes: 6 additions & 4 deletions lua/neocodeium/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
local log = require("neocodeium.log")
local api_key = require("neocodeium.api_key")
local options = require("neocodeium.options").options
local utils = require("neocodeium.utils")
local stdio = require("neocodeium.utils.stdio")
local echo = require("neocodeium.utils.echo")
local events = require("neocodeium.events")
local Bin = require("neocodeium.binary")

local fn = vim.fn
Expand Down Expand Up @@ -98,7 +98,7 @@ function Server:start()
self.handle = nil
end
log.info("Server stopped")
utils.event("NeoCodeiumServerStopped")
events.emit("NeoCodeiumServerStopped")
self.pid = nil
self.port = nil
if self.is_restart then
Expand All @@ -107,7 +107,9 @@ function Server:start()
end
end)
)
utils.event("NeoCodeiumServerConnecting")

events.emit("NeoCodeiumServerConnecting")

local function log_data(err, data)
if err then
return
Expand Down Expand Up @@ -240,7 +242,7 @@ function Server:init(timer, manager_dir)
self.callback()
self.callback = nil
end
utils.event("NeoCodeiumServerConnected")
events.emit("NeoCodeiumServerConnected")

timer:stop()
local interval = 10000
Expand Down
Loading

0 comments on commit 4243519

Please sign in to comment.