Skip to content

Commit

Permalink
Merge pull request #30 from monkoose/messages
Browse files Browse the repository at this point in the history
Implement event driven communication
  • Loading branch information
monkoose authored Sep 11, 2024
2 parents e82da86 + 2a09054 commit 2fb9869
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 38 deletions.
8 changes: 4 additions & 4 deletions lua/neocodeium/commands.lua
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,12 @@ function M.disable(bang)
server:stop()
echo.info("the server has been halted")
end
utils.event("Disabled")
utils.event("NeoCodeiumDisabled")
end

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

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

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

function M.toggle_buffer()
Expand Down
49 changes: 39 additions & 10 deletions lua/neocodeium/completer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ 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 @@ -76,6 +80,22 @@ 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 @@ -94,7 +114,7 @@ function Completer:cycle(n)
self.data.index = items_len
end

renderer:display(self.data.items, self.data.index)
self:emit_display(self.data.items, self.data.index)
end

---Cycles completions or request to complete if there isn't one.
Expand Down Expand Up @@ -130,11 +150,8 @@ function Completer:handle_response(r)

self.data.items = response.completionItems
self.data.index = 1
vim.schedule(function()
if not renderer:display(self.data.items or {}, 1) then
self:request()
end
end)

self:emit_display(self.data.items or {}, 1)
end

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

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

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

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

if force then
renderer:clear(true)
self:emit_clear(true)
end
end

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

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

Expand Down Expand Up @@ -339,13 +358,23 @@ function Completer:accept()
end
-- defer to prevent pasting block before accept_line()
vim.defer_fn(function()
renderer:clear(true)
self:emit_clear(true)
if block then
utils.set_lines(lnum, lnum, block)
utils.set_cursor(pos)
end
end, 0)
end

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

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

return Completer
Expand Down
3 changes: 2 additions & 1 deletion lua/neocodeium/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ local function enable_autocmds()
})

create_autocmd("ModeChanged", {
pattern = "i*:*",
pattern = "i*:[^i]*",
callback = function()
completer:clear(true)
end,
Expand All @@ -121,6 +121,7 @@ local function enable_autocmds()

create_autocmd("InsertEnter", {
callback = function()
completer:emit_status()
completer:initiate()
end,
})
Expand Down
74 changes: 59 additions & 15 deletions lua/neocodeium/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ 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 @@ -145,10 +148,6 @@ end
---@param id extmark_id
---@param text string
function Renderer:show_label(id, text)
if not (options.show_label and self.label.enabled) then
return
end

self.label.id = nvim_buf_set_extmark(0, ns, self.pos[1], 0, {
id = id,
virt_text = { { text, "NeoCodeiumLabel" } },
Expand Down Expand Up @@ -198,8 +197,15 @@ end
---@private
---@param items compl.item[]
---@param index integer
function Renderer:display_label(items, index)
if utils.is_empty(items) then
---@param pending boolean?
function Renderer:display_label(items, index, pending)
if not (options.show_label and self.label.enabled) then
return
end

if pending then
self:show_label(self.label.id, " * ")
elseif utils.is_empty(items) then
self:show_label(self.label.id, " 0 ")
else
self:show_label(self.label.id, index .. "/" .. #items)
Expand All @@ -209,25 +215,25 @@ end
---Displays completion item
---@param items compl.item[]
---@param index integer
---@return boolean
function Renderer:display(items, index)
if not utils.is_insert() then
self:clear(true)
return true
return
end

local lnum, col = unpack(self.pos)
local item = items[index] or {}
local parts = item.completionParts or {}

if utils.is_empty(parts) then
return true
return
end

-- 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
return false
utils.event("_NeoCodeiumCompleterRequest", nil, true)
return
end

local block_text ---@type string?
Expand All @@ -252,7 +258,8 @@ 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
return false
utils.event("_NeoCodeiumCompleterRequest", nil, true)
return
end

delta = calc_inline_delta(prefix_len, match_prefix_idx, col)
Expand All @@ -279,8 +286,7 @@ function Renderer:display(items, index)
if block_text or #inline_contents > 0 then
self:display_label(items, index)
end
utils.event("CompletionDisplayed", true)
return true
utils.event("NeoCodeiumCompletionDisplayed", nil, true)
end

---@private
Expand Down Expand Up @@ -438,13 +444,51 @@ function Renderer:clear(with_reset)
self.block.id = nil
self.block.text = nil
self.fulltext = ""
utils.event("CompletionCleared", true)
utils.event("NeoCodeiumCompletionCleared", nil, true)
else
self:clear_label()
-- self:clear_label()
self:clear_inline()
self:clear_block()
end
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,
})
-- }}}1

return Renderer
Expand Down
6 changes: 3 additions & 3 deletions lua/neocodeium/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ function Server:start()
self.handle = nil
end
log.info("Server stopped")
utils.event("ServerStopped")
utils.event("NeoCodeiumServerStopped")
self.pid = nil
self.port = nil
if self.is_restart then
Expand All @@ -107,7 +107,7 @@ function Server:start()
end
end)
)
utils.event("ServerConnecting")
utils.event("NeoCodeiumServerConnecting")
local function log_data(err, data)
if err then
return
Expand Down Expand Up @@ -240,7 +240,7 @@ function Server:init(timer, manager_dir)
self.callback()
self.callback = nil
end
utils.event("ServerConnected")
utils.event("NeoCodeiumServerConnected")

timer:stop()
local interval = 10000
Expand Down
12 changes: 7 additions & 5 deletions lua/neocodeium/utils/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ local nvim_exec2 = vim.api.nvim_exec2
local nvim_buf_set_lines = vim.api.nvim_buf_set_lines
local nvim_win_get_cursor = vim.api.nvim_win_get_cursor
local nvim_win_set_cursor = vim.api.nvim_win_set_cursor
local nvim_exec_autocmds = vim.api.nvim_exec_autocmds

local M = {}

Expand All @@ -21,15 +22,16 @@ end

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

Expand Down

0 comments on commit 2fb9869

Please sign in to comment.