From af6a952cd84244b21f9241e8b3af052e87d08a68 Mon Sep 17 00:00:00 2001 From: femkrotek Date: Thu, 16 Jul 2026 15:20:34 +0200 Subject: [PATCH 1/3] feat: add buffer system --- lua/chai/autocmds.lua | 55 ++++++++++++++++++++++++++++++++++++++ lua/chai/buffers.lua | 56 +++++++++++++++++++++++++++++++++++++++ lua/chai/buffers/test.lua | 14 ++++++++++ lua/chai/init.lua | 5 ++++ 4 files changed, 130 insertions(+) create mode 100644 lua/chai/autocmds.lua create mode 100644 lua/chai/buffers.lua create mode 100644 lua/chai/buffers/test.lua diff --git a/lua/chai/autocmds.lua b/lua/chai/autocmds.lua new file mode 100644 index 0000000..a508f00 --- /dev/null +++ b/lua/chai/autocmds.lua @@ -0,0 +1,55 @@ +local M = {} + +local group = vim.api.nvim_create_augroup('ChaiAutocmds', { clear = true }) + +local buffers = require('chai.buffers') + +local function buffer_handling_init() + local create_autocmd = vim.api.nvim_create_autocmd + + create_autocmd('BufEnter', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_enter(args.buf) + end + }) + + create_autocmd({ 'BufDelete' }, { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_hide(args.buf) + end + }) + + create_autocmd({ 'BufWipeout' }, { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.destroy_buffer(args.buf) + end + }) + + create_autocmd('BufReadCmd', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.create_buffer(args.buf) + end + }) + + create_autocmd('BufWriteCmd', { + group = 'ChaiAutocmds', + pattern = { 'chai://*' }, + callback = function (args) + buffers.on_write(args.buf) + end + }) +end + +function M.setup() + buffer_handling_init() +end + +return M diff --git a/lua/chai/buffers.lua b/lua/chai/buffers.lua new file mode 100644 index 0000000..0c753f5 --- /dev/null +++ b/lua/chai/buffers.lua @@ -0,0 +1,56 @@ +-- buffers API, loads buffers from ./buffers/*.lua + +local M = {} + +local buffers = {} + +function M.setup() + -- Init stuff +end + +-- should return created chai buffer +local function resolve_buffer_path(path) + if string.match(path, '^chai://test/?$') then + local buffer = vim.deepcopy(require('chai.buffers.test')) + buffer.args = {} + + return buffer + end + + -- user is idiot imbecyle etc + error("Invalid path " .. path) +end + +function M.create_buffer(buffer) + buffers[buffer] = resolve_buffer_path(vim.api.nvim_buf_get_name(0)) + if type(buffers[buffer].init) == 'function' then + buffers[buffer].init(buffer) + end +end + +function M.destroy_buffer(buffer) + if type(buffers[buffer].destroy) == 'function' then + buffers[buffer].destroy(buffer) + end + buffers[buffer] = nil +end + +function M.on_hide(buffer) + if type(buffers[buffer].on_hide) == 'function' then + buffers[buffer].on_hide(buffer) + end +end + +function M.on_enter(buffer) + if type(buffers[buffer].on_enter) == 'function' then + buffers[buffer].on_enter(buffer) + end +end + +function M.on_write(buffer) + if type(buffers[buffer].on_write) == 'function' then + buffers[buffer].on_write(buffer) + end +end + +return M diff --git a/lua/chai/buffers/test.lua b/lua/chai/buffers/test.lua new file mode 100644 index 0000000..d7c572f --- /dev/null +++ b/lua/chai/buffers/test.lua @@ -0,0 +1,14 @@ +local M = {} + +function M.init(vim_buffer) + vim.api.nvim_buf_set_lines(vim_buffer, 0, -1, false, { "press q to exit" }) + + vim.keymap.set({ "n", "x" }, "q", function() + vim.api.nvim_buf_delete(vim_buffer, { force = true }) + end, { buffer = vim_buffer }) + + vim.bo[vim_buffer].modifiable = false + vim.bo[vim_buffer].modified = false +end + +return M diff --git a/lua/chai/init.lua b/lua/chai/init.lua index 75d9a41..9275dc3 100644 --- a/lua/chai/init.lua +++ b/lua/chai/init.lua @@ -1,6 +1,8 @@ local M = {} local config = require('chai.config') +local autocmds = require('chai.autocmds') +local buffers = require('chai.buffers') local commands = require('chai.commands') --- initializes chai.nvim plugin @@ -9,6 +11,9 @@ function M.setup(opts) -- set up configuration config.setup(opts) + buffers.setup() + autocmds.setup() + -- add commands commands.setup() end -- 2.47.3 From 15467ba8f05f2da691aca128498e9c9238a3ad15 Mon Sep 17 00:00:00 2001 From: femkrotek Date: Fri, 17 Jul 2026 00:52:12 +0200 Subject: [PATCH 2/3] refactor: improve buffer system --- lua/chai/buffers.lua | 26 +++++++++++++++++++++----- lua/chai/buffers/test.lua | 22 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/lua/chai/buffers.lua b/lua/chai/buffers.lua index 0c753f5..fdd4a31 100644 --- a/lua/chai/buffers.lua +++ b/lua/chai/buffers.lua @@ -2,6 +2,10 @@ local M = {} +local buffer_list = { + 'test', +} + local buffers = {} function M.setup() @@ -10,11 +14,11 @@ end -- should return created chai buffer local function resolve_buffer_path(path) - if string.match(path, '^chai://test/?$') then - local buffer = vim.deepcopy(require('chai.buffers.test')) - buffer.args = {} - - return buffer + for _, value in ipairs(buffer_list) do + local buf = require('chai.buffers.' .. value).check(path) + if buf ~= nil then + return buf + end end -- user is idiot imbecyle etc @@ -29,6 +33,9 @@ function M.create_buffer(buffer) end function M.destroy_buffer(buffer) + if buffers[buffer] == nil then + return + end if type(buffers[buffer].destroy) == 'function' then buffers[buffer].destroy(buffer) end @@ -36,18 +43,27 @@ function M.destroy_buffer(buffer) end function M.on_hide(buffer) + if buffers[buffer] == nil then + return + end if type(buffers[buffer].on_hide) == 'function' then buffers[buffer].on_hide(buffer) end end function M.on_enter(buffer) + if buffers[buffer] == nil then + return + end if type(buffers[buffer].on_enter) == 'function' then buffers[buffer].on_enter(buffer) end end function M.on_write(buffer) + if buffers[buffer] == nil then + return + end if type(buffers[buffer].on_write) == 'function' then buffers[buffer].on_write(buffer) end diff --git a/lua/chai/buffers/test.lua b/lua/chai/buffers/test.lua index d7c572f..ec72042 100644 --- a/lua/chai/buffers/test.lua +++ b/lua/chai/buffers/test.lua @@ -1,8 +1,18 @@ local M = {} -function M.init(vim_buffer) +local Buffer = {} + +function Buffer.init(vim_buffer) vim.api.nvim_buf_set_lines(vim_buffer, 0, -1, false, { "press q to exit" }) + local provider_list = { "Providers:" } + + for key, value in pairs(require('chai.config').options.providers) do + table.insert(provider_list, key .. " " .. value.url) + end + + vim.api.nvim_buf_set_lines(vim_buffer, 3, -1, false, provider_list) + vim.keymap.set({ "n", "x" }, "q", function() vim.api.nvim_buf_delete(vim_buffer, { force = true }) end, { buffer = vim_buffer }) @@ -11,4 +21,14 @@ function M.init(vim_buffer) vim.bo[vim_buffer].modified = false end +function M.check(path) + if string.match(path, '^chai://test/?$') then + local buffer = vim.deepcopy(Buffer) + buffer.args = {} + + return buffer + end + return nil +end + return M -- 2.47.3 From 79572a45dde93bc750e99b0d641d1f460e64b6cc Mon Sep 17 00:00:00 2001 From: femkrotek Date: Fri, 26 Jun 2026 16:45:04 +0200 Subject: [PATCH 3/3] feat: add provider system --- lua/chai/config.lua | 2 +- lua/chai/providers.lua | 26 ++++++++++++++++++++++++++ lua/chai/providers/gitea/init.lua | 12 ++++++++++++ lua/chai/providers/github/init.lua | 12 ++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 lua/chai/providers.lua create mode 100644 lua/chai/providers/gitea/init.lua create mode 100644 lua/chai/providers/github/init.lua diff --git a/lua/chai/config.lua b/lua/chai/config.lua index 7fd97cc..2b81039 100644 --- a/lua/chai/config.lua +++ b/lua/chai/config.lua @@ -1,7 +1,7 @@ local M = {} M.defaults = { - servers = {}, + providers = {}, } M.options = {} diff --git a/lua/chai/providers.lua b/lua/chai/providers.lua new file mode 100644 index 0000000..27b7b5f --- /dev/null +++ b/lua/chai/providers.lua @@ -0,0 +1,26 @@ +local M = {} + +local config = require('chai.config') + +local provider_instances = {} + +-- lazy loads providers of course +function M.get_provider(name) + if provider_instances[name] ~= nil then + return provider_instances[name] + end + + if config.options.providers[name] == nil then + error('unknown provider') + end + + local provider_config = config.options.providers[name] + + local provider = require('chai.providers.' .. provider_config.type) + + local provider_instance = provider.init(provider_config) + provider_instances[name] = provider_instance + return provider_instance +end + +return M diff --git a/lua/chai/providers/gitea/init.lua b/lua/chai/providers/gitea/init.lua new file mode 100644 index 0000000..b20486d --- /dev/null +++ b/lua/chai/providers/gitea/init.lua @@ -0,0 +1,12 @@ +local M + +local GiteaProvider = {} + +function M.init(config) + local provider = vim.deepcopy(GiteaProvider) + provider.config = config + + return provider +end + +return M diff --git a/lua/chai/providers/github/init.lua b/lua/chai/providers/github/init.lua new file mode 100644 index 0000000..5694f6f --- /dev/null +++ b/lua/chai/providers/github/init.lua @@ -0,0 +1,12 @@ +local M + +local GithubProvider = {} + +function M.init(config) + local provider = vim.deepcopy(GithubProvider) + provider.config = config + + return provider +end + +return M -- 2.47.3